From 54a676f2e35f9e15a2418eeeb8e5e0e6ec04c2c2 Mon Sep 17 00:00:00 2001 From: elsid Date: Mon, 26 Jul 2021 20:18:01 +0200 Subject: [PATCH 1/2] Add functions to get length of recast type arrays To avoid duplicating same formulas in multiple places. --- .../detournavigator/navmeshtilescache.cpp | 39 +++++++------- .../detournavigator/preparednavmeshdata.hpp | 18 ++++--- .../preparednavmeshdatatuple.hpp | 17 ++++--- components/detournavigator/recast.hpp | 51 +++++++++++++++++++ 4 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 components/detournavigator/recast.hpp diff --git a/apps/openmw_test_suite/detournavigator/navmeshtilescache.cpp b/apps/openmw_test_suite/detournavigator/navmeshtilescache.cpp index 9405bd7739..309266142f 100644 --- a/apps/openmw_test_suite/detournavigator/navmeshtilescache.cpp +++ b/apps/openmw_test_suite/detournavigator/navmeshtilescache.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -48,11 +49,11 @@ namespace value.ch = 1.0f / (std::rand() % 999 + 1); value.borderSize = std::rand(); value.maxEdgeError = 1.0f / (std::rand() % 999 + 1); - generate(value.verts, 3 * value.nverts); - generate(value.polys, value.maxpolys * 2 * value.nvp); - generate(value.regs, value.maxpolys); - generate(value.flags, value.maxpolys); - generate(value.areas, value.maxpolys); + generate(value.verts, getVertsLength(value)); + generate(value.polys, getPolysLength(value)); + generate(value.regs, getRegsLength(value)); + generate(value.flags, getFlagsLength(value)); + generate(value.areas, getAreasLength(value)); } void generate(rcPolyMeshDetail& value, int size) @@ -60,9 +61,9 @@ namespace value.nmeshes = size; value.nverts = size; value.ntris = size; - generate(value.meshes, 4 * value.nmeshes); - generate(value.verts, 3 * value.nverts); - generate(value.tris, 4 * value.ntris); + generate(value.meshes, getMeshesLength(value)); + generate(value.verts, getVertsLength(value)); + generate(value.tris, getTrisLength(value)); } void generate(PreparedNavMeshData& value, int size) @@ -82,10 +83,10 @@ namespace } template - void clone(const T* src, T*& dst, int size) + void clone(const T* src, T*& dst, std::size_t size) { - dst = static_cast(permRecastAlloc(size * sizeof(T))); - std::memcpy(dst, src, static_cast(size) * sizeof(T)); + dst = static_cast(permRecastAlloc(static_cast(size) * sizeof(T))); + std::memcpy(dst, src, size * sizeof(T)); } void clone(const rcPolyMesh& src, rcPolyMesh& dst) @@ -100,11 +101,11 @@ namespace dst.ch = src.ch; dst.borderSize = src.borderSize; dst.maxEdgeError = src.maxEdgeError; - clone(src.verts, dst.verts, 3 * dst.nverts); - clone(src.polys, dst.polys, dst.maxpolys * 2 * dst.nvp); - clone(src.regs, dst.regs, dst.maxpolys); - clone(src.flags, dst.flags, dst.maxpolys); - clone(src.areas, dst.areas, dst.maxpolys); + clone(src.verts, dst.verts, getVertsLength(dst)); + clone(src.polys, dst.polys, getPolysLength(dst)); + clone(src.regs, dst.regs, getRegsLength(dst)); + clone(src.flags, dst.flags, getFlagsLength(dst)); + clone(src.areas, dst.areas, getAreasLength(dst)); } void clone(const rcPolyMeshDetail& src, rcPolyMeshDetail& dst) @@ -112,9 +113,9 @@ namespace dst.nmeshes = src.nmeshes; dst.nverts = src.nverts; dst.ntris = src.ntris; - clone(src.meshes, dst.meshes, 4 * dst.nmeshes); - clone(src.verts, dst.verts, 3 * dst.nverts); - clone(src.tris, dst.tris, 4 * dst.ntris); + clone(src.meshes, dst.meshes, getMeshesLength(dst)); + clone(src.verts, dst.verts, getVertsLength(dst)); + clone(src.tris, dst.tris, getTrisLength(dst)); } std::unique_ptr clone(const PreparedNavMeshData& value) diff --git a/components/detournavigator/preparednavmeshdata.hpp b/components/detournavigator/preparednavmeshdata.hpp index 4a92265231..3566cfc71b 100644 --- a/components/detournavigator/preparednavmeshdata.hpp +++ b/components/detournavigator/preparednavmeshdata.hpp @@ -1,6 +1,8 @@ #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H #define OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H +#include "recast.hpp" + #include #include @@ -25,18 +27,18 @@ namespace DetourNavigator inline constexpr std::size_t getSize(const rcPolyMesh& value) noexcept { - return static_cast(3 * value.nverts) * sizeof(*value.verts) - + static_cast(value.maxpolys * 2 * value.nvp) * sizeof(*value.polys) - + static_cast(value.maxpolys) * sizeof(*value.regs) - + static_cast(value.maxpolys) * sizeof(*value.flags) - + static_cast(value.maxpolys) * sizeof(*value.areas); + return getVertsLength(value) * sizeof(*value.verts) + + getPolysLength(value) * sizeof(*value.polys) + + getRegsLength(value) * sizeof(*value.regs) + + getFlagsLength(value) * sizeof(*value.flags) + + getAreasLength(value) * sizeof(*value.areas); } inline constexpr std::size_t getSize(const rcPolyMeshDetail& value) noexcept { - return static_cast(4 * value.nmeshes) * sizeof(*value.meshes) - + static_cast(4 * value.ntris) * sizeof(*value.tris) - + static_cast(3 * value.nverts) * sizeof(*value.verts); + return getMeshesLength(value) * sizeof(*value.meshes) + + getVertsLength(value) * sizeof(*value.verts) + + getTrisLength(value) * sizeof(*value.tris); } inline constexpr std::size_t getSize(const PreparedNavMeshData& value) noexcept diff --git a/components/detournavigator/preparednavmeshdatatuple.hpp b/components/detournavigator/preparednavmeshdatatuple.hpp index 5b5a72f629..8ff1267370 100644 --- a/components/detournavigator/preparednavmeshdatatuple.hpp +++ b/components/detournavigator/preparednavmeshdatatuple.hpp @@ -3,6 +3,7 @@ #include "preparednavmeshdata.hpp" #include "ref.hpp" +#include "recast.hpp" #include @@ -13,11 +14,11 @@ namespace DetourNavigator constexpr auto makeTuple(const rcPolyMesh& v) noexcept { return std::tuple( - Span(v.verts, 3 * v.nverts), - Span(v.polys, v.maxpolys * 2 * v.nvp), - Span(v.regs, v.maxpolys), - Span(v.flags, v.maxpolys), - Span(v.areas, v.maxpolys), + Span(v.verts, getVertsLength(v)), + Span(v.polys, getPolysLength(v)), + Span(v.regs, getRegsLength(v)), + Span(v.flags, getFlagsLength(v)), + Span(v.areas, getAreasLength(v)), ArrayRef(v.bmin), ArrayRef(v.bmax), v.cs, @@ -30,9 +31,9 @@ namespace DetourNavigator constexpr auto makeTuple(const rcPolyMeshDetail& v) noexcept { return std::tuple( - Span(v.meshes, 4 * v.nmeshes), - Span(v.verts, 3 * v.nverts), - Span(v.tris, 4 * v.ntris) + Span(v.meshes, getMeshesLength(v)), + Span(v.verts, getVertsLength(v)), + Span(v.tris, getTrisLength(v)) ); } diff --git a/components/detournavigator/recast.hpp b/components/detournavigator/recast.hpp new file mode 100644 index 0000000000..c51f4b9279 --- /dev/null +++ b/components/detournavigator/recast.hpp @@ -0,0 +1,51 @@ +#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_RECAST_H +#define OPENMW_COMPONENTS_DETOURNAVIGATOR_RECAST_H + +#include + +#include + +namespace DetourNavigator +{ + constexpr std::size_t getVertsLength(const rcPolyMesh& value) noexcept + { + return 3 * static_cast(value.nverts); + } + + constexpr std::size_t getPolysLength(const rcPolyMesh& value) noexcept + { + return 2 * static_cast(value.maxpolys * value.nvp); + } + + constexpr std::size_t getRegsLength(const rcPolyMesh& value) noexcept + { + return static_cast(value.maxpolys); + } + + constexpr std::size_t getFlagsLength(const rcPolyMesh& value) noexcept + { + return static_cast(value.maxpolys); + } + + constexpr std::size_t getAreasLength(const rcPolyMesh& value) noexcept + { + return static_cast(value.maxpolys); + } + + constexpr std::size_t getMeshesLength(const rcPolyMeshDetail& value) noexcept + { + return 4 * static_cast(value.nmeshes); + } + + constexpr std::size_t getVertsLength(const rcPolyMeshDetail& value) noexcept + { + return 3 * static_cast(value.nverts); + } + + constexpr std::size_t getTrisLength(const rcPolyMeshDetail& value) noexcept + { + return 4 * static_cast(value.ntris); + } +} + +#endif From 46fa3ce083f2f79ae5ba01439bffee9139113c23 Mon Sep 17 00:00:00 2001 From: elsid Date: Tue, 10 Aug 2021 23:26:31 +0200 Subject: [PATCH 2/2] Fix flags length for rcPolyMesh recastnavigation documentation of rcPolyMesh is misleading. It says flags field length is maxpolys when actually it's allocated as npolys. --- components/detournavigator/recast.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/detournavigator/recast.hpp b/components/detournavigator/recast.hpp index c51f4b9279..4e9ab329b7 100644 --- a/components/detournavigator/recast.hpp +++ b/components/detournavigator/recast.hpp @@ -24,7 +24,7 @@ namespace DetourNavigator constexpr std::size_t getFlagsLength(const rcPolyMesh& value) noexcept { - return static_cast(value.maxpolys); + return static_cast(value.npolys); } constexpr std::size_t getAreasLength(const rcPolyMesh& value) noexcept