1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-01 12:36:40 +00:00

Add functions to get length of recast type arrays

To avoid duplicating same formulas in multiple places.
This commit is contained in:
elsid 2021-07-26 20:18:01 +02:00
parent 3c6f145753
commit 54a676f2e3
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40
4 changed files with 90 additions and 35 deletions

View file

@ -6,6 +6,7 @@
#include <components/detournavigator/preparednavmeshdata.hpp> #include <components/detournavigator/preparednavmeshdata.hpp>
#include <components/detournavigator/ref.hpp> #include <components/detournavigator/ref.hpp>
#include <components/detournavigator/preparednavmeshdatatuple.hpp> #include <components/detournavigator/preparednavmeshdatatuple.hpp>
#include <components/detournavigator/recast.hpp>
#include <osg/Vec3f> #include <osg/Vec3f>
@ -48,11 +49,11 @@ namespace
value.ch = 1.0f / (std::rand() % 999 + 1); value.ch = 1.0f / (std::rand() % 999 + 1);
value.borderSize = std::rand(); value.borderSize = std::rand();
value.maxEdgeError = 1.0f / (std::rand() % 999 + 1); value.maxEdgeError = 1.0f / (std::rand() % 999 + 1);
generate(value.verts, 3 * value.nverts); generate(value.verts, getVertsLength(value));
generate(value.polys, value.maxpolys * 2 * value.nvp); generate(value.polys, getPolysLength(value));
generate(value.regs, value.maxpolys); generate(value.regs, getRegsLength(value));
generate(value.flags, value.maxpolys); generate(value.flags, getFlagsLength(value));
generate(value.areas, value.maxpolys); generate(value.areas, getAreasLength(value));
} }
void generate(rcPolyMeshDetail& value, int size) void generate(rcPolyMeshDetail& value, int size)
@ -60,9 +61,9 @@ namespace
value.nmeshes = size; value.nmeshes = size;
value.nverts = size; value.nverts = size;
value.ntris = size; value.ntris = size;
generate(value.meshes, 4 * value.nmeshes); generate(value.meshes, getMeshesLength(value));
generate(value.verts, 3 * value.nverts); generate(value.verts, getVertsLength(value));
generate(value.tris, 4 * value.ntris); generate(value.tris, getTrisLength(value));
} }
void generate(PreparedNavMeshData& value, int size) void generate(PreparedNavMeshData& value, int size)
@ -82,10 +83,10 @@ namespace
} }
template <class T> template <class T>
void clone(const T* src, T*& dst, int size) void clone(const T* src, T*& dst, std::size_t size)
{ {
dst = static_cast<T*>(permRecastAlloc(size * sizeof(T))); dst = static_cast<T*>(permRecastAlloc(static_cast<int>(size) * sizeof(T)));
std::memcpy(dst, src, static_cast<std::size_t>(size) * sizeof(T)); std::memcpy(dst, src, size * sizeof(T));
} }
void clone(const rcPolyMesh& src, rcPolyMesh& dst) void clone(const rcPolyMesh& src, rcPolyMesh& dst)
@ -100,11 +101,11 @@ namespace
dst.ch = src.ch; dst.ch = src.ch;
dst.borderSize = src.borderSize; dst.borderSize = src.borderSize;
dst.maxEdgeError = src.maxEdgeError; dst.maxEdgeError = src.maxEdgeError;
clone(src.verts, dst.verts, 3 * dst.nverts); clone(src.verts, dst.verts, getVertsLength(dst));
clone(src.polys, dst.polys, dst.maxpolys * 2 * dst.nvp); clone(src.polys, dst.polys, getPolysLength(dst));
clone(src.regs, dst.regs, dst.maxpolys); clone(src.regs, dst.regs, getRegsLength(dst));
clone(src.flags, dst.flags, dst.maxpolys); clone(src.flags, dst.flags, getFlagsLength(dst));
clone(src.areas, dst.areas, dst.maxpolys); clone(src.areas, dst.areas, getAreasLength(dst));
} }
void clone(const rcPolyMeshDetail& src, rcPolyMeshDetail& dst) void clone(const rcPolyMeshDetail& src, rcPolyMeshDetail& dst)
@ -112,9 +113,9 @@ namespace
dst.nmeshes = src.nmeshes; dst.nmeshes = src.nmeshes;
dst.nverts = src.nverts; dst.nverts = src.nverts;
dst.ntris = src.ntris; dst.ntris = src.ntris;
clone(src.meshes, dst.meshes, 4 * dst.nmeshes); clone(src.meshes, dst.meshes, getMeshesLength(dst));
clone(src.verts, dst.verts, 3 * dst.nverts); clone(src.verts, dst.verts, getVertsLength(dst));
clone(src.tris, dst.tris, 4 * dst.ntris); clone(src.tris, dst.tris, getTrisLength(dst));
} }
std::unique_ptr<PreparedNavMeshData> clone(const PreparedNavMeshData& value) std::unique_ptr<PreparedNavMeshData> clone(const PreparedNavMeshData& value)

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H #ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H #define OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H
#include "recast.hpp"
#include <Recast.h> #include <Recast.h>
#include <cstddef> #include <cstddef>
@ -25,18 +27,18 @@ namespace DetourNavigator
inline constexpr std::size_t getSize(const rcPolyMesh& value) noexcept inline constexpr std::size_t getSize(const rcPolyMesh& value) noexcept
{ {
return static_cast<std::size_t>(3 * value.nverts) * sizeof(*value.verts) return getVertsLength(value) * sizeof(*value.verts)
+ static_cast<std::size_t>(value.maxpolys * 2 * value.nvp) * sizeof(*value.polys) + getPolysLength(value) * sizeof(*value.polys)
+ static_cast<std::size_t>(value.maxpolys) * sizeof(*value.regs) + getRegsLength(value) * sizeof(*value.regs)
+ static_cast<std::size_t>(value.maxpolys) * sizeof(*value.flags) + getFlagsLength(value) * sizeof(*value.flags)
+ static_cast<std::size_t>(value.maxpolys) * sizeof(*value.areas); + getAreasLength(value) * sizeof(*value.areas);
} }
inline constexpr std::size_t getSize(const rcPolyMeshDetail& value) noexcept inline constexpr std::size_t getSize(const rcPolyMeshDetail& value) noexcept
{ {
return static_cast<std::size_t>(4 * value.nmeshes) * sizeof(*value.meshes) return getMeshesLength(value) * sizeof(*value.meshes)
+ static_cast<std::size_t>(4 * value.ntris) * sizeof(*value.tris) + getVertsLength(value) * sizeof(*value.verts)
+ static_cast<std::size_t>(3 * value.nverts) * sizeof(*value.verts); + getTrisLength(value) * sizeof(*value.tris);
} }
inline constexpr std::size_t getSize(const PreparedNavMeshData& value) noexcept inline constexpr std::size_t getSize(const PreparedNavMeshData& value) noexcept

View file

@ -3,6 +3,7 @@
#include "preparednavmeshdata.hpp" #include "preparednavmeshdata.hpp"
#include "ref.hpp" #include "ref.hpp"
#include "recast.hpp"
#include <Recast.h> #include <Recast.h>
@ -13,11 +14,11 @@ namespace DetourNavigator
constexpr auto makeTuple(const rcPolyMesh& v) noexcept constexpr auto makeTuple(const rcPolyMesh& v) noexcept
{ {
return std::tuple( return std::tuple(
Span(v.verts, 3 * v.nverts), Span(v.verts, getVertsLength(v)),
Span(v.polys, v.maxpolys * 2 * v.nvp), Span(v.polys, getPolysLength(v)),
Span(v.regs, v.maxpolys), Span(v.regs, getRegsLength(v)),
Span(v.flags, v.maxpolys), Span(v.flags, getFlagsLength(v)),
Span(v.areas, v.maxpolys), Span(v.areas, getAreasLength(v)),
ArrayRef(v.bmin), ArrayRef(v.bmin),
ArrayRef(v.bmax), ArrayRef(v.bmax),
v.cs, v.cs,
@ -30,9 +31,9 @@ namespace DetourNavigator
constexpr auto makeTuple(const rcPolyMeshDetail& v) noexcept constexpr auto makeTuple(const rcPolyMeshDetail& v) noexcept
{ {
return std::tuple( return std::tuple(
Span(v.meshes, 4 * v.nmeshes), Span(v.meshes, getMeshesLength(v)),
Span(v.verts, 3 * v.nverts), Span(v.verts, getVertsLength(v)),
Span(v.tris, 4 * v.ntris) Span(v.tris, getTrisLength(v))
); );
} }

View file

@ -0,0 +1,51 @@
#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_RECAST_H
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_RECAST_H
#include <Recast.h>
#include <cstddef>
namespace DetourNavigator
{
constexpr std::size_t getVertsLength(const rcPolyMesh& value) noexcept
{
return 3 * static_cast<std::size_t>(value.nverts);
}
constexpr std::size_t getPolysLength(const rcPolyMesh& value) noexcept
{
return 2 * static_cast<std::size_t>(value.maxpolys * value.nvp);
}
constexpr std::size_t getRegsLength(const rcPolyMesh& value) noexcept
{
return static_cast<std::size_t>(value.maxpolys);
}
constexpr std::size_t getFlagsLength(const rcPolyMesh& value) noexcept
{
return static_cast<std::size_t>(value.maxpolys);
}
constexpr std::size_t getAreasLength(const rcPolyMesh& value) noexcept
{
return static_cast<std::size_t>(value.maxpolys);
}
constexpr std::size_t getMeshesLength(const rcPolyMeshDetail& value) noexcept
{
return 4 * static_cast<std::size_t>(value.nmeshes);
}
constexpr std::size_t getVertsLength(const rcPolyMeshDetail& value) noexcept
{
return 3 * static_cast<std::size_t>(value.nverts);
}
constexpr std::size_t getTrisLength(const rcPolyMeshDetail& value) noexcept
{
return 4 * static_cast<std::size_t>(value.ntris);
}
}
#endif