125 lines
11 KiB
C++
125 lines
11 KiB
C++
#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, class>
|
|
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<SdfContactPoint>::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<std::uint32_t, hkContainerHeapAllocator>* 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<FlagsEnum, std::uint16_t> m_flags; // 0x10
|
|
std::uint8_t m_numShapeKeyBits; // 0x12
|
|
hkEnum<hknpCollisionDispatchType::Enum, std::uint8_t> 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);
|
|
}
|