Respackopts/run/resourcepacks/lumi/assets/canvas/shaders/internal/material_main.frag

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
}