mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -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)
|
||||
@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)
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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,13 +57,16 @@ 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) {
|
||||
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<CollisionGeneratorOutput> 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<FileDefinition> collisionFileDef(new DataFileDefinition(
|
||||
|
|
|
@ -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
|
Loading…
Reference in a new issue