OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
skeletor.h
1/*
2===========================================================================
3Copyright (C) 2023 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// skeletor.h : General skeletor structures
24
25#pragma once
26
27#include "../tiki/tiki_shared.h"
28#include "SkelVec3.h"
29#include "SkelVec4.h"
30#include "SkelMat3.h"
31#include "SkelMat4.h"
32#include "SkelQuat.h"
33#include "skeletor_animation_file_format.h"
34#include "skeletor_model_file_format.h"
35#include "skeletor_name_lists.h"
36#include "skeletor_internal.h"
37
38#define MAX_SKEL_BLEND_MOVEMENT_FRAMES 32
39#define MAX_SKEL_BLEND_ACTION_FRAMES 32
40#define MAX_SKEL_BLEND_FRAMES (MAX_SKEL_BLEND_MOVEMENT_FRAMES + MAX_SKEL_BLEND_ACTION_FRAMES)
41
42typedef struct skelAnimFrame_s {
43 float radius;
44 SkelVec3 bounds[2];
45 SkelMat4 bones[1];
46} skelAnimFrame_t;
47
48typedef struct {
49 float seconds;
51
52typedef struct {
53 float weight;
54 skelAnimDataGameHeader_t *pAnimationData;
57
58typedef struct {
59 float weight;
60 skelAnimDataGameHeader_t *pAnimationData;
61 int frame;
63
64#ifdef __cplusplus
65
66template<typename T>
67class Container;
68
69# include "container.h"
70
71class skelAnimStoreFrameList_c
72{
73public:
74 short int numMovementFrames;
75 short int numActionFrames;
76 float actionWeight;
77 skanBlendInfo m_blendInfo[MAX_SKEL_BLEND_FRAMES];
78
79public:
80 SkelQuat GetSlerpValue(int globalChannelNum) const;
81 void GetLerpValue3(int globalChannelNum, SkelVec3 *outVec) const;
82};
83
84class skeletor_c
85{
86public:
87 dtiki_t *m_Tiki;
88 static ChannelNameTable m_boneNames;
89 static ChannelNameTable m_channelNames;
90 static skelBone_World m_worldBone;
91
92private:
93 SkelVec3 m_frameBounds[2];
94 float m_frameRadius;
95 skelAnimStoreFrameList_c m_frameList;
96 short int m_targetLookLeft;
97 short int m_targetLookRight;
98 short int m_targetLookUp;
99 short int m_targetLookDown;
100 short int m_targetLookCrossed;
101 short int m_targetBlink;
102 short int m_timeNextBlink;
103 short int m_headBoneIndex;
104 vec3_t m_eyeTargetPos;
105 vec3_t m_eyePrevTargetPos;
106 class skelBone_Base *m_leftFoot;
107 class skelBone_Base *m_rightFoot;
108 skelChannelList_c m_morphTargetList;
109 class skelBone_Base **m_bone;
110
111public:
112 skeletor_c(dtiki_t *tiki);
113 ~skeletor_c();
114
115 static skelAnimDataGameHeader_t *
116 ConvertSkelFileToGame(skelAnimDataFileHeader_t *pHeader, int iBuffLength, const char *path);
117 static void
118 SaveProcessedAnim(skelAnimDataGameHeader_t *enAnim, const char *path, skelAnimDataFileHeader_t *pHeader);
119 static skelAnimDataGameHeader_t *LoadProcessedAnim(const char *path, void *buffer, int len, const char *name);
120 static skelAnimDataGameHeader_t *LoadProcessedAnimEx(const char *path, void *buffer, int len, const char *name);
121 void PrintBoneCacheList();
122 void PrintBoneList();
123 void LoadMorphTargetNames(skelHeaderGame_t *modelHeader);
124 void GetFrame(skelAnimFrame_t *newFrame);
125 int GetMorphWeightFrame(int *data);
126 SkelMat4 & GetBoneFrame(int boneIndex) const;
127 void GetFrameBounds(SkelVec3 *, SkelVec3 *);
128 float GetModelLODRadius();
129 bool IsBoneOnGround(int boneIndex, float threshold);
130 int GetMorphWeightFrame(int index, float time, int *data);
131 qboolean LoadSKB(const char *);
132 float GetRadius();
133 float GetCentroidRadius(float *centroid);
134 void SetPose(const frameInfo_t *frameInfo, const int *contIndices, const vec4_t *contValues, float actionWeight);
135 void SetEyeTargetPos(const float *pEyeTargetPos);
136 int GetBoneParent(int boneIndex);
137 static class ChannelNameTable* ChannelNames();
138
139private:
140 void Init();
141 SkelMat4 *BoneTransformation(int, int *, float (*)[4]);
142};
143
144#endif
145
146#ifdef __cplusplus
147extern "C" {
148#endif
149
150 //
151 // skeletor.cpp
152 //
153
154 void ConvertToRotationName(const char *boneName, char *rotChannelName);
155 void ConvertToPositionName(const char *boneName, char *posChannelName);
156 void ConvertToFKRotationName(const char *boneName, char *rotChannelName);
157 void ConvertToFKPositionName(const char *boneName, char *rotChannelName);
158 void AddToBounds(SkelVec3 *bounds, SkelVec3 *newBounds);
159#ifdef __cplusplus
160 void BoneGetFrames(
161 skelHeaderGame_t *skelmodel,
162 skelAnimDataGameHeader_t *animData,
163 skelChannelList_c *boneList,
164 int boneNum,
165 Container<skanAnimFrame>& outFrames
166 );
167 void TIKI_GetSkelAnimFrameInternal2(
168 dtiki_t *tiki,
169 skelBoneCache_t *bones,
170 skelAnimStoreFrameList_c *frameList,
171 float *radius,
172 vec3_t *mins,
173 vec3_t *maxes
174 );
175 void SkeletorGetAnimFrame2(
176 skelHeaderGame_t *skelmodel,
177 skelChannelList_c *boneList,
178 skelBoneCache_t *bones,
179 skelAnimStoreFrameList_c *frameList,
180 float *radius,
181 vec3_t *mins,
182 vec3_t *maxes
183 );
184#endif
185 void SkeletorGetAnimFrame(
186 skelHeaderGame_t *skelmodel,
187 skelAnimDataGameHeader_t *animData,
188 skelChannelList_c *boneList,
189 skelBoneCache_t *bones,
190 int frame,
191 float *radius,
192 vec3_t *mins,
193 vec3_t *maxes
194 );
195 void TIKI_GetSkelAnimFrame(dtiki_t *tiki, skelBoneCache_t *bones, float *radius, vec3_t *mins, vec3_t *maxes);
196 void TIKI_GetSkelAnimFrame2(
197 dtiki_t *tiki, skelBoneCache_t *bones, int anim, int frame, float *radius, vec3_t *mins, vec3_t *maxes
198 );
199 void TIKI_GetSkelAnimFrameInternal(
200 dtiki_t *tiki,
201 skelBoneCache_t *bones,
202 skelAnimDataGameHeader_t *animData,
203 int frame,
204 float *radius,
205 vec3_t *mins,
206 vec3_t *maxes
207 );
208
209 //
210 // skeletor_imports.cpp
211 //
212
213 void Skel_DPrintf(const char *fmt, ...);
214
215#ifndef _DEBUG_MEM
216 void Skel_Free(void *ptr);
217 void *Skel_Alloc(size_t size);
218#else
219# define Skel_Free(ptr) free(ptr)
220# define Skel_Alloc(size) malloc(size)
221#endif
222
223 void Skel_FreeFile(void *buffer);
224 int Skel_ReadFileEx(const char *qpath, void **buffer, qboolean quiet);
225
226 //
227 // skeletor_utilities.cpp
228 //
229
230 void SKEL_Message(const char *fmt, ...);
231 void SKEL_Warning(const char *fmt, ...);
232 void SKEL_Error(const char *fmt, ...);
233 void Skel_ExtractFilePath(const char *path, char *dest);
234 void Skel_ExtractFileBase(const char *path, char *dest);
235 void Skel_ExtractFileExtension(const char *path, char *dest);
236 //const char *Skel_ExtractFileExtension( const char *in );
237 void Skel_ExtractFileName(const char *path, char *dest);
238 int FileLength(FILE *pFile);
239
240 //
241 // skeletorbones.cpp
242 //
243
244 void SkeletorLoadBoneFromBuffer(skelChannelList_c *boneList, boneData_t *boneData, skelBone_Base **bone);
245 void SkeletorLoadBonesFromBuffer(skelChannelList_c *boneList, skelHeaderGame_t *buffer, skelBone_Base **bone);
246
247#ifdef __cplusplus
248}
249#endif
Definition container.h:85
Definition SkelMat4.h:355
Definition SkelQuat.h:274
Definition SkelVec3.h:197
Definition skeletor.h:58
Definition skeletor.h:52
Definition skeletor.h:42
Definition skeletor_animation_file_format.h:51
Definition skeletor.h:48
Definition tiki_shared.h:403