Refactor skelatool to scale output types

This commit is contained in:
James Lambert 2022-06-19 21:40:29 -06:00
parent 1a0b6d1102
commit abaa802e00
6 changed files with 88 additions and 75 deletions

View file

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

View file

@ -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);
CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel);
switch (args.mOutputType)
{
case FileOutputType::Mesh:
{
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) {
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;
}
std::cout << "Writing output" << std::endl;
fileDef.GenerateAll(args.mOutputFile);
}
if (args.mMaterialOutput.length()) {
std::cout << "Saving materials to " << args.mMaterialOutput << std::endl;
case FileOutputType::Materials:
{
std::cout << "Saving materials to " << args.mOutputFile << std::endl;
MaterialGenerator materialGenerator(settings);
materialGenerator.TraverseScene(scene);
CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel);
materialGenerator.GenerateDefinitions(scene, fileDef);
fileDef.GenerateAll(args.mMaterialOutput);
break;
}
case FileOutputType::CollisionMesh:
{
break;
}
}
std::cout << "Writing output" << std::endl;
fileDef.GenerateAll(args.mOutputFile);
return 0;
}

View file

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

View file

@ -7,10 +7,17 @@
#include <string.h>
#include <iostream>
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<std::string> mMaterialFiles;
std::string mDefaultMaterial;
@ -18,8 +25,6 @@ struct CommandLineArguments {
float mCollisionScale;
bool mExportAnimation;
bool mExportGeometry;
bool mIsLevel;
bool mIsLevelDef;
aiVector3D mEulerAngles;
};

View file

@ -40,7 +40,7 @@ void CollisionGrid::AddToCells(const aiAABB& box, short value) {
}
}
std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput& roomOutput, NodeGroups& nodeGroups) {
std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput* roomOutput, NodeGroups& nodeGroups) {
std::shared_ptr<CollisionGeneratorOutput> output(new CollisionGeneratorOutput());
std::unique_ptr<StructureDataChunk> collidersChunk(new StructureDataChunk());
@ -57,14 +57,17 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
std::vector<NodeWithArguments> nodes = nodeGroups.NodesForType("@collision");
sortNodesWithArgsByRoom(nodes, roomOutput);
std::vector<aiAABB> roomBoxes;
std::vector<int> quadRooms;
for (int i = 0; i < roomOutput.roomCount; ++i) {
if (roomOutput) {
sortNodesWithArgsByRoom(nodes, *roomOutput);
for (int i = 0; i < roomOutput->roomCount; ++i) {
roomBoxes.push_back(aiAABB());
}
}
for (auto nodeInfo : nodes) {
if (std::string(nodeInfo.node->mName.C_Str()) == "@collision quad_Wall.023") {
@ -99,7 +102,8 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
output->quads.push_back(collider);
int room = roomOutput.RoomForNode(nodeInfo.node);
if (roomOutput) {
int room = roomOutput->RoomForNode(nodeInfo.node);
quadRooms.push_back(room);
aiAABB bb = collider.BoundingBox();
@ -111,12 +115,14 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
roomBox.mMin = min(roomBox.mMin, bb.mMin);
roomBox.mMax = max(roomBox.mMax, bb.mMax);
}
}
++meshCount;
}
}
for (int i = 0; i < roomOutput.roomCount; ++i) {
if (roomOutput) {
for (int i = 0; i < roomOutput->roomCount; ++i) {
output->roomGrids.push_back(CollisionGrid(roomBoxes[i]));
}
@ -125,6 +131,7 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
output->roomGrids[quadRooms[quadIndex]].AddToCells(quad.BoundingBox(), quadIndex);
quadIndex++;
}
}
std::unique_ptr<FileDefinition> collisionFileDef(new DataFileDefinition(
"struct CollisionQuad",

View file

@ -27,6 +27,6 @@ struct CollisionGeneratorOutput {
std::vector<CollisionGrid> roomGrids;
};
std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput& roomOutput, NodeGroups& nodeGroups);
std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, RoomGeneratorOutput* roomOutput, NodeGroups& nodeGroups);
#endif