#include "ent_miniworld.h"
#include "gui.h"
+#include "shaders/model_entity.h"
+#include "shaders/model_character_view.h"
+#include "shaders/model_board_view.h"
+
static int localplayer_cmd_respawn( int argc, const char *argv[] ){
ent_spawn *rp = NULL, *r;
world_instance *world = world_current_instance();
static void player_init(void){
for( u32 i=0; i<vg_list_size(player_subsystems); i++ ){
struct player_subsystem_interface *sys = player_subsystems[i];
-
if( sys->system_register ) sys->system_register();
}
vg_console_reg_var( "cinema_fixed", &k_cinema_fixed, k_var_dtype_i32, 0 );
vg_console_reg_var( "invert_y", &k_invert_y,
k_var_dtype_i32, VG_VAR_PERSISTENT );
+
+ shader_model_character_view_register();
+ shader_model_board_view_register();
+ shader_model_entity_register();
}
static void player__debugtext( int size, const char *fmt, ... ){
}
static void player__post_update(void){
- if( player_subsystems[ localplayer.subsystem ]->post_update )
- player_subsystems[ localplayer.subsystem ]->post_update();
+ struct player_subsystem_interface *sys =
+ player_subsystems[ localplayer.subsystem ];
+
+ if( sys->post_update ) sys->post_update();
+
+ SDL_AtomicLock( &air_data.sl );
+ air_data.speed = v3_length( localplayer.rb.v ) * vg.time_rate;
+ SDL_AtomicUnlock( &air_data.sl );
}
/*
*/
static void player__pass_gate( u32 id ){
world_instance *world = world_current_instance();
+ skaterift_record_frame( &skaterift.replay, 1 );
/* update boundary hash (network animation) */
u16 index = mdl_entity_id_id(id) & ~NETMSG_BOUNDARY_MASK;
localplayer.boundary_hash ^= NETMSG_GATE_BOUNDARY_BIT;
localplayer.boundary_hash &= ~NETMSG_BOUNDARY_MASK;
localplayer.boundary_hash |= index;
-
+
ent_gate *gate = mdl_arritm( &world->ent_gate, mdl_entity_id_id(id) );
world_routes_fracture( world, gate, localplayer.rb.co, localplayer.rb.v );
localplayer.gate_waiting = gate;
+ localplayer.deferred_frame_record = 1;
struct player_cam_controller *cc = &localplayer.cam_control;
m4x3_mulv( gate->transport, cc->tpv_lpf, cc->tpv_lpf );
world_static.active_instance = gate->target;
player__clean_refs();
+
+ replay_clear( &skaterift.replay );
}
- else
+ else {
world_routes_activate_entry_gate( world, gate );
+ }
v3f v0;
v3_angles_vector( localplayer.angles, v0 );
audio_lock();
audio_oneshot( &audio_gate_pass, 1.0f, 0.0f );
audio_unlock();
-
- replay_clear( &skaterift.replay );
}
static void player_apply_transport_to_cam( m4x3f transport ){
- /* FIXME: Applies to skaterift.cam directly! */
-
/* Pre-emptively edit the camera matrices so that the motion vectors
* are correct */
m4x3f transport_i;
[k_skaterift_replay] = "replay",
[k_skaterift_ent_focus] = "ent_focus",
[k_skaterift_default] = "default",
- [k_skaterift_respawning]= "map"
+ [k_skaterift_world_map] = "world map"
} [skaterift.activity] );
player__debugtext( 1, "time_rate: %.4f", skaterift.time_rate );
}
};
-static void player__networked_sfx( u8 system, u8 priority, u8 id,
- v3f pos, f32 volume ){
- struct net_sfx null, *sfx = &null;
-
- if( localplayer.sfx_buffer_count < vg_list_size(localplayer.sfx_buffer) )
- sfx = &localplayer.sfx_buffer[ localplayer.sfx_buffer_count ++ ];
+static struct net_sfx *find_lower_priority_sfx( struct net_sfx *buffer, u32 len,
+ u32 *count, u8 priority ){
+ struct net_sfx *p_sfx = NULL;
+ if( *count < len ){
+ p_sfx = &buffer[ *count ];
+ *count = *count+1;
+ }
else {
- for( u32 i=0; i<vg_list_size(localplayer.sfx_buffer); i++ ){
- struct net_sfx *a = &localplayer.sfx_buffer[i];
+ for( u32 i=0; i<len; i++ ){
+ struct net_sfx *a = &buffer[i];
if( a->priority < priority ){
- sfx = a;
+ p_sfx = a;
break;
}
}
}
- sfx->id = id;
- sfx->priority = priority;
- sfx->volume = volume;
- v3_copy( pos, sfx->location );
- sfx->system = system;
+ return p_sfx;
+}
+static void player__networked_sfx( u8 system, u8 priority, u8 id,
+ v3f pos, f32 volume ){
+ struct net_sfx sfx,
+ *p_net = find_lower_priority_sfx(
+ localplayer.sfx_buffer, 4,
+ &localplayer.sfx_buffer_count, priority ),
+ *p_replay = find_lower_priority_sfx(
+ localplayer.local_sfx_buffer, 2,
+ &localplayer.local_sfx_buffer_count, priority );
+
+ sfx.id = id;
+ sfx.priority = priority;
+ sfx.volume = volume;
+ v3_copy( pos, sfx.location );
+ sfx.system = system;
+
+ /* we only care about subframe in networked sfx. local replays run at a
+ * high enough framerate. */
f32 t = (vg.time_real - network_client.last_frame) / NETWORK_FRAMERATE;
- sfx->subframe = vg_clampf( t, 0.0f, 1.0f );
+ sfx.subframe = vg_clampf( t, 0.0f, 1.0f );
- net_sfx_play( sfx );
-}
+ if( p_net ) *p_net = sfx;
+ if( p_replay ) *p_replay = sfx;
-static void player__clear_sfx_buffer(void){
- localplayer.sfx_buffer_count = 0;
+ net_sfx_play( &sfx );
}
/* implementation */
#include "player_common.c"
+
#include "player_walk.c"
#include "player_skate.c"
#include "player_dead.c"
#include "player_drive.c"
+#include "player_basic_info.c"
+
#include "player_render.c"
#include "player_ragdoll.c"
#include "player_replay.c"