chaos pt 2
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_miniworld.c
index bc59d470f6c17e2aeb6ee8f169c76a4f4839c661..9c439c7c797a5c7f44bd7abc233f8d7540e93560 100644 (file)
@@ -1,6 +1,7 @@
 #include "entity.h"
 #include "ent_miniworld.h"
 #include "world_render.h"
+#include "input.h"
 
 static void ent_miniworld_call( world_instance *world, ent_call *call ){
    ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, 
@@ -12,28 +13,85 @@ 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 } );
 
-      global_miniworld.active_id = call->id;
+      global_miniworld.active = miniworld;
    }
-}
+   else if( call->function == 1 ){
+      global_miniworld.active = NULL;
 
-static void ent_miniworld_render( world_instance *host_world ){
-   u32 entity_id = global_miniworld.active_id;
+      if( miniworld->proxy ){
+         ent_prop *prop = mdl_arritm( &world->ent_prop, 
+                                      mdl_entity_id_id(miniworld->proxy) );
+         prop->flags &= ~0x1;
+      }
+   }
+}
 
-   if( !entity_id )
+static void ent_miniworld_render( world_instance *host_world, camera *cam ){
+   if( host_world != &world_static.instances[k_world_purpose_hub] )
       return;
-   
-   ent_miniworld *miniworld = mdl_arritm( &host_world->ent_miniworld, 
-                                          mdl_entity_id_id(entity_id) );
 
-   if( miniworld->purpose == k_world_purpose_invalid )
+   ent_miniworld *miniworld = global_miniworld.active;
+
+   if( !miniworld )
       return;
 
-   world_instance *dest_world = &world_static.instances[miniworld->purpose];
+   world_instance *dest_world = &world_static.instances[k_world_purpose_client];
+
+   int rendering = 1;
+   if( dest_world->status != k_world_status_loaded )
+      rendering = 0;
 
+   if( miniworld->proxy ){
+      ent_prop *prop = mdl_arritm( &host_world->ent_prop, 
+                                   mdl_entity_id_id(miniworld->proxy) );
+      if( !rendering )
+         prop->flags &= ~0x1;
+      else
+         prop->flags |= 0x1;
+   }
+
+
+   if( !rendering )
+      return;
 
    m4x3f mmdl;
    mdl_transform_m4x3( &miniworld->transform, mmdl );
-   render_world_override( dest_world, host_world, mmdl );
-
+   render_world_override( dest_world, host_world, mmdl, cam );
    //render_world_routes( , &skaterift.cam, 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);
+      }
+   }
+
+   ent_miniworld *miniworld = global_miniworld.active;
+   if( !miniworld )
+      return;
+
+   world_instance *world = world_current_instance();
+
+   if( global_miniworld.transition ){
+   }
+   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);
+         }
+      }
+   }
+}