1
This commit is contained in:
parent
44a313a007
commit
1f2d8d6f46
@ -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");
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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_;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user