summaryrefslogtreecommitdiff
path: root/thirdparty/recastnavigation/Recast/Source/Recast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/recastnavigation/Recast/Source/Recast.cpp')
-rw-r--r--thirdparty/recastnavigation/Recast/Source/Recast.cpp165
1 files changed, 118 insertions, 47 deletions
diff --git a/thirdparty/recastnavigation/Recast/Source/Recast.cpp b/thirdparty/recastnavigation/Recast/Source/Recast.cpp
index 8308d1973e..1b71710cdc 100644
--- a/thirdparty/recastnavigation/Recast/Source/Recast.cpp
+++ b/thirdparty/recastnavigation/Recast/Source/Recast.cpp
@@ -23,11 +23,34 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
-#include <new>
#include "Recast.h"
#include "RecastAlloc.h"
#include "RecastAssert.h"
+namespace
+{
+/// Allocates and constructs an object of the given type, returning a pointer.
+/// TODO: Support constructor args.
+/// @param[in] hint Hint to the allocator.
+template <typename T>
+T* rcNew(rcAllocHint hint) {
+ T* ptr = (T*)rcAlloc(sizeof(T), hint);
+ ::new(rcNewTag(), (void*)ptr) T();
+ return ptr;
+}
+
+/// Destroys and frees an object allocated with rcNew.
+/// @param[in] ptr The object pointer to delete.
+template <typename T>
+void rcDelete(T* ptr) {
+ if (ptr) {
+ ptr->~T();
+ rcFree((void*)ptr);
+ }
+}
+} // namespace
+
+
float rcSqrt(float x)
{
return sqrtf(x);
@@ -73,9 +96,8 @@ void rcContext::log(const rcLogCategory category, const char* format, ...)
rcHeightfield* rcAllocHeightfield()
{
- return new (rcAlloc(sizeof(rcHeightfield), RC_ALLOC_PERM)) rcHeightfield;
+ return rcNew<rcHeightfield>(RC_ALLOC_PERM);
}
-
rcHeightfield::rcHeightfield()
: width()
, height()
@@ -104,84 +126,133 @@ rcHeightfield::~rcHeightfield()
void rcFreeHeightField(rcHeightfield* hf)
{
- if (!hf) return;
- hf->~rcHeightfield();
- rcFree(hf);
+ rcDelete(hf);
}
rcCompactHeightfield* rcAllocCompactHeightfield()
{
- rcCompactHeightfield* chf = (rcCompactHeightfield*)rcAlloc(sizeof(rcCompactHeightfield), RC_ALLOC_PERM);
- memset(chf, 0, sizeof(rcCompactHeightfield));
- return chf;
+ return rcNew<rcCompactHeightfield>(RC_ALLOC_PERM);
}
void rcFreeCompactHeightfield(rcCompactHeightfield* chf)
{
- if (!chf) return;
- rcFree(chf->cells);
- rcFree(chf->spans);
- rcFree(chf->dist);
- rcFree(chf->areas);
- rcFree(chf);
+ rcDelete(chf);
}
-rcHeightfieldLayerSet* rcAllocHeightfieldLayerSet()
+rcCompactHeightfield::rcCompactHeightfield()
+ : width(),
+ height(),
+ spanCount(),
+ walkableHeight(),
+ walkableClimb(),
+ borderSize(),
+ maxDistance(),
+ maxRegions(),
+ bmin(),
+ bmax(),
+ cs(),
+ ch(),
+ cells(),
+ spans(),
+ dist(),
+ areas()
{
- rcHeightfieldLayerSet* lset = (rcHeightfieldLayerSet*)rcAlloc(sizeof(rcHeightfieldLayerSet), RC_ALLOC_PERM);
- memset(lset, 0, sizeof(rcHeightfieldLayerSet));
- return lset;
+}
+rcCompactHeightfield::~rcCompactHeightfield()
+{
+ rcFree(cells);
+ rcFree(spans);
+ rcFree(dist);
+ rcFree(areas);
}
+rcHeightfieldLayerSet* rcAllocHeightfieldLayerSet()
+{
+ return rcNew<rcHeightfieldLayerSet>(RC_ALLOC_PERM);
+}
void rcFreeHeightfieldLayerSet(rcHeightfieldLayerSet* lset)
{
- if (!lset) return;
- for (int i = 0; i < lset->nlayers; ++i)
+ rcDelete(lset);
+}
+
+rcHeightfieldLayerSet::rcHeightfieldLayerSet()
+ : layers(), nlayers() {}
+rcHeightfieldLayerSet::~rcHeightfieldLayerSet()
+{
+ for (int i = 0; i < nlayers; ++i)
{
- rcFree(lset->layers[i].heights);
- rcFree(lset->layers[i].areas);
- rcFree(lset->layers[i].cons);
+ rcFree(layers[i].heights);
+ rcFree(layers[i].areas);
+ rcFree(layers[i].cons);
}
- rcFree(lset->layers);
- rcFree(lset);
+ rcFree(layers);
}
rcContourSet* rcAllocContourSet()
{
- rcContourSet* cset = (rcContourSet*)rcAlloc(sizeof(rcContourSet), RC_ALLOC_PERM);
- memset(cset, 0, sizeof(rcContourSet));
- return cset;
+ return rcNew<rcContourSet>(RC_ALLOC_PERM);
}
-
void rcFreeContourSet(rcContourSet* cset)
{
- if (!cset) return;
- for (int i = 0; i < cset->nconts; ++i)
+ rcDelete(cset);
+}
+
+rcContourSet::rcContourSet()
+ : conts(),
+ nconts(),
+ bmin(),
+ bmax(),
+ cs(),
+ ch(),
+ width(),
+ height(),
+ borderSize(),
+ maxError() {}
+rcContourSet::~rcContourSet()
+{
+ for (int i = 0; i < nconts; ++i)
{
- rcFree(cset->conts[i].verts);
- rcFree(cset->conts[i].rverts);
+ rcFree(conts[i].verts);
+ rcFree(conts[i].rverts);
}
- rcFree(cset->conts);
- rcFree(cset);
+ rcFree(conts);
}
+
rcPolyMesh* rcAllocPolyMesh()
{
- rcPolyMesh* pmesh = (rcPolyMesh*)rcAlloc(sizeof(rcPolyMesh), RC_ALLOC_PERM);
- memset(pmesh, 0, sizeof(rcPolyMesh));
- return pmesh;
+ return rcNew<rcPolyMesh>(RC_ALLOC_PERM);
}
-
void rcFreePolyMesh(rcPolyMesh* pmesh)
{
- if (!pmesh) return;
- rcFree(pmesh->verts);
- rcFree(pmesh->polys);
- rcFree(pmesh->regs);
- rcFree(pmesh->flags);
- rcFree(pmesh->areas);
- rcFree(pmesh);
+ rcDelete(pmesh);
+}
+
+rcPolyMesh::rcPolyMesh()
+ : verts(),
+ polys(),
+ regs(),
+ flags(),
+ areas(),
+ nverts(),
+ npolys(),
+ maxpolys(),
+ nvp(),
+ bmin(),
+ bmax(),
+ cs(),
+ ch(),
+ borderSize(),
+ maxEdgeError() {}
+
+rcPolyMesh::~rcPolyMesh()
+{
+ rcFree(verts);
+ rcFree(polys);
+ rcFree(regs);
+ rcFree(flags);
+ rcFree(areas);
}
rcPolyMeshDetail* rcAllocPolyMeshDetail()