work on dynamic signage

This commit is contained in:
James Lambert 2022-08-09 12:59:09 -06:00
parent c8c56abdb5
commit 6f78076558
29 changed files with 208 additions and 14 deletions

View file

@ -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)

View file

@ -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

View file

@ -326,6 +326,8 @@ materials:
wrap: false wrap: false
t: t:
wrap: false wrap: false
gDPSetRenderMode: G_RM_ZB_OPA_SURF
gSPGeometryMode: gSPGeometryMode:
clear: [G_LIGHTING] clear: [G_LIGHTING]
@ -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.

View file

@ -0,0 +1 @@
-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml --default-material default --boneless

View file

@ -0,0 +1,6 @@
[
{
"flags": "-c 1 -r 22050",
"filters": "trim 0 0.7479"
}
]

View file

@ -0,0 +1,5 @@
[
{
"flags": "-c 1 -r 22050"
}
]

View file

@ -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;

View file

@ -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;

View file

@ -26,6 +26,7 @@ struct CommandLineArguments {
float mModelScale; float mModelScale;
bool mExportAnimation; bool mExportAnimation;
bool mExportGeometry; bool mExportGeometry;
bool mBonesAsVertexGroups;
aiVector3D mEulerAngles; aiVector3D mEulerAngles;
}; };

View file

@ -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;

View file

@ -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);

View file

@ -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()));

View file

@ -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);

View file

@ -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))));
} }

View file

@ -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);
fileDefinition.GetBoneHierarchy().PopulateWithAnimationNodeInfo(*animInfo, mSettings.mFixedPointScale, mSettings.mRotateModel);
if (!mSettings.mBonesAsVertexGroups) {
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);
} }
} }

View file

@ -21,4 +21,6 @@ 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;

View file

@ -10,4 +10,6 @@ extern unsigned short soundsPortalOpen2;
extern unsigned short soundsPortalFizzle; extern unsigned short soundsPortalFizzle;
extern unsigned short soundsElevatorDoor;
#endif #endif

View file

@ -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;
}; };

View file

@ -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;
} }

View file

@ -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();

View file

@ -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) {

View file

@ -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);
} }

View file

@ -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) {

View file

@ -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
View 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
View 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
View 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());
});
});