From e0e8e316d45432db25e4f7393417630b6aa88b29 Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Sun, 26 Apr 2026 00:50:55 +0300 Subject: [PATCH] Fixed navmesh --- src/features/editScene/recast/TileCacheNavMesh.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/features/editScene/recast/TileCacheNavMesh.cpp b/src/features/editScene/recast/TileCacheNavMesh.cpp index 9e69df4..9c9d4b3 100644 --- a/src/features/editScene/recast/TileCacheNavMesh.cpp +++ b/src/features/editScene/recast/TileCacheNavMesh.cpp @@ -164,6 +164,11 @@ static void extractEntityMesh(Ogre::Entity *ent, std::vector &verts, size_t currentOffset = 0; size_t nextOffset = 0; + // Global offset of this entity's vertices in the output arrays. + // Indices read from the mesh are relative to submesh/shared vertex + // data; we must shift them so they point into the unified buffers. + size_t baseVertex = verts.size() / 3; + for (unsigned short i = 0; i < mesh->getNumSubMeshes(); ++i) { Ogre::SubMesh *sub = mesh->getSubMesh(i); Ogre::VertexData *vd = sub->useSharedVertices ? @@ -220,8 +225,9 @@ static void extractEntityMesh(Ogre::Entity *ent, std::vector &verts, Ogre::HardwareIndexBuffer::IT_32BIT); void *idata = ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY); - size_t offset = sub->useSharedVertices ? sharedOffset : - currentOffset; + size_t offset = baseVertex + + (sub->useSharedVertices ? sharedOffset : + currentOffset); if (use32) { unsigned int *p = static_cast(idata);