353 lines
19 KiB
GLSL
353 lines
19 KiB
GLSL
if (mat > 100.5 && mat < 10000.0) {
|
|
if (mat < 152.5) {
|
|
if (mat < 132.5) {
|
|
if (mat < 124.5) {
|
|
if (material == 120.0) { // Redstone Stuff
|
|
#ifndef WORLD_CURVATURE
|
|
float comPos = fract(worldPos.y + cameraPosition.y);
|
|
#else
|
|
float comPos = fract(oldPosition.y + cameraPosition.y);
|
|
#endif
|
|
if (comPos > 0.18) emissive = float((albedo.r > 0.65 && albedo.r > albedo.b * 1.0) || albedo.b > 0.99);
|
|
else emissive = float(albedo.r > albedo.b * 3.0 && albedo.r > 0.5) * 0.125;
|
|
emissive *= max(0.65 - 0.3 * dot(albedo.rgb, vec3(1.0, 1.0, 0.0)), 0.0);
|
|
if (specB > 900.0) { // Observer
|
|
emissive *= float(albedo.r > albedo.g * 1.5);
|
|
}
|
|
}
|
|
else if (material == 124.0) { // Warped Stem+
|
|
#ifdef EMISSIVE_NETHER_STEMS
|
|
float core = float(albedo.r < 0.1);
|
|
float edge = float(albedo.b > 0.35 && albedo.b < 0.401 && core == 0.0);
|
|
emissive = core * 0.195 + 0.035 * edge;
|
|
#endif
|
|
}
|
|
} else {
|
|
if (material == 128.0) { // Crimson Stem+
|
|
#ifdef EMISSIVE_NETHER_STEMS
|
|
emissive = float(albedo.b < 0.16);
|
|
emissive = min(pow2(lAlbedoP * lAlbedoP) * emissive * 3.0, 0.3);
|
|
#endif
|
|
}
|
|
if (material == 130.0) { // Sculk++
|
|
emissive *= max((albedo.b - albedo.r) - 0.1, 0.0) * 0.5
|
|
+ 100.0 * max(albedo.g - albedo.b, 0.0) * float(albedo.r < albedo.b - 0.1)
|
|
;
|
|
}
|
|
else if (material == 132.0) { // Command Blocks
|
|
#ifndef WORLD_CURVATURE
|
|
vec3 comPos = fract(worldPos.xyz + cameraPosition.xyz);
|
|
#else
|
|
vec3 comPos = fract(oldPosition.xyz + cameraPosition.xyz);
|
|
#endif
|
|
comPos = abs(comPos - vec3(0.5));
|
|
float comPosM = min(max(comPos.x, comPos.y), min(max(comPos.x, comPos.z), max(comPos.y, comPos.z)));
|
|
emissive = 0.0;
|
|
if (comPosM < 0.1882) { // Command Block Center
|
|
vec3 dif = vec3(albedo.r - albedo.b, albedo.r - albedo.g, albedo.b - albedo.g);
|
|
dif = abs(dif);
|
|
emissive = float(max(dif.r, max(dif.g, dif.b)) > 0.1) * 25.0;
|
|
emissive *= float(albedo.r > 0.44 || albedo.g > 0.29);
|
|
|
|
if (CheckForColor(albedo.rgb, vec3(207, 166, 139)) // Fix for Iris' precision
|
|
|| CheckForColor(albedo.rgb, vec3(201, 143, 107))
|
|
|| CheckForColor(albedo.rgb, vec3(161, 195, 180))
|
|
|| CheckForColor(albedo.rgb, vec3(131, 181, 145))
|
|
|| CheckForColor(albedo.rgb, vec3(155, 139, 207))
|
|
|| CheckForColor(albedo.rgb, vec3(135, 121, 181))) emissive = 0.0;
|
|
|
|
#ifdef ALTERNATIVE_COMMAND_BLOCK
|
|
if (emissive > 0.01) {
|
|
albedo.rgb *= vec3(0.88, 1.32, 1.9);
|
|
albedo.g = sqrt1(albedo.g) * 0.6;
|
|
albedo.rgb *= albedo.rgb * 2.0;
|
|
}
|
|
#endif
|
|
}
|
|
vec3 dif = abs(vec3(albedo.r - albedo.g, albedo.g - albedo.b, albedo.r - albedo.b));
|
|
float maxDif = max(dif.r, max(dif.g, dif.b));
|
|
smoothness = 0.38;
|
|
if (maxDif < 0.05) smoothness = 0.6;
|
|
metalness = 1.0;
|
|
}
|
|
}
|
|
} else {
|
|
if (mat < 144.5) {
|
|
if (material == 136.0) { // Snowy Grass Block
|
|
if (lAlbedoP > 1.0) smoothness = lAlbedoP * lAlbedoP * 0.165;
|
|
else metalness = 0.003;
|
|
}
|
|
else if (material == 140.0) { // Dragon Egg, Spawner
|
|
emissive = float(albedo.r + albedo.b > albedo.g * 30.0 && lAlbedoP < 0.6);
|
|
emissive *= 8.0 + float(lAlbedoP < 0.4) * 100.0;
|
|
if (albedo.b + albedo.g > albedo.r * 2.0 && lAlbedoP > 0.2) { // Spawner Metal
|
|
smoothness = 0.385;
|
|
metalness = 0.8;
|
|
}
|
|
if (max(abs(albedo.r - albedo.b), abs(albedo.g - albedo.r)) < 0.01) { // Dragon Egg Subtle Emission
|
|
emissive = 2.5 * float(lAlbedoP < 0.2);
|
|
}
|
|
}
|
|
else if (material == 144.0) // Furnaces Lit
|
|
emissive = 0.75 * float(albedo.r * albedo.r > albedo.b * 4.0 || (albedo.r > 0.9 && (albedo.r > albedo.b || albedo.r > 0.99)));
|
|
} else {
|
|
if (material == 148.0) // Torch, Soul Torch
|
|
emissive = float(albedo.r > 0.9 || albedo.b > 0.65) * (1.4 - albedo.b * 1.05);
|
|
/* {
|
|
#ifndef WORLD_CURVATURE
|
|
vec3 comPos = fract(worldPos.xyz + cameraPosition.xyz);
|
|
#else
|
|
vec3 comPos = fract(oldPosition.xyz + cameraPosition.xyz);
|
|
#endif
|
|
comPos = abs(comPos - vec3(0.5));
|
|
float comPosM = max(max(comPos.x, comPos.y), comPos.z);
|
|
emissive = clamp(1.0 - comPosM * 2.0, 0.0, 1.0);
|
|
if (emissive > 0.001) {
|
|
emissive *= emissive;
|
|
emissive *= emissive;
|
|
emissive *= pow(lAlbedoP * 0.7, 4.0) * 0.75;
|
|
emissive = min(emissive, 0.15);
|
|
} else emissive = 0.0;
|
|
lightmap.x = min(emissive * 10.0 + 0.6, 1.05);
|
|
albedo.rgb = pow(albedo.rgb, vec3(1.4 - lightmap.x));
|
|
} */
|
|
else if (material == 152.0) { // Obsidian++
|
|
smoothness = max(smoothness, 0.375);
|
|
if (specB > 0.5) { // Crying Obsidian, Respawn Anchor
|
|
emissive = (albedo.b - albedo.r) * albedo.r * 6.0;
|
|
emissive *= emissive * emissive;
|
|
emissive = clamp(emissive, 0.05, 1.0);
|
|
if (lAlbedoP > 1.6 || albedo.r > albedo.b * 1.7) emissive = 1.0;
|
|
} else {
|
|
if (lAlbedoP > 0.75) { // Enchanting Table Diamond
|
|
f0 = smoothness;
|
|
smoothness = 0.9 - f0 * 0.1;
|
|
metalness = 0.0;
|
|
}
|
|
if (albedo.r > albedo.g + albedo.b) { // Enchanting Table Cloth
|
|
smoothness = max(smoothness - 0.45, 0.0);
|
|
metalness = 0.0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (mat < 170.5) {
|
|
if (mat < 162.5) {
|
|
if (material == 156.0) { // Campfires, Powered Lever
|
|
if (albedo.g + albedo.b > albedo.r * 2.3 && albedo.g > 0.38 && albedo.g > albedo.b * 0.9) emissive = 0.09;
|
|
if (albedo.r > albedo.b * 3.0 || albedo.r > 0.8) emissive = 0.65;
|
|
emissive *= max(1.0 - albedo.b + albedo.r, 0.0);
|
|
emissive *= lAlbedoP;
|
|
}
|
|
else if (material == 160.0) { // Cauldron, Hopper, Anvils
|
|
if (color.r < 0.99) { // Cauldron Water
|
|
cauldron = 1.0, smoothness = 1.0, metalness = 0.0;
|
|
skymapMod = lmCoord.y * 0.475 + 0.515;
|
|
#if defined REFLECTION_RAIN && defined RAIN_REF_BIOME_CHECK
|
|
noRain = 1.0;
|
|
#endif
|
|
#if WATER_TYPE == 0
|
|
albedo.rgb = waterColor.rgb;
|
|
#elif WATER_TYPE == 1
|
|
albedo.rgb = pow(albedo.rgb, vec3(1.3));
|
|
#else
|
|
albedo.rgb = vec3(0.4, 0.5, 0.4) * (pow(albedo.rgb, vec3(2.8)) + 4 * waterColor.rgb * pow(albedo.r, 1.8)
|
|
+ 16 * waterColor.rgb * pow(albedo.g, 1.8) + 4 * waterColor.rgb * pow(albedo.b, 1.8));
|
|
albedo.rgb = pow(albedo.rgb * 1.5, vec3(0.5, 0.6, 0.5)) * 0.6;
|
|
albedo.rgb *= 1 + length(albedo.rgb) * pow(WATER_OPACITY, 32.0) * 2.0;
|
|
#endif
|
|
#ifdef NORMAL_MAPPING
|
|
vec2 cauldronCoord1 = texCoord + fract(frametime * 0.003);
|
|
float cauldronNoise1 = texture2D(noisetex, cauldronCoord1).r;
|
|
vec2 cauldronCoord2 = texCoord - fract(frametime * 0.003);
|
|
float cauldronNoise2 = texture2D(noisetex, cauldronCoord2).r;
|
|
float waveFactor = 0.027 + 0.065 * lightmap.y;
|
|
normalMap.xy += (0.5 * waveFactor) * (cauldronNoise1 * cauldronNoise2 - 0.3);
|
|
albedo.rgb *= (1.0 - waveFactor * 0.5) + waveFactor * cauldronNoise1 * cauldronNoise2;
|
|
#endif
|
|
}
|
|
#if MC_VERSION >= 11700
|
|
else if (albedo.r * 1.5 > albedo.g + albedo.b) { // Cauldron Lava
|
|
metalness = 0.0;
|
|
smoothness = 0.0;
|
|
|
|
#ifndef WORLD_CURVATURE
|
|
float comPos = fract(worldPos.y + cameraPosition.y);
|
|
#else
|
|
float comPos = fract(oldPosition.y + cameraPosition.y);
|
|
#endif
|
|
comPos = fract(comPos);
|
|
if (comPos > 0.2 && comPos < 0.99) {
|
|
emissive = 1.0;
|
|
albedo.rgb *= LAVA_INTENSITY * 0.9;
|
|
}
|
|
}
|
|
else if (dot(albedo.rgb, albedo.rgb) > 2.7) { // Cauldron Powder Snow
|
|
metalness = 0.0;
|
|
smoothness = pow(lAlbedoP, 1.8037) * 0.185;
|
|
smoothness = min(smoothness, 1.0);
|
|
}
|
|
#endif
|
|
}
|
|
else if (material == 162.0) { // Glowstone, Magma Block
|
|
#include "/lib/other/mipLevel.glsl"
|
|
|
|
emissive = pow(lAlbedoP, specB) * fract(specB) * 20.0;
|
|
|
|
emissive += miplevel * 2.5;
|
|
}
|
|
} else {
|
|
if (material == 164.0) { // Chorus Plant, Chorus Flower Age 5
|
|
if (albedo.g > 0.55 && albedo.r < albedo.g * 1.1) {
|
|
emissive = 1.0;
|
|
}
|
|
}
|
|
else if (material == 168.0) { // Overworld Ore Handling Except Redstone
|
|
float stoneDif = max(abs(albedo.r - albedo.g), max(abs(albedo.r - albedo.b), abs(albedo.g - albedo.b)));
|
|
float brightFactor = max(lAlbedoP - 1.5, 0.0);
|
|
float ore = max(max(stoneDif - 0.175 + specG, 0.0), brightFactor);
|
|
#ifdef EMISSIVE_ORES
|
|
emissive *= sqrt4(ore) * 0.15 * ORE_EMISSION;
|
|
#endif
|
|
metalness = 0.0;
|
|
|
|
#if !defined EMISSIVE_ORES || !defined EMISSIVE_IRON_ORE
|
|
if (abs(specG - 0.07) < 0.0001) {
|
|
float oreM = min(pow2(ore * ore) * 300.0, 1.0);
|
|
smoothness = mix(smoothness, 1.0, oreM);
|
|
metalness = mix(metalness, 0.8, sqrt3(oreM));
|
|
}
|
|
#endif
|
|
#if !defined EMISSIVE_ORES || !defined EMISSIVE_COPPER_ORE
|
|
if (abs(specG - 0.1) < 0.0001) {
|
|
float oreM = sqrt3(min(ore * 0.25, 1.0));
|
|
smoothness = mix(smoothness, 0.5, oreM);
|
|
if (oreM > 0.01) metalness = 0.8;
|
|
}
|
|
#endif
|
|
#if !defined EMISSIVE_ORES || !defined EMISSIVE_GOLD_ORE
|
|
if (abs(specG - 0.002) < 0.0001) {
|
|
float oreM = min(pow2(ore * ore) * 40.0, 1.0);
|
|
smoothness = mix(smoothness, 0.5, oreM);
|
|
if (oreM > 0.01) metalness = 0.8;
|
|
}
|
|
#endif
|
|
#if !defined EMISSIVE_ORES || !defined EMISSIVE_EMERALD_ORE
|
|
if (abs(specG - 0.0015) < 0.0001) {
|
|
if (ore > 0.01) {
|
|
float oreM = 1.0 - min(ore * 0.75, 1.0);
|
|
smoothness = mix(smoothness, 1.0, oreM);
|
|
extraSpecularM = 1.0;
|
|
}
|
|
}
|
|
#endif
|
|
#if !defined EMISSIVE_ORES || !defined EMISSIVE_DIAMOND_ORE
|
|
if (abs(specG - 0.001) < 0.0001) {
|
|
if (ore > 0.01) {
|
|
float oreM = 1.0 - min(ore, 1.0);
|
|
smoothness = mix(smoothness, 1.0, oreM);
|
|
extraSpecularM = 1.0;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if (material == 170.0) { // Block of Amethyst++
|
|
smoothness = min(pow((max(1.73 - lAlbedoP, 0.0) + 1.0), 0.81) * 0.5, 1.0);
|
|
|
|
#ifdef EMISSIVE_AMETHYST_BUDS
|
|
#ifndef WORLD_CURVATURE
|
|
vec3 comPos = fract(worldPos.xyz + cameraPosition.xyz);
|
|
#else
|
|
vec3 comPos = fract(oldPosition.xyz + cameraPosition.xyz);
|
|
#endif
|
|
comPos = abs(comPos - vec3(0.5));
|
|
float comPosM = max(max(comPos.x, comPos.y), comPos.z);
|
|
emissive = clamp(1.0 - comPosM * 2.0, 0.0, 1.0);
|
|
if (emissive > 0.001) {
|
|
float orangeFactor = sqrt1(emissive * sqrt2(1.0 - lmCoord.x));
|
|
emissive *= emissive;
|
|
emissive *= emissive;
|
|
emissive *= pow(lAlbedoP * 0.7, 4.0) * 0.75;
|
|
emissive = min(emissive, 0.15) * 1.1;
|
|
albedo.rgb = pow(albedo.rgb, mix(vec3(1.0), vec3(1.0, 1.0, 2.0), orangeFactor));
|
|
float whiteFactor = pow(clamp(albedo.g * (1.0 + emissive), 0.0, 1.0), 10.0);
|
|
albedo.rgb = mix(albedo.rgb, vec3(1.0), whiteFactor);
|
|
} else emissive = 0.0;
|
|
#endif
|
|
}
|
|
}
|
|
} else {
|
|
if (mat < 176.5) {
|
|
if (material == 172.0) { // Wet Farmland
|
|
if (lAlbedoP > 0.3) smoothness = lAlbedoP * 0.7;
|
|
else smoothness = lAlbedoP * 2.7;
|
|
smoothness = min(smoothness, 1.0);
|
|
}
|
|
else if (material == 174.0) { // Emissive Redstone Ores
|
|
float stoneDif = max(abs(albedo.r - albedo.g), max(abs(albedo.r - albedo.b), abs(albedo.g - albedo.b)));
|
|
float brightFactor = max(lAlbedoP - 1.5, 0.0);
|
|
float ore = max(max(stoneDif - 0.175 + specG, 0.0), brightFactor);
|
|
emissive *= sqrt4(ore) * 0.11 * ORE_EMISSION;
|
|
metalness = 0.0;
|
|
|
|
// Fix white pixels
|
|
if (emissive > 0.01) {
|
|
float whitePixelFactor = max(lAlbedoP * lAlbedoP * 2.2, 1.0);
|
|
albedo.rgb = pow(albedo.rgb, vec3(whitePixelFactor));
|
|
}
|
|
}
|
|
else if (material == 176.0) { // Beacon
|
|
#ifndef WORLD_CURVATURE
|
|
vec3 comPos = fract(worldPos.xyz + cameraPosition.xyz);
|
|
#else
|
|
vec3 comPos = fract(oldPosition.xyz + cameraPosition.xyz);
|
|
#endif
|
|
comPos = abs(comPos - vec3(0.5));
|
|
float comPosM = max(max(comPos.x, comPos.y), comPos.z);
|
|
if (comPosM < 0.4 && albedo.b > 0.5) { // Beacon Core
|
|
albedo.rgb = vec3(0.35, 1.0, 0.975);
|
|
if (lAlbedoP > 1.5) albedo.rgb = vec3(1.0);
|
|
else if (lAlbedoP > 1.3) albedo.rgb = vec3(0.35, 1.0, 0.975);
|
|
else if (lAlbedoP > 1.15) albedo.rgb *= 0.86;
|
|
else albedo.rgb *= 0.78;
|
|
emissive = 1.5;
|
|
}
|
|
}
|
|
} else {
|
|
if (material == 180.0) { // End Rod
|
|
if (lAlbedoP > 1.3) {
|
|
smoothness = 0.0;
|
|
emissive = 0.4;
|
|
}
|
|
}
|
|
else if (material == 184.0) { // Rails
|
|
if (albedo.r > albedo.g * 2.0 + albedo.b) {
|
|
if (lAlbedoP > 0.45) { // Rail Redstone Lit
|
|
emissive = lAlbedoP;
|
|
} else { // Rail Redstone Unlit
|
|
smoothness = 0.4;
|
|
metalness = 1.0;
|
|
}
|
|
} else {
|
|
if (albedo.r > albedo.g + albedo.b || abs(albedo.r - albedo.b) < 0.1) { // Rail Gold, Rail Iron
|
|
smoothness = 0.4;
|
|
metalness = 1.0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifdef EMISSIVE_NETHER_ORES
|
|
if (specB < -9.0) {
|
|
emissive = float(albedo.r + albedo.g > albedo.b * 2.0 && albedo.g > albedo.b * (1.2 - albedo.g * 0.5));
|
|
if (abs(albedo.g - albedo.b) < 0.1) emissive *= float(albedo.b > 0.35 || albedo.b < 0.05); // Eliminate Some Pixels On Quartz Ore
|
|
emissive *= albedo.r * 0.05 * ORE_EMISSION;
|
|
if (emissive > 0.01) // Desaturate Some Red-Looking Pixels
|
|
albedo.rgb = mix(albedo.rgb, vec3(dot(albedo.rgb, vec3(0.4, 0.5, 0.07))), clamp((albedo.r - albedo.g) * 2.0, 0.0, 0.3));
|
|
}
|
|
#endif |