Tiny3D
Loading...
Searching...
No Matches
t3dskeleton.h
Go to the documentation of this file.
1
6#ifndef TINY3D_T3DSKELETON_H
7#define TINY3D_T3DSKELETON_H
8
9#include "t3dmodel.h"
10
11#ifdef __cplusplus
12extern "C"
13{
14#endif
15
21typedef struct {
22 T3DMat4 matrix;
23 T3DVec3 scale;
24 T3DQuat rotation;
25 T3DVec3 position;
26 int32_t hasChanged;
27} T3DBone;
28
33typedef struct {
34 T3DBone* bones;
35 T3DMat4FP* boneMatricesFP; // fixed point matrix, used for rendering
36 uint8_t bufferCount; // number of matrices buffers
37 uint8_t currentBufferIdx;
38 const T3DChunkSkeleton* skeletonRef; // reference to the model, defines skeleton structure
40
51T3DSkeleton t3d_skeleton_create_buffered(const T3DModel *model, int bufferCount);
52
58static inline T3DSkeleton t3d_skeleton_create(const T3DModel *model) {
59 return t3d_skeleton_create_buffered(model, 1);
60}
61
67static inline void t3d_skeleton_use(const T3DSkeleton *skel) {
68 if(skel->bufferCount > 1) {
69 void* mat = skel->boneMatricesFP + skel->currentBufferIdx * skel->skeletonRef->boneCount;
70 t3d_segment_set(T3D_SEGMENT_SKELETON, mat);
71 }
72}
73
81T3DSkeleton t3d_skeleton_clone(const T3DSkeleton *skel, bool useMatrices);
82
89void t3d_skeleton_reset(T3DSkeleton *skeleton);
90
99void t3d_skeleton_blend(const T3DSkeleton *skelRes, const T3DSkeleton *skelA, const T3DSkeleton *skelB, float factor);
100
107void t3d_skeleton_update(T3DSkeleton *skeleton);
108
114void t3d_skeleton_destroy(T3DSkeleton* skeleton);
115
123int t3d_skeleton_find_bone(T3DSkeleton* skeleton, const char* name);
124
132static inline T3DVec3 t3d_skeleton_get_bone_pos_model_space(const T3DSkeleton *skeleton, int boneIdx){
133 assertf(boneIdx >= 0 && boneIdx < skeleton->skeletonRef->boneCount, "Bone index is out of bounds, idx: %i, boneCount: %i", boneIdx, skeleton->skeletonRef->boneCount);
134 // Access the bone at the given index
135 const T3DBone *bone = &skeleton->bones[boneIdx];
136
137 // Extract the position from the matrix.
138 return (T3DVec3) {{
139 bone->matrix.m[3][0],
140 bone->matrix.m[3][1],
141 bone->matrix.m[3][2]
142 }};
143}
144
150static inline void t3d_model_draw_skinned(const T3DModel* model, const T3DSkeleton* skeleton) {
151 t3d_model_draw_custom(model, (T3DModelDrawConf){
152 .userData = NULL,
153 .tileCb = NULL,
154 .filterCb = NULL,
155 .matrices = skeleton->bufferCount == 1
156 ? skeleton->boneMatricesFP
157 : (const T3DMat4FP*)t3d_segment_placeholder(T3D_SEGMENT_SKELETON)
158 });
159}
160
161#ifdef __cplusplus
162}
163#endif
164
165#endif //TINY3D_T3DSKELETON_H
Definition t3dskeleton.h:21
Definition t3dmodel.h:121
Definition t3dmodel.h:213
Definition t3dmodel.h:150
Definition t3dskeleton.h:33
static void * t3d_segment_placeholder(uint8_t segmentId)
Definition t3d.h:615
void t3d_skeleton_blend(const T3DSkeleton *skelRes, const T3DSkeleton *skelA, const T3DSkeleton *skelB, float factor)
Definition t3dskeleton.c:49
static T3DVec3 t3d_skeleton_get_bone_pos_model_space(const T3DSkeleton *skeleton, int boneIdx)
Definition t3dskeleton.h:132
void t3d_skeleton_update(T3DSkeleton *skeleton)
Definition t3dskeleton.c:61
int t3d_skeleton_find_bone(T3DSkeleton *skeleton, const char *name)
Definition t3dskeleton.c:100
void t3d_skeleton_reset(T3DSkeleton *skeleton)
Definition t3dskeleton.c:39
static void t3d_model_draw_skinned(const T3DModel *model, const T3DSkeleton *skeleton)
Definition t3dskeleton.h:150
void t3d_skeleton_destroy(T3DSkeleton *skeleton)
Definition t3dskeleton.c:109
T3DSkeleton t3d_skeleton_create_buffered(const T3DModel *model, int bufferCount)
Definition t3dskeleton.c:7
T3DSkeleton t3d_skeleton_clone(const T3DSkeleton *skel, bool useMatrices)
Definition t3dskeleton.c:23
static void t3d_skeleton_use(const T3DSkeleton *skel)
Definition t3dskeleton.h:67
static T3DSkeleton t3d_skeleton_create(const T3DModel *model)
Definition t3dskeleton.h:58