render routes in mini-world
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_miniworld.c
1 #include "entity.h"
2 #include "ent_miniworld.h"
3 #include "world_render.h"
4 #include "input.h"
5
6 static void ent_miniworld_call( world_instance *world, ent_call *call ){
7 ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld,
8 mdl_entity_id_id(call->id) );
9
10 int world_id = world - world_static.instances;
11
12 if( call->function == 0 ){ /* zone() */
13 const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world );
14 skaterift_load_world_command( 1, (const char *[]){ uid } );
15
16 global_miniworld.active = miniworld;
17 }
18 else if( call->function == 1 ){
19 global_miniworld.active = NULL;
20
21 if( miniworld->proxy ){
22 ent_prop *prop = mdl_arritm( &world->ent_prop,
23 mdl_entity_id_id(miniworld->proxy) );
24 prop->flags &= ~0x1;
25 }
26 }
27 }
28
29 static void ent_miniworld_render( world_instance *host_world, camera *cam ){
30 if( host_world != &world_static.instances[k_world_purpose_hub] )
31 return;
32
33 ent_miniworld *miniworld = global_miniworld.active;
34
35 if( !miniworld )
36 return;
37
38 world_instance *dest_world = &world_static.instances[k_world_purpose_client];
39
40 int rendering = 1;
41 if( dest_world->status != k_world_status_loaded )
42 rendering = 0;
43
44 if( miniworld->proxy ){
45 ent_prop *prop = mdl_arritm( &host_world->ent_prop,
46 mdl_entity_id_id(miniworld->proxy) );
47 if( !rendering )
48 prop->flags &= ~0x1;
49 else
50 prop->flags |= 0x1;
51 }
52
53
54 if( !rendering )
55 return;
56
57 m4x3f mmdl;
58 mdl_transform_m4x3( &miniworld->transform, mmdl );
59 render_world_override( dest_world, host_world, mmdl, cam );
60 render_world_routes( dest_world, host_world, mmdl, cam, 0, 1 );
61 }
62
63 static void ent_miniworld_preupdate(void){
64 if( world_static.active_instance == k_world_purpose_client ){
65 if( button_down(k_srbind_mleft) ){
66 global_miniworld.transition = -1;
67 global_miniworld.t = 1.0f;
68
69 global_miniworld.cam = skaterift.cam;
70 m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
71 world_switch_instance(0);
72 }
73 }
74
75 ent_miniworld *miniworld = global_miniworld.active;
76 if( !miniworld )
77 return;
78
79 world_instance *world = world_current_instance();
80
81 if( global_miniworld.transition ){
82 }
83 else {
84 int rendering = 1;
85 if( world_static.instances[k_world_purpose_client].status
86 == k_world_status_loaded ){
87 if( button_down( k_srbind_mright ) ){
88 global_miniworld.transition = 1;
89 global_miniworld.t = 0.0f;
90 global_miniworld.cam = skaterift.cam;
91
92 mdl_transform_m4x3( &miniworld->transform, global_miniworld.mmdl );
93 world_switch_instance(1);
94 }
95 }
96 }
97 }