openmohaa/code/skeletor/skeletor_internal.h

232 lines
7.1 KiB
C
Raw Permalink Normal View History

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];