X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gate.c;h=26ce0924ff39dcb2f7d83fcbd472b8665750a13b;hb=d0069069f683eab48418faed415de932896d08ee;hp=7212714090f6f82a61beec225fbed109e0994e94;hpb=17851df33b64209eeefcc0dc096dadb8a8ff2c1a;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gate.c b/world_gate.c index 7212714..26ce092 100644 --- a/world_gate.c +++ b/world_gate.c @@ -17,6 +17,7 @@ #include "world_water.h" #include "player_remote.h" #include "shaders/model_gate_unlinked.h" +#include struct world_gates world_gates; @@ -25,21 +26,23 @@ struct world_gates world_gates; */ void gate_transform_update( ent_gate *gate ) { - if( gate->flags & k_ent_gate_flip ){ + if( gate->flags & k_ent_gate_flip ) + { v4f qflip; q_axis_angle( qflip, (v3f){0.0f,1.0f,0.0f}, VG_PIf ); q_mul( gate->q[1], qflip, gate->q[1] ); + q_normalize( gate->q[1] ); } m4x3f to_local, recv_to_world; q_m3x3( gate->q[0], gate->to_world ); v3_copy( gate->co[0], gate->to_world[3] ); - m4x3_invert_affine( gate->to_world, to_local ); q_m3x3( gate->q[1], recv_to_world ); v3_copy( gate->co[1], recv_to_world[3] ); + m4x3_mul( recv_to_world, to_local, gate->transport ); } @@ -321,15 +324,19 @@ void world_unlink_nonlocal( world_instance *world ) } } -/* - * attatches nonlocal gates, to be called from main thread ONLY! +/* + * This has to be synchronous because main thread looks at gate data for + * rendering, and we modify gates that the main thread has ownership of. */ -void world_link_nonlocal_async( void *payload, u32 size ) +void world_link_gates_async( void *payload, u32 size ) { + VG_ASSERT( vg_thread_purpose() == k_thread_purpose_main ); + world_instance *world = payload; u32 world_id = world - world_static.instances; - for( u32 j=0; jent_gate); j ++ ){ + for( u32 j=0; jent_gate); j ++ ) + { ent_gate *gate = mdl_arritm( &world->ent_gate, j ); gate_transform_update( gate );