X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world.h;h=7084ff17334e7b9195abfc2ff584576bccefcbc1;hb=b4a83d4fcab39bee5a8cd6e8e6eec06314864e5b;hp=622837d778728f42a6c1eb95a6aa2b59ecd9336d;hpb=be8ea6efdbfd9c0fdad97401ed7d92041d8c8778;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world.h b/world.h index 622837d..7084ff1 100644 --- a/world.h +++ b/world.h @@ -60,7 +60,14 @@ struct world_instance { * ------------------------------------------------------- */ + void *heap; char world_name[ 64 ]; + enum world_status{ + k_world_status_unloaded = 0, + k_world_status_loading = 1, + k_world_status_loaded = 2 + } + status; struct{ boxf depthbounds; @@ -157,7 +164,8 @@ struct world_instance { ent_audio_clip, ent_audio, - ent_volume; + ent_volume, + ent_traffic; ent_gate *rendering_gate; @@ -166,9 +174,9 @@ struct world_instance { */ /* world geometry */ - scene *scene_geo, - *scene_no_collide, - *scene_lines; + scene_context scene_geo, + scene_no_collide, + scene_lines; /* spacial mappings */ bh_tree *audio_bh, @@ -184,12 +192,12 @@ struct world_instance { rb_object rb_geo; }; -VG_STATIC struct world_global{ +struct world_global{ /* * Allocated as system memory * -------------------------------------------------------------------------- */ - void *generic_heap; + void *heap; /* rendering */ glmesh skydome; @@ -213,6 +221,7 @@ VG_STATIC struct world_global{ glmesh mesh_base, mesh_display; mdl_submesh sm_base; u32 active_route_board; + scene_context scene; u32 w, h; float *buffer; @@ -250,9 +259,8 @@ VG_STATIC struct world_global{ } text_particles[6*4]; u32 text_particle_count; - } -world_global; +static world_global; VG_STATIC world_instance *get_active_world( void ) { @@ -379,15 +387,9 @@ VG_STATIC void world_init(void) mdl_context msky; mdl_open( &msky, "models/rs_skydome.mdl", vg_mem.scratch ); mdl_load_metadata_block( &msky, vg_mem.scratch ); - mdl_load_mesh_block( &msky, vg_mem.scratch ); + mdl_async_load_glmesh( &msky, &world_global.skydome ); mdl_close( &msky ); - vg_acquire_thread_sync(); - { - mdl_unpack_glmesh( &msky, &world_global.skydome ); - } - vg_release_thread_sync(); - /* Other systems */ vg_info( "Loading other world systems\n" ); @@ -399,9 +401,8 @@ VG_STATIC void world_init(void) /* Allocate dynamic world memory arena */ u32 max_size = 76*1024*1024; - world_global.generic_heap = vg_create_linear_allocator( vg_mem.rtmemory, - max_size, - VG_MEMORY_SYSTEM ); + world_global.heap = vg_create_linear_allocator( vg_mem.rtmemory, max_size, + VG_MEMORY_SYSTEM ); } typedef struct ent_call ent_call; @@ -450,7 +451,7 @@ VG_STATIC void ent_audio_call( world_instance *world, ent_call *call ) v3_copy( audio->transform.co, sound_co ); } else - vg_fatal_exit_loop( "ent_audio_call (invalid function id)" ); + vg_fatal_error( "ent_audio_call (invalid function id)" ); float chance = vg_randf()*100.0f, bar = 0.0f; @@ -542,6 +543,67 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) world_routes_update_timer_texts( world ); world_routes_update( world ); //world_routes_debug( world ); + + /* ---- traffic -------- */ + + for( u32 i=0; ient_traffic ); i++ ){ + ent_traffic *traffic = mdl_arritm( &world->ent_traffic, i ); + + u32 i1 = traffic->index, + i0, + i2 = i1+1; + + if( i1 == 0 ) i0 = traffic->node_count-1; + else i0 = i1-1; + + if( i2 >= traffic->node_count ) i2 = 0; + + i0 += traffic->start_node; + i1 += traffic->start_node; + i2 += traffic->start_node; + + v3f h[3]; + + ent_route_node *rn0 = mdl_arritm( &world->ent_route_node, i0 ), + *rn1 = mdl_arritm( &world->ent_route_node, i1 ), + *rn2 = mdl_arritm( &world->ent_route_node, i2 ); + + v3_copy( rn1->co, h[1] ); + v3_lerp( rn0->co, rn1->co, 0.5f, h[0] ); + v3_lerp( rn1->co, rn2->co, 0.5f, h[2] ); + + float const k_sample_dist = 0.0025f; + v3f pc, pd; + eval_bezier3( h[0], h[1], h[2], traffic->t, pc ); + eval_bezier3( h[0], h[1], h[2], traffic->t+k_sample_dist, pd ); + + v3f v0; + v3_sub( pd, pc, v0 ); + float length = vg_maxf( 0.0001f, v3_length( v0 ) ); + v3_muls( v0, 1.0f/length, v0 ); + + float mod = k_sample_dist / length; + + traffic->t += traffic->speed * vg.time_delta * mod; + + if( traffic->t > 1.0f ){ + traffic->t -= 1.0f; + + if( traffic->t > 1.0f ) traffic->t = 0.0f; + + traffic->index ++; + + if( traffic->index >= traffic->node_count ) + traffic->index = 0; + } + + v3_copy( pc, traffic->transform.co ); + + float a = atan2f( -v0[0], v0[2] ); + q_axis_angle( traffic->transform.q, (v3f){0.0f,1.0f,0.0f}, -a ); + + vg_line_pt3( traffic->transform.co, 0.3f, VG__BLUE ); + } /* ---- SFD ------------ */ @@ -682,13 +744,13 @@ VG_STATIC void ray_world_get_tri( world_instance *world, ray_hit *hit, v3f tri[3] ) { for( int i=0; i<3; i++ ) - v3_copy( world->scene_geo->arrvertices[ hit->tri[i] ].co, tri[i] ); + v3_copy( world->scene_geo.arrvertices[ hit->tri[i] ].co, tri[i] ); } VG_STATIC int ray_world( world_instance *world, v3f pos, v3f dir, ray_hit *hit ) { - return scene_raycast( world->scene_geo, world->geo_bh, pos, dir, hit ); + return scene_raycast( &world->scene_geo, world->geo_bh, pos, dir, hit ); } /* @@ -721,14 +783,14 @@ VG_STATIC int spherecast_world( world_instance *world, int idx; while( bh_next( world->geo_bh, &it, region, &idx ) ){ - u32 *ptri = &world->scene_geo->arrindices[ idx*3 ]; + u32 *ptri = &world->scene_geo.arrindices[ idx*3 ]; v3f tri[3]; boxf box; box_init_inf( box ); for( int j=0; j<3; j++ ){ - v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] ); + v3_copy( world->scene_geo.arrvertices[ptri[j]].co, tri[j] ); box_addpt( box, tri[j] ); }