diff --git a/Makefile b/Makefile index e99f279..1101e37 100644 --- a/Makefile +++ b/Makefile @@ -220,7 +220,8 @@ build/anims.ld: $(ANIM_LIST) tools/generate_animation_ld.js TEST_CHAMBERS = assets/test_chambers/test_chamber_00/test_chamber_00.blend \ assets/test_chambers/test_chamber_01/test_chamber_01.blend \ - assets/test_chambers/test_chamber_02/test_chamber_02.blend + assets/test_chambers/test_chamber_02/test_chamber_02.blend \ + assets/test_chambers/test_chamber_03/test_chamber_03.blend TEST_CHAMBER_HEADERS = $(TEST_CHAMBERS:%.blend=build/%.h) TEST_CHAMBER_OBJECTS = $(TEST_CHAMBERS:%.blend=build/%_geo.o) diff --git a/assets/test_chambers/test_chamber_01/test_chamber_01.blend b/assets/test_chambers/test_chamber_01/test_chamber_01.blend index c54b145..a91b7cb 100644 Binary files a/assets/test_chambers/test_chamber_01/test_chamber_01.blend and b/assets/test_chambers/test_chamber_01/test_chamber_01.blend differ diff --git a/assets/test_chambers/test_chamber_03/test_chamber_03.blend b/assets/test_chambers/test_chamber_03/test_chamber_03.blend index 6dd4b10..7e1d7af 100644 Binary files a/assets/test_chambers/test_chamber_03/test_chamber_03.blend and b/assets/test_chambers/test_chamber_03/test_chamber_03.blend differ diff --git a/skelatool64/src/definition_generator/MeshDefinitionGenerator.cpp b/skelatool64/src/definition_generator/MeshDefinitionGenerator.cpp index 9dad9ab..1066862 100644 --- a/skelatool64/src/definition_generator/MeshDefinitionGenerator.cpp +++ b/skelatool64/src/definition_generator/MeshDefinitionGenerator.cpp @@ -34,6 +34,31 @@ bool MeshDefinitionGenerator::ShouldIncludeNode(aiNode* node) { return node->mName.C_Str()[0] != '@' && node->mNumMeshes > 0; } +double extractStaticUVScale(const std::string& nodeName) { + std::size_t uvScaleAt = nodeName.find(" uvscale "); + + if (uvScaleAt == std::string::npos) { + return 1.0; + } + + std::size_t endUvScaleAt = uvScaleAt + strlen(" uvscale "); + std::size_t spacePos = nodeName.find(" ", endUvScaleAt); + + if (spacePos == std::string::npos) { + spacePos = nodeName.size(); + } + + std::string scale = nodeName.substr(endUvScaleAt, spacePos - endUvScaleAt); + + double result = atof(scale.c_str()); + + if (result == 0.0) { + return 1.0f; + } + + return result; +} + void MeshDefinitionGenerator::AppendRenderChunks(const aiScene* scene, aiNode* node, CFileDefinition& fileDefinition, const DisplayListSettings& settings, std::vector& renderChunks) { for (unsigned meshIndex = 0; meshIndex < node->mNumMeshes; ++meshIndex) { std::shared_ptr mesh = fileDefinition.GetExtendedMesh(scene->mMeshes[node->mMeshes[meshIndex]]); @@ -56,9 +81,10 @@ void MeshDefinitionGenerator::AppendRenderChunks(const aiScene* scene, aiNode* n double tTile; if (extractMaterialAutoTileParameters(materialPtr, sTile, tTile)) { + double uvScale = extractStaticUVScale(node->mName.C_Str()); mesh->CubeProjectTex( - settings.mModelScale / (double)sTile, - settings.mModelScale / (double)tTile + uvScale * settings.mModelScale / (double)sTile, + uvScale * settings.mModelScale / (double)tTile ); } diff --git a/src/main.c b/src/main.c index ecd484c..c2b9f99 100644 --- a/src/main.c +++ b/src/main.c @@ -155,7 +155,7 @@ static void gameProc(void* arg) { dynamicSceneInit(); contactSolverInit(&gContactSolver); portalSurfaceCleanupQueueInit(); - levelLoad(0); + levelLoad(3); cutsceneRunnerReset(); controllersInit(); initAudio();