diff --git a/include/nbl/asset/utils/CPolygonGeometryManipulator.h b/include/nbl/asset/utils/CPolygonGeometryManipulator.h index 3aa3c25304..5a1f58611e 100644 --- a/include/nbl/asset/utils/CPolygonGeometryManipulator.h +++ b/include/nbl/asset/utils/CPolygonGeometryManipulator.h @@ -66,15 +66,61 @@ class NBL_API2 CPolygonGeometryManipulator if (!geo || !geo->getPositionView() || geo->getPositionView().composed.rangeFormat>=IGeometryBase::EAABBFormat::Count) return {}; // the AABB shall be the same format as the Position View's range Format - IGeometryBase::SAABBStorage retval; - //if (geo->getIndexView() || geo->isSkinned()) + if (geo->getIndexView() || geo->isSkinned()) { - // TODO: kevinyu + std::unordered_set jointNodeIndexes = {}; + if (geo->isSkinned()) + { + for (const auto& jointWeight : geo->getJointWeightViews()) + { + for (auto vertex_i = 0u; vertex_i < jointWeight.indices.getElementCount(); vertex_i++) + { + hlsl::vector index; + hlsl::vector weight; + jointWeight.indices.decodeElement(vertex_i, index); + jointWeight.weights.decodeElement(vertex_i, weight); + if (weight.x != 0.f) + jointNodeIndexes.insert(index.x); + } + } + } + + auto addToAABB = [&](auto& aabb)->void + { + using aabb_t = std::remove_reference_t; + if (geo->getIndexView()) + { + for (auto index_i = 0u; index_i != geo->getIndexView().getElementCount(); index_i++) + { + hlsl::vector vertex_i; + geo->getIndexView().decodeElement(index_i, vertex_i); + if (geo->isSkinned() && jointNodeIndexes.contains(vertex_i.x)) continue; + typename aabb_t::point_t pt; + geo->getPositionView().decodeElement(vertex_i.x, pt); + aabb.addPoint(pt); + } + } else + { + for (auto vertex_i = 0u; vertex_i != geo->getPositionView().getElementCount(); vertex_i++) + { + if (geo->isSkinned() && jointNodeIndexes.contains(vertex_i)) continue; + typename aabb_t::point_t pt; + geo->getPositionView().decodeElement(vertex_i, pt); + aabb.addPoint(pt); + } + } + }; + IGeometryBase::SDataViewBase tmp = geo->getPositionView().composed; + tmp.resetRange(); + tmp.visitRange(addToAABB); + return tmp.encodedDataRange; + } + else + { + return geo->getPositionView().composed.encodedDataRange; } - //else - retval = geo->getPositionView().composed.encodedDataRange; - return retval; } + static inline void recomputeAABB(const ICPUPolygonGeometry* geo) { if (geo->isMutable())