123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #ifndef SKY_BLENDING_GLSLF
- #define SKY_BLENDING_GLSLF
- #include <std.glsl>
- #include <blending.glslf>
- /*==============================================================================
- VARS
- ==============================================================================*/
- #var WO_SKYREAL 0
- #var WO_SKYBLEND 0
- #var BLENDTYPE MIX
- #var MTEX_RGBTOINT 0
- #var WOMAP_HORIZ 0
- #var WOMAP_ZENUP 0
- #var WOMAP_ZENDOWN 0
- #var WOMAP_BLEND 0
- #var MTEX_NEGATIVE 0
- /*============================================================================*/
- vec3 col_blending(vec3 col1, vec3 col2, float factor, float facg)
- {
- float fact = factor * facg;
- #if BLENDTYPE == MIX
- return col_blend(col2, col1, fact);
- #elif BLENDTYPE == ADD
- return col_add(col1, col2, fact);
- #elif BLENDTYPE == SUBTRACT
- return col_sub(col1, col2, fact);
- #elif BLENDTYPE == MULTIPLY
- return col_mul(col1, col2, fact);
- #elif BLENDTYPE == SCREEN
- return col_screen(col1, col2, fact);
- #elif BLENDTYPE == OVERLAY
- return col_overlay(col1, col2, fact);
- #elif BLENDTYPE == DIFFERENCE
- return col_diff(col1, col2, fact);
- #elif BLENDTYPE == DIVIDE
- return col_div(col1, col2, fact);
- #elif BLENDTYPE == DARKEN
- return col_dark(col1, col2, fact);
- #elif BLENDTYPE == LIGHTEN
- return col_light(col1, col2, fact);
- #elif BLENDTYPE == HUE
- return col_hue(col2, col1, fact);
- #elif BLENDTYPE == SATURATION
- return col_sat(col2, col1, fact);
- #elif BLENDTYPE == VALUE
- return col_val(col2, col1, fact);
- #elif BLENDTYPE == COLOR
- return col_color(col2, col1, fact);
- #elif BLENDTYPE == SOFT_LIGHT
- return col_soft_light(col2, col1, fact);
- #elif BLENDTYPE == LINEAR_LIGHT
- return col_lin_light(col2, col1, fact);
- #endif
- return vec3(1.0, 0.0, 1.0);
- }
- float val_blending(float val1, float val2, float factor, float facg)
- {
- vec3 col1 = vec3(val1), col2 = vec3(val2);
- float fact = factor * facg;
- #if BLENDTYPE == MIX
- return col_blend(col2, col1, fact).x;
- #elif BLENDTYPE == ADD
- return col_add(col1, col2, fact).x;
- #elif BLENDTYPE == SUBTRACT
- return col_sub(col1, col2, fact).x;
- #elif BLENDTYPE == MULTIPLY
- return val_mul(val1, val2, fact, facg);
- #elif BLENDTYPE == SCREEN
- return val_screen(val1, val2, fact, facg);
- #elif BLENDTYPE == OVERLAY
- return val_overlay(val1, val2, fact, facg);
- #elif BLENDTYPE == DIFFERENCE
- return col_diff(col1, col2, fact).x;
- #elif BLENDTYPE == DIVIDE
- return col_div(col1, col2, fact).x;
- #elif BLENDTYPE == DARKEN
- return col_dark(col1, col2, fact).x;
- #elif BLENDTYPE == LIGHTEN
- return col_light(col1, col2, fact).x;
- #elif BLENDTYPE == SOFT_LIGHT
- return col_soft_light(col2, col1, fact).x;
- #elif BLENDTYPE == LINEAR_LIGHT
- return col_lin_light(col2, col1, fact).x;
- #endif
- return 0.0;
- }
- vec3 blend_sky_color(vec3 hor, vec3 zen, vec4 tcol, float blend, vec3 view)
- {
- float tin = 1.0; // texture.tin does matter later
- tin = tcol.a;
- # if MTEX_RGBTOINT // MTEX_RGBTOINT means RGB flag too
- tin = luma(tcol);
- # endif
- # if MTEX_NEGATIVE
- # if !MTEX_RGBTOINT
- tcol = vec4(vec3(1.0)-tcol.rgb, tcol.a);
- # else
- tin = 1.0 - tin;
- # endif
- # endif
- # if WOMAP_HORIZ || WOMAP_ZENUP || WOMAP_ZENDOWN
- # if MTEX_RGBTOINT
- tcol = vec4(u_sky_tex_color, 1.0);
- # else
- tin = tcol.a;
- # endif
- // skip inverse gamma correction
- # if WOMAP_HORIZ
- hor = col_blending(tcol.rgb, hor, tin, u_sky_tex_fac[1]);
- # endif
- # if WOMAP_ZENUP || WOMAP_ZENDOWN
- float zenfac = 0.0;
- # if WO_SKYREAL
- if (dot(view, vec3(0.0, 0.0, 1.0)) >= 0.0) { // instead of skyflag
- # if WOMAP_ZENUP
- zenfac = u_sky_tex_fac[2];
- # else
- ;
- # endif
- }
- # if WOMAP_ZENDOWN
- else
- zenfac = u_sky_tex_fac[3];
- # endif
- # else // WO_SKYREAL
- # if WOMAP_ZENUP
- zenfac = u_sky_tex_fac[2];
- # elif WOMAP_ZENDOWN
- zenfac = u_sky_tex_fac[3];
- # endif
- # endif
- if (zenfac != 0.0)
- zen = col_blending(tcol.rgb, zen, tin, zenfac);
- # endif
- # endif // WOMAP_HORIZ || WOMAP_ZENUP || WOMAP_ZENDOWN
- # if WOMAP_BLEND
- # if !MTEX_RGBTOINT
- tin = dot(tcol.rgb, vec3(0.2126, 0.7152, 0.0722));
- # endif
- blend = val_blending(u_sky_tex_dvar, blend, tin, u_sky_tex_fac[0]);
- # endif
- # if WO_SKYBLEND
- vec3 sky_color = mix(hor, zen, blend);
- # else
- vec3 sky_color = hor;
- # endif
- return sky_color;
- }
- #endif
|