#pragma once #include "RE/H/hkBlockStream.h" #include "RE/H/hkEnum.h" #include "RE/H/hkFlags.h" #include "RE/H/hkReferencedObject.h" #include "RE/H/hkResult.h" #include "RE/H/hkVector4.h" #include "RE/H/hknpCollisionDispatchType.h" #include "RE/H/hknpShapeType.h" namespace RE { namespace hkcdGsk { struct Cache; } class hkAabb; class hkcdVertex; class hknpShapeSignals; class hkRefCountedProperties; class hknpSolverInfo; class hkTransformf; template class hkArray; class hkDiagonalizedMassProperties; class hkGeometry; class hknpAabbQuery; class hknpCdBody; class hknpCollisionQueryContext; class hknpCollisionQueryCollector; class hknpPointQuery; class hknpQueryFilterData; class hknpRayCastQuery; class hknpShapeCollector; class hknpShapeKeyMask; class hknpShapeQueryInfo; class __declspec(novtable) alignas(0x10) hknpShape : public hkReferencedObject // 00 { public: static constexpr auto RTTI{ RTTI::hknpShape }; static constexpr auto VTABLE{ VTABLE::hknpShape }; enum class FlagsEnum { kIsConvexShape = 1u << 0, kIsConvexPolytopeShape = 1u << 1, kIsCompositeShape = 1u << 2, kIsHeightFieldShape = 1u << 3, kUseSinglePointManifold = 1u << 4, kIsInteriorTriangle = 1u << 5, kSupportsCollisionsWithInteriorTriangles = 1u << 6, kUseNormalToFindSupportPlane = 1u << 7, kUseSmallFaceIndices = 1u << 8, kNoGetShapeKeysOnSPU = 1u << 9, kShapeNotSupportedOnSPU = 1u << 10, kIsTriangleOrQuadShape = 1u << 11, kIsQuadShape = 1u << 12 }; struct MassConfig { enum class Quality : std::int32_t { kLow = 0, kMedium = 1, kHigh = 2 }; Quality m_quality{ Quality::kHigh }; float m_inertiaFactor{ 1.5f }; float m_massOrNegativeDensity{ -1.0f }; }; static_assert(sizeof(MassConfig) == 0xC); struct BuildSurfaceGeometryConfig; struct GetShapeKeysConfig; struct SdfContactPoint; struct SdfQuery; // add virtual hknpShapeType::Enum GetType() const; // 04 virtual std::int32_t CalcSize() const; // 05 virtual void CalcAabb(const hkTransformf& a_transform, hkAabb& a_aabbOut) const; // 06 virtual hknpShapeSignals* GetMutationSignals(); // 07 virtual std::int32_t GetNumberOfSupportVertices() const; // 08 virtual const hkcdVertex* GetSupportVertices(hkcdVertex* a_vertexBuffer, std::int32_t a_bufferSize) const; // 09 virtual void GetSupportingVertex(const hkVector4f& a_direction, hkcdVertex* a_vertexBufferOut) const; // 0A virtual void ConvertVertexIdsToVertices(const std::uint8_t* a_ids, std::int32_t a_numIDs, hkcdVertex* a_verticesOut) const; // 0B virtual std::int32_t GetNumberOfFaces() const; // 0C virtual void GetFaceInfo(std::int32_t a_faceID, hkVector4f& a_planeOut, std::int32_t& a_minAngleOut) const; // 0D virtual std::int32_t GetFaceVertices(std::int32_t a_faceID, hkVector4f& a_planeOut, hkcdVertex* a_vertexBufferOut) const; // 0E virtual std::int32_t GetSupportingFace(hkVector4f& a_direction, hkVector4f& a_surfacePoint, const hkcdGsk::Cache* a_gskCache, bool a_useB, std::uint32_t a_prevFaceID, hkVector4f& a_planeOut, std::int32_t& a_minAngleOut) const; // 0F virtual float CalcMinAngleBetweenFaces() const; // 10 virtual void GetSignedDistances(const SdfQuery& a_query, SdfContactPoint* a_contactsOut) const; // 11 virtual std::int32_t GetSignedDistanceContacts(const hknpCdBody& a_queryBody, float a_maxDistance, std::int32_t a_vertexIdOffset, hkBlockStream::Writer& a_contactPointsOut) const; // 12 virtual hknpShapeKeyMask* CreateShapeKeyMask() const; // 13 virtual std::int32_t GetShapeKeys(std::uint32_t* a_shapeKeysOut, std::int32_t a_capacity, std::uint32_t a_previousKey, const GetShapeKeysConfig& a_config) const; // 14 virtual std::int32_t GetLeafShapes(const std::uint32_t* a_keys, std::int32_t a_numKeys, hknpShapeCollector* a_collector) const; // 15 virtual void CastRayImpl(hknpCollisionQueryContext* a_queryContext, const hknpRayCastQuery& a_query, const hknpQueryFilterData& a_targetShapeFilterData, const hknpShapeQueryInfo& a_targetShapeInfo, hknpCollisionQueryCollector* a_collector) const; // 16 virtual void QueryPointImpl(hknpCollisionQueryContext* a_queryContext, const hknpPointQuery& a_query, const hknpQueryFilterData& a_targetShapeFilterData, const hknpShapeQueryInfo& a_targetShapeInfo, hknpCollisionQueryCollector* a_collector) const; // 17 virtual void QueryAabbImpl(hknpCollisionQueryContext* a_queryContext, const hknpAabbQuery& a_query, const hknpShapeQueryInfo& a_queryShapeInfo, const hknpQueryFilterData& a_targetShapeFilterData, const hknpShapeQueryInfo& a_targetShapeInfo, hkArray* a_hits, hkAabb* a_nmpInOut) const; // 19 virtual void QueryAabbImpl(hknpCollisionQueryContext* a_queryContext, const hknpAabbQuery& a_query, const hknpShapeQueryInfo& a_queryShapeInfo, const hknpQueryFilterData& a_targetShapeFilterData, const hknpShapeQueryInfo& a_targetShapeInfo, hknpCollisionQueryCollector* a_collector, hkAabb* a_nmpInOut) const; // 18 virtual std::int32_t SelectLevelOfDetail(const hknpSolverInfo& a_si, const hknpCdBody& a_partner, std::int32_t a_previousLevelOfDetail) const; // 1A virtual void BuildMassProperties(const MassConfig& a_massConfig, hkDiagonalizedMassProperties& a_massPropertiesOut) const; // 1B virtual hkResult BuildSurfaceGeometry(const BuildSurfaceGeometryConfig& a_config, hkGeometry* a_geometryOut) const; // 1C virtual void CheckConsistency() const; // 1D // members hkFlags m_flags; // 0x10 std::uint8_t m_numShapeKeyBits; // 0x12 hkEnum m_dispatchType; // 0x13 float m_convexRadius; // 0x14 std::uintptr_t m_userData; // 0x18 hkRefCountedProperties* m_properties; // 0x20 std::byte m_pad28[0x08]; // 0x28 }; static_assert(sizeof(hknpShape) == 0x30); }