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)
|
void BoxCollider::Read(std::shared_ptr<a8::XObject> xobj)
|
||||||
{
|
{
|
||||||
|
type = kBoxCollider;
|
||||||
Collider::Read(xobj);
|
Collider::Read(xobj);
|
||||||
Vec3_Read(center, xobj->At("center"));
|
Vec3_Read(center, xobj->At("center"));
|
||||||
Vec3_Read(size, xobj->At("size"));
|
Vec3_Read(size, xobj->At("size"));
|
||||||
@ -55,6 +56,7 @@ namespace mc
|
|||||||
|
|
||||||
void MeshCollider::Read(std::shared_ptr<a8::XObject> xobj)
|
void MeshCollider::Read(std::shared_ptr<a8::XObject> xobj)
|
||||||
{
|
{
|
||||||
|
type = kMeshCollider;
|
||||||
Collider::Read(xobj);
|
Collider::Read(xobj);
|
||||||
{
|
{
|
||||||
auto verts_xobj = xobj->At("mesh")->At("vertices");
|
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);
|
glm::vec3 size = glm::vec3(0.0f, 0.0f, 0.0f);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ColliderNode;
|
||||||
struct Triangle
|
struct Triangle
|
||||||
{
|
{
|
||||||
|
ColliderNode* node = nullptr;
|
||||||
glm::vec3 vert0 = glm::vec3(0.0f, 0.0f, 0.0f);
|
glm::vec3 vert0 = glm::vec3(0.0f, 0.0f, 0.0f);
|
||||||
glm::vec3 vert1 = 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);
|
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);
|
void Read(std::shared_ptr<a8::XObject> xobj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Mesh
|
struct Mesh
|
||||||
{
|
{
|
||||||
std::vector<glm::vec3> vertices;
|
std::vector<glm::vec3> vertices;
|
||||||
std::vector<int> raw_triangles;
|
std::vector<int> raw_triangles;
|
||||||
//std::vector<Triangle> triangles;
|
std::vector<Triangle> triangles;
|
||||||
Bounds bounds;
|
Bounds bounds;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -65,6 +66,7 @@ namespace mc
|
|||||||
bool is_trigger = false;
|
bool is_trigger = false;
|
||||||
Bounds bounds;
|
Bounds bounds;
|
||||||
|
|
||||||
|
virtual ~Collider() {};
|
||||||
virtual void Read(std::shared_ptr<a8::XObject> xobj);
|
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()) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapService::AddTriangle(mc::Triangle* tri)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int MapService::GetGridId(float world_x, float world_y)
|
int MapService::GetGridId(float world_x, float world_y)
|
||||||
{
|
{
|
||||||
int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_;
|
int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_;
|
||||||
|
@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
class Human;
|
class Human;
|
||||||
|
|
||||||
|
namespace mc
|
||||||
|
{
|
||||||
|
struct Triangle;
|
||||||
|
}
|
||||||
|
|
||||||
struct CellNode
|
struct CellNode
|
||||||
{
|
{
|
||||||
list_head entry;
|
list_head entry;
|
||||||
@ -19,6 +24,7 @@ class MapService
|
|||||||
void UnInit();
|
void UnInit();
|
||||||
|
|
||||||
bool CanAdd(const glm::vec3& pos, int rad);
|
bool CanAdd(const glm::vec3& pos, int rad);
|
||||||
|
void AddTriangle(mc::Triangle* tri);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int GetGridId(float world_x, float world_y);
|
int GetGridId(float world_x, float world_y);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user