diff --git a/server/gameserver/mapcollider.cc b/server/gameserver/mapcollider.cc index bb71e25f..871fb981 100644 --- a/server/gameserver/mapcollider.cc +++ b/server/gameserver/mapcollider.cc @@ -48,6 +48,7 @@ namespace mc void BoxCollider::Read(std::shared_ptr xobj) { + type = kBoxCollider; Collider::Read(xobj); Vec3_Read(center, xobj->At("center")); Vec3_Read(size, xobj->At("size")); @@ -55,6 +56,7 @@ namespace mc void MeshCollider::Read(std::shared_ptr xobj) { + type = kMeshCollider; Collider::Read(xobj); { auto verts_xobj = xobj->At("mesh")->At("vertices"); diff --git a/server/gameserver/mapcollider.h b/server/gameserver/mapcollider.h index bdba98ba..efc91852 100644 --- a/server/gameserver/mapcollider.h +++ b/server/gameserver/mapcollider.h @@ -30,8 +30,10 @@ namespace mc glm::vec3 size = glm::vec3(0.0f, 0.0f, 0.0f); }; + struct ColliderNode; struct Triangle { + ColliderNode* node = nullptr; glm::vec3 vert0 = glm::vec3(0.0f, 0.0f, 0.0f); glm::vec3 vert1 = glm::vec3(0.0f, 0.0f, 0.0f); glm::vec3 vert2 = glm::vec3(0.0f, 0.0f, 0.0f); @@ -48,12 +50,11 @@ namespace mc void Read(std::shared_ptr xobj); }; - struct Mesh { std::vector vertices; std::vector raw_triangles; - //std::vector triangles; + std::vector triangles; Bounds bounds; }; @@ -65,6 +66,7 @@ namespace mc bool is_trigger = false; Bounds bounds; + virtual ~Collider() {}; virtual void Read(std::shared_ptr xobj); }; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 5e356129..eb72289b 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -832,8 +832,43 @@ void MapInstance::LoadHouse() } } { + things_.reserve(1024 * 10); + auto cb = + [this] (mc::ColliderNode* node) + { + if (!node->colliders.empty()) { + for (auto c : node->colliders) { + if (c->type == mc::kMeshCollider) { + mc::MeshCollider* mesh_collider = (mc::MeshCollider*)c; + mesh_collider->mesh.triangles.reserve(mesh_collider->mesh.raw_triangles.size() / 3); + for (int i = 0; i < mesh_collider->mesh.raw_triangles.size(); i += 3) { + auto& tri = a8::FastAppend(mesh_collider->mesh.triangles); + tri.node = node; + tri.vert0 = mesh_collider->mesh.vertices[i + 0]; + tri.vert1 = mesh_collider->mesh.vertices[i + 1]; + tri.vert2 = mesh_collider->mesh.vertices[i + 2]; + tri.min_y = tri.vert0.y; + tri.max_y = tri.vert0.y; + for (int ii = 1; ii < 3; ++ii) { + float y = mesh_collider->mesh.vertices[i + ii].y; + if (y < tri.min_y) { + tri.min_y = y; + } + if (y > tri.max_y) { + tri.max_y = y; + } + }//end for ii + tri.min_y -= 1.0f; + tri.max_y += 1.0f; + map_service_->AddTriangle(&tri); + }//end for i + }//end if + }//end forc + things_.push_back(node); + } + }; for (auto& pair : GetMapMeta()->collider_info->GetNodes()) { - + TraverseMapColliderNode(pair.second, cb); } } } diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 9a2ef4b4..5443a004 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -76,6 +76,11 @@ bool MapService::CanAdd(const glm::vec3& pos, int rad) return true; } +void MapService::AddTriangle(mc::Triangle* tri) +{ + +} + int MapService::GetGridId(float world_x, float world_y) { int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_; diff --git a/server/gameserver/mapservice.h b/server/gameserver/mapservice.h index 2d867ccf..8d8d292d 100644 --- a/server/gameserver/mapservice.h +++ b/server/gameserver/mapservice.h @@ -2,6 +2,11 @@ class Human; +namespace mc +{ + struct Triangle; +} + struct CellNode { list_head entry; @@ -19,6 +24,7 @@ class MapService void UnInit(); bool CanAdd(const glm::vec3& pos, int rad); + void AddTriangle(mc::Triangle* tri); private: int GetGridId(float world_x, float world_y);