This commit is contained in:
aozhiwei 2023-02-09 11:44:41 +08:00
parent 44a313a007
commit 1f2d8d6f46
5 changed files with 53 additions and 3 deletions

View File

@ -48,6 +48,7 @@ namespace mc
void BoxCollider::Read(std::shared_ptr<a8::XObject> 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<a8::XObject> xobj)
{
type = kMeshCollider;
Collider::Read(xobj);
{
auto verts_xobj = xobj->At("mesh")->At("vertices");

View File

@ -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<a8::XObject> xobj);
};
struct Mesh
{
std::vector<glm::vec3> vertices;
std::vector<int> raw_triangles;
//std::vector<Triangle> triangles;
std::vector<Triangle> triangles;
Bounds bounds;
};
@ -65,6 +66,7 @@ namespace mc
bool is_trigger = false;
Bounds bounds;
virtual ~Collider() {};
virtual void Read(std::shared_ptr<a8::XObject> xobj);
};

View File

@ -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);
}
}
}

View File

@ -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_;

View File

@ -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);