work on dynamic signage
This commit is contained in:
parent
c8c56abdb5
commit
6f78076558
11
Makefile
11
Makefile
|
@ -169,6 +169,7 @@ MODEL_LIST = assets/models/cube/cube.blend \
|
||||||
assets/models/props/round_elevator.blend \
|
assets/models/props/round_elevator.blend \
|
||||||
assets/models/props/round_elevator_interior.blend \
|
assets/models/props/round_elevator_interior.blend \
|
||||||
assets/models/props/round_elevator_collision.blend \
|
assets/models/props/round_elevator_collision.blend \
|
||||||
|
assets/models/props/signage.blend \
|
||||||
assets/models/portal/portal_blue.blend \
|
assets/models/portal/portal_blue.blend \
|
||||||
assets/models/portal/portal_blue_filled.blend \
|
assets/models/portal/portal_blue_filled.blend \
|
||||||
assets/models/portal/portal_blue_face.blend \
|
assets/models/portal/portal_blue_face.blend \
|
||||||
|
@ -191,6 +192,8 @@ build/src/decor/decor_object_list.o: $(MODEL_HEADERS)
|
||||||
|
|
||||||
build/src/scene/portal.o: $(MODEL_HEADERS)
|
build/src/scene/portal.o: $(MODEL_HEADERS)
|
||||||
|
|
||||||
|
build/src/scene/signage.o: $(MODEL_HEADERS)
|
||||||
|
|
||||||
build/assets/models/%_anim.o: build/assets/models/%.h
|
build/assets/models/%_anim.o: build/assets/models/%.h
|
||||||
|
|
||||||
build/anims.ld: $(ANIM_LIST) tools/generate_animation_ld.js
|
build/anims.ld: $(ANIM_LIST) tools/generate_animation_ld.js
|
||||||
|
@ -244,12 +247,13 @@ build/src/levels/levels.o: build/assets/test_chambers/level_list.h build/assets/
|
||||||
####################
|
####################
|
||||||
|
|
||||||
SOUND_ATTRIBUTES = $(shell find assets/ -type f -name '*.sox')
|
SOUND_ATTRIBUTES = $(shell find assets/ -type f -name '*.sox')
|
||||||
|
SOUND_JATTRIBUTES = $(shell find assets/ -type f -name '*.jsox')
|
||||||
|
|
||||||
MUSIC_ATTRIBUTES = $(shell find assets/sound/music/ -type f -name '*.msox')
|
MUSIC_ATTRIBUTES = $(shell find assets/sound/music/ -type f -name '*.msox')
|
||||||
|
|
||||||
INS_SOUNDS = $(shell find assets/ -type f -name '*.ins')
|
INS_SOUNDS = $(shell find assets/ -type f -name '*.ins')
|
||||||
|
|
||||||
SOUND_CLIPS = $(SOUND_ATTRIBUTES:%.sox=build/%.aifc) $(INS_SOUNDS) $(MUSIC_ATTRIBUTES:%.msox=build/%.aifc)
|
SOUND_CLIPS = $(SOUND_ATTRIBUTES:%.sox=build/%.aifc) $(SOUND_JATTRIBUTES:%.jsox=build/%.aifc) $(INS_SOUNDS) $(MUSIC_ATTRIBUTES:%.msox=build/%.aifc)
|
||||||
|
|
||||||
$(INS_SOUNDS): portal_pak_dir
|
$(INS_SOUNDS): portal_pak_dir
|
||||||
|
|
||||||
|
@ -260,6 +264,11 @@ build/%.aifc: %.sox portal_pak_dir
|
||||||
sox $(<:assets/%.sox=portal_pak_dir/%.wav) $(shell cat $<) $(@:%.aifc=%.wav)
|
sox $(<:assets/%.sox=portal_pak_dir/%.wav) $(shell cat $<) $(@:%.aifc=%.wav)
|
||||||
$(SFZ2N64) -o $@ $(@:%.aifc=%.wav)
|
$(SFZ2N64) -o $@ $(@:%.aifc=%.wav)
|
||||||
|
|
||||||
|
build/%.aifc: %.jsox tools/jsox.js portal_pak_dir
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
node tools/jsox.js $< $(<:assets/%.jsox=portal_pak_dir/%.wav) $(@:%.aifc=%.wav)
|
||||||
|
$(SFZ2N64) -o $@ $(@:%.aifc=%.wav)
|
||||||
|
|
||||||
build/%.aifc: %.msox portal_pak_dir
|
build/%.aifc: %.msox portal_pak_dir
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
mpg123 -w $(<:assets/%.msox=portal_pak_dir/%.wav) $(<:assets/%.msox=portal_pak_dir/%.mp3)
|
mpg123 -w $(<:assets/%.msox=portal_pak_dir/%.wav) $(<:assets/%.msox=portal_pak_dir/%.mp3)
|
||||||
|
|
|
@ -86,13 +86,13 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender
|
||||||
|
|
||||||
- [ ] Prevent Glados from talking over herself
|
- [ ] Prevent Glados from talking over herself
|
||||||
- [ ] Elevator and door sounds
|
- [ ] Elevator and door sounds
|
||||||
- [ ] Portal gun pedistal
|
|
||||||
- [ ] kill plane
|
|
||||||
- [ ] Turn level indicator board into a game object
|
- [ ] Turn level indicator board into a game object
|
||||||
- [ ] Presort portal gun polygon order
|
- [ ] Presort portal gun polygon order
|
||||||
- [ ] Change the way player standing logic works
|
- [ ] Change the way player standing logic works
|
||||||
- [ ] Cube dispenser
|
- [ ] Cube dispenser
|
||||||
- [ ] NAN in overlap
|
- [ ] NAN in overlap
|
||||||
|
- [x] kill plane
|
||||||
|
- [x] Portal gun pedistal
|
||||||
- [x] Fix portal overlapping bug
|
- [x] Fix portal overlapping bug
|
||||||
- [x] Fix bug where opening a portal can trigger a teleportation
|
- [x] Fix bug where opening a portal can trigger a teleportation
|
||||||
- [x] Implement level transitions
|
- [x] Implement level transitions
|
|
@ -327,6 +327,8 @@ materials:
|
||||||
t:
|
t:
|
||||||
wrap: false
|
wrap: false
|
||||||
|
|
||||||
|
gDPSetRenderMode: G_RM_ZB_OPA_SURF
|
||||||
|
|
||||||
gSPGeometryMode:
|
gSPGeometryMode:
|
||||||
clear: [G_LIGHTING]
|
clear: [G_LIGHTING]
|
||||||
gDPSetCycleType: G_CYC_1CYCLE
|
gDPSetCycleType: G_CYC_1CYCLE
|
||||||
|
@ -411,6 +413,7 @@ materials:
|
||||||
gDPSetCombineMode:
|
gDPSetCombineMode:
|
||||||
color: ["0", "0", "0", SHADE]
|
color: ["0", "0", "0", SHADE]
|
||||||
gDPSetCycleType: G_CYC_1CYCLE
|
gDPSetCycleType: G_CYC_1CYCLE
|
||||||
|
gDPSetRenderMode: G_RM_ZB_OPA_SURF
|
||||||
gSPGeometryMode:
|
gSPGeometryMode:
|
||||||
clear: [G_LIGHTING]
|
clear: [G_LIGHTING]
|
||||||
set: [G_SHADE]
|
set: [G_SHADE]
|
||||||
|
|
Binary file not shown.
Binary file not shown.
1
assets/models/props/signage.flags
Normal file
1
assets/models/props/signage.flags
Normal file
|
@ -0,0 +1 @@
|
||||||
|
-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml --default-material default --boneless
|
6
assets/sound/doors/doormove1.jsox
Normal file
6
assets/sound/doors/doormove1.jsox
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"flags": "-c 1 -r 22050",
|
||||||
|
"filters": "trim 0 0.7479"
|
||||||
|
}
|
||||||
|
]
|
5
assets/sound/plats/elevator_move_loop1.jsox
Normal file
5
assets/sound/plats/elevator_move_loop1.jsox
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"flags": "-c 1 -r 22050"
|
||||||
|
}
|
||||||
|
]
|
|
@ -105,6 +105,7 @@ int main(int argc, char *argv[]) {
|
||||||
settings.mPrefix = args.mPrefix;
|
settings.mPrefix = args.mPrefix;
|
||||||
settings.mExportAnimation = args.mExportAnimation;
|
settings.mExportAnimation = args.mExportAnimation;
|
||||||
settings.mExportGeometry = args.mExportGeometry;
|
settings.mExportGeometry = args.mExportGeometry;
|
||||||
|
settings.mBonesAsVertexGroups = args.mBonesAsVertexGroups;
|
||||||
|
|
||||||
bool hasError = false;
|
bool hasError = false;
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
||||||
output.mModelScale = 1.0f;
|
output.mModelScale = 1.0f;
|
||||||
output.mExportAnimation = true;
|
output.mExportAnimation = true;
|
||||||
output.mExportGeometry = true;
|
output.mExportGeometry = true;
|
||||||
|
output.mBonesAsVertexGroups = false;
|
||||||
output.mOutputType = FileOutputType::Mesh;
|
output.mOutputType = FileOutputType::Mesh;
|
||||||
output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f);
|
output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f);
|
||||||
output.mDefaultMaterial = "default";
|
output.mDefaultMaterial = "default";
|
||||||
|
@ -85,6 +86,8 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
||||||
strcmp(curr, "-a") == 0 ||
|
strcmp(curr, "-a") == 0 ||
|
||||||
strcmp(curr, "--animations-only") == 0) {
|
strcmp(curr, "--animations-only") == 0) {
|
||||||
output.mExportGeometry = false;
|
output.mExportGeometry = false;
|
||||||
|
} else if (strcmp(curr, "--boneless") == 0) {
|
||||||
|
output.mBonesAsVertexGroups = true;
|
||||||
} else if (strcmp(curr, "--level") == 0) {
|
} else if (strcmp(curr, "--level") == 0) {
|
||||||
output.mOutputType = FileOutputType::Level;
|
output.mOutputType = FileOutputType::Level;
|
||||||
output.mExportAnimation = false;
|
output.mExportAnimation = false;
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct CommandLineArguments {
|
||||||
float mModelScale;
|
float mModelScale;
|
||||||
bool mExportAnimation;
|
bool mExportAnimation;
|
||||||
bool mExportGeometry;
|
bool mExportGeometry;
|
||||||
|
bool mBonesAsVertexGroups;
|
||||||
aiVector3D mEulerAngles;
|
aiVector3D mEulerAngles;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct DisplayListSettings {
|
||||||
bool mExportAnimation;
|
bool mExportAnimation;
|
||||||
bool mExportGeometry;
|
bool mExportGeometry;
|
||||||
bool mIncludeCulling;
|
bool mIncludeCulling;
|
||||||
|
bool mBonesAsVertexGroups;
|
||||||
|
|
||||||
aiMatrix4x4 CreateGlobalTransform() const;
|
aiMatrix4x4 CreateGlobalTransform() const;
|
||||||
aiMatrix4x4 CreateCollisionTransform() const;
|
aiMatrix4x4 CreateCollisionTransform() const;
|
||||||
|
|
|
@ -140,14 +140,14 @@ ExtendedMesh::ExtendedMesh(aiMesh* mesh, BoneHierarchy& boneHierarchy) :
|
||||||
mMesh(mesh) {
|
mMesh(mesh) {
|
||||||
mVertexBones.resize(mMesh->mNumVertices);
|
mVertexBones.resize(mMesh->mNumVertices);
|
||||||
|
|
||||||
if (mesh->mNumBones) {
|
if (mesh->mNumBones && boneHierarchy.HasData()) {
|
||||||
mPointInverseTransform.resize(mMesh->mNumVertices);
|
mPointInverseTransform.resize(mMesh->mNumVertices);
|
||||||
mNormalInverseTransform.resize(mMesh->mNumVertices);
|
mNormalInverseTransform.resize(mMesh->mNumVertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<Bone*> bonesAsSet;
|
std::set<Bone*> bonesAsSet;
|
||||||
|
|
||||||
for (unsigned int boneIndex = 0; boneIndex < mMesh->mNumBones; ++boneIndex) {
|
for (unsigned int boneIndex = 0; boneIndex < mMesh->mNumBones && boneHierarchy.HasData(); ++boneIndex) {
|
||||||
aiBone* bone = mMesh->mBones[boneIndex];
|
aiBone* bone = mMesh->mBones[boneIndex];
|
||||||
Bone* hierarchyBone = boneHierarchy.BoneForName(bone->mName.C_Str());
|
Bone* hierarchyBone = boneHierarchy.BoneForName(bone->mName.C_Str());
|
||||||
bonesAsSet.insert(hierarchyBone);
|
bonesAsSet.insert(hierarchyBone);
|
||||||
|
|
|
@ -88,7 +88,7 @@ void filterOutFaces(aiMesh* source, aiMesh* target, std::map<unsigned int, unsig
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
aiMesh* subMesh(aiMesh* mesh, std::vector<aiFace*> faces) {
|
aiMesh* subMesh(aiMesh* mesh, std::vector<aiFace*> faces, std::string name) {
|
||||||
aiMesh* result = new aiMesh();
|
aiMesh* result = new aiMesh();
|
||||||
|
|
||||||
std::map<unsigned int, unsigned int> vertexMapping;
|
std::map<unsigned int, unsigned int> vertexMapping;
|
||||||
|
@ -98,7 +98,7 @@ aiMesh* subMesh(aiMesh* mesh, std::vector<aiFace*> faces) {
|
||||||
result->mVertices = new aiVector3D[result->mNumVertices];
|
result->mVertices = new aiVector3D[result->mNumVertices];
|
||||||
result->mMaterialIndex = mesh->mMaterialIndex;
|
result->mMaterialIndex = mesh->mMaterialIndex;
|
||||||
result->mMethod = mesh->mMethod;
|
result->mMethod = mesh->mMethod;
|
||||||
result->mName = mesh->mName;
|
result->mName = std::string(mesh->mName.C_Str()) + "_" + name;
|
||||||
if (mesh->mNormals) result->mNormals = new aiVector3D[result->mNumVertices];
|
if (mesh->mNormals) result->mNormals = new aiVector3D[result->mNumVertices];
|
||||||
if (mesh->mTextureCoords[0]) result->mTextureCoords[0] = new aiVector3D[result->mNumVertices];
|
if (mesh->mTextureCoords[0]) result->mTextureCoords[0] = new aiVector3D[result->mNumVertices];
|
||||||
if (mesh->mColors[0]) result->mColors[0] = new aiColor4D[result->mNumVertices];
|
if (mesh->mColors[0]) result->mColors[0] = new aiColor4D[result->mNumVertices];
|
||||||
|
@ -126,6 +126,14 @@ aiMesh* subMesh(aiMesh* mesh, std::vector<aiFace*> faces) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string boneName(Bone* bone) {
|
||||||
|
if (bone) {
|
||||||
|
return bone->GetName();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void splitSceneByBones(aiScene* targetScene) {
|
void splitSceneByBones(aiScene* targetScene) {
|
||||||
std::vector<aiMesh*> newMeshes;
|
std::vector<aiMesh*> newMeshes;
|
||||||
std::vector<std::pair<std::size_t, std::size_t>> meshIndexMapping;
|
std::vector<std::pair<std::size_t, std::size_t>> meshIndexMapping;
|
||||||
|
@ -141,11 +149,11 @@ void splitSceneByBones(aiScene* targetScene) {
|
||||||
int startIndex = newMeshes.size();
|
int startIndex = newMeshes.size();
|
||||||
|
|
||||||
for (auto newFaces = extendedMesh->mFacesForBone.begin(); newFaces != extendedMesh->mFacesForBone.end(); ++newFaces) {
|
for (auto newFaces = extendedMesh->mFacesForBone.begin(); newFaces != extendedMesh->mFacesForBone.end(); ++newFaces) {
|
||||||
newMeshes.push_back(subMesh(currMesh, newFaces->second));
|
newMeshes.push_back(subMesh(currMesh, newFaces->second, boneName(newFaces->first)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto newFaces = extendedMesh->mBoneSpanningFaces.begin(); newFaces != extendedMesh->mBoneSpanningFaces.end(); ++newFaces) {
|
for (auto newFaces = extendedMesh->mBoneSpanningFaces.begin(); newFaces != extendedMesh->mBoneSpanningFaces.end(); ++newFaces) {
|
||||||
newMeshes.push_back(subMesh(currMesh, newFaces->second));
|
newMeshes.push_back(subMesh(currMesh, newFaces->second, boneName(newFaces->first.first)));
|
||||||
}
|
}
|
||||||
|
|
||||||
meshIndexMapping.push_back(std::make_pair(startIndex, newMeshes.size()));
|
meshIndexMapping.push_back(std::make_pair(startIndex, newMeshes.size()));
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
// Caller is responsible for freeing memory
|
// Caller is responsible for freeing memory
|
||||||
aiMesh* subMesh(aiMesh* mesh, std::vector<aiFace*> faces);
|
aiMesh* subMesh(aiMesh* mesh, std::vector<aiFace*> faces, std::string name);
|
||||||
|
|
||||||
void splitSceneByBones(aiScene* targetScene);
|
void splitSceneByBones(aiScene* targetScene);
|
||||||
|
|
||||||
|
|
|
@ -702,6 +702,51 @@ void generatePedestalDefinitions(
|
||||||
levelDef.AddPrimitive("pedestalCount", pedestalCount);
|
levelDef.AddPrimitive("pedestalCount", pedestalCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void generateSignageDefinitions(
|
||||||
|
const aiScene* scene,
|
||||||
|
CFileDefinition& fileDefinition,
|
||||||
|
StructureDataChunk& levelDef,
|
||||||
|
const RoomGeneratorOutput& roomOutput,
|
||||||
|
const DisplayListSettings& settings,
|
||||||
|
NodeGroups& nodeGroups) {
|
||||||
|
|
||||||
|
int signageCount = 0;
|
||||||
|
std::unique_ptr<StructureDataChunk> signage(new StructureDataChunk());
|
||||||
|
|
||||||
|
aiMatrix4x4 baseTransform = settings.CreateCollisionTransform();
|
||||||
|
|
||||||
|
for (auto& nodeInfo : nodeGroups.NodesForType("@signage")) {
|
||||||
|
if (nodeInfo.arguments.size() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<StructureDataChunk> signageData(new StructureDataChunk());
|
||||||
|
aiVector3D pos;
|
||||||
|
aiQuaternion rot;
|
||||||
|
aiVector3D scale;
|
||||||
|
(baseTransform * nodeInfo.node->mTransformation).Decompose(scale, rot, pos);
|
||||||
|
signageData->Add(std::unique_ptr<StructureDataChunk>(new StructureDataChunk(pos)));
|
||||||
|
signageData->Add(std::unique_ptr<StructureDataChunk>(new StructureDataChunk(rot)));
|
||||||
|
signageData->AddPrimitive(roomOutput.RoomForNode(nodeInfo.node));
|
||||||
|
signageData->AddPrimitive(std::atoi(nodeInfo.arguments[0].c_str()));
|
||||||
|
|
||||||
|
signage->Add(std::move(signageData));
|
||||||
|
++signageCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string signageDef = fileDefinition.AddDataDefinition(
|
||||||
|
"signage",
|
||||||
|
"struct SignageDefinition",
|
||||||
|
true,
|
||||||
|
"_geo",
|
||||||
|
std::move(signage)
|
||||||
|
);
|
||||||
|
|
||||||
|
levelDef.AddPrimitive("signage", signageDef);
|
||||||
|
levelDef.AddPrimitive("signageCount", signageCount);
|
||||||
|
}
|
||||||
|
|
||||||
void generateLevel(
|
void generateLevel(
|
||||||
const aiScene* scene,
|
const aiScene* scene,
|
||||||
CFileDefinition& fileDefinition,
|
CFileDefinition& fileDefinition,
|
||||||
|
@ -747,5 +792,7 @@ void generateLevel(
|
||||||
|
|
||||||
generatePedestalDefinitions(scene, fileDefinition, *levelDef, roomOutput, settings, nodeGroups);
|
generatePedestalDefinitions(scene, fileDefinition, *levelDef, roomOutput, settings, nodeGroups);
|
||||||
|
|
||||||
|
generateSignageDefinitions(scene, fileDefinition, *levelDef, roomOutput, settings, nodeGroups);
|
||||||
|
|
||||||
fileDefinition.AddDefinition(std::unique_ptr<FileDefinition>(new DataFileDefinition("struct LevelDefinition", fileDefinition.GetUniqueName("level"), false, "_geo", std::move(levelDef))));
|
fileDefinition.AddDefinition(std::unique_ptr<FileDefinition>(new DataFileDefinition("struct LevelDefinition", fileDefinition.GetUniqueName("level"), false, "_geo", std::move(levelDef))));
|
||||||
}
|
}
|
|
@ -96,7 +96,10 @@ void MeshDefinitionGenerator::GenerateDefinitions(const aiScene* scene, CFileDef
|
||||||
std::vector<RenderChunk> renderChunks;
|
std::vector<RenderChunk> renderChunks;
|
||||||
|
|
||||||
auto animInfo = findNodesForWithAnimation(scene, mIncludedNodes, mSettings.mModelScale);
|
auto animInfo = findNodesForWithAnimation(scene, mIncludedNodes, mSettings.mModelScale);
|
||||||
|
|
||||||
|
if (!mSettings.mBonesAsVertexGroups) {
|
||||||
fileDefinition.GetBoneHierarchy().PopulateWithAnimationNodeInfo(*animInfo, mSettings.mFixedPointScale, mSettings.mRotateModel);
|
fileDefinition.GetBoneHierarchy().PopulateWithAnimationNodeInfo(*animInfo, mSettings.mFixedPointScale, mSettings.mRotateModel);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto node = mIncludedNodes.begin(); node != mIncludedNodes.end(); ++node) {
|
for (auto node = mIncludedNodes.begin(); node != mIncludedNodes.end(); ++node) {
|
||||||
AppendRenderChunks(scene, *node, fileDefinition, mSettings, renderChunks);
|
AppendRenderChunks(scene, *node, fileDefinition, mSettings, renderChunks);
|
||||||
|
@ -104,7 +107,7 @@ void MeshDefinitionGenerator::GenerateDefinitions(const aiScene* scene, CFileDef
|
||||||
|
|
||||||
generateMesh(scene, fileDefinition, renderChunks, mSettings, "_geo");
|
generateMesh(scene, fileDefinition, renderChunks, mSettings, "_geo");
|
||||||
|
|
||||||
if (fileDefinition.GetBoneHierarchy().HasData()) {
|
if (fileDefinition.GetBoneHierarchy().HasData() && !mSettings.mBonesAsVertexGroups) {
|
||||||
generateAnimationForScene(scene, fileDefinition, mSettings);
|
generateAnimationForScene(scene, fileDefinition, mSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -22,3 +22,5 @@ unsigned short soundsPortalgunShoot[2] = {
|
||||||
unsigned short soundsPortalOpen2 = SOUNDS_PORTAL_OPEN2;
|
unsigned short soundsPortalOpen2 = SOUNDS_PORTAL_OPEN2;
|
||||||
|
|
||||||
unsigned short soundsPortalFizzle = SOUNDS_PORTAL_FIZZLE2;
|
unsigned short soundsPortalFizzle = SOUNDS_PORTAL_FIZZLE2;
|
||||||
|
|
||||||
|
unsigned short soundsElevatorDoor = SOUNDS_DOORMOVE1;
|
|
@ -10,4 +10,6 @@ extern unsigned short soundsPortalOpen2;
|
||||||
|
|
||||||
extern unsigned short soundsPortalFizzle;
|
extern unsigned short soundsPortalFizzle;
|
||||||
|
|
||||||
|
extern unsigned short soundsElevatorDoor;
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -140,6 +140,13 @@ struct PedestalDefinition {
|
||||||
short roomIndex;
|
short roomIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SignageDefinition {
|
||||||
|
struct Vector3 position;
|
||||||
|
struct Quaternion rotation;
|
||||||
|
short roomIndex;
|
||||||
|
short testChamberNumber;
|
||||||
|
};
|
||||||
|
|
||||||
struct LevelDefinition {
|
struct LevelDefinition {
|
||||||
struct CollisionObject* collisionQuads;
|
struct CollisionObject* collisionQuads;
|
||||||
struct StaticContentElement *staticContent;
|
struct StaticContentElement *staticContent;
|
||||||
|
@ -160,6 +167,7 @@ struct LevelDefinition {
|
||||||
struct FizzlerDefinition* fizzlers;
|
struct FizzlerDefinition* fizzlers;
|
||||||
struct ElevatorDefinition* elevators;
|
struct ElevatorDefinition* elevators;
|
||||||
struct PedestalDefinition* pedestals;
|
struct PedestalDefinition* pedestals;
|
||||||
|
struct SignageDefinition* signage;
|
||||||
short collisionQuadCount;
|
short collisionQuadCount;
|
||||||
short staticContentCount;
|
short staticContentCount;
|
||||||
short portalSurfaceCount;
|
short portalSurfaceCount;
|
||||||
|
@ -173,6 +181,7 @@ struct LevelDefinition {
|
||||||
short fizzlerCount;
|
short fizzlerCount;
|
||||||
short elevatorCount;
|
short elevatorCount;
|
||||||
short pedestalCount;
|
short pedestalCount;
|
||||||
|
short signageCount;
|
||||||
short startLocation;
|
short startLocation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,7 @@ struct LevelDefinition* levelFixPointers(struct LevelDefinition* from, int point
|
||||||
result->fizzlers = ADJUST_POINTER_POS(result->fizzlers, pointerOffset);
|
result->fizzlers = ADJUST_POINTER_POS(result->fizzlers, pointerOffset);
|
||||||
result->elevators = ADJUST_POINTER_POS(result->elevators, pointerOffset);
|
result->elevators = ADJUST_POINTER_POS(result->elevators, pointerOffset);
|
||||||
result->pedestals = ADJUST_POINTER_POS(result->pedestals, pointerOffset);
|
result->pedestals = ADJUST_POINTER_POS(result->pedestals, pointerOffset);
|
||||||
|
result->signage = ADJUST_POINTER_POS(result->signage, pointerOffset);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,7 @@ static void gameProc(void* arg) {
|
||||||
|
|
||||||
dynamicSceneInit();
|
dynamicSceneInit();
|
||||||
contactSolverInit(&gContactSolver);
|
contactSolverInit(&gContactSolver);
|
||||||
levelLoad(1);
|
levelLoad(0);
|
||||||
controllersInit();
|
controllersInit();
|
||||||
initAudio();
|
initAudio();
|
||||||
soundPlayerInit();
|
soundPlayerInit();
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#define KILL_PLANE_Y -10.0f
|
||||||
|
|
||||||
void rigidBodyInit(struct RigidBody* rigidBody, float mass, float momentOfIniteria) {
|
void rigidBodyInit(struct RigidBody* rigidBody, float mass, float momentOfIniteria) {
|
||||||
transformInitIdentity(&rigidBody->transform);
|
transformInitIdentity(&rigidBody->transform);
|
||||||
rigidBody->velocity = gZeroVec;
|
rigidBody->velocity = gZeroVec;
|
||||||
|
@ -55,6 +57,13 @@ void rigidBodyUpdate(struct RigidBody* rigidBody) {
|
||||||
|
|
||||||
// vector3Scale(&rigidBody->velocity, &rigidBody->velocity, ENERGY_SCALE_PER_STEP);
|
// vector3Scale(&rigidBody->velocity, &rigidBody->velocity, ENERGY_SCALE_PER_STEP);
|
||||||
vector3Scale(&rigidBody->angularVelocity, &rigidBody->angularVelocity, ENERGY_SCALE_PER_STEP);
|
vector3Scale(&rigidBody->angularVelocity, &rigidBody->angularVelocity, ENERGY_SCALE_PER_STEP);
|
||||||
|
|
||||||
|
if (rigidBody->transform.position.y < KILL_PLANE_Y) {
|
||||||
|
rigidBody->transform.position.y = KILL_PLANE_Y;
|
||||||
|
rigidBody->velocity.y = 0.0f;
|
||||||
|
|
||||||
|
rigidBody->flags |= RigidBodyFizzled;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rigidBodyVelocityAtLocalPoint(struct RigidBody* rigidBody, struct Vector3* localPoint, struct Vector3* worldVelocity) {
|
void rigidBodyVelocityAtLocalPoint(struct RigidBody* rigidBody, struct Vector3* localPoint, struct Vector3* worldVelocity) {
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include "./signals.h"
|
#include "./signals.h"
|
||||||
#include "../math/mathf.h"
|
#include "../math/mathf.h"
|
||||||
#include "../util/time.h"
|
#include "../util/time.h"
|
||||||
|
#include "../audio/soundplayer.h"
|
||||||
|
#include "../audio/clips.h"
|
||||||
|
|
||||||
#include "../../build/assets/models/props/round_elevator_collision.h"
|
#include "../../build/assets/models/props/round_elevator_collision.h"
|
||||||
#include "../../build/assets/models/props/round_elevator_interior.h"
|
#include "../../build/assets/models/props/round_elevator_interior.h"
|
||||||
|
@ -142,5 +144,9 @@ void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((elevator->openAmount == 0.0f && shouldBeOpen) || (elevator->openAmount && !shouldBeOpen)) {
|
||||||
|
soundPlayerPlay(soundsElevatorDoor, 1.0f, 0.5f, &elevator->rigidBody.transform.position);
|
||||||
|
}
|
||||||
|
|
||||||
elevator->openAmount = mathfMoveTowards(elevator->openAmount, shouldBeOpen ? 1.0f : 0.0f, OPEN_SPEED * FIXED_DELTA_TIME);
|
elevator->openAmount = mathfMoveTowards(elevator->openAmount, shouldBeOpen ? 1.0f : 0.0f, OPEN_SPEED * FIXED_DELTA_TIME);
|
||||||
}
|
}
|
|
@ -101,6 +101,12 @@ void sceneInit(struct Scene* scene) {
|
||||||
for (int i = 0; i < scene->pedestalCount; ++i) {
|
for (int i = 0; i < scene->pedestalCount; ++i) {
|
||||||
pedestalInit(&scene->pedestals[i], &gCurrentLevel->pedestals[i]);
|
pedestalInit(&scene->pedestals[i], &gCurrentLevel->pedestals[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scene->signageCount = gCurrentLevel->signageCount;
|
||||||
|
scene->signage = malloc(sizeof(struct Signage) * scene->signageCount);
|
||||||
|
for (int i = 0; i < scene->signageCount; ++i) {
|
||||||
|
signageInit(&scene->signage[i], &gCurrentLevel->signage[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sceneRenderWithProperties(void* data, struct RenderProps* properties, struct RenderState* renderState) {
|
void sceneRenderWithProperties(void* data, struct RenderProps* properties, struct RenderState* renderState) {
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "./fizzler.h"
|
#include "./fizzler.h"
|
||||||
#include "elevator.h"
|
#include "elevator.h"
|
||||||
#include "pedestal.h"
|
#include "pedestal.h"
|
||||||
|
#include "signage.h"
|
||||||
|
|
||||||
struct Scene {
|
struct Scene {
|
||||||
struct Camera camera;
|
struct Camera camera;
|
||||||
|
@ -25,6 +26,7 @@ struct Scene {
|
||||||
struct Fizzler* fizzlers;
|
struct Fizzler* fizzlers;
|
||||||
struct Elevator* elevators;
|
struct Elevator* elevators;
|
||||||
struct Pedestal* pedestals;
|
struct Pedestal* pedestals;
|
||||||
|
struct Signage* signage;
|
||||||
OSTime cpuTime;
|
OSTime cpuTime;
|
||||||
OSTime lastFrameStart;
|
OSTime lastFrameStart;
|
||||||
OSTime lastFrameTime;
|
OSTime lastFrameTime;
|
||||||
|
@ -34,6 +36,7 @@ struct Scene {
|
||||||
u8 fizzlerCount;
|
u8 fizzlerCount;
|
||||||
u8 elevatorCount;
|
u8 elevatorCount;
|
||||||
u8 pedestalCount;
|
u8 pedestalCount;
|
||||||
|
u8 signageCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct Scene gScene;
|
extern struct Scene gScene;
|
||||||
|
|
33
src/scene/signage.c
Normal file
33
src/scene/signage.c
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#include "signage.h"
|
||||||
|
|
||||||
|
#include "../scene/dynamic_scene.h"
|
||||||
|
#include "../levels/levels.h"
|
||||||
|
#include "../defs.h"
|
||||||
|
|
||||||
|
#include "../build/assets/models/props/signage.h"
|
||||||
|
#include "../build/assets/models/props/cylinder_test.h"
|
||||||
|
#include "../../build/assets/materials/static.h"
|
||||||
|
|
||||||
|
void signageRender(void* data, struct RenderScene* renderScene) {
|
||||||
|
struct Signage* signage = (struct Signage*)data;
|
||||||
|
Mtx* matrix = renderStateRequestMatrices(renderScene->renderState, 1);
|
||||||
|
transformToMatrixL(&signage->transform, matrix, SCENE_SCALE);
|
||||||
|
|
||||||
|
renderSceneAdd(
|
||||||
|
renderScene,
|
||||||
|
props_signage_model_gfx,
|
||||||
|
matrix,
|
||||||
|
DEFAULT_INDEX,
|
||||||
|
&signage->transform.position,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void signageInit(struct Signage* signage, struct SignageDefinition* definition) {
|
||||||
|
signage->transform.position = definition->position;
|
||||||
|
signage->transform.rotation = definition->rotation;
|
||||||
|
signage->transform.scale = gOneVec;
|
||||||
|
signage->roomIndex = definition->roomIndex;
|
||||||
|
|
||||||
|
dynamicSceneAdd(signage, signageRender, &signage->transform, 1.7f);
|
||||||
|
}
|
14
src/scene/signage.h
Normal file
14
src/scene/signage.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef __SCENE_SIGNAGE_H__
|
||||||
|
#define __SCENE_SIGNAGE_H__
|
||||||
|
|
||||||
|
#include "../math/transform.h"
|
||||||
|
#include "../levels/level_definition.h"
|
||||||
|
|
||||||
|
struct Signage {
|
||||||
|
struct Transform transform;
|
||||||
|
short roomIndex;
|
||||||
|
};
|
||||||
|
|
||||||
|
void signageInit(struct Signage* signage, struct SignageDefinition* definition);
|
||||||
|
|
||||||
|
#endif
|
21
tools/jsox.js
Normal file
21
tools/jsox.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
const fs = require('fs');
|
||||||
|
const child_process = require('child_process');
|
||||||
|
|
||||||
|
const fileContents = fs.readFileSync(process.argv[2]);
|
||||||
|
const fileJSON = JSON.parse(fileContents);
|
||||||
|
|
||||||
|
fileJSON.forEach((command) => {
|
||||||
|
const commandText = `sox ${process.argv[3]} ${command.flags || ''} ${process.argv[4]} ${command.filters || ''}`;
|
||||||
|
|
||||||
|
process.stdout.write(commandText);
|
||||||
|
process.stdout.write('\n');
|
||||||
|
const script = child_process.exec(commandText);
|
||||||
|
|
||||||
|
script.stdout.on('data', function(data){
|
||||||
|
process.stdout.write(data.toString());
|
||||||
|
});
|
||||||
|
// what to do with data coming from the standard error
|
||||||
|
script.stderr.on('data', function(data){
|
||||||
|
process.stderr.write(data.toString());
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in a new issue