1
This commit is contained in:
parent
0dd4f74bee
commit
d5abdfbc95
@ -15,6 +15,7 @@
|
|||||||
#include "room.h"
|
#include "room.h"
|
||||||
#include "roomobstacle.h"
|
#include "roomobstacle.h"
|
||||||
|
|
||||||
|
const int MAX_POLYS = 256;
|
||||||
static const int INVALID_NAVMESH_POLYREF = 0;
|
static const int INVALID_NAVMESH_POLYREF = 0;
|
||||||
|
|
||||||
MapService::MapService()
|
MapService::MapService()
|
||||||
@ -347,91 +348,9 @@ void MapService::DelFindPathRequest(Human* hum, FindPathStatus* status)
|
|||||||
void MapService::FindPathUpdate(FindPathStatus* find_status)
|
void MapService::FindPathUpdate(FindPathStatus* find_status)
|
||||||
{
|
{
|
||||||
if (use_navmesh_) {
|
if (use_navmesh_) {
|
||||||
float spos[3];
|
UpdateNavmesh(find_status);
|
||||||
spos[0] = find_status->start_pos.x;
|
|
||||||
spos[1] = find_status->start_pos.y;
|
|
||||||
spos[2] = 0;
|
|
||||||
|
|
||||||
float epos[3];
|
|
||||||
epos[0] = find_status->end_pos.x;
|
|
||||||
epos[1] = find_status->end_pos.x;
|
|
||||||
epos[2] = 0;
|
|
||||||
|
|
||||||
dtQueryFilter filter;
|
|
||||||
filter.setIncludeFlags(0xffff);
|
|
||||||
filter.setExcludeFlags(0);
|
|
||||||
|
|
||||||
const float extents[3] = {2.f, 4.f, 2.f};
|
|
||||||
|
|
||||||
dtPolyRef startRef = INVALID_NAVMESH_POLYREF;
|
|
||||||
dtPolyRef endRef = INVALID_NAVMESH_POLYREF;
|
|
||||||
|
|
||||||
float startNearestPt[3];
|
|
||||||
float endNearestPt[3];
|
|
||||||
find_status->navmesh_query->findNearestPoly(spos, extents, &filter, &startRef, startNearestPt);
|
|
||||||
find_status->navmesh_query->findNearestPoly(epos, extents, &filter, &endRef, endNearestPt);
|
|
||||||
if (!startRef || !endRef) {
|
|
||||||
find_status->navmesh_search_state = kNavMesh_SearchFailed;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const int MAX_POLYS = 256;
|
|
||||||
dtPolyRef polys[MAX_POLYS];
|
|
||||||
int npolys;
|
|
||||||
float straightPath[MAX_POLYS * 3];
|
|
||||||
unsigned char straightPathFlags[MAX_POLYS];
|
|
||||||
dtPolyRef straightPathPolys[MAX_POLYS];
|
|
||||||
int nstraightPath;
|
|
||||||
int pos = 0;
|
|
||||||
|
|
||||||
find_status->navmesh_query->findPath(startRef, endRef, startNearestPt, endNearestPt, &filter, polys, &npolys, MAX_POLYS);
|
|
||||||
nstraightPath = 0;
|
|
||||||
|
|
||||||
if (npolys) {
|
|
||||||
float epos1[3];
|
|
||||||
dtVcopy(epos1, endNearestPt);
|
|
||||||
|
|
||||||
if (polys[npolys-1] != endRef) {
|
|
||||||
find_status->navmesh_query->closestPointOnPoly(polys[npolys-1], endNearestPt, epos1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
find_status->navmesh_query->findStraightPath(startNearestPt, endNearestPt, polys, npolys, straightPath, straightPathFlags, straightPathPolys, &nstraightPath, MAX_POLYS);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
a8::Vec3 currpos;
|
|
||||||
for(int i = 0; i < nstraightPath * 3; ) {
|
|
||||||
currpos.x = straightPath[i++];
|
|
||||||
currpos.y = straightPath[i++];
|
|
||||||
currpos.z = straightPath[i++];
|
|
||||||
paths.push_back(currpos);
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
do {
|
UpdateAStar(find_status);
|
||||||
find_status->search_state = find_status->astar_search.SearchStep();
|
|
||||||
++find_status->search_step;
|
|
||||||
} while (find_status->search_state == AStarSearch<MapSearchNode>::SEARCH_STATE_SEARCHING);
|
|
||||||
|
|
||||||
if (FindOk(find_status)) {
|
|
||||||
MapSearchNode *node = find_status->astar_search.GetSolutionStart();
|
|
||||||
int steps = 0;
|
|
||||||
for( ;; ) {
|
|
||||||
node = find_status->astar_search.GetSolutionNext();
|
|
||||||
if (!node) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
steps++;
|
|
||||||
MovePathPoint point;
|
|
||||||
point.pos = a8::Vec2(
|
|
||||||
node->x * cell_width_ + cell_width_ / 2,
|
|
||||||
node->y * cell_width_ + cell_width_ / 2
|
|
||||||
);
|
|
||||||
find_status->out_points.push_back(point);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,3 +423,109 @@ void MapService::DoMove(FindPathStatus* find_status)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapService::UpdateAStar(FindPathStatus* find_status)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
find_status->search_state = find_status->astar_search.SearchStep();
|
||||||
|
++find_status->search_step;
|
||||||
|
} while (find_status->search_state == AStarSearch<MapSearchNode>::SEARCH_STATE_SEARCHING);
|
||||||
|
|
||||||
|
if (FindOk(find_status)) {
|
||||||
|
MapSearchNode *node = find_status->astar_search.GetSolutionStart();
|
||||||
|
int steps = 0;
|
||||||
|
for( ;; ) {
|
||||||
|
node = find_status->astar_search.GetSolutionNext();
|
||||||
|
if (!node) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
steps++;
|
||||||
|
MovePathPoint point;
|
||||||
|
point.pos = a8::Vec2(
|
||||||
|
node->x * cell_width_ + cell_width_ / 2,
|
||||||
|
node->y * cell_width_ + cell_width_ / 2
|
||||||
|
);
|
||||||
|
find_status->out_points.push_back(point);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapService::UpdateNavmesh(FindPathStatus* find_status)
|
||||||
|
{
|
||||||
|
dtNavMeshQuery* navmesh_query = find_status->navmesh_query;
|
||||||
|
|
||||||
|
float spos[3];
|
||||||
|
spos[0] = find_status->start_pos.x;
|
||||||
|
spos[1] = find_status->start_pos.y;
|
||||||
|
spos[2] = 0;
|
||||||
|
|
||||||
|
float epos[3];
|
||||||
|
epos[0] = find_status->end_pos.x;
|
||||||
|
epos[1] = find_status->end_pos.x;
|
||||||
|
epos[2] = 0;
|
||||||
|
|
||||||
|
dtQueryFilter filter;
|
||||||
|
filter.setIncludeFlags(0xffff);
|
||||||
|
filter.setExcludeFlags(0);
|
||||||
|
|
||||||
|
const float extents[3] = {2.f, 4.f, 2.f};
|
||||||
|
|
||||||
|
dtPolyRef start_ref = INVALID_NAVMESH_POLYREF;
|
||||||
|
dtPolyRef end_ref = INVALID_NAVMESH_POLYREF;
|
||||||
|
|
||||||
|
float start_nearest_pt[3];
|
||||||
|
float end_nearest_pt[3];
|
||||||
|
navmesh_query->findNearestPoly(spos, extents, &filter, &start_ref, start_nearest_pt);
|
||||||
|
navmesh_query->findNearestPoly(epos, extents, &filter, &end_ref, end_nearest_pt);
|
||||||
|
if (!start_ref || !end_ref) {
|
||||||
|
find_status->navmesh_search_state = kNavMesh_SearchFailed;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dtPolyRef polys[MAX_POLYS];
|
||||||
|
int npolys;
|
||||||
|
float straight_path[MAX_POLYS * 3];
|
||||||
|
unsigned char straight_path_flags[MAX_POLYS];
|
||||||
|
dtPolyRef straight_path_polys[MAX_POLYS];
|
||||||
|
int nstraight_path;
|
||||||
|
|
||||||
|
navmesh_query->findPath(start_ref,
|
||||||
|
end_ref,
|
||||||
|
start_nearest_pt,
|
||||||
|
end_nearest_pt,
|
||||||
|
&filter,
|
||||||
|
polys,
|
||||||
|
&npolys,
|
||||||
|
MAX_POLYS);
|
||||||
|
nstraight_path = 0;
|
||||||
|
|
||||||
|
if (npolys) {
|
||||||
|
float epos1[3];
|
||||||
|
dtVcopy(epos1, end_nearest_pt);
|
||||||
|
|
||||||
|
if (polys[npolys-1] != end_ref) {
|
||||||
|
navmesh_query->closestPointOnPoly(polys[npolys-1], end_nearest_pt, epos1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
navmesh_query->findStraightPath(start_nearest_pt,
|
||||||
|
end_nearest_pt,
|
||||||
|
polys,
|
||||||
|
npolys,
|
||||||
|
straight_path,
|
||||||
|
straight_path_flags,
|
||||||
|
straight_path_polys,
|
||||||
|
&nstraight_path,
|
||||||
|
MAX_POLYS);
|
||||||
|
|
||||||
|
for (int i = 0; i < nstraight_path * 3; ) {
|
||||||
|
MovePathPoint point;
|
||||||
|
point.pos.x = straight_path[i++];
|
||||||
|
point.pos.y = straight_path[i++];
|
||||||
|
straight_path[i++];
|
||||||
|
find_status->out_points.push_back(point);
|
||||||
|
}
|
||||||
|
find_status->navmesh_search_state = kNavMesh_SearchOk;
|
||||||
|
} else {
|
||||||
|
find_status->navmesh_search_state = kNavMesh_SearchFailed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -98,6 +98,8 @@ class MapService
|
|||||||
private:
|
private:
|
||||||
int GetGridId(float world_x, float world_y);
|
int GetGridId(float world_x, float world_y);
|
||||||
bool IsValidPos(int x, int y);
|
bool IsValidPos(int x, int y);
|
||||||
|
void UpdateAStar(FindPathStatus* find_status);
|
||||||
|
void UpdateNavmesh(FindPathStatus* find_status);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool use_navmesh_ = false;
|
bool use_navmesh_ = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user