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:
commit
6595c731f7
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
);
|
||||
}
|
||||
|
||||
|
51
components/detournavigator/recast.hpp
Normal file
51
components/detournavigator/recast.hpp
Normal 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
|
Loading…
x
Reference in New Issue
Block a user