X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world.h;h=80bf3b6bafad33620b4738fb314440cfd581a6d3;hb=0a33f65eecb5e75cddaefa08d3a5eb1a301d0479;hp=acfd462d4d2cb1e8746ee081d8ae1bec64fedf81;hpb=2e4531dfd7bd0d9a0776fda1a62653806d85eb3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world.h b/world.h index acfd462..80bf3b6 100644 --- a/world.h +++ b/world.h @@ -18,6 +18,7 @@ typedef struct world_instance world_instance; #include "rigidbody.h" #include "bvh.h" #include "model.h" +#include "entity.h" #include "shaders/scene_standard.h" #include "shaders/scene_standard_alphatest.h" @@ -28,8 +29,6 @@ typedef struct world_instance world_instance; #include "shaders/model_sky.h" -typedef struct teleport_gate teleport_gate; - enum { k_max_ui_segments = 8 }; enum { k_max_ui_elements = k_max_ui_segments }; @@ -97,6 +96,7 @@ struct world_instance float g_water_fog; float g_time; + float g_realtime; float g_shadow_length; float g_shadow_spread; @@ -134,24 +134,32 @@ struct world_instance /* * Main world .mdl */ - mdl_context *meta; - - /* - * Materials / textures - */ + mdl_context meta; GLuint *textures; u32 texture_count; - struct world_material + struct world_surface { mdl_material info; mdl_submesh sm_geo, sm_no_collide; } - * materials; - u32 material_count; + * surfaces; + u32 surface_count; + + mdl_array_ptr ent_spawn, + ent_gate, + ent_light, + ent_route_node, + ent_path_index, + ent_checkpoint, + ent_route, + ent_water; + + ent_gate *rendering_gate; +#if 0 /* * Named safe places to respawn */ @@ -214,9 +222,6 @@ struct world_instance struct classtype_world_light *inf; m4x3f inverse_world; v2f angle_sin_cos; - - /* enabled.. etc? - * TODO: we should order entities in the binary by their type */ } * lights; u32 light_count; @@ -225,6 +230,7 @@ struct world_instance * Routes (world_routes.h) * -------------------------------------------------------------------------- */ + struct route_node { v3f co, right, up, h; @@ -294,6 +300,7 @@ struct world_instance } *collectors; u32 collector_count; +#endif /* logic @@ -329,15 +336,13 @@ VG_STATIC struct world_global /* rendering */ glmesh skydome; - mdl_submesh dome_upper, dome_lower; - - glmesh mesh_gate_surface; + glmesh mesh_gate; + mdl_submesh sm_gate_surface, + sm_gate_marker[4]; double sky_time, sky_rate, sky_target_rate; - /* gates, TODO: active_gate should also know which instance */ - u32 active_gate, - current_run_version; + u32 current_run_version; double time, rewind_from, rewind_to, last_use; /* water rendering */ @@ -350,38 +355,16 @@ VG_STATIC struct world_global /* split flap display */ struct { - mdl_submesh *sm_module, *sm_card; glmesh mesh_base, mesh_display; + mdl_submesh sm_base; + u32 active_route_board; u32 w, h; float *buffer; } sfd; - /* timing bars, fixed maximum amount */ - struct route_ui_bar - { - GLuint vao, vbo, ebo; - - u32 indices_head; - u32 vertex_head; - - struct route_ui_segment - { - float length; - u32 vertex_start, vertex_count, - index_start, index_count, notches; - } - segments[k_max_ui_segments]; - - u32 segment_start, segment_count, fade_start, fade_count; - double fade_timer_start; - float xpos; - } - ui_bars[16]; - v3f render_gate_pos; - int active_route_board; int in_volume; int switching_to_new_world; @@ -405,7 +388,7 @@ VG_STATIC int ray_hit_is_ramp( world_instance *world, ray_hit *hit ); VG_STATIC -struct world_material *ray_hit_material( world_instance *world, ray_hit *hit ); +struct world_surface *ray_hit_surface( world_instance *world, ray_hit *hit ); VG_STATIC void ray_world_get_tri( world_instance *world, ray_hit *hit, v3f tri[3] ); @@ -454,14 +437,16 @@ VG_STATIC void world_init(void) vg_info( "Loading world resources\n" ); vg_linear_clear( vg_mem.scratch ); - mdl_context *msky = mdl_load_full( vg_mem.scratch, "models/rs_skydome.mdl" ); - mdl_node *nupper = mdl_node_from_name( msky, "dome_complete" ); - world_global.dome_upper = *mdl_node_submesh( msky, nupper, 0 ); + 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_close( &msky ); vg_acquire_thread_sync(); { - mdl_unpack_glmesh( msky, &world_global.skydome ); + mdl_unpack_glmesh( &msky, &world_global.skydome ); } vg_release_thread_sync(); @@ -491,6 +476,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) struct ub_world_lighting *state = &world->ub_lighting; state->g_time = g_time; + state->g_realtime = vg.time; state->g_debug_indices = k_debug_light_indices; state->g_light_preview = k_light_preview; state->g_debug_complexity = k_debug_light_complexity; @@ -521,49 +507,49 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) vg.time_delta * 5.0 ); world_routes_update( world ); -#if 0 - world_routes_debug(); -#endif + world_routes_debug( world ); + + /* ---- SFD ------------ */ - if( world->route_count > 0 ) - { - int closest = 0; + if( mdl_arrcount( &world->ent_route ) ){ + u32 closest = 0; float min_dist = INFINITY; - for( int i=0; iroute_count; i++ ) - { - float d = v3_dist2( world->routes[i].scoreboard_transform[3], pos ); + for( u32 i=0; ient_route ); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); + float dist = v3_dist2( route->board_transform[3], pos ); - if( d < min_dist ) - { - min_dist = d; + if( dist < min_dist ){ + min_dist = dist; closest = i; } } - if( (world_global.active_route_board != closest) + if( (world_global.sfd.active_route_board != closest) || network_scores_updated ) { network_scores_updated = 0; - world_global.active_route_board = closest; + world_global.sfd.active_route_board = closest; - struct route *route = &world->routes[closest]; + ent_route *route = mdl_arritm( &world->ent_route, closest ); + u32 id = route->official_track_id; - u32 id = route->track_id; - - if( id != 0xffffffff ) - { + if( id != 0xffffffff ){ struct netmsg_board *local_board = &scoreboard_client_data.boards[id]; - for( int i=0; i<13; i++ ) - { + for( int i=0; i<13; i++ ){ sfd_encode( i, &local_board->data[27*i] ); } + }else{ + sfd_encode( 0, mdl_pstr( &world->meta, route->pstr_name ) ); + sfd_encode( 1, "No data" ); } } } + sfd_update(); +#if 0 /* TODO: Bvh */ static float random_accum = 0.0f; @@ -571,8 +557,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) u32 random_ticks = 0; - while( random_accum > 0.1f ) - { + while( random_accum > 0.1f ){ random_accum -= 0.1f; random_ticks ++; } @@ -650,11 +635,12 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) 0xff0000ff ); } } +#endif +#if 0 if( k_debug_light_indices ) { - for( int i=0; ilight_count; i++ ) - { + for( int i=0; ilight_count; i++ ){ struct world_light *light = &world->lights[i]; struct classtype_world_light *inf = light->inf; @@ -672,7 +658,9 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) } world_global.in_volume = in_volume; - sfd_update(); +#endif + +#if 0 /* process soundscape transactions */ audio_lock(); @@ -693,6 +681,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) } } audio_unlock(); +#endif } /* @@ -743,16 +732,14 @@ VG_STATIC int spherecast_world( world_instance *world, float min_t = 1.0f; int idx; - while( bh_next( world->geo_bh, &it, region, &idx ) ) - { + while( bh_next( world->geo_bh, &it, region, &idx ) ){ u32 *ptri = &world->scene_geo->arrindices[ idx*3 ]; v3f tri[3]; boxf box; box_init_inf( box ); - for( int j=0; j<3; j++ ) - { + for( int j=0; j<3; j++ ){ v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] ); box_addpt( box, tri[j] ); } @@ -765,10 +752,8 @@ VG_STATIC int spherecast_world( world_instance *world, float t; v3f n1; - if( spherecast_triangle( tri, pa, dir, r, &t, n1 ) ) - { - if( t < min_t ) - { + if( spherecast_triangle( tri, pa, dir, r, &t, n1 ) ){ + if( t < min_t ){ min_t = t; hit = idx; v3_copy( n1, n ); @@ -781,34 +766,32 @@ VG_STATIC int spherecast_world( world_instance *world, } VG_STATIC -struct world_material *world_tri_index_material( world_instance *world, +struct world_surface *world_tri_index_surface( world_instance *world, u32 index ) { - for( int i=1; imaterial_count; i++ ) - { - struct world_material *mat = &world->materials[i]; + for( int i=1; isurface_count; i++ ){ + struct world_surface *surf = &world->surfaces[i]; - if( (index >= mat->sm_geo.vertex_start) && - (index < mat->sm_geo.vertex_start+mat->sm_geo.vertex_count ) ) + if( (index >= surf->sm_geo.vertex_start) && + (index < surf->sm_geo.vertex_start+surf->sm_geo.vertex_count ) ) { - return mat; + return surf; } } - /* error material */ - return &world->materials[0]; + return &world->surfaces[0]; } -VG_STATIC struct world_material *world_contact_material( world_instance *world, +VG_STATIC struct world_surface *world_contact_surface( world_instance *world, rb_ct *ct ) { - return world_tri_index_material( world, ct->element_id ); + return world_tri_index_surface( world, ct->element_id ); } -VG_STATIC struct world_material *ray_hit_material( world_instance *world, - ray_hit *hit ) +VG_STATIC struct world_surface *ray_hit_surface( world_instance *world, + ray_hit *hit ) { - return world_tri_index_material( world, hit->tri[0] ); + return world_tri_index_surface( world, hit->tri[0] ); } #endif /* WORLD_H */