X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gate.c;h=765a09987e6f68cd61344e8163a2f641747dfe3c;hb=53597f45307d8a2120e3a0bbe71797b216e8750b;hp=a4cf8fdc703e8b21ae976918e924bbb5206fb671;hpb=6ab4435fb19beb6af6c52691793d5ca17a120f69;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gate.c b/world_gate.c index a4cf8fd..765a099 100644 --- a/world_gate.c +++ b/world_gate.c @@ -68,6 +68,15 @@ VG_STATIC void world_gates_init(void) mdl_close( &mgate ); } +VG_STATIC void ent_gate_get_mdl_mtx( ent_gate *gate, m4x3f mmdl ){ + m4x3_copy( gate->to_world, mmdl ); + + if( !(gate->flags & k_ent_gate_custom_mesh) ){ + m3x3_scale( mmdl, (v3f){ gate->dimensions[0], + gate->dimensions[1], 1.0f } ); + } +} + /* * Render the view through a gate */ @@ -148,7 +157,8 @@ VG_STATIC int render_gate( world_instance *world, world_instance *world_inside, glDisable( GL_CULL_FACE ); m4x3f mmdl; - m4x3_copy( gate->to_world, mmdl ); + ent_gate_get_mdl_mtx( gate, mmdl ); + shader_model_gate_uMdl( mmdl ); if( gate->flags & k_ent_gate_custom_mesh ){ mesh_bind( &world->mesh_no_collide ); @@ -159,15 +169,10 @@ VG_STATIC int render_gate( world_instance *world, world_instance *world_inside, } } else { - m3x3_scale( mmdl, (v3f){ gate->dimensions[0], - gate->dimensions[1], 1.0f } ); - mesh_bind( &world_gates.mesh ); mdl_draw_submesh( &world_gates.sm_surface ); } - shader_model_gate_uMdl( mmdl ); - glClear( GL_DEPTH_BUFFER_BIT ); glStencilFunc( GL_EQUAL, 1, 0xFF ); glStencilMask( 0x00 ); @@ -265,9 +270,10 @@ VG_STATIC ent_gate *world_intersect_gates( world_instance *world, ent_gate *gate = mdl_arritm( &world->ent_gate, i ); if( !(gate->flags & k_ent_gate_linked) ) continue; + if( gate->flags & k_ent_gate_locked ) continue; if( gate->flags & k_ent_gate_nonlocal ){ - if( world_loader.state != k_world_loader_none ){ + if( world_static.load_state != k_world_loader_none ){ continue; } } @@ -296,10 +302,9 @@ VG_STATIC void world_unlink_nonlocal( world_instance *world ){ /* * attatches nonlocal gates, to be called from main thread ONLY! */ -VG_STATIC void world_link_nonlocal_async( void *payload, u32 size ) -{ +VG_STATIC void world_link_nonlocal_async( void *payload, u32 size ){ world_instance *world = payload; - u32 world_id = world - world_static.worlds; + u32 world_id = world - world_static.instances; for( u32 j=0; jent_gate); j ++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, j ); @@ -310,8 +315,8 @@ VG_STATIC void world_link_nonlocal_async( void *payload, u32 size ) const char *key = mdl_pstr( &world->meta, gate->key ); vg_info( "key: %s\n", key ); - for( u32 i=0; istatus != k_world_status_loaded ) continue; vg_info( "Checking world %u for key matches\n", i ); @@ -340,7 +345,7 @@ VG_STATIC void world_link_nonlocal_async( void *payload, u32 size ) v4_copy( gate->q[0], gate2->q[1] ); v4_copy( gate2->q[0], gate->q[1] ); - if( other->meta.info.version >= 102 ){ + if( world->meta.info.version >= 102 ){ gate->flags |= k_ent_gate_flip; gate2->flags |= k_ent_gate_flip; } @@ -367,4 +372,17 @@ matched:; } } +VG_STATIC void ent_gate_call( world_instance *world, ent_call *call ){ + u32 index = mdl_entity_id_id( call->id ); + ent_gate *gate = mdl_arritm( &world->ent_gate, index ); + + if( call->function == 0 ){ /* unlock() */ + gate->flags &= ~k_ent_gate_locked; + } + else { + vg_print_backtrace(); + vg_error( "Unhandled function id: %u\n", call->function ); + } +} + #endif /* WORLD_GATE_C */