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_interior.blend \
|
||||
assets/models/props/round_elevator_collision.blend \
|
||||
assets/models/props/signage.blend \
|
||||
assets/models/portal/portal_blue.blend \
|
||||
assets/models/portal/portal_blue_filled.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/signage.o: $(MODEL_HEADERS)
|
||||
|
||||
build/assets/models/%_anim.o: build/assets/models/%.h
|
||||
|
||||
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_JATTRIBUTES = $(shell find assets/ -type f -name '*.jsox')
|
||||
|
||||
MUSIC_ATTRIBUTES = $(shell find assets/sound/music/ -type f -name '*.msox')
|
||||
|
||||
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
|
||||
|
||||
|
@ -260,6 +264,11 @@ build/%.aifc: %.sox portal_pak_dir
|
|||
sox $(<:assets/%.sox=portal_pak_dir/%.wav) $(shell cat $<) $(@:%.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
|
||||
@mkdir -p $(@D)
|
||||
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
|
||||
- [ ] Elevator and door sounds
|
||||
- [ ] Portal gun pedistal
|
||||
- [ ] kill plane
|
||||
- [ ] Turn level indicator board into a game object
|
||||
- [ ] Presort portal gun polygon order
|
||||
- [ ] Change the way player standing logic works
|
||||
- [ ] Cube dispenser
|
||||
- [ ] NAN in overlap
|
||||
- [x] kill plane
|
||||
- [x] Portal gun pedistal
|
||||
- [x] Fix portal overlapping bug
|
||||
- [x] Fix bug where opening a portal can trigger a teleportation
|
||||
- [x] Implement level transitions
|
|
@ -327,6 +327,8 @@ materials:
|
|||
t:
|
||||
wrap: false
|
||||
|
||||
gDPSetRenderMode: G_RM_ZB_OPA_SURF
|
||||
|
||||
gSPGeometryMode:
|
||||
clear: [G_LIGHTING]
|
||||
gDPSetCycleType: G_CYC_1CYCLE
|
||||
|
@ -411,6 +413,7 @@ materials:
|
|||
gDPSetCombineMode:
|
||||
color: ["0", "0", "0", SHADE]
|
||||
gDPSetCycleType: G_CYC_1CYCLE
|
||||
gDPSetRenderMode: G_RM_ZB_OPA_SURF
|
||||
gSPGeometryMode:
|
||||
clear: [G_LIGHTING]
|
||||
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.mExportAnimation = args.mExportAnimation;
|
||||
settings.mExportGeometry = args.mExportGeometry;
|
||||
settings.mBonesAsVertexGroups = args.mBonesAsVertexGroups;
|
||||
|
||||
bool hasError = false;
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
|||
output.mModelScale = 1.0f;
|
||||
output.mExportAnimation = true;
|
||||
output.mExportGeometry = true;
|
||||
output.mBonesAsVertexGroups = false;
|
||||
output.mOutputType = FileOutputType::Mesh;
|
||||
output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f);
|
||||
output.mDefaultMaterial = "default";
|
||||
|
@ -85,6 +86,8 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
|||
strcmp(curr, "-a") == 0 ||
|
||||
strcmp(curr, "--animations-only") == 0) {
|
||||
output.mExportGeometry = false;
|
||||
} else if (strcmp(curr, "--boneless") == 0) {
|
||||
output.mBonesAsVertexGroups = true;
|
||||
} else if (strcmp(curr, "--level") == 0) {
|
||||
output.mOutputType = FileOutputType::Level;
|
||||
output.mExportAnimation = false;
|
||||
|
|
|
@ -26,6 +26,7 @@ struct CommandLineArguments {
|
|||
float mModelScale;
|
||||
bool mExportAnimation;
|
||||
bool mExportGeometry;
|
||||
bool mBonesAsVertexGroups;
|
||||
aiVector3D mEulerAngles;
|
||||
};
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ struct DisplayListSettings {
|
|||
bool mExportAnimation;
|
||||
bool mExportGeometry;
|
||||
bool mIncludeCulling;
|
||||
bool mBonesAsVertexGroups;
|
||||
|
||||
aiMatrix4x4 CreateGlobalTransform() const;
|
||||
aiMatrix4x4 CreateCollisionTransform() const;
|
||||
|
|
|
@ -140,14 +140,14 @@ ExtendedMesh::ExtendedMesh(aiMesh* mesh, BoneHierarchy& boneHierarchy) :
|
|||
mMesh(mesh) {
|
||||
mVertexBones.resize(mMesh->mNumVertices);
|
||||
|
||||
if (mesh->mNumBones) {
|
||||
if (mesh->mNumBones && boneHierarchy.HasData()) {
|
||||
mPointInverseTransform.resize(mMesh->mNumVertices);
|
||||
mNormalInverseTransform.resize(mMesh->mNumVertices);
|
||||
}
|
||||
|
||||
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];
|
||||
Bone* hierarchyBone = boneHierarchy.BoneForName(bone->mName.C_Str());
|
||||
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();
|
||||
|
||||
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->mMaterialIndex = mesh->mMaterialIndex;
|
||||
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->mTextureCoords[0]) result->mTextureCoords[0] = new aiVector3D[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;
|
||||
}
|
||||
|
||||
std::string boneName(Bone* bone) {
|
||||
if (bone) {
|
||||
return bone->GetName();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
void splitSceneByBones(aiScene* targetScene) {
|
||||
std::vector<aiMesh*> newMeshes;
|
||||
std::vector<std::pair<std::size_t, std::size_t>> meshIndexMapping;
|
||||
|
@ -141,11 +149,11 @@ void splitSceneByBones(aiScene* targetScene) {
|
|||
int startIndex = newMeshes.size();
|
||||
|
||||
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) {
|
||||
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()));
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <vector>
|
||||
|
||||
// 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);
|
||||
|
||||
|
|
|
@ -702,6 +702,51 @@ void generatePedestalDefinitions(
|
|||
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(
|
||||
const aiScene* scene,
|
||||
CFileDefinition& fileDefinition,
|
||||
|
@ -747,5 +792,7 @@ void generateLevel(
|
|||
|
||||
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))));
|
||||
}
|
|
@ -96,7 +96,10 @@ void MeshDefinitionGenerator::GenerateDefinitions(const aiScene* scene, CFileDef
|
|||
std::vector<RenderChunk> renderChunks;
|
||||
|
||||
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) {
|
||||
AppendRenderChunks(scene, *node, fileDefinition, mSettings, renderChunks);
|
||||
|
@ -104,7 +107,7 @@ void MeshDefinitionGenerator::GenerateDefinitions(const aiScene* scene, CFileDef
|
|||
|
||||
generateMesh(scene, fileDefinition, renderChunks, mSettings, "_geo");
|
||||
|
||||
if (fileDefinition.GetBoneHierarchy().HasData()) {
|
||||
if (fileDefinition.GetBoneHierarchy().HasData() && !mSettings.mBonesAsVertexGroups) {
|
||||
generateAnimationForScene(scene, fileDefinition, mSettings);
|
||||
}
|
||||
}
|
|
@ -22,3 +22,5 @@ unsigned short soundsPortalgunShoot[2] = {
|
|||
unsigned short soundsPortalOpen2 = SOUNDS_PORTAL_OPEN2;
|
||||
|
||||
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 soundsElevatorDoor;
|
||||
|
||||
#endif
|
|
@ -140,6 +140,13 @@ struct PedestalDefinition {
|
|||
short roomIndex;
|
||||
};
|
||||
|
||||
struct SignageDefinition {
|
||||
struct Vector3 position;
|
||||
struct Quaternion rotation;
|
||||
short roomIndex;
|
||||
short testChamberNumber;
|
||||
};
|
||||
|
||||
struct LevelDefinition {
|
||||
struct CollisionObject* collisionQuads;
|
||||
struct StaticContentElement *staticContent;
|
||||
|
@ -160,6 +167,7 @@ struct LevelDefinition {
|
|||
struct FizzlerDefinition* fizzlers;
|
||||
struct ElevatorDefinition* elevators;
|
||||
struct PedestalDefinition* pedestals;
|
||||
struct SignageDefinition* signage;
|
||||
short collisionQuadCount;
|
||||
short staticContentCount;
|
||||
short portalSurfaceCount;
|
||||
|
@ -173,6 +181,7 @@ struct LevelDefinition {
|
|||
short fizzlerCount;
|
||||
short elevatorCount;
|
||||
short pedestalCount;
|
||||
short signageCount;
|
||||
short startLocation;
|
||||
};
|
||||
|
||||
|
|
|
@ -77,6 +77,7 @@ struct LevelDefinition* levelFixPointers(struct LevelDefinition* from, int point
|
|||
result->fizzlers = ADJUST_POINTER_POS(result->fizzlers, pointerOffset);
|
||||
result->elevators = ADJUST_POINTER_POS(result->elevators, pointerOffset);
|
||||
result->pedestals = ADJUST_POINTER_POS(result->pedestals, pointerOffset);
|
||||
result->signage = ADJUST_POINTER_POS(result->signage, pointerOffset);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -152,7 +152,7 @@ static void gameProc(void* arg) {
|
|||
|
||||
dynamicSceneInit();
|
||||
contactSolverInit(&gContactSolver);
|
||||
levelLoad(1);
|
||||
levelLoad(0);
|
||||
controllersInit();
|
||||
initAudio();
|
||||
soundPlayerInit();
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include "defs.h"
|
||||
#include <math.h>
|
||||
|
||||
#define KILL_PLANE_Y -10.0f
|
||||
|
||||
void rigidBodyInit(struct RigidBody* rigidBody, float mass, float momentOfIniteria) {
|
||||
transformInitIdentity(&rigidBody->transform);
|
||||
rigidBody->velocity = gZeroVec;
|
||||
|
@ -55,6 +57,13 @@ void rigidBodyUpdate(struct RigidBody* rigidBody) {
|
|||
|
||||
// vector3Scale(&rigidBody->velocity, &rigidBody->velocity, 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) {
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
#include "./signals.h"
|
||||
#include "../math/mathf.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_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);
|
||||
}
|
|
@ -101,6 +101,12 @@ void sceneInit(struct Scene* scene) {
|
|||
for (int i = 0; i < scene->pedestalCount; ++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) {
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "./fizzler.h"
|
||||
#include "elevator.h"
|
||||
#include "pedestal.h"
|
||||
#include "signage.h"
|
||||
|
||||
struct Scene {
|
||||
struct Camera camera;
|
||||
|
@ -25,6 +26,7 @@ struct Scene {
|
|||
struct Fizzler* fizzlers;
|
||||
struct Elevator* elevators;
|
||||
struct Pedestal* pedestals;
|
||||
struct Signage* signage;
|
||||
OSTime cpuTime;
|
||||
OSTime lastFrameStart;
|
||||
OSTime lastFrameTime;
|
||||
|
@ -34,6 +36,7 @@ struct Scene {
|
|||
u8 fizzlerCount;
|
||||
u8 elevatorCount;
|
||||
u8 pedestalCount;
|
||||
u8 signageCount;
|
||||
};
|
||||
|
||||
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