From c01fff280a45e9cc8edb7e5a9e526d142faa1fbb Mon Sep 17 00:00:00 2001 From: Alexei Dobrohotov Date: Sat, 13 Nov 2021 19:53:03 +0300 Subject: [PATCH] Load bhkConvexVerticesShape, bhkBoxShape, bhkListShape --- components/nif/niffile.cpp | 3 +++ components/nif/physics.cpp | 44 ++++++++++++++++++++++++++++++++++++++ components/nif/physics.hpp | 42 ++++++++++++++++++++++++++++++++++++ components/nif/record.hpp | 5 ++++- 4 files changed, 93 insertions(+), 1 deletion(-) diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 5eb55e10d1..a752478d75 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -147,6 +147,9 @@ static std::map makeFactory() factory["bhkNiTriStripsShape"] = {&construct , RC_bhkNiTriStripsShape }; factory["bhkPackedNiTriStripsShape"] = {&construct , RC_bhkPackedNiTriStripsShape }; factory["hkPackedNiTriStripsData"] = {&construct , RC_hkPackedNiTriStripsData }; + factory["bhkConvexVerticesShape"] = {&construct , RC_bhkConvexVerticesShape }; + factory["bhkBoxShape"] = {&construct , RC_bhkBoxShape }; + factory["bhkListShape"] = {&construct , RC_bhkListShape }; return factory; } diff --git a/components/nif/physics.cpp b/components/nif/physics.cpp index e447bc65df..4809762576 100644 --- a/components/nif/physics.cpp +++ b/components/nif/physics.cpp @@ -179,4 +179,48 @@ namespace Nif } } + void bhkSphereRepShape::read(NIFStream *nif) + { + mHavokMaterial.read(nif); + } + + void bhkConvexShape::read(NIFStream *nif) + { + bhkSphereRepShape::read(nif); + mRadius = nif->getFloat(); + } + + void bhkConvexVerticesShape::read(NIFStream *nif) + { + bhkConvexShape::read(nif); + mVerticesProperty.read(nif); + mNormalsProperty.read(nif); + unsigned int numVertices = nif->getUInt(); + if (numVertices) + nif->getVector4s(mVertices, numVertices); + unsigned int numNormals = nif->getUInt(); + if (numNormals) + nif->getVector4s(mNormals, numNormals); + } + + void bhkBoxShape::read(NIFStream *nif) + { + bhkConvexShape::read(nif); + nif->skip(8); // Unused + mExtents = nif->getVector3(); + nif->skip(4); // Unused + } + + void bhkListShape::read(NIFStream *nif) + { + mSubshapes.read(nif); + mHavokMaterial.read(nif); + mChildShapeProperty.read(nif); + mChildFilterProperty.read(nif); + unsigned int numFilters = nif->getUInt(); + mHavokFilters.resize(numFilters); + for (HavokFilter& filter : mHavokFilters) + filter.read(nif); + } + } // Namespace \ No newline at end of file diff --git a/components/nif/physics.hpp b/components/nif/physics.hpp index 6c9fe685ef..4828f34877 100644 --- a/components/nif/physics.hpp +++ b/components/nif/physics.hpp @@ -198,5 +198,47 @@ struct hkPackedNiTriStripsData : public bhkShapeCollection void read(NIFStream *nif) override; }; +// Abstract +struct bhkSphereRepShape : public bhkShape +{ + HavokMaterial mHavokMaterial; + void read(NIFStream *nif) override; +}; + +// Abstract +struct bhkConvexShape : public bhkSphereRepShape +{ + float mRadius; + void read(NIFStream} *nif) override; +}; + +// A convex shape built from vertices +struct bhkConvexVerticesShape : public bhkConvexShape +{ + bhkWorldObjCInfoProperty mVerticesProperty; + bhkWorldObjCInfoProperty mNormalsProperty; + std::vector mVertices; + std::vector mNormals; + void read(NIFStream *nif) override; +}; + +// A box +struct bhkBoxShape : public bhkConvexShape +{ + osg::Vec3f mExtents; + void read(NIFStream *nif) override; +}; + +// A list of shapes +struct bhkListShape : public bhkShapeCollection +{ + bhkShapeList mSubshapes; + HavokMaterial mHavokMaterial; + bhkWorldObjCInfoProperty mChildShapeProperty; + bhkWorldObjCInfoProperty mChildFilterProperty; + std::vector mHavokFilters; + void read(NIFStream *nif) override; +}; + } // Namespace #endif \ No newline at end of file diff --git a/components/nif/record.hpp b/components/nif/record.hpp index 804b13262d..8648050d84 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -134,7 +134,10 @@ enum RecordType RC_bhkMoppBvTreeShape, RC_bhkNiTriStripsShape, RC_bhkPackedNiTriStripsShape, - RC_hkPackedNiTriStripsData + RC_hkPackedNiTriStripsData, + RC_bhkConvexVerticesShape, + RC_bhkBoxShape, + RC_bhkListShape }; /// Base class for all records