From d0069069f683eab48418faed415de932896d08ee Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 4 Mar 2024 07:17:38 +0000 Subject: [PATCH] fix regression with gate flipping --- world_entity.c | 12 ++---------- world_gate.c | 19 +++++++++++++------ world_gate.h | 2 +- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/world_entity.c b/world_entity.c index 40d6d78..88e0e7e 100644 --- a/world_entity.c +++ b/world_entity.c @@ -182,16 +182,8 @@ void world_gen_entities_init( world_instance *world ) light->angle_sin_cos[1] = cosf( light->angle * 0.5f ); } - /* gates */ - for( u32 j=0; jent_gate); j ++ ){ - ent_gate *gate = mdl_arritm( &world->ent_gate, j ); - - if( !(gate->flags & k_ent_gate_nonlocal) ) { - gate_transform_update( gate ); - } - } - - vg_async_call( world_link_nonlocal_async, world, 0 ); + vg_async_call( world_link_gates_async, world, 0 ); + vg_async_stall(); /* water */ for( u32 j=0; jent_water); j++ ){ 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 ); diff --git a/world_gate.h b/world_gate.h index 6339f1d..13b1478 100644 --- a/world_gate.h +++ b/world_gate.h @@ -30,7 +30,7 @@ u32 world_intersect_gates( world_instance *world, v3f pos, v3f last ); void ent_gate_call( world_instance *world, ent_call *call ); void ent_gate_get_mdl_mtx( ent_gate *gate, m4x3f mmdl ); -void world_link_nonlocal_async( void *payload, u32 size ); +void world_link_gates_async( void *payload, u32 size ); void world_unlink_nonlocal( world_instance *world ); void render_gate_unlinked( world_instance *world, ent_gate *gate, vg_camera *cam ); -- 2.25.1