chaos pt 3
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_miniworld.c
index 08e7093e31e6e40e371fe5d84a99261214d7b190..802bd8b6eaeebd6a7db39a30b090077cea8420af 100644 (file)
@@ -2,6 +2,8 @@
 #include "ent_miniworld.h"
 #include "world_render.h"
 #include "input.h"
+#include "gui.h"
+#include "menu.h"
 
 static void ent_miniworld_call( world_instance *world, ent_call *call ){
    ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, 
@@ -13,6 +15,7 @@ static void ent_miniworld_call( world_instance *world, ent_call *call ){
       const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world );
       skaterift_load_world_command( 1, (const char *[]){ uid } );
 
+      mdl_transform_m4x3( &miniworld->transform, global_miniworld.mmdl );
       global_miniworld.active = miniworld;
    }
    else if( call->function == 1 ){
@@ -26,6 +29,28 @@ static void ent_miniworld_call( world_instance *world, ent_call *call ){
    }
 }
 
+static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos ){
+   m4x3f mmdl;
+   v3_copy( cam->transform[2], mmdl[2] );
+   mmdl[2][1] = 0.0f;
+   v3_normalize( mmdl[2] );
+   v3_copy( (v3f){0,1,0}, mmdl[1] );
+   v3_cross( mmdl[1], mmdl[2], mmdl[0] );
+   m4x3_mulv( global_miniworld.mmdl, pos, mmdl[3] );
+
+   shader_model_font_uMdl( mmdl );
+   shader_model_font_uOffset( (v4f){0,0,0,20} );
+
+   m4x4f m4mdl;
+   m4x3_expand( mmdl, m4mdl );
+   m4x4_mul( cam->mtx_prev.pv, m4mdl, m4mdl );
+   shader_model_font_uPvmPrev( m4mdl );
+
+   mdl_submesh *sm = gui.icons[ icon ];
+   if( sm )
+      mdl_draw_submesh( sm );
+}
+
 static void ent_miniworld_render( world_instance *host_world, camera *cam ){
    if( host_world != &world_static.instances[k_world_purpose_hub] )
       return;
@@ -54,44 +79,118 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){
    if( !rendering )
       return;
 
-   m4x3f mmdl;
-   mdl_transform_m4x3( &miniworld->transform, mmdl );
-   render_world_override( dest_world, host_world, mmdl, cam );
-   render_world_routes( dest_world, host_world, mmdl, cam, 0, 1 );
-}
+   render_world_override( dest_world, host_world, global_miniworld.mmdl, cam,
+                          global_miniworld.dest_spawn );
+   render_world_routes( dest_world, host_world, 
+                        global_miniworld.mmdl, cam, 0, 1 );
 
-static void ent_miniworld_preupdate(void){
-   if( world_static.active_instance == k_world_purpose_client ){
-      if( button_down(k_srbind_mleft) ){
-         global_miniworld.transition = -1;
-         global_miniworld.t = 1.0f;
-
-         global_miniworld.cam = skaterift.cam;
-         m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
-         world_switch_instance(0);
+   /* icons
+    * ---------------------*/
+   font3d_bind( &gui.font, k_font_shader_default, 0, NULL, cam );
+   mesh_bind( &gui.icons_mesh );
+
+   glActiveTexture( GL_TEXTURE0 );
+   glBindTexture( GL_TEXTURE_2D, gui.icons_texture );
+   shader_model_font_uTexMain( 0 );
+   shader_model_font_uColour( (v4f){1,1,1,1} );
+
+   for( u32 i=0; i<mdl_arrcount(&dest_world->ent_challenge); i++ ){
+      ent_challenge *challenge = mdl_arritm( &dest_world->ent_challenge, i );
+
+      enum gui_icon icon = k_gui_icon_exclaim;
+      if( challenge->status )
+         icon = k_gui_icon_tick;
+
+      miniworld_icon( cam, icon, challenge->transform.co );
+   }
+
+   for( u32 i=0; i<mdl_arrcount(&dest_world->ent_skateshop); i++ ){
+      ent_skateshop *shop = mdl_arritm( &dest_world->ent_skateshop, i );
+      if( shop->type == k_skateshop_type_boardshop ){
+         miniworld_icon( cam, k_gui_icon_board, shop->transform.co );
       }
+      else if( shop->type == k_skateshop_type_worldshop ){
+         miniworld_icon( cam, k_gui_icon_world, shop->transform.co );
+      }
+   }
+
+   for( u32 i=0; i<mdl_arrcount(&dest_world->ent_route); i++ ){
+      ent_route *route = mdl_arritm( &dest_world->ent_route, i );
+
+      v4f colour;
+      v4_copy( route->colour, colour );
+      v3_muls( colour, 1.6666f, colour );
+      shader_model_font_uColour( colour );
+      miniworld_icon( cam, k_gui_icon_rift_run, route->board_transform[3] );
    }
+}
+
+static void ent_miniworld_preupdate(void){
+   world_instance *hub = world_current_instance(),
+                  *dest = &world_static.instances[k_world_purpose_client];
 
    ent_miniworld *miniworld = global_miniworld.active;
-   if( !miniworld )
+
+   if( (localplayer.subsystem != k_player_subsystem_walk) ||
+       (global_miniworld.transition) ||
+       (world_static.active_instance != k_world_purpose_hub) ||
+       (!miniworld) ||
+       (dest->status != k_world_status_loaded) ){
+      
+      if( global_miniworld.mode ){
+         global_miniworld.mode = 0;
+         menu.disable_open = 0;
+         srinput.state = k_input_state_resume;
+      }
       return;
+   }
 
-   world_instance *world = world_current_instance();
+   if( button_down( k_srbind_miniworld_resume ) ){
+      global_miniworld.mode = 0;
+      global_miniworld.transition = 1;
+      global_miniworld.t = 0.0f;
+      global_miniworld.cam = skaterift.cam;
+   
+      if( global_miniworld.dest_spawn ){
+         v3_copy( global_miniworld.dest_spawn->transform.co, 
+                  dest->player_co );
+      }
 
-   if( global_miniworld.transition ){
+      world_switch_instance(1);
+      global_miniworld.dest_spawn = NULL;
+      srinput.state = k_input_state_resume;
+      menu.disable_open = 0;
    }
    else {
-      int rendering = 1;
-      if( world_static.instances[k_world_purpose_client].status 
-            == k_world_status_loaded ){
-         if( button_down( k_srbind_mright ) ){
-            global_miniworld.transition = 1;
-            global_miniworld.t = 0.0f;
-            global_miniworld.cam = skaterift.cam;
-
-            mdl_transform_m4x3( &miniworld->transform, global_miniworld.mmdl );
-            world_switch_instance(1);
+      if( global_miniworld.mode == 1 ){
+         if( button_down(k_srbind_mback) ){
+            global_miniworld.mode = 0;
+            global_miniworld.dest_spawn = NULL;
+            menu.disable_open = 0;
+            srinput.state = k_input_state_resume;
+         }
+         else {
+            m4x3f mmdl_inv;
+            m4x3_invert_full( global_miniworld.mmdl, mmdl_inv );
+            v3f lco;
+            m4x3_mulv( mmdl_inv, localplayer.rb.co, lco );
+            global_miniworld.dest_spawn = world_find_closest_spawn( dest, lco );
+         }
+      }
+      else {
+         if( button_down( k_srbind_miniworld_teleport ) ){
+            global_miniworld.mode = 1;
+            menu.disable_open = 1;
          }
       }
    }
 }
+
+static void ent_miniworld_goback(void){
+   global_miniworld.transition = -1;
+   global_miniworld.t = 1.0f;
+
+   global_miniworld.cam = skaterift.cam;
+   m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
+   world_switch_instance(0);
+}