11 u32 children
; /* maybe remove */
17 m4x3f
*final_transforms
;
23 struct mdl_keyframe
*anim_data
;
32 static void skeleton_apply_frame( m4x3f transform
,
33 struct skeleton
*skele
,
34 struct skeleton_anim
*anim
,
37 u32 frame
= time
*anim
->rate
;
38 frame
= frame
% anim
->length
;
40 mdl_keyframe
*base
= anim
->anim_data
+ (skele
->bone_count
-1)*frame
;
41 m4x3_copy( transform
, skele
->final_transforms
[0] );
43 for( int i
=1; i
<skele
->bone_count
; i
++ )
45 struct skeleton_bone
*sb
= &skele
->bones
[i
];
51 v3_sub( skele
->bones
[i
].co
, skele
->bones
[sb
->parent
].co
, temp_delta
);
55 mdl_keyframe
*kf
= base
+i
-1;
57 q_m3x3( kf
->q
, posemtx
);
58 v3_copy( kf
->co
, posemtx
[3] );
59 v3_add( temp_delta
, posemtx
[3], posemtx
[3] );
62 m4x3_mul( skele
->final_transforms
[ sb
->parent
], posemtx
,
63 skele
->final_transforms
[i
] );
66 /* armature space -> bone space matrix ( for verts ) */
67 for( int i
=1; i
<skele
->bone_count
; i
++ )
70 m3x3_identity( abmtx
);
71 v3_negate( skele
->bones
[i
].co
, abmtx
[3] );
72 m4x3_mul( skele
->final_transforms
[i
], abmtx
,
73 skele
->final_transforms
[i
] );
77 static struct skeleton_anim
*skeleton_get_anim( struct skeleton
*skele
,
80 for( int i
=0; i
<skele
->anim_count
; i
++ )
82 struct skeleton_anim
*anim
= &skele
->anims
[i
];
84 if( !strcmp( anim
->name
, name
) )
91 /* Setup an animated skeleton from model */
92 static int skeleton_setup( struct skeleton
*skele
, mdl_header
*mdl
)
94 u32 bone_count
= 1, skeleton_root
= 0;
95 skele
->bone_count
= 0;
97 skele
->final_transforms
= NULL
;
100 struct classtype_skeleton
*inf
= NULL
;
102 for( u32 i
=0; i
<mdl
->node_count
; i
++ )
104 mdl_node
*pnode
= mdl_node_from_id( mdl
, i
);
106 if( pnode
->classtype
== k_classtype_skeleton
)
108 inf
= mdl_get_entdata( mdl
, pnode
);
109 if( skele
->bone_count
)
111 vg_error( "Multiple skeletons in model file\n" );
112 free( skele
->bones
);
116 skele
->bone_count
= inf
->channels
;
117 skele
->bones
= malloc(sizeof(struct skeleton_bone
)*skele
->bone_count
);
120 else if( skele
->bone_count
)
122 if( pnode
->classtype
== k_classtype_bone
)
124 struct skeleton_bone
*sb
= &skele
->bones
[bone_count
++];
125 v3_copy( pnode
->co
, sb
->co
);
126 v3_copy( pnode
->s
, sb
->end
);
127 sb
->parent
= pnode
->parent
-skeleton_root
;
138 vg_error( "No skeleton in model\n" );
142 if( bone_count
!= skele
->bone_count
)
144 vg_error( "Loaded %u bones out of %u\n", bone_count
, skele
->bone_count
);
148 /* fill in implicit root bone */
149 v3_zero( skele
->bones
[0].co
);
150 v3_copy( (v3f
){0.0f
,1.0f
,0.0f
}, skele
->bones
[0].end
);
151 skele
->bones
[0].parent
= 0xffffffff;
153 skele
->final_transforms
= malloc( sizeof(m4x3f
) * skele
->bone_count
);
154 skele
->anim_count
= inf
->anim_count
;
155 skele
->anims
= malloc( sizeof(struct skeleton_anim
) * inf
->anim_count
);
157 for( int i
=0; i
<inf
->anim_count
; i
++ )
159 mdl_animation
*anim
=
160 mdl_animation_from_id( mdl
, inf
->anim_start
+i
);
162 skele
->anims
[i
].rate
= anim
->rate
;
163 skele
->anims
[i
].length
= anim
->length
;
164 strncpy( skele
->anims
[i
].name
, mdl_pstr(mdl
, anim
->pstr_name
), 32 );
166 u32 total_keyframes
= (skele
->bone_count
-1)*anim
->length
;
167 size_t block_size
= sizeof(mdl_keyframe
) * total_keyframes
;
168 mdl_keyframe
*dst
= malloc( block_size
);
170 skele
->anims
[i
].anim_data
= dst
;
171 memcpy( dst
, mdl_get_animdata( mdl
, anim
), block_size
);
174 vg_success( "Loaded skeleton with %u bones\n", skele
->bone_count
);
178 static void skeleton_debug( struct skeleton
*skele
)
180 for( int i
=0; i
<skele
->bone_count
; i
++ )
182 struct skeleton_bone
*sb
= &skele
->bones
[i
];
185 v3_copy( sb
->co
, p0
);
186 v3_add( p0
, sb
->end
, p1
);
187 vg_line( p0
, p1
, 0xffffffff );
189 m4x3_mulv( skele
->final_transforms
[i
], p0
, p0
);
190 m4x3_mulv( skele
->final_transforms
[i
], p1
, p1
);
191 vg_line( p0
, p1
, 0xff0000ff );
195 #endif /* SKELETON_H */