From 1f97cb957e2e31feadb526d33d5acea2e3d8b598 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 6 May 2026 01:53:32 -0700 Subject: [PATCH] fix(editor): syncToTerrain converts world coords back to ADT placement coords ADT loading converts MDDF/MODF positions from ADT space to render/world space via core::coords::adtToWorld, but syncToTerrain wrote object positions back as raw render coords. So saving and reloading would displace every placed object/WMO, accumulating each save cycle. Now calls worldToAdt() to round-trip cleanly. --- tools/editor/object_placer.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/editor/object_placer.cpp b/tools/editor/object_placer.cpp index b7a25da5..ad4f2de7 100644 --- a/tools/editor/object_placer.cpp +++ b/tools/editor/object_placer.cpp @@ -1,5 +1,6 @@ #include "object_placer.hpp" #include "terrain_biomes.hpp" +#include "core/coordinates.hpp" #include "core/logger.hpp" #include #include @@ -346,12 +347,16 @@ void ObjectPlacer::syncToTerrain() { m2Names.push_back(obj.path); foundM2: + // Editor stores positions in render/world coords; ADT files use + // ADT-space placement coords. Convert back so re-loading the saved + // ADT yields identical world positions. + glm::vec3 adtPos = core::coords::worldToAdt(obj.position); pipeline::ADTTerrain::DoodadPlacement dp{}; dp.nameId = nameId; dp.uniqueId = obj.uniqueId; - dp.position[0] = obj.position.x; - dp.position[1] = obj.position.y; - dp.position[2] = obj.position.z; + dp.position[0] = adtPos.x; + dp.position[1] = adtPos.y; + dp.position[2] = adtPos.z; dp.rotation[0] = obj.rotation.x; dp.rotation[1] = obj.rotation.y; dp.rotation[2] = obj.rotation.z; @@ -368,12 +373,13 @@ void ObjectPlacer::syncToTerrain() { wmoNames.push_back(obj.path); foundWMO: + glm::vec3 adtPos = core::coords::worldToAdt(obj.position); pipeline::ADTTerrain::WMOPlacement wp{}; wp.nameId = nameId; wp.uniqueId = obj.uniqueId; - wp.position[0] = obj.position.x; - wp.position[1] = obj.position.y; - wp.position[2] = obj.position.z; + wp.position[0] = adtPos.x; + wp.position[1] = adtPos.y; + wp.position[2] = adtPos.z; wp.rotation[0] = obj.rotation.x; wp.rotation[1] = obj.rotation.y; wp.rotation[2] = obj.rotation.z;