10 #include "skeleton_animator.h"
11 #include "shaders/viewchar.h"
13 static float k_ragdoll_floatyiness
= 10.0f
,
14 k_ragdoll_floatydrag
= 1.0f
;
16 vg_tex2d tex_characters
= { .path
= "textures/ch_gradient.qoi" };
18 static void character_register(void)
20 shader_viewchar_register();
23 static void character_init(void)
25 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
32 struct skeleton_anim
*anim_stand
,
36 *anim_push
, *anim_push_reverse
,
37 *anim_ollie
, *anim_ollie_reverse
,
38 *anim_grabs
, *anim_stop
,
39 *anim_walk
, *anim_run
, *anim_idle
;
67 static int character_load( struct character
*ch
, const char *name
)
71 snprintf( buf
, sizeof(buf
)-1, "models/%s.mdl", name
);
72 mdl_header
*src
= mdl_load( buf
);
77 mdl_unpack_glmesh( src
, &ch
->mesh
);
79 skeleton_setup( &ch
->sk
, src
);
80 ch
->anim_stand
= skeleton_get_anim( &ch
->sk
, "pose_stand" );
81 ch
->anim_highg
= skeleton_get_anim( &ch
->sk
, "pose_highg" );
82 ch
->anim_slide
= skeleton_get_anim( &ch
->sk
, "pose_slide" );
83 ch
->anim_air
= skeleton_get_anim( &ch
->sk
, "pose_air" );
84 ch
->anim_push
= skeleton_get_anim( &ch
->sk
, "push" );
85 ch
->anim_push_reverse
= skeleton_get_anim( &ch
->sk
, "push_reverse" );
86 ch
->anim_ollie
= skeleton_get_anim( &ch
->sk
, "ollie" );
87 ch
->anim_ollie_reverse
= skeleton_get_anim( &ch
->sk
, "ollie_reverse" );
88 ch
->anim_grabs
= skeleton_get_anim( &ch
->sk
, "grabs" );
89 ch
->anim_walk
= skeleton_get_anim( &ch
->sk
, "walk" );
90 ch
->anim_run
= skeleton_get_anim( &ch
->sk
, "run" );
91 ch
->anim_idle
= skeleton_get_anim( &ch
->sk
, "idle_cycle" );
93 ch
->id_hip
= skeleton_bone_id( &ch
->sk
, "hips" );
94 ch
->id_ik_hand_l
= skeleton_bone_id( &ch
->sk
, "hand.IK.L" );
95 ch
->id_ik_hand_r
= skeleton_bone_id( &ch
->sk
, "hand.IK.R" );
96 ch
->id_ik_elbow_l
= skeleton_bone_id( &ch
->sk
, "elbow.L" );
97 ch
->id_ik_elbow_r
= skeleton_bone_id( &ch
->sk
, "elbow.R" );
98 ch
->id_head
= skeleton_bone_id( &ch
->sk
, "head" );
102 if( ch
->sk
.collider_count
)
104 vg_info( "Alloc: %d\n", ch
->sk
.collider_count
);
105 ch
->ragdoll
= malloc(sizeof(struct ragdoll_part
) * ch
->sk
.collider_count
);
106 ch
->ragdoll_count
= 0;
108 for( u32 i
=0; i
<ch
->sk
.bone_count
; i
++ )
110 struct skeleton_bone
*bone
= &ch
->sk
.bones
[i
];
114 struct ragdoll_part
*rp
= &ch
->ragdoll
[ ch
->ragdoll_count
++ ];
118 v3_sub( bone
->hitbox
[1], bone
->hitbox
[0], delta
);
119 v3_muls( delta
, 0.5f
, delta
);
121 v3_add( bone
->hitbox
[0], delta
, rp
->offset
);
123 v3_copy( delta
, rp
->rb
.bbx
[1] );
124 v3_muls( delta
, -1.0f
, rp
->rb
.bbx
[0] );
126 q_identity( rp
->rb
.q
);
127 v3_add( bone
->co
, rp
->offset
, rp
->rb
.co
);
128 rp
->rb
.type
= k_rb_shape_box
;
130 rp
->parent
= 0xffffffff;
134 for( u32 j
=0; j
<ch
->ragdoll_count
; j
++ )
136 if( ch
->ragdoll
[ j
].bone_id
== bone
->parent
)
144 /* TODO: refactor to use this style elswhere */
145 struct mdl_node
*pnode
= mdl_node_from_id( src
, bone
->orig_node
);
146 struct classtype_bone
*bone_inf
= mdl_get_entdata( src
, pnode
);
148 rp
->use_limits
= bone_inf
->use_limits
;
149 v3_copy( bone_inf
->angle_limits
[0], rp
->limits
[0] );
150 v3_copy( bone_inf
->angle_limits
[1], rp
->limits
[1] );
161 static void character_eval( struct character
*ch
){}
162 static void character_draw( struct character
*ch
, float temp
, m4x3f camera
){}
163 static void character_init_ragdoll_joints( struct character
*ch
){}
164 static void character_init_ragdoll( struct character
*ch
){}
165 static void character_ragdoll_go( struct character
*ch
, v3f pos
){}
167 static void character_mimic_ragdoll( struct character
*ch
)
169 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
171 struct ragdoll_part
*part
= &ch
->ragdoll
[i
];
173 m3x3_identity(offset
);
174 v3_negate( part
->offset
, offset
[3] );
175 m4x3_mul( part
->rb
.to_world
, offset
, ch
->sk
.final_mtx
[part
->bone_id
] );
178 skeleton_apply_inverses( &ch
->sk
);
181 static void character_ragdoll_copypose( struct character
*ch
, v3f v
)
183 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
185 struct ragdoll_part
*part
= &ch
->ragdoll
[i
];
188 u32 bone
= part
->bone_id
;
190 m4x3_mulv( ch
->sk
.final_mtx
[bone
], ch
->sk
.bones
[bone
].co
, pos
);
191 m3x3_mulv( ch
->sk
.final_mtx
[bone
], part
->offset
, offset
);
192 v3_add( pos
, offset
, part
->rb
.co
);
193 m3x3_q( ch
->sk
.final_mtx
[bone
], part
->rb
.q
);
194 v3_copy( v
, part
->rb
.v
);
195 v3_zero( part
->rb
.w
);
197 rb_update_transform( &part
->rb
);
201 static void character_debug_ragdoll( struct character
*ch
)
203 for( u32 i
=0; i
<ch
->ragdoll_count
; i
++ )
204 rb_debug( &ch
->ragdoll
[i
].rb
, 0xff00ff00 );
207 static void character_ragdoll_iter( struct character
*ch
)
211 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
212 rb_collide( &ch
->ragdoll
[i
].rb
, &world
.rb_geo
);
214 rb_presolve_contacts( rb_contact_buffer
, rb_contact_count
);
218 float shoe_vel
[2] = {0.0f
,0.0f
};
219 for( int i
=0; i
<2; i
++ )
221 shoe_vel
[i
] = v3_length( ch
->ragdoll
[i
].rb
.v
);
223 for( int j
=0; j
<ch
->ragdoll_count
; j
++ )
225 struct ragdoll_part
*pj
= &ch
->ragdoll
[j
];
226 struct skeleton_bone
*bj
= &ch
->sk
.bones
[pj
->bone_id
];
228 if( pj
->parent
!= 0xffffffff )
230 struct ragdoll_part
*pp
= &ch
->ragdoll
[pj
->parent
];
231 struct skeleton_bone
*bp
= &ch
->sk
.bones
[pp
->bone_id
];
234 v3_negate( pj
->offset
, lca
);
235 v3_add( bp
->co
, pp
->offset
, lcb
);
236 v3_sub( bj
->co
, lcb
, lcb
);
238 rb_debug_constraint_position( &pj
->rb
, lca
, &pp
->rb
, lcb
);
242 rb_debug_constraint_limits( &pj
->rb
, &pp
->rb
, lca
, pj
->limits
);
246 v4f plane
= {0.0f
,1.0f
,0.0f
,0.0f
};
247 rb_effect_simple_bouyency( &pj
->rb
, plane
, k_ragdoll_floatyiness
,
248 k_ragdoll_floatydrag
);
252 for( int i
=0; i
<10; i
++ )
254 rb_solve_contacts( rb_contact_buffer
, rb_contact_count
);
256 for( int j
=0; j
<ch
->ragdoll_count
; j
++ )
258 struct ragdoll_part
*pj
= &ch
->ragdoll
[j
];
259 struct skeleton_bone
*bj
= &ch
->sk
.bones
[pj
->bone_id
];
261 if( pj
->parent
!= 0xffffffff && pj
->use_limits
)
263 struct ragdoll_part
*pp
= &ch
->ragdoll
[pj
->parent
];
264 struct skeleton_bone
*bp
= &ch
->sk
.bones
[pp
->bone_id
];
267 v3_negate( pj
->offset
, lca
);
268 v3_add( bp
->co
, pp
->offset
, lcb
);
269 v3_sub( bj
->co
, lcb
, lcb
);
271 rb_constraint_position( &pj
->rb
, lca
, &pp
->rb
, lcb
);
273 rb_constraint_limits( &pj
->rb
, lca
, &pp
->rb
, lcb
, pj
->limits
);
279 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
280 rb_iter( &ch
->ragdoll
[i
].rb
);
284 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
285 rb_update_transform( &ch
->ragdoll
[i
].rb
);