much better implicit IK solver
[carveJwlIkooP6JGAAIwe30JlM.git] / anim_test.h
1 #ifndef ANIM_TEST_H
2 #define ANIM_TEST_H
3
4 #include "player.h"
5 #include "skeleton.h"
6 #include "shaders/viewchar.h"
7
8 static struct
9 {
10 struct skeleton skele;
11 struct skeleton_anim *yay;
12
13 glmesh mesh;
14 }
15 animtest;
16
17 static void anim_test_start(void)
18 {
19 mdl_header *johannes = mdl_load( "models/ch_new.mdl" );
20 skeleton_setup( &animtest.skele, johannes );
21 animtest.yay = skeleton_get_anim( &animtest.skele, "pose_stand" );
22 mdl_unpack_glmesh( johannes, &animtest.mesh );
23
24 free( johannes );
25 }
26
27 static void anim_test_update(void)
28 {
29 player_freecam();
30 player_camera_update();
31
32 m4x3f transform;
33 m4x3_identity( transform );
34
35 v4f qt;
36 q_axis_angle( qt, (v3f){0.0f,1.0f,0.0f}, vg_time*1.2f );
37 q_m3x3( qt, transform );
38
39 skeleton_apply_frame( transform, &animtest.skele, animtest.yay, vg_time );
40 skeleton_apply_ik_pass( &animtest.skele );
41
42 skeleton_debug( &animtest.skele );
43 }
44
45 static void anim_test_render( vg_tex2d *tex )
46 {
47 m4x4f world_4x4;
48 m4x3_expand( player.camera_inverse, world_4x4 );
49
50 gpipeline.fov = 60.0f;
51 m4x4_projection( vg_pv, gpipeline.fov,
52 (float)vg_window_x / (float)vg_window_y,
53 0.1f, 2100.0f );
54
55 m4x4_mul( vg_pv, world_4x4, vg_pv );
56 glEnable( GL_DEPTH_TEST );
57
58 shader_viewchar_use();
59 vg_tex2d_bind( tex, 0 );
60 shader_viewchar_uTexMain( 0 );
61 shader_viewchar_uPv( vg_pv );
62 glUniformMatrix4x3fv( _uniform_viewchar_uTransforms,
63 animtest.skele.bone_count,
64 0,
65 (float *)animtest.skele.final_transforms );
66
67 mesh_bind( &animtest.mesh );
68 mesh_draw( &animtest.mesh );
69
70 glDisable( GL_DEPTH_TEST );
71 vg_lines_drawall( (float *)vg_pv );
72 }
73
74 #endif /* ANIM_TEST_H */