From 2c91a71533b4ce86b9e7fd708420ae05c74d8f52 Mon Sep 17 00:00:00 2001 From: hgn Date: Sat, 18 Nov 2023 09:08:17 +0000 Subject: [PATCH] chaos pt 1 --- addon.c | 2 +- addon.h | 2 +- blender_export.py | 30 ++- build.c | 2 +- ent_miniworld.c | 36 +++ ent_miniworld.h | 13 + ent_portal.c | 80 +++++++ ent_portal.h | 16 ++ ent_skateshop.c | 63 +---- entity.c | 5 +- entity.h | 13 +- maps_src/dev_hub/main.mdl | Bin 0 -> 434648 bytes menu.h | 13 - models_src/rs_gate.mdl | Bin 4472 -> 54936 bytes models_src/rs_portal.mdl | Bin 0 -> 50864 bytes player.c | 32 ++- player.h | 2 +- player_drive.c | 3 - player_drive.h | 2 - player_skate.c | 19 -- player_skate.h | 2 - player_walk.c | 4 +- player_walk.h | 3 +- pointcloud.h | 15 +- respawn.c | 7 - shaders/cloud.vs | 2 +- shaders/common_world.glsl | 34 ++- shaders/model_board_view.h | 34 ++- shaders/model_character_view.h | 34 ++- shaders/model_entity.h | 34 ++- shaders/model_sky.h | 34 ++- shaders/point_map.h | 2 +- shaders/scene_cubemapped.h | 34 ++- shaders/scene_depth.h | 34 ++- shaders/scene_font.h | 34 ++- shaders/scene_fxglow.h | 34 ++- shaders/scene_override.fs | 12 +- shaders/scene_override.h | 56 +++-- shaders/scene_override.vs | 31 +++ shaders/scene_position.h | 34 ++- shaders/scene_route.h | 34 ++- shaders/scene_scoretext.h | 34 ++- shaders/scene_standard.h | 34 ++- shaders/scene_standard_alphatest.h | 34 ++- shaders/scene_terrain.h | 34 ++- shaders/scene_vertex_blend.h | 34 ++- shaders/scene_water.h | 34 ++- shaders/scene_water_fast.h | 34 ++- skaterift.c | 39 +-- vehicle.h | 3 +- world.c | 43 +++- world.h | 8 +- world_entity.c | 33 ++- world_entity.h | 1 + world_gate.c | 91 +------ world_gate.h | 6 +- world_gen.c | 1 - world_load.c | 88 ++++--- world_load.h | 1 + world_render.c | 60 ++--- world_render.h | 1 + world_routes.c | 368 +---------------------------- 62 files changed, 771 insertions(+), 1051 deletions(-) create mode 100644 ent_miniworld.c create mode 100644 ent_miniworld.h create mode 100644 ent_portal.c create mode 100644 ent_portal.h create mode 100644 maps_src/dev_hub/main.mdl create mode 100644 models_src/rs_portal.mdl create mode 100644 shaders/scene_override.vs diff --git a/addon.c b/addon.c index ef92b00..4d1e903 100644 --- a/addon.c +++ b/addon.c @@ -116,7 +116,7 @@ static void invalidate_addon_alias( addon_alias *alias ){ /* * parse uid to alias. returns 1 if successful */ -static int addon_uid_to_alias( char uid[ADDON_UID_MAX], addon_alias *alias ){ +static int addon_uid_to_alias( const char *uid, addon_alias *alias ){ /* 1 * 01234567890123 * sr&&&-@@@@@-#* diff --git a/addon.h b/addon.h index f63566e..8d2409a 100644 --- a/addon.h +++ b/addon.h @@ -76,7 +76,7 @@ static int addon_get_content_folder( addon_reg *reg, vg_str *folder ); static u32 addon_match( addon_alias *alias ); static int addon_alias_eq( addon_alias *a, addon_alias *b ); static void addon_alias_uid( addon_alias *alias, char buf[ADDON_UID_MAX] ); -static int addon_uid_to_alias( char uid[ADDON_UID_MAX], addon_alias *alias ); +static int addon_uid_to_alias( const char *uid, addon_alias *alias ); static void invalidate_addon_alias( addon_alias *alias ); static void addon_mount_content_folder( enum addon_type type, const char *base_folder, diff --git a/blender_export.py b/blender_export.py index 1646d83..51b25dd 100644 --- a/blender_export.py +++ b/blender_export.py @@ -39,12 +39,14 @@ sr_entity_list = [ ('ent_ccmd', 'CCmd', '', 17 ), ('ent_objective', 'Objective', '', 18 ), ('ent_challenge', 'Challenge', '', 19 ), - ('ent_relay', 'Relay', '', 20 ) + ('ent_relay', 'Relay', '', 20 ), + ('ent_miniworld', 'Mini World', '', 22 ) ] MDL_VERSION_NR = 103 SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_challenge', \ - 'ent_relay', 'ent_skateshop', 'ent_objective', 'ent_route' ] + 'ent_relay', 'ent_skateshop', 'ent_objective', 'ent_route',\ + 'ent_miniworld' ] def get_entity_enum_id( alias ): #{ @@ -521,6 +523,14 @@ class ent_cubemap(Structure):#{ ("placeholder",c_uint32*2)] #} +class ent_miniworld(Structure):#{ + _fields_ = [("transform",mdl_transform), + ("pstr_world",c_uint32), + ("purpose",c_int32)] + + sr_functions = { 0: 'zone' } +#} + def obj_ent_type( obj ): #{ if obj.type == 'ARMATURE': return 'mdl_armature' @@ -1942,6 +1952,14 @@ def sr_compile( collection ): cubemap.live = 60 sr_ent_push( cubemap ) #} + elif ent_type == 'ent_miniworld':#{ + miniworld = ent_miniworld() + obj_data = obj.SR_data.ent_miniworld[0] + + compile_obj_transform( obj, miniworld.transform ) + miniworld.pstr_world = sr_compile_string( obj_data.world ) + sr_ent_push( miniworld ) + #} #} #} @@ -2578,6 +2596,11 @@ class SR_OBJECT_ENT_ROUTE_ENTRY(bpy.types.PropertyGroup): poll=lambda self,obj: sr_filter_ent_type(obj,['ent_gate'])) #} +class SR_OBJECT_ENT_MINIWORLD(bpy.types.PropertyGroup): +#{ + world: bpy.props.StringProperty( name='world UID' ) +#} + class SR_UL_ROUTE_NODE_LIST(bpy.types.UIList): #{ bl_idname = 'SR_UL_ROUTE_NODE_LIST' @@ -3370,6 +3393,7 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): ent_objective: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_OBJECTIVE) ent_challenge: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_CHALLENGE) ent_relay: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_RELAY) + ent_miniworld: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MINIWORLD) ent_type: bpy.props.EnumProperty( name="Type", @@ -4597,7 +4621,7 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\ SR_OBJECT_ENT_WORKSHOP_PREVIEW,SR_OBJECT_ENT_MENU_ITEM,\ SR_OBJECT_ENT_WORLD_INFO,SR_OBJECT_ENT_CCMD,\ SR_OBJECT_ENT_OBJECTIVE,SR_OBJECT_ENT_CHALLENGE,\ - SR_OBJECT_ENT_RELAY,\ + SR_OBJECT_ENT_RELAY,SR_OBJECT_ENT_MINIWORLD,\ \ SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \ diff --git a/build.c b/build.c index 28e7909..417c319 100644 --- a/build.c +++ b/build.c @@ -245,7 +245,7 @@ void build_shaders(void){ /* Scene */ _S( "scene_standard", "scene.vs", "scene_standard.fs" ); _S( "scene_standard_alphatest", "scene.vs", "scene_standard_alphatest.fs" ); - _S( "scene_override", "scene.vs", "scene_override.fs" ); + _S( "scene_override", "scene_override.vs", "scene_override.fs" ); _S( "scene_fxglow", "scene_fxglow.vs", "scene_fxglow.fs" ); _S( "scene_vertex_blend", "scene.vs", "scene_vertex_blend.fs" ); _S( "scene_terrain", "scene.vs", "scene_terrain.fs" ); diff --git a/ent_miniworld.c b/ent_miniworld.c new file mode 100644 index 0000000..414b2f6 --- /dev/null +++ b/ent_miniworld.c @@ -0,0 +1,36 @@ +#include "entity.h" +#include "ent_miniworld.h" +#include "world_render.h" + +static void ent_miniworld_call( world_instance *world, ent_call *call ){ + ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, + mdl_entity_id_id(call->id) ); + + int world_id = world - world_static.instances; + + if( call->function == 0 ){ /* zone() */ + const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world ); + skaterift_load_world_command( 1, (const char *[]){ uid } ); + + global_miniworld.active_id = call->id; + } +} + +static void ent_miniworld_render( world_instance *host_world ){ + u32 entity_id = global_miniworld.active_id; + + if( !entity_id ) + return; + + ent_miniworld *miniworld = mdl_arritm( &host_world->ent_miniworld, + mdl_entity_id_id(entity_id) ); + + if( miniworld->purpose == k_world_purpose_invalid ) + return; + + m4x3f mmdl; + mdl_transform_m4x3( &miniworld->transform, mmdl ); + render_world_override( &world_static.instances[miniworld->purpose], mmdl ); + + //render_world_routes( , &skaterift.cam, 1 ); +} diff --git a/ent_miniworld.h b/ent_miniworld.h new file mode 100644 index 0000000..693a157 --- /dev/null +++ b/ent_miniworld.h @@ -0,0 +1,13 @@ +#ifndef ENT_MINIWORLD_H +#define ENT_MINIWORLD_H + +#include "entity.h" + +struct { + u32 active_id; /* TODO: world references in entity ID */ +} +static global_miniworld; + +static void ent_miniworld_call( world_instance *world, ent_call *call ); + +#endif /* ENT_MINIWORLD_H */ diff --git a/ent_portal.c b/ent_portal.c new file mode 100644 index 0000000..7d8c22f --- /dev/null +++ b/ent_portal.c @@ -0,0 +1,80 @@ +#if 0 +#include "ent_portal.h" +#include "addon.h" +#include "pointcloud.h" + +static void ent_portal_pointcloud_load_thread(void *_){ + char path_buf[4096]; + vg_str path; + vg_strnull( &path, path_buf, 4096 ); + addon_get_content_folder( global_portal.display_world, &path ); + vg_strcat( &path, "/preview.bin" ); + + vg_linear_clear(vg_mem.scratch); + u32 size; + + void *data = vg_file_read( vg_mem.scratch, path_buf, &size ); + if( data ){ + if( size < sizeof(pointcloud_buffer) ){ + vg_async_call( pointcloud_clear_async, NULL, 0 ); + return; + } + + vg_async_item *call = vg_async_alloc(size); + pointcloud_buffer *pcbuf = call->payload; + memcpy( pcbuf, data, size ); + + u32 point_count = (size-sizeof(pointcloud_buffer)) / + sizeof(struct pointcloud_vert); + pcbuf->max = point_count; + pcbuf->count = point_count; + pcbuf->op = k_pointcloud_op_clear; + + vg_async_dispatch( call, async_pointcloud_sub ); + vg_async_call( pointcloud_async_end, NULL, 0 ); + } + else{ + vg_async_call( pointcloud_clear_async, NULL, 0 ); + } +} + +/* + * Set new world to be loaded into portal + */ +static void ent_portal_set_world( addon_reg *reg ){ + global_portal.display_world = reg; + global_portal.dirty = 1; +} + +/* VG Events */ + +static void ent_portal_preupdate(void){ + if( global_portal.dirty && vg_loader_availible() ){ + global_portal.dirty = 0; + vg_loader_start( ent_portal_pointcloud_load_thread, NULL ); + } +} + +static void ent_portal_render(void){ + if( !global_portal.active ) + return; + + m4x3f mmdl; +#if 0 + mdl_transform_m4x3( &mark_display->transform, mmdl ); + m4x3_rotate_y( mmdl, vg.time * 0.2 ); +#endif + m3x3_identity( mmdl ); + m3x3_diagonal( mmdl, 20.0f ); + v3_copy( global_portal.display_co, mmdl[3] ); + mmdl[3][1] += 2.0f; + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + glDisable(GL_DEPTH_TEST); + pointcloud_render( &skaterift.cam, mmdl ); + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); +} + +#endif diff --git a/ent_portal.h b/ent_portal.h new file mode 100644 index 0000000..2301012 --- /dev/null +++ b/ent_portal.h @@ -0,0 +1,16 @@ +#ifndef ENT_PORTAL_H +#define ENT_PORTAL_H + +#include "addon.h" + +/* world portals */ + +struct { + addon_reg *display_world; + int dirty, active; + + v3f display_co; +} +static global_portal = { .display_co = { 12,1,0 }, .active = 1 }; + +#endif /* ENT_PORTAL_H */ diff --git a/ent_skateshop.c b/ent_skateshop.c index 8a03ff1..842d814 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -10,7 +10,6 @@ #include "player.h" #include "gui.h" #include "menu.h" -#include "pointcloud.h" #include "highscores.h" #include "steam.h" #include "addon.h" @@ -122,63 +121,6 @@ static u16 skateshop_selected_cache_id(void){ else return 0; } -static void pointcloud_async_end(void *_, u32 __) -{ - pointcloud_animate( k_pointcloud_anim_opening ); -} - -static void pointcloud_clear_async(void *_, u32 __) -{ - pointcloud.count = 0; - pointcloud_animate( k_pointcloud_anim_opening ); -} - -static void skateshop_world_preview_loader_thread( void *_data ) -{ - addon_reg *reg = _data; - - char path_buf[4096]; - vg_str path; - vg_strnull( &path, path_buf, 4096 ); - addon_get_content_folder( reg, &path ); - vg_strcat( &path, "/preview.bin" ); - - vg_linear_clear(vg_mem.scratch); - u32 size; - - void *data = vg_file_read( vg_mem.scratch, path_buf, &size ); - if( data ){ - if( size < sizeof(pointcloud_buffer) ){ - vg_async_call( pointcloud_clear_async, NULL, 0 ); - return; - } - - vg_async_item *call = vg_async_alloc(size); - pointcloud_buffer *pcbuf = call->payload; - memcpy( pcbuf, data, size ); - - u32 point_count = (size-sizeof(pointcloud_buffer)) / - sizeof(struct pointcloud_vert); - pcbuf->max = point_count; - pcbuf->count = point_count; - pcbuf->op = k_pointcloud_op_clear; - - vg_async_dispatch( call, async_pointcloud_sub ); - vg_async_call( pointcloud_async_end, NULL, 0 ); - } - else{ - vg_async_call( pointcloud_clear_async, NULL, 0 ); - } -} - -static void skateshop_world_preview_loader_thread_and_end( void *_data ){ - skateshop_world_preview_loader_thread( _data ); -} - -static void skateshop_load_world_preview( addon_reg *reg ){ - vg_loader_start( skateshop_world_preview_loader_thread_and_end, reg ); -} - /* * VG event preupdate */ @@ -337,6 +279,7 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ } } +#if 0 if( change && pointcloud_idle() ){ pointcloud_animate( k_pointcloud_anim_hiding ); } @@ -374,6 +317,7 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ } } } +#endif } else{ vg_fatal_error( "Unknown store (%u)\n", shop->type ); @@ -633,6 +577,7 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){ m4x3_mul( mtext, mlocal, mtextmdl ); font3d_simple_draw( 0, bufsubtext, &skaterift.cam, mtextmdl ); +#if 0 /* pointcloud */ m4x3f mmdl; mdl_transform_m4x3( &mark_display->transform, mmdl ); @@ -644,6 +589,7 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){ pointcloud_render( world, &skaterift.cam, mmdl ); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); +#endif } /* @@ -706,7 +652,6 @@ static void ent_skateshop_call( world_instance *world, ent_call *call ){ } else if( shop->type == k_skateshop_type_worldshop ){ ent_skateshop_helpers_pickable( "open rift" ); - pointcloud_animate( k_pointcloud_anim_opening ); skateshop_op_world_scan(); } } diff --git a/entity.c b/entity.c index 287016a..85557b1 100644 --- a/entity.c +++ b/entity.c @@ -10,6 +10,8 @@ #include "ent_challenge.c" #include "ent_relay.c" #include "ent_route.c" +#include "ent_portal.c" +#include "ent_miniworld.c" typedef void (*fn_entity_call_handler)( world_instance *, ent_call *); @@ -25,7 +27,8 @@ static void entity_call( world_instance *world, ent_call *call ){ [k_ent_gate] = ent_gate_call, [k_ent_relay] = ent_relay_call, [k_ent_challenge] = ent_challenge_call, - [k_ent_route] = ent_route_call + [k_ent_route] = ent_route_call, + [k_ent_miniworld] = ent_miniworld_call }; if( type >= vg_list_size(table) ){ diff --git a/entity.h b/entity.h index 0423791..72a6667 100644 --- a/entity.h +++ b/entity.h @@ -30,6 +30,7 @@ typedef struct ent_objective ent_objective; typedef struct ent_challenge ent_challenge; typedef struct ent_relay ent_relay; typedef struct ent_cubemap ent_cubemap; +typedef struct ent_miniworld ent_miniworld; enum entity_alias{ k_ent_none = 0, @@ -53,7 +54,8 @@ enum entity_alias{ k_ent_objective = 18, k_ent_challenge = 19, k_ent_relay = 20, - k_ent_cubemap = 21 + k_ent_cubemap = 21, + k_ent_miniworld = 22 }; static u32 mdl_entity_id_type( u32 entity_id ){ @@ -109,7 +111,7 @@ enum gate_type{ /* v102+ */ enum ent_gate_flag{ k_ent_gate_linked = 0x1, /* this is a working portal */ - k_ent_gate_nonlocal = 0x2, /* use the key string to link this portal. + k_ent_gate_nonlocal_DELETED = 0x2, /* use the key string to link this portal. NOTE: if set, it adds the flip flag. */ k_ent_gate_flip = 0x4, /* flip direction 180* for exiting portal */ k_ent_gate_custom_mesh = 0x8, /* use a custom submesh instead of default */ @@ -496,6 +498,13 @@ struct ent_call{ void *data; }; +struct ent_miniworld { + mdl_transform transform; + u32 pstr_world; + + i32 purpose; +}; + #include "world.h" static void entity_call( world_instance *world, ent_call *call ); diff --git a/maps_src/dev_hub/main.mdl b/maps_src/dev_hub/main.mdl new file mode 100644 index 0000000000000000000000000000000000000000..4925d9f0420bbe5f0aa0d438dda104c62619b102 GIT binary patch literal 434648 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 z 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 J`Ss?P{{bzJ^q2qu literal 0 HcmV?d00001 diff --git a/menu.h b/menu.h index 5218485..c2a963e 100644 --- a/menu.h +++ b/menu.h @@ -245,19 +245,6 @@ static void menu_trigger_item( ent_menuitem *item ){ vg.window_should_close = 1; } - /* DEPRECATED? */ - else if( MDL_CONST_PSTREQ( &menu.model, q, "reset_nearest" ) ){ - localplayer_cmd_respawn( 0, NULL ); - menu_close(); - } - /* DEPRECATED? */ - else if( MDL_CONST_PSTREQ( &menu.model, q, "reset_home" ) ){ - world_set_active_instance( 0 ); - localplayer.viewable_world = world_current_instance(); - localplayer_cmd_respawn( 1, (const char *[]){"start"} ); - menu_close(); - } - else if( MDL_CONST_PSTREQ( &menu.model, q, "reset" ) ){ menu_close(); respawn_begin_chooser(); diff --git a/models_src/rs_gate.mdl b/models_src/rs_gate.mdl index 9d22e2ccefee7b3d0fdc7f417490677ca7729a1d..1cae7c174d2adcbdca5ce1aaa00211b0511bf6e3 100644 GIT binary patch literal 54936 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 delta 260 zcmbQSmidPgW9mdkW!Vx21_nkTE-op`%u6o@vLN6EP>^+^qd2PsGl&r@ZuJAm00A2y z&P~aQ&rK{zEy_&H0g1un1fX&ysTC!qMX4YupxnfDQcOVdlvEVDy2QLppfQ>Gd0=&5 z_x}fD`6gSIvF~JG$3FAE2&tryB@Ee@L9!=`EGLS!M$()@u>S-1^2hXL%aU_ z=d{UE|NnPghV&TJr%S)cRrj~-?sr3aj2JR>P>PW3;(0D%YZ)mVV@@lpw<1YjQd?;kEeSM>e4^?xBA;jr7G@k!+H!F!cX|O_GSGq zTU1oE2=}gX>(kBUxb}S{lFMdbmu`v4T=M_xcX@NvfT8{RMZNXbTjjg{S$fdm&V9N) zIe1|29=b_gOCdWZDr$`RH~s&=xa-OKskhtz^z-E3%P#(5`>k8gS?REjM)V1bMv^D4j{jm(C9nKrK^^n^jdS78Gc%Yr z!k2`v3a42zN%F;l|J6U_bOp2S#@%*F^}m9|DHY85=~?W^oqq;HhD;0I&zdmlh`)U-@jS zc{QoK%18N(`R@B0Np)2|o4Py_JM35wuY79uyjrQQ*Phh$KNu75)t|!tqyetJ-dTM) z>3HK>UisAQ`DJltuRW>he```!ul^M6E$L6Sw|Xj{Y3HUV)!d%RD?gyuL*_u)E#Wq` zhrI_MG8wXN4yU{JkiSQbJKDpJ=U)k<{yZ0!-ut*YEc~0=8#qJd?eV_$R=RDeaHrbO z_vI7Jx=F>um1;lhYbKaw+b??MOZMm*o|HX5H0*6gXXp~Dxae@6YR)irM&i}@DCRJlkAay zuno3f^!DF{Pn9qmWKWI7`K`H7+`J`wa^xyt%OqU&%8z=ara3Kp9+Lct8Z}Km*;7LD z8z=n~_{!%QC*N#wesfgvNndRtbXxop!Q&1 z8`8on-!S|5VDpW;%|OYoIW{i1JUxp^Bl)*9zLab6_8t1w2CUj-z<2@HcoFEE zqxN9c9s;!o6I>{6m&l$N)z_X%+v9xl8ego&7sL26U`hphPWC(_f0Dj(-MIh59^3j~ zdo2Fhr(ffd)p!(WJPO-?+SpE%Jq^4yva(%P)iz;pRwg>q)BmWl2za^c#(#cemJ^yGtdhyskul$vFTbsVBFZ54&u(esN z@_F^;gVl3Ky%&`Cv>%O+@fv?4@^62CgYm`u(|KyuLu&su4_vsTy{)*MCtlApCXhWB z2Ir60^NiUmdp5~G_~dDaG9{va#QHn#%|@Ejvu`HVmwuo8{p0orGxsD$ z^k>U*kt(pU|9L5Or0*#A?5Re zN50;y45qpK0XGePSh!-lDI1;|ax7Rk`GY(3&&huw*pRlXDR3e>JU{S4@bS?uCVp?m z@NwO*Pu?~xZ6>U07}0+#Q)%KrlRy`tdqw? zKikYSmHu(m~y+obUQ`>)66T%KtDxi1XoR{GN`e=dGo@QC{DjhPd}F-5lrxi@q-uho4a zq`mp->yw!igF~v{a*g(fwQ{`}e6RX_yZHW)@z*DB+m{YTsm(lb>sI)s@JQjV!kMC? zj8FcLt!d2e?^>A4Jzfk)u1;f0e$v7mPWMuzefsJ*`*+8Jqmn;6=TKN;$j3od$=7Ll zC{jK?`5oov2Itg%DxHY7S9{J2Dysd=>k@4#AD{gFV;>IoseL9CDQthM^Kg*?5Jbuz4BdK88g0dAyaBxm^1ekGo#gh-kVh3ym6wK`A6*s|KpQi_hU};v*cT;zNT!< zX_iYqRDIF@edE!SL$3rYWX~quui1Vj=qq~~>VBzTpZq^BYzw0DtN)IuW6Ss69<){e zjaywiQola=)W%2VFFyI5_A#?;R+PD^{{G43BzdQ(UJ zxAL!z%-l@r)z`v^|MbaMs#rz(Gnm=xQx%1m2rm$3Jo3rcEFNQ4O8+ReXVWIeY?l5R zYR~jvpL~IX*Mk$X|9!QGX$$`dhRFWM)E;O*KKbJRJ|Eh;dOlpQ@tyes?Z+pd+W5=! zt#AC*{4q)E6-Mh7NqZ}On8f%#LC??3FMRTm;o37^GvD!z*QxpEhhqvEpMS2L?)jv; z8n0(%ZyG*$Xna!C!z0bFk2ed^?~_l>KhLO?-}wCb6D5!CEH3}QaMr5uw{73-oFM-{ zv+Ua;<>MQ#Q}eec8^?J4ZS&LP;*QFn7i;lLSbAQkxXbeAALY3ca=$+RoSHu@l90>m z4-3v75Pwnrc2%c*c58gs_^R@^t2^Yg+^^4nrsjWmUiJB_B`+L^KOz5i^YbkJ4(J*?8q7MA_K{<|vcqv0ft*Tu`m zgxUAD2wQ2q{;g-;kom8#ew($Z7E)h{CteMQ&#o4}p!)iK?eviL>8sz#y%&XRHD15^ zQr~di$wgsyjo0TYCWb#PF7K6}IW9}sLF4t)drpQQRLL3^(|CRA@To|9^VQb}Kh6k` zsD9JTND8;NnGyb|`t5u*jM(p!KP$aYYm82+IX}FO_X@9^RLR>O%E!K+^o7RX$%C@n zHmeRK1sZ?TjL9CEpZe;z#J;$oha!{>lD_!t-iB1s9$V z%a=PCR#y9&Gwwp9e0=g3#%8d)G+uu+Xir$ZRR()Y&y&|G?FqXMsp@TSC+f6ITBY&y zY=tVe@FSg*W@IyngoSXuIja&5-f>k)6?&^7qM`%mr;3jo0^t zXTsy}6|gNdUZ-t&CM=i`>y>Yqy~xh>8Xt%M`G7rDq`}TX8Xt#0{eYdW{^)D}D?64B z(>5w*K2L0Dk0+H5H)#C*;ZlQ0{rcpO-?u1?lKg`^YuJnv7KWQ8A9Sq|sb8Ob#(v+2 zYh+K(uS(kQuU`oJ%bsI~3d={q|$h`x;Mc zZfs}qpFa7WdM*q#Mt3jph}|x{%i&!bFMRTi5+|QS`NQyHL$5#V(;$mIC4c+(!^6S_ z&t$Qs_-=<6PKW<8}R66RYjbem=~p@p^Of!&Pa|zWPd0 zzrk0k-)~jFrQ?c6?Dxs1Xg|SeH+Ju;IX`F`qx}re`pmXWIqZIozk}zjO!}l^4qH*< zZ>Mg{Bkj{yzqjRw&RH4%ndB=Z%SXz`C!eDI1WVL@imCm))P8WJe0=gL+GkK($YlYI*yN#?zk~myEQ3UwfNyS0$TK7 zq@rbhP2Z>dee$>Um+nwHK>sM|k7`mfQvN>qYHH61lG}4Ydv2@tytH$2`TOKk^q1gs zjn}O-UjNqOOtAA}SFb(&zpQUx*Z8e-j^pEsMU;EFxyRrRF^X06u zOOviNZ){)J`1?lO;z<4eAM)|Y&yoDBxW$qB^~vA1XH)FJ;H2#7D0@Dd(mztaKKT^= zH+V?>w?%UQjnuDCKE-(bU+eSipZer8WP8-Uuko&D+1X**YLD9X8t*z3o)z&YzVWM7 z&9-)q#?y-(3WoRAZ);a-JUv{wK&1Wn~$3R!`4bpF?=Q@XA`(BK_AVe_Q{B z4h4gXcV|@QF|E&F{c%Oex zF<%RIX})$z{{M-qVGyhP^~tB^KN~H{9PjhD1OA;)1!dfPYWBDb!E)WNPd+t&mA>-! zIG=w@F@G^THGkd&+?2zVko~^?o??9_nC8~c3(Of7 ztk8bFuRXMP>nDq6tqOkI`pr(}<61un_NjgP>NmyuOmN}f_4A-!RFrr9e1_)Z9W}m> z+;cM6q4{`Wjql$aJ{6o(d-K)T!*0E$Xp3Kh5%W96F(3aV&y`@N?Dxs1SkDPQ)A~7c z^Io@Z1u7r!dV6&@zb@V{ojIuabv=#OjhCe}(Q2Q*`Yq+=?=KI^ZUW8UkQl2v0h}(YyCWv*3XA%%*fm%#w(v`*;O6^1PgOSKRsKHt z6zfZ7uGW_l)t;NIu3_@4{C)B%)~`%{t)I6|UOzX#T`caE&!GA5yUFuk^NZ%c{Zuwb z_Lh`Ay}j-KGtIBlCC{(TjqwY^Z5prRyVj8Y#a{X4n!h8j`McSp`8)IR?=LklOI5$V z{#D4W4-EVB0TXC_Kzki#*wYV~a;jgSd^fG9rB7Z@GYhny)?MR!Qk7;Vt?Jh&pJM&| zzv2OiAM?rIp3iO^U&-XxeD=xY`7H4X@xJk^@xSwBvqtmf_cXrm-d5k_RQvJChi*RJ zt-vG33UAZ+-b;9|+K*3uoaXzR^!$)@cRQ1)`Tj2Hud}h88LIZ%aTm@m1V@_cya|#z#rNZ@)V=|NLOW5U+nuv40vg(*Ei5^8cM0 zJReL}`S`}`)ckGN?Y+JJHpPBuVBCJ_+T!~I?$_tfQ}c(<#3XqAVT%1qtvk;PD#_o@ z?GkMs(*64UZEF5!y5e(u{wl@(pkaTI@w#H2Vut(m$+KT}i~a5qb$ z7XsRwuf9^mGX&=p&u~oRwc-sT@ufcb)Z!(MU0m$dpF{iCA0_W!2kc*0)A(Dv<)MK7 z>#JY($9GBo#~v>R!?izNO7b74dnr;rKKa}65*1EF2k8|rkzVbmh3xOB^6|;17LU4 z#_BKlA7A^wy?_1KiD)xP``61f{_ax$rG9<#XS6?lR`d5UjrIq-wLi{${8#ytq4LkZ z{qZi^e;=pk2kpNHv$g-;NcOxb|3>}#^zU}@Dt|n5J^psQN~bwD4W z?Z+qI+U=*;wMjwjuZ_%W8n4SV3WH1XKR)>#ZomGYnL~of+OMxG`+I4A@v+*EPo8+T zI$A$}Lh-t%6wg*#<8^Mu>(YLF@{0d7iq{PkubcGjs{_oMESrNjwSP@K+nBPm?}$h0 z|J@MtmSV{6)BfYJYeP)VUe5(ZdgTp?Us|2}l{@4|b?9ZTMehmrYCn2bvtDLnrQJcz z_RT`#seJldT_0wqrA;3k*8XFmYs1Wg>7s*Ll@h~$h`&lR?hgIGTu3zC>bw}t(*EW> zs}oJl&tC|NuA3eb59YJyg%N{I!qa)Go!1`Xi^2nm^WL z4(`)_4Uy)oeq z{ohULZZh=Cupv?ViDg@NHEVh;wp6%RnXpRayn7j!g-$GsAK zsI}ppgFBjO*Cz*6kDQ9cllbbZPxGc`(8Oawf5ihNBsMj}s~-(Y#$1WS5Bv153)`8+ ziP?h3wVzvPW;?SiNA_Th_H(&kUwzd(*2FALoEp5Z{bGBziD`ahO3+aI#l)-l?1@(& zpCo%uDSn{ZYgNokvgfqo2Z;ai*>hIU?mV-e9g)ZG6t29wV7&vvl&7zLANa$VB-wvM z`?>EIt8dzWS+-&odvApbW{b*mrS^-7-}BjjZ_`}n3DsA% zYc*__=-g(e>g!p>ClHV1vwzo@_00;kpGUPHTChL^b5iXm%f6BkdwlI@MzdJ6ba993 zuWP^c;__HC0c%G zXEE=nzlYi{UN$qUc}D%+YQLEHAK(4XEb>#(IsKmCjN&WG7yTtDRC#ysyW%T|m-F54 z!tX1aztz9K(|%=|4=S6t)W3Rbzmj;Q_dNY;TkBHhocjAX?T0RiE2X{@9cI{GKT@8( zJpH}!(|OGLr}M1es{Phd!n;;&UB5{f`+emTojclGkU#9K{oD=pqD_+g;S1W&jl}zT z%ICqjZ-S`VV}ic*5^VLazX>+VKlj#tG4W2m^3nSOf!>b@ct2uR!sg)KteXS9FJOru z^OcX{{{y{m66k#sJ2FF;;2z2AeUnH$woiW3FNK4jHD0_tYl!{h^FqN~*|W$FiNt&R z>}k@?#jUg(dL=R6c1kkG7Hc zA5ZywF?USdY_*>rNyF@C&o+wds`k_8$S_MhlFy!*8Y@V=-}cn<46(nY9UQCenuxrw zzOubLDJhrQbK5kd?Uc3Ck{YW$&$&D*IljnakL*v9{o!!gU%JAQq{(VO*iSr?uYc7j zUof2X>DG;%rT?K4g~NiUW9rS9e)ji$_Ne?rm48V2-}<~zxKHhQp~@e5pFe+NbiXiE ze;=;$SvIDBcuD>JX_Ze##drDa8J+Ry3#m!g=z~ zMHhFoyH2$XSIIxu{IXlbexLqVvi1%cFJ{?cwpxKc;cEHY&8w2{*XMt#o|zrKtMQ`X zwm!DqFSEmkHC~)M(kF7iK6}oe*c>jDJu`l7W9QD;94?kUQ(LvQ&nW)NXHTzM^TU|z z(VGVA9$N{2wX|TpCc?W_p1%5BU43u3LiSgYJrAzl6V8?WH)PK!>G#>+S?@DlQF#{D z-qCY;&V}1lo{#2fABo@a+22<2KMAU@!}S~6_n!VcT&((P`&DE6v*KZV_7Cf^JKV4K z(?#{WH~a4JJGGyxs$cHc*M5Gje<^(C;^B>LR9~Mad>_Vq98+(A>Wg?1-~D!)mBAKO z|JtqcZ2EJ0+d};-RC!{L?|$1f&1Dy>zh9L7AHR~*j#7UgB>Rb9^4;&%eT8g0`JXL= ztJuYP3)y1wKR-6D8j0ue-R}c&--PnFVWRwPrLVsUSEzsWlfNaN$~Ru5%^hvetH0yV z*Vc=+Z>Yb&EPqaXk#D>x^mHD}c(F}mL_y($XI`%c#(rPN3(i=EztXD_E?RYR`1gV zdLPXazvL?)z5iwPzGR^HC3*kLrj`7w?tLPkyq<3rFEl2otLNLnGdkKwWKTIg-x9y! zv#06wcDADGYq{bvM&J9m{Z;de>MkC`r~k}-eXX9)gTM8Bes_ny_HmU@aXp_$;!ix~ zb3L(-9isNrK=C2f_xG{)tNk2s@gY8YG{3OSFD__KF;TccsgfK16ega;S6}m^huNPs zzo_4QSXjH_Fq=#5`RwiZ7LPreAK6#cevW8mR2;kK5>i{r5;V~d<0Zm+!hT$sK1$ynkaeEL7R)YaZA|8qj| z2JPE*vxDV-@=r~UH}KW(v{8fX9{IOsipN;9VvwC6|JI~Qay*8wzCK&s+xC=yuAumY z4!3&SVe-$5U3`L1f5Pjd>{R*NIf_?#RCtp7?fBdADxUgk`QA`FS>wgV3GY;|{rONE ztMTGum9vri_1W`@>`9b8Wn-7dx0gN4cYbp54?cT%E=gQdzDCTtU9m@n=WQxj?~8k~ z)kuy{yK_GKxNP1i`%lbS8Q)Ael>JHFmM6#0cBp$;zUeMpQ9ujIjBq*T%{;>Lci%QAyUB2o+!E z>v^M>+E4$l8b{&{eD-KQ$oO7O^FgEepnbMO{SBHAa=(f{xwHTF((_MNwdb9`wlS^r z{BytB^R`xPO(b5zV~^&KR`W-mH_R42Z|qY0nV|ha;z@k{D`SI8VcLvkHnm*b&79Tq z*tt(NUVPcj5bxo$NAu0d^N;46rktLCcB?)2(S9QFFg|}iLC=RDtG{>Z)Yt6M^I`Pp z=&EAMn|; zPxGCbvZsjZ>$2uMbCc&gk^OX^J!3Sd__A56O;2j=v%B!;ZxpO|pD^(uzWUv#`O(X= zf4UuJp4a?nk?dc;YFKhShR6N_HXi{s{S5>u# z7c?K7uKG%^_Q3wW&;E^?pYB!r8Im;2tk(SWLh}675I^HQee%|OkU zmuh}7_wpz+OZNEgx2@*ynbp7ANj}rMX-Q4hzh+BbFIIckqtaEvxm7mhwNH)Sl1e*%F^u{^t+9Z<9{(3BLPHF@HBVHGh9j{cEWm zqW*p{-Zx&{UQf_^h+#0&Yx3$1OeCvj%ayx7Vchjpp7QR^G{L+^Us z?e!L|SD5lzZb`*pK$vGehf#tyN!VXEZY< zw0>Ab^>t10BEcie>Czf85ueS89Eg{fnyo8k(21z8a(U9Q@G0ME2`F z^>uqaQ}ai|dgg0tKa6+mC;Ix=B(3+B$S`Bmf}J(YH(KwV_hC%E*^2*Rztv}t=9@we$`$|UkD}DC-)uO4{pz)&i z%Q?*5+P^rg@#2)?_t?+%=`XGI@CW68>Rzj160{!vqWsT9#ZxuY{rc+nwAR}X%D>gn zK0s-$x4$6&wn6b)><{|tD^7CkUtCapT8-DLn7;DQ7Zjg1MfVEpwV#^WzZjtL;)LSmwrl?)M&m^*#mlk(=(DGn_ETEPo|hHx_k{LS zTFRaVF;{|N+Rydbb3$#aX3JZft}5njo$&WB6|8qcI62 z_safP74L_BpZ!&}A2dVdc|-AvTeKh4S>@U5$f?MFsL%dA+Hd;3^`YRh;wSfMzbRhz zbwTlyowUE~v;VC2zp~WL6mEJt+T_yyR~5CN35x$@|Jv7nPHI2y=H|ScXDvJ*6w`iO z-;FW#vX8$Ie6RgkUwgi{ZldX~{xxhyQt*fN2gi50JNQ!ZvBZ1$?)NwCS5{De-=%on z9NMo;um0YA-SkL2fbV{v)Bfp6?VtXhy=gF8`=<-FzVSr+W&!)-zWcqsKdAMSV2Jhy zJF0)(tLJm#TYTe%)--|ln=|ey}(DQR-|HW56dY(7+ z-pw2)X+5*`&*@E%u6Ku!D?Fq1%r9Tb$^KW^PwScNANlI{`o2OY zA^o0kqt-K5JBzpVdr-j45n$JUx3 zWPKrVrJg6P)~yw_^O)^kqHvIOI%Ws^7ramHliyc; zZ*Vv3Fl+DNfaLYOYKIo+6YQ7#I<4npe^1YT+@tSK zim#yZXTRpFwbSC8sQmT37uj#}>3>S+38fkTN|;CM=P&0u7uf5QL(LZ=^}EZnKY0Hc z^}EEWVQ$$!=$F|+wv;~S5%jn5L?9QR7tMrHW?#%#e(=`SNp`S|23%pJ3H ziP}SV)z^>DHrhEt?V*?Ii}%fa@?A#!6ZC3xDEv_E=fkJ}4z!*hwo?0{z4_Y1&nGqq zZ%;fHPF4GyGh=h`R`sLdD{7y#f8Y6FYbUk{R!P2~+W+}eEra!vuden_`TOKEmU=Y4 zyX>i={`Jjc9phKYo+$M%-hcPm6Wh%uwN-m=ul`#&W=m3GwdZTvALM;upSPCga0<2A(tu)pBz z@AHorx7F1jYbzdLWX}>-^RKX};sMyd@b$-g_GghjFNOyd4={aZR!jRotat$SM|}Qp zXpx`7$JKs*R6IcTqQ8WCo)7<0JOKMIzV`Ed_jdL*-S0ZZ&*bUS&TiHHzNGjW&O`Iv z?`LWUEtgeUbzLzYYlN>ZE4bqeVa{js-S3xEy4xZ0hm#fmQ=)Zud%wyj)A$RK{SKde z>>tMNkbk>pVkx_>Sbd8>Jfrv!%HLN$3&M7GmE?yi9wyt&c6Phu=O`Wq`+fefc-=(% z&zj6(qT-!?|Dmrfs`CFp@lNcI`1Bvr`;WiLUo}$vN#+U_>}L6^J&He}etrJ1=&>et znf&4Rinm#Hwuya6{;;#+Z73g~zbdw%qy1R=v+g|^t{U9Y&XN8hiWg!($R~g4LZa=f z_VAwK!Tz&4(biRaXsLKG_FsJRnYCWmR{rNf#ltj=&TZe2|CytB7}}e!Jrvb_zAXQC zOYuK>U#nuDmw$`um@iWPKL6Idc~d)7@}c6F9!zX%`%8YH;+H6YpZxmM?QKEXlY926 zaLZ@yZG!B{RPOCa`TOh{)}fdEJ9UyuYJ zq*Xj*sCY=u_p_Dc57Vx>oWy>X?|xHTf98B$-}7Wz=Ra#`zKQ=FEC2b0=9|3F=<}aH zIDfKM^O1b=Cu`(Sn2)d??(-*K$Uh7!KX=`Wnvax}e`xh}%#O^OkMMq_&p(v-xBoI9 zv6<9=_iH}F`^&!m`-AH*R`Zce>M!@Hzc3%+eQmG*{I|UYQ`O#fsl5%=e1!MSeeEr^ z_4%cf26)S7n;T!4@8{O|vPb2UTl0O&-&a1Vt{Vc!+b|5n65 zN9xO0o{V25D$K3AMC%)0Yy8@LJZ8rnt#4qzPd>Hv{JaT6yz=pzr_Pk(Cr1s^va z?%iK5?)-C>y(fc}^3Si!KabMn)VOPd=x69{5n}X*2XZFk0>Tkk->Ef1iA6`xlcdjr7W|lYcIh?4JYt zb0_)dyUM*C>0iF~kN+Pg|DUAw7W}{Vm%~KXTh!lu{-5zh@uiF}Cb!0yiOJ(jq<($! zj9=}N$1lV9H6wZaiqx;q9-e>N>-pygt!L)Y^G{Jd|NO1>OzPJspW1oCO=3oS?brEo z5&x|7<$_n`pB1len<`!%f8z7EI$tj0|8>3`@$h!0{J+kZi?kn~KiBzk(x1WVe7T^q z@Pg#=CBWbM?eWXh)A+Sj`e*8$1lo^JUgyi*9v{tYjgS3he`~!jK>P8@>wLM} z=TV#5I*)p(#+ST0Pnh=OyWbS&U7M8WfwSiBlTWc;VOXzNm%LtKcI!N3-}tgw^Y^!t z=kLb;JAaR?pZol0Tg}J!X?$_}Bf*z?{+y@%j$gGt@AGeux%o2tBil4zZYh7l{s`~S z`us_8%}*EVd90iEM?N3jXlHNrN5xy3;@V&EjW5;Q{H~++M{efXlBE6Fko^(%FMRED zyw+#d>wei!WPOJ9iYnSa;(GzU`_=weaN_Y%W!V2p6z;0^iu%Hor|*8#Ydt5O{J++7 z%-34a>8$eUr~Od&3w-kLY5ifp{4@JyW3~QpO#WHx59XBiFMQ>*SL+)GC0|DSeF<9M z_)PM@XupsB3!gvlsr4eoOS4{NnrpqNpUR*8U*31~>1RFRhWux1-Q!@bC+v~`)Otds zetrI#^$M%!^E|Srzt$@f<)6QlJ(Q2ne?F=8kbk5p;lKl`VYk59gX*00`D zdtiV3l-92lUlFoD&i;i@{w}Q#bd`UrtonVqb;tPS@^4xnFn6iF`Pu{P4=dz93#h(M zX#HV}{AV@Q7v=BspFe4RW2NM$s65})`o?m}zpC=2{C)DBwSLl5_GtaYC>}Cky@LJa zr&azwd#<_lH{uOeX#MS8wdeDSH()=-C$ICqBJ+Kn_hlY>?c1F?-_lmp{uKSi=O1+5 zSG>;qvO4d}jMjRB&f~JRwco`4n$KUcM!|Z8&igXkgtrLy6{dcD@;dM9_Iij}rS%Xi z{rk4nkJPVE{`Pu{&igW~w+xc~b+o@j{rco}-j~sNU!0$Bbl#WIdFf$potMu3k?(#_ zzd77Ito4dN`i`wu@ceKSBY(Ky+M%kP@9p!4S$-a6I?6xfQ+!c;&e3L+{KI0Mr&K}f z!#@A;|X$S3XsVCsh2E zIi>Pxu6V+i_5PPnzT@ko%y{{?rE^xsHy3_G{%xS*%_^zlmOo^9QVL1u>h)s4m_ zBl`6lz zo8Izo#S~B2@m6n>DF61A;tAOw@%gtD^29@$A(B6;cu3lhPdgcy#hMRvyA6O2{5`RnolFwL3 z{=d${F?zq==Fs|Z_2c&#oo{J3YkipgBcFbq|D$)B8d}aft=1}oN&7`Z`?JnFMgHT- zAKan;*6@FVV=b!L@mgPf_rOiw_tzO@(UJA}Djs`uz8q)HSk5QBEId@0^I((L^B3Kr zzhD1D!Rh|ZY!$7qmMwQMDEn+PyGHLN9O?sI=|O)e(ybd^^KC1 z!|e^7-<;~LEvf~DhdpJdX+2ZtJ8@ow&8_uJ_Ft-c?1@hIe7w$+wBPA{+bM^} z$N$xAq~(2Ew;yqbex3Icyxq8v&8zkNGuJN!iCWwHMCYAyzxzGkw|XSl7R(Lm*bQ3K zzEEmw@bdUN_6=d|_tn=Y_bm!;+*i!D)cXG~;}-@SPZYCFwEmC%KKMMV-wn6r!dUm(om;CH_n_&CZdUlr9!@1w8p7!%*$I`(y z*>hUw#~w^lOtb8{a;ZUNf68ai@NrrA9)aDg_f;oV$;$Z*wvg7JlgsnY`aNC!{rLA~ z|65w$F1YGId|BCFTg<7eD=4=RwQnz z>g##!cidm3L7d+Aw_~;6!G4*~{`@75#^q7_`A+ZWCT;yDZiL#;H+nx8dwlKr__yPB zZc}?6sP*be3p(xmTP*KDN*Q4Ej1_cvb$#YQN^dYtf<3+q4I@U&DT%&;RJW zm!v7`UwqGEZ?G^)-?Ol}v_70{|DF9y=eH!SSAXaG6esS#o}}}xZ91(#^ZuZ(d~_a5 zsP9MEE?U$6Tv*?auswx&f6!MxO~yVP>U#~glh)7gs{3%L?={%Lsx#j2^Oet@-UC8? z@4&9n`h5NC{X?C{Xk)cL&--q^@@bHLe5mgkS$)sQt~)j^)c1^Rl+L&3Ja%9Cq$baK z;6C}(?BV?;pFM?M+!m(IpU3_*qK>_<_x7-z>Z^vnU%>vFPk(CVgS@YNuC-eoeya8} z>q;@(K4A^#x!F?so&x(9KL3+ieI@UA+}WOwmzx`&ReLU@?>l7cH7_i$_B^LcbYwrs zH(sRHe%L?qwV#XnuE|05uj2aNL_)3?!;9))3-!GT_RDFz zoPA|%_|);vA>+kk`u+v`gFbr>RxTIT)OhiPz8915S;dg?;*7rU;=>U$-~`}}SH!*|bo9c`GJD)vibiVpS8ZUlSJ4ojmsM(amfv z$zzYNzqdaeYiFsypO-yln#9`D>hEP`5Bq&S|8pSQ!#31-@r>H@vVqNPe)*q2)SlT7 z_4yy22NmjjSXNKFW410G8|r&lcJ&X-Vku8w|I+zRp}ubwkb3%mrsnveqZ_Myd$gcPetT2{HL_td#a(GQ|$11?Dv(A&I_{o zo>WAB)`a>tv&M@J-QL*9{-&>dbbgN2_sb&kQy*+?7ihfr`=LeEIWOH;KB>v`Jx8B> zYW8s6wa=dYs;~D{U(rt^FOK8SMvVFo&EPOwdYN0&+=D6ZnfvX)Sf%*JS+BFed9%H?FV^Z`&py@ zwOak_KI#8S{p+auS1;*jf6X^uq}HC1_qFG|>hIar-%F}|9#DTDqW=D*%7^_apFJlu zUR2k3aYOahTjRwIjTZ?zugUGd+%aA}>HJR`od>l@{>RAw4AOZ}+^^67Y>|H(BL9{{ zYm@cl-@3@ZZPoc&*zc>a8}iR5zwRqsPna!X#AQl zd*0FcTI|pI>`AZjqM^o%(z@T-8ZRyjZRC#Gcgn-c9uttMkOzFZS8r zQO_H>)PC+&{f^f22IIx6s$cB!wV!Jmx3;J~4^n;g*YnS3YR^BazOcvV4^QiP>_hdh zW-8C3dLGNE=dmp+Pwesa_rLUfxKsUot?cit=fmde?{#E9`*%M7Q&`WdzsdjH98t#@ zJ+D3_|I=V~?Z|$p&;O)&9t$4V{DS$r<`>TXJD2 zvqbZY?=@aTYk!mdUtjs8wjRaz)O_;YbJRA!tNdS0{+@z)ROMgUtq1zr+W@@}qVwnN zI=v5mVp4t6UhVUDoj=cdqfh@myBqU;H~V|_rAfavZ)|veo8;Crefo1s{%gtC)_Uo6 z$-gT3kF{RPdbLk}udujBiDzWUPlEX;nj{{mW1F08naR%-vtw4TiO-F)(?t=DmWm#_V-()%xyO}RD;ol|B1}EgNa%#VW^#*$KD*MlAKjp0KFDm=r(tZl-`9AxP>-&t2G`{>0)1=0w?B@f&mp0}ir^Xf^T)M+MEUsaPi;Mu^8mHJeaG`aBel=Ie!Hu_)~mkiYya-#JXPY#G$h^UniSV`|L*x=p}*xzxA0 zYfzp;Jol^b7sTuPfR^tAru@D<`zf*~?tjeG(){b}Y@A%3mc~@dgWd5>X^vMmHw%HrImaL_}^SA#k z&(y{*z6as+@%oagT=|2A5mOsDm(&5Ea*tM$na^5=UMPer_nPk(CTHS)gtdQ$79 ztaqi+`-y{3?n>&Z{_>FCPvrevUw=vM`2l%f{Z5%RAnA9)Z+6=Go%-V?eP19sKH<*i+ti+~koV1BvXnj= zS4jPLi{1zPY5O;EW7U7(*870GFYL2th1(z5ulMQhIh?#dQbzHsdz0fI?(kPX=O_}l zTI2gj#S@M$-XLzE#`h75C**#8PGo;QBH)F2YC;?ut?_WgLB&um{;{N!HkFI18Lzen$T65rx`{(n~c zBll>%YrDQjQ10_K!A^~jljV1b_wYUc|E&EQ_D3F3yld_W3xhSX=RU=|5)b3E=c@Kc z9@Y4=K)xh%)vQ4-jW7QkJ{9OZeEI)7>$i{gci10^)%&4;X@7_PkrsMC6#YK?$7sJv z-&eBhN8~X@N^cFGRe8Q9JWcUMKKqMkKWm}tOZ!W>RSSJjvHvm)_PKKnOme=SDs zXQtwxZ)$&Sl-f@L#Xl22=4(H9U7iuJKT=iid*0P{M!@`Ks^Y6>$R1z+dQ1C{%wHNQ ze!I8!A9JaHZ5wwXAYRMY-^(k$i22K8#fM+ee&~bh@9h;I-bL{dS4fH9^1H%H z{FdJpQR27!uBcKmrQ%8@lu9a5Pjg9c~%9RztL=yH-oIwi4IsDAiTsn#QcCI3=#3D_)6f=tK{Cp$yDm^rMq&P~$K> z7&&Nthslq8k%cyJ7#@r)w4uZB;QEf<=P?qZfL= z!`wgRfNp40hvC8KhCbjhJQ&^32OWk7qZ|5=!|-78gEn)RvZl<*6Z){j@L=+UHg^~v zOrFq39EJyzC-hN=;lbnyZQ(FH7(1XX9i|P?uCN8#%3*jgwm=_q7#@r*(AEyagRuqL z#$k9cwm{oD3=hT@Xgi1D!Po~a=kVjA?UgzxbyP}F;#w!A&PrT+LaB=q*SacoQ+h(F zyHXD&uF;ozDshe9qX)gvUJj!Rom_+Vb{HOv9JG(a7di=!QP!FgzID&_NEvgV7Bg>@YkS z-OwQp!-L5WI@DpxnldL(=rD)j!Q=@Y?l3%j4jaT9EJyD3v`Ub@L+6#j&&FwjD6619e!SP zoYHuu2}%={xb}k5i%ML3N$F)Ju1!*!ti-ifl%^A3)C)c3U z9EJxY2c7OP`H?TO&>0THgOP>4<}f^%-$Q3QjIG#=4(Ke0;lb#D&UP3cj1K4=hvC8K zg}&}E_fI*X8~TRB@L+U9-*gxrjBe;$hvC8KhR$;s9!!4F`3_UolsS1q7dQ+LCQs-> zhvC8G30>qcJeWM8iyejslP7eE!|-72fG%~IHc&JQz9XPKU{le36AFISda*78*JX59aq! z>oB%rGdiH}ISda*2XvRi@L+U6cRLIZMlW=a!`wgRfNtnshvC8RIl9kbcrd!5?>h_+ zMmKc7!|-78gC200vZl<*6Z(O}@L=+We&{efm^`5e9fk*!C-jiR@L=+U9(EWWj2+M; z4wn`!rGzcej~s>vV+-`C!|-5ifgW=h9*ix}j~#{wV+-^XhvC840{zrscrf-si#hz6 z=y9dbl};#~RN~qxr7x7Y_NCHSN?iL|=^G`komTo*iEAa4&M2K$;`iu5FZ8U#=t3vg zpywQh2O|gl&SCN+Uu2=@9fk)Z3%%elJec1@FFK5^*o+S7_YT8@(E+{WFgzF?&>tLz z2csAIqr==k<$!MJWryLx=!X8}FgzID(4QTK2csMMi^K3>@`GM+__QcxPM*+T9fk*! zC-gUm;lbnyz3MPLm^`7sI}8sdPv|v=;lbDez3wn=ptusYK>u(U9*ix}8xF&Ru?704 z!|-5if&S$%JQ!P`HywrtV+-_ehvC842d(JvKcbZ!e@m1JJlE2Qrd8rvI?-q)uBBJX zpv1L|N|}_nR#bBT5#<`cM-O_Ttwg}+LMPXtcR36XMh^OzD46`n7g=a#hvC7FfQ7~mqnUg0pm&5R2@`UDg7#>WX&^!*qgUJ&b<1jp!JfV3V zh6iH@w4Erps8RtXY=Pzz1(U$o0?qF*JQ!P`1ssM4V+*vP!|-5iffjNY9*ix}!VbfO zu@72K6kJ5OyeNE8;bKZ$E3Q;RiEAa5N-1%zw9>swTq~ngR*7px(BZD}d-R|eI!Y9b zE_8AYTHfJ^tZ+n5bhKo_M%SQ-Oy?d!-LTct?n>97~RlVhvC8G2OT2{ru->$ z@`ToK7#>WX(3%dzgUJ(G%VBshc|vPD3=bwxXdQ>)!Po&ED+;C!~6EFgzGrpz#jFgRun~I1CTQ7N~I;9z0gIK<^a=*B34$3g1Aup%T~bQ);Bd zwZ=+Kl(=@kQd1?aJ)rcU64wgr_Yb*i{2o2%g)S2XqYIr}gEn&*9*i7xxhRZ8Q9zDkKoTq~sC z_jA|yJ$ld!{YVsyE_8AY+TUS#FmlkNqG0kPUu2;J9EJxY3w_dIcrd?*GXDW%D>kD8 zI?!QwFgl=5ISda*2Xv6b@L=>pKNbaZ|C9r|p@SWU2csK0#9??ax}ifIh6ke?I?Q2s zF!@105d~BJlsS1qhdT@pCQs-HhvC8G34PjOcrbZFM>-4-CQs-y4#R`71Nx~bm^N^a z61G4`iGoRBY=Mq;7#@r*&}SWn2V)ELIfvoF*a98nFgzGrpkp0|2V)0THgV76R z9tGz9DF<{zUvn59jBe;mhvC8KhR$*r9*l12Y=_~&O*Z4hp&m7y%lOME>`1&1-i{)crdm=w>u0E#un%fhvC840^R8_JQ!P`Ne;twly)g`t*+8;C9W}N+2gM9d-R|e+Q4CSp_6OS zy$-{Jk%QjnF!_-$ve11F!-J89zV9$RnBPMiJB+Q^j1K62hvC8KfF5ud9*hp?2M)u7 z(F?ubVeX%DKsWS5hvC8Kh8}bn9*l12A&23?=!PD47#>W1&<7l*{3&ztgdTAi9!#Fl zj~s>vlPC13!|-78gdTGk9!#Flj~#{wV+WMycra}s#KXn)$j4ja5 z9EJyD3-q|d@L+6#e(o?l7+atx9EJyDA2g>Z_zB^YN<80p7CoiJwN6T3C~+-8=}RT9 zbyWIFiEAB{zETNj4pI?4f?Ia@L=SiXB;L!@6Q}LMkz(5O}@sQC5O@L+U6i#rStMlUqI zD46@F9MBCd;V?WH-O!Q_!-LTcE#)vg7~Rm)4#R`V51LUFOj%Rr!$RN`7KrP@kdtD{s` ziEH(g;*_|SRlkpS*Z4hp&ScNiYb z@1fg8!Ptt;=zunG7#@rcXhVnL!RUbA=P*1Nz0e(^VD6uCKsU6J!|-5qLmN8`4@Nh% ziNo+W1(4C@S%AYbPPiRwz;lbnyeZXOOFnK~BbQm5?p3sLJh6j@;w3);3 zVC;YW1Q08f1%AYbP zPiP;9;lbny?dvc+m^`704#R`V6WY&VcrbZF`#TH|#t!HSQ7~=bF4qpA1N1lSB7w05 z`lQ3~U~GX7bQm6tEzqYNh6iH{bdbaFU~GX7b{HOveNg7G;32}yH{gc~4^!gWaHSDS zTzgt+q!QPjQ5vPhwb4q?Dse57e*c`i#_!RCUMTYxFuKsmHRu?J;lap3na_a9k9?7Z zj&&Fwj4bqdhvC8e9?JX&jIG#=4(K?C;lb#Dj&~Ryj1K4ohvC8Kh5jK5=Kd)MbVDaP z3=c*(^aY3E!RUs*=rBAO-O!gDh6j@$lzAGM@~6zn6Z*2l@L=+UPI4F?OrFrm4#R`V z6Z(q7@L=+UPH`9>j2%$shhW-3M%NCYQ}s9OB7w05`l`e5U~GX-a~K|sEzs!>!-KH} zI>TXjFt$Kna~K|seNg7G;Httim3X$PB05WnYn7E|D{-xo(i|nORaAOiiE9;<-caHi z&u?$KYy2KP=!MR87+vV(8g!n+@L=Si^BpEX@&19!#Fl)eggh$rHN9VR$fkLf>^59*iB(wGPt;qFp>`1&1^TJO@L+6#e&#Sd7+avn b9fk*E3-oh`;lbDfJ>f7s82g~C+kpQc_#>{o literal 0 HcmV?d00001 diff --git a/player.c b/player.c index 5bd4332..b1788c6 100644 --- a/player.c +++ b/player.c @@ -142,9 +142,6 @@ static void player__pass_gate( u32 id ){ m4x3_mulv( gate->transport, localplayer.cam.pos, localplayer.cam.pos ); - if( gate->flags & k_ent_gate_nonlocal ) - world_set_active_instance( gate->target ); - audio_lock(); audio_oneshot( &audio_gate_pass, 1.0f, 0.0f ); audio_unlock(); @@ -219,18 +216,22 @@ static void player__im_gui(void){ skaterift_replay_debug_info(); } - static void player__setpos( v3f pos ){ v3_copy( pos, localplayer.rb.co ); v3_zero( localplayer.rb.v ); rb_update_transform( &localplayer.rb ); } -static void player__spawn( ent_spawn *rp ){ +static void player__reset(void){ replay_clear( &skaterift.replay ); - player__setpos( rp->transform.co ); + + v3_zero( localplayer.rb.v ); v3_zero( localplayer.rb.w ); - q_identity( localplayer.rb.q ); + + f32 l = v4_length( localplayer.rb.q ); + if( (l < 0.9f) || (l > 1.1f) ) + q_identity( localplayer.rb.q ); + rb_update_transform( &localplayer.rb ); q_identity( localplayer.qbasis ); @@ -238,17 +239,19 @@ static void player__spawn( ent_spawn *rp ){ m3x3_identity( localplayer.invbasis ); localplayer.subsystem = k_player_subsystem_walk; + player__walk_reset(); + localplayer.immobile = 0; localplayer.gate_waiting = NULL; - world_static.last_use = 0.0; - world_static.focused_entity = 0; + localplayer.viewable_world = world_current_instance(); + world_static.challenge_target = NULL; world_static.challenge_timer = 0.0f; + world_static.focused_entity = 0; + world_static.active_trigger_volume_count = 0; + world_static.last_use = 0.0; world_entity_unfocus(); - if( player_subsystems[ localplayer.subsystem ]->reset ) - player_subsystems[ localplayer.subsystem ]->reset( rp ); - localplayer.boundary_hash ^= NETMSG_BOUNDARY_BIT; for( u32 i=0; itransform.co ); + player__reset(); +} + static void player__kill(void){ } diff --git a/player.h b/player.h index 9757030..2b7519a 100644 --- a/player.h +++ b/player.h @@ -36,7 +36,6 @@ struct player_cam_controller { struct player_subsystem_interface{ void(*system_register)(void); void(*bind)(void); - void(*reset)( ent_spawn *rp ); void(*pre_update)(void); void(*update)(void); void(*post_update)(void); @@ -191,6 +190,7 @@ static void player__pass_gate( u32 id ); static void player__im_gui(void); static void player__setpos( v3f pos ); static void player__spawn( ent_spawn *rp ); +static void player__reset(void); static void player__kill(void); static void player__begin_holdout( v3f offset ); diff --git a/player_drive.c b/player_drive.c index 0d97e3b..38b7e58 100644 --- a/player_drive.c +++ b/player_drive.c @@ -65,7 +65,4 @@ static void player__drive_bind(void){ player_drive.anim_drive = skeleton_get_anim( sk, "idle_cycle+y" ); } -static void player__drive_reset( ent_spawn *rp ){ -} - #endif /* PLAYER_DRIVE_C */ diff --git a/player_drive.h b/player_drive.h index 46eedba..0dd135c 100644 --- a/player_drive.h +++ b/player_drive.h @@ -19,7 +19,6 @@ static void player__drive_pose( void *animator, player_pose *pose ); static void player__drive_post_animate(void); static void player__drive_im_gui(void); static void player__drive_bind(void); -static void player__drive_reset( ent_spawn *rp ); struct player_subsystem_interface static player_subsystem_drive = { .pre_update = player__drive_pre_update, @@ -30,7 +29,6 @@ struct player_subsystem_interface static player_subsystem_drive = { .post_animate = player__drive_post_animate, .im_gui = player__drive_im_gui, .bind = player__drive_bind, - .reset = player__drive_reset, .animator_data = NULL, .animator_size = 0, diff --git a/player_skate.c b/player_skate.c index 745a6ff..7466828 100644 --- a/player_skate.c +++ b/player_skate.c @@ -495,10 +495,6 @@ static void player__approximate_best_trajectory(void){ m3x3_mulv( gate->transport, launch_v, launch_v); m4x3_mulv( gate->transport, launch_co, launch_co ); m3x3_mul( gate->transport, basis, basis ); - - if( gate->flags & k_ent_gate_nonlocal ){ - trace_world = &world_static.instances[ gate->target ]; - } } } @@ -3182,21 +3178,6 @@ static void player__skate_clear_mechanics(void){ v3_zero( player_skate.weight_distribution ); } -static void player__skate_reset( ent_spawn *rp ){ - struct player_skate_state *state = &player_skate.state; - v3_zero( localplayer.rb.v ); - v4_copy( rp->transform.q, localplayer.rb.q ); - - state->activity = k_skate_activity_air; - state->activity_prev = k_skate_activity_air; - - player__skate_clear_mechanics(); - player__skate_reset_animator(); - - v3_zero( state->head_position ); - state->head_position[1] = 1.8f; -} - #include "network_compression.h" static void player__skate_animator_exchange( bitpack_ctx *ctx, void *data ){ diff --git a/player_skate.h b/player_skate.h index 0f5c70c..ba2cfce 100644 --- a/player_skate.h +++ b/player_skate.h @@ -294,7 +294,6 @@ static void player__skate_im_gui (void); static void player__skate_animate (void); static void player__skate_pose (void *animator, player_pose *pose); static void player__skate_post_animate (void); -static void player__skate_reset (ent_spawn *rp); static void player__skate_animator_exchange( bitpack_ctx *ctx, void *data ); static void player__skate_sfx_oneshot ( u8 id, v3f pos, f32 volume ); @@ -305,7 +304,6 @@ static void player__approximate_best_trajectory(void); struct player_subsystem_interface static player_subsystem_skate = { .system_register = player__skate_register, .bind = player__skate_bind, - .reset = player__skate_reset, .pre_update = player__skate_pre_update, .update = player__skate_update, .post_update = player__skate_post_update, diff --git a/player_walk.c b/player_walk.c index 100e21f..ebd9dad 100644 --- a/player_walk.c +++ b/player_walk.c @@ -302,7 +302,7 @@ static void player__walk_pre_update(void){ } } else if( button_down( k_srbind_use ) && !localplayer.immobile ){ - if( v3_dist2( localplayer.rb.co, gzoomer.obj.rb.co ) <= 4.0f*4.0f ){ + if( 0 && (v3_dist2(localplayer.rb.co,gzoomer.obj.rb.co) <= 4.0f*4.0f) ){ localplayer.subsystem = k_player_subsystem_drive; } else{ @@ -1063,7 +1063,7 @@ static void player__walk_transition(void){ rb_update_transform( &localplayer.rb ); } -static void player__walk_reset( ent_spawn *rp ){ +static void player__walk_reset(void){ struct player_walk *w = &player_walk; w->state.activity = k_walk_activity_air; w->state.outro_type = k_walk_outro_none; diff --git a/player_walk.h b/player_walk.h index a8dd9fa..7d3c0eb 100644 --- a/player_walk.h +++ b/player_walk.h @@ -105,14 +105,13 @@ static void player__walk_post_animate(void); static void player__walk_im_gui (void); static void player__walk_bind (void); static void player__walk_transition (void); -static void player__walk_reset (ent_spawn *rp ); +static void player__walk_reset (void); static void player__walk_restore (void); static void player__walk_animator_exchange( bitpack_ctx *ctx, void *data ); struct player_subsystem_interface static player_subsystem_walk = { .system_register = player__walk_register, .bind = player__walk_bind, - .reset = player__walk_reset, .pre_update = player__walk_pre_update, .update = player__walk_update, .post_update = player__walk_post_update, diff --git a/pointcloud.h b/pointcloud.h index 427548c..89621a4 100644 --- a/pointcloud.h +++ b/pointcloud.h @@ -1,4 +1,5 @@ -#ifndef POINTCLOUD_H +#if 0 +//#ifndef POINTCLOUD_H #define POINTCLOUD_H #include "common.h" @@ -111,8 +112,7 @@ static int pointcloud_idle(void){ else return 0; } -static -void pointcloud_render( world_instance *world, camera *cam, m4x3f model ){ +static void pointcloud_render( camera *cam, m4x3f model ){ if( pointcloud.anim < k_pointcloud_anim_idle_any ){ f32 const k_transition = 0.6f; f32 t = (vg.time - pointcloud.anim_start) / k_transition; @@ -160,4 +160,13 @@ static void pointcloud_packvert( pointcloud_vert *vert, v3f pos, v4f colour ){ vert->colour[i] = colour[i] * 255.0f; } +static void pointcloud_async_end(void *_, u32 __){ + pointcloud_animate( k_pointcloud_anim_opening ); +} + +static void pointcloud_clear_async(void *_, u32 __){ + pointcloud.count = 0; + pointcloud_animate( k_pointcloud_anim_opening ); +} + #endif /* POINTCLOUD_H */ diff --git a/respawn.c b/respawn.c index b7594db..df1c66b 100644 --- a/respawn.c +++ b/respawn.c @@ -208,13 +208,6 @@ static void respawn_chooser_pre_update(void){ } } - for( u32 i=0; ient_gate); i++ ){ - ent_gate *gate = mdl_arritm( &world->ent_gate, i ); - if( gate->flags & k_ent_gate_nonlocal ){ - respawn_map_draw_icon( cam, k_gui_icon_rift, gate->co[0] ); - } - } - for( u32 i=0; ient_route); i++ ){ ent_route *route = mdl_arritm( &world->ent_route, i ); diff --git a/shaders/cloud.vs b/shaders/cloud.vs index 66a2bdf..580dc20 100644 --- a/shaders/cloud.vs +++ b/shaders/cloud.vs @@ -46,7 +46,7 @@ void main() vs_motion_out( vproj0, vproj1 ); gl_Position = vproj0; - gl_PointSize = (9.0*scaler) / (gl_Position.z + 0.01); + gl_PointSize = (9.0*scaler) / (max( gl_Position.z, 2.0 )); aWorldCo = world_pos0; aColour = a_colour*scaler*(1.0-uAnim.y*uAnim.y); aCo = co; diff --git a/shaders/common_world.glsl b/shaders/common_world.glsl index cb68f35..b734743 100644 --- a/shaders/common_world.glsl +++ b/shaders/common_world.glsl @@ -54,19 +54,15 @@ float world_water_depth( vec3 pos ) return world_depth_sample( pos ) - ref_depth; } -float shadow_sample( vec3 vdir ) -{ - vec3 sample_pos = aWorldCo + vdir; - float height_sample = world_depth_sample( sample_pos ); +float shadow_sample( vec3 co ){ + float height_sample = world_depth_sample( co ); - float fdelta = height_sample - sample_pos.y; + float fdelta = height_sample - co.y; return clamp( fdelta, 0.2, 0.4 )-0.2; } -float newlight_compute_sun_shadow( vec3 dir ) -{ - if( g_shadow_samples == 0 ) - { +float newlight_compute_sun_shadow( vec3 co, vec3 dir ){ + if( g_shadow_samples == 0 ){ return 1.0; } @@ -74,15 +70,15 @@ float newlight_compute_sun_shadow( vec3 dir ) float flength = g_shadow_length; float famt = 0.0; - famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1); - famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2); - famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3); - famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4); + famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1); + famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2); + famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3); + famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4); - //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5); - //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6); - //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7); - //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8); + //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5); + //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6); + //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7); + //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8); return 1.0 - famt; } @@ -170,8 +166,8 @@ vec3 world_compute_lighting( vec3 diffuse, vec3 normal, vec3 co, float fdist = length(halfview); halfview /= fdist; - float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz - * (1.0/(max(g_sun_dir.y,0.0)+0.2)) ); + float world_shadow = newlight_compute_sun_shadow( + co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) ); vec3 total_light = clearskies_lighting( normal, min( light_mask, world_shadow ), halfview ); diff --git a/shaders/model_board_view.h b/shaders/model_board_view.h index 3a1ba9c..3f08cf0 100644 --- a/shaders/model_board_view.h +++ b/shaders/model_board_view.h @@ -210,19 +210,15 @@ static struct vg_shader _shader_model_board_view = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -230,15 +226,15 @@ static struct vg_shader _shader_model_board_view = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -326,8 +322,8 @@ static struct vg_shader _shader_model_board_view = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/model_character_view.h b/shaders/model_character_view.h index 060e5b2..bbfee78 100644 --- a/shaders/model_character_view.h +++ b/shaders/model_character_view.h @@ -218,19 +218,15 @@ static struct vg_shader _shader_model_character_view = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -238,15 +234,15 @@ static struct vg_shader _shader_model_character_view = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -334,8 +330,8 @@ static struct vg_shader _shader_model_character_view = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/model_entity.h b/shaders/model_entity.h index 712efc9..581cbff 100644 --- a/shaders/model_entity.h +++ b/shaders/model_entity.h @@ -210,19 +210,15 @@ static struct vg_shader _shader_model_entity = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -230,15 +226,15 @@ static struct vg_shader _shader_model_entity = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -326,8 +322,8 @@ static struct vg_shader _shader_model_entity = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/model_sky.h b/shaders/model_sky.h index abe4de7..9d2131e 100644 --- a/shaders/model_sky.h +++ b/shaders/model_sky.h @@ -212,19 +212,15 @@ static struct vg_shader _shader_model_sky = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -232,15 +228,15 @@ static struct vg_shader _shader_model_sky = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -328,8 +324,8 @@ static struct vg_shader _shader_model_sky = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/point_map.h b/shaders/point_map.h index 5c674cd..006c98f 100644 --- a/shaders/point_map.h +++ b/shaders/point_map.h @@ -75,7 +75,7 @@ static struct vg_shader _shader_point_map = { " vs_motion_out( vproj0, vproj1 );\n" "\n" " gl_Position = vproj0;\n" -" gl_PointSize = (9.0*scaler) / (gl_Position.z + 0.01);\n" +" gl_PointSize = (9.0*scaler) / (max( gl_Position.z, 2.0 ));\n" " aWorldCo = world_pos0;\n" " aColour = a_colour*scaler*(1.0-uAnim.y*uAnim.y);\n" " aCo = co;\n" diff --git a/shaders/scene_cubemapped.h b/shaders/scene_cubemapped.h index 78a8e7d..1d59884 100644 --- a/shaders/scene_cubemapped.h +++ b/shaders/scene_cubemapped.h @@ -212,19 +212,15 @@ static struct vg_shader _shader_scene_cubemapped = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -232,15 +228,15 @@ static struct vg_shader _shader_scene_cubemapped = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -328,8 +324,8 @@ static struct vg_shader _shader_scene_cubemapped = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_depth.h b/shaders/scene_depth.h index 42613c0..efe52b8 100644 --- a/shaders/scene_depth.h +++ b/shaders/scene_depth.h @@ -211,19 +211,15 @@ static struct vg_shader _shader_scene_depth = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -231,15 +227,15 @@ static struct vg_shader _shader_scene_depth = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -327,8 +323,8 @@ static struct vg_shader _shader_scene_depth = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_font.h b/shaders/scene_font.h index eec4b6c..f0a9829 100644 --- a/shaders/scene_font.h +++ b/shaders/scene_font.h @@ -214,19 +214,15 @@ static struct vg_shader _shader_scene_font = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -234,15 +230,15 @@ static struct vg_shader _shader_scene_font = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -330,8 +326,8 @@ static struct vg_shader _shader_scene_font = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_fxglow.h b/shaders/scene_fxglow.h index a86f520..b54f58f 100644 --- a/shaders/scene_fxglow.h +++ b/shaders/scene_fxglow.h @@ -209,19 +209,15 @@ static struct vg_shader _shader_scene_fxglow = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -229,15 +225,15 @@ static struct vg_shader _shader_scene_fxglow = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -325,8 +321,8 @@ static struct vg_shader _shader_scene_fxglow = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_override.fs b/shaders/scene_override.fs index 45ac33e..6d10a40 100644 --- a/shaders/scene_override.fs +++ b/shaders/scene_override.fs @@ -26,14 +26,17 @@ void main(){ vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) ); float dither = fract( vDither.g / 71.0 ) - 0.5; - if( (aWorldCo.y*0.1 + dither) > ((uPlayerPos.y+40.0)*0.1) ) - discard; + float dcam = (-8.0+distance( aCo, uCamera ))/4.0; + if( min(aCo.y*0.5 + dither, dcam + dither) < 0.51 ) discard; compute_motion_vectors(); - vec3 vfrag = vec3(0.5,0.5,0.5); + vec3 vfrag = vec3(0.6); vec3 qnorm = aNorm.xyz; + qnorm = normalize(floor(aNorm.xyz*4.0)*0.25); + qnorm += vec3(0.001,0.0,0.0); + if( uAlphatest ){ vec4 vSample = texture( uTexMain, aUv ); if( vSample.a < 0.5 ) @@ -45,7 +48,7 @@ void main(){ } } - vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo ); + vfrag = scene_compute_lighting( vfrag, qnorm, aCo ); // dots float d0 = distance( aWorldCo, uPlayerPos.xyz )*2.0; @@ -65,4 +68,5 @@ void main(){ emit += vec3(fract(t*0.2-g_realtime+d3*0.2)*max(0.0,1.0-d3*0.2)); oColour = vec4( vfrag+emit, 1.0 ); + oColour = vec4( vfrag, 1.0 ); } diff --git a/shaders/scene_override.h b/shaders/scene_override.h index 3f59770..8bea02e 100644 --- a/shaders/scene_override.h +++ b/shaders/scene_override.h @@ -7,7 +7,7 @@ static struct vg_shader _shader_scene_override = { .link = shader_scene_override_link, .vs = { -.orig_file = "shaders/scene.vs", +.orig_file = "shaders/scene_override.vs", .static_src = "layout (location=0) in vec3 a_co;\n" "layout (location=1) in vec4 a_norm;\n" @@ -36,6 +36,7 @@ static struct vg_shader _shader_scene_override = { "uniform mat4x3 uMdl;\n" "uniform mat4 uPv;\n" "uniform mat4 uPvmPrev;\n" +"uniform mat3 uNormalMtx;\n" "\n" "out vec2 aUv;\n" "out vec4 aNorm;\n" @@ -53,7 +54,7 @@ static struct vg_shader _shader_scene_override = { " gl_Position = vproj0;\n" "\n" " aUv = a_uv;\n" -" aNorm = vec4( mat3(uMdl) * a_norm.xyz, a_norm.w );\n" +" aNorm = vec4( a_norm.xyz, a_norm.w );\n" " aCo = a_co;\n" " aWorldCo = world_pos0;\n" "}\n" @@ -214,19 +215,15 @@ static struct vg_shader _shader_scene_override = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -234,15 +231,15 @@ static struct vg_shader _shader_scene_override = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -330,8 +327,8 @@ static struct vg_shader _shader_scene_override = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" @@ -446,14 +443,17 @@ static struct vg_shader _shader_scene_override = { " vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n" " float dither = fract( vDither.g / 71.0 ) - 0.5;\n" "\n" -" if( (aWorldCo.y*0.1 + dither) > ((uPlayerPos.y+40.0)*0.1) )\n" -" discard;\n" +" float dcam = (-8.0+distance( aCo, uCamera ))/4.0;\n" +" if( min(aCo.y*0.5 + dither, dcam + dither) < 0.51 ) discard;\n" "\n" " compute_motion_vectors();\n" "\n" -" vec3 vfrag = vec3(0.5,0.5,0.5);\n" +" vec3 vfrag = vec3(0.6);\n" " vec3 qnorm = aNorm.xyz;\n" "\n" +" qnorm = normalize(floor(aNorm.xyz*4.0)*0.25);\n" +" qnorm += vec3(0.001,0.0,0.0);\n" +"\n" " if( uAlphatest ){\n" " vec4 vSample = texture( uTexMain, aUv );\n" " if( vSample.a < 0.5 )\n" @@ -465,7 +465,7 @@ static struct vg_shader _shader_scene_override = { " }\n" " }\n" "\n" -" vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n" +" vfrag = scene_compute_lighting( vfrag, qnorm, aCo );\n" " \n" " // dots\n" " float d0 = distance( aWorldCo, uPlayerPos.xyz )*2.0;\n" @@ -485,6 +485,7 @@ static struct vg_shader _shader_scene_override = { " emit += vec3(fract(t*0.2-g_realtime+d3*0.2)*max(0.0,1.0-d3*0.2));\n" "\n" " oColour = vec4( vfrag+emit, 1.0 );\n" +" oColour = vec4( vfrag, 1.0 );\n" "}\n" ""}, }; @@ -492,6 +493,7 @@ static struct vg_shader _shader_scene_override = { static GLuint _uniform_scene_override_uMdl; static GLuint _uniform_scene_override_uPv; static GLuint _uniform_scene_override_uPvmPrev; +static GLuint _uniform_scene_override_uNormalMtx; static GLuint _uniform_scene_override_uTexGarbage; static GLuint _uniform_scene_override_uTexMain; static GLuint _uniform_scene_override_uCamera; @@ -511,6 +513,9 @@ static void shader_scene_override_uPv(m4x4f m){ static void shader_scene_override_uPvmPrev(m4x4f m){ glUniformMatrix4fv(_uniform_scene_override_uPvmPrev,1,GL_FALSE,(float*)m); } +static void shader_scene_override_uNormalMtx(m3x3f m){ + glUniformMatrix3fv(_uniform_scene_override_uNormalMtx,1,GL_FALSE,(float*)m); +} static void shader_scene_override_uTexGarbage(int i){ glUniform1i(_uniform_scene_override_uTexGarbage,i); } @@ -543,6 +548,7 @@ static void shader_scene_override_link(void){ _uniform_scene_override_uMdl = glGetUniformLocation( _shader_scene_override.id, "uMdl" ); _uniform_scene_override_uPv = glGetUniformLocation( _shader_scene_override.id, "uPv" ); _uniform_scene_override_uPvmPrev = glGetUniformLocation( _shader_scene_override.id, "uPvmPrev" ); + _uniform_scene_override_uNormalMtx = glGetUniformLocation( _shader_scene_override.id, "uNormalMtx" ); _uniform_scene_override_uTexGarbage = glGetUniformLocation( _shader_scene_override.id, "uTexGarbage" ); _uniform_scene_override_uTexMain = glGetUniformLocation( _shader_scene_override.id, "uTexMain" ); _uniform_scene_override_uCamera = glGetUniformLocation( _shader_scene_override.id, "uCamera" ); diff --git a/shaders/scene_override.vs b/shaders/scene_override.vs new file mode 100644 index 0000000..88fa7dd --- /dev/null +++ b/shaders/scene_override.vs @@ -0,0 +1,31 @@ +layout (location=0) in vec3 a_co; +layout (location=1) in vec4 a_norm; +layout (location=2) in vec2 a_uv; + +#include "motion_vectors_vs.glsl" + +uniform mat4x3 uMdl; +uniform mat4 uPv; +uniform mat4 uPvmPrev; +uniform mat3 uNormalMtx; + +out vec2 aUv; +out vec4 aNorm; +out vec3 aCo; +out vec3 aWorldCo; + +void main() +{ + vec3 world_pos0 = uMdl * vec4( a_co, 1.0 ); + vec4 vproj0 = uPv * vec4( world_pos0, 1.0 ); + vec4 vproj1 = uPvmPrev * vec4( a_co, 1.0 ); + + vs_motion_out( vproj0, vproj1 ); + + gl_Position = vproj0; + + aUv = a_uv; + aNorm = vec4( a_norm.xyz, a_norm.w ); + aCo = a_co; + aWorldCo = world_pos0; +} diff --git a/shaders/scene_position.h b/shaders/scene_position.h index 3fe8c7e..985d34c 100644 --- a/shaders/scene_position.h +++ b/shaders/scene_position.h @@ -211,19 +211,15 @@ static struct vg_shader _shader_scene_position = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -231,15 +227,15 @@ static struct vg_shader _shader_scene_position = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -327,8 +323,8 @@ static struct vg_shader _shader_scene_position = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_route.h b/shaders/scene_route.h index b37cf62..bfa31df 100644 --- a/shaders/scene_route.h +++ b/shaders/scene_route.h @@ -210,19 +210,15 @@ static struct vg_shader _shader_scene_route = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -230,15 +226,15 @@ static struct vg_shader _shader_scene_route = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -326,8 +322,8 @@ static struct vg_shader _shader_scene_route = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_scoretext.h b/shaders/scene_scoretext.h index 75e4ca8..1d82be3 100644 --- a/shaders/scene_scoretext.h +++ b/shaders/scene_scoretext.h @@ -230,19 +230,15 @@ static struct vg_shader _shader_scene_scoretext = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -250,15 +246,15 @@ static struct vg_shader _shader_scene_scoretext = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -346,8 +342,8 @@ static struct vg_shader _shader_scene_scoretext = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_standard.h b/shaders/scene_standard.h index d28f7d1..ae03331 100644 --- a/shaders/scene_standard.h +++ b/shaders/scene_standard.h @@ -210,19 +210,15 @@ static struct vg_shader _shader_scene_standard = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -230,15 +226,15 @@ static struct vg_shader _shader_scene_standard = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -326,8 +322,8 @@ static struct vg_shader _shader_scene_standard = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_standard_alphatest.h b/shaders/scene_standard_alphatest.h index 19a42cf..594fb86 100644 --- a/shaders/scene_standard_alphatest.h +++ b/shaders/scene_standard_alphatest.h @@ -210,19 +210,15 @@ static struct vg_shader _shader_scene_standard_alphatest = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -230,15 +226,15 @@ static struct vg_shader _shader_scene_standard_alphatest = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -326,8 +322,8 @@ static struct vg_shader _shader_scene_standard_alphatest = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_terrain.h b/shaders/scene_terrain.h index e37e624..6d40ebd 100644 --- a/shaders/scene_terrain.h +++ b/shaders/scene_terrain.h @@ -211,19 +211,15 @@ static struct vg_shader _shader_scene_terrain = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -231,15 +227,15 @@ static struct vg_shader _shader_scene_terrain = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -327,8 +323,8 @@ static struct vg_shader _shader_scene_terrain = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_vertex_blend.h b/shaders/scene_vertex_blend.h index 2302cc7..aba9d8b 100644 --- a/shaders/scene_vertex_blend.h +++ b/shaders/scene_vertex_blend.h @@ -209,19 +209,15 @@ static struct vg_shader _shader_scene_vertex_blend = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -229,15 +225,15 @@ static struct vg_shader _shader_scene_vertex_blend = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -325,8 +321,8 @@ static struct vg_shader _shader_scene_vertex_blend = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_water.h b/shaders/scene_water.h index 588477e..669f96d 100644 --- a/shaders/scene_water.h +++ b/shaders/scene_water.h @@ -219,19 +219,15 @@ static struct vg_shader _shader_scene_water = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -239,15 +235,15 @@ static struct vg_shader _shader_scene_water = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -335,8 +331,8 @@ static struct vg_shader _shader_scene_water = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/shaders/scene_water_fast.h b/shaders/scene_water_fast.h index 318a37a..1be0926 100644 --- a/shaders/scene_water_fast.h +++ b/shaders/scene_water_fast.h @@ -216,19 +216,15 @@ static struct vg_shader _shader_scene_water_fast = { " return world_depth_sample( pos ) - ref_depth;\n" "}\n" "\n" -"float shadow_sample( vec3 vdir )\n" -"{\n" -" vec3 sample_pos = aWorldCo + vdir;\n" -" float height_sample = world_depth_sample( sample_pos );\n" +"float shadow_sample( vec3 co ){\n" +" float height_sample = world_depth_sample( co );\n" "\n" -" float fdelta = height_sample - sample_pos.y;\n" +" float fdelta = height_sample - co.y;\n" " return clamp( fdelta, 0.2, 0.4 )-0.2;\n" "}\n" "\n" -"float newlight_compute_sun_shadow( vec3 dir )\n" -"{\n" -" if( g_shadow_samples == 0 )\n" -" {\n" +"float newlight_compute_sun_shadow( vec3 co, vec3 dir ){\n" +" if( g_shadow_samples == 0 ){\n" " return 1.0;\n" " }\n" "\n" @@ -236,15 +232,15 @@ static struct vg_shader _shader_scene_water_fast = { " float flength = g_shadow_length;\n" "\n" " float famt = 0.0;\n" -" famt += shadow_sample((dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" -" famt += shadow_sample((dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" -" famt += shadow_sample((dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" -" famt += shadow_sample((dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" +" famt += shadow_sample(co+(dir+vec3(-0.56,0.55, 0.30)*fspread)*flength*0.1);\n" +" famt += shadow_sample(co+(dir+vec3( 0.80,0.68, 0.34)*fspread)*flength*0.2);\n" +" famt += shadow_sample(co+(dir+vec3( 0.78,0.07,-0.06)*fspread)*flength*0.3);\n" +" famt += shadow_sample(co+(dir+vec3(-0.59,0.07,-0.42)*fspread)*flength*0.4);\n" "\n" -" //famt+=shadow_sample((dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" -" //famt+=shadow_sample((dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" -" //famt+=shadow_sample((dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" -" //famt+=shadow_sample((dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" +" //famt+=shadow_sample(co+(dir+vec3(-0.790,-0.933,-0.875)*fspread)*flength*0.5);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.807,-0.690, 0.472)*fspread)*flength*0.6);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.522,-0.379, 0.350)*fspread)*flength*0.7);\n" +" //famt+=shadow_sample(co+(dir+vec3( 0.483, 0.201, 0.306)*fspread)*flength*0.8);\n" "\n" " return 1.0 - famt;\n" "}\n" @@ -332,8 +328,8 @@ static struct vg_shader _shader_scene_water_fast = { " float fdist = length(halfview);\n" " halfview /= fdist;\n" "\n" -" float world_shadow = newlight_compute_sun_shadow( g_sun_dir.xyz \n" -" * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" +" float world_shadow = newlight_compute_sun_shadow( \n" +" co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) );\n" "\n" " vec3 total_light = clearskies_lighting( \n" " normal, min( light_mask, world_shadow ), halfview );\n" diff --git a/skaterift.c b/skaterift.c index 49fdc88..8ed749c 100644 --- a/skaterift.c +++ b/skaterift.c @@ -37,7 +37,6 @@ #include "network.h" #include "menu.h" #include "vehicle.h" -#include "pointcloud.h" #include "save.h" #include "player_remote.h" @@ -109,8 +108,7 @@ static void load_playermodels(void){ } static void async_skaterift_player_start( void *payload, u32 size ){ - localplayer.viewable_world = world_current_instance(); - localplayer_cmd_respawn( 1, (const char *[]){ "start" } ); + world_switch_instance(0); } static void async_call_ready( void *payload, u32 size ){ @@ -153,6 +151,8 @@ static void skaterift_restore_state(void){ addon_cache_create_viewer( k_addon_type_player, player_reg_id ); kvsav.cur = orig; + +#if 0 if( vg_msg_seekframe( &kvsav, "world" ) ){ addon_alias q; @@ -180,6 +180,7 @@ static void skaterift_restore_state(void){ if( v3_length2(pos) > 1.0f ) player__setpos( pos ); } +#endif } static void vg_load(void){ @@ -188,11 +189,12 @@ static void vg_load(void){ return; } - vg_console_reg_cmd( "changeworld", skaterift_change_world_command, NULL ); + vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL ); + vg_console_reg_cmd( "switch_active_instance", + skaterift_switch_instance_cmd, NULL ); vg_loader_step( render_init, NULL ); vg_loader_step( menu_init, NULL ); - vg_loader_step( pointcloud_init, NULL ); vg_loader_step( world_init, NULL ); vg_loader_step( vehicle_init, NULL ); vg_loader_step( font3d_init, NULL ); @@ -231,6 +233,11 @@ static void vg_load(void){ * ------------------------------------- */ + /* hub world */ + addon_reg *hub = + addon_mount_local_addon( "maps/dev_hub", k_addon_type_world, ".mdl" ); + hub->metadata_len = 0; + /* understate diy. */ addon_reg *spawn = addon_mount_local_addon( "maps/mp_spawn", k_addon_type_world, @@ -261,20 +268,16 @@ static void vg_load(void){ /* load home/permanent world manually */ world_static.load_state = k_world_loader_load; + struct world_load_args args = { .purpose = k_world_purpose_hub, - .reg = spawn + .reg = hub }; skaterift_world_load_thread( &args ); vg_async_call( async_skaterift_player_start, NULL, 0 ); vg_async_stall(); - - global_skateshop.selected_world_id=1; - global_skateshop.pointcloud_world_id=1; - skateshop_world_preview_loader_thread( mtzero ); /* HACK */ - vg_console_load_autos(); menu_link(); @@ -329,6 +332,7 @@ static void vg_pre_update(void){ vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * (1.0f/0.3f) ); vg.time_rate = vg_smoothstepf( skaterift.time_rate ); + /* TODO: how can we compress this? */ player__pre_update(); world_entity_focus_preupdate(); skaterift_replay_pre_update(); @@ -489,12 +493,15 @@ static void render_scene(void){ if( skaterift.activity == k_skaterift_respawning ){ glDrawBuffers( 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 } ); glClearColor( 0.624f, 0.659f, 0.769f, 0.0f ); + glClearColor( 0.824f, 0.0f, 0.1f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 } ); +#if 0 view_world = &world_static.instances[respawn_chooser.world_id]; render_world_override( view_world ); render_world_routes( view_world, &skaterift.cam, 1 ); +#endif } else{ render_world( view_world, &skaterift.cam, 0 ); @@ -502,7 +509,9 @@ static void render_scene(void){ render_fb_bind( gpipeline.fb_main, 1 ); render_water_surface( view_world, &skaterift.cam ); render_remote_players( view_world, &skaterift.cam ); + ent_miniworld_render( view_world ); } + } static void render_scene_gate_subview(void){ @@ -569,14 +578,6 @@ static void render_main_game(void){ world_instance *view_world = localplayer.viewable_world; if( (view_world != NULL) && (skaterift.activity != k_skaterift_respawning) ){ render_world_cubemaps( view_world ); - - ent_gate *gate = view_world->rendering_gate; - if( gate ){ - if( gate->flags & k_ent_gate_nonlocal ){ - world_instance *dest = &world_static.instances[ gate->target ]; - render_world_cubemaps( dest ); - } - } } /* variable res target */ diff --git a/vehicle.h b/vehicle.h index 74408e4..bdd12f0 100644 --- a/vehicle.h +++ b/vehicle.h @@ -37,7 +37,8 @@ struct drivable_vehicle } static gzoomer = { - .obj = { .type = k_rb_shape_sphere, .inf.sphere.radius = 1.0f } + .obj = { .type = k_rb_shape_sphere, .inf.sphere.radius = 1.0f, + .rb.co = {-2000,-2000,-2000}} }; static int spawn_car( int argc, const char *argv[] ); diff --git a/world.c b/world.c index 40f3d75..def59a3 100644 --- a/world.c +++ b/world.c @@ -26,13 +26,44 @@ static void world_init(void) VG_MEMORY_SYSTEM ); } -static void world_set_active_instance( u32 index ){ - world_static.challenge_target = NULL; - world_static.challenge_timer = 0.0f; - world_static.focused_entity = 0; - world_static.focus_strength = 0.0f; - world_static.active_trigger_volume_count = 0; +static void world_switch_instance( u32 index ){ + assert( localplayer.subsystem == k_player_subsystem_walk ); + + if( index >= vg_list_size(world_static.instances) ){ + vg_error( "Instance ID out of range (%u)\n", index ); + return; + } + + world_instance *new = &world_static.instances[ index ]; + + if( new->status != k_world_status_loaded ){ + vg_error( "Instance is not loaded (%u)\n", index ); + return; + } + + if( index != world_static.active_instance ){ + world_instance *current = + &world_static.instances[ world_static.active_instance ]; + v3_copy( localplayer.rb.co, current->player_co ); + v3_copy( localplayer.angles, current->player_angles ); + current->player_angles[3] = player_get_heading_yaw(); + } + + v3_copy( new->player_co, localplayer.rb.co ); + v3_copy( new->player_angles, localplayer.angles ); + q_axis_angle( localplayer.rb.q, (v3f){0,1,0}, new->player_angles[3] ); + world_static.active_instance = index; + + player__reset(); +} + +static int skaterift_switch_instance_cmd( int argc, const char *argv[] ){ + if( argc ) + world_switch_instance( atoi(argv[0]) ); + else + vg_info( "switch_active_instance \n" ); + return 0; } static void skaterift_world_get_save_path( enum world_purpose which, diff --git a/world.h b/world.h index 98b9df9..c81d9ed 100644 --- a/world.h +++ b/world.h @@ -18,6 +18,7 @@ enum world_geo_type{ }; enum world_purpose{ + k_world_purpose_invalid = -1, k_world_purpose_hub = 0, k_world_purpose_client = 1, k_world_max @@ -62,6 +63,8 @@ struct world_instance { * ------------------------------------------------------- */ + v4f player_co, player_angles; + void *heap; enum world_status{ k_world_status_unloaded = 0, @@ -176,7 +179,8 @@ struct world_instance { ent_objective, ent_challenge, ent_relay, - ent_cubemap; + ent_cubemap, + ent_miniworld; ent_gate *rendering_gate; @@ -243,6 +247,6 @@ static world_static; static void world_init(void); static world_instance *world_current_instance(void); -static void world_set_active_instance( u32 index ); +static void world_switch_instance( u32 index ); #endif /* WORLD_H */ diff --git a/world_entity.c b/world_entity.c index e0c67d8..73caa0b 100644 --- a/world_entity.c +++ b/world_entity.c @@ -120,11 +120,10 @@ static void world_gen_entities_init( world_instance *world ){ for( u32 j=0; jent_gate); j ++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, j ); - if( !(gate->flags & k_ent_gate_nonlocal) ) { + if( !(gate->flags & k_ent_gate_nonlocal_DELETED) ) { gate_transform_update( gate ); } } - vg_async_call( world_link_nonlocal_async, world, 0 ); /* water */ for( u32 j=0; jent_water); j++ ){ @@ -596,6 +595,36 @@ static void world_entity_start( world_instance *world, vg_msg *sav ){ } } +/* + * used for relinking multi-world data. ran anytime the world setup changes + */ +static void world_entity_relink( world_instance *world ){ + vg_info( "entity_relink(%d)\n", world - world_static.instances ); + for( u32 i=0; ient_miniworld); i++ ){ + ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, i ); + miniworld->purpose = k_world_purpose_invalid; + + const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world ); + addon_alias q; + addon_uid_to_alias( uid, &q ); + + u32 addon_id = addon_match( &q ); + if( addon_id != 0xffffffff ){ + addon_reg *reg = get_addon_from_index( k_addon_type_world, addon_id ); + + for( int j=0; jstatus == k_world_status_loaded) && + (world_static.instance_addons[j] == reg) ){ + miniworld->purpose = j; + break; + } + } + } + } +} + static void world_entity_serialize( world_instance *world, vg_msg *sav ){ for( u32 i=0; ient_challenge); i++ ){ ent_challenge *challenge = mdl_arritm(&world->ent_challenge,i); diff --git a/world_entity.h b/world_entity.h index 1e5e70c..fc66d74 100644 --- a/world_entity.h +++ b/world_entity.h @@ -13,6 +13,7 @@ static ent_spawn *world_find_spawn_by_name( world_instance *world, static ent_spawn *world_find_closest_spawn( world_instance *world, v3f position ); static void world_entity_start( world_instance *world, vg_msg *sav ); +static void world_entity_relink( world_instance *world ); static void world_entity_serialize( world_instance *world, vg_msg *sav ); static void ent_volume_call( world_instance *world, ent_call *call ); diff --git a/world_gate.c b/world_gate.c index 4c76b07..96317c1 100644 --- a/world_gate.c +++ b/world_gate.c @@ -65,6 +65,10 @@ static void world_gates_init(void) world_gates.sm_marker[i] = *sm; } + mdl_mesh *icosphere = mdl_find_mesh( &mgate, "rs_icosphere" ); + world_gates.sm_icosphere = + *((mdl_submesh *)mdl_arritm( &mgate.submeshs, icosphere->submesh_start )); + mdl_async_load_glmesh( &mgate, &world_gates.mesh ); mdl_close( &mgate ); } @@ -272,9 +276,8 @@ static u32 world_intersect_gates( world_instance *world, v3f pos, v3f last ){ if( !(gate->flags & k_ent_gate_linked) ) continue; if( gate->flags & k_ent_gate_locked ) continue; - if( gate->flags & k_ent_gate_nonlocal ) - if( world_static.load_state != k_world_loader_none ) - continue; + if( gate->flags & k_ent_gate_nonlocal_DELETED ) + continue; if( gate_intersect( gate, pos, last ) ) return mdl_entity_id( k_ent_gate, i ); @@ -283,88 +286,6 @@ static u32 world_intersect_gates( world_instance *world, v3f pos, v3f last ){ return 0; } -/* - * detatches any nonlocal gates - */ -static void world_unlink_nonlocal( world_instance *world ){ - for( u32 j=0; jent_gate); j ++ ){ - ent_gate *gate = mdl_arritm( &world->ent_gate, j ); - - if( gate->flags & k_ent_gate_nonlocal ){ - gate->flags &= ~k_ent_gate_linked; - } - } -} - -/* - * attatches nonlocal gates, to be called from main thread ONLY! - */ -static void world_link_nonlocal_async( void *payload, u32 size ){ - world_instance *world = payload; - u32 world_id = world - world_static.instances; - - for( u32 j=0; jent_gate); j ++ ){ - ent_gate *gate = mdl_arritm( &world->ent_gate, j ); - - if( !(gate->flags & k_ent_gate_nonlocal) ) continue; - if( gate->flags & k_ent_gate_linked ) continue; - - const char *key = mdl_pstr( &world->meta, gate->key ); - vg_info( "key: %s\n", key ); - - for( u32 i=0; istatus != k_world_status_loaded ) continue; - vg_info( "Checking world %u for key matches\n", i ); - - for( u32 k=0; kent_gate ); k++ ){ - ent_gate *gate2 = mdl_arritm( &other->ent_gate, k ); - - if( !(gate2->flags & k_ent_gate_nonlocal) ) continue; - if( gate2->flags & k_ent_gate_linked ) continue; - - const char *key2 = mdl_pstr( &other->meta, gate2->key ); - vg_info( " key2: %s\n", key2 ); - - if( strcmp( key, key2 ) ) continue; - - vg_success( "Non-local matching pair '%s' found. (%u:%u)\n", - key, world_id, i ); - - gate->flags |= k_ent_gate_linked; - gate2->flags |= k_ent_gate_linked; - gate->target = i; - gate2->target = world_id; - - v3_copy( gate->co[0], gate2->co[1] ); - v3_copy( gate2->co[0], gate->co[1] ); - v4_copy( gate->q[0], gate2->q[1] ); - v4_copy( gate2->q[0], gate->q[1] ); - - if( world->meta.info.version < 102 ){ - /* LEGACY BEHAVIOUR: v101 - * this would flip both the client worlds portal's entrance and - * exit. effectively the clients portal would be the opposite - * to the hub worlds one. new behaviour is to just flip the - * destinations so the rules are consistent in each world. - */ - v4f qflip; - q_axis_angle( qflip, (v3f){0.0f,1.0f,0.0f}, VG_PIf ); - q_mul( gate->q[0], qflip, gate->q[0] ); - q_mul( gate->q[1], qflip, gate->q[1] ); - q_mul( gate2->q[1], qflip, gate2->q[1] ); - } - - gate_transform_update( gate ); - gate_transform_update( gate2 ); - - goto matched; - } - } matched:; - } -} - static void ent_gate_call( world_instance *world, ent_call *call ){ u32 index = mdl_entity_id_id( call->id ); ent_gate *gate = mdl_arritm( &world->ent_gate, index ); diff --git a/world_gate.h b/world_gate.h index 5663c29..201187c 100644 --- a/world_gate.h +++ b/world_gate.h @@ -11,15 +11,15 @@ struct world_gates{ glmesh mesh; - mdl_submesh sm_surface, sm_marker[4]; + mdl_submesh sm_surface, sm_marker[4], sm_icosphere; camera cam; + + v3f userportal_co; } static world_gates; static void world_gates_init(void); static void gate_transform_update( ent_gate *gate ); -static void world_link_nonlocal_async( void *payload, u32 size ); -static void world_unlink_nonlocal( world_instance *world ); static int render_gate( world_instance *world, world_instance *world_inside, ent_gate *gate, camera *cam, int layer_depth ); diff --git a/world_gen.c b/world_gen.c index 0b0c344..7d3cc81 100644 --- a/world_gen.c +++ b/world_gen.c @@ -652,7 +652,6 @@ static void async_world_postprocess( void *payload, u32 _size ){ } glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - world->status = k_world_status_loaded; } /* Loads textures from the pack file */ diff --git a/world_load.c b/world_load.c index f1308c1..e8f545c 100644 --- a/world_load.c +++ b/world_load.c @@ -45,6 +45,7 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ mdl_load_animation_block( meta, world->heap ); mdl_load_mesh_block( meta, world->heap ); + /* TODO: Make this a table? */ mdl_load_array( meta, &world->ent_gate, "ent_gate", heap ); mdl_load_array( meta, &world->ent_camera, "ent_camera", heap ); mdl_load_array( meta, &world->ent_spawn, "ent_spawn", heap ); @@ -66,6 +67,7 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ mdl_load_array( meta, &world->ent_challenge, "ent_challenge", heap ); mdl_load_array( meta, &world->ent_relay, "ent_relay", heap ); mdl_load_array( meta, &world->ent_cubemap, "ent_cubemap", heap ); + mdl_load_array( meta, &world->ent_miniworld, "ent_miniworld", heap ); mdl_array_ptr infos; mdl_load_array( meta, &infos, "ent_worldinfo", vg_mem.scratch ); @@ -95,6 +97,16 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ world_gen_compute_light_indices( world ); mdl_close( meta ); + /* init player position. + * - this is overriden by the save state when(if) it loads */ + v3_zero( world->player_angles ); + ent_spawn *rp = world_find_spawn_by_name( world, "start" ); + if( !rp ) rp = world_find_closest_spawn( world, (v3f){0.0f,0.0f,0.0f} ); + + /* TODO: fallback to searching for a safe location using raycasts */ + assert(rp); + v3_copy( rp->transform.co, world->player_co ); + /* allocate leaderboard buffers */ u32 bs = mdl_arrcount(&world->ent_route)*sizeof(struct leaderboard_cache); world->leaderboard_cache = vg_linear_alloc( heap, bs ); @@ -113,21 +125,27 @@ static void world_instance_load_mdl( u32 instance_id, const char *path ){ struct world_load_complete_data{ savedata_file save; - u32 instance_start, instance_count; + enum world_purpose purpose; }; static void skaterift_world_load_done( void *payload, u32 size ){ struct world_load_complete_data *data = payload; + /* TODO(W2): Load player position from this save file */ vg_msg sav; vg_msg_init( &sav, data->save.buf, data->save.len ); - for( u32 i=0; iinstance_count; i++ ){ - world_instance *world = &world_static.instances[ data->instance_start+i ]; - world_entity_start( world, &sav ); - } - + world_instance *world = &world_static.instances[ data->purpose ]; + world_entity_start( world, &sav ); + world->status = k_world_status_loaded; world_static.load_state = k_world_loader_none; + + for( int i=0; istatus == k_world_status_loaded ) + world_entity_relink( wi ); + } } struct world_load_args { @@ -139,10 +157,15 @@ struct world_load_args { * Does a complete world switch using the remaining free slots */ static void skaterift_world_load_thread( void *_args ){ - struct world_load_args *args = _args; + /* FIXME: we need to check all threads that take args. args can dissapear! */ + struct world_load_args args = *((struct world_load_args *)_args); + + addon_reg *reg = args.reg; + world_static.instance_addons[ args.purpose ] = reg; - addon_reg *reg = args->reg; - world_static.instance_addons[ args->purpose ] = reg; + char uid[ADDON_UID_MAX]; + addon_alias_uid( ®->alias, uid ); + vg_info( "LOAD WORLD %s @%d\n", uid, args.purpose ); char path_buf[4096]; vg_str path; @@ -206,30 +229,15 @@ static void skaterift_world_load_thread( void *_args ){ } } - u32 instance_start = 0, instance_count = 1; - if( args->purpose == k_world_purpose_client ) instance_start = 1; - - world_instance_load_mdl( instance_start, worlds[first_index] ); - - /* TODO: Support multiply packed worlds */ -#if 0 - world_loader.generate_point_cloud = 0; - for( u32 j=0; jpayload; - data->instance_start = instance_start; - data->instance_count = instance_count; + data->purpose = args.purpose; - skaterift_world_get_save_path( args->purpose, data->save.path ); + skaterift_world_get_save_path( args.purpose, data->save.path ); savedata_file_read( &data->save ); vg_async_dispatch( final_call, skaterift_world_load_done ); @@ -287,7 +295,6 @@ static void skaterift_change_world_start( addon_reg *reg ){ vg_linear_clear( vg_mem.scratch ); /* ?? */ vg_info( "unloading old worlds\n" ); - world_unlink_nonlocal( &world_static.instances[0] ); for( u32 i=1; ialias, buf ); + vg_info( " %s\n", buf ); } } diff --git a/world_load.h b/world_load.h index c4e1d84..3e4722a 100644 --- a/world_load.h +++ b/world_load.h @@ -12,5 +12,6 @@ static void world_free( world_instance *world ); static int world_freeable( world_instance *world ); +static int skaterift_load_world_command( int argc, const char *argv[] ); #endif /* WORLD_LOAD_H */ diff --git a/world_render.c b/world_render.c index aa74bbf..1e99566 100644 --- a/world_render.c +++ b/world_render.c @@ -150,6 +150,7 @@ struct world_pass{ struct world_surface *mat ); void (*fn_set_mdl)( m4x3f mdl ); void (*fn_set_uPvmPrev)( m4x4f pvm ); + void (*fn_set_uNormalMtx)( m3x3f mnorm ); }; static @@ -701,7 +702,8 @@ static void render_world_gates( world_instance *world, camera *cam, for( u32 i=0; ient_gate); i++ ){ ent_gate *gi = mdl_arritm( &world->ent_gate, i ); - if( !(gi->flags & k_ent_gate_linked) ) + if( !(gi->flags & (k_ent_gate_linked|k_ent_gate_nonlocal_DELETED| + k_ent_gate_locked)) ) continue; float dist = v3_dist2( gi->co[0], cam->transform[3] ); @@ -715,22 +717,8 @@ static void render_world_gates( world_instance *world, camera *cam, } world->rendering_gate = gate; - if( gate ){ - if( gate->flags & k_ent_gate_locked ) return; - - if( gate->flags & k_ent_gate_nonlocal ){ - if( world_static.load_state != k_world_loader_none ){ - world->rendering_gate = NULL; - return; - } - - world_instance *dest_world = &world_static.instances[ gate->target ]; - render_gate( world, dest_world, gate, cam, layer_depth ); - } - else{ - render_gate( world, world, gate, cam, layer_depth ); - } - } + if( gate ) + render_gate( world, world, gate, cam, layer_depth ); } static void world_prerender( world_instance *world ){ @@ -844,9 +832,10 @@ static void render_world( world_instance *world, camera *cam, } -static -void render_world_override_pass( world_instance *world, - struct world_pass *pass ){ +static void render_world_override_pass( world_instance *world, + struct world_pass *pass, + m4x3f mmdl, m3x3f mnormal, + m4x4f mpvm_prev ){ for( int i=0; isurface_count; i++ ){ struct world_surface *mat = &world->surfaces[i]; @@ -861,21 +850,21 @@ void render_world_override_pass( world_instance *world, if( !sm->indice_count ) continue; - m4x3f mmdl; - m4x3_identity( mmdl ); pass->fn_set_mdl( mmdl ); - pass->fn_set_uPvmPrev( pass->cam->mtx_prev.pv ); + pass->fn_set_uNormalMtx( mnormal ); + pass->fn_set_uPvmPrev( mpvm_prev ); pass->fn_bind_textures( world, mat ); mdl_draw_submesh( sm ); } } -static void render_world_override( world_instance *world ){ +static void render_world_override( world_instance *world, m4x3f mmdl ){ struct world_pass pass = { .cam = &skaterift.cam, .fn_bind_textures = bindpoint_override, .fn_set_mdl = shader_scene_override_uMdl, .fn_set_uPvmPrev = shader_scene_override_uPvmPrev, + .fn_set_uNormalMtx = shader_scene_override_uNormalMtx, .shader = k_shader_override }; @@ -887,15 +876,32 @@ static void render_world_override( world_instance *world ){ WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, scene_override ); bind_terrain_noise(); - shader_scene_override_uCamera( pass.cam->transform[3] ); + + m4x3f mmdl_inv; + m4x3_invert_full( mmdl, mmdl_inv ); + + v3f cam_pos; + m4x3_mulv( mmdl_inv, pass.cam->transform[3], cam_pos ); + shader_scene_override_uCamera( cam_pos ); + + m4x4f mpvm_prev; + m4x3_expand( mmdl, mpvm_prev ); + m4x4_mul( skaterift.cam.mtx_prev.pv, mpvm_prev, mpvm_prev ); + + m3x3f mnormal; + m3x3_inv( mmdl_inv, mnormal ); + m3x3_transpose( mnormal, mnormal ); + v3_normalize( mnormal[0] ); + v3_normalize( mnormal[1] ); + v3_normalize( mnormal[2] ); glDisable( GL_CULL_FACE ); mesh_bind( &world->mesh_geo ); pass.geo_type = k_world_geo_type_solid; - render_world_override_pass( world, &pass ); + render_world_override_pass( world, &pass, mmdl, mnormal, mpvm_prev ); mesh_bind( &world->mesh_no_collide ); pass.geo_type = k_world_geo_type_nonsolid; - render_world_override_pass( world, &pass ); + render_world_override_pass( world, &pass, mmdl, mnormal, mpvm_prev ); glEnable( GL_CULL_FACE ); } diff --git a/world_render.h b/world_render.h index 3050a69..1810400 100644 --- a/world_render.h +++ b/world_render.h @@ -78,6 +78,7 @@ static void render_world( world_instance *world, camera *cam, int layer_depth ); static void render_world_cubemaps( world_instance *world ); static void bind_terrain_noise(void); +static void render_world_override( world_instance *world, m4x3f mmdl ); #define WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( WORLD, SHADER ) \ world_link_lighting_ub( WORLD, _shader_##SHADER.id ); \ diff --git a/world_routes.c b/world_routes.c index f4de14c..9dc678e 100644 --- a/world_routes.c +++ b/world_routes.c @@ -14,7 +14,6 @@ #include "network.h" #include "font.h" -#include "pointcloud.h" #include "gui.h" #include "steam.h" #include "network_msg.h" @@ -119,16 +118,6 @@ static void world_routes_activate_entry_gate( world_instance *world, ent_gate *rg ) { world_static.last_use = world_static.time; - - /* disable all routes and leave the world */ - if( rg->flags & k_ent_gate_nonlocal ){ - for( u32 i=0; ient_route); i++ ){ - ent_route *route = mdl_arritm( &world->ent_route, i ); - route->active_checkpoint = 0xffff; - } - return; - } - ent_gate *dest = mdl_arritm( &world->ent_gate, rg->target ); for( u32 i=0; ient_route); i++ ){ @@ -212,90 +201,10 @@ static void world_routes_debug( world_instance *world ) } } -static -void world_routes_pointcloud_spot( world_instance *world, - pointcloud_buffer *pcbuf, - v3f co, f32 radius, u32 samples, v4f colour ) -{ - v3f inv_ext; - v3_sub( pcbuf->boundary[1], pcbuf->boundary[0], inv_ext ); - v3_div( (v3f){1.0f,1.0f,1.0f}, inv_ext, inv_ext ); - - for( u32 j=0; jcount >= pcbuf->max ) - return; - - pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ]; - - v3f sample, jitter, point; - vg_rand_sphere( jitter ); - v3_muladds( co, jitter, radius, sample ); - - if( bh_closest_point( world->geo_bh, sample, point, radius*1.5f ) == -1 ){ - v3_copy( sample, point ); - } - - v3f pos; - v3_sub( point, pcbuf->boundary[0], pos ); - v3_mul( pos, inv_ext, pos ); - - float dist = 1.0f-(v3_length(jitter)); - - v4f final_colour; - v4_muls( colour, dist*dist, final_colour ); - - pointcloud_packvert( vert, pos, final_colour ); - } -} - -/* - * ' - * . - * | - * | - * /#\ - * -'###`- - */ -static -void world_routes_pointcloud_tower( world_instance *world, - pointcloud_buffer *pcbuf, - v3f co, f32 radius, f32 height, - u32 samples, v4f colour ) -{ - v3f inv_ext; - v3_sub( pcbuf->boundary[1], pcbuf->boundary[0], inv_ext ); - v3_div( (v3f){1.0f,1.0f,1.0f}, inv_ext, inv_ext ); - - for( u32 j=0; jcount >= pcbuf->max ) - return; - - pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ]; - - v3f point; - point[0] = vg_randf64()*2.0f-1.0f; - point[1] = 0.0f; - point[2] = vg_randf64()*2.0f-1.0f; - v3_normalize( point ); - v3_muls( point, sqrtf(vg_randf64()), point ); - - f32 h = vg_randf64(); - point[1] = h*h*h*height; - point[0] *= radius; - point[2] *= radius; - - v3_add( point, co, point ); - v3_sub( point, pcbuf->boundary[0], point ); - v3_mul( point, inv_ext, point ); - - pointcloud_packvert( vert, point, colour ); - } -} static void world_routes_place_curve( world_instance *world, ent_route *route, - v4f h[3], v3f n0, v3f n2, scene_context *scene, - pointcloud_buffer *pcbuf ) + v4f h[3], v3f n0, v3f n2, scene_context *scene ) { float t; v3f p, pd; @@ -355,11 +264,6 @@ void world_routes_place_curve( world_instance *world, ent_route *route, int resa = ray_world( world, sa, down, &ha, k_material_flag_ghosts ), resb = ray_world( world, sb, down, &hb, k_material_flag_ghosts ); - - if( pcbuf && resa ){ - world_routes_pointcloud_spot( world, pcbuf, ha.pos, - 12.0f, 10, route->colour ); - } if( resa && resb ){ struct world_surface *surfa = ray_hit_surface( world, &ha ), @@ -415,8 +319,7 @@ void world_routes_place_curve( world_instance *world, ent_route *route, } static void world_routes_gen_meshes( world_instance *world, u32 route_id, - scene_context *sc, - pointcloud_buffer *pcbuf ) + scene_context *sc ) { ent_route *route = mdl_arritm( &world->ent_route, route_id ); u8 colour[4]; @@ -527,7 +430,7 @@ static void world_routes_gen_meshes( world_instance *world, u32 route_id, v3_normalize( n0 ); v3_normalize( n2 ); - world_routes_place_curve( world, route, p, n0, n2, sc, pcbuf ); + world_routes_place_curve( world, route, p, n0, n2, sc ); /* --- */ v4_copy( p[2], p[0] ); @@ -541,223 +444,6 @@ static struct world_surface *world_tri_index_surface( world_instance *world, u32 index ); -static f64 world_routes_scatter_surface_points( world_instance *world, - pointcloud_buffer *pcbuf, - f32 rate ) -{ - static f32 densities[] = { - [k_surface_prop_concrete] = 2.0f, - [k_surface_prop_grass] = 0.8f, - [k_surface_prop_metal] = 1.0f, - [k_surface_prop_wood] = 2.5f, - [k_surface_prop_tiles] = 4.0f - }; - - /* calculate total area */ - f64 total_area = 0.0f; - for( u32 i=0; iscene_geo.indice_count/3; i++ ){ - u32 *tri = &world->scene_geo.arrindices[i*3]; - struct world_surface *surf = world_tri_index_surface( world, tri[0] ); - - if( surf->info.shader == k_shader_boundary || - surf->info.shader == k_shader_invisible ) continue; - - if( !(surf->info.flags & k_material_flag_preview_visibile) ) continue; - - scene_vert *va = &world->scene_geo.arrvertices[tri[0]], - *vb = &world->scene_geo.arrvertices[tri[1]], - *vc = &world->scene_geo.arrvertices[tri[2]]; - - v3f v0, v1, vn; - v3_sub( vb->co, va->co, v0 ); - v3_sub( vc->co, va->co, v1 ); - v3_cross( v0, v1, vn ); - if( vn[1] < 0.0f ) continue; - - f32 density = 1.0f; - if( surf->info.surface_prop < vg_list_size(densities) ) - density = densities[surf->info.surface_prop]; - total_area += v3_length(vn)*0.5f*density; - } - - f32 accum = 0.0f; - - u8 colour[] = { 80,80,80,255 }; - v3f light_dir = {0.3f,0.8f,0.1f}; - v3_normalize( light_dir ); - - v3f inv_ext; - v3_sub( pcbuf->boundary[1], pcbuf->boundary[0], inv_ext ); - v3_div( (v3f){1.0f,1.0f,1.0f}, inv_ext, inv_ext ); - - for( u32 i=0; iscene_geo.indice_count/3; i++ ){ - u32 *tri = &world->scene_geo.arrindices[i*3]; - struct world_surface *surf = world_tri_index_surface( world, tri[0] ); - - if( surf->info.shader == k_shader_boundary || - surf->info.shader == k_shader_invisible ) continue; - - if( !(surf->info.flags & k_material_flag_preview_visibile) ) continue; - - scene_vert *va = &world->scene_geo.arrvertices[tri[0]], - *vb = &world->scene_geo.arrvertices[tri[1]], - *vc = &world->scene_geo.arrvertices[tri[2]]; - - v3f v0, v1, vn; - v3_sub( vb->co, va->co, v0 ); - v3_sub( vc->co, va->co, v1 ); - v3_cross( v0, v1, vn ); - if( vn[1] < 0.0f ) continue; - - f32 density = 1.0f; - if( surf->info.surface_prop < vg_list_size(densities) ) - density = densities[surf->info.surface_prop]; - - f32 area = v3_length(vn)*0.5f*density; - accum += area; - - v3_normalize( vn ); - - while( accum > rate ){ - accum -= rate; - - if( pcbuf->count >= pcbuf->max ) return total_area; - - v2f co = { vg_randf64(), vg_randf64() }; - if( v2_length2(co) > 0.5f ){ - co[0] = 1.0f-co[0]; - co[1] = 1.0f-co[1]; - } - - v3f pt; - v3_muls( v0, co[0], pt ); - v3_muladds( pt, v1, co[1], pt ); - v3_add( va->co, pt, pt ); - - if( pt[1] < world->water.height ) continue; - pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ]; - - v3f pos; - v3_sub( pt, pcbuf->boundary[0], pos ); - v3_mul( pos, inv_ext, pos ); - - static v4f colours[] = { - [k_surface_prop_concrete] = { 0.13, 0.15, 0.17, 1.0 }, - [k_surface_prop_grass] = { 0.07, 0.1, 0.14, 1.0 }, - [k_surface_prop_metal] = { 0.15, 0.19, 0.22, 1.0 }, - [k_surface_prop_wood] = { 0.1, 0.13, 0.17, 1.0 }, - [k_surface_prop_tiles] = { 0.05, 0.06, 0.07, 1.0 }, - }; - - v4f col = {0.0f,0.0f,0.0f,0.0f}; - if( surf->info.surface_prop < vg_list_size(colours) ) - v4_copy( colours[surf->info.surface_prop], col ); - - f32 brightness = v3_dot(vn,light_dir)*0.5f+0.5f; - v3_muls( col, brightness, col ); - - pointcloud_packvert( vert, pos, col ); - } - } - - return total_area; -} - -static void world_routes_surface_grid( world_instance *world, - pointcloud_buffer *pcbuf ) -{ - i32 const k_gridlines = 32, - k_gridres = 255; - - v3f inv_ext; - v3_sub( pcbuf->boundary[1], pcbuf->boundary[0], inv_ext ); - v3_div( (v3f){1.0f,1.0f,1.0f}, inv_ext, inv_ext ); - v4f colour = {0.2f,0.2f,0.2f,1.0f}; - v3f dir = {0.0f,-1.0f,0.0f}; - - for( u32 k=0; k<2; k++ ){ - u32 a = k*2, - b = (k^0x1)*2; - - for( i32 x=0; x<=k_gridlines; x++ ){ - f32 t = (float)x / (float)k_gridlines, - px = vg_lerpf( pcbuf->boundary[0][a], pcbuf->boundary[1][a], t ); - - for( i32 z=0; z<=k_gridres; z++ ){ - f32 tz = (float)z / (float)k_gridres, - pz = vg_lerpf(pcbuf->boundary[0][b],pcbuf->boundary[1][b], tz); - - v3f ro, hit; - ro[a] = px; - ro[1] = 1000.0f; - ro[b] = pz; - - bh_iter it; - bh_iter_init_ray( 0, &it, ro, dir, INFINITY ); - i32 idx; - - while( bh_next( world->geo_bh, &it, &idx ) ){ - u32 *tri = &world->scene_geo.arrindices[ idx*3 ]; - v3f vs[3]; - - u16 mask = k_material_flag_preview_visibile; - if( !(world->scene_geo.arrvertices[tri[0]].flags & mask) ) - continue; - - for( u32 i=0; i<3; i++ ){ - v3_copy( world->scene_geo.arrvertices[tri[i]].co, vs[i] ); - } - - f32 t; - if( ray_tri( vs, ro, dir, &t ) ){ - v3_muladds( ro, dir, t, hit ); - - if( world->water.enabled ) - if( hit[1] < world->water.height ) - continue; - - if( pcbuf->count >= pcbuf->max ) return; - - pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ]; - - v3f co; - v3_sub( hit, pcbuf->boundary[0], co ); - v3_mul( co, inv_ext, co ); - - pointcloud_packvert( vert, co, colour ); - } - } - } - } - } -} - -static void world_write_preview( addon_reg *reg, pointcloud_buffer *pcbuf ){ - if( reg->alias.workshop_id ) return; - - /* - * FIXME: BUG: cannot correctly handle workshop because there is a stalling - * call below, which deadlocks the scene upload. TODO: improve the async - * stack to handle out of order execution. MAYBE - */ - - char path_buf[4096]; - vg_str path; - vg_strnull( &path, path_buf, 4096 ); - - addon_get_content_folder( reg, &path ); - vg_strcat( &path, "/preview.bin" ); - - if( !vg_strgood( &path ) ) vg_fatal_error( "Path too long\n" ); - FILE *fp = fopen( path_buf, "wb" ); - if( !fp ) vg_fatal_error( "Cannot open '%s' for writing\n", path_buf ); - - fwrite( pcbuf, sizeof(struct pointcloud_buffer) + - sizeof(struct pointcloud_vert)*pcbuf->count, 1, fp ); - fclose( fp ); - vg_info( "written %s\n", path_buf ); -} - /* * Create the strips of colour that run through the world along course paths */ @@ -771,27 +457,6 @@ static void world_gen_routes_generate( u32 instance_id ){ &world->mesh_route_lines, 200000, 300000 ); - vg_async_item *call_pointcloud = NULL; - pointcloud_buffer *pcbuf = NULL; - - if( instance_id <= 1 /*world_loader.generate_point_cloud*/ ){ - call_pointcloud = vg_async_alloc( - sizeof(pointcloud_buffer) + - sizeof(pointcloud_vert)*POINTCLOUD_POINTS ); - pcbuf = call_pointcloud->payload; - pcbuf->count = 0; - pcbuf->max = POINTCLOUD_POINTS; - pcbuf->op = k_pointcloud_op_clear; - - v3f ext, mid, v0; - v3_sub( world->scene_geo.bbx[1], world->scene_geo.bbx[0], ext ); - f32 maxe = v3_maxf( ext ); - v3_fill( v0, maxe * 0.5f ); - v3_muladds( world->scene_geo.bbx[0], ext, 0.5f, mid ); - v3_add( mid, v0, pcbuf->boundary[1] ); - v3_sub( mid, v0, pcbuf->boundary[0] ); - } - for( u32 i=0; ient_gate); i++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, i ); gate->ref_count = 0; @@ -832,28 +497,7 @@ static void world_gen_routes_generate( u32 instance_id ){ } for( u32 i=0; ient_route); i++ ){ - world_routes_gen_meshes( world, i, &world->scene_lines, pcbuf ); - } - - if( instance_id <= 1 /*world_loader.generate_point_cloud*/ ){ - f64 area = 0.0; - - area = world_routes_scatter_surface_points( world, pcbuf, 16.0f ); - world_routes_surface_grid( world, pcbuf ); - - for( u32 i=0; ient_gate ); i++ ){ - ent_gate *gate = mdl_arritm( &world->ent_gate, i ); - - world_routes_pointcloud_tower( world, pcbuf, gate->co[0], - 2.0f, 50.0f, 128, - (v4f){0.2f,0.2f,0.2f,1.0f} ); - } - - vg_info( "Distributed %u points over %fkm^2!\n", - pcbuf->count, area/1e6f ); - - world_write_preview( world_static.instance_addons[ instance_id ], pcbuf ); - vg_async_dispatch( call_pointcloud, async_pointcloud_sub ); + world_routes_gen_meshes( world, i, &world->scene_lines ); } vg_async_dispatch( call_scene, async_scene_upload ); @@ -897,7 +541,7 @@ static void world_gen_routes_ent_init( world_instance *world ){ } if( (gate->flags & k_ent_gate_linked) & - !(gate->flags & k_ent_gate_nonlocal) ){ + !(gate->flags & k_ent_gate_nonlocal_DELETED) ){ gate = mdl_arritm(&world->ent_gate, gate->target ); for( u32 k=0; k<4; k++ ){ @@ -1326,7 +970,7 @@ static void render_world_routes( world_instance *world, camera *cam, for( u32 j=0; jent_gate); j ++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, j ); - if( !(gate->flags & k_ent_gate_nonlocal) ) + if( !(gate->flags & k_ent_gate_nonlocal_DELETED) ) render_gate_markers( i, gate ); } } -- 2.25.1