X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world.h;h=acfd462d4d2cb1e8746ee081d8ae1bec64fedf81;hb=2e4531dfd7bd0d9a0776fda1a62653806d85eb3b;hp=4352b6e6031bd38f608b24061591e93e81ad72e1;hpb=a9e3181f697ab37fc74f072cfcfdf44e2d659468;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world.h b/world.h index 4352b6e..acfd462 100644 --- a/world.h +++ b/world.h @@ -172,36 +172,11 @@ struct world_instance v3f pos; float volume, range; u32 flags; - -#if 0 - audio_player player; -#endif - audio_clip temp_embedded_clip; } * audio_things; u32 audio_things_count; -#if 0 - /* - * Relays [ DEPRECATED ] - */ - struct logic_relay - { - v3f pos; - - struct relay_target - { - u32 sub_id; - enum classtype classtype; - } - targets[4]; - u32 target_count; - } - * logic_relays; - u32 relay_count; -#endif - struct soundscape { /* locking */ @@ -219,40 +194,16 @@ struct world_instance * soundscapes; u32 soundscape_count; - struct logic_brick_ref - { - mdl_node *node; - float usage; - u32 internal_id; /* used for things like soundscapes where another - allocation is made on top */ - } - * logic_bricks; - u32 logic_brick_count; - /* - * Box trigger entities + * Box volume entities */ - struct trigger_zone + struct world_volume { m4x3f transform, inv_transform; - - u32 target_logic_brick; - enum classtype classtype; - } - * triggers; - u32 trigger_count; - - /* - * Achievements - */ - struct logic_achievement - { - v3f pos; - const char *achievement_id; - u32 achieved; + mdl_node *node; } - * logic_achievements; - u32 achievement_count; + * volumes; + u32 volume_count; /* * Lights @@ -356,7 +307,7 @@ struct world_instance /* spacial mappings */ bh_tree *audio_bh, - *trigger_bh, + *volume_bh, *geo_bh; /* graphics */ @@ -431,7 +382,7 @@ VG_STATIC struct world_global v3f render_gate_pos; int active_route_board; - int in_trigger; + int in_volume; int switching_to_new_world; @@ -470,7 +421,7 @@ int ray_world( world_instance *world, v3f pos, v3f dir, ray_hit *hit ); #include "world_sfd.h" #include "world_render.h" #include "world_water.h" -#include "world_logic_bricks.h" +#include "world_volumes.h" #include "world_gen.h" #include "world_gate.h" @@ -483,76 +434,11 @@ int ray_world( world_instance *world, v3f pos, v3f dir, ray_hit *hit ); VG_STATIC int world_stop_sound( int argc, const char *argv[] ) { world_instance *world = get_active_world(); - - /* - * None of our world audio runs as one shots, they always have a player. - * Therefore it is safe to delete clip data after the players are - * disconnected - */ -#if 0 - audio_lock(); - for( int i=0; iaudio_things_count; i++ ) - { - struct world_audio_thing *at = &world->audio_things[i]; - - if( audio_player_is_playing( &at->player ) ) - { - u32 cflags = audio_player_get_flags( &at->player ); - audio_player_set_flags( &at->player, cflags | AUDIO_FLAG_KILL ); - } - } - audio_unlock(); -#endif - - return 0; -} - -VG_STATIC int world_change_world( int argc, const char *argv[] ) -{ -#if 0 - world_instance *world = get_active_world(); - - if( argc == 0 ) - { - vg_info( "%s\n", world.world_name ); - return 0; - } - else - { - vg_info( "Switching world...\n" ); - strcpy( world.world_name, argv[0] ); - world.switching_to_new_world = 1; - world_stop_sound( 0, NULL ); - } -#endif - return 0; } VG_STATIC void world_init(void) { -#if 0 - vg_var_push( (struct vg_var){ - .name = "water_enable", - .data = &world.water.enabled, - .data_type = k_var_dtype_i32, - .opt_i32 = { .min=0, .max=1, .clamp=1 }, - .persistent = 0 - }); -#endif - - vg_function_push( (struct vg_cmd) - { - .name = "world_stop_sound", - .function = world_stop_sound - }); - - vg_function_push( (struct vg_cmd) - { - .name = "world", - .function = world_change_world - }); - world_global.sky_rate = 1.0; world_global.sky_target_rate = 1.0; @@ -595,92 +481,6 @@ VG_STATIC void world_init(void) VG_MEMORY_SYSTEM ); } -VG_STATIC void world_audio_init(void) -{ -#if 0 - u32 size = vg_linear_remaining( vg_audio.audio_pool ) - - sizeof(vg_linear_allocator); - - world_global.audio_heap = vg_create_linear_allocator( vg_audio.audio_pool, - size, - VG_MEMORY_SYSTEM ); -#endif -} - -#if 0 -VG_STATIC void world_trigger_achievement( world_instance *world, u32 uid ) -{ - struct logic_achievement *ach = &world->logic_achievements[ uid ]; - - if( ach->achieved ) - return; - - steam_set_achievement( ach->achievement_id ); - steam_store_achievements(); - - ach->achieved = 1; -} -#endif - -#if 0 -VG_STATIC void world_run_relay( world_instance *world, - struct relay_target *rt ); - -VG_STATIC void world_trigger_relay( world_instance *world, u32 uid ) -{ - struct logic_relay *relay = &world->logic_relays[ uid ]; - - for( int i=0; itarget_count; i++ ) - { - world_run_relay( world, &relay->targets[i] ); - } -} -#endif - -#if 0 -VG_STATIC void world_trigger_audio( world_instance *world, u32 uid ) -{ - struct world_audio_thing *wat = &world->audio_things[ uid ]; - - audio_lock(); - audio_player_playclip( &wat->player, - &wat->temp_embedded_clip ); - audio_unlock(); -} -#endif - -#if 0 -VG_STATIC void world_run_relay( world_instance *world, - struct relay_target *rt ) -{ - struct entity_instruction - { - enum classtype classtype; - void (*p_trigger)( world_instance *world, u32 uid ); - } - entity_instructions[] = - { - { k_classtype_logic_achievement, world_trigger_achievement }, - { k_classtype_logic_relay, world_trigger_relay }, - { k_classtype_audio, world_trigger_audio }, - { k_classtype_logic_wire, logic_bricks_trigger_brick } - }; - - for( int i=0; iclasstype == rt->classtype ) - { - instr->p_trigger( world, rt->sub_id ); - return; - } - } - - vg_error( "Don't know how to trigger classtype %d\n", rt->classtype ); -} -#endif - VG_STATIC void world_update( world_instance *world, v3f pos ) { /* TEMP!!!!!! */ @@ -715,35 +515,6 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) sizeof(struct ub_world_lighting), &world->ub_lighting ); /* TEMP!!!!!! */ - -#if 0 - if( world.switching_to_new_world ) - { - int all_stopped = 1; - - audio_lock(); - for( int i=0; iplayer ) ) - { - all_stopped = 0; - break; - } - } - audio_unlock(); - - if( all_stopped ) - { - world.switching_to_new_world = 0; - world_unload(); - vg_loader_start( world_load ); - return; - } - } - -#endif world_global.sky_time += world_global.sky_rate * vg.time_delta; world_global.sky_rate = vg_lerp( world_global.sky_rate, world_global.sky_target_rate, @@ -806,24 +577,42 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) random_ticks ++; } - int in_trigger = 0; - for( int i=0; itrigger_count; i++ ) + float radius = 25.0f; + boxf volume_proximity; + v3_add( pos, (v3f){ radius, radius, radius }, volume_proximity[1] ); + v3_sub( pos, (v3f){ radius, radius, radius }, volume_proximity[0] ); + + bh_iter it; + bh_iter_init( 0, &it ); + int idx; + + int in_volume = 0; + + while( bh_next( world->volume_bh, &it, volume_proximity, &idx ) ) { - struct trigger_zone *zone = &world->triggers[i]; + struct world_volume *zone = &world->volumes[idx]; - for( int j=0; jnode->classtype == k_classtype_volume_audio ) { - logic_packet packet; - packet.location = zone->target_logic_brick; - packet.function = 0; + vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f}, + { 1.0f, 1.0f, 1.0f}}, + 0xff00c0ff ); +#if 0 + for( int j=0; jtarget_logic_brick; + packet.function = 0; - packet.type = k_mdl_128bit_datatype_vec3; - packet.data._v4f[0] = vg_randf()*2.0f-1.0f; - packet.data._v4f[1] = vg_randf()*2.0f-1.0f; - packet.data._v4f[2] = vg_randf()*2.0f-1.0f; - m4x3_mulv( zone->transform, packet.data._v4f, packet.data._v4f ); + packet.type = k_mdl_128bit_datatype_vec3; + packet.data._v4f[0] = vg_randf()*2.0f-1.0f; + packet.data._v4f[1] = vg_randf()*2.0f-1.0f; + packet.data._v4f[2] = vg_randf()*2.0f-1.0f; + m4x3_mulv( zone->transform, packet.data._v4f, packet.data._v4f ); - logic_bricks_send_packet( world, &packet ); + logic_bricks_send_packet( world, &packet ); + } +#endif continue; } @@ -834,10 +623,11 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) (fabsf(local[1]) <= 1.0f) && (fabsf(local[2]) <= 1.0f) ) { - in_trigger = 1; + in_volume = 1; - if( !world_global.in_trigger ) + if( !world_global.in_volume ) { +#if 0 logic_packet packet; packet.location = zone->target_logic_brick; packet.function = 0; @@ -846,12 +636,19 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) v3_copy( pos, packet.data._v4f ); logic_bricks_send_packet( world, &packet ); +#endif } + + vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f}, + { 1.0f, 1.0f, 1.0f}}, + 0xff00ff00 ); + } + else + { + vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f}, + { 1.0f, 1.0f, 1.0f}}, + 0xff0000ff ); } - - vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f}, - { 1.0f, 1.0f, 1.0f}}, - 0xff00ff00 ); } if( k_debug_light_indices ) @@ -874,12 +671,9 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) } } - world_global.in_trigger = in_trigger; + world_global.in_volume = in_volume; sfd_update(); - if( debug_logic_bricks ) - logic_bricks_debug( world ); - /* process soundscape transactions */ audio_lock(); for( int i=0; isoundscape_count; i++ )