worked on navMesh stuff

- creation
- walking
- helper
This commit is contained in:
k-a-z-u
2018-01-10 16:57:19 +01:00
parent 3fc9688825
commit fee6cd3496
15 changed files with 1282 additions and 957 deletions

View File

@@ -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