- if( (sa->valid != sb->valid) && (sa->valid||sb->valid) )
- {
- int line = dir==0? 0:2,
- axis = dir==0? 2:0;
-
- v3f tri[3];
- ray_world_get_tri( sa->valid? &sa->hit: &sb->hit, tri );
-
- v3f other = {0,0,0};
- other[axis] = sa->valid? k_gridscale: -k_gridscale;
- v3_add( sa->valid? sa->hit.pos: sb->hit.pos, other, other );
- vg_line( sa->valid? sa->hit.pos: sb->hit.pos,
- other, 0xffffffff );
-
- v3f sample;
- if( dir == 0 )
- v3_muladds( grid_origin, (v3f){ x, 0, y }, k_gridscale, sample);
- else
- v3_muladds( grid_origin, (v3f){ y, 0, x }, k_gridscale, sample);
-
- /* Clip triangles until we find an edge inside the cell */
- float offset = sample[line],
- basis = sample[axis];
-
- for( int i=0; i<3; i++ )
- {
- int ia = i,
- ib = (i+1)%3;
- float pa = tri[ia][line],
- pb = tri[ib][line];
-
- vg_line( tri[ia],tri[ib],0xffaaaaaa );
-
- if( (pa-offset)*(pb-offset) > 0.0f )
- continue;
-
- float d = pb-pa,
- qa = (offset-pa)/d,
- h = qa*tri[ib][axis] + (1.0f-qa)*tri[ia][axis],
- q = (h-basis)/k_gridscale;
-
- if( q >= 0.0f && q <= 1.0f )
- {
- float height = qa*tri[ia][1] + (1.0f-qa)*tri[ib][1];
- v3f intersection;
- if( dir == 0 )
- v3_copy( (v3f){ offset, height, h }, intersection );
- else
- v3_copy( (v3f){ h, height, offset }, intersection );
- draw_cross( intersection, 0xffff0000, 0.06f );
- break;
- }
- }
- }
- }
- }
- }
-#endif
- v3f fwd = { -sinf(-player.angles[0]), 0.0f, -cosf(-player.angles[0]) },
- side = { -fwd[2], 0.0f, fwd[0] };
-
- /* Temp */
- if( glfwGetKey( vg_window, GLFW_KEY_W ) )
- v3_muladds( player.co, fwd, ktimestep*k_walkspeed, player.co );
- if( glfwGetKey( vg_window, GLFW_KEY_S ) )
- v3_muladds( player.co, fwd, -ktimestep*k_walkspeed, player.co );
-
- if( glfwGetKey( vg_window, GLFW_KEY_A ) )
- v3_muladds( player.co, side, -ktimestep*k_walkspeed, player.co );
- if( glfwGetKey( vg_window, GLFW_KEY_D ) )
- v3_muladds( player.co, side, ktimestep*k_walkspeed, player.co );
-
- m4x3_mulv( player.to_world, (v3f){0.0f,1.8f,0.0f}, player.camera_pos );
- player_mouseview();
- player_transform_update();
+ float walk_norm = 30.0f/(float)player.mdl.anim_walk->length,
+ run_norm = 30.0f/(float)player.mdl.anim_run->length,
+ t = player.walk_timer,
+ l = vg_get_axis("grabr") * 0.5f + 0.5f;
+
+ skeleton_sample_anim( sk, player.mdl.anim_walk, t*walk_norm, apose );
+ skeleton_sample_anim( sk, player.mdl.anim_run, t*run_norm, bpose );
+
+ skeleton_lerp_pose( sk, apose, bpose, l, apose );
+
+ float idle_walk = vg_minf( l * 10.0f, 1.0f);
+
+ skeleton_sample_anim( sk, player.mdl.anim_idle, vg_time*0.1f, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose );
+
+ skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik );
+ skeleton_apply_ik_pass( &player.mdl.sk );
+ skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_deffered_only );
+
+ v3_copy( player.mdl.sk.final_mtx[player.mdl.id_head-1][3],
+ player.mdl.cam_pos );
+
+ skeleton_apply_inverses( &player.mdl.sk );
+
+ m4x3f mtx;
+ v4f rot;
+ q_axis_angle( rot, (v3f){0.0f,1.0f,0.0f}, -player.angles[0] - VG_PIf*0.5f );
+ q_m3x3( rot, mtx );
+ v3_copy( player.rb.to_world[3], mtx[3] );
+
+ skeleton_apply_transform( &player.mdl.sk, mtx );
+ skeleton_debug( &player.mdl.sk );