diff --git a/server/gameserver/mapcollider.cc b/server/gameserver/mapcollider.cc index fae35ec8..bb71e25f 100644 --- a/server/gameserver/mapcollider.cc +++ b/server/gameserver/mapcollider.cc @@ -67,10 +67,10 @@ namespace mc { auto trig_xobj = xobj->At("mesh")->At("triangles"); for (int i = 0; i < trig_xobj->Size(); ++i) { - mesh.triangles.push_back(trig_xobj->At(i)->AsXValue().GetDouble()); + mesh.raw_triangles.push_back(trig_xobj->At(i)->AsXValue().GetDouble()); } } - if (mesh.triangles.size() % 3 != 0) { + if (mesh.raw_triangles.size() % 3 != 0) { abort(); } Bounds_Read(mesh.bounds, xobj->At("mesh")->At("bounds")); diff --git a/server/gameserver/mapcollider.h b/server/gameserver/mapcollider.h index 8b57822a..bdba98ba 100644 --- a/server/gameserver/mapcollider.h +++ b/server/gameserver/mapcollider.h @@ -30,6 +30,16 @@ namespace mc glm::vec3 size = glm::vec3(0.0f, 0.0f, 0.0f); }; + struct Triangle + { + 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); + float min_y = 0.0f; + float max_y = 0.0f; + int check_flag = 0; + }; + struct Transform { glm::vec3 local_position = glm::vec3(0.0f, 0.0f, 0.0f); @@ -38,10 +48,12 @@ namespace mc void Read(std::shared_ptr xobj); }; + struct Mesh { std::vector vertices; - std::vector triangles; + std::vector raw_triangles; + //std::vector triangles; Bounds bounds; }; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 338e093f..5e356129 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -57,6 +57,16 @@ static float frand() return (float)rand()/(float)RAND_MAX; } +static void TraverseMapColliderNode(mc::ColliderNode* node, std::function cb) +{ + for (auto& pair : node->childs) { + cb(pair.second); + if (!pair.second->childs.empty()) { + TraverseMapColliderNode(pair.second, cb); + } + } +} + void MapInstance::Init() { map_meta_ = mt::Map::GetById(map_id); @@ -821,5 +831,15 @@ void MapInstance::LoadHouse() houses_.push_back(p); } } + { + for (auto& pair : GetMapMeta()->collider_info->GetNodes()) { + + } + } } } + +bool MapInstance::SceneRaycast(const glm::vec3& orig, const glm::vec3& dir, float max_distance, glm::vec3& hit_pos) +{ + +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index e44a098d..c660a9db 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -57,6 +57,7 @@ class MapInstance : public std::enable_shared_from_this void CheckTerrain(Creature* c, int same_poly_flags, const std::vector& spec_polys); void TraverseHouseList(std::function func); bool PtInHouse(const glm::vec3& pt, glm::vec3& nearest_pt); + bool SceneRaycast(const glm::vec3& orig, const glm::vec3& dir, float max_distance, glm::vec3& hit_pos); private: void CreateThings(); @@ -79,6 +80,8 @@ class MapInstance : public std::enable_shared_from_this std::list houses_; + std::vector things_; + std::string map_tpl_name_; const mt::Map* map_meta_ = nullptr; MapService* map_service_ = nullptr; diff --git a/server/gameserver/mt/MapCollider.h b/server/gameserver/mt/MapCollider.h index 01d56a63..2fe4e843 100644 --- a/server/gameserver/mt/MapCollider.h +++ b/server/gameserver/mt/MapCollider.h @@ -22,6 +22,7 @@ namespace mt void Load(const std::string& filename); mc::ColliderNode* GetNode(const std::string& name); + std::map& GetNodes() { return nodes_; }; private: std::map nodes_;