652753c81d71a23335f7c13dd2d65381a169b26c
10 #include "skeleton_animator.h"
11 #include "shaders/viewchar.h"
13 vg_tex2d tex_characters
= { .path
= "textures/ch_gradient.qoi" };
15 static void character_register(void)
17 shader_viewchar_register();
20 static void character_init(void)
22 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
29 struct skeleton_anim
*anim_stand
,
33 *anim_push
, *anim_push_reverse
,
34 *anim_ollie
, *anim_ollie_reverse
,
35 *anim_grabs
, *anim_stop
,
36 *anim_walk
, *anim_run
, *anim_idle
;
64 static int character_load( struct character
*ch
, const char *name
)
68 snprintf( buf
, sizeof(buf
)-1, "models/%s.mdl", name
);
69 mdl_header
*src
= mdl_load( buf
);
74 mdl_unpack_glmesh( src
, &ch
->mesh
);
76 skeleton_setup( &ch
->sk
, src
);
77 ch
->anim_stand
= skeleton_get_anim( &ch
->sk
, "pose_stand" );
78 ch
->anim_highg
= skeleton_get_anim( &ch
->sk
, "pose_highg" );
79 ch
->anim_slide
= skeleton_get_anim( &ch
->sk
, "pose_slide" );
80 ch
->anim_air
= skeleton_get_anim( &ch
->sk
, "pose_air" );
81 ch
->anim_push
= skeleton_get_anim( &ch
->sk
, "push" );
82 ch
->anim_push_reverse
= skeleton_get_anim( &ch
->sk
, "push_reverse" );
83 ch
->anim_ollie
= skeleton_get_anim( &ch
->sk
, "ollie" );
84 ch
->anim_ollie_reverse
= skeleton_get_anim( &ch
->sk
, "ollie_reverse" );
85 ch
->anim_grabs
= skeleton_get_anim( &ch
->sk
, "grabs" );
86 ch
->anim_walk
= skeleton_get_anim( &ch
->sk
, "walk" );
87 ch
->anim_run
= skeleton_get_anim( &ch
->sk
, "run" );
88 ch
->anim_idle
= skeleton_get_anim( &ch
->sk
, "idle_cycle" );
90 ch
->id_hip
= skeleton_bone_id( &ch
->sk
, "hips" );
91 ch
->id_ik_hand_l
= skeleton_bone_id( &ch
->sk
, "hand.IK.L" );
92 ch
->id_ik_hand_r
= skeleton_bone_id( &ch
->sk
, "hand.IK.R" );
93 ch
->id_ik_elbow_l
= skeleton_bone_id( &ch
->sk
, "elbow.L" );
94 ch
->id_ik_elbow_r
= skeleton_bone_id( &ch
->sk
, "elbow.R" );
95 ch
->id_head
= skeleton_bone_id( &ch
->sk
, "head" );
99 if( ch
->sk
.collider_count
)
101 vg_info( "Alloc: %d\n", ch
->sk
.collider_count
);
102 ch
->ragdoll
= malloc(sizeof(struct ragdoll_part
) * ch
->sk
.collider_count
);
103 ch
->ragdoll_count
= 0;
105 for( u32 i
=0; i
<ch
->sk
.bone_count
; i
++ )
107 struct skeleton_bone
*bone
= &ch
->sk
.bones
[i
];
111 struct ragdoll_part
*rp
= &ch
->ragdoll
[ ch
->ragdoll_count
++ ];
115 v3_sub( bone
->hitbox
[1], bone
->hitbox
[0], delta
);
116 v3_muls( delta
, 0.5f
, delta
);
118 v3_add( bone
->hitbox
[0], delta
, rp
->offset
);
120 v3_copy( delta
, rp
->rb
.bbx
[1] );
121 v3_muls( delta
, -1.0f
, rp
->rb
.bbx
[0] );
123 q_identity( rp
->rb
.q
);
124 v3_add( bone
->co
, rp
->offset
, rp
->rb
.co
);
125 rp
->rb
.type
= k_rb_shape_box
;
127 rp
->parent
= 0xffffffff;
131 for( u32 j
=0; j
<ch
->ragdoll_count
; j
++ )
133 if( ch
->ragdoll
[ j
].bone_id
== bone
->parent
)
141 /* TODO: refactor to use this style elswhere */
142 struct mdl_node
*pnode
= mdl_node_from_id( src
, bone
->orig_node
);
143 struct classtype_bone
*bone_inf
= mdl_get_entdata( src
, pnode
);
145 rp
->use_limits
= bone_inf
->use_limits
;
146 v3_copy( bone_inf
->angle_limits
[0], rp
->limits
[0] );
147 v3_copy( bone_inf
->angle_limits
[1], rp
->limits
[1] );
158 static void character_eval( struct character
*ch
){}
159 static void character_draw( struct character
*ch
, float temp
, m4x3f camera
){}
160 static void character_init_ragdoll_joints( struct character
*ch
){}
161 static void character_init_ragdoll( struct character
*ch
){}
162 static void character_ragdoll_go( struct character
*ch
, v3f pos
){}
164 static void character_mimic_ragdoll( struct character
*ch
)
166 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
168 struct ragdoll_part
*part
= &ch
->ragdoll
[i
];
170 m3x3_identity(offset
);
171 v3_negate( part
->offset
, offset
[3] );
172 m4x3_mul( part
->rb
.to_world
, offset
, ch
->sk
.final_mtx
[part
->bone_id
] );
175 skeleton_apply_inverses( &ch
->sk
);
178 static void character_ragdoll_copypose( struct character
*ch
, v3f v
)
180 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
182 struct ragdoll_part
*part
= &ch
->ragdoll
[i
];
185 u32 bone
= part
->bone_id
;
187 m4x3_mulv( ch
->sk
.final_mtx
[bone
], ch
->sk
.bones
[bone
].co
, pos
);
188 m3x3_mulv( ch
->sk
.final_mtx
[bone
], part
->offset
, offset
);
189 v3_add( pos
, offset
, part
->rb
.co
);
190 m3x3_q( ch
->sk
.final_mtx
[bone
], part
->rb
.q
);
191 v3_copy( v
, part
->rb
.v
);
192 v3_zero( part
->rb
.w
);
194 rb_update_transform( &part
->rb
);
198 static void character_debug_ragdoll( struct character
*ch
)
200 for( u32 i
=0; i
<ch
->ragdoll_count
; i
++ )
201 rb_debug( &ch
->ragdoll
[i
].rb
, 0xff00ff00 );
204 static void character_ragdoll_iter( struct character
*ch
)
208 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
209 rb_collide( &ch
->ragdoll
[i
].rb
, &world
.rb_geo
);
211 rb_presolve_contacts( rb_contact_buffer
, rb_contact_count
);
215 float shoe_vel
[2] = {0.0f
,0.0f
};
216 for( int i
=0; i
<2; i
++ )
218 shoe_vel
[i
] = v3_length( ch
->ragdoll
[i
].rb
.v
);
220 for( int j
=0; j
<ch
->ragdoll_count
; j
++ )
222 struct ragdoll_part
*pj
= &ch
->ragdoll
[j
];
223 struct skeleton_bone
*bj
= &ch
->sk
.bones
[pj
->bone_id
];
225 if( pj
->parent
!= 0xffffffff )
227 struct ragdoll_part
*pp
= &ch
->ragdoll
[pj
->parent
];
228 struct skeleton_bone
*bp
= &ch
->sk
.bones
[pp
->bone_id
];
231 v3_negate( pj
->offset
, lca
);
232 v3_add( bp
->co
, pp
->offset
, lcb
);
233 v3_sub( bj
->co
, lcb
, lcb
);
235 rb_debug_constraint_position( &pj
->rb
, lca
, &pp
->rb
, lcb
);
239 rb_debug_constraint_limits( &pj
->rb
, &pp
->rb
, lca
, pj
->limits
);
245 for( int i
=0; i
<10; i
++ )
247 rb_solve_contacts( rb_contact_buffer
, rb_contact_count
);
249 for( int j
=0; j
<ch
->ragdoll_count
; j
++ )
251 struct ragdoll_part
*pj
= &ch
->ragdoll
[j
];
252 struct skeleton_bone
*bj
= &ch
->sk
.bones
[pj
->bone_id
];
254 if( pj
->parent
!= 0xffffffff && pj
->use_limits
)
256 struct ragdoll_part
*pp
= &ch
->ragdoll
[pj
->parent
];
257 struct skeleton_bone
*bp
= &ch
->sk
.bones
[pp
->bone_id
];
260 v3_negate( pj
->offset
, lca
);
261 v3_add( bp
->co
, pp
->offset
, lcb
);
262 v3_sub( bj
->co
, lcb
, lcb
);
264 rb_constraint_position( &pj
->rb
, lca
, &pp
->rb
, lcb
);
266 rb_constraint_limits( &pj
->rb
, lca
, &pp
->rb
, lcb
, pj
->limits
);
272 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
273 rb_iter( &ch
->ragdoll
[i
].rb
);
277 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
278 rb_update_transform( &ch
->ragdoll
[i
].rb
);