worked on nav-meshes
This commit is contained in:
@@ -7,11 +7,12 @@
|
||||
#include <random>
|
||||
#include "../math/DrawList.h"
|
||||
#include "NavMeshRandom.h"
|
||||
#include "NavMeshLocation.h"
|
||||
|
||||
template <typename Tria> class NavMesh {
|
||||
|
||||
/** all triangles within the mesh */
|
||||
std::vector<Tria> triangles;
|
||||
std::vector<Tria*> triangles;
|
||||
|
||||
BBox3 bbox;
|
||||
|
||||
@@ -28,12 +29,21 @@ public:
|
||||
|
||||
/** add a new triangle */
|
||||
void add(const Point3 p1, const Point3 p2, const Point3 p3, const uint8_t type) {
|
||||
triangles.push_back(Tria(p1,p2,p3,type));
|
||||
triangles.push_back(new Tria(p1,p2,p3,type));
|
||||
bbox.add(p1);
|
||||
bbox.add(p2);
|
||||
bbox.add(p3);
|
||||
}
|
||||
|
||||
NavMeshLocation<Tria> getLocation(const Point3 pos) {
|
||||
for (const Tria* tria : triangles) {
|
||||
if (tria->contains(pos)) {
|
||||
return NavMeshLocation<Tria>(pos, tria);
|
||||
}
|
||||
}
|
||||
throw Exception("location not found");
|
||||
}
|
||||
|
||||
/** connect both triangles */
|
||||
void connectBiDir(int idx1, int idx2) {
|
||||
connectUniDir(idx1,idx2);
|
||||
@@ -42,8 +52,8 @@ public:
|
||||
|
||||
/** connect both triangles */
|
||||
void connectUniDir(int idxFrom, int idxTo) {
|
||||
NavMeshTriangle& tria = triangles[idxFrom];
|
||||
tria._neighbors[tria._numNeighbors] = idxTo;
|
||||
NavMeshTriangle* tria = triangles[idxFrom];
|
||||
tria->_neighbors[tria->_numNeighbors] = triangles[idxTo];
|
||||
}
|
||||
|
||||
/** allows for-each iteration over all included triangles */
|
||||
@@ -53,7 +63,7 @@ public:
|
||||
decltype(triangles.end()) end() {return triangles.end();}
|
||||
|
||||
/** array access */
|
||||
Tria& operator [] (const size_t idx) {
|
||||
Tria* operator [] (const size_t idx) {
|
||||
Assert::isBetween(idx, (size_t)0, getNumTriangles()-1, "index out of bounds");
|
||||
return triangles[idx];
|
||||
}
|
||||
@@ -70,29 +80,29 @@ public:
|
||||
return NavMeshRandom<Tria>(triangles);
|
||||
}
|
||||
|
||||
/** ---------------- NEIGHBORS ---------------- */
|
||||
// /** ---------------- NEIGHBORS ---------------- */
|
||||
|
||||
/** get the number of neighbors for the given element */
|
||||
int getNumNeighbors(const size_t idx) const {
|
||||
return getNumNeighbors(triangles[idx]);
|
||||
}
|
||||
// /** get the number of neighbors for the given element */
|
||||
// int getNumNeighbors(const size_t idx) const {
|
||||
// return getNumNeighbors(triangles[idx]);
|
||||
// }
|
||||
|
||||
/** get the number of neighbors for the given element */
|
||||
int getNumNeighbors(const Tria& e) const {
|
||||
return e._numNeighbors;
|
||||
}
|
||||
// /** get the number of neighbors for the given element */
|
||||
// int getNumNeighbors(const Tria& e) const {
|
||||
// return e._numNeighbors;
|
||||
// }
|
||||
|
||||
/** get the n-th neighbor for the given node */
|
||||
Tria& getNeighbor(const size_t nodeIdx, const size_t nth) const {
|
||||
const Tria& node = triangles[nodeIdx];
|
||||
return getNeighbor(node, nth);
|
||||
}
|
||||
// /** get the n-th neighbor for the given node */
|
||||
// Tria& getNeighbor(const size_t nodeIdx, const size_t nth) const {
|
||||
// const Tria& node = triangles[nodeIdx];
|
||||
// return getNeighbor(node, nth);
|
||||
// }
|
||||
|
||||
/** get the n-th neighbor for the given node */
|
||||
Tria& getNeighbor(const Tria& tria, const size_t nth) const {
|
||||
const Tria& neighbor = triangles[tria._neighbors[nth]];
|
||||
return (Tria&) neighbor;
|
||||
}
|
||||
// /** get the n-th neighbor for the given node */
|
||||
// Tria& getNeighbor(const Tria& tria, const size_t nth) const {
|
||||
// const Tria& neighbor = triangles[tria._neighbors[nth]];
|
||||
// return (Tria&) neighbor;
|
||||
// }
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user