diff --git a/server/gameserver/glmhelper.cc b/server/gameserver/glmhelper.cc index 77a726bc..b2cdea44 100644 --- a/server/gameserver/glmhelper.cc +++ b/server/gameserver/glmhelper.cc @@ -64,3 +64,10 @@ float GlmHelper::CalcAngle(const glm::vec3& v1, const glm::vec3& v2) #endif return angle / 3.1415926f; } + +void GlmHelper::FillVert(const glm::vec3& v, float* vert) +{ + vert[0] = v.x; + vert[1] = v.y; + vert[2] = v.z; +} diff --git a/server/gameserver/glmhelper.h b/server/gameserver/glmhelper.h index 5fd82b36..4a799da6 100644 --- a/server/gameserver/glmhelper.h +++ b/server/gameserver/glmhelper.h @@ -15,4 +15,6 @@ class GlmHelper static float CalcAngle(const glm::vec3& v1, const glm::vec3& v2); + static void FillVert(const glm::vec3& v, float* vert); + }; diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 6de7a860..c8403109 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -3,6 +3,8 @@ #include #include +#include "DetourCommon.h" + #include "mapservice.h" #include "entity.h" #include "roomobstacle.h" @@ -128,13 +130,41 @@ void MapService::AddTriangle(mc::Triangle* tri) if (max_grid_y >= map_height_) { max_grid_y = map_height_ - 1; } + float tri_verts[3 * 3]; + float aabb_verts[3 * 4]; + { + GlmHelper::FillVert(tri->vert0, tri_verts + 3 * 0); + GlmHelper::FillVert(tri->vert1, tri_verts + 3 * 1); + GlmHelper::FillVert(tri->vert2, tri_verts + 3 * 2); + } for (int x = min_grid_x; x <= max_grid_x; ++x) { for (int y = min_grid_y; y <= max_grid_y; ++y) { - int grid_id = x + y * map_width_; - list_head* head = &map_cells_[grid_id]; - CellNode* node = new CellNode(); - node->tri = tri; - list_add_tail(&node->entry, head); + float world_x = x * cell_width_; + float world_y = y * cell_width_; + { + aabb_verts[0] = world_x; + aabb_verts[1] = 0; + aabb_verts[2] = world_y; + + aabb_verts[3] = world_x + cell_width_; + aabb_verts[4] = 0; + aabb_verts[5] = world_y; + + aabb_verts[6] = world_x + cell_width_; + aabb_verts[7] = 0; + aabb_verts[8] = world_y + cell_width_; + + aabb_verts[9] = world_x; + aabb_verts[10] = 0; + aabb_verts[11] = world_y + cell_width_; + } + if (dtOverlapPolyPoly2D(tri_verts, 3, aabb_verts, 4)) { + int grid_id = x + y * map_width_; + list_head* head = &map_cells_[grid_id]; + CellNode* node = new CellNode(); + node->tri = tri; + list_add_tail(&node->entry, head); + } } } }