diff --git a/include/nbl/asset/utils/CPolygonGeometryManipulator.h b/include/nbl/asset/utils/CPolygonGeometryManipulator.h index 52562a7e29..cb62cacb76 100644 --- a/include/nbl/asset/utils/CPolygonGeometryManipulator.h +++ b/include/nbl/asset/utils/CPolygonGeometryManipulator.h @@ -16,7 +16,7 @@ namespace nbl::asset { //! An interface for easy manipulation of polygon geometries. -class CPolygonGeometryManipulator +class NBL_API2 CPolygonGeometryManipulator { public: static inline void recomputeContentHashes(ICPUPolygonGeometry* geo) @@ -230,6 +230,28 @@ class CPolygonGeometryManipulator EEM_QUATERNION, EEM_COUNT }; + + struct VertexCollection + { + using FetchFn = std::function; + FetchFn fetch; + size_t size; + + static auto fromSpan(std::span vertices) -> VertexCollection + { + return VertexCollection{ + .fetch = [data = vertices.data()](size_t vertexIndex)-> hlsl::float32_t3 + { + return data[vertexIndex]; + }, + .size = vertices.size() + }; + } + + hlsl::float32_t3 operator[](size_t index) const { return fetch(index); } + }; + static hlsl::shapes::OBB<3, hlsl::float32_t> calculateOBB(const VertexCollection& vertexCollection); + #if 0 // TODO: REDO //! Struct used to pass chosen comparison method and epsilon to functions performing error metrics. /** diff --git a/include/nbl/builtin/hlsl/shapes/aabb.hlsl b/include/nbl/builtin/hlsl/shapes/aabb.hlsl index 5b4b1be39d..1d5b772f63 100644 --- a/include/nbl/builtin/hlsl/shapes/aabb.hlsl +++ b/include/nbl/builtin/hlsl/shapes/aabb.hlsl @@ -60,6 +60,30 @@ struct AABB point_t maxVx; }; +template +struct OBB +{ + using scalar_t = Scalar; + using point_t = vector; + + static OBB createAxisAligned(point_t mid, point_t len) + { + OBB ret; + ret.mid = mid; + ret.ext = len * 0.5f; + for (auto dim_i = 0; dim_i < D; dim_i++) + { + ret.axes[dim_i] = point_t(0); + ret.axes[dim_i][dim_i] = 1; + } + return ret; + } + + point_t mid; + std::array axes; + point_t ext; +}; + namespace util { namespace impl diff --git a/src/nbl/CMakeLists.txt b/src/nbl/CMakeLists.txt index 935beffe2c..b0c27fafb0 100755 --- a/src/nbl/CMakeLists.txt +++ b/src/nbl/CMakeLists.txt @@ -180,6 +180,7 @@ set(NBL_ASSET_SOURCES # Meshes asset/utils/CForsythVertexCacheOptimizer.cpp asset/utils/CSmoothNormalGenerator.cpp + asset/utils/COBBGenerator.cpp asset/utils/CGeometryCreator.cpp asset/utils/CPolygonGeometryManipulator.cpp asset/utils/COverdrawPolygonGeometryOptimizer.cpp diff --git a/src/nbl/asset/utils/CPolygonGeometryManipulator.cpp b/src/nbl/asset/utils/CPolygonGeometryManipulator.cpp index 1e08c172ba..7b2bdb3963 100644 --- a/src/nbl/asset/utils/CPolygonGeometryManipulator.cpp +++ b/src/nbl/asset/utils/CPolygonGeometryManipulator.cpp @@ -16,10 +16,18 @@ #include "nbl/asset/utils/CSmoothNormalGenerator.h" #include "nbl/asset/utils/CForsythVertexCacheOptimizer.h" #include "nbl/asset/utils/COverdrawPolygonGeometryOptimizer.h" +#include "nbl/asset/utils/COBBGenerator.h" namespace nbl::asset { + +hlsl::shapes::OBB<> CPolygonGeometryManipulator::calculateOBB(const VertexCollection& vertices) +{ + return CObbGenerator::calculateOBB(vertices); +} + + #if 0 //! Flips the direction of surfaces. Changes backfacing triangles to frontfacing //! triangles and vice versa.