{ .path="sound/skate.ogg" },
{ .path="sound/wheel.ogg" },
{ .path="sound/slide.ogg" },
- { .path="sound/reverb.ogg" }
+ { .path="sound/reverb.ogg" },
+ { .path="sound/grind_loop.ogg" },
+ { .path="sound/grind_enter.ogg" },
+ { .path="sound/grind_exit.ogg" }
};
audio_clip audio_splash =
.name = "Player3",
};
+audio_player audio_player4 =
+{
+ .name = "Player4",
+};
+
audio_player audio_player_extra =
{
.name = "PlayerInst"
audio_player_init( &audio_player1 );
audio_player_init( &audio_player2 );
audio_player_init( &audio_player3 );
+ audio_player_init( &audio_player4 );
audio_player_init( &audio_player_gate );
audio_player_init( &ambient_player );
audio_player_init( &ambient_sprites[0] );
audio_player_set_flags( &audio_player0, flags );
audio_player_set_flags( &audio_player1, flags );
audio_player_set_flags( &audio_player2, flags );
+ audio_player_set_flags( &audio_player4, flags );
audio_player_set_flags( &audio_player_gate, flags );
audio_player_set_flags( &audio_player3, AUDIO_FLAG_LOOP );
audio_player_set_flags( &ambient_player, AUDIO_FLAG_LOOP );
audio_player_playclip( &audio_player1, &audio_board[1] );
audio_player_playclip( &audio_player2, &audio_board[2] );
audio_player_playclip( &audio_player3, &audio_board[3] );
+ audio_player_playclip( &audio_player4, &audio_board[4] );
audio_player_playclip( &ambient_player, &audio_ambience[0] );
audio_player_playclip( &audio_player_gate, &audio_gate_ambient );
});
}
-VG_STATIC void audio_free(void*_)
+VG_STATIC void audio_free(void)
{
/* TODO! */
vg_warn( "UNIMPLEMENTED: audio_free()\n" );
vg_shader_set_include_dir( "shaders" );
_shader( "blit", "shaders/blit.vs", "shaders/blit.fs" );
- _shader( "blit", "shaders/blit.vs", "shaders/blit.fs" );
+ _shader( "blitblur", "shaders/blit.vs", "shaders/blitblur.fs" );
_shader( "standard", "shaders/standard.vs", "shaders/standard.fs" );
_shader( "vblend", "shaders/standard.vs", "shaders/vblend.fs" );
_shader( "terrain", "shaders/standard.vs", "shaders/terrain.fs" );
VG_STATIC void network_update(void);
/* Call it at shutdown */
-VG_STATIC void network_end(void*_);
+VG_STATIC void network_end(void);
/*
* Can buffer up a bunch of these by calling many times, they will be
}
}
-VG_STATIC void network_end(void*_)
+VG_STATIC void network_end(void)
{
/* TODO: Fire off any buffered highscores that need to be setn */
if( cremote_state == k_ESteamNetworkingConnectionState_Connected ||
VG_STATIC void network_init(void){}
VG_STATIC void network_update(void){}
-VG_STATIC void network_end(void*_){}
+VG_STATIC void network_end(void){}
#endif /* SR_NETWORKED */
#endif /* NETWORK_H */
};
for( int i=0; i<vg_list_size(default_cfg); i++ )
- execute_console_input(default_cfg[i]);
+ vg_execute_console_input(default_cfg[i]);
rb_init( &player.phys.rb );
rb_init( &player.collide_front );
audio_player_set_position( &audio_player0, phys->rb.co );
audio_player_set_position( &audio_player1, phys->rb.co );
audio_player_set_position( &audio_player2, phys->rb.co );
+ audio_player_set_position( &audio_player4, phys->rb.co );
audio_player_set_position( &audio_player_gate, world.render_gate_pos );
audio_player_set_vol( &audio_player_gate, 5.0f );
audio_player_set_vol( &audio_player1, 0.0f );
audio_player_set_vol( &audio_player2, 0.0f );
audio_player_set_vol( &audio_player3, 0.0f );
+ audio_player_set_vol( &audio_player4, 0.0f );
int walk_phase = 0;
if( vg_fractf(player.walk_timer) > 0.5f )
float speed = vg_minf(v3_length( phys->rb.v )*0.1f,1.0f),
attn = speed,
slide = vg_clampf( fabsf(phys->slip), 0.0f, 1.0f ),
- vol0 = (1.0f-air)*attn*(1.0f-slide),
- vol1 = air *attn,
- vol2 = (1.0f-air)*attn*slide;
+ grind = phys->grind,
+ vol0 = (1.0f-air)*attn*(1.0f-slide)*(1.0f-grind),
+ vol1 = air *attn*(1.0f-grind),
+ vol2 = (1.0f-air)*attn*slide*(1.0f-grind),
+ vol4 = grind*2.0f;
audio_player_set_vol( &audio_player0, vol0*vg.time_rate );
audio_player_set_vol( &audio_player1, vol1*vg.time_rate );
audio_player_set_vol( &audio_player2, vol2*vg.time_rate );
+ audio_player_set_vol( &audio_player4, vol4*vg.time_rate );
float reverb_amt = vol0 * audio_occlusion_current * 0.5f;
+
audio_player_set_pan( &audio_player3, 0.0f );
audio_player_set_vol( &audio_player3, reverb_amt*vg.time_rate );
}
int len = player_update_collision_manifold( manifold );
int grind_col = player_update_grind_collision( &manifold[len] );
+ static int _grind_col_pre = 0;
+
if( grind_col )
{
phys->grind = 1;
q_mul( correction, phys->rb.q, phys->rb.q );
}
- float const DOWNFORCE = -k_downforce*2.0f*VG_TIMESTEP_FIXED;
- v3_muladds( phys->rb.v, phys->rb.up, DOWNFORCE, phys->rb.v );
+ float const DOWNFORCE = -k_downforce*1.2f*VG_TIMESTEP_FIXED;
+ v3_muladds( phys->rb.v, manifold[len].n, DOWNFORCE, phys->rb.v );
m3x3_identity( phys->vr );
m3x3_identity( phys->vr_pstep );
+
+ if( !_grind_col_pre )
+ {
+ audio_lock();
+ audio_player_set_flags( &audio_player_extra,
+ AUDIO_FLAG_SPACIAL_3D );
+ audio_player_set_position( &audio_player_extra, phys->rb.co );
+ audio_player_set_vol( &audio_player_extra, 20.0f );
+ audio_player_playclip( &audio_player_extra, &audio_board[5] );
+ audio_unlock();
+ }
}
else
{
phys->grind = 0;
player_adhere_ground( manifold, len );
+
+ if( _grind_col_pre )
+ {
+ audio_lock();
+ audio_player_set_flags( &audio_player_extra,
+ AUDIO_FLAG_SPACIAL_3D );
+ audio_player_set_position( &audio_player_extra, phys->rb.co );
+ audio_player_set_vol( &audio_player_extra, 20.0f );
+ audio_player_playclip( &audio_player_extra, &audio_board[6] );
+ audio_unlock();
+ }
}
+ _grind_col_pre = grind_col;
+
rb_presolve_contacts( manifold, len+ VG_MAX(0,grind_col) );
player_collision_response( manifold, len+ VG_MAX(0,grind_col) );
#include "model.h"
#include "shaders/blit.h"
+#include "shaders/blitblur.h"
#include "shaders/standard.h"
#include "shaders/vblend.h"
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
gpipeline.rgb_background, 0);
vg_info( "[render] Allocate quad\n" );
float quad[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
- 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f };
+ 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+
+ 0.2f, 0.0f, 0.8f, 1.0f, 0.2f, 1.0f,
+ 0.2f, 0.0f, 0.8f, 0.0f, 0.8f, 1.0f};
glGenVertexArrays( 1, &gpipeline.fsquad.vao );
glGenBuffers( 1, &gpipeline.fsquad.vbo );
VG_STATIC void render_init(void)
{
shader_blit_register();
+ shader_blitblur_register();
shader_standard_register();
shader_vblend_register();
glDrawArrays( GL_TRIANGLES, 0, 6 );
}
+VG_STATIC void render_fsquad1(void)
+{
+ glBindVertexArray( gpipeline.fsquad.vao );
+ glDrawArrays( GL_TRIANGLES, 6, 6 );
+}
+
#endif /* RENDER_H */
--- /dev/null
+out vec4 FragColor;
+uniform sampler2D uTexMain;
+
+in vec2 aUv;
+
+vec2 rand_hash22( vec2 p )
+{
+ vec3 p3 = fract(vec3(p.xyx) * 213.8976123);
+ p3 += dot(p3, p3.yzx+19.19);
+ return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));
+}
+
+void main()
+{
+ vec2 voffset = rand_hash22( aUv );
+
+ float bamt = abs(aUv.x-0.5)*2.0;
+ bamt = pow(bamt,4.0)*0.05;
+
+ FragColor = texture( uTexMain, aUv + voffset*bamt );
+}
--- /dev/null
+#ifndef SHADER_blitblur_H
+#define SHADER_blitblur_H
+static void shader_blitblur_link(void);
+static void shader_blitblur_register(void);
+static struct vg_shader _shader_blitblur = {
+ .name = "blitblur",
+ .link = shader_blitblur_link,
+ .vs =
+{
+.static_src =
+"layout (location=0) in vec2 a_co;\n"
+"out vec2 aUv;\n"
+"\n"
+"void main()\n"
+"{\n"
+" gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
+" aUv = a_co;\n"
+"}\n"
+""},
+ .fs =
+{
+.static_src =
+"out vec4 FragColor;\n"
+"uniform sampler2D uTexMain;\n"
+"\n"
+"in vec2 aUv;\n"
+"\n"
+"vec2 rand_hash22( vec2 p )\n"
+"{\n"
+" vec3 p3 = fract(vec3(p.xyx) * 213.8976123);\n"
+" p3 += dot(p3, p3.yzx+19.19);\n"
+" return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));\n"
+"}\n"
+"\n"
+"void main()\n"
+"{\n"
+" vec2 voffset = rand_hash22( aUv );\n"
+" \n"
+" float bamt = abs(aUv.x-0.5)*2.0;\n"
+" bamt = pow(bamt,4.0)*0.05;\n"
+"\n"
+" FragColor = texture( uTexMain, aUv + voffset*bamt );\n"
+"}\n"
+""},
+};
+
+static GLuint _uniform_blitblur_uTexMain;
+static void shader_blitblur_uTexMain(int i){
+ glUniform1i(_uniform_blitblur_uTexMain,i);
+}
+static void shader_blitblur_register(void){
+ vg_shader_register( &_shader_blitblur );
+}
+static void shader_blitblur_use(void){ glUseProgram(_shader_blitblur.id); }
+static void shader_blitblur_link(void){
+ _uniform_blitblur_uTexMain = glGetUniformLocation( _shader_blitblur.id, "uTexMain" );
+}
+#endif /* SHADER_blitblur_H */
return 0;
}
-VG_STATIC void highscores_save_at_exit(void*_)
+VG_STATIC void highscores_save_at_exit(void)
{
highscores_serialize_all();
}
if( !highscores_read() )
highscores_create_db();
- vg_loader_highwater( NULL, highscores_save_at_exit, NULL );
-
- //vg_sleep_ms(200);
+ vg_loader_step( NULL, highscores_save_at_exit );
steam_init();
- vg_loader_highwater( NULL, steam_end, NULL );
- vg_loader_highwater( network_init, network_end, NULL );
+ vg_loader_step( NULL, steam_end );
+ vg_loader_step( network_init, network_end );
}
VG_STATIC void vg_load(void)
{
- vg_loader_highwater( render_init, NULL, NULL );
- vg_loader_highwater( menu_init, NULL, NULL );
- vg_loader_highwater( world_init, NULL, NULL );
- vg_loader_highwater( player_init, NULL, NULL );
+ vg_loader_step( render_init, NULL );
+ vg_loader_step( menu_init, NULL );
+ vg_loader_step( world_init, NULL );
+ vg_loader_step( player_init, NULL );
vg_bake_shaders();
- vg_loader_highwater( audio_init, audio_free, NULL );
+ vg_loader_step( audio_init, audio_free );
world_audio_init();
/* 'systems' are completely loaded now */
vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff );
}
-VG_STATIC void vg_update( int loaded )
+VG_STATIC void vg_update(void)
{
steam_update();
- if( loaded )
+ if( vg.is_loaded )
{
draw_origin_axis();
network_update();
}
}
-VG_STATIC void vg_update_fixed( int loaded )
+VG_STATIC void vg_update_fixed(void)
{
- if( loaded )
+ if( vg.is_loaded )
{
player_update_fixed();
}
}
-VG_STATIC void vg_update_post( int loaded )
+VG_STATIC void vg_update_post(void)
{
- if( loaded )
+ if( vg.is_loaded )
{
player_update_post();
menu_update();
#ifndef STEAM_H
#define STEAM_H
+#define VG_GAME
#include "vg/vg_steam.h"
#include "vg/vg_steam_utils.h"
#include "vg/vg_steam_networking.h"
}
}
-VG_STATIC void steam_end(void *nothing)
+VG_STATIC void steam_end(void)
{
if( steam_ready )
{
/* Other systems */
vg_info( "Loading other world systems\n" );
- vg_loader_highwater( world_render_init, NULL, NULL );
- vg_loader_highwater( world_sfd_init, NULL, NULL );
- vg_loader_highwater( world_water_init, NULL, NULL );
- vg_loader_highwater( world_gates_init, NULL, NULL );
- vg_loader_highwater( world_routes_init, NULL, NULL );
+ vg_loader_step( world_render_init, NULL );
+ vg_loader_step( world_sfd_init, NULL );
+ vg_loader_step( world_water_init, NULL );
+ vg_loader_step( world_gates_init, NULL );
+ vg_loader_step( world_routes_init, NULL );
/* Allocate dynamic world memory arena */
u32 max_size = 76*1024*1024;
{
world.switching_to_new_world = 0;
world_unload();
- world_load();
+ vg_loader_start( world_load );
+ return;
}
}
-
world.sky_time += world.sky_rate * vg.time_delta;
world.sky_rate = vg_lerp( world.sky_rate, world.sky_target_rate,
vg.time_delta * 5.0 );
VG_STATIC void world_unload(void)
{
+ vg_acquire_thread_sync();
+
/* free meshes */
mesh_free( &world.mesh_route_lines );
mesh_free( &world.mesh_geo );
world.collector_count = 0;
world.water.enabled = 0;
+
+ vg_release_thread_sync();
}
VG_STATIC void world_load(void)