Final version of skelatool for styx

This commit is contained in:
James Lambert 2022-11-09 18:56:42 -07:00
parent 768bfe4909
commit 6ca5cb7908
17 changed files with 77 additions and 38 deletions

View file

@ -3,8 +3,8 @@ local pending_definitions = {}
local RefType = {}
function reference_to(value)
return setmetatable({ value = value }, RefType)
function reference_to(value, index)
return setmetatable({ value = value, index = index }, RefType)
end
function is_reference_type(value)
@ -148,13 +148,17 @@ local function replace_references(object, name_mapping, name_path)
return null_value
end
local referenceName = name_mapping[object.value]
local reference_name = name_mapping[object.value]
if (referenceName == nil) then
if (reference_name == nil) then
error("A reference '" .. name_path .. "' was used on an object not exported in a definition")
end
return raw("&" .. referenceName)
if object.index then
reference_name = reference_name .. '[' .. (object.index - 1) .. ']'
end
return raw("&" .. reference_name)
end
local changes = {}

View file

@ -17,18 +17,3 @@ function node_with_name(name)
return node_name_cache[name]
end
function export_default_mesh()
local allNodes = {}
for k, value in pairs(nodes_for_type("")) do
local renderChunks = generate_render_chunks(value.node)
for _, toAdd in pairs(renderChunks) do
table.insert(allNodes, toAdd)
end
end
generate_mesh(allNodes, "_geo")
end

View file

@ -154,7 +154,7 @@ int main(int argc, char *argv[]) {
if (args.mInputFile.length()) {
std::cout << "Generating from mesh " << args.mInputFile << std::endl;
scene = loadScene(args.mInputFile, args.mOutputType != FileOutputType::Mesh, settings.mVertexCacheSize, additionalPFlags);
scene = loadScene(args.mInputFile, args.mProcessAsModel || args.mOutputType != FileOutputType::Mesh, settings.mVertexCacheSize, additionalPFlags);
if (!scene) {
return 1;
@ -173,6 +173,7 @@ int main(int argc, char *argv[]) {
MeshDefinitionGenerator meshGenerator(settings);
std::cout << "Generating mesh definitions" << std::endl;
meshGenerator.TraverseScene(scene);
meshGenerator.PopulateBones(scene, fileDef);
meshGenerator.GenerateDefinitions(scene, fileDef);
break;
}
@ -232,9 +233,10 @@ int main(int argc, char *argv[]) {
case FileOutputType::Script:
{
NodeGroups nodesByGroup(scene);
for (auto script : args.mScriptFiles) {
std::cout << "Generating definitions from script " << script << std::endl;
generateFromLuaScript(script, scene, fileDef, nodesByGroup, settings);
generateFromLuaScript(args.mInputFile, script, scene, fileDef, nodesByGroup, settings);
}
break;
}

View file

@ -473,6 +473,9 @@
},
"usePallete": {
"type": "string"
},
"bypassEffects": {
"type": "boolean"
}
},
"required": [
@ -709,6 +712,9 @@
},
"excludeFromOutput": {
"type": "boolean"
},
"sortOrder": {
"type": "integer"
}
}
}

View file

@ -27,6 +27,7 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
output.mEulerAngles = aiVector3D(0.0f, 0.0f, 0.0f);
output.mDefaultMaterial = "default";
output.mForceMaterialName = "";
output.mProcessAsModel = false;
std::string lastParameter = "";
bool hasError = false;
@ -108,6 +109,8 @@ bool parseCommandLineArguments(int argc, char *argv[], struct CommandLineArgumen
lastParameter = "script";
} else if (strcmp(curr, "--ci-buffer") == 0) {
output.mTargetCIBuffer = true;
} else if (strcmp(curr, "--model") == 0) {
output.mProcessAsModel = true;
} else {
if (curr[0] == '-') {
hasError = true;

View file

@ -31,6 +31,7 @@ struct CommandLineArguments {
bool mExportGeometry;
bool mBonesAsVertexGroups;
bool mTargetCIBuffer;
bool mProcessAsModel;
aiVector3D mEulerAngles;
};

View file

@ -77,7 +77,14 @@ void MaterialGenerator::GenerateDefinitions(const aiScene* scene, CFileDefinitio
}
std::sort(materialsAsVector.begin(), materialsAsVector.end(), [&](const std::shared_ptr<Material>& a, const std::shared_ptr<Material>& b) -> bool {
return sortOrderForMaterial(*a) < sortOrderForMaterial(*b);
int aOrder = sortOrderForMaterial(*a);
int bOrder = sortOrderForMaterial(*b);
if (aOrder != bOrder) {
return aOrder < bOrder;
}
return a->mSortOrder < b->mSortOrder;
});
for (auto& entry : materialsAsVector) {

View file

@ -93,6 +93,14 @@ void MeshDefinitionGenerator::AppendRenderChunks(const aiScene* scene, aiNode* n
fileDefinition.AddMacro(fileDefinition.GetMacroName("ATTACHMENT_COUNT"), std::to_string(attachmentCount));
}
void MeshDefinitionGenerator::PopulateBones(const aiScene* scene, CFileDefinition& fileDefinition) {
auto animInfo = findNodesForWithAnimation(scene, mIncludedNodes, mSettings.mModelScale);
if (!mSettings.mBonesAsVertexGroups) {
fileDefinition.GetBoneHierarchy().PopulateWithAnimationNodeInfo(*animInfo, mSettings.mFixedPointScale, mSettings.mRotateModel);
}
}
void MeshDefinitionGenerator::GenerateDefinitions(const aiScene* scene, CFileDefinition& fileDefinition) {
GenerateDefinitionsWithResults(scene, fileDefinition);
}
@ -100,12 +108,6 @@ void MeshDefinitionGenerator::GenerateDefinitions(const aiScene* scene, CFileDef
MeshDefinitionResults MeshDefinitionGenerator::GenerateDefinitionsWithResults(const aiScene* scene, CFileDefinition& fileDefinition) {
std::vector<RenderChunk> renderChunks;
auto animInfo = findNodesForWithAnimation(scene, mIncludedNodes, mSettings.mModelScale);
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);
}

View file

@ -17,6 +17,9 @@ public:
virtual bool ShouldIncludeNode(aiNode* node);
virtual void GenerateDefinitions(const aiScene* scene, CFileDefinition& fileDefinition);
void PopulateBones(const aiScene* scene, CFileDefinition& fileDefinition);
MeshDefinitionResults GenerateDefinitionsWithResults(const aiScene* scene, CFileDefinition& fileDefinition);
static void AppendRenderChunks(const aiScene* scene, aiNode* node, CFileDefinition& fileDefinition, const DisplayListSettings& settings, std::vector<RenderChunk>& renderChunks);

View file

@ -7,6 +7,7 @@
#include "LuaScene.h"
#include "LuaMesh.h"
#include "LuaDisplayListSettings.h"
#include "LuaBasicTypes.h"
#include <lua.hpp>
#include <iostream>
@ -44,6 +45,7 @@ bool checkLuaError(lua_State *L, int errCode, const char* filename) {
}
void generateFromLuaScript(
const std::string& levelFilename,
const std::string& filename,
const aiScene* scene,
CFileDefinition& fileDefinition,
@ -85,6 +87,9 @@ void generateFromLuaScript(
lua_concat(L, 2);
lua_setfield(L, packageLocation, "path");
toLua(L, levelFilename);
lua_setglobal(L, "input_filename");
int errCode = luaL_dofile(L, filename.c_str());
if (checkLuaError(L, errCode, filename.c_str())) {
lua_close(L);

View file

@ -10,6 +10,7 @@
bool checkLuaError(lua_State *L, int errCode, const char* filename);
void generateFromLuaScript(
const std::string& levelFilename,
const std::string& filename,
const aiScene* scene,
CFileDefinition& fileDefinition,

View file

@ -106,7 +106,12 @@ void fromLua(lua_State* L, Material *& material) {
}
void toLua(lua_State* L, const aiFace& face) {
toLua(L, face.mIndices, face.mNumIndices);
lua_createtable(L, face.mNumIndices, 0);
for (unsigned i = 0; i < face.mNumIndices; ++i) {
toLua(L, face.mIndices[i] + 1);
lua_seti(L, -2, i + 1);
}
}
int luaTransformMesh(lua_State* L) {
@ -133,6 +138,9 @@ void meshToLua(lua_State* L, std::shared_ptr<ExtendedMesh> mesh) {
toLua(L, mesh);
lua_setfield(L, -2, "ptr");
toLua(L, mesh->mMesh->mName.C_Str());
lua_setfield(L, -2, "name");
toLua(L, mesh->bbMin);
lua_setfield(L, -2, "bbMin");

View file

@ -174,12 +174,10 @@ Generates mesh and animation data from the current scene
int luaExportDefaultMesh(lua_State* L) {
const aiScene* scene = (const aiScene*)lua_touserdata(L, lua_upvalueindex(1));
CFileDefinition* fileDefinition = (CFileDefinition*)lua_touserdata(L, lua_upvalueindex(2));
DisplayListSettings* settings = (DisplayListSettings*)lua_touserdata(L, lua_upvalueindex(3));
std::shared_ptr<MeshDefinitionGenerator>* meshGenerator = (std::shared_ptr<MeshDefinitionGenerator>*)lua_touserdata(L, lua_upvalueindex(3));
MeshDefinitionGenerator meshGenerator(*settings);
std::cout << "Generating mesh definitions" << std::endl;
meshGenerator.TraverseScene(scene);
MeshDefinitionResults results = meshGenerator.GenerateDefinitionsWithResults(scene, *fileDefinition);
MeshDefinitionResults results = (*meshGenerator)->GenerateDefinitionsWithResults(scene, *fileDefinition);
lua_createtable(L, 0, 2);
@ -202,6 +200,11 @@ void populateLuaScene(lua_State* L, const aiScene* scene, CFileDefinition& fileD
gLuaCurrentFileDefinition = &fileDefinition;
gLuaCurrentSettings = &settings;
std::shared_ptr<MeshDefinitionGenerator> meshGenerator(new MeshDefinitionGenerator(settings));
meshGenerator->TraverseScene(scene);
meshGenerator->PopulateBones(scene, fileDefinition);
lua_newtable(L);
lua_setglobal(L, "node_cache");
@ -210,7 +213,7 @@ void populateLuaScene(lua_State* L, const aiScene* scene, CFileDefinition& fileD
lua_pushlightuserdata(L, const_cast<aiScene*>(scene));
lua_pushlightuserdata(L, &fileDefinition);
lua_pushlightuserdata(L, const_cast<DisplayListSettings*>(&settings));
toLua(L, meshGenerator);
lua_pushcclosure(L, luaExportDefaultMesh, 3);
lua_setglobal(L, "export_default_mesh");
}

View file

@ -4,7 +4,7 @@
#include "../StringUtils.h"
#include "../CFileDefinition.h"
Material::Material(const std::string& name): mName(name), mNormalSource(NormalSource::Normal), mExcludeFromOutut(false) {}
Material::Material(const std::string& name): mName(name), mNormalSource(NormalSource::Normal), mExcludeFromOutut(false), mSortOrder(0) {}
void Material::Write(CFileDefinition& fileDef, const MaterialState& from, StructureDataChunk& output, bool targetCIBuffer) {
generateMaterial(fileDef, from, mState, output, targetCIBuffer);

View file

@ -32,6 +32,7 @@ public:
std::map<std::string, std::string> mProperties;
NormalSource mNormalSource;
bool mExcludeFromOutut;
int mSortOrder;
void Write(CFileDefinition& fileDef, const MaterialState& from, StructureDataChunk& output, bool targetCIBuffer);

View file

@ -309,6 +309,12 @@ std::shared_ptr<TextureDefinition> parseTextureDefinition(const YAML::Node& node
output.mErrors.push_back(ParseError(formatError(std::string("usePallete should be a file path to a pallete") + filename, usePallete.Mark())));
}
}
auto bypassEffects = node["bypassEffects"];
if (bypassEffects.IsDefined() && bypassEffects.as<bool>()) {
palleteFilename = "";
}
} else {
output.mErrors.push_back(ParseError(formatError(std::string("Tile should be a file name or object") + filename, node.Mark())));
return NULL;
@ -791,6 +797,8 @@ std::shared_ptr<Material> parseMaterial(const std::string& name, const YAML::Nod
}
}
material->mSortOrder = parseOptionalInteger(node["sortOrder"], output, std::numeric_limits<int>::min(), std::numeric_limits<int>::max(), 0);
return material;
}

View file

@ -62,14 +62,14 @@ bool renderModeGetFlagValue(const std::string& name, int& output) {
it = gCVG_DST_VALUES.find(name);
if (it != gRenderModeFlags.end()) {
if (it != gCVG_DST_VALUES.end()) {
output = it->second;
return true;
}
it = gZMODE_VALUES.find(name);
if (it != gRenderModeFlags.end()) {
if (it != gZMODE_VALUES.end()) {
output = it->second;
return true;
}