k_pitch_limit = 1.5f,
k_look_speed = 2.0f,
- k_spin_boost = 1.5f,
+ k_spin_boost = 2.2f,
k_cog_spring = 0.2f,
k_cog_damp = 0.02f,
skate_apply_air_model( player, s );
skate_integrate( player, s );
+
+ vg_line_pt3( s->state.cog, 0.1f, VG__WHITE );
+ vg_line_pt3( s->state.cog, 0.11f, VG__WHITE );
+ vg_line_pt3( s->state.cog, 0.12f, VG__WHITE );
+ vg_line_pt3( s->state.cog, 0.13f, VG__WHITE );
+ vg_line_pt3( s->state.cog, 0.14f, VG__WHITE );
+
+ vg_line( player->rb.co, s->state.cog, VG__RED );
}
VG_STATIC void player_skate_post_update( player_interface *player,
v3f offset;
v3_zero( offset );
+ m4x3_mulv( player->rb.to_local, s->state.cog, offset );
+ v3_muls( offset, -4.0f, offset );
+
#if 0
m3x3_mulv( player.inv_visual_transform, phys->bob, offset );
#endif
look_dir;
v3_copy( player->rb.v, vel_dir );
- v3_normalize( vel_dir );
+ //v3_normalize( vel_dir );
float tti = s->land_dist;
v3f norm;
v3_copy( player->rb.to_world[1], norm );
}
-
v3_muladds( vel_dir, norm, -v3_dot(vel_dir,norm), flat_dir );
- v3_normalize( flat_dir );
+ //v3_normalize( flat_dir );
v3_lerp( flat_dir, vel_dir, vg_clampf( tti / 2.0f, 0.4f, 1.0f ), look_dir );
- v3_lerp( s->state.vl, look_dir, 8.0f*vg.time_delta, s->state.vl );
+ v3_lerp( s->state.vl, look_dir, 4.0f*vg.time_delta, s->state.vl );
float *v = s->state.vl,
yaw = atan2f( v[0], -v[2] ),
struct player_device_skate *s = at->storage;
m4x3_mulv( gate->transport, player->rb.co, player->rb.co );
+ m3x3_mulv( gate->transport, player->rb.v, player->rb.v );
m4x3_mulv( gate->transport, s->state.cog, s->state.cog );
m3x3_mulv( gate->transport, s->state.cog_v, s->state.cog_v );
- m3x3_mulv( gate->transport, player->rb.v, player->rb.v );
m3x3_mulv( gate->transport, s->state.vl, s->state.vl );
+ m3x3_mulv( gate->transport, s->state.throw_v, s->state.throw_v );
v4f transport_rotation;
m3x3_q( gate->transport, transport_rotation );
q_mul( transport_rotation, player->rb.q, player->rb.q );
+ rb_update_transform( &player->rb );
s->state_gate_storage = s->state;
}
+VG_STATIC void player_skate_reset( player_interface *player,
+ player_attachment *at,
+ struct respawn_point *rp )
+{
+ struct player_device_skate *s = at->storage;
+ v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
+}
+
VG_STATIC player_device player_device_skate =
{
.pre_update = player_skate_pre_update,
.debug_ui = player_skate_ui,
.bind = player_skate_bind,
.pose = player_skate_pose,
- .gate_transport= player_skate_transport
+ .gate_transport= player_skate_transport,
+ .reset = player_skate_reset
};
#endif /* PLAYER_DEVICE_SKATE_H */
v3_zero( player->rb.w );
q_identity( player->rb.q );
rb_update_transform( &player->rb );
+
+ if( player->dev.device->reset )
+ player->dev.device->reset( player, &player->dev, rp );
}
/*
.link = shader_fscolour_link,
.vs =
{
+.orig_file = "../../shaders/blit.vs",
.static_src =
"layout (location=0) in vec2 a_co;\n"
"out vec2 aUv;\n"
""},
.fs =
{
+.orig_file = "../../shaders/colour.fs",
.static_src =
"out vec4 FragColor;\n"
"uniform vec4 uColour;\n"
static GLuint _uniform_fscolour_uColour;
static void shader_fscolour_uColour(v4f v){
- glUniform4fv(_uniform_fscolour_uColour,1,v);
+ glUniform4fv( _uniform_fscolour_uColour, 1, v );
}
static void shader_fscolour_register(void){
vg_shader_register( &_shader_fscolour );
.link = shader_gate_link,
.vs =
{
+.orig_file = "../../shaders/gate.vs",
.static_src =
"layout (location=0) in vec3 a_co;\n"
"layout (location=1) in vec3 a_norm;\n"
""},
.fs =
{
+.orig_file = "../../shaders/gate.fs",
.static_src =
"out vec4 FragColor;\n"
"\n"
static GLuint _uniform_gate_uTime;
static GLuint _uniform_gate_uCam;
static void shader_gate_uPv(m4x4f m){
- glUniformMatrix4fv(_uniform_gate_uPv,1,GL_FALSE,(float*)m);
+ glUniformMatrix4fv( _uniform_gate_uPv, 1, GL_FALSE, (float *)m );
}
static void shader_gate_uMdl(m4x3f m){
- glUniformMatrix4x3fv(_uniform_gate_uMdl,1,GL_FALSE,(float*)m);
+ glUniformMatrix4x3fv( _uniform_gate_uMdl, 1, GL_FALSE, (float *)m );
}
static void shader_gate_uTexMain(int i){
- glUniform1i(_uniform_gate_uTexMain,i);
+ glUniform1i( _uniform_gate_uTexMain, i );
}
static void shader_gate_uTexWater(int i){
- glUniform1i(_uniform_gate_uTexWater,i);
+ glUniform1i( _uniform_gate_uTexWater, i );
}
static void shader_gate_uInvRes(v2f v){
- glUniform2fv(_uniform_gate_uInvRes,1,v);
+ glUniform2fv( _uniform_gate_uInvRes, 1, v );
}
static void shader_gate_uTime(float f){
- glUniform1f(_uniform_gate_uTime,f);
+ glUniform1f( _uniform_gate_uTime, f );
}
static void shader_gate_uCam(v3f v){
- glUniform3fv(_uniform_gate_uCam,1,v);
+ glUniform3fv( _uniform_gate_uCam, 1, v );
}
static void shader_gate_register(void){
vg_shader_register( &_shader_gate );
.link = shader_planeinf_link,
.vs =
{
+.orig_file = "../../shaders/standard.vs",
.static_src =
"layout (location=0) in vec3 a_co;\n"
"layout (location=1) in vec3 a_norm;\n"
"layout (location=5) in ivec4 a_groups;\n"
"\n"
"#line 2 0 \n"
+"#line 1 2 \n"
+"const float k_motion_lerp_amount = 0.01;\n"
+"\n"
+"#line 2 0 \n"
+"\n"
+"out vec3 aMotionVec0;\n"
+"out vec3 aMotionVec1;\n"
+"\n"
+"void vs_motion_out( vec4 vproj0, vec4 vproj1 )\n"
+"{\n"
+" // This magically solves some artifacting errors!\n"
+" //\n"
+" vproj1 = vproj0*(1.0-k_motion_lerp_amount) + vproj1*k_motion_lerp_amount;\n"
+"\n"
+" aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
+" aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
+"}\n"
+"\n"
+"#line 3 0 \n"
"\n"
"uniform mat4x3 uMdl;\n"
"uniform mat4 uPv;\n"
-"\n"
-"uniform mat4x3 uMotion;\n"
+"uniform mat4 uPvmPrev;\n"
"\n"
"out vec4 aColour;\n"
"out vec2 aUv;\n"
"out vec3 aCo;\n"
"out vec3 aWorldCo;\n"
"\n"
-"out vec3 aMotionVec0;\n"
-"out vec3 aMotionVec1;\n"
-"\n"
"void main()\n"
"{\n"
-" vec3 world_pos0 = uMdl * vec4(a_co,1.0);\n"
-" vec3 world_pos1 = uMotion * vec4(world_pos0,1.0);\n"
-" \n"
-" vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
-" vec4 vproj1 = uPv * vec4( world_pos1, 1.0 );\n"
+" vec3 world_pos0 = uMdl * vec4( a_co, 1.0 );\n"
+" vec4 vproj0 = uPv * vec4( world_pos0, 1.0 );\n"
+" vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 );\n"
"\n"
-" aMotionVec0 = vec3( vproj0.xy, vproj0.w );\n"
-" aMotionVec1 = vec3( vproj1.xy, vproj1.w );\n"
+" vs_motion_out( vproj0, vproj1 );\n"
"\n"
" gl_Position = vproj0;\n"
" aWorldCo = world_pos0;\n"
""},
.fs =
{
+.orig_file = "../../shaders/planeinf.fs",
.static_src =
"\n"
"#line 2 0 \n"
static GLuint _uniform_planeinf_uMdl;
static GLuint _uniform_planeinf_uPv;
-static GLuint _uniform_planeinf_uMotion;
+static GLuint _uniform_planeinf_uPvmPrev;
static GLuint _uniform_planeinf_uCamera;
static GLuint _uniform_planeinf_uPlane;
static void shader_planeinf_uMdl(m4x3f m){
- glUniformMatrix4x3fv(_uniform_planeinf_uMdl,1,GL_FALSE,(float*)m);
+ glUniformMatrix4x3fv( _uniform_planeinf_uMdl, 1, GL_FALSE, (float *)m );
}
static void shader_planeinf_uPv(m4x4f m){
- glUniformMatrix4fv(_uniform_planeinf_uPv,1,GL_FALSE,(float*)m);
+ glUniformMatrix4fv( _uniform_planeinf_uPv, 1, GL_FALSE, (float *)m );
}
-static void shader_planeinf_uMotion(m4x3f m){
- glUniformMatrix4x3fv(_uniform_planeinf_uMotion,1,GL_FALSE,(float*)m);
+static void shader_planeinf_uPvmPrev(m4x4f m){
+ glUniformMatrix4fv( _uniform_planeinf_uPvmPrev, 1, GL_FALSE, (float *)m );
}
static void shader_planeinf_uCamera(v3f v){
- glUniform3fv(_uniform_planeinf_uCamera,1,v);
+ glUniform3fv( _uniform_planeinf_uCamera, 1, v );
}
static void shader_planeinf_uPlane(v4f v){
- glUniform4fv(_uniform_planeinf_uPlane,1,v);
+ glUniform4fv( _uniform_planeinf_uPlane, 1, v );
}
static void shader_planeinf_register(void){
vg_shader_register( &_shader_planeinf );
static void shader_planeinf_link(void){
_uniform_planeinf_uMdl = glGetUniformLocation( _shader_planeinf.id, "uMdl" );
_uniform_planeinf_uPv = glGetUniformLocation( _shader_planeinf.id, "uPv" );
- _uniform_planeinf_uMotion = glGetUniformLocation( _shader_planeinf.id, "uMotion" );
+ _uniform_planeinf_uPvmPrev = glGetUniformLocation( _shader_planeinf.id, "uPvmPrev" );
_uniform_planeinf_uCamera = glGetUniformLocation( _shader_planeinf.id, "uCamera" );
_uniform_planeinf_uPlane = glGetUniformLocation( _shader_planeinf.id, "uPlane" );
}
vec3 halfview = uCamera - aWorldCo;
float fdist = length( halfview );
halfview /= fdist;
+ fdist -= 0.08;
vec3 qnorm = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);
vfrag = do_light_shadowing( vfrag );
vfrag = apply_fog( vfrag, fdist );
- float opacity = clamp( fdist*fdist, 0.1, 1.0 );
+ float opacity = clamp( fdist*fdist, 0.0, 1.0 );
oColour = vec4(vfrag,opacity);
}
" vec3 halfview = uCamera - aWorldCo;\n"
" float fdist = length( halfview );\n"
" halfview /= fdist;\n"
+" fdist -= 0.08;\n"
"\n"
" vec3 qnorm = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);\n"
"\n"
" vfrag = do_light_shadowing( vfrag );\n"
" vfrag = apply_fog( vfrag, fdist );\n"
"\n"
-" float opacity = clamp( fdist*fdist, 0.1, 1.0 );\n"
+" float opacity = clamp( fdist*fdist, 0.0, 1.0 );\n"
" oColour = vec4(vfrag,opacity);\n"
"}\n"
""},