work on button
This commit is contained in:
parent
10000854a5
commit
f1f362157d
1
assets/materials/models/props/button.ims
Normal file
1
assets/materials/models/props/button.ims
Normal file
|
@ -0,0 +1 @@
|
|||
\( +clone -alpha off -crop 32x24+449+790 -fill "#c0b4a9" -draw 'rectangle 0,-1 32,0' -draw 'rectangle 0,23 32,32' -write portal_pak_modified/materials/models/props/button_base.png \) -composite -alpha off -crop 150x150+147+139 -resize 32x32 -fill "#6d1514" -draw 'rectangle 0,-1 14,0' -draw 'rectangle 17,-1 32,0' -draw 'rectangle 0,31 14,32' -draw 'rectangle 17,31 32,32' -draw 'rectangle -1,0 0,14' -draw 'rectangle -1,17 0,32' -draw 'rectangle 31,0 32,14' -draw 'rectangle 31,17 32,32'
|
1
assets/materials/models/props/button_half.ims.off
Normal file
1
assets/materials/models/props/button_half.ims.off
Normal file
|
@ -0,0 +1 @@
|
|||
-alpha off \( +clone -crop 150x150+147+139 -rotate 180 -alpha on -channel a -evaluate set 50% +repage \) -geometry +147+139 -composite \( +clone -crop 150x150+147+139 -rotate 90 -alpha on -channel a -evaluate set 50% +repage \) -geometry +147+139 -composite
|
|
@ -18,4 +18,48 @@ materials:
|
|||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["PRIMITIVE", "0", "SHADE", "0"]
|
||||
|
||||
button_base:
|
||||
gDPSetTile:
|
||||
- null
|
||||
- filename: ../../portal_pak_modified/materials/models/props/button_base.png
|
||||
fmt: G_IM_FMT_RGBA
|
||||
siz: G_IM_SIZ_16b
|
||||
tmem: 256
|
||||
s:
|
||||
wrap: false
|
||||
t:
|
||||
wrap: false
|
||||
gSPTexture:
|
||||
tile: 1
|
||||
gSPGeometryMode:
|
||||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["SHADE", "0", "TEXEL0", "0"]
|
||||
|
||||
button_base_black:
|
||||
gDPSetPrimColor:
|
||||
r: 32
|
||||
g: 32
|
||||
b: 32
|
||||
gSPGeometryMode:
|
||||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["PRIMITIVE", "0", "SHADE", "0"]
|
||||
|
||||
button_top:
|
||||
gDPSetTile:
|
||||
filename: ../../portal_pak_modified/materials/models/props/button.png
|
||||
fmt: G_IM_FMT_RGBA
|
||||
siz: G_IM_SIZ_16b
|
||||
s:
|
||||
wrap: false
|
||||
t:
|
||||
wrap: false
|
||||
gSPTexture:
|
||||
tile: 0
|
||||
gSPGeometryMode:
|
||||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["SHADE", "0", "TEXEL0", "0"]
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.5 KiB |
|
@ -103,4 +103,37 @@ materials:
|
|||
gSPGeometryMode:
|
||||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["SHADE", "0", "PRIMITIVE", "0"]
|
||||
color: ["SHADE", "0", "PRIMITIVE", "0"]
|
||||
|
||||
plastic/plasticwall001a:
|
||||
gDPSetPrimColor:
|
||||
r: 230
|
||||
g: 230
|
||||
b: 230
|
||||
gSPGeometryMode:
|
||||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["SHADE", "0", "PRIMITIVE", "0"]
|
||||
|
||||
button:
|
||||
gDPSetTile:
|
||||
- filename: ../../portal_pak_modified/materials/models/props/button.png
|
||||
fmt: G_IM_FMT_RGBA
|
||||
siz: G_IM_SIZ_16b
|
||||
s:
|
||||
wrap: false
|
||||
t:
|
||||
wrap: false
|
||||
- filename: ../../portal_pak_modified/materials/models/props/button_base.png
|
||||
fmt: G_IM_FMT_RGBA
|
||||
siz: G_IM_SIZ_16b
|
||||
tmem: 256
|
||||
s:
|
||||
wrap: false
|
||||
t:
|
||||
wrap: false
|
||||
|
||||
gSPGeometryMode:
|
||||
set: [G_LIGHTING, G_SHADE]
|
||||
gDPSetCombineMode:
|
||||
color: ["SHADE", "0", "TEXEL0", "0"]
|
||||
|
|
BIN
assets/models/props/button.blend
Normal file
BIN
assets/models/props/button.blend
Normal file
Binary file not shown.
1
assets/models/props/button.flags
Normal file
1
assets/models/props/button.flags
Normal file
|
@ -0,0 +1 @@
|
|||
-m assets/materials/static.skm.yaml -m assets/materials/objects.skm.yaml -D button
|
1
assets/sound/weapons/portalgun/portal_open2.sox
Normal file
1
assets/sound/weapons/portalgun/portal_open2.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1
|
Binary file not shown.
|
@ -162,7 +162,7 @@ int main(int argc, char *argv[]) {
|
|||
staticGenerator.TraverseScene(scene);
|
||||
staticGenerator.GenerateDefinitions(scene, fileDef);
|
||||
|
||||
TriggerGenerator triggerGenerator(settings);
|
||||
TriggerGenerator triggerGenerator(settings, roomGenerator.GetOutput());
|
||||
triggerGenerator.TraverseScene(scene);
|
||||
triggerGenerator.GenerateDefinitions(scene, fileDef);
|
||||
|
||||
|
|
|
@ -356,12 +356,6 @@
|
|||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 7
|
||||
},
|
||||
"s": {
|
||||
"$ref": "#/definitions/textureCoordinateSettings"
|
||||
},
|
||||
"t": {
|
||||
"$ref": "#/definitions/textureCoordinateSettings"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -403,6 +397,12 @@
|
|||
"minimum": 0,
|
||||
"maximum": 15
|
||||
},
|
||||
"s": {
|
||||
"$ref": "#/definitions/textureCoordinateSettings"
|
||||
},
|
||||
"t": {
|
||||
"$ref": "#/definitions/textureCoordinateSettings"
|
||||
},
|
||||
"twoTone": {
|
||||
"type": "boolean"
|
||||
}
|
||||
|
|
|
@ -9,6 +9,16 @@
|
|||
|
||||
MaterialCollector::MaterialCollector(): mSceneCount(0) {}
|
||||
|
||||
void useTexture(std::set<std::shared_ptr<TextureDefinition>>& usedTextures, std::shared_ptr<TextureDefinition> texture, CFileDefinition& fileDefinition, const std::string& fileSuffix) {
|
||||
if (usedTextures.find(texture) != usedTextures.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
usedTextures.insert(texture);
|
||||
|
||||
fileDefinition.AddDefinition(std::move(texture->GenerateDefinition(fileDefinition.GetUniqueName(texture->Name()), fileSuffix)));
|
||||
}
|
||||
|
||||
void MaterialCollector::UseMaterial(const std::string& material, DisplayListSettings& settings) {
|
||||
auto materialDL = settings.mMaterials.find(material);
|
||||
|
||||
|
@ -20,13 +30,6 @@ void MaterialCollector::UseMaterial(const std::string& material, DisplayListSett
|
|||
|
||||
if (prevCount == mMaterialUseCount.end()) {
|
||||
mMaterialUseCount[material] = 1;
|
||||
|
||||
for (int i = 0; i < MAX_TILE_COUNT; ++i) {
|
||||
auto tile = &materialDL->second->mState.tiles[i];
|
||||
if (tile->isOn && tile->texture) {
|
||||
mUsedTextures.insert(tile->texture);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mMaterialUseCount[material] = prevCount->second + 1;
|
||||
}
|
||||
|
@ -40,14 +43,19 @@ void MaterialCollector::CollectMaterialResources(const aiScene* scene, std::vect
|
|||
}
|
||||
|
||||
void MaterialCollector::GenerateMaterials(DisplayListSettings& settings, CFileDefinition& fileDefinition, const std::string& fileSuffix) {
|
||||
for (auto image : mUsedTextures) {
|
||||
fileDefinition.AddDefinition(std::move(image->GenerateDefinition(fileDefinition.GetUniqueName(image->Name()), fileSuffix)));
|
||||
}
|
||||
|
||||
for (auto useCount = mMaterialUseCount.begin(); useCount != mMaterialUseCount.end(); ++useCount) {
|
||||
if (useCount->second > 1 || mSceneCount > 1) {
|
||||
auto material = settings.mMaterials.find(useCount->first);
|
||||
|
||||
for (int i = 0; i < MAX_TILE_COUNT; ++i) {
|
||||
auto tile = &material->second->mState.tiles[i];
|
||||
if (tile->isOn && tile->texture && !settings.mDefaultMaterialState.IsTextureLoaded(tile->texture, tile->tmem)) {
|
||||
useTexture(mUsedTextures, tile->texture, fileDefinition, fileSuffix);
|
||||
}
|
||||
}
|
||||
|
||||
DisplayList materialDL(fileDefinition.GetUniqueName(useCount->first));
|
||||
settings.mMaterials.find(useCount->first)->second->Write(fileDefinition, settings.mDefaultMaterialState, materialDL.GetDataChunk());
|
||||
material->second->Write(fileDefinition, settings.mDefaultMaterialState, materialDL.GetDataChunk());
|
||||
mMaterialNameMapping[useCount->first] = materialDL.GetName();
|
||||
|
||||
auto dl = materialDL.Generate(fileSuffix);
|
||||
|
@ -59,6 +67,8 @@ void MaterialCollector::GenerateMaterials(DisplayListSettings& settings, CFileDe
|
|||
|
||||
void generateMeshIntoDLWithMaterials(const aiScene* scene, CFileDefinition& fileDefinition, MaterialCollector* materials, std::vector<RenderChunk>& renderChunks, DisplayListSettings& settings, DisplayList &displayList, const std::string& modelSuffix) {
|
||||
RCPState rcpState(settings.mDefaultMaterialState, settings.mVertexCacheSize, settings.mMaxMatrixDepth, settings.mCanPopMultipleMatrices);
|
||||
std::set<std::shared_ptr<TextureDefinition>> usedTextures;
|
||||
|
||||
for (auto chunk = renderChunks.begin(); chunk != renderChunks.end(); ++chunk) {
|
||||
if (materials) {
|
||||
std::string materialName = ExtendedMesh::GetMaterialName(scene->mMaterials[chunk->mMesh->mMesh->mMaterialIndex]);
|
||||
|
@ -71,7 +81,17 @@ void generateMeshIntoDLWithMaterials(const aiScene* scene, CFileDefinition& file
|
|||
auto material = settings.mMaterials.find(materialName);
|
||||
|
||||
if (material != settings.mMaterials.end()) {
|
||||
material->second->Write(fileDefinition, rcpState.GetMaterialState(), displayList.GetDataChunk());
|
||||
auto& materialState = rcpState.GetMaterialState();
|
||||
|
||||
for (int i = 0; i < MAX_TILE_COUNT; ++i) {
|
||||
auto tile = &material->second->mState.tiles[i];
|
||||
if (tile->isOn && tile->texture && !materialState.IsTextureLoaded(tile->texture, tile->tmem)) {
|
||||
useTexture(usedTextures, tile->texture, fileDefinition, modelSuffix);
|
||||
}
|
||||
}
|
||||
|
||||
material->second->Write(fileDefinition, materialState, displayList.GetDataChunk());
|
||||
applyMaterial(material->second->mState, materialState);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,7 +114,6 @@ void generateMeshIntoDLWithMaterials(const aiScene* scene, CFileDefinition& file
|
|||
void generateMeshIntoDL(const aiScene* scene, CFileDefinition& fileDefinition, std::vector<RenderChunk>& renderChunks, DisplayListSettings& settings, DisplayList &displayList, const std::string& fileSuffix) {
|
||||
MaterialCollector materials;
|
||||
|
||||
materials.CollectMaterialResources(scene, renderChunks, settings);
|
||||
materials.GenerateMaterials(settings, fileDefinition, fileSuffix);
|
||||
|
||||
generateMeshIntoDLWithMaterials(scene, fileDefinition, &materials, renderChunks, settings, displayList, fileSuffix);
|
||||
|
|
|
@ -24,6 +24,8 @@ public:
|
|||
std::map<std::string, int> mMaterialUseCount;
|
||||
std::map<std::string, std::string> mMaterialNameMapping;
|
||||
std::map<std::string, std::string> mResourceNameMapping;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
void generateMeshIntoDLWithMaterials(const aiScene* scene, CFileDefinition& fileDefinition, MaterialCollector* materials, std::vector<RenderChunk>& renderChunks, DisplayListSettings& settings, DisplayList &displayList, const std::string& modelSuffix);
|
||||
|
|
|
@ -27,6 +27,16 @@ short RoomGeneratorOutput::FindLocationRoom(const std::string& name) const {
|
|||
return -1;
|
||||
}
|
||||
|
||||
short RoomGeneratorOutput::FindLocationIndex(const std::string& name) const {
|
||||
for (auto& location : namedLocations) {
|
||||
if (location.name == name) {
|
||||
return location.index;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int RoomGeneratorOutput::RoomForNode(const aiNode* node) const {
|
||||
auto room = roomIndexMapping.find(node);
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ struct RoomGeneratorOutput {
|
|||
int roomCount;
|
||||
|
||||
short FindLocationRoom(const std::string& name) const;
|
||||
short FindLocationIndex(const std::string& name) const;
|
||||
int RoomForNode(const aiNode* node) const;
|
||||
};
|
||||
|
||||
|
|
|
@ -33,13 +33,13 @@ float distanceFromStart(const CutsceneStep& startStep, const CutsceneStep& other
|
|||
return relativeOffset.y;
|
||||
}
|
||||
|
||||
TriggerGenerator::TriggerGenerator(const DisplayListSettings& settings): DefinitionGenerator(), mSettings(settings) {}
|
||||
TriggerGenerator::TriggerGenerator(const DisplayListSettings& settings, const RoomGeneratorOutput& roomOutput): DefinitionGenerator(), mSettings(settings), mRoomOutput(roomOutput) {}
|
||||
|
||||
bool TriggerGenerator::ShouldIncludeNode(aiNode* node) {
|
||||
return (StartsWith(node->mName.C_Str(), TRIGGER_PREFIX) && node->mNumMeshes >= 1) || StartsWith(node->mName.C_Str(), CUTSCENE_PREFIX);
|
||||
}
|
||||
|
||||
std::unique_ptr<StructureDataChunk> generateCutsceneStep(CutsceneStep& step) {
|
||||
std::unique_ptr<StructureDataChunk> TriggerGenerator::GenerateCutsceneStep(CutsceneStep& step) {
|
||||
std::unique_ptr<StructureDataChunk> result(new StructureDataChunk());
|
||||
|
||||
if ((step.command == "play_sound" || step.command == "start_sound") && step.args.size() >= 1) {
|
||||
|
@ -66,6 +66,17 @@ std::unique_ptr<StructureDataChunk> generateCutsceneStep(CutsceneStep& step) {
|
|||
result->AddPrimitive<const char*>("CutsceneStepTypeDelay");
|
||||
result->AddPrimitive("delay", std::atof(step.args[0].c_str()));
|
||||
return result;
|
||||
} else if (step.command == "open_portal" && step.args.size() >= 1) {
|
||||
short roomLocation = mRoomOutput.FindLocationIndex(step.args[0]);
|
||||
|
||||
if (roomLocation != -1) {
|
||||
result->AddPrimitive<const char*>("CutsceneStepTypeOpenPortal");
|
||||
std::unique_ptr<StructureDataChunk> openPortal(new StructureDataChunk());
|
||||
openPortal->AddPrimitive(roomLocation);
|
||||
openPortal->AddPrimitive((step.args.size() >= 2 && step.args[1] == "1") ? 1 : 0);
|
||||
result->Add("openPortal", std::move(openPortal));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
result->AddPrimitive<const char*>("CutsceneStepTypeNoop");
|
||||
|
@ -131,7 +142,7 @@ void TriggerGenerator::GenerateCutscenes(std::map<std::string, std::shared_ptr<C
|
|||
std::unique_ptr<StructureDataChunk> steps(new StructureDataChunk());
|
||||
|
||||
for (auto& step : cutscene.steps) {
|
||||
steps->Add(std::move(generateCutsceneStep(*step)));
|
||||
steps->Add(std::move(GenerateCutsceneStep(*step)));
|
||||
}
|
||||
|
||||
std::string stepsName = fileDefinition.GetUniqueName(cutscene.name + "_steps");
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "DefinitionGenerator.h"
|
||||
#include "../DisplayListSettings.h"
|
||||
#include "RoomGenerator.h"
|
||||
#include <map>
|
||||
|
||||
struct Trigger {
|
||||
|
@ -32,7 +33,7 @@ struct Cutscene {
|
|||
|
||||
class TriggerGenerator : public DefinitionGenerator {
|
||||
public:
|
||||
TriggerGenerator(const DisplayListSettings& settings);
|
||||
TriggerGenerator(const DisplayListSettings& settings, const RoomGeneratorOutput& roomOutput);
|
||||
|
||||
virtual bool ShouldIncludeNode(aiNode* node);
|
||||
virtual void GenerateDefinitions(const aiScene* scene, CFileDefinition& fileDefinition);
|
||||
|
@ -41,8 +42,10 @@ public:
|
|||
private:
|
||||
DisplayListSettings mSettings;
|
||||
TriggerGeneratorOutput mOutput;
|
||||
RoomGeneratorOutput mRoomOutput;
|
||||
|
||||
void GenerateCutscenes(std::map<std::string, std::shared_ptr<Cutscene>>& output, CFileDefinition& fileDefinition);
|
||||
std::unique_ptr<StructureDataChunk> GenerateCutsceneStep(CutsceneStep& step);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -649,6 +649,7 @@ void parseTiles(const YAML::Node& node, MaterialState& state, ParseResult& outpu
|
|||
state.textureState.isOn = true;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
output.mErrors.push_back(ParseError(formatError("Expected a tile or array of tiles", node.Mark())));
|
||||
|
|
|
@ -38,6 +38,11 @@ struct FlagList FlagList::GetDeltaFrom(struct FlagList& other) {
|
|||
return result;
|
||||
}
|
||||
|
||||
void FlagList::ApplyFrom(const FlagList& other) {
|
||||
knownFlags |= other.knownFlags;
|
||||
flags = (other.flags & other.knownFlags) | (flags & ~other.knownFlags);
|
||||
}
|
||||
|
||||
TextureCoordinateState::TextureCoordinateState():
|
||||
wrap(true),
|
||||
mirror(false),
|
||||
|
@ -209,6 +214,17 @@ MaterialState::MaterialState() :
|
|||
useBlendColor(false)
|
||||
{}
|
||||
|
||||
|
||||
bool MaterialState::IsTextureLoaded(std::shared_ptr<TextureDefinition> texture, int tmem) const {
|
||||
for (int i = 0; i < MAX_TILE_COUNT; ++i) {
|
||||
if (tiles[i].texture == texture && tiles[i].tmem == tmem) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void appendToFlags(std::ostringstream& flags, const std::string& value) {
|
||||
if (flags.tellp() != 0) {
|
||||
flags << " | ";
|
||||
|
@ -568,4 +584,109 @@ void generateMaterial(CFileDefinition& fileDef, const MaterialState& from, const
|
|||
}
|
||||
|
||||
// TODO fill color
|
||||
}
|
||||
}
|
||||
|
||||
void applyMaterial(const MaterialState& from, MaterialState& to) {
|
||||
for (int i = 0; i < MAX_TILE_COUNT; ++i) {
|
||||
if (from.tiles[i].isOn) {
|
||||
to.tiles[i] = from.tiles[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (from.textureState.isOn) {
|
||||
to.textureState = from.textureState;
|
||||
}
|
||||
|
||||
to.geometryModes.ApplyFrom(from.geometryModes);
|
||||
|
||||
if (from.pipelineMode != PipelineMode::Unknown) {
|
||||
to.pipelineMode = from.pipelineMode;
|
||||
}
|
||||
|
||||
if (from.cycleType != CycleType::Unknown) {
|
||||
to.cycleType = from.cycleType;
|
||||
}
|
||||
|
||||
if (from.perspectiveMode != PerspectiveMode::Unknown) {
|
||||
to.perspectiveMode = from.perspectiveMode;
|
||||
}
|
||||
|
||||
if (from.textureDetail != TextureDetail::Unknown) {
|
||||
to.textureDetail = from.textureDetail;
|
||||
}
|
||||
|
||||
if (from.textureLOD != TextureLOD::Unknown) {
|
||||
to.textureLOD = from.textureLOD;
|
||||
}
|
||||
|
||||
if (from.textureLUT != TextureLUT::Unknown) {
|
||||
to.textureLUT = from.textureLUT;
|
||||
}
|
||||
|
||||
if (from.textureFilter != TextureFilter::Unknown) {
|
||||
to.textureFilter = from.textureFilter;
|
||||
}
|
||||
|
||||
if (from.textureConvert != TextureConvert::Unknown) {
|
||||
to.textureConvert = from.textureConvert;
|
||||
}
|
||||
|
||||
if (from.combineKey != CombineKey::Unknown) {
|
||||
to.combineKey = from.combineKey;
|
||||
}
|
||||
|
||||
if (from.colorDither != ColorDither::Unknown) {
|
||||
to.colorDither = from.colorDither;
|
||||
}
|
||||
|
||||
if (from.alphaDither != AlphaDither::Unknown) {
|
||||
to.alphaDither = from.alphaDither;
|
||||
}
|
||||
|
||||
if (from.alphaCompare != AlphaCompare::Unknown) {
|
||||
to.alphaCompare = from.alphaCompare;
|
||||
}
|
||||
|
||||
if (from.depthSource != DepthSource::Unknown) {
|
||||
to.depthSource = from.depthSource;
|
||||
}
|
||||
|
||||
if (from.hasCombineMode) {
|
||||
to.hasCombineMode = true;
|
||||
to.cycle1Combine = from.cycle1Combine;
|
||||
to.cycle2Combine = from.cycle2Combine;
|
||||
}
|
||||
|
||||
if (from.hasRenderMode) {
|
||||
to.hasRenderMode = true;
|
||||
to.cycle1RenderMode = from.cycle1RenderMode;
|
||||
to.cycle2RenderMode = from.cycle2RenderMode;
|
||||
}
|
||||
|
||||
if (from.usePrimitiveColor) {
|
||||
to.usePrimitiveColor = true;
|
||||
to.primitiveColor = from.primitiveColor;
|
||||
to.primitiveM = from.primitiveM;
|
||||
to.primitiveL = from.primitiveL;
|
||||
}
|
||||
|
||||
if (from.useEnvColor) {
|
||||
to.useEnvColor = true;
|
||||
to.envColor = from.envColor;
|
||||
}
|
||||
|
||||
if (from.useFillColor) {
|
||||
to.useFillColor = true;
|
||||
to.fillColor = from.fillColor;
|
||||
}
|
||||
|
||||
if (from.useFogColor) {
|
||||
to.useFogColor = true;
|
||||
to.fogColor = from.fogColor;
|
||||
}
|
||||
|
||||
if (from.useBlendColor) {
|
||||
to.useBlendColor = true;
|
||||
to.blendColor = from.blendColor;
|
||||
}
|
||||
}
|
|
@ -15,6 +15,8 @@ struct FlagList {
|
|||
void DeleteFlag(int mask);
|
||||
|
||||
struct FlagList GetDeltaFrom(struct FlagList& other);
|
||||
|
||||
void ApplyFrom(const FlagList& other);
|
||||
};
|
||||
|
||||
struct TextureCoordinateState {
|
||||
|
@ -139,8 +141,12 @@ public:
|
|||
|
||||
bool useBlendColor;
|
||||
PixelRGBAu8 blendColor;
|
||||
|
||||
bool IsTextureLoaded(std::shared_ptr<TextureDefinition> texture, int tmem) const;
|
||||
};
|
||||
|
||||
void generateMaterial(CFileDefinition& fileDef, const MaterialState& from, const MaterialState& to, StructureDataChunk& output);
|
||||
|
||||
void applyMaterial(const MaterialState& from, MaterialState& to);
|
||||
|
||||
#endif
|
|
@ -3,4 +3,5 @@
|
|||
|
||||
#include "../../build/src/audio/clips.h"
|
||||
|
||||
unsigned short soundsPortalEnter = SOUNDS_PORTAL_ENTER1;
|
||||
unsigned short soundsPortalEnter = SOUNDS_PORTAL_ENTER1;
|
||||
unsigned short soundsPortalOpen2 = SOUNDS_PORTAL_OPEN2;
|
|
@ -3,4 +3,6 @@
|
|||
|
||||
extern unsigned short soundsPortalEnter;
|
||||
|
||||
extern unsigned short soundsPortalOpen2;
|
||||
|
||||
#endif
|
|
@ -1,6 +1,8 @@
|
|||
#include "cutscene_runner.h"
|
||||
#include "../audio/soundplayer.h"
|
||||
#include "../util/time.h"
|
||||
#include "../scene/scene.h"
|
||||
#include "../levels/levels.h"
|
||||
|
||||
struct CutsceneRunner gCutsceneRunner;
|
||||
|
||||
|
@ -18,6 +20,16 @@ void cutsceneRunnerStartStep(struct CutsceneRunner* runner) {
|
|||
case CutsceneStepTypeDelay:
|
||||
runner->state.delay = step->delay;
|
||||
break;
|
||||
case CutsceneStepTypeOpenPortal:
|
||||
{
|
||||
struct Location* location = &gCurrentLevel->locations[step->openPortal.locationIndex];
|
||||
struct Ray firingRay;
|
||||
firingRay.origin = location->transform.position;
|
||||
quatMultVector(&location->transform.rotation, &gForward, &firingRay.dir);
|
||||
vector3AddScaled(&location->transform.position, &firingRay.dir, -0.1f, &firingRay.origin);
|
||||
sceneFirePortal(&gScene, &firingRay, &gUp, step->openPortal.portalIndex, location->roomIndex);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ enum CutsceneStepType {
|
|||
CutsceneStepTypePlaySound,
|
||||
CutsceneStepTypeStartSound,
|
||||
CutsceneStepTypeDelay,
|
||||
CutsceneStepTypeOpenPortal,
|
||||
};
|
||||
|
||||
struct CutsceneStep {
|
||||
|
@ -37,6 +38,10 @@ struct CutsceneStep {
|
|||
u8 volume;
|
||||
u8 pitch;
|
||||
} playSound;
|
||||
struct {
|
||||
u16 locationIndex;
|
||||
u16 portalIndex;
|
||||
} openPortal;
|
||||
float delay;
|
||||
int noop;
|
||||
};
|
||||
|
|
|
@ -84,7 +84,7 @@ static void initProc(void* arg) {
|
|||
for(;;);
|
||||
}
|
||||
|
||||
static struct Scene gScene;
|
||||
struct Scene gScene;
|
||||
|
||||
extern OSMesgQueue dmaMessageQ;
|
||||
|
||||
|
@ -128,6 +128,7 @@ static void gameProc(void* arg) {
|
|||
u32 pendingGFX = 0;
|
||||
u32 drawBufferIndex = 0;
|
||||
u8 frameControl = 0;
|
||||
u8 inputIgnore = 6;
|
||||
|
||||
u16* memoryEnd = graphicsLayoutScreenBuffers((u16*)PHYS_TO_K0(osMemSize));
|
||||
|
||||
|
@ -174,7 +175,11 @@ static void gameProc(void* arg) {
|
|||
}
|
||||
|
||||
controllersTriggerRead();
|
||||
sceneUpdate(&gScene);
|
||||
if (inputIgnore) {
|
||||
--inputIgnore;
|
||||
} else {
|
||||
sceneUpdate(&gScene);
|
||||
}
|
||||
timeUpdateDelta();
|
||||
soundPlayerUpdate();
|
||||
|
||||
|
|
|
@ -203,7 +203,7 @@ void collisionSceneRaycastRoom(struct CollisionScene* scene, struct Room* room,
|
|||
for (int i = range->min; i < range->max; ++i) {
|
||||
struct RaycastHit hitTest;
|
||||
|
||||
if (raycastQuad(&scene->quads[room->quadIndices[i]], ray, hit->distance, &hitTest) && hitTest.distance < hit->distance) {
|
||||
if (raycastQuad(&scene->quads[room->quadIndices[i]], ray, hit->distance, &hitTest) && hitTest.distance < hit->distance && vector3Dot(&hitTest.normal, &ray->dir) < 0.0f) {
|
||||
hit->at = hitTest.at;
|
||||
hit->normal = hitTest.normal;
|
||||
hit->distance = hitTest.distance;
|
||||
|
|
|
@ -24,19 +24,19 @@
|
|||
void hudRender(struct RenderState* renderState) {
|
||||
gSPDisplayList(renderState->dl++, hud_material_list[PORTAL_CROSSHAIRS_INDEX]);
|
||||
|
||||
gSPTextureRectangle(renderState->dl++,
|
||||
(SCREEN_WD - HUD_CENTER_WIDTH) << 1, (SCREEN_HT - HUD_CENTER_HEIGHT) << 1,
|
||||
(SCREEN_WD + HUD_CENTER_WIDTH) << 1, (SCREEN_HT + HUD_CENTER_HEIGHT) << 1,
|
||||
G_TX_RENDERTILE, HUD_CENTER_S << 5, HUD_CENTER_T << 5, 1 << 10, 1 << 10);
|
||||
// gSPTextureRectangle(renderState->dl++,
|
||||
// (SCREEN_WD - HUD_CENTER_WIDTH) << 1, (SCREEN_HT - HUD_CENTER_HEIGHT) << 1,
|
||||
// (SCREEN_WD + HUD_CENTER_WIDTH) << 1, (SCREEN_HT + HUD_CENTER_HEIGHT) << 1,
|
||||
// G_TX_RENDERTILE, HUD_CENTER_S << 5, HUD_CENTER_T << 5, 1 << 10, 1 << 10);
|
||||
|
||||
gDPSetPrimColor(renderState->dl++, 255, 255, 255, 128, 0, 255);
|
||||
gDPSetPrimColor(renderState->dl++, 255, 255, 0, 128, 255, 255);
|
||||
|
||||
gSPTextureRectangle(renderState->dl++,
|
||||
HUD_UPPER_X, HUD_UPPER_Y,
|
||||
HUD_UPPER_X + (HUD_OUTER_WIDTH << 2), HUD_UPPER_Y + (HUD_OUTER_HEIGHT << 2),
|
||||
G_TX_RENDERTILE, 0 << 5, 0 << 5, 1 << 10, 1 << 10);
|
||||
|
||||
gDPSetPrimColor(renderState->dl++, 255, 255, 0, 128, 255, 255);
|
||||
gDPSetPrimColor(renderState->dl++, 255, 255, 255, 128, 0, 255);
|
||||
|
||||
gSPTextureRectangle(renderState->dl++,
|
||||
HUD_LOWER_X, HUD_LOWER_Y,
|
||||
|
|
|
@ -68,7 +68,7 @@ void renderPropsInit(struct RenderProps* props, struct Camera* camera, float asp
|
|||
props->maxY = SCREEN_HT;
|
||||
}
|
||||
|
||||
#define MIN_VP_WIDTH 42
|
||||
#define MIN_VP_WIDTH 64
|
||||
|
||||
void renderPropscheckViewportSize(int* min, int* max, int screenSize) {
|
||||
if (*max < MIN_VP_WIDTH) {
|
||||
|
@ -197,7 +197,7 @@ void portalRender(struct Portal* portal, struct Portal* otherPortal, struct Rend
|
|||
|
||||
transformToMatrix(&finalTransform, portalTransform, SCENE_SCALE);
|
||||
|
||||
if (props->currentDepth == 0) {
|
||||
if (props->currentDepth == 0 || !otherPortal) {
|
||||
Mtx* matrix = renderStateRequestMatrices(renderState, 1);
|
||||
|
||||
guMtxF2L(portalTransform, matrix);
|
||||
|
|
|
@ -38,19 +38,6 @@ void sceneInit(struct Scene* scene) {
|
|||
|
||||
portalInit(&scene->portals[0], 0);
|
||||
portalInit(&scene->portals[1], PortalFlagsOddParity);
|
||||
gCollisionScene.portalTransforms[0] = &scene->portals[0].transform;
|
||||
gCollisionScene.portalTransforms[1] = &scene->portals[1].transform;
|
||||
|
||||
scene->portals[0].transform.position.x = 3.75f;
|
||||
scene->portals[0].transform.position.y = 1.5f;
|
||||
scene->portals[0].transform.position.z = -4.5f;
|
||||
|
||||
scene->portals[1].transform.position.x = 0.0f;
|
||||
scene->portals[1].transform.position.y = 1.0f;
|
||||
scene->portals[1].transform.position.z = -6.0f;
|
||||
|
||||
|
||||
quatAxisAngle(&gUp, M_PI * 0.5f, &scene->portals[1].transform.rotation);
|
||||
|
||||
for (int i = 0; i < MAX_CUBES; ++i) {
|
||||
cubeInit(&scene->cubes[i]);
|
||||
|
@ -72,12 +59,24 @@ void sceneRenderWithProperties(void* data, struct RenderProps* properties, struc
|
|||
staticRenderDetermineVisibleRooms(&properties->cullingInfo, properties->fromRoom, &visibleRooms);
|
||||
|
||||
int closerPortal = vector3DistSqrd(&properties->camera.transform.position, &scene->portals[0].transform.position) > vector3DistSqrd(&properties->camera.transform.position, &scene->portals[1].transform.position) ? 0 : 1;
|
||||
int otherPortal = 1 - closerPortal;
|
||||
|
||||
if (properties->fromPortalIndex != closerPortal && staticRenderIsRoomVisible(visibleRooms, gCollisionScene.portalRooms[closerPortal])) {
|
||||
portalRender(&scene->portals[closerPortal], &scene->portals[1 - closerPortal], properties, sceneRenderWithProperties, data, renderState);
|
||||
}
|
||||
if (properties->fromPortalIndex != 1 - closerPortal && staticRenderIsRoomVisible(visibleRooms, gCollisionScene.portalRooms[1 - closerPortal])) {
|
||||
portalRender(&scene->portals[1 - closerPortal], &scene->portals[closerPortal], properties, sceneRenderWithProperties, data, renderState);
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
if (gCollisionScene.portalTransforms[closerPortal] &&
|
||||
properties->fromPortalIndex != closerPortal &&
|
||||
staticRenderIsRoomVisible(visibleRooms, gCollisionScene.portalRooms[closerPortal])) {
|
||||
portalRender(
|
||||
&scene->portals[closerPortal],
|
||||
gCollisionScene.portalTransforms[otherPortal] ? &scene->portals[otherPortal] : NULL,
|
||||
properties,
|
||||
sceneRenderWithProperties,
|
||||
data,
|
||||
renderState
|
||||
);
|
||||
}
|
||||
|
||||
closerPortal = 1 - closerPortal;
|
||||
otherPortal = 1 - otherPortal;
|
||||
}
|
||||
|
||||
staticRender(&properties->cullingInfo, visibleRooms, renderState);
|
||||
|
@ -135,7 +134,7 @@ void sceneRender(struct Scene* scene, struct RenderState* renderState, struct Gr
|
|||
|
||||
hudRender(renderState);
|
||||
|
||||
sceneRenderPerformanceMetrics(scene, renderState, task);
|
||||
// sceneRenderPerformanceMetrics(scene, renderState, task);
|
||||
|
||||
// contactSolverDebugDraw(&gContactSolver, renderState);
|
||||
}
|
||||
|
@ -214,12 +213,7 @@ int sceneOpenPortal(struct Scene* scene, struct Transform* at, int portalIndex,
|
|||
|
||||
for (int i = surfaceMapping.minPortalIndex; i < surfaceMapping.maxPortalIndex; ++i) {
|
||||
if (portalSurfaceGenerate(&gCurrentLevel->portalSurfaces[i], at, NULL, NULL)) {
|
||||
// struct Vector3 portalForward;
|
||||
// quatMultVector(&at->rotation, &gForward, &portalForward);
|
||||
// // TODO remove once there is a hole in the wall
|
||||
// vector3AddScaled(&at->position, &portalForward, (portalIndex == 0) ? -0.1f : 0.1f, &at->position);
|
||||
|
||||
soundPlayerPlay(soundsPortalEnter, 1.0f, 1.0f);
|
||||
soundPlayerPlay(soundsPortalOpen2, 1.0f, 1.0f);
|
||||
|
||||
scene->portals[portalIndex].transform = *at;
|
||||
gCollisionScene.portalTransforms[portalIndex] = &scene->portals[portalIndex].transform;
|
||||
|
|
|
@ -22,6 +22,8 @@ struct Scene {
|
|||
OSTime lastFrameTime;
|
||||
};
|
||||
|
||||
extern struct Scene gScene;
|
||||
|
||||
struct GraphicsTask;
|
||||
|
||||
void sceneInit(struct Scene* scene);
|
||||
|
|
Loading…
Reference in a new issue