From abaa802e00b95b22142c09dfac1d974bca424bcc Mon Sep 17 00:00:00 2001 From: James Lambert Date: Sun, 19 Jun 2022 21:40:29 -0600 Subject: [PATCH] Refactor skelatool to scale output types --- Makefile | 6 +- skelatool64/main.cpp | 59 ++++++++++--------- skelatool64/src/CommandLineParser.cpp | 36 +++++------ skelatool64/src/CommandLineParser.h | 11 +++- .../CollisionGenerator.cpp | 49 ++++++++------- .../definition_generator/CollisionGenerator.h | 2 +- 6 files changed, 88 insertions(+), 75 deletions(-) diff --git a/Makefile b/Makefile index 3dbf83f..378c955 100644 --- a/Makefile +++ b/Makefile @@ -130,11 +130,11 @@ portal_pak_modified/%.png: portal_pak_dir/%.png assets/%.ims build/assets/materials/static.h build/assets/materials/static_mat.c: assets/materials/static.skm.yaml $(TEXTURE_IMAGES) $(SKELATOOL64) @mkdir -p $(@D) - $(SKELATOOL64) -n static -m $< -M build/assets/materials/static.h + $(SKELATOOL64) -n static -m $< --material-output -o build/assets/materials/static.h build/assets/materials/hud.h build/assets/materials/hud_mat.c: assets/materials/hud.skm.yaml $(TEXTURE_IMAGES) $(SKELATOOL64) @mkdir -p $(@D) - $(SKELATOOL64) -n hud -m $< -M build/assets/materials/hud.h + $(SKELATOOL64) -n hud -m $< --material-output -o build/assets/materials/hud.h src/levels/level_def_gen.h: build/assets/materials/static.h @@ -179,7 +179,7 @@ build/%.fbx: %.blend $(BLENDER_2_9) $< --background --python tools/export_fbx.py -- $@ build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c: build/assets/test_chambers/%.fbx build/assets/materials/static.h $(SKELATOOL64) $(TEXTURE_IMAGES) - $(SKELATOOL64) -l -s 2.56 -c 0.01 -n $(<:build/assets/test_chambers/%.fbx=%) -m assets/materials/static.skm.yaml -o $(<:%.fbx=%.h) $< + $(SKELATOOL64) --level -s 2.56 -c 0.01 -n $(<:build/assets/test_chambers/%.fbx=%) -m assets/materials/static.skm.yaml -o $(<:%.fbx=%.h) $< build/assets/test_chambers/%.o: build/assets/test_chambers/%.c build/assets/materials/static.h @mkdir -p $(@D) diff --git a/skelatool64/main.cpp b/skelatool64/main.cpp index d7d7dda..7b70ed0 100644 --- a/skelatool64/main.cpp +++ b/skelatool64/main.cpp @@ -127,26 +127,28 @@ int main(int argc, char *argv[]) { if (args.mInputFile.length()) { std::cout << "Generating from mesh " << args.mInputFile << std::endl; - scene = loadScene(args.mInputFile, args.mIsLevel, settings.mVertexCacheSize); + scene = loadScene(args.mInputFile, args.mOutputType != FileOutputType::Mesh, settings.mVertexCacheSize); if (!scene) { return 1; } } - if (scene && args.mOutputFile.length()) { - std::cout << "Saving to " << args.mOutputFile << std::endl; - // generateMeshFromSceneToFile(scene, args.mOutputFile, settings); + std::cout << "Saving to " << args.mOutputFile << std::endl; + CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel); - MeshDefinitionGenerator meshGenerator(settings); - - std::cout << "Generating mesh definitions" << std::endl; - meshGenerator.TraverseScene(scene); - CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel); - meshGenerator.GenerateDefinitions(scene, fileDef); - - - if (args.mIsLevel) { + switch (args.mOutputType) + { + case FileOutputType::Mesh: + { + MeshDefinitionGenerator meshGenerator(settings); + std::cout << "Generating mesh definitions" << std::endl; + meshGenerator.TraverseScene(scene); + meshGenerator.GenerateDefinitions(scene, fileDef); + break; + } + case FileOutputType::Level: + { NodeGroups nodesByGroup(scene); Signals signals; @@ -154,7 +156,7 @@ int main(int argc, char *argv[]) { auto roomOutput = generateRooms(scene, fileDef, settings, signals, nodesByGroup); std::cout << "Generating collider definitions" << std::endl; - auto collisionOutput = generateCollision(scene, fileDef, settings, *roomOutput, nodesByGroup); + auto collisionOutput = generateCollision(scene, fileDef, settings, roomOutput.get(), nodesByGroup); std::cout << "Generating static definitions" << std::endl; auto staticOutput = generateStatic(scene, fileDef, settings, *roomOutput, nodesByGroup); @@ -178,23 +180,26 @@ int main(int argc, char *argv[]) { ); nodesByGroup.PrintUnusedTypes(); + break; } + case FileOutputType::Materials: + { + std::cout << "Saving materials to " << args.mOutputFile << std::endl; - std::cout << "Writing output" << std::endl; - fileDef.GenerateAll(args.mOutputFile); + MaterialGenerator materialGenerator(settings); + + materialGenerator.TraverseScene(scene); + materialGenerator.GenerateDefinitions(scene, fileDef); + break; + } + case FileOutputType::CollisionMesh: + { + break; + } } - if (args.mMaterialOutput.length()) { - std::cout << "Saving materials to " << args.mMaterialOutput << std::endl; - - MaterialGenerator materialGenerator(settings); - - materialGenerator.TraverseScene(scene); - CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel); - materialGenerator.GenerateDefinitions(scene, fileDef); - - fileDef.GenerateAll(args.mMaterialOutput); - } + std::cout << "Writing output" << std::endl; + fileDef.GenerateAll(args.mOutputFile); return 0; } \ No newline at end of file diff --git a/skelatool64/src/CommandLineParser.cpp b/skelatool64/src/CommandLineParser.cpp index c6be85c..78d26f8 100644 --- a/skelatool64/src/CommandLineParser.cpp +++ b/skelatool64/src/CommandLineParser.cpp @@ -9,6 +9,10 @@ void parseEulerAngles(const std::string& input, aiVector3D& output) { output.z = (float)atof(input.substr(secondComma + 1).c_str()); } +bool needsInput(FileOutputType type) { + return type != FileOutputType::Materials; +} + bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArguments& output) { output.mInputFile = ""; output.mOutputFile = ""; @@ -17,8 +21,7 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen output.mCollisionScale = 1.0f; output.mExportAnimation = true; output.mExportGeometry = true; - output.mIsLevel = false; - output.mIsLevelDef = false; + output.mOutputType = FileOutputType::Mesh; output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f); output.mDefaultMaterial = "default"; @@ -50,9 +53,6 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen case 'm': output.mMaterialFiles.push_back(curr); break; - case 'M': - output.mMaterialOutput = curr; - break; case 'r': parseEulerAngles(curr, output.mEulerAngles); break; @@ -82,10 +82,8 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen strcmp(curr, "-m") == 0 || strcmp(curr, "--materials") == 0) { lastParameter = 'm'; - } else if ( - strcmp(curr, "-M") == 0 || - strcmp(curr, "--material-output") == 0) { - lastParameter = 'M'; + } else if (strcmp(curr, "--material-output") == 0) { + output.mOutputType = FileOutputType::Materials; } else if ( strcmp(curr, "-r") == 0 || strcmp(curr, "--rotate") == 0) { @@ -94,15 +92,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, "-l") == 0 || - strcmp(curr, "--level") == 0) { - output.mIsLevel = true; - output.mExportAnimation = false; - } else if ( - strcmp(curr, "-d") == 0 || - strcmp(curr, "--level-def") == 0) { - output.mIsLevelDef = true; + } else if (strcmp(curr, "--level") == 0) { + output.mOutputType = FileOutputType::Level; output.mExportAnimation = false; } else if ( strcmp(curr, "-D") == 0 || @@ -123,8 +114,13 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen } } - if ((output.mInputFile == "" || (output.mOutputFile == "" && !output.mIsLevelDef)) && output.mMaterialOutput == "") { - std::cerr << "Input and output file are both required" << std::endl; + if (output.mOutputFile == "") { + std::cerr << "No output file specified" << std::endl; + hasError = true; + } + + if (output.mInputFile == "" && needsInput(output.mOutputType)) { + std::cerr << "No input file specified" << std::endl; hasError = true; } diff --git a/skelatool64/src/CommandLineParser.h b/skelatool64/src/CommandLineParser.h index 068fe5f..41f65e6 100644 --- a/skelatool64/src/CommandLineParser.h +++ b/skelatool64/src/CommandLineParser.h @@ -7,10 +7,17 @@ #include #include +enum class FileOutputType { + Mesh, + Level, + Materials, + CollisionMesh, +}; + struct CommandLineArguments { std::string mInputFile; std::string mOutputFile; - std::string mMaterialOutput; + FileOutputType mOutputType; std::string mPrefix; std::vector mMaterialFiles; std::string mDefaultMaterial; @@ -18,8 +25,6 @@ struct CommandLineArguments { float mCollisionScale; bool mExportAnimation; bool mExportGeometry; - bool mIsLevel; - bool mIsLevelDef; aiVector3D mEulerAngles; }; diff --git a/skelatool64/src/definition_generator/CollisionGenerator.cpp b/skelatool64/src/definition_generator/CollisionGenerator.cpp index 85f716b..5e9b7a6 100644 --- a/skelatool64/src/definition_generator/CollisionGenerator.cpp +++ b/skelatool64/src/definition_generator/CollisionGenerator.cpp @@ -40,7 +40,7 @@ void CollisionGrid::AddToCells(const aiAABB& box, short value) { } } -std::shared_ptr generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput& roomOutput, NodeGroups& nodeGroups) { +std::shared_ptr generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput* roomOutput, NodeGroups& nodeGroups) { std::shared_ptr output(new CollisionGeneratorOutput()); std::unique_ptr collidersChunk(new StructureDataChunk()); @@ -57,13 +57,16 @@ std::shared_ptr generateCollision(const aiScene* scene std::vector nodes = nodeGroups.NodesForType("@collision"); - sortNodesWithArgsByRoom(nodes, roomOutput); std::vector roomBoxes; std::vector quadRooms; - for (int i = 0; i < roomOutput.roomCount; ++i) { - roomBoxes.push_back(aiAABB()); + if (roomOutput) { + sortNodesWithArgsByRoom(nodes, *roomOutput); + + for (int i = 0; i < roomOutput->roomCount; ++i) { + roomBoxes.push_back(aiAABB()); + } } for (auto nodeInfo : nodes) { @@ -99,31 +102,35 @@ std::shared_ptr generateCollision(const aiScene* scene output->quads.push_back(collider); - int room = roomOutput.RoomForNode(nodeInfo.node); - quadRooms.push_back(room); + if (roomOutput) { + int room = roomOutput->RoomForNode(nodeInfo.node); + quadRooms.push_back(room); - aiAABB bb = collider.BoundingBox(); - aiAABB& roomBox = roomBoxes[room]; - - if (roomBox.mMin == roomBox.mMax) { - roomBox = bb; - } else { - roomBox.mMin = min(roomBox.mMin, bb.mMin); - roomBox.mMax = max(roomBox.mMax, bb.mMax); + aiAABB bb = collider.BoundingBox(); + aiAABB& roomBox = roomBoxes[room]; + + if (roomBox.mMin == roomBox.mMax) { + roomBox = bb; + } else { + roomBox.mMin = min(roomBox.mMin, bb.mMin); + roomBox.mMax = max(roomBox.mMax, bb.mMax); + } } ++meshCount; } } - for (int i = 0; i < roomOutput.roomCount; ++i) { - output->roomGrids.push_back(CollisionGrid(roomBoxes[i])); - } + if (roomOutput) { + for (int i = 0; i < roomOutput->roomCount; ++i) { + output->roomGrids.push_back(CollisionGrid(roomBoxes[i])); + } - int quadIndex = 0; - for (auto& quad : output->quads) { - output->roomGrids[quadRooms[quadIndex]].AddToCells(quad.BoundingBox(), quadIndex); - quadIndex++; + int quadIndex = 0; + for (auto& quad : output->quads) { + output->roomGrids[quadRooms[quadIndex]].AddToCells(quad.BoundingBox(), quadIndex); + quadIndex++; + } } std::unique_ptr collisionFileDef(new DataFileDefinition( diff --git a/skelatool64/src/definition_generator/CollisionGenerator.h b/skelatool64/src/definition_generator/CollisionGenerator.h index f94cc77..e9d2281 100644 --- a/skelatool64/src/definition_generator/CollisionGenerator.h +++ b/skelatool64/src/definition_generator/CollisionGenerator.h @@ -27,6 +27,6 @@ struct CollisionGeneratorOutput { std::vector roomGrids; }; -std::shared_ptr generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput& roomOutput, NodeGroups& nodeGroups); +std::shared_ptr generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput* roomOutput, NodeGroups& nodeGroups); #endif \ No newline at end of file