This commit is contained in:
aozhiwei 2023-05-15 18:09:55 +08:00
parent e0e13696e2
commit 8ebdcdb903
3 changed files with 52 additions and 2 deletions

View File

@ -2570,7 +2570,7 @@ void Creature::OnLand()
glm::vec3 point; glm::vec3 point;
bool ok = false; bool ok = false;
for (int i = 0; i < 10; ++i) { for (int i = 0; i < 10; ++i) {
ok = room->map_instance->FindNearestPoint(center, 1.0f + 10 * i, point); ok = room->map_instance->FindConnectableNearestPoint(center, 1.0f + 10 * i, point);
if (ok) { if (ok) {
break; break;
} }

View File

@ -72,6 +72,20 @@ static void TraverseMapColliderNode(mc::ColliderNode* node, std::function<void (
} }
} }
class ConnectableQueryFilter : public dtQueryFilter
{
public:
MapInstance* map_instance = nullptr;
virtual bool passFilter(const dtPolyRef ref,
const dtMeshTile* tile,
const dtPoly* poly) const override
{
return map_instance->IsConnectablePoly(ref);
}
};
void MapInstance::Init() void MapInstance::Init()
{ {
map_meta_ = mt::Map::GetById(map_id); map_meta_ = mt::Map::GetById(map_id);
@ -435,6 +449,34 @@ bool MapInstance::FindNearestPoint(const glm::vec3& center, float radius, glm::v
return true; return true;
} }
bool MapInstance::FindConnectableNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearest_pt)
{
dtPolyRef startRef = INVALID_NAVMESH_POLYREF;
ConnectableQueryFilter filter;
filter.map_instance = this;
filter.setIncludeFlags(0xffff);
filter.setExcludeFlags(0);
const float extents[3] = {radius, 10.0f, radius};
float nearestPt[3];
float pos[3];
pos[0] = center.x;
pos[1] = center.y;
pos[2] = center.z;
navmesh_query_->findNearestPoly(pos, extents, &filter, &startRef, nearestPt);
if (!startRef) {
return false;
}
nearest_pt.x = nearestPt[0];
nearest_pt.y = nearestPt[1];
nearest_pt.z = nearestPt[2];
return true;
}
bool MapInstance::GetPosHeight(const Position& pos, float& out_height) bool MapInstance::GetPosHeight(const Position& pos, float& out_height)
{ {
dtPolyRef startRef = INVALID_NAVMESH_POLYREF; dtPolyRef startRef = INVALID_NAVMESH_POLYREF;
@ -1122,7 +1164,8 @@ void MapInstance::AdjustOnLandPoint(glm::vec3& point)
const float extents[3] = {4.0f/10.0f, 100.0f, 4.0f/10.0f}; const float extents[3] = {4.0f/10.0f, 100.0f, 4.0f/10.0f};
dtQueryFilter filter; ConnectableQueryFilter filter;
filter.map_instance = this;
filter.setIncludeFlags(0xffff); filter.setIncludeFlags(0xffff);
filter.setExcludeFlags(0); filter.setExcludeFlags(0);
@ -1247,3 +1290,8 @@ void MapInstance::MarkConnectablePolys()
} }
} }
} }
bool MapInstance::IsConnectablePoly(dtPolyRef poly_ref)
{
return connectable_polys_.find(poly_ref) != connectable_polys_.end();
}

View File

@ -48,6 +48,7 @@ class MapInstance : public std::enable_shared_from_this<MapInstance>
int& same_polys_flags, std::vector<dtPolyRef>& spec_polys, int& same_polys_flags, std::vector<dtPolyRef>& spec_polys,
unsigned short exclude_flags); unsigned short exclude_flags);
bool FindNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt); bool FindNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt);
bool FindConnectableNearestPoint(const glm::vec3& center, float radius, glm::vec3& nearestPt);
bool GetPosHeight(const Position& pos, float& out_height); bool GetPosHeight(const Position& pos, float& out_height);
dtPoly* GetPoly(glm::vec3 pos, int& poly_idx); dtPoly* GetPoly(glm::vec3 pos, int& poly_idx);
void Scale(glm::vec3& v); void Scale(glm::vec3& v);
@ -60,6 +61,7 @@ class MapInstance : public std::enable_shared_from_this<MapInstance>
glm::vec3& hit_pos, float& ray_length); glm::vec3& hit_pos, float& ray_length);
bool GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt); bool GetNearestGrass(const glm::vec3& center, glm::vec3& out_pt);
void AdjustOnLandPoint(glm::vec3& point); void AdjustOnLandPoint(glm::vec3& point);
bool IsConnectablePoly(dtPolyRef poly_ref);
private: private:
void LoadHouse(); void LoadHouse();