diff --git a/gfx/drivers/gl_shaders/pipeline_snow_simple.glsl.frag.h b/gfx/drivers/gl_shaders/pipeline_snow_simple.glsl.frag.h new file mode 100644 index 0000000000..94687fe269 --- /dev/null +++ b/gfx/drivers/gl_shaders/pipeline_snow_simple.glsl.frag.h @@ -0,0 +1,52 @@ +#include "shaders_common.h" + +static const char *stock_fragment_xmb_simple_snow = GLSL( + uniform float time; + vec2 res = vec2(1920*3, 1080*3); + float quality = 8.0; + + float Cellular2D(vec2 P) { + vec2 Pi = floor(P); + vec2 Pf = P - Pi; + vec2 Pt = vec2( Pi.x, Pi.y + 1.0 ); + Pt = Pt - floor(Pt * ( 1.0 / 71.0 )) * 71.0; + Pt += vec2( 26.0, 161.0 ); + Pt *= Pt; + Pt = Pt.xy * Pt.yx; + float hash_x = fract( Pt.x * ( 1.0 / 951.135664 ) ) * 2.0 - 1.0; + float hash_y = fract( Pt.y * ( 1.0 / 642.949883 ) ) * 2.0 - 1.0; + const float JITTER_WINDOW = 0.25; + hash_x = ( ( hash_x * hash_x * hash_x ) - sign( hash_x ) ) * JITTER_WINDOW; + hash_y = ( ( hash_y * hash_y * hash_y ) - sign( hash_y ) ) * JITTER_WINDOW; + vec2 dd = vec2(Pf.x - hash_x, Pf.y - hash_y); + float d = dd.x * dd.x + dd.y * dd.y; + return d * ( 1.0 / 1.125 ); + } + + float snow(vec2 pos, float time, float scale) { + pos.x += cos(pos.y*4.0 + time*3.14159*2.0 + 1.0/scale)/(8.0/scale); + pos += time*scale*vec2(-0.5, 1.0); + return max( + 1.0 - Cellular2D(mod(pos/scale, scale*quality)*16.0)*1024.0, + 0.0 + ) * (scale*0.5 + 0.5); + } + + void main( void ) { + float winscale = max(res.x, res.y); + float tim = mod(time/8.0, 84.0*quality); + vec2 pos = gl_FragCoord.xy/winscale; + float a = 0.0; + a += snow(pos, tim, 1.0); + a += snow(pos, tim, 0.7); + a += snow(pos, tim, 0.6); + a += snow(pos, tim, 0.5); + a += snow(pos, tim, 0.4); + a += snow(pos, tim, 0.3); + a += snow(pos, tim, 0.25); + a += snow(pos, tim, 0.125); + a = a * min(pos.y*4.0, 1.0); + gl_FragColor = vec4(1.0, 1.0, 1.0, a); + } + +); diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index ca1cccbfc7..f79d9625b6 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -124,6 +124,7 @@ static const char *glsl_prefixes[] = { #include "../drivers/gl_shaders/modern_pipeline_snow.glsl.vert.h" #include "../drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.frag.h" #include "../drivers/gl_shaders/pipeline_snow.glsl.frag.h" +#include "../drivers/gl_shaders/pipeline_snow_simple.glsl.frag.h" #if !defined(HAVE_OPENGLES) #include "../drivers/gl_shaders/legacy_pipeline_snow.glsl.vert.h" #include "../drivers/gl_shaders/legacy_pipeline_xmb_ribbon.glsl.vert.h" @@ -966,7 +967,7 @@ static void *gl_glsl_init(void *data, const char *path) #else shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; #endif - shader_prog_info.fragment = stock_fragment_xmb_snow; + shader_prog_info.fragment = stock_fragment_xmb_simple_snow; gl_glsl_compile_program( glsl, @@ -975,6 +976,21 @@ static void *gl_glsl_init(void *data, const char *path) &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_3].id, &glsl->uniforms[VIDEO_SHADER_MENU_3]); + +#if defined(HAVE_OPENGLES) + shader_prog_info.vertex = stock_vertex_xmb_snow_modern; +#else + shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; +#endif + shader_prog_info.fragment = stock_fragment_xmb_snow; + + gl_glsl_compile_program( + glsl, + VIDEO_SHADER_MENU_4, + &glsl->prg[VIDEO_SHADER_MENU_4], + &shader_prog_info); + gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_4].id, + &glsl->uniforms[VIDEO_SHADER_MENU_4]); #endif gl_glsl_reset_attrib(glsl); diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 4c7502e5e5..ed9ab8afcb 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -38,7 +38,7 @@ #define VIDEO_SHADER_MENU (GFX_MAX_SHADERS - 2) #define VIDEO_SHADER_MENU_2 (GFX_MAX_SHADERS - 3) #define VIDEO_SHADER_MENU_3 (GFX_MAX_SHADERS - 4) -#define VIDEO_SHADER_MENU_4 (GFX_MAX_SHADERS - 4) +#define VIDEO_SHADER_MENU_4 (GFX_MAX_SHADERS - 5) #endif diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index de5ceefca9..11445b470c 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -1190,6 +1190,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "Ribbon") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "Ribbon (simplified)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, "Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 5b37dbd5aa..f5e18da1e1 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1178,6 +1178,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "Ribbon") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "Ribbon (simplified)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, "Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index debddc98ae..87fe5be3bc 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1198,6 +1198,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "リボン") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "リボン (単純)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, "雪") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 4ea1c0930b..faed9a4d15 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1140,3 +1140,11 @@ MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, "database_cursor_list_edge_magazine_rating") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, "database_info") +MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_RIBBON, + "shader_pipeline_ribbon") +MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_RIBBON_SIMPLIFIED, + "shader_pipeline_ribbon_simplified") +MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_SIMPLE_SNOW, + "shader_pipeline_simple_snow") +MSG_HASH(MENU_ENUM_LABEL_SHADER_PIPELINE_SNOW, + "shader_pipeline_snow") diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index e06c0a66ea..c2291ea437 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -1190,8 +1190,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "Ribbon") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "Ribbon (simplified)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simpel Sneeuw") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, - "Snow") + "Sneeuw") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, "Geavanceerde Instellingen weergeven") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 0183835bdf..6f04d7df9b 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1190,6 +1190,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "Ribbon") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "Ribbon (simplified)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, "Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 8a8d15de9b..97c2c47873 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1206,6 +1206,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, "Ribbon") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, "Ribbon (simplified)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, "Snow") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 4bae7707e7..cf0828fee7 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -225,6 +225,11 @@ static void menu_action_setting_disp_set_label_pipeline( msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON), len); break; + case XMB_SHADER_PIPELINE_SIMPLE_SNOW: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW), len); + break; case XMB_SHADER_PIPELINE_SNOW: strlcpy(s, msg_hash_to_str( diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 9d1b3da72b..98396e02c7 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2390,9 +2390,12 @@ static void xmb_draw_bg( case XMB_SHADER_PIPELINE_RIBBON: draw.pipeline.id = VIDEO_SHADER_MENU; break; - case XMB_SHADER_PIPELINE_SNOW: + case XMB_SHADER_PIPELINE_SIMPLE_SNOW: draw.pipeline.id = VIDEO_SHADER_MENU_3; break; + case XMB_SHADER_PIPELINE_SNOW: + draw.pipeline.id = VIDEO_SHADER_MENU_4; + break; default: break; } diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 38c156ac37..6048a1085c 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -170,6 +170,7 @@ static void menu_display_gl_draw_pipeline(void *data) case VIDEO_SHADER_MENU: case VIDEO_SHADER_MENU_2: case VIDEO_SHADER_MENU_3: + case VIDEO_SHADER_MENU_4: { static float t = 0; video_shader_ctx_info_t shader_info; diff --git a/menu/menu_display.h b/menu/menu_display.h index 0bf29d438a..ebac1015f8 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -74,6 +74,7 @@ enum xmb_shader_pipeline XMB_SHADER_PIPELINE_WALLPAPER = 0, XMB_SHADER_PIPELINE_SIMPLE_RIBBON, XMB_SHADER_PIPELINE_RIBBON, + XMB_SHADER_PIPELINE_SIMPLE_SNOW, XMB_SHADER_PIPELINE_SNOW, XMB_SHADER_PIPELINE_LAST }; diff --git a/msg_hash.h b/msg_hash.h index 818b6abf94..2395981afc 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -385,9 +385,10 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, - MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, - MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, - MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, + MENU_LABEL(SHADER_PIPELINE_RIBBON_SIMPLIFIED), + MENU_LABEL(SHADER_PIPELINE_RIBBON), + MENU_LABEL(SHADER_PIPELINE_SIMPLE_SNOW), + MENU_LABEL(SHADER_PIPELINE_SNOW), MENU_LABEL(MATERIALUI_MENU_HEADER_OPACITY), MENU_LABEL(MATERIALUI_MENU_FOOTER_OPACITY),