2016-03-27 11:49:47 +02:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
Copyright (C) 2015 the OpenMoHAA team
|
|
|
|
|
|
|
|
This file is part of OpenMoHAA source code.
|
|
|
|
|
|
|
|
OpenMoHAA source code is free software; you can redistribute it
|
|
|
|
and/or modify it under the terms of the GNU General Public License as
|
|
|
|
published by the Free Software Foundation; either version 2 of the License,
|
|
|
|
or (at your option) any later version.
|
|
|
|
|
|
|
|
OpenMoHAA source code is distributed in the hope that it will be
|
|
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with OpenMoHAA source code; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
// skeletor_internal.h : General skeletor internal structures
|
|
|
|
|
|
|
|
#ifndef __SKELETOR_INTERNAL__
|
|
|
|
#define __SKELETOR_INTERNAL__
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
|
|
class skelAnimStoreFrameList_c;
|
|
|
|
|
|
|
|
class skelBone_Base {
|
|
|
|
public:
|
|
|
|
qboolean m_isDirty;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
skelBone_Base *m_parent;
|
|
|
|
SkelMat4 m_cachedValue;
|
|
|
|
|
|
|
|
public:
|
|
|
|
float *m_controller;
|
|
|
|
|
|
|
|
public:
|
|
|
|
skelBone_Base();
|
2023-02-01 00:28:40 +01:00
|
|
|
virtual ~skelBone_Base();
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetTransform( const skelAnimStoreFrameList_c *frames );
|
|
|
|
virtual SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) = 0;
|
2016-03-27 11:49:47 +02:00
|
|
|
void SetParent( skelBone_Base *parent );
|
|
|
|
virtual void SetBaseValue( boneData_t *boneData );
|
|
|
|
virtual int GetChannelIndex( int num );
|
|
|
|
virtual skelBone_Base *GetBoneRef( int num );
|
|
|
|
static int GetNumChannels( boneType_t boneType );
|
|
|
|
static int GetNumBoneRefs( boneType_t boneType );
|
|
|
|
skelBone_Base *Parent() const;
|
|
|
|
bool OnGround( const skelAnimStoreFrameList_c *frames, float threshold );
|
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_World : public skelBone_Base {
|
|
|
|
public:
|
|
|
|
skelBone_World();
|
|
|
|
|
|
|
|
private:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_Zero : public skelBone_Base {
|
|
|
|
private:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_Rotation : public skelBone_Base {
|
|
|
|
protected:
|
|
|
|
SkelVec3 m_baseValue;
|
|
|
|
int m_quatChannel;
|
|
|
|
|
|
|
|
protected:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
void SetChannels( int num );
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *data ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_PosRot : public skelBone_Base {
|
|
|
|
protected:
|
|
|
|
int m_quatChannel;
|
|
|
|
int m_offsetChannel;
|
|
|
|
|
|
|
|
public:
|
|
|
|
protected:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
|
|
|
void SetChannels( int quatChannel, int offsetChannel );
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_Root : public skelBone_PosRot {
|
|
|
|
public:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_IKshoulder : public skelBone_Base {
|
|
|
|
public:
|
|
|
|
class skelBone_IKwrist *m_wrist;
|
|
|
|
float m_upperLength;
|
|
|
|
float m_lowerLength;
|
|
|
|
SkelVec3 m_baseValue;
|
|
|
|
float m_cosElbowAngle;
|
|
|
|
SkelVec3 m_wristPos;
|
|
|
|
SkelQuat m_wristAngle;
|
|
|
|
|
|
|
|
skelBone_IKshoulder();
|
|
|
|
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
void SetElbowValue( float elbowOffset );
|
|
|
|
void SetWristValue( float wristOffset );
|
|
|
|
void SetWristBone( skelBone_IKwrist *wrist );
|
|
|
|
float GetUpperLength();
|
|
|
|
float GetLowerLength();
|
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_IKelbow : public skelBone_Base {
|
|
|
|
public:
|
|
|
|
skelBone_IKshoulder *m_shoulder;
|
|
|
|
|
|
|
|
public:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
void SetBoneRefs( skelBone_IKshoulder *shoulder );
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_IKwrist : public skelBone_Base {
|
|
|
|
public:
|
|
|
|
skelBone_IKshoulder *m_shoulder;
|
|
|
|
int m_quatChannel;
|
|
|
|
int m_offsetChannel;
|
|
|
|
|
|
|
|
public:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frame ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
void SetChannels( int quatChannel, int offsetChannel );
|
|
|
|
void SetBoneRefs( skelBone_IKshoulder *shoulder );
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_AvRot : public skelBone_Base {
|
|
|
|
public:
|
|
|
|
SkelVec3 m_basePos;
|
|
|
|
SkelQuat m_cachedQuat;
|
|
|
|
skelBone_Base *m_reference1;
|
|
|
|
skelBone_Base *m_reference2;
|
|
|
|
float m_bone2weight;
|
|
|
|
|
|
|
|
public:
|
|
|
|
skelBone_AvRot();
|
|
|
|
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
void SetBoneRefs( skelBone_Base *ref1, skelBone_Base *ref2 );
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_HoseRot : public skelBone_Base {
|
|
|
|
public:
|
|
|
|
SkelVec3 m_basePos;
|
|
|
|
SkelQuat m_cachedQuat;
|
|
|
|
skelBone_Base *m_target;
|
|
|
|
float m_bendRatio;
|
|
|
|
float m_bendMax;
|
|
|
|
float m_spinRatio;
|
|
|
|
|
|
|
|
public:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
|
|
|
SkelMat4 &GetDirtyTransform( SkelMat4& myParentTM, SkelMat4& targetTM );
|
2016-03-27 11:49:47 +02:00
|
|
|
void SetBoneRefs( skelBone_Base *ref );
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
|
|
|
int GetChannelIndex( int num ) override;
|
|
|
|
skelBone_Base *GetBoneRef( int num ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_HoseRotBoth : public skelBone_HoseRot {
|
|
|
|
public:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class skelBone_HoseRotParent : public skelBone_HoseRot {
|
|
|
|
public:
|
2023-01-30 00:23:47 +01:00
|
|
|
SkelMat4 &GetDirtyTransform( const skelAnimStoreFrameList_c *frames ) override;
|
2023-02-01 00:28:40 +01:00
|
|
|
void SetBaseValue( boneData_t *boneData ) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
typedef void *skelBone_Base;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef char skelChannelName_t[ 32 ];
|
|
|
|
|
|
|
|
#endif // __SKELETOR_INTERNAL__
|