worked on navMesh stuff
- creation - walking - helper
This commit is contained in:
@@ -3,54 +3,80 @@
|
||||
|
||||
#include "../NavMesh.h"
|
||||
#include "../NavMeshLocation.h"
|
||||
#include "../NavMeshRandom.h"
|
||||
|
||||
#include <vector>
|
||||
#include <unordered_set>
|
||||
|
||||
namespace NM {
|
||||
|
||||
template <typename Tria> class NavMeshSub {
|
||||
template <typename Tria> class NavMeshSub {
|
||||
|
||||
std::vector<const Tria*> toVisit;
|
||||
std::vector<const Tria*> toVisit;
|
||||
|
||||
public:
|
||||
public:
|
||||
|
||||
NavMeshSub(const NavMesh<Tria>& nm, const NavMeshLocation<Tria>& loc, float radius_m) {
|
||||
build(nm,loc,radius_m);
|
||||
}
|
||||
NavMeshSub(const NavMeshLocation<Tria>& loc, float radius_m) {
|
||||
build(loc,radius_m);
|
||||
}
|
||||
|
||||
private:
|
||||
/** does this submesh contain the given point? */
|
||||
bool contains(const Point2 p2) const {
|
||||
for (const Tria* t : toVisit) {
|
||||
if (t->contains(p2)) {return true;}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void build(const NavMesh<Tria>& nm, const NavMeshLocation<Tria>& loc, float radius_m) {
|
||||
/** get the triangle that contains the given point (if any) */
|
||||
const Tria* getContainingTriangle(const Point2 p2) const {
|
||||
for (const Tria* t : toVisit) {
|
||||
if (t->contains(p2)) {return t;}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// center to start searching
|
||||
const Point3 center = loc.pos;
|
||||
/** perform random operations on the submesh */
|
||||
NavMeshRandom<Tria> getRandom() {
|
||||
return NavMeshRandom<Tria>(toVisit);
|
||||
}
|
||||
|
||||
toVisit.push_back(loc.tria);
|
||||
private:
|
||||
|
||||
std::unordered_set<const Tria*> visited;
|
||||
void build(const NavMeshLocation<Tria>& loc, float radius_m) {
|
||||
|
||||
size_t next = 0;
|
||||
while (next < toVisit.size()) {
|
||||
std::unordered_set<const Tria*> visited;
|
||||
|
||||
// next triangle
|
||||
const Tria* cur = toVisit[next]; ++next;
|
||||
// starting-triangle + all its (max 3) neighbors
|
||||
toVisit.push_back(loc.tria);
|
||||
visited.insert(loc.tria);
|
||||
for (const auto* n : *loc.tria) {
|
||||
toVisit.push_back( (const Tria*)n );
|
||||
}
|
||||
|
||||
size_t next = 1; // start with the first neighbor (skip starting triangle itself)
|
||||
while (next < toVisit.size()) {
|
||||
|
||||
// next triangle
|
||||
const NavMeshTriangle* cur = toVisit[next]; ++next;
|
||||
|
||||
// neighbors
|
||||
for (const auto* n : *cur) {
|
||||
const Tria* t = (const Tria*) n;
|
||||
const float dist = loc.pos.getDistance(n->getCenter());
|
||||
if (dist > radius_m) {continue;}
|
||||
if (visited.find(t) != visited.end()) {continue;}
|
||||
toVisit.push_back(t);
|
||||
visited.insert(t);
|
||||
}
|
||||
|
||||
// neighbors
|
||||
for (const Tria* n : cur) {
|
||||
const float dist = loc.pos.getDistance(n.getCenter());
|
||||
if (dist > radius_m) {continue;}
|
||||
if (visited.find(n) != visited.end()) {continue;}
|
||||
toVisit.push_back(n);
|
||||
visited.push_back(n);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return toVisit;
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAVMESHSUB_H
|
||||
|
||||
Reference in New Issue
Block a user