add engine settings
[carveJwlIkooP6JGAAIwe30JlM.git] / player.c
index 74d56f30d08de71817844512a09c822eeb0508cb..c115162099fb6d4b075ebcccb8f420b90eda5632 100644 (file)
--- a/player.c
+++ b/player.c
 #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();
@@ -50,6 +54,10 @@ static void player_init(void){
    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, ... ){
@@ -107,8 +115,14 @@ static void player__update(void){
 }
 
 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 );
 }
 
 /*
@@ -116,6 +130,7 @@ static void player__post_update(void){
  */
 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;
@@ -127,6 +142,7 @@ static void player__pass_gate( u32 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 );
@@ -145,9 +161,12 @@ static void player__pass_gate( u32 id ){
 
       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 );
@@ -157,13 +176,9 @@ static void player__pass_gate( u32 id ){
    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;
@@ -214,7 +229,7 @@ static void player__im_gui(void){
                                        [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 );
 
@@ -308,36 +323,51 @@ static void net_sfx_play( struct net_sfx *sfx ){
    }
 };
 
-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 */