f161f7d210214fabe0e07befa0aec976518477c7
[carveJwlIkooP6JGAAIwe30JlM.git] / character.h
1 #ifndef CHARACTER_H
2 #define CHARACTER_H
3
4 #include "vg/vg.h"
5 #include "model.h"
6 #include "scene.h"
7 #include "ik.h"
8 #include "rigidbody.h"
9
10 SHADER_DEFINE( shader_player,
11
12 /*Include*/ VERTEX_STANDARD_ATTRIBUTES
13
14 "uniform mat4 uPv;"
15 "uniform mat4x3 uMdl;"
16 "uniform float uOpacity;"
17 ""
18 "out vec4 aColour;"
19 "out vec2 aUv;"
20 "out vec3 aNorm;"
21 "out vec3 aCo;"
22 "out float aOpacity;"
23 ""
24 "void main()"
25 "{"
26 "vec3 world_pos = uMdl * vec4(a_co,1.0);"
27 "gl_Position = uPv * vec4(world_pos,1.0);"
28
29 "aColour = a_colour;"
30 "aUv = a_uv;"
31 "aNorm = mat3(uMdl) * a_norm;"
32 "aCo = a_co;"
33 "aOpacity = 1.0-(gl_Position.y+0.5)*uOpacity;"
34 "}",
35 /* Fragment */
36 "out vec4 FragColor;"
37 ""
38 "uniform sampler2D uTexMain;"
39 "uniform vec4 uColour;"
40 ""
41 "in vec4 aColour;"
42 "in vec2 aUv;"
43 "in vec3 aNorm;"
44 "in vec3 aCo;"
45 "in float aOpacity;"
46 ""
47 "void main()"
48 "{"
49 "vec3 diffuse = texture( uTexMain, aUv ).rgb;"
50 "FragColor = vec4(pow(diffuse,vec3(1.0)),aOpacity);"
51 "}"
52 ,
53 UNIFORMS({ "uTexMain", "uPv", "uMdl", "uOpacity" })
54 )
55
56 #define FOREACH_PART(FN) \
57 FN( foot_l ) \
58 FN( foot_r ) \
59 FN( sock_l ) \
60 FN( sock_r ) \
61 FN( body0 ) \
62 FN( body1 ) \
63 FN( neck ) \
64 FN( head ) \
65 FN( arm_l0 ) \
66 FN( arm_l1 ) \
67 FN( hand_l ) \
68 FN( arm_r0 ) \
69 FN( arm_r1 ) \
70 FN( hand_r ) \
71 FN( leg_l0 ) \
72 FN( leg_l1 ) \
73 FN( leg_r0 ) \
74 FN( leg_r1 ) \
75 FN( wf ) \
76 FN( wb ) \
77 FN( board ) \
78
79 #define MAKE_ENUM(ENUM) k_chpart_##ENUM,
80 #define MAKE_STRING(STR) #STR,
81 #define ADD_ONE(_) +1
82 #define PART_COUNT FOREACH_PART(ADD_ONE)
83
84 enum character_part
85 {
86 FOREACH_PART( MAKE_ENUM )
87 };
88
89 static const char *character_part_strings[] =
90 {
91 FOREACH_PART( MAKE_STRING )
92 };
93
94 struct character
95 {
96 glmesh mesh;
97
98 submodel parts[ PART_COUNT ];
99 m4x3f matrices[ PART_COUNT ];
100
101 /* Auxillary information */
102 v3f offsets[ PART_COUNT ];
103 rigidbody ragdoll[ PART_COUNT ];
104
105 /*
106 * Controls
107 * note: - base nodes of IK structures will be filled automatically
108 * - all positions are in local space to the mroot
109 */
110 struct ik_basic ik_arm_l, ik_arm_r,
111 ik_leg_l, ik_leg_r,
112 ik_body;
113 v3f cam_pos;
114
115 v4f qhead;
116 float rhip, rcollar, /* twist of hip and collar controls,
117 these act in the local +y axis of the part */
118 rhead,
119 rfootl, rfootr,
120 rhandl, rhandr;
121
122 v3f ground_normal; /* Feet will be aligned to this */
123 m4x3f mroot;
124
125 int shoes[2];
126 };
127
128 static void character_offset( struct character *ch, enum character_part parent,
129 enum character_part child )
130 {
131 v3_sub( ch->parts[ child ].pivot, ch->parts[ parent ].pivot,
132 ch->offsets[ child ] );
133 }
134
135 static int character_load( struct character *ch, const char *name )
136 {
137 char buf[64];
138
139 snprintf( buf, sizeof(buf)-1, "models/%s.mdl", name );
140 model *src = vg_asset_read( buf );
141
142 if( !src )
143 {
144 vg_error( "Could not open 'models/%s.mdl'", name );
145 return 0;
146 }
147
148 int error_count = 0;
149
150 for( int i=0; i<PART_COUNT; i++ )
151 {
152 snprintf( buf, sizeof(buf)-1, "%s_%s", name, character_part_strings[i] );
153 submodel *sm = submodel_get( src, buf );
154
155 if( !sm )
156 {
157 vg_warn( "Character file does not contain an '_%s' part.\n",
158 character_part_strings[i] );
159 error_count ++;
160
161 memset( &ch->parts[i], 0, sizeof(submodel) );
162 continue;
163 }
164
165 ch->parts[i] = *sm;
166 }
167
168 model_unpack( src, &ch->mesh );
169
170 if( !error_count )
171 vg_success( "Loaded character file '%s' with no errors\n", name );
172
173 /* Create the offsets */
174 character_offset( ch, k_chpart_body0, k_chpart_body1 );
175 character_offset( ch, k_chpart_body1, k_chpart_neck );
176 character_offset( ch, k_chpart_neck, k_chpart_head );
177
178 character_offset( ch, k_chpart_body1, k_chpart_arm_l0 );
179 character_offset( ch, k_chpart_arm_l0, k_chpart_arm_l1 );
180 character_offset( ch, k_chpart_arm_l1, k_chpart_hand_l );
181
182 character_offset( ch, k_chpart_body1, k_chpart_arm_r0 );
183 character_offset( ch, k_chpart_arm_r0, k_chpart_arm_r1 );
184 character_offset( ch, k_chpart_arm_r1, k_chpart_hand_r );
185
186 character_offset( ch, k_chpart_body0, k_chpart_leg_l0 );
187 character_offset( ch, k_chpart_leg_l0, k_chpart_leg_l1 );
188 character_offset( ch, k_chpart_leg_l1, k_chpart_foot_l );
189
190 character_offset( ch, k_chpart_body0, k_chpart_leg_r0 );
191 character_offset( ch, k_chpart_leg_r0, k_chpart_leg_r1 );
192 character_offset( ch, k_chpart_leg_r1, k_chpart_foot_r );
193
194 character_offset( ch, k_chpart_board, k_chpart_wb );
195 character_offset( ch, k_chpart_board, k_chpart_wf );
196
197 ch->ik_arm_l.l1 = v3_length( ch->offsets[ k_chpart_arm_l1 ] );
198 ch->ik_arm_l.l2 = v3_length( ch->offsets[ k_chpart_hand_l ] );
199 ch->ik_arm_r.l1 = v3_length( ch->offsets[ k_chpart_arm_r1 ] );
200 ch->ik_arm_r.l2 = v3_length( ch->offsets[ k_chpart_hand_r ] );
201
202 ch->ik_leg_l.l1 = v3_length( ch->offsets[ k_chpart_leg_l1 ] );
203 ch->ik_leg_l.l2 = v3_length( ch->offsets[ k_chpart_foot_l ] );
204 ch->ik_leg_r.l1 = v3_length( ch->offsets[ k_chpart_leg_r1 ] );
205 ch->ik_leg_r.l2 = v3_length( ch->offsets[ k_chpart_foot_r ] );
206
207 ch->ik_body.l1 = v3_length( ch->offsets[ k_chpart_body1 ] );
208 ch->ik_body.l2 = v3_length( ch->offsets[ k_chpart_neck ] );
209
210 free( src );
211 return 1;
212 }
213
214 static void align_to_board( struct character *ch, enum character_part id )
215 {
216 /* Calculate rotation between board and feet */
217 m4x3f *mats = ch->matrices;
218
219 v3f foot_pos, foot_fwd, foot_target, board_norm, board_origin;
220 v3_copy( mats[id][3], foot_pos );
221 m3x3_mulv( mats[id], (v3f){1.0f,0.0f,0.0f}, foot_fwd );
222 v3_add( foot_fwd, foot_pos, foot_target );
223
224 m3x3_mulv( mats[k_chpart_board], (v3f){0.0f,1.0f,0.0f}, board_norm );
225 m4x3_mulv( mats[k_chpart_board], (v3f){0.0f,0.13f,0.0f}, board_origin );
226
227 vg_line( foot_pos, foot_target, 0xff00ff00 );
228
229 v3f v0;
230 v3_sub( board_origin, foot_target, v0 );
231 float t = v3_dot( v0, board_norm ) / board_norm[1];
232 foot_target[1] += t;
233 vg_line( foot_pos, foot_target, 0xff00ffff );
234
235 v3_sub( foot_target, foot_pos, foot_target );
236 v3_normalize( foot_target );
237 float ang = acosf( v3_dot( foot_target, foot_fwd ) );
238
239 v4f qcorrection; m3x3f correction;
240 q_axis_angle( qcorrection, (v3f){0.0f,0.0f,1.0f}, -ang );
241 q_m3x3( qcorrection, correction );
242 m3x3_mul( mats[id], correction, mats[id] );
243 }
244
245 static void character_eval( struct character *ch )
246 {
247 m4x3f *mats = ch->matrices;
248 v3f *offs = ch->offsets;
249
250 ik_basic( &ch->ik_body, mats[k_chpart_body0], mats[k_chpart_body1],
251 k_ikY, k_ikX );
252
253 m3x3f temp;
254 v4f body_rotation;
255 /* TODO: Do this directly via m3x3 */
256
257 q_axis_angle( body_rotation, (v3f){0.0f,1.0f,0.0f}, ch->rhip );
258 q_m3x3( body_rotation, temp );
259 m3x3_mul( mats[k_chpart_body0], temp, mats[k_chpart_body0] );
260
261 q_axis_angle( body_rotation, (v3f){0.0f,1.0f,0.0f}, ch->rcollar );
262 q_m3x3( body_rotation, temp );
263 m3x3_mul( mats[k_chpart_body1], temp, mats[k_chpart_body1] );
264
265 /* Setup aux */
266 m4x3_mulv( mats[k_chpart_body0], offs[k_chpart_leg_l0], ch->ik_leg_l.base );
267 m4x3_mulv( mats[k_chpart_body0], offs[k_chpart_leg_r0], ch->ik_leg_r.base );
268 m4x3_mulv( mats[k_chpart_body1], offs[k_chpart_arm_l0], ch->ik_arm_l.base );
269 m4x3_mulv( mats[k_chpart_body1], offs[k_chpart_arm_r0], ch->ik_arm_r.base );
270
271 /* IK for arms and legs */
272 ik_basic( &ch->ik_arm_l, mats[k_chpart_arm_l0], mats[k_chpart_arm_l1],
273 k_ikZ, k_ikY );
274 ik_basic( &ch->ik_arm_r, mats[k_chpart_arm_r0], mats[k_chpart_arm_r1],
275 k_iknZ, k_ikY );
276 ik_basic( &ch->ik_leg_l, mats[k_chpart_leg_l0], mats[k_chpart_leg_l1],
277 k_ikY, k_iknX );
278 ik_basic( &ch->ik_leg_r, mats[k_chpart_leg_r0], mats[k_chpart_leg_r1],
279 k_ikY, k_iknX );
280
281 /* Hands */
282 m3x3_copy( mats[k_chpart_arm_l1], mats[k_chpart_hand_l] );
283 m3x3_copy( mats[k_chpart_arm_r1], mats[k_chpart_hand_r] );
284 m4x3_mulv( mats[k_chpart_arm_l1], offs[k_chpart_hand_l],
285 mats[k_chpart_hand_l][3] );
286 m4x3_mulv( mats[k_chpart_arm_r1], offs[k_chpart_hand_r],
287 mats[k_chpart_hand_r][3] );
288
289 /* Neck / Head */
290 m3x3_copy( mats[k_chpart_body1], mats[k_chpart_neck] );
291 m4x3_mulv( mats[k_chpart_body1], offs[k_chpart_neck],
292 mats[k_chpart_neck][3] );
293
294 v4f qhead;
295 q_axis_angle( qhead, (v3f){ 0.0f,1.0f,0.0f }, ch->rhead );
296 q_m3x3( qhead, mats[k_chpart_head] );
297 //m3x3_mul( mats[k_chpart_neck], mats[k_chpart_head], mats[k_chpart_head] );
298 m4x3_mulv( mats[k_chpart_neck], offs[k_chpart_head], mats[k_chpart_head][3]);
299
300 /* Feet */
301 m3x3_copy( mats[k_chpart_leg_l1], mats[k_chpart_foot_l] );
302 m3x3_copy( mats[k_chpart_leg_r1], mats[k_chpart_foot_r] );
303 m4x3_mulv( mats[k_chpart_leg_l1], offs[k_chpart_foot_l],
304 mats[k_chpart_foot_l][3] );
305 m4x3_mulv( mats[k_chpart_leg_r1], offs[k_chpart_foot_r],
306 mats[k_chpart_foot_r][3] );
307
308 align_to_board( ch, k_chpart_foot_l );
309 align_to_board( ch, k_chpart_foot_r );
310
311 for( int i=0; i<PART_COUNT; i++ )
312 m4x3_mul( ch->mroot, ch->matrices[i], ch->matrices[i] );
313 }
314
315 #define B3D_CO( X, Y, Z ) (v3f){ X, Z, -Y }
316
317 typedef struct character_pose character_pose;
318 struct character_pose
319 {
320 v3f b0, b1, p, fr, fl, pl, pr, hl, hr, apl, apr, cam;
321 };
322
323 static character_pose pose_aero =
324 {
325 .b0 = {0.0721f, 0.8167f, 0.1365f},
326 .b1 = {-0.0773f, 1.1559f, -0.1699f},
327 .p = {0.0421f, 1.1430f, 0.2803f},
328 .fr = {0.0535f, 0.1312f, -0.3647f},
329 .fl = {-0.0605f, 0.1464f, 0.2917f},
330 .pl = {-0.1704f, 0.6889f, -0.4017f},
331 .pr = {0.0672f, 0.7598f, -0.5963f},
332 .hl = {-0.2153f, 0.7195f, -0.1345f},
333 .hr = {0.1974f, 0.7940f, -0.3522f},
334 .apl = {-0.2008f, 0.9546f, 0.3687f},
335 .apr = {0.3133f, 0.9299f, 0.0181f},
336 .cam = {-0.3394f, 1.2661f, 0.2936f}
337 };
338
339 static character_pose pose_slide =
340 {
341 .b0 = {0.6732f, 0.5565f, -0.0000f},
342 .b1 = {0.8116f, 1.0547f, 0.0613f},
343 .p = {1.0404f, 0.7907f, 0.0186f},
344 .fr = {-0.0030f, 0.1366f, -0.4461f},
345 .fl = {-0.0030f, 0.1366f, 0.3480f},
346 .pl = {-0.0887f, 0.8229f, 0.3826f},
347 .pr = {-0.0887f, 0.8229f, -0.4621f},
348 .hl = {0.7749f, 0.5545f, 0.5310f},
349 .hr = {0.5844f, 1.2445f, -0.5456f},
350 .apl = {1.0999f, 0.5390f, 0.2398f},
351 .apr = {0.9816f, 0.9536f, -0.5463f},
352 .cam = {0.9888f, 1.4037f, 0.6081f}
353 };
354
355 static character_pose pose_slide1 =
356 {
357 .b0 = {-0.2385f, 0.6403f, 0.1368f},
358 .b1 = {-0.5151f, 1.1351f, 0.1380f},
359 .p = {-0.1158f, 1.2118f, 0.3895f},
360 .fr = {-0.0030f, 0.1323f, -0.3190f},
361 .fl = {-0.0030f, 0.1323f, 0.5797f},
362 .pl = {-0.6568f, 0.4305f, 0.2069f},
363 .pr = {-0.6850f, 0.2740f, -0.2969f},
364 .hl = {-0.7029f, 0.6132f, 0.2972f},
365 .hr = {-0.2572f, 1.0104f, -0.4770f},
366 .apl = {-0.4808f, 0.8480f, 0.3731f},
367 .apr = {-0.0836f, 1.0480f, -0.1201f},
368 .cam = {-1.0508f, 1.0769f, 0.0528f}
369 };
370
371 static character_pose pose_aero_reverse =
372 {
373 .b0 = {0.0616f, 0.8167f, -0.1415f},
374 .b1 = {0.0148f, 1.1559f, 0.1861f},
375 .p = {0.0558f, 1.1430f, -0.2779f},
376 .fr = {0.0535f, 0.1312f, -0.3647f},
377 .fl = {0.0730f, 0.1464f, 0.2917f},
378 .pl = {-0.2073f, 0.6889f, 0.3839f},
379 .pr = {-0.3584f, 0.4069f, 0.1032f},
380 .hl = {0.1567f, 0.7195f, 0.1997f},
381 .hr = {-0.3055f, 0.7940f, 0.2639f},
382 .apl = {0.3143f, 0.9546f, -0.2784f},
383 .apr = {-0.2885f, 0.9299f, -0.1236f},
384 .cam = {-0.3394f, 1.2661f, -0.2936f}
385 };
386
387 static character_pose pose_stand =
388 {
389 .b0 = {0.1877f, 1.0663f, 0.0063f},
390 .b1 = {0.0499f, 1.5564f, -0.0584f},
391 .p = {0.5982f, 1.2810f, 0.0842f},
392 .fr = {0.0535f, 0.1312f, -0.3647f},
393 .fl = {0.0354f, 0.1464f, 0.2917f},
394 .pl = {-0.4325f, 0.6889f, 0.1823f},
395 .pr = {-0.4794f, 0.7598f, -0.3610f},
396 .hl = {0.0498f, 1.0058f, 0.2317f},
397 .hr = {0.0188f, 0.9786f, -0.2725f},
398 .apl = {0.2898f, 1.3453f, 0.2303f},
399 .apr = {0.5273f, 1.2876f, -0.1848f},
400 .cam = {-0.3477f, 1.5884f, -0.0019f}
401 };
402
403 static character_pose pose_fly =
404 {
405 .b0 = {0.2995f, 0.6819f, -0.1369f},
406 .b1 = {0.1618f, 1.1720f, -0.2016f},
407 .p = {0.7477f, 0.9173f, -0.1885f},
408 .fr = {0.0535f, 0.1312f, -0.3647f},
409 .fl = {0.0354f, 0.1464f, 0.2917f},
410 .pl = {-0.2930f, 0.4849f, 0.5307f},
411 .pr = {-0.4754f, 0.4124f, -0.4874f},
412 .hl = {0.2650f, 1.1897f, 0.4626f},
413 .hr = {0.2494f, 1.2059f, -0.7985f},
414 .apl = {0.5165f, 1.0990f, 0.1655f},
415 .apr = {0.6759f, 1.0661f, -0.6014f},
416 .cam = {-0.2727f, 1.2606f, 0.3564f}
417 };
418
419 static
420 void character_pose_blend( struct character *ch, character_pose *pose, float q )
421 {
422 v3_muladds( ch->ik_body.base, pose->b0, q, ch->ik_body.base );
423 v3_muladds( ch->ik_body.end, pose->b1, q, ch->ik_body.end );
424 v3_muladds( ch->ik_body.pole, pose->p, q, ch->ik_body.pole );
425 v3_muladds( ch->ik_leg_l.end, pose->fl, q, ch->ik_leg_l.end );
426 v3_muladds( ch->ik_leg_l.pole, pose->pl, q, ch->ik_leg_l.pole );
427 v3_muladds( ch->ik_leg_r.end, pose->fr, q, ch->ik_leg_r.end );
428 v3_muladds( ch->ik_leg_r.pole, pose->pr, q, ch->ik_leg_r.pole );
429 v3_muladds( ch->ik_arm_l.pole, pose->apl, q, ch->ik_arm_l.pole );
430 v3_muladds( ch->ik_arm_r.pole, pose->apr, q, ch->ik_arm_r.pole );
431 v3_muladds( ch->ik_arm_l.end, pose->hl, q, ch->ik_arm_l.end );
432 v3_muladds( ch->ik_arm_r.end, pose->hr, q, ch->ik_arm_r.end );
433 v3_muladds( ch->cam_pos, pose->cam, q, ch->cam_pos );
434 }
435
436 static
437 void character_final_pose( struct character *ch, v3f cog,
438 character_pose *pose, float q )
439 {
440 character_pose npose;
441 float dip = vg_clampf(cog[1], -1.0f, 0.3f) * 0.35f,
442 tilt = vg_clampf(cog[2], -1.0f, 1.0f) * 0.3f;
443
444 v4f rz; m4x3f tr;
445 q_axis_angle( rz, (v3f){0.0f,0.0f,1.0f}, -cog[0]*0.6f );
446 q_m3x3( rz, tr );
447 v3_copy( (v3f){0.0f,dip,tilt}, tr[3] );
448
449 m4x3_mulv( tr, pose->b0, npose.b0 );
450 m4x3_mulv( tr, pose->b1, npose.b1 );
451 m4x3_mulv( tr, pose->p, npose.p );
452 m4x3_mulv( tr, pose->pl, npose.pl );
453 m4x3_mulv( tr, pose->pr, npose.pr );
454 m4x3_mulv( tr, pose->hl, npose.hl );
455 m4x3_mulv( tr, pose->hr, npose.hr );
456 m4x3_mulv( tr, pose->apl, npose.apl );
457 m4x3_mulv( tr, pose->apr, npose.apr );
458
459 v3_copy( pose->fr, npose.fr );
460 v3_copy( pose->fl, npose.fl );
461 v3_copy( pose->cam, npose.cam );
462
463 character_pose_blend( ch, &npose, q );
464 }
465
466 static void zero_ik_basic( struct ik_basic *ik )
467 {
468 v3_zero( ik->base );
469 v3_zero( ik->end );
470 v3_zero( ik->pole );
471 }
472
473 static void character_pose_reset( struct character *ch )
474 {
475 zero_ik_basic( &ch->ik_body );
476 zero_ik_basic( &ch->ik_leg_l );
477 zero_ik_basic( &ch->ik_leg_r );
478 zero_ik_basic( &ch->ik_arm_l );
479 zero_ik_basic( &ch->ik_arm_r );
480 v3_zero( ch->cam_pos );
481 }
482
483 static void character_testpose( struct character *ch, float t )
484 {
485 /* Body */
486 float *hips = ch->ik_body.base,
487 *collar = ch->ik_body.end,
488 *pole = ch->ik_body.pole;
489
490 hips[0] = cosf(t*1.325f)*0.25f;
491 hips[1] = (sinf(t)*0.2f+0.6f) * ch->parts[ k_chpart_body0 ].pivot[1];
492 hips[2] = 0.0f;
493
494 collar[0] = hips[0];
495 collar[1] = hips[1] + (ch->ik_body.l1+ch->ik_body.l2)*(sinf(t)*0.05f+0.94f);
496 collar[2] = hips[2] + cosf(t*0.42f)*0.01f;
497
498 v3_add( hips, collar, pole );
499 v3_muls( pole, 0.5f, pole );
500 v3_add( pole, (v3f){ 1.0f, 0.0f, 0.0f }, pole );
501
502 /* Legs */
503 float *footl = ch->ik_leg_l.end,
504 *footr = ch->ik_leg_r.end,
505 *polel = ch->ik_leg_l.pole,
506 *poler = ch->ik_leg_r.pole;
507
508 footl[0] = sinf(t*0.563f);
509 footl[1] = 0.0f;
510 footl[2] = 0.0f;
511
512 footr[0] = 0.0f;
513 footr[1] = 0.0f;
514 footr[2] = cosf(t*0.672f);
515
516 v3_add( hips, footl, polel );
517 v3_muls( polel, 0.4f, polel );
518 v3_add( polel, (v3f){ -1.0f,0.0f,0.0f }, polel );
519
520 v3_add( hips, footr, poler );
521 v3_muls( poler, 0.4f, poler );
522 v3_add( poler, (v3f){ -1.0f,0.0f,0.0f }, poler );
523
524 /* Arms */
525 float *arml = ch->ik_arm_l.end,
526 *armr = ch->ik_arm_r.end;
527 polel = ch->ik_arm_l.pole;
528 poler = ch->ik_arm_r.pole;
529
530 v3_copy( (v3f){ 0.0f, 0.0f, 1.0f }, arml );
531 v3_copy( (v3f){ 0.0f, 0.0f,-1.0f }, armr );
532 v3_copy( (v3f){ 1.0f, 1.0f, 0.5f }, polel );
533 v3_copy( (v3f){ 1.0f, 1.0f,-0.5f }, poler );
534
535 /* Other */
536 ch->rhip = sinf(t*0.2f);
537 ch->rcollar = sinf(t*0.35325f);
538 q_identity( ch->qhead );
539
540 m4x3_identity( ch->matrices[k_chpart_board] );
541 m4x3_identity( ch->matrices[k_chpart_wb] );
542 m4x3_identity( ch->matrices[k_chpart_wf] );
543 }
544
545 static void character_draw( struct character *ch, float temp )
546 {
547 SHADER_USE(shader_player);
548 glUniformMatrix4fv( SHADER_UNIFORM( shader_player, "uPv" ),
549 1, GL_FALSE, (float *)vg_pv );
550
551 glUniform1i( SHADER_UNIFORM( shader_player, "uTexMain" ), 0 );
552 glUniform1f( SHADER_UNIFORM( shader_player, "uOpacity" ), temp );
553
554 GLint kuMdl = SHADER_UNIFORM( shader_player, "uMdl" );
555
556 glEnable( GL_CULL_FACE );
557 glCullFace( GL_BACK );
558
559 mesh_bind( &ch->mesh );
560
561 for( int i=4; i<PART_COUNT; i++ )
562 {
563 glUniformMatrix4x3fv( kuMdl, 1, GL_FALSE, (float *)ch->matrices[i] );
564 submodel_draw( &ch->parts[i] );
565 }
566
567 for( int i=0; i<2; i++ )
568 {
569 if( ch->shoes[i] )
570 {
571 glUniformMatrix4x3fv( kuMdl, 1, GL_FALSE, (float *)ch->matrices[i] );
572 submodel_draw( &ch->parts[i] );
573 }
574 else
575 {
576 glUniformMatrix4x3fv( kuMdl, 1, GL_FALSE, (float *)ch->matrices[i+2] );
577 submodel_draw( &ch->parts[i] );
578 glUniformMatrix4x3fv( kuMdl, 1, GL_FALSE, (float *)ch->matrices[i] );
579 submodel_draw( &ch->parts[i+2] );
580 }
581 }
582 }
583
584 static void character_shader_register(void)
585 {
586 SHADER_INIT(shader_player);
587 }
588
589
590 /*
591 * Ragdoll Stuff
592 */
593
594 static void character_rd_box( struct character *ch, enum character_part id,
595 v3f dims )
596 {
597 v3_muls( dims, -0.5f, ch->ragdoll[id].bbx[0] );
598 v3_muls( dims, 0.5f, ch->ragdoll[id].bbx[1] );
599 }
600
601 struct rd_joint
602 {
603 enum character_part ia, ib;
604 v3f lca, lcb;
605
606 struct rd_joint_axis
607 {
608 v3f va, vb;
609 float spring, ang;
610 }
611 min, maj;
612 };
613
614 static const float k_human_major = 0.5f,
615 k_human_minor = 0.5f,
616 k_human_major_max = 0.4f,
617 k_human_minor_max = 0.1f;
618
619 #define HUMAN_VERTICAL_DEFAULT \
620 .min = { \
621 .va = {1.0f,0.0f,0.0f}, .vb = {1.0f,0.0f,0.0f}, \
622 .spring = k_human_minor, .ang = k_human_minor_max \
623 }, \
624 .maj = { \
625 .va = {0.0f,1.0f,0.0f}, .vb = {0.0f,1.0f,0.0f}, \
626 .spring = k_human_major, .ang = k_human_major_max \
627 }
628
629 #define HUMAN_ARM_LEFT \
630 .min = { \
631 .va = {1.0f,0.0f,0.0f}, .vb = {1.0f,0.0f,0.0f}, \
632 .spring = k_human_minor, .ang = k_human_minor_max \
633 }, \
634 .maj = { \
635 .va = {0.0f,0.0f,1.0f}, .vb = {0.0f,0.0f,1.0f}, \
636 .spring = k_human_major, .ang = k_human_major_max \
637 }
638
639 #define HUMAN_ARM_RIGHT \
640 .min = { \
641 .va = {1.0f,0.0f,0.0f}, .vb = {1.0f,0.0f,0.0f}, \
642 .spring = k_human_minor, .ang = k_human_minor_max \
643 }, \
644 .maj = { \
645 .va = {0.0f,0.0f,-1.0f}, .vb = {0.0f,0.0f,-1.0f}, \
646 .spring = k_human_major, .ang = k_human_major_max \
647 }
648
649 static struct rd_joint rd_joints[] =
650 {
651 { .ia = k_chpart_leg_l1, .ib = k_chpart_foot_l, HUMAN_VERTICAL_DEFAULT },
652 { .ia = k_chpart_leg_r1, .ib = k_chpart_foot_r, HUMAN_VERTICAL_DEFAULT },
653
654 { .ia = k_chpart_body0, .ib = k_chpart_body1, HUMAN_VERTICAL_DEFAULT },
655 { .ia = k_chpart_body1, .ib = k_chpart_neck, HUMAN_VERTICAL_DEFAULT },
656 { .ia = k_chpart_neck, .ib = k_chpart_head, HUMAN_VERTICAL_DEFAULT },
657 { .ia = k_chpart_body0, .ib = k_chpart_leg_l0, HUMAN_VERTICAL_DEFAULT },
658 { .ia = k_chpart_leg_l0, .ib = k_chpart_leg_l1, HUMAN_VERTICAL_DEFAULT },
659 { .ia = k_chpart_body0, .ib = k_chpart_leg_r0, HUMAN_VERTICAL_DEFAULT },
660 { .ia = k_chpart_leg_r0, .ib = k_chpart_leg_r1, HUMAN_VERTICAL_DEFAULT },
661
662 { .ia = k_chpart_body1, .ib = k_chpart_arm_l0, HUMAN_ARM_LEFT },
663 { .ia = k_chpart_arm_l0, .ib = k_chpart_arm_l1, HUMAN_ARM_LEFT },
664 { .ia = k_chpart_arm_l1, .ib = k_chpart_hand_l, HUMAN_ARM_LEFT },
665
666 { .ia = k_chpart_body1, .ib = k_chpart_arm_r0, HUMAN_ARM_RIGHT },
667 { .ia = k_chpart_arm_r0, .ib = k_chpart_arm_r1, HUMAN_ARM_RIGHT },
668 { .ia = k_chpart_arm_r1, .ib = k_chpart_hand_r, HUMAN_ARM_RIGHT }
669 };
670
671 /* Ragdoll should be in rest pose when calling this function */
672 static void character_init_ragdoll_joints( struct character *ch )
673 {
674 for( int i=0; i<vg_list_size(rd_joints); i++ )
675 {
676 struct rd_joint *joint = &rd_joints[i];
677
678 float *hinge = ch->parts[joint->ib].pivot;
679 v3_sub( hinge, ch->ragdoll[joint->ia].co, joint->lca );
680 v3_sub( hinge, ch->ragdoll[joint->ib].co, joint->lcb );
681 }
682
683 for( int i=0; i<PART_COUNT; i++ )
684 {
685 float *pivot = ch->parts[i].pivot;
686 v3_sub( ch->ragdoll[i].co, pivot, ch->ragdoll[i].delta );
687 }
688 }
689
690 static void character_init_ragdoll( struct character *ch )
691 {
692 v3f *offs = ch->offsets;
693 rigidbody *rbs = ch->ragdoll;
694
695 /* CHest */
696 float chest_width = fabsf(offs[k_chpart_arm_r0][2])*2.0f,
697 chest_depth = chest_width * 0.571f,
698 chest_height = offs[k_chpart_neck][1];
699 v3f chest_dims = { chest_depth, chest_height, chest_width };
700 character_rd_box( ch, k_chpart_body1, chest_dims );
701
702 v3_copy( ch->parts[k_chpart_body1].pivot, rbs[k_chpart_body1].co );
703 rbs[k_chpart_body1].co[1] += chest_height*0.5f;
704
705 /* Torso */
706 v3f torso_dims = { chest_depth,
707 offs[k_chpart_body1][1]-offs[k_chpart_leg_l0][1],
708 chest_width*0.85f };
709 v3_copy( ch->parts[k_chpart_body0].pivot, rbs[k_chpart_body0].co );
710 character_rd_box( ch, k_chpart_body0, torso_dims );
711
712 /* Neck */
713 v3f neck_dims = { chest_depth*0.5f,
714 offs[k_chpart_head][1],
715 chest_depth*0.5f };
716 v3_copy( ch->parts[k_chpart_neck].pivot, rbs[k_chpart_neck].co );
717 rbs[k_chpart_neck].co[1] += neck_dims[1]*0.5f;
718 character_rd_box( ch, k_chpart_neck, neck_dims );
719
720 /* Head */
721 v3f head_dims = { chest_width*0.5f, chest_width*0.5f, chest_width*0.5f };
722 v3_copy( ch->parts[k_chpart_head].pivot, rbs[k_chpart_head].co );
723 rbs[k_chpart_head].co[1] += head_dims[1]*0.5f;
724 character_rd_box( ch, k_chpart_head, head_dims );
725
726 /* ARms */
727 v3f ua_dims = { 0.0f, 0.0f, fabsf(offs[k_chpart_arm_l1][2]) };
728 ua_dims[1] = 0.38f*ua_dims[2];
729 ua_dims[0] = 0.38f*ua_dims[2];
730 v3f la_dims = { ua_dims[0], ua_dims[1], fabsf(offs[k_chpart_hand_l][2]) };
731 v3f hand_dims = { ua_dims[1], ua_dims[1]*0.5f, ua_dims[1] };
732
733 character_rd_box( ch, k_chpart_arm_l0, ua_dims );
734 character_rd_box( ch, k_chpart_arm_r0, ua_dims );
735 character_rd_box( ch, k_chpart_arm_l1, la_dims );
736 character_rd_box( ch, k_chpart_arm_r1, la_dims );
737 character_rd_box( ch, k_chpart_hand_l, hand_dims );
738 character_rd_box( ch, k_chpart_hand_r, hand_dims );
739
740 v3_copy( ch->parts[k_chpart_arm_l0].pivot, rbs[k_chpart_arm_l0].co );
741 rbs[k_chpart_arm_l0].co[2] += ua_dims[2] * 0.5f;
742 v3_copy( ch->parts[k_chpart_arm_l1].pivot, rbs[k_chpart_arm_l1].co );
743 rbs[k_chpart_arm_l1].co[2] += la_dims[2] * 0.5f;
744 v3_copy( ch->parts[k_chpart_hand_l].pivot, rbs[k_chpart_hand_l].co );
745 rbs[k_chpart_hand_l].co[2] += hand_dims[2] * 0.5f;
746
747 v3_copy( ch->parts[k_chpart_arm_r0].pivot, rbs[k_chpart_arm_r0].co );
748 rbs[k_chpart_arm_r0].co[2] -= ua_dims[2] * 0.5f;
749 v3_copy( ch->parts[k_chpart_arm_r1].pivot, rbs[k_chpart_arm_r1].co );
750 rbs[k_chpart_arm_r1].co[2] -= la_dims[2] * 0.5f;
751 v3_copy( ch->parts[k_chpart_hand_r].pivot, rbs[k_chpart_hand_r].co );
752 rbs[k_chpart_hand_r].co[2] -= hand_dims[2] * 0.5f;
753
754 /* LEgs */
755 v3f ul_dims = { 0.0f, fabsf(offs[k_chpart_leg_l1][1]), 0.0f };
756 ul_dims[0] = 0.38f*ul_dims[1];
757 ul_dims[2] = 0.38f*ul_dims[1];
758 v3f ll_dims = { ul_dims[0], fabsf(offs[k_chpart_foot_l][1]), ul_dims[2] };
759 v3f foot_dims = { 2.0f*ul_dims[0], ul_dims[0], ul_dims[0] };
760
761 character_rd_box( ch, k_chpart_leg_l0, ul_dims );
762 character_rd_box( ch, k_chpart_leg_r0, ul_dims );
763 character_rd_box( ch, k_chpart_leg_l1, ll_dims );
764 character_rd_box( ch, k_chpart_leg_r1, ll_dims );
765 character_rd_box( ch, k_chpart_foot_l, foot_dims );
766 character_rd_box( ch, k_chpart_foot_r, foot_dims );
767
768 v3_copy( ch->parts[k_chpart_leg_l0].pivot, rbs[k_chpart_leg_l0].co );
769 rbs[k_chpart_leg_l0].co[1] -= ul_dims[1] * 0.5f;
770 v3_copy( ch->parts[k_chpart_leg_l1].pivot, rbs[k_chpart_leg_l1].co );
771 rbs[k_chpart_leg_l1].co[1] -= ll_dims[1] * 0.5f;
772 v3_copy( ch->parts[k_chpart_foot_l].pivot, rbs[k_chpart_foot_l].co );
773 rbs[k_chpart_foot_l].co[1] -= foot_dims[1] * 0.5f;
774 rbs[k_chpart_foot_l].co[0] -= foot_dims[0] * 0.5f;
775
776 v3_copy( ch->parts[k_chpart_leg_r0].pivot, rbs[k_chpart_leg_r0].co );
777 rbs[k_chpart_leg_r0].co[1] -= ul_dims[1] * 0.5f;
778 v3_copy( ch->parts[k_chpart_leg_r1].pivot, rbs[k_chpart_leg_r1].co );
779 rbs[k_chpart_leg_r1].co[1] -= ll_dims[1] * 0.5f;
780 v3_copy( ch->parts[k_chpart_foot_r].pivot, rbs[k_chpart_foot_r].co );
781 rbs[k_chpart_foot_r].co[1] -= foot_dims[1] * 0.5f;
782 rbs[k_chpart_foot_r].co[0] -= foot_dims[0] * 0.5f;
783
784 character_rd_box( ch, k_chpart_sock_l, foot_dims );
785 character_rd_box( ch, k_chpart_sock_r, foot_dims );
786 v3_copy( rbs[k_chpart_foot_l].co, rbs[k_chpart_sock_l].co );
787 v3_copy( rbs[k_chpart_foot_r].co, rbs[k_chpart_sock_r].co );
788
789 box_copy( (boxf){{-0.2f,-0.2f,-0.7f},{0.2f,0.2f,0.7f}},
790 rbs[k_chpart_board].bbx );
791
792 for( int i=0; i<PART_COUNT; i++ )
793 rb_init( &ch->ragdoll[i] );
794
795 character_init_ragdoll_joints( ch );
796 }
797
798 static void character_ragdoll_go( struct character *ch, v3f pos )
799 {
800 character_init_ragdoll( ch );
801 for( int i=0; i<PART_COUNT; i++ )
802 v3_add( pos, ch->ragdoll[i].co, ch->ragdoll[i].co );
803 }
804
805 static void character_ragdoll_copypose( struct character *ch, v3f v )
806 {
807 for( int i=0; i<PART_COUNT; i++ )
808 {
809 rigidbody *rb = &ch->ragdoll[i];
810
811 m4x3_mulv( ch->matrices[i], rb->delta, rb->co );
812 m3x3_q( ch->matrices[i], rb->q );
813 v3_copy( v, rb->v );
814 v3_zero( rb->I );
815 rb->manifold_count = 0; /* ? */
816
817 rb_update_transform( rb );
818 }
819
820 float vel = v3_length(v);
821
822 ch->shoes[0] = 1;
823 ch->shoes[1] = 1;
824 }
825
826 static void character_mimic_ragdoll( struct character *ch )
827 {
828 for( int i=0; i<PART_COUNT; i++ )
829 {
830 rigidbody *rb = &ch->ragdoll[i];
831 v3f *mat = ch->matrices[i];
832
833 m3x3_copy( rb->to_world, mat );
834 v3f inv_delta;
835 v3_negate( rb->delta, inv_delta );
836 m4x3_mulv( rb->to_world, inv_delta, mat[3] );
837 }
838
839 /* Attach wheels to board */
840 m3x3_copy( ch->matrices[k_chpart_board], ch->matrices[k_chpart_wb] );
841 m3x3_copy( ch->matrices[k_chpart_board], ch->matrices[k_chpart_wf] );
842 m4x3_mulv( ch->matrices[k_chpart_board], ch->offsets[k_chpart_wb],
843 ch->matrices[k_chpart_wb][3] );
844 m4x3_mulv( ch->matrices[k_chpart_board], ch->offsets[k_chpart_wf],
845 ch->matrices[k_chpart_wf][3] );
846 }
847
848 static void character_debug_ragdoll( struct character *ch )
849 {
850 rb_debug( &ch->ragdoll[k_chpart_body0], 0xffffffff );
851 rb_debug( &ch->ragdoll[k_chpart_body1], 0xffffffff );
852 rb_debug( &ch->ragdoll[k_chpart_neck], 0xff00ff00 );
853 rb_debug( &ch->ragdoll[k_chpart_head], 0xff00ff00 );
854
855 rb_debug( &ch->ragdoll[k_chpart_arm_l0], 0xffffa500 );
856 rb_debug( &ch->ragdoll[k_chpart_arm_l1], 0xffffa500 );
857 rb_debug( &ch->ragdoll[k_chpart_hand_l], 0xffffa500 );
858
859 rb_debug( &ch->ragdoll[k_chpart_arm_r0], 0xff00a5ff );
860 rb_debug( &ch->ragdoll[k_chpart_arm_r1], 0xff00a5ff );
861 rb_debug( &ch->ragdoll[k_chpart_hand_r], 0xff00a5ff );
862
863 rb_debug( &ch->ragdoll[k_chpart_leg_l0], 0xffffa500 );
864 rb_debug( &ch->ragdoll[k_chpart_leg_l1], 0xffffa500 );
865 rb_debug( &ch->ragdoll[k_chpart_foot_l], 0xffffa500 );
866 rb_debug( &ch->ragdoll[k_chpart_leg_r0], 0xff00a5ff );
867 rb_debug( &ch->ragdoll[k_chpart_leg_r1], 0xff00a5ff );
868 rb_debug( &ch->ragdoll[k_chpart_foot_r], 0xff00a5ff );
869 }
870
871 static void character_ragdoll_iter( struct character *ch, scene *sc )
872 {
873 for( int i=0; i<PART_COUNT; i++ )
874 {
875 rb_build_manifold( &ch->ragdoll[i], sc );
876 }
877
878 v3f rv;
879
880 float shoe_vel[2];
881 for( int i=0; i<2; i++ )
882 if( ch->shoes[i] )
883 shoe_vel[i] = v3_length( ch->ragdoll[i].v );
884
885 for( int i=0; i<20; i++ )
886 {
887 float const k_springfactor = 1.0f/20.0f;
888
889 for( int j=0; j<PART_COUNT; j++ )
890 rb_constraint_manifold( &ch->ragdoll[j] );
891
892 for( int j=0; j<vg_list_size(rd_joints); j++ )
893 {
894 struct rd_joint *joint = &rd_joints[j];
895 rigidbody *rba = &ch->ragdoll[joint->ia],
896 *rbb = &ch->ragdoll[joint->ib];
897
898 rb_constraint_position( rba, joint->lca, rbb, joint->lcb );
899 rb_constraint_angle( rba, joint->maj.va, rbb, joint->maj.vb,
900 joint->maj.ang,
901 joint->maj.spring * k_springfactor );
902
903 rb_constraint_angle( rba, joint->min.va, rbb, joint->min.vb,
904 joint->min.ang,
905 joint->min.spring * k_springfactor );
906 }
907 }
908
909 for( int j=0; j<vg_list_size(rd_joints); j++ )
910 {
911 struct rd_joint *joint = &rd_joints[j];
912 rigidbody *rba = &ch->ragdoll[joint->ia],
913 *rbb = &ch->ragdoll[joint->ib];
914 rb_angle_limit_force( rba, joint->min.va, rbb, joint->min.vb,
915 joint->min.ang );
916 rb_angle_limit_force( rba, joint->maj.va, rbb, joint->maj.vb,
917 joint->maj.ang );
918 }
919
920 for( int i=0; i<PART_COUNT; i++ )
921 rb_iter( &ch->ragdoll[i] );
922
923 for( int i=0; i<2; i++ )
924 {
925 if( ch->shoes[i] )
926 {
927 float a = v3_length( ch->ragdoll[i].v ) - shoe_vel[i];
928
929 if( a > 2.0f )
930 {
931 ch->shoes[i] = 0;
932
933 rigidbody *src = &ch->ragdoll[k_chpart_foot_l];
934 rigidbody *dst = &ch->ragdoll[k_chpart_sock_l];
935
936 v3_copy( src->co, dst->co );
937 v3_copy( src->v, dst->v );
938 v3_copy( src->q, dst->q );
939 v3_copy( src->I, dst->I );
940 }
941 }
942 }
943
944 for( int i=0; i<PART_COUNT; i++ )
945 rb_update_transform( &ch->ragdoll[i] );
946 }
947
948 #endif