From b8e2d08b173a6e528cf17365d16cf00b848493bc Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 6 May 2026 07:07:21 -0700 Subject: [PATCH] fix(wob): scrub NaN/inf doodad transforms at save time Same scrub now applied symmetrically on the save side so a corrupted in-memory doodad transform can't be persisted into a WOB and then have to be cleaned up on every subsequent load. --- src/pipeline/wowee_building.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pipeline/wowee_building.cpp b/src/pipeline/wowee_building.cpp index b85a4ec2..5554f7f1 100644 --- a/src/pipeline/wowee_building.cpp +++ b/src/pipeline/wowee_building.cpp @@ -267,9 +267,15 @@ bool WoweeBuildingLoader::save(const WoweeBuilding& bld, const std::string& base for (const auto& dp : bld.doodads) { writeStr(dp.modelPath); - f.write(reinterpret_cast(&dp.position), 12); - f.write(reinterpret_cast(&dp.rotation), 12); - f.write(reinterpret_cast(&dp.scale), 4); + glm::vec3 pos = dp.position, rot = dp.rotation; + for (int k = 0; k < 3; k++) { + if (!std::isfinite(pos[k])) pos[k] = 0.0f; + if (!std::isfinite(rot[k])) rot[k] = 0.0f; + } + float scale = (std::isfinite(dp.scale) && dp.scale > 0.0001f) ? dp.scale : 1.0f; + f.write(reinterpret_cast(&pos), 12); + f.write(reinterpret_cast(&rot), 12); + f.write(reinterpret_cast(&scale), 4); } LOG_INFO("WOB saved: ", basePath, ".wob (", gc, " groups)");