mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Refactor skelatool to scale output types
This commit is contained in:
parent
1a0b6d1102
commit
abaa802e00
6
Makefile
6
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)
|
build/assets/materials/static.h build/assets/materials/static_mat.c: assets/materials/static.skm.yaml $(TEXTURE_IMAGES) $(SKELATOOL64)
|
||||||
@mkdir -p $(@D)
|
@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)
|
build/assets/materials/hud.h build/assets/materials/hud_mat.c: assets/materials/hud.skm.yaml $(TEXTURE_IMAGES) $(SKELATOOL64)
|
||||||
@mkdir -p $(@D)
|
@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
|
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 -- $@
|
$(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)
|
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
|
build/assets/test_chambers/%.o: build/assets/test_chambers/%.c build/assets/materials/static.h
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
|
|
|
@ -127,26 +127,28 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
if (args.mInputFile.length()) {
|
if (args.mInputFile.length()) {
|
||||||
std::cout << "Generating from mesh " << args.mInputFile << std::endl;
|
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) {
|
if (!scene) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scene && args.mOutputFile.length()) {
|
std::cout << "Saving to " << args.mOutputFile << std::endl;
|
||||||
std::cout << "Saving to " << args.mOutputFile << std::endl;
|
CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel);
|
||||||
// generateMeshFromSceneToFile(scene, args.mOutputFile, settings);
|
|
||||||
|
|
||||||
MeshDefinitionGenerator meshGenerator(settings);
|
switch (args.mOutputType)
|
||||||
|
{
|
||||||
std::cout << "Generating mesh definitions" << std::endl;
|
case FileOutputType::Mesh:
|
||||||
meshGenerator.TraverseScene(scene);
|
{
|
||||||
CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel);
|
MeshDefinitionGenerator meshGenerator(settings);
|
||||||
meshGenerator.GenerateDefinitions(scene, fileDef);
|
std::cout << "Generating mesh definitions" << std::endl;
|
||||||
|
meshGenerator.TraverseScene(scene);
|
||||||
|
meshGenerator.GenerateDefinitions(scene, fileDef);
|
||||||
if (args.mIsLevel) {
|
break;
|
||||||
|
}
|
||||||
|
case FileOutputType::Level:
|
||||||
|
{
|
||||||
NodeGroups nodesByGroup(scene);
|
NodeGroups nodesByGroup(scene);
|
||||||
Signals signals;
|
Signals signals;
|
||||||
|
|
||||||
|
@ -154,7 +156,7 @@ int main(int argc, char *argv[]) {
|
||||||
auto roomOutput = generateRooms(scene, fileDef, settings, signals, nodesByGroup);
|
auto roomOutput = generateRooms(scene, fileDef, settings, signals, nodesByGroup);
|
||||||
|
|
||||||
std::cout << "Generating collider definitions" << std::endl;
|
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;
|
std::cout << "Generating static definitions" << std::endl;
|
||||||
auto staticOutput = generateStatic(scene, fileDef, settings, *roomOutput, nodesByGroup);
|
auto staticOutput = generateStatic(scene, fileDef, settings, *roomOutput, nodesByGroup);
|
||||||
|
@ -178,23 +180,26 @@ int main(int argc, char *argv[]) {
|
||||||
);
|
);
|
||||||
|
|
||||||
nodesByGroup.PrintUnusedTypes();
|
nodesByGroup.PrintUnusedTypes();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case FileOutputType::Materials:
|
||||||
|
{
|
||||||
|
std::cout << "Saving materials to " << args.mOutputFile << std::endl;
|
||||||
|
|
||||||
std::cout << "Writing output" << std::endl;
|
MaterialGenerator materialGenerator(settings);
|
||||||
fileDef.GenerateAll(args.mOutputFile);
|
|
||||||
|
materialGenerator.TraverseScene(scene);
|
||||||
|
materialGenerator.GenerateDefinitions(scene, fileDef);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FileOutputType::CollisionMesh:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.mMaterialOutput.length()) {
|
std::cout << "Writing output" << std::endl;
|
||||||
std::cout << "Saving materials to " << args.mMaterialOutput << std::endl;
|
fileDef.GenerateAll(args.mOutputFile);
|
||||||
|
|
||||||
MaterialGenerator materialGenerator(settings);
|
|
||||||
|
|
||||||
materialGenerator.TraverseScene(scene);
|
|
||||||
CFileDefinition fileDef(settings.mPrefix, settings.mGraphicsScale, settings.mRotateModel);
|
|
||||||
materialGenerator.GenerateDefinitions(scene, fileDef);
|
|
||||||
|
|
||||||
fileDef.GenerateAll(args.mMaterialOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -9,6 +9,10 @@ void parseEulerAngles(const std::string& input, aiVector3D& output) {
|
||||||
output.z = (float)atof(input.substr(secondComma + 1).c_str());
|
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) {
|
bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArguments& output) {
|
||||||
output.mInputFile = "";
|
output.mInputFile = "";
|
||||||
output.mOutputFile = "";
|
output.mOutputFile = "";
|
||||||
|
@ -17,8 +21,7 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
||||||
output.mCollisionScale = 1.0f;
|
output.mCollisionScale = 1.0f;
|
||||||
output.mExportAnimation = true;
|
output.mExportAnimation = true;
|
||||||
output.mExportGeometry = true;
|
output.mExportGeometry = true;
|
||||||
output.mIsLevel = false;
|
output.mOutputType = FileOutputType::Mesh;
|
||||||
output.mIsLevelDef = false;
|
|
||||||
output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f);
|
output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f);
|
||||||
output.mDefaultMaterial = "default";
|
output.mDefaultMaterial = "default";
|
||||||
|
|
||||||
|
@ -50,9 +53,6 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
||||||
case 'm':
|
case 'm':
|
||||||
output.mMaterialFiles.push_back(curr);
|
output.mMaterialFiles.push_back(curr);
|
||||||
break;
|
break;
|
||||||
case 'M':
|
|
||||||
output.mMaterialOutput = curr;
|
|
||||||
break;
|
|
||||||
case 'r':
|
case 'r':
|
||||||
parseEulerAngles(curr, output.mEulerAngles);
|
parseEulerAngles(curr, output.mEulerAngles);
|
||||||
break;
|
break;
|
||||||
|
@ -82,10 +82,8 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
|
||||||
strcmp(curr, "-m") == 0 ||
|
strcmp(curr, "-m") == 0 ||
|
||||||
strcmp(curr, "--materials") == 0) {
|
strcmp(curr, "--materials") == 0) {
|
||||||
lastParameter = 'm';
|
lastParameter = 'm';
|
||||||
} else if (
|
} else if (strcmp(curr, "--material-output") == 0) {
|
||||||
strcmp(curr, "-M") == 0 ||
|
output.mOutputType = FileOutputType::Materials;
|
||||||
strcmp(curr, "--material-output") == 0) {
|
|
||||||
lastParameter = 'M';
|
|
||||||
} else if (
|
} else if (
|
||||||
strcmp(curr, "-r") == 0 ||
|
strcmp(curr, "-r") == 0 ||
|
||||||
strcmp(curr, "--rotate") == 0) {
|
strcmp(curr, "--rotate") == 0) {
|
||||||
|
@ -94,15 +92,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 (
|
} else if (strcmp(curr, "--level") == 0) {
|
||||||
strcmp(curr, "-l") == 0 ||
|
output.mOutputType = FileOutputType::Level;
|
||||||
strcmp(curr, "--level") == 0) {
|
|
||||||
output.mIsLevel = true;
|
|
||||||
output.mExportAnimation = false;
|
|
||||||
} else if (
|
|
||||||
strcmp(curr, "-d") == 0 ||
|
|
||||||
strcmp(curr, "--level-def") == 0) {
|
|
||||||
output.mIsLevelDef = true;
|
|
||||||
output.mExportAnimation = false;
|
output.mExportAnimation = false;
|
||||||
} else if (
|
} else if (
|
||||||
strcmp(curr, "-D") == 0 ||
|
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 == "") {
|
if (output.mOutputFile == "") {
|
||||||
std::cerr << "Input and output file are both required" << std::endl;
|
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;
|
hasError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,17 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
enum class FileOutputType {
|
||||||
|
Mesh,
|
||||||
|
Level,
|
||||||
|
Materials,
|
||||||
|
CollisionMesh,
|
||||||
|
};
|
||||||
|
|
||||||
struct CommandLineArguments {
|
struct CommandLineArguments {
|
||||||
std::string mInputFile;
|
std::string mInputFile;
|
||||||
std::string mOutputFile;
|
std::string mOutputFile;
|
||||||
std::string mMaterialOutput;
|
FileOutputType mOutputType;
|
||||||
std::string mPrefix;
|
std::string mPrefix;
|
||||||
std::vector<std::string> mMaterialFiles;
|
std::vector<std::string> mMaterialFiles;
|
||||||
std::string mDefaultMaterial;
|
std::string mDefaultMaterial;
|
||||||
|
@ -18,8 +25,6 @@ struct CommandLineArguments {
|
||||||
float mCollisionScale;
|
float mCollisionScale;
|
||||||
bool mExportAnimation;
|
bool mExportAnimation;
|
||||||
bool mExportGeometry;
|
bool mExportGeometry;
|
||||||
bool mIsLevel;
|
|
||||||
bool mIsLevelDef;
|
|
||||||
aiVector3D mEulerAngles;
|
aiVector3D mEulerAngles;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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::shared_ptr<CollisionGeneratorOutput> output(new CollisionGeneratorOutput());
|
||||||
|
|
||||||
std::unique_ptr<StructureDataChunk> collidersChunk(new StructureDataChunk());
|
std::unique_ptr<StructureDataChunk> collidersChunk(new StructureDataChunk());
|
||||||
|
@ -57,13 +57,16 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
|
||||||
|
|
||||||
std::vector<NodeWithArguments> nodes = nodeGroups.NodesForType("@collision");
|
std::vector<NodeWithArguments> nodes = nodeGroups.NodesForType("@collision");
|
||||||
|
|
||||||
sortNodesWithArgsByRoom(nodes, roomOutput);
|
|
||||||
|
|
||||||
std::vector<aiAABB> roomBoxes;
|
std::vector<aiAABB> roomBoxes;
|
||||||
std::vector<int> quadRooms;
|
std::vector<int> quadRooms;
|
||||||
|
|
||||||
for (int i = 0; i < roomOutput.roomCount; ++i) {
|
if (roomOutput) {
|
||||||
roomBoxes.push_back(aiAABB());
|
sortNodesWithArgsByRoom(nodes, *roomOutput);
|
||||||
|
|
||||||
|
for (int i = 0; i < roomOutput->roomCount; ++i) {
|
||||||
|
roomBoxes.push_back(aiAABB());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto nodeInfo : nodes) {
|
for (auto nodeInfo : nodes) {
|
||||||
|
@ -99,31 +102,35 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
|
||||||
|
|
||||||
output->quads.push_back(collider);
|
output->quads.push_back(collider);
|
||||||
|
|
||||||
int room = roomOutput.RoomForNode(nodeInfo.node);
|
if (roomOutput) {
|
||||||
quadRooms.push_back(room);
|
int room = roomOutput->RoomForNode(nodeInfo.node);
|
||||||
|
quadRooms.push_back(room);
|
||||||
|
|
||||||
aiAABB bb = collider.BoundingBox();
|
aiAABB bb = collider.BoundingBox();
|
||||||
aiAABB& roomBox = roomBoxes[room];
|
aiAABB& roomBox = roomBoxes[room];
|
||||||
|
|
||||||
if (roomBox.mMin == roomBox.mMax) {
|
if (roomBox.mMin == roomBox.mMax) {
|
||||||
roomBox = bb;
|
roomBox = bb;
|
||||||
} else {
|
} else {
|
||||||
roomBox.mMin = min(roomBox.mMin, bb.mMin);
|
roomBox.mMin = min(roomBox.mMin, bb.mMin);
|
||||||
roomBox.mMax = max(roomBox.mMax, bb.mMax);
|
roomBox.mMax = max(roomBox.mMax, bb.mMax);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
++meshCount;
|
++meshCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < roomOutput.roomCount; ++i) {
|
if (roomOutput) {
|
||||||
output->roomGrids.push_back(CollisionGrid(roomBoxes[i]));
|
for (int i = 0; i < roomOutput->roomCount; ++i) {
|
||||||
}
|
output->roomGrids.push_back(CollisionGrid(roomBoxes[i]));
|
||||||
|
}
|
||||||
|
|
||||||
int quadIndex = 0;
|
int quadIndex = 0;
|
||||||
for (auto& quad : output->quads) {
|
for (auto& quad : output->quads) {
|
||||||
output->roomGrids[quadRooms[quadIndex]].AddToCells(quad.BoundingBox(), quadIndex);
|
output->roomGrids[quadRooms[quadIndex]].AddToCells(quad.BoundingBox(), quadIndex);
|
||||||
quadIndex++;
|
quadIndex++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<FileDefinition> collisionFileDef(new DataFileDefinition(
|
std::unique_ptr<FileDefinition> collisionFileDef(new DataFileDefinition(
|
||||||
|
|
|
@ -27,6 +27,6 @@ struct CollisionGeneratorOutput {
|
||||||
std::vector<CollisionGrid> roomGrids;
|
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
|
#endif
|
Loading…
Reference in a new issue