mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
Final version of skelatool for styx
This commit is contained in:
parent
768bfe4909
commit
6ca5cb7908
|
@ -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 = {}
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -473,6 +473,9 @@
|
|||
},
|
||||
"usePallete": {
|
||||
"type": "string"
|
||||
},
|
||||
"bypassEffects": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
@ -709,6 +712,9 @@
|
|||
},
|
||||
"excludeFromOutput": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"sortOrder": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -31,6 +31,7 @@ struct CommandLineArguments {
|
|||
bool mExportGeometry;
|
||||
bool mBonesAsVertexGroups;
|
||||
bool mTargetCIBuffer;
|
||||
bool mProcessAsModel;
|
||||
aiVector3D mEulerAngles;
|
||||
};
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue