X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world.h;h=08d3ca09123d253651cc89fecc653e36f1468718;hb=4b8aac300ee193cfa12011dfe0238cfe7d7ffce7;hp=80bf3b6bafad33620b4738fb314440cfd581a6d3;hpb=0a33f65eecb5e75cddaefa08d3a5eb1a301d0479;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world.h b/world.h index 80bf3b6..08d3ca0 100644 --- a/world.h +++ b/world.h @@ -155,7 +155,11 @@ struct world_instance ent_path_index, ent_checkpoint, ent_route, - ent_water; + ent_water, + + ent_audio_clip, + ent_audio, + ent_volume; ent_gate *rendering_gate; @@ -466,6 +470,78 @@ VG_STATIC void world_init(void) VG_MEMORY_SYSTEM ); } +typedef struct ent_call ent_call; +struct ent_call{ + ent_index ent; + u32 function; + void *data; +}; + +VG_STATIC void entity_call( world_instance *world, ent_call *call ); + +VG_STATIC void ent_volume_call( world_instance *world, ent_call *call ) +{ + ent_volume *volume = mdl_arritm( &world->ent_volume, call->ent.index ); + if( !volume->target.type ) return; + + if( call->function == k_ent_function_trigger ){ + call->ent = volume->target; + + if( volume->type == k_volume_subtype_particle ){ + v3f co; + co[0] = vg_randf()*2.0f-1.0f; + co[1] = vg_randf()*2.0f-1.0f; + co[2] = vg_randf()*2.0f-1.0f; + m4x3_mulv( volume->to_world, co, co ); + + call->function = k_ent_function_particle_spawn; + call->data = co; + + entity_call( world, call ); + } + else if( volume->type == k_volume_subtype_trigger ){ + /* TODO */ + } + } +} + +VG_STATIC void ent_audio_call( world_instance *world, ent_call *call ) +{ + ent_audio *audio = mdl_arritm( &world->ent_audio, call->ent.index ); + + if( call->function == k_ent_function_particle_spawn ){ + float chance = vg_randf()*100.0f, + bar = 0.0f; + + for( u32 i=0; iclip_count; i++ ){ + ent_audio_clip *clip = mdl_arritm( &world->ent_audio_clip, + audio->clip_start+i ); + + bar += clip->probability; + + if( chance < bar ){ + float *pos = call->data; + + audio_lock(); + audio_oneshot_3d( &clip->clip, pos, + audio->transform.s[0], + audio->volume ); + audio_unlock(); + break; + } + } + } +} + +VG_STATIC void entity_call( world_instance *world, ent_call *call ) +{ + if( call->ent.type == k_ent_volume ){ + ent_volume_call( world, call ); + } else if( call->ent.type == k_ent_audio ){ + ent_audio_call( world, call ); + } +} + VG_STATIC void world_update( world_instance *world, v3f pos ) { /* TEMP!!!!!! */ @@ -549,8 +625,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) } sfd_update(); -#if 0 - /* TODO: Bvh */ + static float random_accum = 0.0f; random_accum += vg.time_delta; @@ -573,69 +648,48 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) int in_volume = 0; - while( bh_next( world->volume_bh, &it, volume_proximity, &idx ) ) - { - struct world_volume *zone = &world->volumes[idx]; + while( bh_next( world->volume_bh, &it, volume_proximity, &idx ) ){ + ent_volume *volume = mdl_arritm( &world->ent_volume, idx ); - if( zone->node->classtype == k_classtype_volume_audio ) - { - 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; jtype == k_volume_subtype_trigger ){ + v3f local; + m4x3_mulv( volume->to_local, pos, local ); + vg_line_boxf_transformed( volume->to_world, cube, 0xff00ff00 ); + + if( (fabsf(local[0]) <= 1.0f) && + (fabsf(local[1]) <= 1.0f) && + (fabsf(local[2]) <= 1.0f) ) { - logic_packet packet; - packet.location = zone->target_logic_brick; - packet.function = 0; + in_volume = 1; - 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 ); + if( !world_global.in_volume ){ + ent_call basecall; + basecall.ent.index = idx; + basecall.ent.type = k_ent_volume; + basecall.function = k_ent_function_trigger; + basecall.data = NULL; - logic_bricks_send_packet( world, &packet ); + entity_call( world, &basecall ); + } } -#endif - continue; } + else if( volume->type == k_volume_subtype_particle ){ + vg_line_boxf_transformed( volume->to_world, cube, 0xff00c0ff ); - v3f local; - m4x3_mulv( zone->inv_transform, pos, local ); - - if( (fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f) ) - { - in_volume = 1; - - if( !world_global.in_volume ) - { -#if 0 - logic_packet packet; - packet.location = zone->target_logic_brick; - packet.function = 0; - - packet.type = k_mdl_128bit_datatype_vec3; - v3_copy( pos, packet.data._v4f ); + for( int j=0; jtransform, (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 ); } } -#endif + world_global.in_volume = in_volume; #if 0 if( k_debug_light_indices ) @@ -657,7 +711,6 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) } } - world_global.in_volume = in_volume; #endif #if 0