From 1e94a118eb0f996a00ba6e5bfe02acfba9905f94 Mon Sep 17 00:00:00 2001 From: tovjemam Date: Wed, 14 Jan 2026 18:04:24 +0100 Subject: [PATCH] Add convex hull option for meshes --- src/assets/model.cpp | 23 ++++++++++++++++++++ src/assets/model.hpp | 38 +++++++++++++++++---------------- src/collision/dynamicsworld.cpp | 5 +---- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/assets/model.cpp b/src/assets/model.cpp index 452ecd8..dcebb39 100644 --- a/src/assets/model.cpp +++ b/src/assets/model.cpp @@ -3,12 +3,15 @@ #include "cmdfile.hpp" #include "cache.hpp" +#include + std::shared_ptr assets::Model::LoadFromFile(const std::string& filename) { auto model = std::make_shared(); std::vector vert_pos; // rember for collision trimesh CLIENT_ONLY(MeshBuilder mb(gfx::MF_NONE);) + std::unique_ptr temp_hull; LoadCMDFile(filename, [&](const std::string& command, std::istringstream& iss) { if (command == "v") @@ -29,6 +32,9 @@ std::shared_ptr assets::Model::LoadFromFile(const std::stri if (model->cmesh_) vert_pos.emplace_back(pos); + + if (temp_hull) + temp_hull->addPoint(btVector3(pos.x, pos.y, pos.z), false); } else if (command == "f") { @@ -92,6 +98,10 @@ std::shared_ptr assets::Model::LoadFromFile(const std::stri { model->cmesh_ = std::make_unique(); } + else if (command == "makeconvexhull") + { + temp_hull = std::make_unique(); + } else { throw std::runtime_error("Unknown command in model file: " + command); @@ -105,8 +115,21 @@ std::shared_ptr assets::Model::LoadFromFile(const std::stri model->mesh_ = mb.GetMesh(); ) + // tri mesh if (model->cmesh_) model->cmesh_->Build(); + // convex hull + if (temp_hull) + { + temp_hull->recalcLocalAabb(); + + // Optional but recommended + auto shape_hull = std::make_unique(temp_hull.get()); + shape_hull->buildHull(temp_hull->getMargin()); + + model->cshape_ = std::make_unique((btScalar*)shape_hull->getVertexPointer(), shape_hull->numVertices(), sizeof(btVector3)); + } + return model; } diff --git a/src/assets/model.hpp b/src/assets/model.hpp index d31b0ff..5d57c50 100644 --- a/src/assets/model.hpp +++ b/src/assets/model.hpp @@ -14,24 +14,25 @@ namespace assets { -enum ModelCollisionShapeType -{ - MCS_NONE, +// enum ModelCollisionShapeType +// { +// MCS_NONE, - MCS_BOX, - MCS_SPHERE, -}; +// MCS_BOX, +// MCS_SPHERE, +// }; + +// struct ModelCollisionShape +// { +// ModelCollisionShapeType type = MCS_NONE; +// glm::vec3 origin = glm::vec3(0.0f); +// union +// { +// float radius; +// glm::vec3 half_extents; +// }; +// }; -struct ModelCollisionShape -{ - ModelCollisionShapeType type = MCS_NONE; - glm::vec3 origin = glm::vec3(0.0f); - union - { - float radius; - glm::vec3 half_extents; - }; -}; class Model { @@ -40,13 +41,14 @@ public: static std::shared_ptr LoadFromFile(const std::string& filename); const collision::TriangleMesh* GetColMesh() const { return cmesh_.get(); } - const std::vector& GetColShapes() const { return cshapes_; } + btCollisionShape* GetColShape() const { return cshape_.get(); } CLIENT_ONLY(const std::shared_ptr& GetMesh() const { return mesh_; }) private: std::unique_ptr cmesh_; - std::vector cshapes_; + // std::vector cshapes_; + std::unique_ptr cshape_; CLIENT_ONLY(std::shared_ptr mesh_;) diff --git a/src/collision/dynamicsworld.cpp b/src/collision/dynamicsworld.cpp index 2bbe546..b7112ac 100644 --- a/src/collision/dynamicsworld.cpp +++ b/src/collision/dynamicsworld.cpp @@ -58,8 +58,5 @@ void collision::DynamicsWorld::AddModelInstance(const assets::Model& model, cons static_objs_.emplace_back(std::move(obj)); } - for (const auto& shapes = model.GetColShapes(); const auto& shape : shapes) - { - // TODO: add basic shapes - } + // TODO: add shape }