137 lines
4.3 KiB
GLSL
137 lines
4.3 KiB
GLSL
/*******************************************************
|
|
* Lumi Lights - Shader pack for Canvas *
|
|
*******************************************************
|
|
* Copyright (c) 2020 spiralhalo and Contributors. *
|
|
* Released WITHOUT WARRANTY under the terms of the *
|
|
* GNU Lesser General Public License version 3 as *
|
|
* published by the Free Software Foundation, Inc. *
|
|
*******************************************************/
|
|
|
|
#include canvas:shaders/internal/header.glsl
|
|
#include canvas:shaders/internal/varying.glsl
|
|
#include canvas:shaders/internal/diffuse.glsl
|
|
#include canvas:shaders/internal/flags.glsl
|
|
#include canvas:shaders/internal/fog.glsl
|
|
#include canvas:shaders/internal/program.glsl
|
|
#include frex:shaders/api/world.glsl
|
|
#include frex:shaders/api/camera.glsl
|
|
#include frex:shaders/api/player.glsl
|
|
#include frex:shaders/api/material.glsl
|
|
#include frex:shaders/api/fragment.glsl
|
|
#include frex:shaders/api/sampler.glsl
|
|
#include frex:shaders/lib/math.glsl
|
|
#include frex:shaders/lib/color.glsl
|
|
#include respackopts:config_supplier
|
|
#include lumi:shaders/api/pbr_frag.glsl
|
|
#include lumi:shaders/api/context_bump.glsl
|
|
#include lumi:shaders/lib/pbr.glsl
|
|
#include lumi:shaders/internal/varying.glsl
|
|
#include lumi:shaders/internal/main_frag.glsl
|
|
#include lumi:shaders/internal/lightsource.glsl
|
|
#include lumi:shaders/internal/tonemap.glsl
|
|
#include lumi:shaders/internal/pbr_shading.glsl
|
|
#include lumi:shaders/internal/phong_shading.glsl
|
|
#include lumi:shaders/internal/skybloom.glsl
|
|
#include lumi:shaders/internal/debug_shading.glsl
|
|
|
|
#include canvas:apitarget
|
|
|
|
/******************************************************
|
|
canvas:shaders/internal/material_main.frag
|
|
******************************************************/
|
|
|
|
void _cv_startFragment(inout frx_FragmentData data) {
|
|
int cv_programId = _cv_fragmentProgramId();
|
|
#include canvas:startfragment
|
|
}
|
|
|
|
void main() {
|
|
#ifndef PROGRAM_BY_UNIFORM
|
|
if (_cv_programDiscard()) {
|
|
discard;
|
|
}
|
|
#endif
|
|
|
|
frx_FragmentData fragData = frx_FragmentData (
|
|
texture2D(frxs_spriteAltas, _cvv_texcoord, _cv_getFlag(_CV_FLAG_UNMIPPED) * -4.0),
|
|
_cvv_color,
|
|
frx_matEmissive() ? 1.0 : 0.0,
|
|
!frx_matDisableDiffuse(),
|
|
!frx_matDisableAo(),
|
|
_cvv_normal,
|
|
_cvv_lightcoord
|
|
);
|
|
|
|
#ifdef lumi_pbr
|
|
pbr_roughness = 1.0;
|
|
pbr_metallic = 0.0;
|
|
pbr_f0 = vec3(-1.0);
|
|
#else
|
|
ww_specular = 0.0;
|
|
#endif
|
|
|
|
_cv_startFragment(fragData);
|
|
|
|
vec4 a = clamp(fragData.spriteColor * fragData.vertexColor, 0.0, 1.0);
|
|
float bloom = fragData.emissivity; // separate bloom from emissivity
|
|
bool translucent = _cv_getFlag(_CV_FLAG_CUTOUT) == 0.0 && a.a < 0.99;
|
|
|
|
if(frx_isGui()){
|
|
#if DIFFUSE_SHADING_MODE != DIFFUSE_MODE_NONE
|
|
if(fragData.diffuse){
|
|
float diffuse = mix(_cvv_diffuse, 1, fragData.emissivity);
|
|
vec3 shading = mix(vec3(0.5, 0.4, 0.8) * diffuse * diffuse, vec3(1.0), diffuse);
|
|
a.rgb *= shading;
|
|
}
|
|
#endif
|
|
} else {
|
|
#if lumi_debugMode != lumi_debugMode_none
|
|
debug_shading(a);
|
|
#else
|
|
float userBrightness;
|
|
float brightnessBase = texture2D(frxs_lightmap, vec2(0.03125, 0.03125)).r;
|
|
if(frx_worldHasSkylight()){
|
|
userBrightness = smoothstep(0.053, 0.135, brightnessBase);
|
|
} else {
|
|
// simplified for both nether and the end
|
|
userBrightness = smoothstep(0.15, 0.63, brightnessBase);
|
|
// if(frx_isWorldTheNether()){
|
|
// userBrightness = smoothstep(0.15/*0.207 no true darkness in nether*/, 0.577, brightnessBase);
|
|
// } else if (frx_isWorldTheEnd(){
|
|
// userBrightness = smoothstep(0.18/*0.271 no true darkness in the end*/, 0.685, brightnessBase);
|
|
// }
|
|
}
|
|
#ifdef lumi_pbr
|
|
pbr_shading(fragData, a, bloom, userBrightness, translucent);
|
|
#else
|
|
phong_shading(fragData, a, bloom, userBrightness, translucent);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
// PERF: varyings better here?
|
|
if (_cv_getFlag(_CV_FLAG_CUTOUT) == 1.0) {
|
|
float t = _cv_getFlag(_CV_FLAG_TRANSLUCENT_CUTOUT) == 1.0 ? _CV_TRANSLUCENT_CUTOUT_THRESHOLD : 0.5;
|
|
|
|
if (a.a < t) {
|
|
discard;
|
|
}
|
|
}
|
|
|
|
// PERF: varyings better here?
|
|
if (_cv_getFlag(_CV_FLAG_FLASH_OVERLAY) == 1.0) {
|
|
a = a * 0.25 + 0.75;
|
|
} else if (_cv_getFlag(_CV_FLAG_HURT_OVERLAY) == 1.0) {
|
|
a = vec4(0.25 + a.r * 0.75, a.g * 0.75, a.b * 0.75, a.a);
|
|
}
|
|
|
|
// TODO: need a separate fog pass?
|
|
gl_FragData[TARGET_BASECOLOR] = _cv_fog(a);
|
|
gl_FragDepth = gl_FragCoord.z;
|
|
|
|
#if TARGET_EMISSIVE > 0
|
|
translucent = translucent && a.a < 0.99;
|
|
gl_FragData[TARGET_EMISSIVE] = vec4(bloom * a.a, 1.0, 0.0, translucent ? step(hdr_skyBloom, bloom) : 1.0);
|
|
#endif
|
|
}
|