diff --git a/src/rendering/m2_renderer_instance.cpp b/src/rendering/m2_renderer_instance.cpp index 0a31fbd5..f28f5d45 100644 --- a/src/rendering/m2_renderer_instance.cpp +++ b/src/rendering/m2_renderer_instance.cpp @@ -24,6 +24,14 @@ namespace wowee { namespace rendering { +// Thread-local scratch buffers for collision queries (moved from header to +// avoid inline thread_local TLS init linker errors on Windows ARM64 / LLD). +namespace m2_internal { +thread_local std::vector tl_m2_candidateScratch; +thread_local std::unordered_set tl_m2_candidateIdScratch; +thread_local std::vector tl_m2_collisionTriScratch; +} // namespace m2_internal + void M2Renderer::setInstancePosition(uint32_t instanceId, const glm::vec3& position) { auto idxIt = instanceIndexById.find(instanceId); if (idxIt == instanceIndexById.end()) return; diff --git a/src/rendering/m2_renderer_internal.h b/src/rendering/m2_renderer_internal.h index 6271fc26..9e69d745 100644 --- a/src/rendering/m2_renderer_internal.h +++ b/src/rendering/m2_renderer_internal.h @@ -231,9 +231,8 @@ inline glm::vec3 closestPointOnTriangle(const glm::vec3& p, } // ---- Thread-local scratch buffers for collision queries ---- -inline thread_local std::vector tl_m2_candidateScratch; -inline thread_local std::unordered_set tl_m2_candidateIdScratch; -inline thread_local std::vector tl_m2_collisionTriScratch; +// Defined in m2_renderer_instance.cpp (inline thread_local causes LLD linker +// errors on Windows ARM64, so the definitions live in the single TU that uses them). // ---- Bone animation helpers ----