entities zones
[carveJwlIkooP6JGAAIwe30JlM.git] / player.c
index 4c8f76a755bc2e2f9f31d374085a7f8b199dafc9..d2e8d6f4a671b10926d0770b06896c3736cf06db 100644 (file)
--- a/player.c
+++ b/player.c
@@ -176,10 +176,15 @@ VG_STATIC void player_apply_transport_to_cam( m4x3f transport )
    m4x3_expand( transport_i, transport_4 );
    m4x4_mul( main_camera.mtx.pv, transport_4, main_camera.mtx.pv );
    m4x4_mul( main_camera.mtx.v,  transport_4, main_camera.mtx.v );
+
+   /* we want the regular transform here no the inversion */
+   m4x3_expand( transport, transport_4 );
+   m4x4_mul( gate_camera.mtx.pv, transport_4, gate_camera.mtx.pv );
+   m4x4_mul( gate_camera.mtx.v,  transport_4, gate_camera.mtx.v );
 }
 
 __attribute__ ((deprecated))
-VG_STATIC void gate_rotate_angles( teleport_gate *gate, v3f angles, v3f d )
+VG_STATIC void gate_rotate_angles( ent_gate *gate, v3f angles, v3f d )
 {
    v3_copy( angles, d );
    return;
@@ -197,9 +202,10 @@ VG_STATIC void gate_rotate_angles( teleport_gate *gate, v3f angles, v3f d )
  * Applies gate transport to a player_interface
  */
 PLAYER_API
-void player__pass_gate( player_instance *player, teleport_gate *gate )
+void player__pass_gate( player_instance *player, ent_gate *gate )
 {
    player->gate_waiting = gate;
+   world_routes_activate_entry_gate( get_active_world(), gate );
 
    m4x3_mulv( gate->transport, player->tpv_lpf, player->tpv_lpf );
    m3x3_mulv( gate->transport, player->cam_velocity_smooth, 
@@ -213,6 +219,9 @@ void player__pass_gate( player_instance *player, teleport_gate *gate )
    q_normalize( player->qbasis );
    q_m3x3( player->qbasis, player->basis );
    m3x3_transpose( player->basis, player->invbasis );
+
+   if( gate->type == k_gate_type_nonlocal )
+      world_global.active_world = gate->target;
 }
 
 VG_STATIC void player__pre_render( player_instance *player )
@@ -222,16 +231,13 @@ VG_STATIC void player__pre_render( player_instance *player )
       player_animation res;
       _player_animate[ player->subsystem ]( player, &res );
 
-      /* TODO: eventually, blending code goes here */
-
       m4x3f transform;
       q_m3x3( res.root_q, transform );
       v3_copy( res.root_co, transform[3] );
 
       struct skeleton *sk = &player->playeravatar->sk;
 
-      if( player->holdout_time > 0.0f )
-      {
+      if( player->holdout_time > 0.0f ){
          skeleton_lerp_pose( sk, res.pose, player->holdout_pose, 
                                            player->holdout_time, res.pose );
          player->holdout_time -= vg.frame_delta * 2.0f;
@@ -243,9 +249,7 @@ VG_STATIC void player__pre_render( player_instance *player )
       skeleton_apply_inverses( sk );
       skeleton_apply_transform( sk, transform );
 
-#if 0
       skeleton_debug( sk );
-#endif
    }
 
    if( _player_post_animate[ player->subsystem ] )
@@ -268,7 +272,16 @@ PLAYER_API void player__render( camera *cam, player_instance *player )
    shader_model_character_view_uTexMain( 0 );
    shader_model_character_view_uCamera( cam->transform[3] );
    shader_model_character_view_uPv( cam->mtx.pv );
-   shader_link_standard_ub( _shader_model_character_view.id, 2 );
+
+   world_instance *world = get_active_world();
+   world_link_lighting_ub( world, _shader_model_character_view.id );
+   world_bind_position_texture( world, _shader_model_character_view.id,
+                              _uniform_model_character_view_g_world_depth, 2 );
+   world_bind_light_array( world, _shader_model_character_view.id,
+                              _uniform_model_character_view_uLightsArray, 3 );
+   world_bind_light_index( world, _shader_model_character_view.id,
+                              _uniform_model_character_view_uLightsIndex, 4 );
+
    glUniformMatrix4x3fv( _uniform_model_character_view_uTransforms,
                          player->playeravatar->sk.bone_count,
                          0,
@@ -300,9 +313,9 @@ PLAYER_API void player__im_gui( player_instance *player )
 }
 
 PLAYER_API void player__spawn( player_instance *player, 
-                              struct respawn_point *rp )
+                               ent_spawn *rp )
 {
-   v3_copy( rp->co, player->rb.co );
+   v3_copy( rp->transform.co, player->rb.co );
    v3_zero( player->rb.v );
    v3_zero( player->rb.w );
    q_identity( player->rb.q );
@@ -313,6 +326,7 @@ PLAYER_API void player__spawn( player_instance *player,
    m3x3_identity( player->invbasis );
 
    player->subsystem = k_player_subsystem_walk;
+   player->viewable_world = get_active_world();
 
    if( _player_reset[ player->subsystem ] )
       _player_reset[ player->subsystem ]( player, rp );