mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 03:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			357 lines
		
	
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			357 lines
		
	
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef OPENMW_COMPONENTS_NIF_PHYSICS_HPP
 | 
						|
#define OPENMW_COMPONENTS_NIF_PHYSICS_HPP
 | 
						|
 | 
						|
#include "record.hpp"
 | 
						|
#include "recordptr.hpp"
 | 
						|
 | 
						|
#include <osg/Quat>
 | 
						|
#include <osg/Vec3f>
 | 
						|
#include <osg/Vec4f>
 | 
						|
 | 
						|
#include <cstdint>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
// This header contains certain record definitions
 | 
						|
// specific to Bethesda implementation of Havok physics
 | 
						|
namespace Nif
 | 
						|
{
 | 
						|
 | 
						|
    class NIFStream;
 | 
						|
    class Reader;
 | 
						|
 | 
						|
    /// Non-record data types
 | 
						|
 | 
						|
    struct bhkWorldObjCInfoProperty
 | 
						|
    {
 | 
						|
        unsigned int mData;
 | 
						|
        unsigned int mSize;
 | 
						|
        unsigned int mCapacityAndFlags;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    enum class BroadPhaseType : uint8_t
 | 
						|
    {
 | 
						|
        BroadPhase_Invalid = 0,
 | 
						|
        BroadPhase_Entity = 1,
 | 
						|
        BroadPhase_Phantom = 2,
 | 
						|
        BroadPhase_Border = 3
 | 
						|
    };
 | 
						|
 | 
						|
    struct bhkWorldObjectCInfo
 | 
						|
    {
 | 
						|
        BroadPhaseType mPhaseType;
 | 
						|
        bhkWorldObjCInfoProperty mProperty;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct HavokMaterial
 | 
						|
    {
 | 
						|
        unsigned int mMaterial;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct HavokFilter
 | 
						|
    {
 | 
						|
        unsigned char mLayer;
 | 
						|
        unsigned char mFlags;
 | 
						|
        unsigned short mGroup;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct hkSubPartData
 | 
						|
    {
 | 
						|
        HavokMaterial mHavokMaterial;
 | 
						|
        unsigned int mNumVertices;
 | 
						|
        HavokFilter mHavokFilter;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    enum class hkResponseType : uint8_t
 | 
						|
    {
 | 
						|
        Response_Invalid = 0,
 | 
						|
        Response_SimpleContact = 1,
 | 
						|
        Response_Reporting = 2,
 | 
						|
        Response_None = 3
 | 
						|
    };
 | 
						|
 | 
						|
    struct bhkEntityCInfo
 | 
						|
    {
 | 
						|
        hkResponseType mResponseType;
 | 
						|
        unsigned short mProcessContactDelay;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct hkpMoppCode
 | 
						|
    {
 | 
						|
        osg::Vec4f mOffset;
 | 
						|
        std::vector<char> mData;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct TriangleData
 | 
						|
    {
 | 
						|
        unsigned short mTriangle[3];
 | 
						|
        unsigned short mWeldingInfo;
 | 
						|
        osg::Vec3f mNormal;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    enum class hkMotionType : uint8_t
 | 
						|
    {
 | 
						|
        Motion_Invalid = 0,
 | 
						|
        Motion_Dynamic = 1,
 | 
						|
        Motion_SphereInertia = 2,
 | 
						|
        Motion_SphereStabilized = 3,
 | 
						|
        Motion_BoxInertia = 4,
 | 
						|
        Motion_BoxStabilized = 5,
 | 
						|
        Motion_Keyframed = 6,
 | 
						|
        Motion_Fixed = 7,
 | 
						|
        Motion_ThinBox = 8,
 | 
						|
        Motion_Character = 9
 | 
						|
    };
 | 
						|
 | 
						|
    enum class hkDeactivatorType : uint8_t
 | 
						|
    {
 | 
						|
        Deactivator_Invalid = 0,
 | 
						|
        Deactivator_Never = 1,
 | 
						|
        Deactivator_Spatial = 2
 | 
						|
    };
 | 
						|
 | 
						|
    enum class hkSolverDeactivation : uint8_t
 | 
						|
    {
 | 
						|
        SolverDeactivation_Invalid = 0,
 | 
						|
        SolverDeactivation_Off = 1,
 | 
						|
        SolverDeactivation_Low = 2,
 | 
						|
        SolverDeactivation_Medium = 3,
 | 
						|
        SolverDeactivation_High = 4,
 | 
						|
        SolverDeactivation_Max = 5
 | 
						|
    };
 | 
						|
 | 
						|
    enum class hkQualityType : uint8_t
 | 
						|
    {
 | 
						|
        Quality_Invalid = 0,
 | 
						|
        Quality_Fixed = 1,
 | 
						|
        Quality_Keyframed = 2,
 | 
						|
        Quality_Debris = 3,
 | 
						|
        Quality_Moving = 4,
 | 
						|
        Quality_Critical = 5,
 | 
						|
        Quality_Bullet = 6,
 | 
						|
        Quality_User = 7,
 | 
						|
        Quality_Character = 8,
 | 
						|
        Quality_KeyframedReport = 9
 | 
						|
    };
 | 
						|
 | 
						|
    struct bhkRigidBodyCInfo
 | 
						|
    {
 | 
						|
        HavokFilter mHavokFilter;
 | 
						|
        hkResponseType mResponseType;
 | 
						|
        unsigned short mProcessContactDelay;
 | 
						|
        osg::Vec4f mTranslation;
 | 
						|
        osg::Quat mRotation;
 | 
						|
        osg::Vec4f mLinearVelocity;
 | 
						|
        osg::Vec4f mAngularVelocity;
 | 
						|
        float mInertiaTensor[3][4];
 | 
						|
        osg::Vec4f mCenter;
 | 
						|
        float mMass;
 | 
						|
        float mLinearDamping;
 | 
						|
        float mAngularDamping;
 | 
						|
        float mTimeFactor{ 1.f };
 | 
						|
        float mGravityFactor{ 1.f };
 | 
						|
        float mFriction;
 | 
						|
        float mRollingFrictionMult;
 | 
						|
        float mRestitution;
 | 
						|
        float mMaxLinearVelocity;
 | 
						|
        float mMaxAngularVelocity;
 | 
						|
        float mPenetrationDepth;
 | 
						|
        hkMotionType mMotionType;
 | 
						|
        hkDeactivatorType mDeactivatorType;
 | 
						|
        bool mEnableDeactivation{ true };
 | 
						|
        hkSolverDeactivation mSolverDeactivation;
 | 
						|
        hkQualityType mQualityType;
 | 
						|
        unsigned char mAutoRemoveLevel;
 | 
						|
        unsigned char mResponseModifierFlags;
 | 
						|
        unsigned char mNumContactPointShapeKeys;
 | 
						|
        bool mForceCollidedOntoPPU;
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    /// Record types
 | 
						|
 | 
						|
    // Abstract Bethesda Havok object
 | 
						|
    struct bhkRefObject : public Record
 | 
						|
    {
 | 
						|
    };
 | 
						|
 | 
						|
    // Abstract serializable Bethesda Havok object
 | 
						|
    struct bhkSerializable : public bhkRefObject
 | 
						|
    {
 | 
						|
    };
 | 
						|
 | 
						|
    // Abstract narrowphase collision detection object
 | 
						|
    struct bhkShape : public bhkSerializable
 | 
						|
    {
 | 
						|
    };
 | 
						|
 | 
						|
    // Abstract bhkShape collection
 | 
						|
    struct bhkShapeCollection : public bhkShape
 | 
						|
    {
 | 
						|
    };
 | 
						|
 | 
						|
    // Generic collision object
 | 
						|
    struct NiCollisionObject : public Record
 | 
						|
    {
 | 
						|
        // The node that references this object
 | 
						|
        NodePtr mTarget;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override { mTarget.read(nif); }
 | 
						|
        void post(Reader& nif) override { mTarget.post(nif); }
 | 
						|
    };
 | 
						|
 | 
						|
    // Bethesda Havok-specific collision object
 | 
						|
    struct bhkCollisionObject : public NiCollisionObject
 | 
						|
    {
 | 
						|
        unsigned short mFlags;
 | 
						|
        bhkWorldObjectPtr mBody;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override
 | 
						|
        {
 | 
						|
            NiCollisionObject::post(nif);
 | 
						|
            mBody.post(nif);
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    // Abstract Havok shape info record
 | 
						|
    struct bhkWorldObject : public bhkSerializable
 | 
						|
    {
 | 
						|
        bhkShapePtr mShape;
 | 
						|
        HavokFilter mHavokFilter;
 | 
						|
        bhkWorldObjectCInfo mWorldObjectInfo;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // Abstract
 | 
						|
    struct bhkEntity : public bhkWorldObject
 | 
						|
    {
 | 
						|
        bhkEntityCInfo mInfo;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // Bethesda extension of hkpBvTreeShape
 | 
						|
    // hkpBvTreeShape adds a bounding volume tree to an hkpShapeCollection
 | 
						|
    struct bhkBvTreeShape : public bhkShape
 | 
						|
    {
 | 
						|
        bhkShapePtr mShape;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // bhkBvTreeShape with Havok MOPP code
 | 
						|
    struct bhkMoppBvTreeShape : public bhkBvTreeShape
 | 
						|
    {
 | 
						|
        float mScale;
 | 
						|
        hkpMoppCode mMopp;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // Bethesda triangle strip-based Havok shape collection
 | 
						|
    struct bhkNiTriStripsShape : public bhkShape
 | 
						|
    {
 | 
						|
        HavokMaterial mHavokMaterial;
 | 
						|
        float mRadius;
 | 
						|
        unsigned int mGrowBy;
 | 
						|
        osg::Vec4f mScale{ 1.f, 1.f, 1.f, 0.f };
 | 
						|
        NiTriStripsDataList mData;
 | 
						|
        std::vector<unsigned int> mFilters;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // Bethesda packed triangle strip-based Havok shape collection
 | 
						|
    struct bhkPackedNiTriStripsShape : public bhkShapeCollection
 | 
						|
    {
 | 
						|
        std::vector<hkSubPartData> mSubshapes;
 | 
						|
        unsigned int mUserData;
 | 
						|
        float mRadius;
 | 
						|
        osg::Vec4f mScale;
 | 
						|
        hkPackedNiTriStripsDataPtr mData;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // bhkPackedNiTriStripsShape data block
 | 
						|
    struct hkPackedNiTriStripsData : public bhkShapeCollection
 | 
						|
    {
 | 
						|
        std::vector<TriangleData> mTriangles;
 | 
						|
        std::vector<osg::Vec3f> mVertices;
 | 
						|
        std::vector<hkSubPartData> mSubshapes;
 | 
						|
        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<osg::Vec4f> mVertices;
 | 
						|
        std::vector<osg::Vec4f> mNormals;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // A box
 | 
						|
    struct bhkBoxShape : public bhkConvexShape
 | 
						|
    {
 | 
						|
        osg::Vec3f mExtents;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // A capsule
 | 
						|
    struct bhkCapsuleShape : public bhkConvexShape
 | 
						|
    {
 | 
						|
        osg::Vec3f mPoint1, mPoint2;
 | 
						|
        float mRadius1, mRadius2;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    // A sphere
 | 
						|
    using bhkSphereShape = bhkConvexShape;
 | 
						|
 | 
						|
    // A list of shapes
 | 
						|
    struct bhkListShape : public bhkShapeCollection
 | 
						|
    {
 | 
						|
        bhkShapeList mSubshapes;
 | 
						|
        HavokMaterial mHavokMaterial;
 | 
						|
        bhkWorldObjCInfoProperty mChildShapeProperty;
 | 
						|
        bhkWorldObjCInfoProperty mChildFilterProperty;
 | 
						|
        std::vector<HavokFilter> mHavokFilters;
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct bhkRigidBody : public bhkEntity
 | 
						|
    {
 | 
						|
        bhkRigidBodyCInfo mInfo;
 | 
						|
        bhkSerializableList mConstraints;
 | 
						|
        unsigned int mBodyFlags;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
} // Namespace
 | 
						|
#endif
 |