From f7c3600e850cc57df80d70c1862cf554c0cf4502 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 24 Nov 2023 05:41:18 +0000 Subject: [PATCH] fallback board --- models_src/board_none.mdl | Bin 0 -> 97344 bytes player.h | 1 + player_render.c | 3 +- shaders/model_board_view.h | 83 ++++++++++++++++++++++++++++++++- shaders/model_character_view.h | 83 ++++++++++++++++++++++++++++++++- skaterift.c | 3 +- 6 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 models_src/board_none.mdl diff --git a/models_src/board_none.mdl b/models_src/board_none.mdl new file mode 100644 index 0000000000000000000000000000000000000000..b644f1ce28762ada8aa9e23608bab7a3c4ad07de GIT binary patch literal 97344 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 bUy|P=|3q$nO>X{)8TmmSMtteuw6FgI=vx{3 literal 0 HcmV?d00001 diff --git a/player.h b/player.h index ef78e31..a5ae8e8 100644 --- a/player.h +++ b/player.h @@ -117,6 +117,7 @@ struct { struct player_ragdoll ragdoll; struct player_model fallback_model; + struct player_board fallback_board; u16 board_view_slot, playermodel_view_slot; diff --git a/player_render.c b/player_render.c index 13e4ada..b0f35e1 100644 --- a/player_render.c +++ b/player_render.c @@ -299,7 +299,8 @@ static void render_board( camera *cam, world_instance *world, struct player_board_pose *pose, enum board_shader shader ) { - if( !board ) return; + if( !board ) + board = &localplayer.fallback_board; /* TODO: * adding depth compare to this shader diff --git a/shaders/model_board_view.h b/shaders/model_board_view.h index 2d40352..e976fe2 100644 --- a/shaders/model_board_view.h +++ b/shaders/model_board_view.h @@ -460,13 +460,94 @@ static struct vg_shader _shader_model_board_view = { "\n" "#line 13 0 \n" "\n" +"vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n" +"{\n" +" float fresnel = step(0.5,1.0 - abs(dot(normal,halfview)));\n" +"\n" +" vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n" +" g_sunset_phase );\n" +"\n" +"\n" +" vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" +" vec3 light_sun = max(0.0, dot(normal,g_sun_dir.xyz)*0.5+0.5) \n" +" * g_sun_colour.rgb * g_day_phase;\n" +"\n" +" float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" +" vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" +" g_sunset_phase );\n" +"\n" +" return ambient + (light_sun + sky_reflection) * shadow;\n" +"}\n" +"\n" +"vec3 character_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n" +" float light_mask )\n" +"{\n" +" if( g_light_preview == 1 )\n" +" diffuse = vec3(0.75);\n" +"\n" +" // Lighting\n" +" vec3 halfview = uCamera - co;\n" +" float fdist = length(halfview);\n" +" halfview /= fdist;\n" +"\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 = character_clearskies_lighting( \n" +" normal, min( light_mask, world_shadow ), halfview );\n" +"\n" +" vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n" +" cube_coord = floor( cube_coord );\n" +"\n" +" if( g_debug_indices == 1 )\n" +" {\n" +" return rand33(cube_coord);\n" +" }\n" +"\n" +" if( g_debug_complexity == 1 )\n" +" {\n" +" ivec3 coord = ivec3( cube_coord );\n" +" uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n" +"\n" +" uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n" +" return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n" +" }\n" +"\n" +" // FIXME: this coord should absolutely must be clamped!\n" +" \n" +" ivec3 coord = ivec3( cube_coord );\n" +" uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n" +"\n" +" total_light += \n" +" scene_calculate_packed_light_patch( index_sample.x,\n" +" halfview, co, normal ) \n" +" * light_mask;\n" +" total_light += \n" +" scene_calculate_packed_light_patch( index_sample.y,\n" +" halfview, co, normal )\n" +" * light_mask;\n" +"\n" +" // Take a section of the sky function to give us a matching fog colour\n" +"\n" +" vec3 fog_colour = clearskies_ambient( -halfview );\n" +" float sun_theta = dot( -halfview, g_sun_dir.xyz );\n" +" float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n" +" float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n" +" \n" +" vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n" +" sun_colour *= sun_shape;\n" +"\n" +" fog_colour += sun_colour;\n" +" return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" +"}\n" +"\n" "void main(){\n" " depth_compare_dither();\n" " compute_motion_vectors();\n" "\n" " vec3 qnorm = aNorm;\n" " vec3 diffuse = texture( uTexMain, aUv ).rgb;\n" -" vec3 composite = world_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n" +" vec3 composite = character_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n" "\n" " float dist = distance( aWorldCo, uCamera ) - 0.08;\n" " float opacity = clamp( dist*dist, 0.0, 1.0 );\n" diff --git a/shaders/model_character_view.h b/shaders/model_character_view.h index 51e06db..7be4184 100644 --- a/shaders/model_character_view.h +++ b/shaders/model_character_view.h @@ -468,13 +468,94 @@ static struct vg_shader _shader_model_character_view = { "\n" "#line 13 0 \n" "\n" +"vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n" +"{\n" +" float fresnel = step(0.5,1.0 - abs(dot(normal,halfview)));\n" +"\n" +" vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n" +" g_sunset_phase );\n" +"\n" +"\n" +" vec3 sky_reflection = 0.5 * fresnel * reflect_colour;\n" +" vec3 light_sun = max(0.0, dot(normal,g_sun_dir.xyz)*0.5+0.5) \n" +" * g_sun_colour.rgb * g_day_phase;\n" +"\n" +" float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) );\n" +" vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, \n" +" g_sunset_phase );\n" +"\n" +" return ambient + (light_sun + sky_reflection) * shadow;\n" +"}\n" +"\n" +"vec3 character_compute_lighting( vec3 diffuse, vec3 normal, vec3 co,\n" +" float light_mask )\n" +"{\n" +" if( g_light_preview == 1 )\n" +" diffuse = vec3(0.75);\n" +"\n" +" // Lighting\n" +" vec3 halfview = uCamera - co;\n" +" float fdist = length(halfview);\n" +" halfview /= fdist;\n" +"\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 = character_clearskies_lighting( \n" +" normal, min( light_mask, world_shadow ), halfview );\n" +"\n" +" vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz;\n" +" cube_coord = floor( cube_coord );\n" +"\n" +" if( g_debug_indices == 1 )\n" +" {\n" +" return rand33(cube_coord);\n" +" }\n" +"\n" +" if( g_debug_complexity == 1 )\n" +" {\n" +" ivec3 coord = ivec3( cube_coord );\n" +" uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n" +"\n" +" uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u);\n" +" return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 );\n" +" }\n" +"\n" +" // FIXME: this coord should absolutely must be clamped!\n" +" \n" +" ivec3 coord = ivec3( cube_coord );\n" +" uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 );\n" +"\n" +" total_light += \n" +" scene_calculate_packed_light_patch( index_sample.x,\n" +" halfview, co, normal ) \n" +" * light_mask;\n" +" total_light += \n" +" scene_calculate_packed_light_patch( index_sample.y,\n" +" halfview, co, normal )\n" +" * light_mask;\n" +"\n" +" // Take a section of the sky function to give us a matching fog colour\n" +"\n" +" vec3 fog_colour = clearskies_ambient( -halfview );\n" +" float sun_theta = dot( -halfview, g_sun_dir.xyz );\n" +" float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 );\n" +" float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5;\n" +" \n" +" vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 );\n" +" sun_colour *= sun_shape;\n" +"\n" +" fog_colour += sun_colour;\n" +" return scene_apply_fog( diffuse * total_light, fog_colour, fdist );\n" +"}\n" +"\n" "void main(){\n" " depth_compare_dither();\n" " compute_motion_vectors();\n" "\n" " vec3 qnorm = aNorm;\n" " vec3 diffuse = texture( uTexMain, aUv ).rgb;\n" -" vec3 composite = world_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n" +" vec3 composite = character_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );\n" "\n" " float dist = distance( aWorldCo, uCamera ) - 0.08;\n" " float opacity = clamp( dist*dist, 0.0, 1.0 );\n" diff --git a/skaterift.c b/skaterift.c index 14af6a7..eb51c90 100644 --- a/skaterift.c +++ b/skaterift.c @@ -194,10 +194,11 @@ static void vg_load(void){ replay_clear( &skaterift.replay ); player_load_animation_reference( "models/ch_none.mdl" ); - player_model_load( &localplayer.fallback_model, "models/ch_none.mdl" ); player__bind(); + player_board_load( &localplayer.fallback_board, "models/board_none.mdl" ); + /* --------------------- */ vg_bake_shaders(); -- 2.25.1