mirror of https://github.com/zeldaret/botw.git
Havok: Add hkpCylinderShape
This commit is contained in:
parent
52efb18af7
commit
159bc09c15
|
@ -116,6 +116,7 @@ add_library(hkStubs OBJECT
|
|||
Havok/Physics2012/Collide/Shape/Convex/Box/hkpBoxShape.h
|
||||
Havok/Physics2012/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h
|
||||
Havok/Physics2012/Collide/Shape/Convex/ConvexTransform/hkpConvexTransformShape.h
|
||||
Havok/Physics2012/Collide/Shape/Convex/Cylinder/hkpCylinderShape.h
|
||||
Havok/Physics2012/Collide/Shape/HeightField/hkpHeightFieldShape.h
|
||||
Havok/Physics2012/Collide/Shape/HeightField/hkpSphereRepShape.h
|
||||
Havok/Physics2012/Collide/Shape/HeightField/Plane/hkpPlaneShape.h
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
#pragma once
|
||||
|
||||
#include <Havok/Common/Base/hkBase.h>
|
||||
#include <Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h>
|
||||
|
||||
class hkpCylinderShape : public hkpConvexShape {
|
||||
public:
|
||||
HK_DECLARE_CLASS_ALLOCATOR(hkpCylinderShape)
|
||||
HK_DECLARE_REFLECTION()
|
||||
HKCD_DECLARE_SHAPE_TYPE(hkcdShapeType::CYLINDER)
|
||||
|
||||
enum VertexIdEncoding {
|
||||
VERTEX_ID_ENCODING_IS_BASE_A_SHIFT = 7,
|
||||
VERTEX_ID_ENCODING_SIN_SIGN_SHIFT = 6,
|
||||
VERTEX_ID_ENCODING_COS_SIGN_SHIFT = 5,
|
||||
VERTEX_ID_ENCODING_IS_SIN_LESSER_SHIFT = 4,
|
||||
VERTEX_ID_ENCODING_VALUE_MASK = 0x0f
|
||||
};
|
||||
|
||||
HK_FORCE_INLINE hkpCylinderShape() {}
|
||||
|
||||
hkpCylinderShape(const hkVector4& vertexA, const hkVector4& vertexB, hkReal cylinderRadius,
|
||||
hkReal paddingRadius = hkConvexShapeDefaultRadius);
|
||||
|
||||
explicit hkpCylinderShape(hkFinishLoadedObjectFlag flag);
|
||||
|
||||
void getSupportingVertex(hkVector4Parameter direction,
|
||||
hkcdVertex& supportingVertexOut) const override;
|
||||
void convertVertexIdsToVertices(const hkpVertexId* ids, int numIds,
|
||||
hkcdVertex* verticesOut) const override;
|
||||
void getCentre(hkVector4& centreOut) const override;
|
||||
HK_FORCE_INLINE int getNumCollisionSpheres() const override;
|
||||
const hkSphere* getCollisionSpheres(hkSphere* sphereBuffer) const override;
|
||||
void getAabb(const hkTransform& localToWorld, hkReal tolerance, hkAabb& out) const override;
|
||||
hkBool castRay(const hkpShapeRayCastInput& input,
|
||||
hkpShapeRayCastOutput& results) const override;
|
||||
|
||||
inline const hkVector4* getVertices() const;
|
||||
|
||||
HK_FORCE_INLINE const hkVector4& getVertex(int i) const;
|
||||
template <int I>
|
||||
HK_FORCE_INLINE const hkVector4& getVertex() const;
|
||||
|
||||
HK_FORCE_INLINE void setVertex(int i, const hkVector4& position);
|
||||
template <int I>
|
||||
HK_FORCE_INLINE void setVertex(hkVector4Parameter position);
|
||||
|
||||
hkReal getCylinderRadius() const;
|
||||
void setCylinderRadius(hkReal radius);
|
||||
|
||||
hkReal getCylinderBaseRadiusFactorForHeightfieldCollisions() {
|
||||
return m_cylBaseRadiusFactorForHeightFieldCollisions;
|
||||
}
|
||||
|
||||
inline void setCylinderBaseRadiusFactorForHeightfieldCollisions(hkReal radiusFactor) {
|
||||
m_cylBaseRadiusFactorForHeightFieldCollisions = radiusFactor;
|
||||
}
|
||||
|
||||
void presetPerpendicularVector();
|
||||
|
||||
static void setNumberOfVirtualSideSegments(int numSegments);
|
||||
|
||||
void getFirstVertex(hkVector4& v) const override;
|
||||
|
||||
HK_FORCE_INLINE static void initRoundUpThreshold();
|
||||
|
||||
protected:
|
||||
hkReal m_cylRadius;
|
||||
hkReal m_cylBaseRadiusFactorForHeightFieldCollisions;
|
||||
hkVector4 m_vertexA;
|
||||
hkVector4 m_vertexB;
|
||||
hkVector4 m_perpendicular1;
|
||||
hkVector4 m_perpendicular2;
|
||||
|
||||
private:
|
||||
void decodeVertexId(hkpVertexId code, hkVector4& result) const;
|
||||
|
||||
static hkReal s_virtualTesselationParameter;
|
||||
static hkReal s_virtualTesselationParameterInv;
|
||||
static hkReal s_intRoundUpThreshold;
|
||||
};
|
||||
|
||||
inline int hkpCylinderShape::getNumCollisionSpheres() const {
|
||||
return 16 + 2;
|
||||
}
|
||||
|
||||
inline const hkVector4* hkpCylinderShape::getVertices() const {
|
||||
return &m_vertexA;
|
||||
}
|
||||
|
||||
inline const hkVector4& hkpCylinderShape::getVertex(int i) const {
|
||||
return getVertices()[i];
|
||||
}
|
||||
|
||||
template <int I>
|
||||
inline const hkVector4& hkpCylinderShape::getVertex() const {
|
||||
static_assert(I == 0 || I == 1, "invalid index");
|
||||
return getVertices()[I];
|
||||
}
|
||||
|
||||
inline void hkpCylinderShape::setVertex(int i, const hkVector4& position) {
|
||||
(&m_vertexA)[i] = position;
|
||||
}
|
||||
|
||||
template <int I>
|
||||
inline void hkpCylinderShape::setVertex(const hkVector4f& position) {
|
||||
static_assert(I == 0 || I == 1, "invalid index");
|
||||
(&m_vertexA)[I] = position;
|
||||
}
|
||||
|
||||
inline void hkpCylinderShape::initRoundUpThreshold() {
|
||||
if (s_intRoundUpThreshold < 0.0f) {
|
||||
for (hkReal value = 0.0f; value < 1.1f; value += 0.01f) {
|
||||
if (hkMath::hkToIntFast(value) != 0) {
|
||||
s_intRoundUpThreshold = 1.0f - value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
s_intRoundUpThreshold = 0.0f;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue