1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-20 15:40:32 +00:00

Merge branch 'fix_rc_poly_mesh_flags_length' into 'master'

Fix flags length for rcPolyMesh

See merge request OpenMW/openmw!1134
This commit is contained in:
psi29a 2021-08-17 09:19:32 +00:00
commit 6595c731f7
4 changed files with 90 additions and 35 deletions

View File

@ -6,6 +6,7 @@
#include <components/detournavigator/preparednavmeshdata.hpp>
#include <components/detournavigator/ref.hpp>
#include <components/detournavigator/preparednavmeshdatatuple.hpp>
#include <components/detournavigator/recast.hpp>
#include <osg/Vec3f>
@ -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 <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)));
std::memcpy(dst, src, static_cast<std::size_t>(size) * sizeof(T));
dst = static_cast<T*>(permRecastAlloc(static_cast<int>(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<PreparedNavMeshData> clone(const PreparedNavMeshData& value)

View File

@ -1,6 +1,8 @@
#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_PREPAREDNAVMESHDATA_H
#include "recast.hpp"
#include <Recast.h>
#include <cstddef>
@ -25,18 +27,18 @@ namespace DetourNavigator
inline constexpr std::size_t getSize(const rcPolyMesh& value) noexcept
{
return static_cast<std::size_t>(3 * value.nverts) * sizeof(*value.verts)
+ static_cast<std::size_t>(value.maxpolys * 2 * value.nvp) * sizeof(*value.polys)
+ static_cast<std::size_t>(value.maxpolys) * sizeof(*value.regs)
+ static_cast<std::size_t>(value.maxpolys) * sizeof(*value.flags)
+ static_cast<std::size_t>(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<std::size_t>(4 * value.nmeshes) * sizeof(*value.meshes)
+ static_cast<std::size_t>(4 * value.ntris) * sizeof(*value.tris)
+ static_cast<std::size_t>(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

View File

@ -3,6 +3,7 @@
#include "preparednavmeshdata.hpp"
#include "ref.hpp"
#include "recast.hpp"
#include <Recast.h>
@ -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))
);
}

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.npolys);
}
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