2016-03-27 11:49:47 +02:00
|
|
|
/*
|
|
|
|
===========================================================================
|
2023-11-06 17:58:58 +01:00
|
|
|
Copyright (C) 2023 the OpenMoHAA team
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
#pragma once
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
|
|
class skelAnimStoreFrameList_c;
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
qboolean m_isDirty;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
protected:
|
2023-11-06 17:58:58 +01:00
|
|
|
skelBone_Base *m_parent;
|
|
|
|
SkelMat4 m_cachedValue;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
float *m_controller;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
skelBone_Base();
|
|
|
|
virtual ~skelBone_Base();
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetTransform(const skelAnimStoreFrameList_c *frames);
|
|
|
|
virtual SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) = 0;
|
|
|
|
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);
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_World : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
skelBone_World();
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
private:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_Zero : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
private:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_Rotation : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
protected:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelVec3 m_baseValue;
|
|
|
|
int m_quatChannel;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
protected:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
void SetChannels(int num);
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_PosRot : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
protected:
|
2023-11-06 17:58:58 +01:00
|
|
|
int m_quatChannel;
|
|
|
|
int m_offsetChannel;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
|
2016-03-27 11:49:47 +02:00
|
|
|
protected:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
void SetChannels(int quatChannel, int offsetChannel);
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_Root : public skelBone_PosRot
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01: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();
|
|
|
|
|
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
void SetBaseValue(boneData_t *boneData) override;
|
|
|
|
int GetChannelIndex(int num) override;
|
|
|
|
skelBone_Base *GetBoneRef(int num) override;
|
|
|
|
void SetElbowValue(float elbowOffset);
|
|
|
|
void SetWristValue(float wristOffset);
|
|
|
|
void SetWristBone(skelBone_IKwrist *wrist);
|
|
|
|
float GetUpperLength();
|
|
|
|
float GetLowerLength();
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_IKelbow : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
skelBone_IKshoulder *m_shoulder;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
void SetBoneRefs(skelBone_IKshoulder *shoulder);
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_IKwrist : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
skelBone_IKshoulder *m_shoulder;
|
|
|
|
int m_quatChannel;
|
|
|
|
int m_offsetChannel;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frame) override;
|
|
|
|
void SetChannels(int quatChannel, int offsetChannel);
|
|
|
|
void SetBoneRefs(skelBone_IKshoulder *shoulder);
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_AvRot : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelVec3 m_basePos;
|
|
|
|
SkelQuat m_cachedQuat;
|
|
|
|
skelBone_Base *m_reference1;
|
|
|
|
skelBone_Base *m_reference2;
|
|
|
|
float m_bone2weight;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
skelBone_AvRot();
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
void SetBoneRefs(skelBone_Base *ref1, skelBone_Base *ref2);
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_HoseRot : public skelBone_Base
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelVec3 m_basePos;
|
|
|
|
SkelQuat m_cachedQuat;
|
|
|
|
skelBone_Base *m_target;
|
|
|
|
float m_bendRatio;
|
|
|
|
float m_bendMax;
|
|
|
|
float m_spinRatio;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4 & GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
SkelMat4 & GetDirtyTransform(SkelMat4 &myParentTM, SkelMat4 &targetTM);
|
|
|
|
void SetBoneRefs(skelBone_Base *ref);
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_HoseRotBoth : public skelBone_HoseRot
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
void SetBaseValue(boneData_t *boneData) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
class skelBone_HoseRotParent : public skelBone_HoseRot
|
|
|
|
{
|
2016-03-27 11:49:47 +02:00
|
|
|
public:
|
2023-11-06 17:58:58 +01:00
|
|
|
SkelMat4& GetDirtyTransform(const skelAnimStoreFrameList_c *frames) override;
|
|
|
|
void SetBaseValue(boneData_t *boneData) override;
|
2016-03-27 11:49:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
typedef void *skelBone_Base;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2023-11-06 17:58:58 +01:00
|
|
|
typedef char skelChannelName_t[32];
|