From 5a4c4b6e7550a34ce7bc17fbf22a06b982d9f9ab Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 8 Feb 2023 14:34:43 +0800 Subject: [PATCH] 1 --- server/gameserver/mapinstance.cc | 37 ++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 285219b1..42fd4e35 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -729,6 +729,36 @@ void MapInstance::TraverseHouseList(std::function func) bool MapInstance::PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt) { + float fpt[3]; + fpt[0] = pt.x; + fpt[1] = pt.y; + fpt[2] = pt.z; + float closest[3]; + + float edged[DT_VERTS_PER_POLYGON]; + float edget[DT_VERTS_PER_POLYGON]; + for (auto& house : houses_) { + float* verts = &house.verts[0]; + if (!house.verts.empty() && dtPointInPolygon(fpt, &house.verts[0], house.verts.size())) { + if (dtDistancePtPolyEdgesSqr(fpt, &house.verts[0], house.verts.size(), edged, edget)) { + float dmin = edged[0]; + int imin = 0; + for (size_t i = 1; i < house.verts.size(); ++i) { + if (edged[i] < dmin) { + dmin = edged[i]; + imin = i; + } + } + const float* va = &verts[imin*3]; + const float* vb = &verts[((imin+1)%house.verts.size())*3]; + dtVlerp(closest, va, vb, edget[imin]); + nearest_pt.x = closest[0]; + nearest_pt.y = closest[1]; + nearest_pt.z = closest[2]; + return true; + } + } + } return false; } @@ -770,6 +800,13 @@ void MapInstance::LoadHouse() HouseInfo p; p.node = node; + { + for (auto& point : new_points) { + p.verts.push_back(point.x); + p.verts.push_back(point.y); + p.verts.push_back(point.z); + } + } houses_.push_back(p); } }