From 0f859671ea7a7e59b13c68584dbec477e4516f9e Mon Sep 17 00:00:00 2001 From: Rbanh Date: Sat, 22 Jun 2024 15:15:55 -0400 Subject: [PATCH] first commit --- README.md | 1 + shaders/block.properties | 238 ++ shaders/entity.properties | 13 + shaders/item.properties | 26 + shaders/lang/en_US.lang | 983 +++++++ shaders/lib/antialiasing/fxaa.glsl | 166 ++ shaders/lib/antialiasing/taa.glsl | 182 ++ shaders/lib/atmospherics/clouds.glsl | 385 +++ shaders/lib/atmospherics/fog.glsl | 190 ++ shaders/lib/atmospherics/sky.glsl | 77 + shaders/lib/atmospherics/sunmoon.glsl | 85 + shaders/lib/atmospherics/volumetricLight.glsl | 162 ++ shaders/lib/atmospherics/waterFog.glsl | 28 + shaders/lib/atmospherics/weatherDensity.glsl | 14 + shaders/lib/color/auroraColor.glsl | 4 + shaders/lib/color/blocklightColor.glsl | 2 + shaders/lib/color/dimensionColor.glsl | 14 + shaders/lib/color/endColor.glsl | 2 + shaders/lib/color/lightColor.glsl | 69 + shaders/lib/color/netherColor.glsl | 28 + shaders/lib/color/skyColor.glsl | 15 + shaders/lib/color/specularColor.glsl | 32 + shaders/lib/color/waterColor.glsl | 5 + shaders/lib/lighting/ambientOcclusion.glsl | 95 + shaders/lib/lighting/coloredBlocklight.glsl | 35 + shaders/lib/lighting/forwardLighting.glsl | 153 + shaders/lib/lighting/shadows.glsl | 308 ++ .../materialHandling/terrainMaterials.glsl | 2548 +++++++++++++++++ .../others/endPortalEffect.glsl | 100 + .../specificMaterials/others/signText.glsl | 15 + .../planks/acaciaPlanks.glsl | 6 + .../planks/bambooPlanks.glsl | 3 + .../specificMaterials/planks/birchPlanks.glsl | 6 + .../planks/cherryPlanks.glsl | 6 + .../planks/crimsonPlanks.glsl | 6 + .../planks/darkOakPlanks.glsl | 6 + .../planks/junglePlanks.glsl | 7 + .../planks/mangrovePlanks.glsl | 3 + .../specificMaterials/planks/oakPlanks.glsl | 7 + .../planks/sprucePlanks.glsl | 7 + .../planks/warpedPlanks.glsl | 6 + .../specificMaterials/terrain/anvil.glsl | 6 + .../specificMaterials/terrain/blackstone.glsl | 2 + .../terrain/cobblestone.glsl | 3 + .../terrain/copperBlock.glsl | 10 + .../specificMaterials/terrain/copperBulb.glsl | 20 + .../specificMaterials/terrain/coral.glsl | 7 + .../terrain/cryingObsidian.glsl | 11 + .../specificMaterials/terrain/deepslate.glsl | 8 + .../terrain/diamondBlock.glsl | 25 + .../specificMaterials/terrain/dirt.glsl | 1 + .../terrain/emeraldBlock.glsl | 14 + .../terrain/endPortalFrame.glsl | 3 + .../specificMaterials/terrain/endStone.glsl | 7 + .../specificMaterials/terrain/froglights.glsl | 10 + .../specificMaterials/terrain/goldBlock.glsl | 20 + .../specificMaterials/terrain/ironBlock.glsl | 14 + .../terrain/lanternMetal.glsl | 6 + .../specificMaterials/terrain/lapisBlock.glsl | 6 + .../specificMaterials/terrain/lava.glsl | 30 + .../specificMaterials/terrain/leaves.glsl | 26 + .../terrain/netheriteBlock.glsl | 8 + .../specificMaterials/terrain/netherrack.glsl | 7 + .../specificMaterials/terrain/oakWood.glsl | 3 + .../specificMaterials/terrain/obsidian.glsl | 13 + .../specificMaterials/terrain/pumpkin.glsl | 1 + .../terrain/quartzBlock.glsl | 19 + .../terrain/rawCopperBlock.glsl | 4 + .../terrain/rawGoldBlock.glsl | 3 + .../terrain/rawIronBlock.glsl | 3 + .../terrain/redstoneBlock.glsl | 11 + .../terrain/redstoneTorch.glsl | 15 + .../specificMaterials/terrain/snow.glsl | 12 + .../specificMaterials/terrain/stone.glsl | 7 + shaders/lib/post/lensFlare.glsl | 96 + shaders/lib/post/outline.glsl | 78 + shaders/lib/reflections/complexFresnel.glsl | 47 + shaders/lib/reflections/rainPuddles.glsl | 86 + shaders/lib/reflections/raytrace.glsl | 89 + shaders/lib/reflections/roughReflections.glsl | 67 + .../lib/reflections/simpleReflections.glsl | 65 + shaders/lib/settings.glsl | 488 ++++ shaders/lib/surface/directionalLightmap.glsl | 25 + shaders/lib/surface/generatedNormals.glsl | 85 + shaders/lib/surface/ggx.glsl | 108 + shaders/lib/surface/materialDeferred.glsl | 18 + shaders/lib/surface/materialGbuffers.glsl | 130 + .../blockEntityMaterials.glsl | 105 + shaders/lib/surface/parallax.glsl | 76 + shaders/lib/util/commonFunctions.glsl | 15 + shaders/lib/util/dFdxdFdy.glsl | 7 + shaders/lib/util/dither.glsl | 16 + shaders/lib/util/encode.glsl | 15 + shaders/lib/util/jitter.glsl | 27 + shaders/lib/util/outlineDepth.glsl | 20 + shaders/lib/util/outlineMask.glsl | 24 + shaders/lib/util/outlineOffset.glsl | 14 + shaders/lib/util/spaceConversion.glsl | 20 + shaders/lib/vertex/waving.glsl | 133 + shaders/lib/vertex/worldCurvature.glsl | 3 + shaders/program/composite.glsl | 336 +++ shaders/program/composite1.glsl | 102 + shaders/program/composite2.glsl | 109 + shaders/program/composite3.glsl | 151 + shaders/program/composite4.glsl | 87 + shaders/program/composite5.glsl | 429 +++ shaders/program/composite6.glsl | 61 + shaders/program/composite7.glsl | 80 + shaders/program/deferred.glsl | 77 + shaders/program/deferred1.glsl | 545 ++++ shaders/program/dh_terrain.glsl | 290 ++ shaders/program/dh_water.glsl | 535 ++++ shaders/program/final.glsl | 123 + shaders/program/gbuffers_armor_glint.glsl | 86 + shaders/program/gbuffers_basic.glsl | 247 ++ shaders/program/gbuffers_beaconbeam.glsl | 104 + shaders/program/gbuffers_block.glsl | 522 ++++ shaders/program/gbuffers_clouds.glsl | 155 + shaders/program/gbuffers_damagedblock.glsl | 79 + shaders/program/gbuffers_entities.glsl | 459 +++ .../program/gbuffers_entities_glowing.glsl | 454 +++ shaders/program/gbuffers_hand.glsl | 467 +++ shaders/program/gbuffers_skybasic.glsl | 166 ++ shaders/program/gbuffers_skytextured.glsl | 175 ++ shaders/program/gbuffers_spidereyes.glsl | 92 + shaders/program/gbuffers_terrain.glsl | 709 +++++ shaders/program/gbuffers_textured.glsl | 316 ++ shaders/program/gbuffers_water.glsl | 775 +++++ shaders/program/gbuffers_weather.glsl | 126 + shaders/program/shadow.glsl | 243 ++ shaders/program/template.glsl | 55 + shaders/shaders.properties | 220 ++ shaders/tex/dirt.png | Bin 0 -> 83276 bytes shaders/tex/dirt.png.mcmeta | 7 + shaders/tex/noise.png | Bin 0 -> 678019 bytes shaders/tex/noise.png.mcmeta | 7 + shaders/world-1/composite.fsh | 11 + shaders/world-1/composite.vsh | 13 + shaders/world-1/composite2.fsh | 13 + shaders/world-1/composite2.vsh | 11 + shaders/world-1/composite3.fsh | 13 + shaders/world-1/composite3.vsh | 11 + shaders/world-1/composite4.fsh | 11 + shaders/world-1/composite4.vsh | 11 + shaders/world-1/composite5.fsh | 13 + shaders/world-1/composite5.vsh | 11 + shaders/world-1/composite6.fsh | 13 + shaders/world-1/composite6.vsh | 11 + shaders/world-1/composite7.fsh | 13 + shaders/world-1/composite7.vsh | 11 + shaders/world-1/deferred.fsh | 13 + shaders/world-1/deferred.vsh | 11 + shaders/world-1/deferred1.fsh | 13 + shaders/world-1/deferred1.vsh | 11 + shaders/world-1/dh_terrain.fsh | 13 + shaders/world-1/dh_terrain.vsh | 11 + shaders/world-1/dh_water.fsh | 13 + shaders/world-1/dh_water.vsh | 11 + shaders/world-1/final.fsh | 13 + shaders/world-1/final.vsh | 11 + shaders/world-1/gbuffers_armor_glint.fsh | 11 + shaders/world-1/gbuffers_armor_glint.vsh | 11 + shaders/world-1/gbuffers_basic.fsh | 11 + shaders/world-1/gbuffers_basic.vsh | 11 + shaders/world-1/gbuffers_beaconbeam.fsh | 11 + shaders/world-1/gbuffers_beaconbeam.vsh | 11 + shaders/world-1/gbuffers_block.fsh | 13 + shaders/world-1/gbuffers_block.vsh | 11 + shaders/world-1/gbuffers_clouds.fsh | 11 + shaders/world-1/gbuffers_clouds.vsh | 11 + shaders/world-1/gbuffers_damagedblock.fsh | 11 + shaders/world-1/gbuffers_damagedblock.vsh | 11 + shaders/world-1/gbuffers_entities.fsh | 13 + shaders/world-1/gbuffers_entities.vsh | 11 + shaders/world-1/gbuffers_entities_glowing.fsh | 13 + shaders/world-1/gbuffers_entities_glowing.vsh | 11 + shaders/world-1/gbuffers_hand.fsh | 13 + shaders/world-1/gbuffers_hand.vsh | 11 + shaders/world-1/gbuffers_spidereyes.fsh | 11 + shaders/world-1/gbuffers_spidereyes.vsh | 11 + shaders/world-1/gbuffers_terrain.fsh | 13 + shaders/world-1/gbuffers_terrain.vsh | 11 + shaders/world-1/gbuffers_textured.fsh | 11 + shaders/world-1/gbuffers_textured.vsh | 11 + shaders/world-1/gbuffers_water.fsh | 13 + shaders/world-1/gbuffers_water.vsh | 11 + shaders/world-1/gbuffers_weather.fsh | 11 + shaders/world-1/gbuffers_weather.vsh | 11 + shaders/world0/composite.fsh | 13 + shaders/world0/composite.vsh | 11 + shaders/world0/composite1.fsh | 13 + shaders/world0/composite1.vsh | 11 + shaders/world0/composite2.fsh | 13 + shaders/world0/composite2.vsh | 11 + shaders/world0/composite3.fsh | 13 + shaders/world0/composite3.vsh | 11 + shaders/world0/composite4.fsh | 11 + shaders/world0/composite4.vsh | 11 + shaders/world0/composite5.fsh | 13 + shaders/world0/composite5.vsh | 11 + shaders/world0/composite6.fsh | 13 + shaders/world0/composite6.vsh | 11 + shaders/world0/composite7.fsh | 13 + shaders/world0/composite7.vsh | 11 + shaders/world0/deferred.fsh | 13 + shaders/world0/deferred.vsh | 11 + shaders/world0/deferred1.fsh | 13 + shaders/world0/deferred1.vsh | 11 + shaders/world0/dh_terrain.fsh | 13 + shaders/world0/dh_terrain.vsh | 11 + shaders/world0/dh_water.fsh | 13 + shaders/world0/dh_water.vsh | 11 + shaders/world0/final.fsh | 13 + shaders/world0/final.vsh | 11 + shaders/world0/gbuffers_armor_glint.fsh | 11 + shaders/world0/gbuffers_armor_glint.vsh | 11 + shaders/world0/gbuffers_basic.fsh | 11 + shaders/world0/gbuffers_basic.vsh | 11 + shaders/world0/gbuffers_beaconbeam.fsh | 11 + shaders/world0/gbuffers_beaconbeam.vsh | 11 + shaders/world0/gbuffers_block.fsh | 13 + shaders/world0/gbuffers_block.vsh | 11 + shaders/world0/gbuffers_clouds.fsh | 11 + shaders/world0/gbuffers_clouds.vsh | 11 + shaders/world0/gbuffers_damagedblock.fsh | 11 + shaders/world0/gbuffers_damagedblock.vsh | 11 + shaders/world0/gbuffers_entities.fsh | 13 + shaders/world0/gbuffers_entities.vsh | 11 + shaders/world0/gbuffers_entities_glowing.fsh | 13 + shaders/world0/gbuffers_entities_glowing.vsh | 11 + shaders/world0/gbuffers_hand.fsh | 13 + shaders/world0/gbuffers_hand.vsh | 11 + shaders/world0/gbuffers_skybasic.fsh | 11 + shaders/world0/gbuffers_skybasic.vsh | 11 + shaders/world0/gbuffers_skytextured.fsh | 11 + shaders/world0/gbuffers_skytextured.vsh | 11 + shaders/world0/gbuffers_spidereyes.fsh | 11 + shaders/world0/gbuffers_spidereyes.vsh | 11 + shaders/world0/gbuffers_terrain.fsh | 13 + shaders/world0/gbuffers_terrain.vsh | 11 + shaders/world0/gbuffers_textured.fsh | 11 + shaders/world0/gbuffers_textured.vsh | 11 + shaders/world0/gbuffers_water.fsh | 13 + shaders/world0/gbuffers_water.vsh | 11 + shaders/world0/gbuffers_weather.fsh | 11 + shaders/world0/gbuffers_weather.vsh | 11 + shaders/world0/shadow.fsh | 11 + shaders/world0/shadow.vsh | 11 + shaders/world1/composite.fsh | 13 + shaders/world1/composite.vsh | 11 + shaders/world1/composite1.fsh | 13 + shaders/world1/composite1.vsh | 11 + shaders/world1/composite2.fsh | 13 + shaders/world1/composite2.vsh | 11 + shaders/world1/composite3.fsh | 13 + shaders/world1/composite3.vsh | 11 + shaders/world1/composite4.fsh | 11 + shaders/world1/composite4.vsh | 11 + shaders/world1/composite5.fsh | 13 + shaders/world1/composite5.vsh | 11 + shaders/world1/composite6.fsh | 13 + shaders/world1/composite6.vsh | 11 + shaders/world1/composite7.fsh | 13 + shaders/world1/composite7.vsh | 11 + shaders/world1/deferred.fsh | 13 + shaders/world1/deferred.vsh | 11 + shaders/world1/deferred1.fsh | 13 + shaders/world1/deferred1.vsh | 11 + shaders/world1/dh_terrain.fsh | 13 + shaders/world1/dh_terrain.vsh | 11 + shaders/world1/dh_water.fsh | 13 + shaders/world1/dh_water.vsh | 11 + shaders/world1/final.fsh | 13 + shaders/world1/final.vsh | 11 + shaders/world1/gbuffers_armor_glint.fsh | 11 + shaders/world1/gbuffers_armor_glint.vsh | 11 + shaders/world1/gbuffers_basic.fsh | 11 + shaders/world1/gbuffers_basic.vsh | 11 + shaders/world1/gbuffers_beaconbeam.fsh | 11 + shaders/world1/gbuffers_beaconbeam.vsh | 11 + shaders/world1/gbuffers_block.fsh | 13 + shaders/world1/gbuffers_block.vsh | 11 + shaders/world1/gbuffers_clouds.fsh | 11 + shaders/world1/gbuffers_clouds.vsh | 11 + shaders/world1/gbuffers_damagedblock.fsh | 11 + shaders/world1/gbuffers_damagedblock.vsh | 11 + shaders/world1/gbuffers_entities.fsh | 13 + shaders/world1/gbuffers_entities.vsh | 11 + shaders/world1/gbuffers_entities_glowing.fsh | 13 + shaders/world1/gbuffers_entities_glowing.vsh | 11 + shaders/world1/gbuffers_hand.fsh | 13 + shaders/world1/gbuffers_hand.vsh | 11 + shaders/world1/gbuffers_skybasic.fsh | 11 + shaders/world1/gbuffers_skybasic.vsh | 11 + shaders/world1/gbuffers_skytextured.fsh | 11 + shaders/world1/gbuffers_skytextured.vsh | 11 + shaders/world1/gbuffers_spidereyes.fsh | 11 + shaders/world1/gbuffers_spidereyes.vsh | 11 + shaders/world1/gbuffers_terrain.fsh | 13 + shaders/world1/gbuffers_terrain.vsh | 11 + shaders/world1/gbuffers_textured.fsh | 11 + shaders/world1/gbuffers_textured.vsh | 11 + shaders/world1/gbuffers_water.fsh | 13 + shaders/world1/gbuffers_water.vsh | 11 + shaders/world1/gbuffers_weather.fsh | 11 + shaders/world1/gbuffers_weather.vsh | 11 + shaders/world1/shadow.fsh | 11 + shaders/world1/shadow.vsh | 11 + 308 files changed, 18617 insertions(+) create mode 100644 README.md create mode 100644 shaders/block.properties create mode 100644 shaders/entity.properties create mode 100644 shaders/item.properties create mode 100644 shaders/lang/en_US.lang create mode 100644 shaders/lib/antialiasing/fxaa.glsl create mode 100644 shaders/lib/antialiasing/taa.glsl create mode 100644 shaders/lib/atmospherics/clouds.glsl create mode 100644 shaders/lib/atmospherics/fog.glsl create mode 100644 shaders/lib/atmospherics/sky.glsl create mode 100644 shaders/lib/atmospherics/sunmoon.glsl create mode 100644 shaders/lib/atmospherics/volumetricLight.glsl create mode 100644 shaders/lib/atmospherics/waterFog.glsl create mode 100644 shaders/lib/atmospherics/weatherDensity.glsl create mode 100644 shaders/lib/color/auroraColor.glsl create mode 100644 shaders/lib/color/blocklightColor.glsl create mode 100644 shaders/lib/color/dimensionColor.glsl create mode 100644 shaders/lib/color/endColor.glsl create mode 100644 shaders/lib/color/lightColor.glsl create mode 100644 shaders/lib/color/netherColor.glsl create mode 100644 shaders/lib/color/skyColor.glsl create mode 100644 shaders/lib/color/specularColor.glsl create mode 100644 shaders/lib/color/waterColor.glsl create mode 100644 shaders/lib/lighting/ambientOcclusion.glsl create mode 100644 shaders/lib/lighting/coloredBlocklight.glsl create mode 100644 shaders/lib/lighting/forwardLighting.glsl create mode 100644 shaders/lib/lighting/shadows.glsl create mode 100644 shaders/lib/materials/materialHandling/terrainMaterials.glsl create mode 100644 shaders/lib/materials/specificMaterials/others/endPortalEffect.glsl create mode 100644 shaders/lib/materials/specificMaterials/others/signText.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/acaciaPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/bambooPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/birchPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/cherryPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/crimsonPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/darkOakPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/junglePlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/mangrovePlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/oakPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/sprucePlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/planks/warpedPlanks.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/anvil.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/blackstone.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/cobblestone.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/copperBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/copperBulb.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/coral.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/cryingObsidian.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/deepslate.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/diamondBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/dirt.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/emeraldBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/endPortalFrame.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/endStone.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/froglights.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/goldBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/ironBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/lanternMetal.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/lapisBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/lava.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/leaves.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/netheriteBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/netherrack.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/oakWood.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/obsidian.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/pumpkin.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/quartzBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/rawIronBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/redstoneBlock.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/redstoneTorch.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/snow.glsl create mode 100644 shaders/lib/materials/specificMaterials/terrain/stone.glsl create mode 100644 shaders/lib/post/lensFlare.glsl create mode 100644 shaders/lib/post/outline.glsl create mode 100644 shaders/lib/reflections/complexFresnel.glsl create mode 100644 shaders/lib/reflections/rainPuddles.glsl create mode 100644 shaders/lib/reflections/raytrace.glsl create mode 100644 shaders/lib/reflections/roughReflections.glsl create mode 100644 shaders/lib/reflections/simpleReflections.glsl create mode 100644 shaders/lib/settings.glsl create mode 100644 shaders/lib/surface/directionalLightmap.glsl create mode 100644 shaders/lib/surface/generatedNormals.glsl create mode 100644 shaders/lib/surface/ggx.glsl create mode 100644 shaders/lib/surface/materialDeferred.glsl create mode 100644 shaders/lib/surface/materialGbuffers.glsl create mode 100644 shaders/lib/surface/materialHandling/blockEntityMaterials.glsl create mode 100644 shaders/lib/surface/parallax.glsl create mode 100644 shaders/lib/util/commonFunctions.glsl create mode 100644 shaders/lib/util/dFdxdFdy.glsl create mode 100644 shaders/lib/util/dither.glsl create mode 100644 shaders/lib/util/encode.glsl create mode 100644 shaders/lib/util/jitter.glsl create mode 100644 shaders/lib/util/outlineDepth.glsl create mode 100644 shaders/lib/util/outlineMask.glsl create mode 100644 shaders/lib/util/outlineOffset.glsl create mode 100644 shaders/lib/util/spaceConversion.glsl create mode 100644 shaders/lib/vertex/waving.glsl create mode 100644 shaders/lib/vertex/worldCurvature.glsl create mode 100644 shaders/program/composite.glsl create mode 100644 shaders/program/composite1.glsl create mode 100644 shaders/program/composite2.glsl create mode 100644 shaders/program/composite3.glsl create mode 100644 shaders/program/composite4.glsl create mode 100644 shaders/program/composite5.glsl create mode 100644 shaders/program/composite6.glsl create mode 100644 shaders/program/composite7.glsl create mode 100644 shaders/program/deferred.glsl create mode 100644 shaders/program/deferred1.glsl create mode 100644 shaders/program/dh_terrain.glsl create mode 100644 shaders/program/dh_water.glsl create mode 100644 shaders/program/final.glsl create mode 100644 shaders/program/gbuffers_armor_glint.glsl create mode 100644 shaders/program/gbuffers_basic.glsl create mode 100644 shaders/program/gbuffers_beaconbeam.glsl create mode 100644 shaders/program/gbuffers_block.glsl create mode 100644 shaders/program/gbuffers_clouds.glsl create mode 100644 shaders/program/gbuffers_damagedblock.glsl create mode 100644 shaders/program/gbuffers_entities.glsl create mode 100644 shaders/program/gbuffers_entities_glowing.glsl create mode 100644 shaders/program/gbuffers_hand.glsl create mode 100644 shaders/program/gbuffers_skybasic.glsl create mode 100644 shaders/program/gbuffers_skytextured.glsl create mode 100644 shaders/program/gbuffers_spidereyes.glsl create mode 100644 shaders/program/gbuffers_terrain.glsl create mode 100644 shaders/program/gbuffers_textured.glsl create mode 100644 shaders/program/gbuffers_water.glsl create mode 100644 shaders/program/gbuffers_weather.glsl create mode 100644 shaders/program/shadow.glsl create mode 100644 shaders/program/template.glsl create mode 100644 shaders/shaders.properties create mode 100644 shaders/tex/dirt.png create mode 100644 shaders/tex/dirt.png.mcmeta create mode 100644 shaders/tex/noise.png create mode 100644 shaders/tex/noise.png.mcmeta create mode 100644 shaders/world-1/composite.fsh create mode 100644 shaders/world-1/composite.vsh create mode 100644 shaders/world-1/composite2.fsh create mode 100644 shaders/world-1/composite2.vsh create mode 100644 shaders/world-1/composite3.fsh create mode 100644 shaders/world-1/composite3.vsh create mode 100644 shaders/world-1/composite4.fsh create mode 100644 shaders/world-1/composite4.vsh create mode 100644 shaders/world-1/composite5.fsh create mode 100644 shaders/world-1/composite5.vsh create mode 100644 shaders/world-1/composite6.fsh create mode 100644 shaders/world-1/composite6.vsh create mode 100644 shaders/world-1/composite7.fsh create mode 100644 shaders/world-1/composite7.vsh create mode 100644 shaders/world-1/deferred.fsh create mode 100644 shaders/world-1/deferred.vsh create mode 100644 shaders/world-1/deferred1.fsh create mode 100644 shaders/world-1/deferred1.vsh create mode 100644 shaders/world-1/dh_terrain.fsh create mode 100644 shaders/world-1/dh_terrain.vsh create mode 100644 shaders/world-1/dh_water.fsh create mode 100644 shaders/world-1/dh_water.vsh create mode 100644 shaders/world-1/final.fsh create mode 100644 shaders/world-1/final.vsh create mode 100644 shaders/world-1/gbuffers_armor_glint.fsh create mode 100644 shaders/world-1/gbuffers_armor_glint.vsh create mode 100644 shaders/world-1/gbuffers_basic.fsh create mode 100644 shaders/world-1/gbuffers_basic.vsh create mode 100644 shaders/world-1/gbuffers_beaconbeam.fsh create mode 100644 shaders/world-1/gbuffers_beaconbeam.vsh create mode 100644 shaders/world-1/gbuffers_block.fsh create mode 100644 shaders/world-1/gbuffers_block.vsh create mode 100644 shaders/world-1/gbuffers_clouds.fsh create mode 100644 shaders/world-1/gbuffers_clouds.vsh create mode 100644 shaders/world-1/gbuffers_damagedblock.fsh create mode 100644 shaders/world-1/gbuffers_damagedblock.vsh create mode 100644 shaders/world-1/gbuffers_entities.fsh create mode 100644 shaders/world-1/gbuffers_entities.vsh create mode 100644 shaders/world-1/gbuffers_entities_glowing.fsh create mode 100644 shaders/world-1/gbuffers_entities_glowing.vsh create mode 100644 shaders/world-1/gbuffers_hand.fsh create mode 100644 shaders/world-1/gbuffers_hand.vsh create mode 100644 shaders/world-1/gbuffers_spidereyes.fsh create mode 100644 shaders/world-1/gbuffers_spidereyes.vsh create mode 100644 shaders/world-1/gbuffers_terrain.fsh create mode 100644 shaders/world-1/gbuffers_terrain.vsh create mode 100644 shaders/world-1/gbuffers_textured.fsh create mode 100644 shaders/world-1/gbuffers_textured.vsh create mode 100644 shaders/world-1/gbuffers_water.fsh create mode 100644 shaders/world-1/gbuffers_water.vsh create mode 100644 shaders/world-1/gbuffers_weather.fsh create mode 100644 shaders/world-1/gbuffers_weather.vsh create mode 100644 shaders/world0/composite.fsh create mode 100644 shaders/world0/composite.vsh create mode 100644 shaders/world0/composite1.fsh create mode 100644 shaders/world0/composite1.vsh create mode 100644 shaders/world0/composite2.fsh create mode 100644 shaders/world0/composite2.vsh create mode 100644 shaders/world0/composite3.fsh create mode 100644 shaders/world0/composite3.vsh create mode 100644 shaders/world0/composite4.fsh create mode 100644 shaders/world0/composite4.vsh create mode 100644 shaders/world0/composite5.fsh create mode 100644 shaders/world0/composite5.vsh create mode 100644 shaders/world0/composite6.fsh create mode 100644 shaders/world0/composite6.vsh create mode 100644 shaders/world0/composite7.fsh create mode 100644 shaders/world0/composite7.vsh create mode 100644 shaders/world0/deferred.fsh create mode 100644 shaders/world0/deferred.vsh create mode 100644 shaders/world0/deferred1.fsh create mode 100644 shaders/world0/deferred1.vsh create mode 100644 shaders/world0/dh_terrain.fsh create mode 100644 shaders/world0/dh_terrain.vsh create mode 100644 shaders/world0/dh_water.fsh create mode 100644 shaders/world0/dh_water.vsh create mode 100644 shaders/world0/final.fsh create mode 100644 shaders/world0/final.vsh create mode 100644 shaders/world0/gbuffers_armor_glint.fsh create mode 100644 shaders/world0/gbuffers_armor_glint.vsh create mode 100644 shaders/world0/gbuffers_basic.fsh create mode 100644 shaders/world0/gbuffers_basic.vsh create mode 100644 shaders/world0/gbuffers_beaconbeam.fsh create mode 100644 shaders/world0/gbuffers_beaconbeam.vsh create mode 100644 shaders/world0/gbuffers_block.fsh create mode 100644 shaders/world0/gbuffers_block.vsh create mode 100644 shaders/world0/gbuffers_clouds.fsh create mode 100644 shaders/world0/gbuffers_clouds.vsh create mode 100644 shaders/world0/gbuffers_damagedblock.fsh create mode 100644 shaders/world0/gbuffers_damagedblock.vsh create mode 100644 shaders/world0/gbuffers_entities.fsh create mode 100644 shaders/world0/gbuffers_entities.vsh create mode 100644 shaders/world0/gbuffers_entities_glowing.fsh create mode 100644 shaders/world0/gbuffers_entities_glowing.vsh create mode 100644 shaders/world0/gbuffers_hand.fsh create mode 100644 shaders/world0/gbuffers_hand.vsh create mode 100644 shaders/world0/gbuffers_skybasic.fsh create mode 100644 shaders/world0/gbuffers_skybasic.vsh create mode 100644 shaders/world0/gbuffers_skytextured.fsh create mode 100644 shaders/world0/gbuffers_skytextured.vsh create mode 100644 shaders/world0/gbuffers_spidereyes.fsh create mode 100644 shaders/world0/gbuffers_spidereyes.vsh create mode 100644 shaders/world0/gbuffers_terrain.fsh create mode 100644 shaders/world0/gbuffers_terrain.vsh create mode 100644 shaders/world0/gbuffers_textured.fsh create mode 100644 shaders/world0/gbuffers_textured.vsh create mode 100644 shaders/world0/gbuffers_water.fsh create mode 100644 shaders/world0/gbuffers_water.vsh create mode 100644 shaders/world0/gbuffers_weather.fsh create mode 100644 shaders/world0/gbuffers_weather.vsh create mode 100644 shaders/world0/shadow.fsh create mode 100644 shaders/world0/shadow.vsh create mode 100644 shaders/world1/composite.fsh create mode 100644 shaders/world1/composite.vsh create mode 100644 shaders/world1/composite1.fsh create mode 100644 shaders/world1/composite1.vsh create mode 100644 shaders/world1/composite2.fsh create mode 100644 shaders/world1/composite2.vsh create mode 100644 shaders/world1/composite3.fsh create mode 100644 shaders/world1/composite3.vsh create mode 100644 shaders/world1/composite4.fsh create mode 100644 shaders/world1/composite4.vsh create mode 100644 shaders/world1/composite5.fsh create mode 100644 shaders/world1/composite5.vsh create mode 100644 shaders/world1/composite6.fsh create mode 100644 shaders/world1/composite6.vsh create mode 100644 shaders/world1/composite7.fsh create mode 100644 shaders/world1/composite7.vsh create mode 100644 shaders/world1/deferred.fsh create mode 100644 shaders/world1/deferred.vsh create mode 100644 shaders/world1/deferred1.fsh create mode 100644 shaders/world1/deferred1.vsh create mode 100644 shaders/world1/dh_terrain.fsh create mode 100644 shaders/world1/dh_terrain.vsh create mode 100644 shaders/world1/dh_water.fsh create mode 100644 shaders/world1/dh_water.vsh create mode 100644 shaders/world1/final.fsh create mode 100644 shaders/world1/final.vsh create mode 100644 shaders/world1/gbuffers_armor_glint.fsh create mode 100644 shaders/world1/gbuffers_armor_glint.vsh create mode 100644 shaders/world1/gbuffers_basic.fsh create mode 100644 shaders/world1/gbuffers_basic.vsh create mode 100644 shaders/world1/gbuffers_beaconbeam.fsh create mode 100644 shaders/world1/gbuffers_beaconbeam.vsh create mode 100644 shaders/world1/gbuffers_block.fsh create mode 100644 shaders/world1/gbuffers_block.vsh create mode 100644 shaders/world1/gbuffers_clouds.fsh create mode 100644 shaders/world1/gbuffers_clouds.vsh create mode 100644 shaders/world1/gbuffers_damagedblock.fsh create mode 100644 shaders/world1/gbuffers_damagedblock.vsh create mode 100644 shaders/world1/gbuffers_entities.fsh create mode 100644 shaders/world1/gbuffers_entities.vsh create mode 100644 shaders/world1/gbuffers_entities_glowing.fsh create mode 100644 shaders/world1/gbuffers_entities_glowing.vsh create mode 100644 shaders/world1/gbuffers_hand.fsh create mode 100644 shaders/world1/gbuffers_hand.vsh create mode 100644 shaders/world1/gbuffers_skybasic.fsh create mode 100644 shaders/world1/gbuffers_skybasic.vsh create mode 100644 shaders/world1/gbuffers_skytextured.fsh create mode 100644 shaders/world1/gbuffers_skytextured.vsh create mode 100644 shaders/world1/gbuffers_spidereyes.fsh create mode 100644 shaders/world1/gbuffers_spidereyes.vsh create mode 100644 shaders/world1/gbuffers_terrain.fsh create mode 100644 shaders/world1/gbuffers_terrain.vsh create mode 100644 shaders/world1/gbuffers_textured.fsh create mode 100644 shaders/world1/gbuffers_textured.vsh create mode 100644 shaders/world1/gbuffers_water.fsh create mode 100644 shaders/world1/gbuffers_water.vsh create mode 100644 shaders/world1/gbuffers_weather.fsh create mode 100644 shaders/world1/gbuffers_weather.vsh create mode 100644 shaders/world1/shadow.fsh create mode 100644 shaders/world1/shadow.vsh diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b575c6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Minecraft Shader pack based from BSL Shaders. \ No newline at end of file diff --git a/shaders/block.properties b/shaders/block.properties new file mode 100644 index 0000000..a9a73fc --- /dev/null +++ b/shaders/block.properties @@ -0,0 +1,238 @@ +#BSL Shaders v8 Series by Capt Tatsu +#https://bitslablab.com + +# Block ID Format +# block.A0BCC +# A - Namespace +# B - Category +# C - Subcategory + +# Namespaces +# 1 - Minecraft +# 2 - Mods included in BSLShadersMapping +# 3 - All other mods + +# Categories & Subcategories +# 1XX - Translucent +# 100 - Grass +# 101 - Flat Plants Single +# 102 - Flat Plants Lower +# 103 - Flat Plants Upper +# 104 - Crops +# 105 - Leaves +# 106 - Vines +# 107 - Plants +# 108 - Lilypad +# 109 - Normal Translucents + +# 2XX - Emissive +# 200 - Emissive Normal +# 201 - Emissive Recolored +# 202 - Furnace +# 203 - Lava +# 204 - Fire +# 205 - Beacon +# 206 - Lantern +# 207 - Plants +# 208 - Candle + +# 3XX - Semitransparent +# 300 - Water +# 301 - Glass +# 302 - Translucents +# 303 - Portal +# 304 - Modded Water + +# 4XX - Others +# 400 - Skip Parallax +# 401 - End Portal + +#if MC_VERSION >= 11300 + +#1.13+ Mapping + +block.10100= \ +minecraft:grass minecraft:short_grass minecraft:fern minecraft:seagrass \ +minecraft:crimson_roots minecraft:warped_roots minecraft:nether_sprouts +block.10101= \ +minecraft:poppy minecraft:dandelion minecraft:blue_orchid minecraft:allium minecraft:azure_bluet minecraft:red_tulip minecraft:orange_tulip minecraft:white_tulip minecraft:pink_tulip minecraft:oxeye_daisy minecraft:cornflower minecraft:lily_of_the_valley minecraft:wither_rose minecraft:sweet_berry_bush minecraft:pink_petals \ +minecraft:tube_coral minecraft:brain_coral minecraft:bubble_coral minecraft:fire_coral minecraft:horn_coral minecraft:dead_tube_coral minecraft:dead_brain_coral minecraft:dead_bubble_coral minecraft:dead_fire_coral minecraft:dead_horn_coral minecraft:tube_coral_fan minecraft:brain_coral_fan minecraft:bubble_coral_fan minecraft:fire_coral_fan minecraft:horn_coral_fan minecraft:dead_tube_coral_fan minecraft:dead_brain_coral_fan minecraft:dead_bubble_coral_fan minecraft:dead_fire_coral_fan minecraft:dead_horn_coral_fan +block.10102= \ +minecraft:sunflower:half=lower minecraft:lilac:half=lower minecraft:tall_grass:half=lower minecraft:large_fern:half=lower minecraft:rose_bush:half=lower minecraft:peony:half=lower minecraft:tall_seagrass:half=lower +block.10103= \ +minecraft:sunflower:half=upper minecraft:lilac:half=upper minecraft:tall_grass:half=upper minecraft:large_fern:half=upper minecraft:rose_bush:half=upper minecraft:peony:half=upper minecraft:tall_seagrass:half=upper +block.10104= \ +minecraft:wheat minecraft:carrots minecraft:potatoes minecraft:beetroots minecraft:pumpkin_stem minecraft:attached_pumpkin_stem minecraft:melon_stem minecraft:attached_melon_stem minecraft:torchflower +block.10105= \ +minecraft:oak_leaves minecraft:spruce_leaves minecraft:birch_leaves minecraft:jungle_leaves minecraft:acacia_leaves minecraft:dark_oak_leaves minecraft:azalea_leaves minecraft:flowering_azalea_leaves minecraft:mangrove_leaves minecraft:cherry_leaves +block.10106= \ +minecraft:vine minecraft:weeping_vines_plant minecraft:weeping_vines minecraft:twisting_vines_plant minecraft:twisting_vines +block.10107= \ +minecraft:kelp minecraft:kelp_plant \ +minecraft:azalea minecraft:flowering_azalea minecraft:big_dripleaf minecraft:big_dripleaf_stem minecraft:small_dripleaf minecraft:spore_blossom \ +minecraft:cave_vines_plant:berries=false minecraft:cave_vines:berries=false +block.10108= \ +minecraft:lily_pad +block.10109= \ +minecraft:oak_sapling minecraft:spruce_sapling minecraft:birch_sapling minecraft:jungle_sapling minecraft:acacia_sapling minecraft:dark_oak_sapling minecraft:mangrove_propagule minecraft:cherry_sapling \ +minecraft:dead_bush minecraft:sugar_cane minecraft:red_mushroom minecraft:brown_mushroom minecraft:cobweb minecraft:nether_wart minecraft:crimson_fungus minecraft:warped_fungus \ +minecraft:pitcher_plant minecraft:pitcher_crop + +block.10200= \ +minecraft:redstone_wire:power=1 minecraft:redstone_wire:power=2 minecraft:redstone_wire:power=3 minecraft:redstone_wire:power=4 minecraft:redstone_wire:power=5 minecraft:redstone_wire:power=6 minecraft:redstone_wire:power=7 minecraft:redstone_wire:power=8 minecraft:redstone_wire:power=9 minecraft:redstone_wire:power=10 minecraft:redstone_wire:power=11 minecraft:redstone_wire:power=12 minecraft:redstone_wire:power=13 minecraft:redstone_wire:power=14 minecraft:redstone_wire:power=15 \ +minecraft:repeater:powered=true minecraft:comparator:powered=true \ +minecraft:redstone_torch:lit=true minecraft:redstone_wall_torch:lit=true \ +minecraft:soul_torch minecraft:soul_wall_torch minecraft:soul_campfire:lit=true \ +minecraft:torch minecraft:wall_torch minecraft:end_rod \ +minecraft:jack_o_lantern minecraft:campfire:lit=true \ +minecraft:sea_pickle minecraft:glow_lichen \ +minecraft:small_amethyst_bud minecraft:medium_amethyst_bud minecraft:large_amethyst_bud minecraft:amethyst_cluster \ +minecraft:ochre_froglight minecraft:verdant_froglight minecraft:pearlescent_froglight \ +minecraft:sculk minecraft:sculk_vein minecraft:sculk_sensor minecraft:calibrated_sculk_sensor minecraft:sculk_catalyst minecraft:sculk_shrieker \ +minecraft:respawn_anchor:charges=1 minecraft:respawn_anchor:charges=2 minecraft:respawn_anchor:charges=3 minecraft:respawn_anchor:charges=4 \ +minecraft:copper_bulb:lit=true minecraft:exposed_copper_bulb:lit=true minecraft:weathered_copper_bulb:lit=true minecraft:oxidized_copper_bulb:lit=true minecraft:waxed_copper_bulb:lit=true minecraft:waxed_exposed_copper_bulb:lit=true minecraft:waxed_weathered_copper_bulb:lit=true minecraft:waxed_oxidized_copper_bulb:lit=true +block.10201= \ +minecraft:glowstone minecraft:shroomlight minecraft:redstone_lamp:lit=true minecraft:sea_lantern minecraft:lantern:hanging=false \ +minecraft:magma_block \ +minecraft:soul_lantern:hanging=false +block.10202= \ +minecraft:furnace:lit=true minecraft:blast_furnace:lit=true minecraft:smoker:lit=true +block.10203= \ +minecraft:lava minecraft:flowing_lava +block.10204= \ +minecraft:fire minecraft:soul_fire +block.10205= \ +minecraft:beacon +block.10206= \ +minecraft:lantern:hanging=true minecraft:soul_lantern:hanging=true +block.10207= \ +minecraft:cave_vines_plant:berries=true minecraft:cave_vines:berries=true +block.10208= \ +minecraft:candle:lit=true minecraft:white_candle:lit=true minecraft:orange_candle:lit=true minecraft:magenta_candle:lit=true minecraft:light_blue_candle:lit=true minecraft:yellow_candle:lit=true minecraft:lime_candle:lit=true minecraft:pink_candle:lit=true minecraft:gray_candle:lit=true minecraft:light_gray_candle:lit=true minecraft:cyan_candle:lit=true minecraft:purple_candle:lit=true minecraft:blue_candle:lit=true minecraft:brown_candle:lit=true minecraft:green_candle:lit=true minecraft:red_candle:lit=true minecraft:black_candle:lit=true + +block.10300= \ +minecraft:water minecraft:flowing_water +block.10301= \ +minecraft:glass minecraft:glass_pane \ +minecraft:white_stained_glass minecraft:orange_stained_glass minecraft:magenta_stained_glass minecraft:light_blue_stained_glass minecraft:yellow_stained_glass minecraft:lime_stained_glass minecraft:pink_stained_glass minecraft:gray_stained_glass minecraft:light_gray_stained_glass minecraft:cyan_stained_glass minecraft:purple_stained_glass minecraft:blue_stained_glass minecraft:brown_stained_glass minecraft:green_stained_glass minecraft:red_stained_glass minecraft:black_stained_glass minecraft:white_stained_glass_pane minecraft:orange_stained_glass_pane minecraft:magenta_stained_glass_pane minecraft:light_blue_stained_glass_pane minecraft:yellow_stained_glass_pane minecraft:lime_stained_glass_pane minecraft:pink_stained_glass_pane minecraft:gray_stained_glass_pane minecraft:light_gray_stained_glass_pane minecraft:cyan_stained_glass_pane minecraft:purple_stained_glass_pane minecraft:blue_stained_glass_pane minecraft:brown_stained_glass_pane minecraft:green_stained_glass_pane minecraft:red_stained_glass_pane minecraft:black_stained_glass_pane +block.10302= \ +minecraft:ice minecraft:slime_block minecraft:honey_block +block.10303= \ +minecraft:nether_portal + +block.10400= \ +minecraft:sign minecraft:oak_sign minecraft:spruce_sign minecraft:birch_sign minecraft:jungle_sign minecraft:acacia_sign minecraft:dark_oak_sign minecraft:mangrove_sign minecraft:cherry_sign minecraft:bamboo_sign minecraft:crimson_sign minecraft:warped_sign \ +minecraft:wall_sign minecraft:oak_wall_sign minecraft:spruce_wall_sign minecraft:birch_wall_sign minecraft:jungle_wall_sign minecraft:acacia_wall_sign minecraft:dark_oak_wall_sign minecraft:mangrove_wall_sign minecraft:cherry_wall_sign minecraft:bamboo_wall_sign minecraft:crimson_wall_sign minecraft:warped_wall_sign \ +minecraft:oak_hanging_sign minecraft:spruce_hanging_sign minecraft:birch_hanging_sign minecraft:jungle_hanging_sign minecraft:acacia_hanging_sign minecraft:dark_oak_hanging_sign minecraft:mangrove_hanging_sign minecraft:cherry_hanging_sign minecraft:bamboo_hanging_sign minecraft:crimson_hanging_sign minecraft:warped_hanging_sign +block.10401= \ +minecraft:end_portal minecraft:end_gateway + +#elif MC_VERSION >= 10800 + +#1.8-1.12 Mapping + +block.10100= \ +minecraft:tallgrass +block.10101= \ +minecraft:red_flower minecraft:yellow_flower +block.10102= \ +minecraft:double_plant:half=lower +block.10103= \ +minecraft:double_plant:half=upper +block.10104= \ +minecraft:wheat minecraft:carrots minecraft:potatoes minecraft:beetroots \ +minecraft:pumpkin_stem minecraft:melon_stem +block.10105= \ +minecraft:leaves minecraft:leaves2 +block.10106= \ +minecraft:vine +block.10108= \ +minecraft:waterlily +block.10109= \ +minecraft:sapling \ +minecraft:deadbush minecraft:reeds minecraft:red_mushroom minecraft:brown_mushroom minecraft:cobweb minecraft:nether_wart + +block.10200= \ +minecraft:redstone_wire minecraft:repeater:powered=true minecraft:comparator:powered=true \ +minecraft:lit_redstone_torch minecraft:ender_chest \ +minecraft:torch minecraft:end_rod \ +minecraft:lit_pumpkin +block.10201= \ +minecraft:magma \ +minecraft:glowstone minecraft:lit_redstone_lamp minecraft:sea_lantern +block.10202= \ +minecraft:lit_furnace +block.10203= \ +minecraft:lava minecraft:flowing_lava +block.10204= \ +minecraft:fire +block.10205= \ +minecraft:beacon + +block.10300= \ +minecraft:water minecraft:flowing_water +block.10301= \ +minecraft:stained_glass minecraft:stained_glass_pane minecraft:glass minecraft:glass_pane +block.10302= \ +minecraft:ice minecraft:slime +block.10303= \ +minecraft:nether_portal + +block.10400= \ +minecraft:sign minecraft:wall_sign +block.10401= \ +minecraft:end_portal minecraft:end_gateway + +#else + +#1.7 Mapping + +block.10100= \ +minecraft:tallgrass +block.10101= \ +minecraft:red_flower minecraft:yellow_flower +block.10103= \ +minecraft:double_plant +block.10104= \ +minecraft:wheat minecraft:carrots minecraft:potatoes minecraft:beetroots \ +minecraft:pumpkin_stem minecraft:melon_stem +block.10105= \ +minecraft:leaves minecraft:leaves2 +block.10106= \ +minecraft:vine +block.10108= \ +minecraft:waterlily +block.10109= \ +minecraft:sapling \ +minecraft:deadbush minecraft:reeds minecraft:red_mushroom minecraft:brown_mushroom minecraft:web minecraft:nether_wart + +block.10200= \ +minecraft:redstone_wire minecraft:powered_repeater minecraft:powered_comparator \ +minecraft:redstone_torch minecraft:ender_chest \ +minecraft:torch \ +minecraft:lit_pumpkin +block.10201= \ +minecraft:magma \ +minecraft:glowstone minecraft:lit_redstone_lamp minecraft:sea_lantern +block.10202= \ +minecraft:lit_furnace +block.10203= \ +minecraft:lava minecraft:flowing_lava +block.10204= \ +minecraft:fire +block.10205= \ +minecraft:beacon + +block.10300= \ +minecraft:water minecraft:flowing_water +block.10301= \ +minecraft:stained_glass minecraft:stained_glass_pane minecraft:glass minecraft:glass_pane +block.10302= \ +minecraft:ice minecraft:portal minecraft:slime + +block.10400= \ +minecraft:standing_sign minecraft:wall_sign +block.10401= \ +minecraft:end_portal minecraft:end_gateway + +#endif \ No newline at end of file diff --git a/shaders/entity.properties b/shaders/entity.properties new file mode 100644 index 0000000..788a82a --- /dev/null +++ b/shaders/entity.properties @@ -0,0 +1,13 @@ +#BSL Shaders Entity Mapping + +# 100 - Skip Normal & Parallax +# 101 - Lightning Bolt + +#if MC_VERSION >= 11300 + +#1.13+ Mapping + +entity.10100=minecraft:item_frame minecraft:painting minecraft:glow_item_frame +entity.10101=minecraft:lightning_bolt + +#endif \ No newline at end of file diff --git a/shaders/item.properties b/shaders/item.properties new file mode 100644 index 0000000..e9dc409 --- /dev/null +++ b/shaders/item.properties @@ -0,0 +1,26 @@ +#BSL Shaders Item Mapping + +#89 - Emissive Recolor + +#50 - Emissive + +#358 - Map + +#if MC_VERSION >= 11300 + +#1.13+ Mapping + +item.89= \ +minecraft:glowstone minecraft:beacon minecraft:sea_lantern minecraft:lantern minecraft:soul_lantern + +item.50= \ +minecraft:torch minecraft:end_rod minecraft:redstone_torch minecraft:jack_o_lantern minecraft:shroomlight minecraft:lava_bucket minecraft:glow_lichen minecraft:small_amethyst_bud minecraft:medium_amethyst_bud minecraft:large_amethyst_bud minecraft:amethyst_cluster minecraft:glow_berries minecraft:ochre_froglight minecraft:verdant_froglight minecraft:pearlescent_froglight \ +adorn:stone_torch adorn:wall_stone_torch adorn:white_table_lamp adorn:orange_table_lamp adorn:magenta_table_lamp adorn:light_blue_table_lamp adorn:yellow_table_lamp adorn:lime_table_lamp adorn:pink_table_lamp adorn:gray_table_lamp adorn:light_gray_table_lamp adorn:cyan_table_lamp adorn:purple_table_lamp adorn:blue_table_lamp adorn:brown_table_lamp adorn:green_table_lamp adorn:red_table_lamp adorn:black_table_lamp adorn:candlelit_lantern adorn:white_candlelit_lantern adorn:orange_candlelit_lantern adorn:magenta_candlelit_lantern adorn:light_blue_candlelit_lantern adorn:yellow_candlelit_lantern adorn:lime_candlelit_lantern adorn:pink_candlelit_lantern adorn:gray_candlelit_lantern adorn:light_gray_candlelit_lantern adorn:cyan_candlelit_lantern adorn:purple_candlelit_lantern adorn:blue_candlelit_lantern adorn:brown_candlelit_lantern adorn:green_candlelit_lantern adorn:red_candlelit_lantern adorn:black_candlelit_lantern + +item.213= \ +minecraft:magma_block + +item.358= \ +minecraft:filled_map + +#endif \ No newline at end of file diff --git a/shaders/lang/en_US.lang b/shaders/lang/en_US.lang new file mode 100644 index 0000000..40d513b --- /dev/null +++ b/shaders/lang/en_US.lang @@ -0,0 +1,983 @@ +#shaders/lang/en_us.lang + +#Profiles +profile.MINIMUM=Minimum +profile.LOW=Low +profile.MEDIUM=Medium +profile.HIGH=High +profile.ULTRA=Ultra +profile.comment=Minimum: no shadows, no extra effects. Low : low shadows, no extra effects. Medium : low-medium shadows, no extra effects. High : medium shadows, AO and light shafts. Ultra : high shadows, AO, and light shafts. + +#Screens +screen.LIGHTING=Lighting +screen.SHADOW_CONFIG=More Shadow Config +screen.MCBL=Colored Blocklight Config + +screen.MATERIAL=Material +screen.SPECULAR=Specular & Reflections +screen.NORMALS=Normals & Parallax + +screen.GENERATED_NORMAL_SETTINGS=Generated Normal Settings + +screen.ATMOSPHERICS=Atmospherics +screen.CLOUDS=Clouds +screen.FOG=Fog +screen.FOG_DENSITY=More Fog Density Config +screen.FOG_HEIGHT=Height Fog Config +screen.FOG_VANILLA=Far Vanilla Fog Config +screen.SKY=Sky +screen.SKYBOX=Skybox + +screen.WATER=Water + +screen.CAMERA=Camera + +screen.ANTIALIASING=Anti-aliasing + +screen.COLOR=Color +screen.LIGHT_COLOR=Lighting Color +screen.LIGHT_M=Light (Morning) +screen.AMBIENT_M=Ambient (Morning) +screen.LIGHT_D=Light (Day) +screen.AMBIENT_D=Ambient (Day) +screen.LIGHT_E=Light (Evening) +screen.AMBIENT_E=Ambient (Evening) +screen.LIGHT_N=Light (Night) +screen.AMBIENT_N=Ambient (Night) +screen.MINLIGHT=Minimum Light +screen.BLOCKLIGHT_COLOR=Blocklight Color +screen.SKY_COLOR=Sky Color +screen.WATER_COLOR=Water Color +screen.WEATHER_COLOR=Weather Color +screen.WEATHER_R=Rain (Normal) +screen.WEATHER_C=Snowfall +screen.WEATHER_D=Desert Sandstorm +screen.WEATHER_B=Mesa Sandstorm +screen.WEATHER_S=Swamp Rain +screen.WEATHER_M=Mushroom Island Rain +screen.WEATHER_V=Savanna Cloudy +screen.WEATHER_J=Jungle Rain +screen.AURORA_COLOR=Aurora Color +screen.AURORA_L=Low Section Color +screen.AURORA_H=High Section Color +screen.DIMENSION_COLOR=Dimension Color +screen.NETHER_COLOR=Nether Color +screen.NETHER_N=Nether Wastes +screen.NETHER_V=Soul Sand Valley +screen.NETHER_C=Crimson Forest +screen.NETHER_W=Warped Forest +screen.NETHER_B=Basalt Deltas +screen.END_COLOR=End Color + +screen.CGT=Color Grading & Tonemap +screen.EXPOSURE_CONFIG=More Exposure Config +screen.COLOR_GRADING_CONFIG=Color Grading Config +screen.CG_R=Red Channel +screen.CG_G=Green Channel +screen.CG_B=Blue Channel +screen.CG_T=Tint + +screen.EXTRAS=Extras + +screen.ANIMATION=Animations + +#Settings +option.ABOUT=BSL v8.2.09 +option.ABOUT.comment=by Capt Tatsu. bitslablab.com +value.ABOUT.0=by Capt Tatsu + +#Lighting +option.SHADOW=Realtime Shadows +option.SHADOW.comment=Enables realtime, dynamic shadow mapping. + +option.shadowMapResolution=Shadowmap Quality +option.shadowMapResolution.comment=Adjusts shadowmap size. §e[*]§rHigher resolution gives sharper shadows, but reduces performance. +value.shadowMapResolution.512=Very Low (512) +value.shadowMapResolution.1024=Low (1024) +value.shadowMapResolution.1536=Low Medium (1536) +value.shadowMapResolution.2048=Medium (2048) +value.shadowMapResolution.3072=High (3072) +value.shadowMapResolution.4096=Very High (4096) +value.shadowMapResolution.8192=Ultra High (8192) + +option.shadowDistance=Shadow Distance +option.shadowDistance.comment=Adjusts shadow distance. + +option.SHADOW_COLOR=Colored Shadow +option.SHADOW_COLOR.comment=Enables tinted shadow from translucents. §a[+]§rUsed for colored volumetric light shafts. §c[-]§rSlightly higher performance cost when using shadow filtering. + +option.SHADOW_FILTER=Shadow Filtering +option.SHADOW_FILTER.comment=Enables shadow filtering. + +option.AO=Ambient Occlusion +option.AO.comment=Adds soft shadows around surface contact or intersection. + +option.AO_STRENGTH=AO Strength +option.AO_STRENGTH.comment=Adjusts ambient occlusion strength. + +option.DESATURATION=Desaturation +option.DESATURATION.comment=Reduces saturation while adding some tint in darker areas. + +option.DESATURATION_FACTOR=Desaturation Factor +option.DESATURATION_FACTOR.comment=Adjusts the maximum amount of desaturation applied. +value.DESATURATION_FACTOR.2.0=Very Low +value.DESATURATION_FACTOR.1.5=Low +value.DESATURATION_FACTOR.1.0=Medium +value.DESATURATION_FACTOR.0.5=High +value.DESATURATION_FACTOR.0.0=Very High + +option.DYNAMIC_HANDLIGHT=Dynamic Handlight +option.DYNAMIC_HANDLIGHT.comment=Allows blocklight to be emitted from view when holding certain objects. + +option.MULTICOLORED_BLOCKLIGHT=Multi-Colored Blocklight +option.MULTICOLORED_BLOCKLIGHT.comment=Enables screen space multi-colored blocklight. §e[*]§rOnly works on 1.16.5 and above, non-Mac devices. + +option.WHITE_WORLD=White World +option.WHITE_WORLD.comment=Replaces textures with flat white color. + +#More Shadow Config +option.SHADOW_ENTITY=Entity Shadow +option.SHADOW_ENTITY.comment=Enables shadow on mobs. §e[*]§rDisable this when a huge amount of mobs are loaded. §e[*]§rOnly works on 1.16.5 and above. + +option.SHADOW_BLOCK_ENTITY=Block Entity Shadow +option.SHADOW_BLOCK_ENTITY.comment=Enables shadow on block entities. §e[*]§rDisable this when a huge amount of block entities are loaded. §e[*]§rOnly works on 1.16.5 and above. + +option.SHADOW_VEGETATION=Vegetation Shadow +option.SHADOW_VEGETATION.comment=Enables shadow on grass, crops, and most other plants. + +option.SHADOW_CLOUD=Cloud Shadow +option.SHADOW_CLOUD.comment=Enables shadow casted by clouds. + +option.sunPathRotation=Sun Path Rotation +option.sunPathRotation.comment=Adjusts sun angle. + +option.SHADOW_BIAS=Shadow Bias Mode +option.SHADOW_BIAS.comment=Determines how shadow mapping bias is done. Light direction mode preserves most shadow edges, but shadows look floaty at a distance. Surface normal mode preserves contact point, but shadows look shorter at a distance. +value.SHADOW_BIAS.0=Light Direction +value.SHADOW_BIAS.1=Surface Normal + +option.SHADOW_PIXEL=Pixel Locked Shadows +option.SHADOW_PIXEL.comment=Applies pixelation effect on shadows. +value.SHADOW_PIXEL.0=OFF + +#Colored Blocklight Config +option.MCBL_ANTI_BLEED=Anti Bleed +option.MCBL_ANTI_BLEED.comment=Reduce unwanted blocklight color spread. §c[-]§rMay cause undersampling artifact to be more noticeable. +option.MCBL_LEGACY_COLOR=Legacy Color +option.MCBL_LEGACY_COLOR.comment=Use the old method of calculating blocklight color. + +#Material +option.ADVANCED_MATERIALS=Advanced Materials +option.ADVANCED_MATERIALS.comment=Enables the use of specular and normal mapping which allows for more detail on various things. §e[*]§rThis option requires a resource pack which contains specular and/or normal maps, disable if none is currently used. §e[*]§rOptions which requires advanced materials are indicated by *, changing these options won't affect the visuals or performance while advanced materials is disabled. + +option.MATERIAL_FORMAT=Material Format* +option.MATERIAL_FORMAT.comment=Determines the specular and normal map format used by the resource pack. §e[*]§rTexture artists usually tell which format is used in their resource pack, using the wrong format may give weird results. +value.MATERIAL_FORMAT.0=SEUS/Old PBR +value.MATERIAL_FORMAT.1=labPBR 1.3 +value.MATERIAL_FORMAT.2=Generated + +option.SSS=Subsurface Scattering* +option.SSS.comment=Allows light to penetrate and scatter through blocks. §a[+]§rThis effect benefits from TAA. + +option.BASIC_SSS=Basic Scattering +option.BASIC_SSS.comment=Enables a simplified version of subsurface scattering to certain blocks. + +option.EMISSIVE=Emissive +option.EMISSIVE.comment=Allows certain surfaces to be brighter. +value.EMISSIVE.0=§cOFF +value.EMISSIVE.1=AdvMat Only* +value.EMISSIVE.2=Full + +option.REFRACTION=Refraction +option.REFRACTION.comment=Enables distortion behind normal mapped transparent surfaces. §c[-]§rThe transparent surface itself will be distorted. §c[-]§rSome other features may not work properly with this effect enabled. +value.REFRACTION.0=OFF +value.REFRACTION.1=Water Only +value.REFRACTION.2=Full + +option.ALBEDO_BALANCING=Albedo Balancing +option.ALBEDO_BALANCING.comment=Reduces brightness of very bright colored surfaces. + +option.ALPHA_BLEND=Alpha Blending +option.ALPHA_BLEND.comment=Determines how transparency blending is done. +value.ALPHA_BLEND.0=Gamma +value.ALPHA_BLEND.1=Linear + +option.ENTITY_FLASH=Entity Flash +option.ENTITY_FLASH.comment=Enables damaged entities and nearby creeper to flash. + +#Specular & Reflections +option.REFLECTION=Reflections +option.REFLECTION.comment=Enables reflections on water and translucents. +value.REFLECTION.0=§cOFF +value.REFLECTION.1=Sky & Specular Only +value.REFLECTION.2=Full + +option.REFLECTION_TRANSLUCENT=Translucent Reflections +option.REFLECTION_TRANSLUCENT.comment=Allows reflection to be rendered on translucent surfaces, such as stained glass, ice, slime blocks, and more. + +option.REFLECTION_SPECULAR=Specular Reflection* +option.REFLECTION_SPECULAR.comment=Enables reflection on smooth or metallic surfaces. + +option.REFLECTION_ROUGH=Rough Reflection* +option.REFLECTION_ROUGH.comment=Allows surfaces with lower smoothness to render blurry reflections. §c[-]§rMay contain minor artifacts. + +option.REFLECTION_RAIN=Rain Reflection* +option.REFLECTION_RAIN.comment=Allows surfaces to be wet while raining. §e[*]§rRequires specular reflection. + +option.REFLECTION_RAIN_AMOUNT=Puddle Amount +option.REFLECTION_RAIN_AMOUNT.comment=Adjusts the amount of puddles created while raining. +value.REFLECTION_RAIN_AMOUNT.0.4=Very Low +value.REFLECTION_RAIN_AMOUNT.0.5=Low +value.REFLECTION_RAIN_AMOUNT.0.6=Medium +value.REFLECTION_RAIN_AMOUNT.0.7=High +value.REFLECTION_RAIN_AMOUNT.1.0=Very High + +option.REFLECTION_PREVIOUS=Previous Frame Reflection +option.REFLECTION_PREVIOUS.comment=Allows translucents to be reflected by using previous frame information. §c[-]§rMay cause missing reflection on screenshot (caused by screenshot size setting). §c[-]§rIncompatible with some GPUs. §c[-]§rBugged in 1.7.10. + +option.SPECULAR_HIGHLIGHT_ROUGH=Rough Specular Highlight +option.SPECULAR_HIGHLIGHT_ROUGH.comment=Allows rough surfaces to have weak gloss. + +option.ALBEDO_METAL=Albedo Tinted Hardcoded Metal* +option.ALBEDO_METAL.comment=Applies base texture as tint on hardcoded metallic surfaces. §e[*]§rWorks on labPBR material format only. + +option.REFLECTION_MODE=Reflection Mode +option.REFLECTION_MODE.comment=Adjusts reflection behavior. +value.REFLECTION_MODE.0=Less Duplicates +value.REFLECTION_MODE.1=Balanced +value.REFLECTION_MODE.2=More Gap Filling + +option.REFLECTION_SKY_FALLOFF=Sky Reflection Falloff +option.REFLECTION_SKY_FALLOFF.comment=Adjusts how far sky reflection fades out under low skylight. +value.REFLECTION_SKY_FALLOFF.1=Very Weak +value.REFLECTION_SKY_FALLOFF.2=Weak +value.REFLECTION_SKY_FALLOFF.4=Balanced +value.REFLECTION_SKY_FALLOFF.8=Strong +value.REFLECTION_SKY_FALLOFF.16=Very Strong + +option.REFLECTION_SKYBOX=Reflect Skybox +option.REFLECTION_SKYBOX.comment=Allows resource pack skybox to be included in reflections. §c[-]§rSkybox is only applied to transparent surfaces. + +#Normals & Parallax +option.PARALLAX=Parallax Occlusion Mapping* +option.PARALLAX.comment=Adds displacement on a surface using height map. + +option.PARALLAX_DEPTH=Parallax Depth* +option.PARALLAX_DEPTH.comment=Adjusts parallax deepness. +value.PARALLAX_DEPTH.0.05=5 cm +value.PARALLAX_DEPTH.0.10=10 cm +value.PARALLAX_DEPTH.0.15=15 cm +value.PARALLAX_DEPTH.0.20=20 cm +value.PARALLAX_DEPTH.0.25=25 cm +value.PARALLAX_DEPTH.0.30=30 cm +value.PARALLAX_DEPTH.0.35=35 cm +value.PARALLAX_DEPTH.0.40=40 cm +value.PARALLAX_DEPTH.0.45=45 cm +value.PARALLAX_DEPTH.0.50=50 cm + +option.PARALLAX_QUALITY=Parallax Samples* +option.PARALLAX_QUALITY.comment=Adjusts the quality of parallax occlusion mapping. + +option.PARALLAX_DISTANCE=Parallax Distance* +option.PARALLAX_DISTANCE.comment=Adjusts how far parallax occlusion mapping and self shadows can be rendered. + +option.SELF_SHADOW=Self Shadows* +option.SELF_SHADOW.comment=Allows a surface to cast shadow to itself using heightmap. + +option.SELF_SHADOW_ANGLE=Self Shadows Angle* +option.SELF_SHADOW_ANGLE.comment=Adjusts the self shadowing angle, higher value allows the shadow to travel further. + +option.SELF_SHADOW_QUALITY=Self Shadows Samples* +option.SELF_SHADOW_QUALITY.comment=Adjusts the quality of self shadowing. + +option.SELF_SHADOW_STRENGTH=Self Shadows Strength* +option.SELF_SHADOW_STRENGTH.comment=Adjusts the intensity of self shadowing. + +option.DIRECTIONAL_LIGHTMAP=Directional Lightmap* +option.DIRECTIONAL_LIGHTMAP.comment=Adds normal mapping to vanilla lighting. §c[-]§rLightmap may glitch with this effect enabled. + +option.DIRECTIONAL_LIGHTMAP_STRENGTH=Dir. Lightmap Strength* +option.DIRECTIONAL_LIGHTMAP_STRENGTH.comment=Adjusts the intensity of Directional Lightmap. +value.DIRECTIONAL_LIGHTMAP_STRENGTH.2.0=Very Low +value.DIRECTIONAL_LIGHTMAP_STRENGTH.1.4=Low +value.DIRECTIONAL_LIGHTMAP_STRENGTH.1.0=Medium +value.DIRECTIONAL_LIGHTMAP_STRENGTH.0.7=High +value.DIRECTIONAL_LIGHTMAP_STRENGTH.0.5=Very High + +option.NORMAL_DAMPENING=Normal Dampening* +option.NORMAL_DAMPENING.comment=Reduces normal map strength to prevent reflections being too noisy. +option.GENERATED_NORMALS=Generated Normals +option.GENERATED_NORMALS.comment=Enables procedural-generated normal mapping for blocks. +option.GENERATED_NORMAL_MULT=Generated Normal Intensity +option.GENERATED_NORMAL_MULT.comment=Adjusts the intensity of generated normal mapping. +option.GENERATED_NORMAL_THRESHOLD=Generated Normal Threshold +option.GENERATED_NORMAL_THRESHOLD.comment=Adjusts the threshold of generated normal mapping. +option.GENERATED_NORMAL_CLAMP=Generated Normal Clamp +option.GENERATED_NORMAL_CLAMP.comment=Clamps the generated normal mapping to prevent overshading. +option.GENERATED_NORMAL_RESOLUTION=Generated Normal Resolution +option.GENERATED_NORMAL_RESOLUTION.comment=Adjusts the resolution of generated normal maps. + + +option.NORMAL_PLANTS=Up-facing Plants +option.NORMAL_PLANTS.comment=Adjusts plant shading. §e[*]§rDisable this if non-flat plant model is used or normal map applied on plants. + +#Atmospherics +option.LIGHT_SHAFT=Light Shafts +option.LIGHT_SHAFT.comment=Adds volumetric rays from sun / moon. §a[+]§rThis effect benefits from TAA. §e[*]§rRequires realtime shadows. §e[*]§rPerformance depends on Shadowmap Resolution. + +option.LIGHT_SHAFT_STRENGTH=Light Shaft Strength +option.LIGHT_SHAFT_STRENGTH.comment=Adjusts light shaft strength. + +option.WEATHER_PERBIOME=Per Biome Weather +option.WEATHER_PERBIOME.comment=Use varied weather color for different biomes. §c[-]§rMay not work under unknown conditions. + +option.WEATHER_OPACITY=Weather Opacity +option.WEATHER_OPACITY.comment=Adjusts weather opacity. + +#Sky +option.SKY_DENSITY_D=Day Density +option.SKY_EXPOSURE_D=Day Exposure +option.SKY_DENSITY_N=Night Density +option.SKY_EXPOSURE_N=Night Exposure +option.SKY_DENSITY_W=Weather Density +option.SKY_EXPOSURE_W=Weather Exposure +option.SKY_HORIZON_N=Near Horizon +option.SKY_HORIZON_F=Far Horizon + +option.SKY_DESATURATION=Sky Desaturation +option.SKY_DESATURATION.comment=Reduces saturation while adding some tint to the skybox at night + +option.SKY_GROUND=Sky Ground +option.SKY_GROUND.comment=Darkens the bottom part of the sky. §e[*]§rThis option is affected by fog density. +value.SKY_GROUND.0=§cOFF +value.SKY_GROUND.1=Reflections Only +value.SKY_GROUND.2=Full + +option.UNDERGROUND_SKY=Underground Sky Fix +option.UNDERGROUND_SKY.comment=Hides the sky when the player is in dark area and under sea level (Y: 62). §c[-]§rNot suitable for low superflat worlds. + +option.SHADER_END_SKY=Shader End Sky +option.SHADER_END_SKY.comment=Replaces vanilla/modded end skybox with shader based end skybox. + +option.SKY_DEFERRED=Deferred Sky +option.SKY_DEFERRED.comment=Renders sky after opaque surfaces are drawn instead of at the beginning. §e[*]§rThis affects resource pack sky rendering. + +#Cloud +option.CLOUDS=Clouds +option.CLOUDS.comment=Enables clouds. §a[+]§rSkybox and volumetric clouds benefit from TAA. §e[*]§rVanilla clouds requires vanilla cloud setting set to default or on. +value.CLOUDS.0=§cOFF +value.CLOUDS.1=Skybox +value.CLOUDS.2=Volumetric +value.CLOUDS.3=Vanilla + +option.CLOUD_BASE=Base Shape +option.CLOUD_BASE.comment=Determines which noise type used for the cloud's base shape. +value.CLOUD_BASE.0=Perlin +value.CLOUD_BASE.1=Worley + +option.CLOUD_DENSITY=Density +option.CLOUD_DENSITY.comment=Adjusts cloud density, higher density makes artifacts more visible. +value.CLOUD_DENSITY.1=Very Low +value.CLOUD_DENSITY.2=Low +value.CLOUD_DENSITY.4=Medium +value.CLOUD_DENSITY.6=High +value.CLOUD_DENSITY.8=Very High + +option.CLOUD_AMOUNT=Amount +option.CLOUD_AMOUNT.comment=Adjusts cloud amount. +value.CLOUD_AMOUNT.12.0=Very Low +value.CLOUD_AMOUNT.11.0=Low +value.CLOUD_AMOUNT.10.0=Medium +value.CLOUD_AMOUNT.9.0=High +value.CLOUD_AMOUNT.8.0=Very High + +option.CLOUD_HEIGHT=Height +option.CLOUD_HEIGHT.comment=Adjusts cloud height. +value.CLOUD_HEIGHT.5.0=Very Low +value.CLOUD_HEIGHT.7.5=Low +value.CLOUD_HEIGHT.10.0=Medium +value.CLOUD_HEIGHT.12.5=High +value.CLOUD_HEIGHT.15.0=Very High + +option.CLOUD_THICKNESS=Thickness +option.CLOUD_THICKNESS.comment=Adjusts cloud thickness. +value.CLOUD_THICKNESS.2=Very Low +value.CLOUD_THICKNESS.4=Low +value.CLOUD_THICKNESS.5=Medium +value.CLOUD_THICKNESS.7=High +value.CLOUD_THICKNESS.10=Very High + +option.CLOUD_DETAIL=Detail +option.CLOUD_DETAIL.comment=Adjusts cloud detail. +value.CLOUD_DETAIL.0.3=Very Low +value.CLOUD_DETAIL.0.7=Low +value.CLOUD_DETAIL.1.0=Medium +value.CLOUD_DETAIL.1.3=High +value.CLOUD_DETAIL.1.7=Very High + +option.CLOUD_SPEED=Speed +option.CLOUD_SPEED.comment=Adjusts cloud speed. + +option.CLOUD_OPACITY=Opacity +option.CLOUD_OPACITY.comment=Adjusts cloud opacity. + +option.CLOUD_BRIGHTNESS=Brightness +option.CLOUD_BRIGHTNESS.comment=Adjusts cloud brightness. + +option.CLOUD_VOLUMETRIC_SCALE=Volumetric Scale +option.CLOUD_VOLUMETRIC_SCALE.comment=Adjusts volumetric cloud altitude and size +value.CLOUD_VOLUMETRIC_SCALE.6.0=Old Vanilla +value.CLOUD_VOLUMETRIC_SCALE.12.4=Vanilla +value.CLOUD_VOLUMETRIC_SCALE.16.0=Original Skybox + +#Fog +option.FOG_DENSITY=Fog Density +option.FOG_DENSITY.comment=Adjusts fog density. §e[*]§rThis option is ignored in the nether. + +option.FOG_HEIGHT=Height Fog +option.FOG_HEIGHT.comment= Enables height fog, reducing fog amount based on height. + +option.FAR_VANILLA_FOG=Far Vanilla Fog +option.FAR_VANILLA_FOG.comment=Enables vanilla-like fog. §e[*]§rThis option is affected by fog density. +value.FAR_VANILLA_FOG.0=§cOFF +value.FAR_VANILLA_FOG.1=Overworld Only +value.FAR_VANILLA_FOG.2=Nether & End Only +value.FAR_VANILLA_FOG.3=Full + +#Fog Density +option.FOG_DENSITY_NIGHT=Night - Weather Density +option.FOG_DENSITY_NIGHT.comment=Adjusts fog density multiplier at night and while raining. + +option.FOG_DENSITY_WEATHER=Weather Density +option.FOG_DENSITY_WEATHER.comment=Adjusts fog density multiplier while raining. + +option.FOG_DENSITY_COLD=Cold Density +option.FOG_DENSITY_COLD.comment=Adjusts fog density multiplier while standing on cold biomes. Cold biomes include any biome where snow occurs. §e[*]§rRequires Per Biome Weather. + +option.FOG_DENSITY_DRY=Dry Density +option.FOG_DENSITY_DRY.comment=Adjusts fog density multiplier while standing on dry biomes. Dry biomes include desert, badlands/mesa, and savanna. §e[*]§rRequires Per Biome Weather. + +option.FOG_DENSITY_DAMP=Damp Density +option.FOG_DENSITY_DAMP.comment=Adjusts fog density multiplier while standing on damp biomes. Damp biomes include swamp, mushroom island, and jungle. §e[*]§rRequires Per Biome Weather. + +option.FOG_DENSITY_INDOOR=Indoor Density +option.FOG_DENSITY_INDOOR.comment=Adjusts fog density multiplier while indoors. + +option.FOG_DENSITY_DH=Distant Horizons Density +option.FOG_DENSITY_DH.comment=Adjusts overworld fog density multiplier while Distant Horizons is enabled. + +#Height Fog +option.FOG_HEIGHT_Y=Base Height +option.FOG_HEIGHT_Y.comment=Adjusts the height where height fog starts occuring. + +option.FOG_HEIGHT_FALLOFF=Height Falloff +option.FOG_HEIGHT_FALLOFF.comment=Adjusts height fog's size. + +#Far Vanilla Fog +option.FAR_VANILLA_FOG_STYLE=Far Vanilla Fog Style +option.FAR_VANILLA_FOG_STYLE.comment=Spherical works like vanilla fog. Cylindrical ignores Y axis. +value.FAR_VANILLA_FOG_STYLE.0=Spherical +value.FAR_VANILLA_FOG_STYLE.1=Cylindrical + +option.FOG_DENSITY_VANILLA=Vanilla Density +option.FOG_DENSITY_VANILLA.comment=Adjusts fog density for vanilla fog. + +option.FOG_VANILLA_CLOUD=Vanilla Cloud Fog +option.FOG_VANILLA_CLOUD.comment=Enables fog on vanilla cloud. +value.FOG_VANILLA_CLOUD.0=§cOFF +value.FOG_VANILLA_CLOUD.1=Minimal +value.FOG_VANILLA_CLOUD.2=Reduced +value.FOG_VANILLA_CLOUD.3=Full + +#Skybox +option.ROUND_SUN_MOON=Round Sun & Moon +option.ROUND_SUN_MOON.comment=Enables shader based sun & moon. §e[*]§rDisable vanilla sun & moon in Video Settings > Details > Sun & Moon on 1.16.4 or below. + +option.ROUND_SUN_MOON_SIZE=Sun & Moon Size +option.ROUND_SUN_MOON_SIZE.comment=Adjusts size for round sun & moon and specular highlight. + +option.STARS=Stars +option.STARS.comment=Enables stars. + +option.AURORA=Aurora +option.AURORA.comment=Enables aurora. §a[+]§rThis effect benefits from TAA. + +option.SKYBOX_INTENSITY=Skybox Intensity +option.SKYBOX_INTENSITY.comment=Adjusts skybox intensity. + +option.SKYBOX_OPACITY=Skybox Opacity +option.SKYBOX_OPACITY.comment=Adjusts skybox opacity. §c[-]§rOnly available for 1.16.5 or above. + +option.SUN_INTENSITY=Sun Intensity +option.SUN_INTENSITY.comment=Adjusts skybox sun intensity. §c[-]§rOnly available for 1.16.5 or above. + +option.MOON_INTENSITY=Moon Intensity +option.MOON_INTENSITY.comment=Adjusts skybox moon intensity. §c[-]§rOnly available for 1.16.5 or above. + +#Water +option.WATER_MODE=Water Texture Mode +option.WATER_MODE.comment=Determines whether vanilla water texture should be used. Default : shader's flat water color, no texture. Vanilla : vanilla texture. Tinted Vanilla : vanilla texture with shader's water color. Flat Vanilla : vanilla's flat water color. +value.WATER_MODE.0=Default +value.WATER_MODE.1=Vanilla +value.WATER_MODE.2=Tinted Vanilla +value.WATER_MODE.3=Flat Vanilla + +option.WATER_ALPHA_MODE=Water Alpha Mode +option.WATER_ALPHA_MODE.comment=Determines whether the water uses shader based or texture alpha value. §e[*]§rSome effect will keep using shader based alpha value. +value.WATER_ALPHA_MODE.0=Flat +value.WATER_ALPHA_MODE.1=Vanilla + +option.WATER_NORMALS=Normals +option.WATER_NORMALS.comment=Enables realtime-generated normal mapping for water. +value.WATER_NORMALS.0=§cOFF +value.WATER_NORMALS.1=Worley +value.WATER_NORMALS.2=Perlin + +option.WATER_PARALLAX=Parallax +option.WATER_PARALLAX.comment=Enables water displacement. + +option.WATER_SHADOW_COLOR=Water Colored Shadows +option.WATER_SHADOW_COLOR.comment=Determines whether water should cast colored shadows for tinting. §e[*]§rEnabling this will prevent transparent objects from casting colored shadows when submerged. + +option.WATER_CAUSTICS=Water Caustics +option.WATER_CAUSTICS.comment=Determines whether water should cast caustics. §e[*]§rEnabling this will prevent transparent objects from casting colored shadows when submerged. §e[*]§rRequires realtime shadows. + +option.WATER_DETAIL=Detail +option.WATER_DETAIL.comment=Adjusts the ratio between large and small water normals. +value.WATER_DETAIL.0.05=5% +value.WATER_DETAIL.0.10=10% +value.WATER_DETAIL.0.15=15% +value.WATER_DETAIL.0.20=20% +value.WATER_DETAIL.0.25=25% +value.WATER_DETAIL.0.30=30% +value.WATER_DETAIL.0.35=35% +value.WATER_DETAIL.0.40=40% +value.WATER_DETAIL.0.45=45% +value.WATER_DETAIL.0.50=50% + +option.WATER_BUMP=Bumpiness +option.WATER_BUMP.comment=Adjusts the intensity of water normals. + +option.WATER_SHARPNESS=Sharpness +option.WATER_SHARPNESS.comment=Adjusts the sharpness of water normals and the amount of caustics. +value.WATER_SHARPNESS.0.8=Low +value.WATER_SHARPNESS.0.5=Medium +value.WATER_SHARPNESS.0.2=High + +option.WATER_SPEED=Speed +option.WATER_SPEED.comment=Adjusts the noise speed for water normals. + +option.WATER_FOG=Water Fog +option.WATER_FOG.comment=Determines whether water fog is only visible while underwater or at all times. +value.WATER_FOG.0=Underwater Only +value.WATER_FOG.1=Full + +option.WATER_FOG_DENSITY=Water Fog Density +option.WATER_FOG_DENSITY.comment=Adjusts water fog density. + +option.WATER_CAUSTICS_STRENGTH=Caustics Strength +option.WATER_CAUSTICS_STRENGTH.comment=Adjusts water caustics strength. + +option.WATER_PIXEL=Pixel Lock +option.WATER_PIXEL.comment=Applies pixelation effect on water normals. +value.WATER_PIXEL.0=OFF + +#Camera +option.DOF=Depth of Field +option.DOF.comment=Enables camera focus effect. +option.DOF_STRENGTH=DoF Strength +option.DOF_STRENGTH.comment=Adjusts the focus strength, higher value blurs quicker. + +option.MOTION_BLUR=Motion Blur +option.MOTION_BLUR.comment=Enables camera motion based blurring. + +option.MOTION_BLUR_STRENGTH=Motion Blur Strength +option.MOTION_BLUR_STRENGTH.comment=Adjusts motion blur intensity. + +option.BLOOM=Bloom +option.BLOOM.comment=Allows bright areas to glow. + +option.BLOOM_STRENGTH=Bloom Strength +option.BLOOM_STRENGTH.comment=Adjusts bloom intensity. + +option.BLOOM_CONTRAST=Bloom Contrast +option.BLOOM_CONTRAST.comment=Adjusts whether the bloom should preserve color contrast or detail visibility. Higher value preserves color contrast while lower value preserves detail visibility. +value.BLOOM_CONTRAST.-4=-1.00 +value.BLOOM_CONTRAST.-3=-0.75 +value.BLOOM_CONTRAST.-2=-0.50 +value.BLOOM_CONTRAST.-1=-0.25 +value.BLOOM_CONTRAST.0=0.00 +value.BLOOM_CONTRAST.1=0.25 +value.BLOOM_CONTRAST.2=0.50 +value.BLOOM_CONTRAST.3=0.75 +value.BLOOM_CONTRAST.4=1.00 + +option.BLOOM_RADIUS=Bloom Radius +option.BLOOM_RADIUS.comment=Adjusts how far the glow spreads. +value.BLOOM_RADIUS.1=Minimum +value.BLOOM_RADIUS.2=Very Low +value.BLOOM_RADIUS.3=Low +value.BLOOM_RADIUS.4=Medium +value.BLOOM_RADIUS.5=High +value.BLOOM_RADIUS.6=Very High +value.BLOOM_RADIUS.7=Maximum + +option.LENS_FLARE=Lens Flare +option.LENS_FLARE.comment=Enables lens flare. + +option.LENS_FLARE_STRENGTH=Lens Flare Strength +option.LENS_FLARE_STRENGTH.comment=Adjusts lens flare intensity. + +option.VIGNETTE=Vignette +option.VIGNETTE.comment=Fades the edge of the screen to black. §e[*]§rDisable for 360 imaging. + +option.VIGNETTE_STRENGTH=Vignette Strength +option.VIGNETTE_STRENGTH.comment=Adjusts vignette intensity. +value.VIGNETTE_STRENGTH.0.26=0.1 +value.VIGNETTE_STRENGTH.0.51=0.2 +value.VIGNETTE_STRENGTH.0.72=0.3 +value.VIGNETTE_STRENGTH.0.91=0.4 +value.VIGNETTE_STRENGTH.1.06=0.5 +value.VIGNETTE_STRENGTH.1.19=0.6 +value.VIGNETTE_STRENGTH.1.28=0.7 +value.VIGNETTE_STRENGTH.1.36=0.8 +value.VIGNETTE_STRENGTH.1.40=0.9 +value.VIGNETTE_STRENGTH.1.41=1.0 + +option.DIRTY_LENS=Dirty Lens +option.DIRTY_LENS.comment=Adds dusty particle effect to bloom. §e[*]§rRequires bloom. + +option.CHROMATIC_ABERRATION=Chromatic Aberration +option.CHROMATIC_ABERRATION.comment=Adds color distortion around the borders. +value.CHROMATIC_ABERRATION.0=OFF +value.CHROMATIC_ABERRATION.1=Weak +value.CHROMATIC_ABERRATION.2=Strong + + +option.UNDERWATER_DISTORTION=Underwater Distortion +option.UNDERWATER_DISTORTION.comment=Applies screen distortion while underwater. + +#Anti-aliasing +option.FXAA=FXAA +option.FXAA.comment=Enables fast approximate anti-aliasing, done by smoothing out edges with minimal performance cost. §e[*]§rPlease disable Antialiasing in Shaders menu while this option is enabled. + +option.TAA=TAA +option.TAA.comment=Enables temporal anti-aliasing, done by smart frame blending which captures improves tiny details and some effects. §e[*]§rSharpening included. §e[*]§rPlease disable Antialiasing in Shaders menu while this option is enabled. + +option.FXAA_SUBPIXEL=FXAA Subpixel Smoothing +option.FXAA_SUBPIXEL.comment=Adjusts how much smoothing should FXAA apply to tiny details. +value.FXAA_SUBPIXEL.0.00=§cOFF +value.FXAA_SUBPIXEL.0.25=Low +value.FXAA_SUBPIXEL.0.50=Medium +value.FXAA_SUBPIXEL.0.75=High +value.FXAA_SUBPIXEL.1.00=Very High + +option.FXAA_EDGE_SENSITIVITY=FXAA Edge Sensitivity +option.FXAA_EDGE_SENSITIVITY.comment=Adjusts how much edge contrast and brightness required to apply FXAA. +value.FXAA_EDGE_SENSITIVITY.0=Low +value.FXAA_EDGE_SENSITIVITY.1=Medium +value.FXAA_EDGE_SENSITIVITY.2=High + +option.TAA_MODE=TAA Mode +option.TAA_MODE.comment=Determines how TAA should be done. Smooth allows some effects to look better at the cost of ghosting. Coarse have less ghosting but barely improves other effects. +value.TAA_MODE.0=Smooth +value.TAA_MODE.1=Coarse + +option.TAA_SELECTIVE=Selective TAA +option.TAA_SELECTIVE.comment=Exclude entities, particles, and hand from temporal anti aliasing to reduce ghosting. §c[-]§rExcluded objects will need to rely on FXAA. + +#Color +option.LIGHT_MR=Red +option.LIGHT_MG=Green +option.LIGHT_MB=Blue +option.LIGHT_MI=Intensity + +option.LIGHT_DR=Red +option.LIGHT_DG=Green +option.LIGHT_DB=Blue +option.LIGHT_DI=Intensity + +option.LIGHT_ER=Red +option.LIGHT_EG=Green +option.LIGHT_EB=Blue +option.LIGHT_EI=Intensity + +option.LIGHT_NR=Red +option.LIGHT_NG=Green +option.LIGHT_NB=Blue +option.LIGHT_NI=Intensity + +option.AMBIENT_MR=Red +option.AMBIENT_MG=Green +option.AMBIENT_MB=Blue +option.AMBIENT_MI=Intensity + +option.AMBIENT_DR=Red +option.AMBIENT_DG=Green +option.AMBIENT_DB=Blue +option.AMBIENT_DI=Intensity + +option.AMBIENT_ER=Red +option.AMBIENT_EG=Green +option.AMBIENT_EB=Blue +option.AMBIENT_EI=Intensity + +option.AMBIENT_NR=Red +option.AMBIENT_NG=Green +option.AMBIENT_NB=Blue +option.AMBIENT_NI=Intensity + +option.MINLIGHT_R=Red +option.MINLIGHT_G=Green +option.MINLIGHT_B=Blue +option.MINLIGHT_I=Intensity +value.MINLIGHT_I.0.30=0.30 (Moody) +value.MINLIGHT_I.0.50=0.50 (Default) +value.MINLIGHT_I.0.70=0.70 (Bright) + +option.BLOCKLIGHT_R=Red +option.BLOCKLIGHT_G=Green +option.BLOCKLIGHT_B=Blue +option.BLOCKLIGHT_I=Intensity + +option.SKY_R=Red +option.SKY_G=Green +option.SKY_B=Blue +option.SKY_I=Intensity + +option.WATER_R=Red +option.WATER_G=Green +option.WATER_B=Blue +option.WATER_I=Intensity +option.WATER_A=Alpha +option.WATER_F=Fog Intensity + +option.WEATHER_RR=Red +option.WEATHER_RG=Green +option.WEATHER_RB=Blue +option.WEATHER_RI=Intensity + +option.WEATHER_CR=Red +option.WEATHER_CG=Green +option.WEATHER_CB=Blue +option.WEATHER_CI=Intensity + +option.WEATHER_DR=Red +option.WEATHER_DG=Green +option.WEATHER_DB=Blue +option.WEATHER_DI=Intensity + +option.WEATHER_BR=Red +option.WEATHER_BG=Green +option.WEATHER_BB=Blue +option.WEATHER_BI=Intensity + +option.WEATHER_SR=Red +option.WEATHER_SG=Green +option.WEATHER_SB=Blue +option.WEATHER_SI=Intensity + +option.WEATHER_MR=Red +option.WEATHER_MG=Green +option.WEATHER_MB=Blue +option.WEATHER_MI=Intensity + +option.WEATHER_VR=Red +option.WEATHER_VG=Green +option.WEATHER_VB=Blue +option.WEATHER_VI=Intensity + +option.WEATHER_JR=Red +option.WEATHER_JG=Green +option.WEATHER_JB=Blue +option.WEATHER_JI=Intensity + +option.AURORA_LR=Red +option.AURORA_LG=Green +option.AURORA_LB=Blue +option.AURORA_LI=Intensity + +option.AURORA_HR=Red +option.AURORA_HG=Green +option.AURORA_HB=Blue +option.AURORA_HI=Intensity + +option.NETHER_NR=Red +option.NETHER_NG=Green +option.NETHER_NB=Blue +option.NETHER_NI=Intensity + +option.NETHER_VR=Red +option.NETHER_VG=Green +option.NETHER_VB=Blue +option.NETHER_VI=Intensity + +option.NETHER_CR=Red +option.NETHER_CG=Green +option.NETHER_CB=Blue +option.NETHER_CI=Intensity + +option.NETHER_WR=Red +option.NETHER_WG=Green +option.NETHER_WB=Blue +option.NETHER_WI=Intensity + +option.NETHER_BR=Red +option.NETHER_BG=Green +option.NETHER_BB=Blue +option.NETHER_BI=Intensity + +option.END_R=Red +option.END_G=Green +option.END_B=Blue +option.END_I=Intensity + +option.EMISSIVE_RECOLOR=Emissive Recolor +option.EMISSIVE_RECOLOR.comment=Tints certain emissive blocks with blocklight color. + +option.SKY_VANILLA=Vanilla Sky +option.SKY_VANILLA.comment=Use vanilla sky color. + +option.SKY_VANILLA_USE_FOG=Use Vanilla Fog Color +option.SKY_VANILLA_USE_FOG.comment=Allows vanilla fog color to be used while Vanilla Sky is enabled. + +option.NETHER_VANILLA=Vanilla Nether +option.NETHER_VANILLA.comment=Use vanilla nether color. + +#Color Grading & Tonemap +option.EXPOSURE=Exposure +option.EXPOSURE.comment=Adjusts overall brightness. + +option.AUTO_EXPOSURE=Auto Exposure +option.AUTO_EXPOSURE.comment=Enables automatic adjustment to overall brightness. + +option.CLASSIC_EXPOSURE=Classic Exposure +option.CLASSIC_EXPOSURE.comment=Enables increased exposure when going indoors. + +option.COLOR_GRADING=Color Grading +option.COLOR_GRADING.comment=Enables color grading. §e[*]§rThis option doesn't need to be enabled to change tonemap, saturation, and vibrance sliders. + +option.TONEMAP_LOWER_CURVE=Tonemap Lower Curve +option.TONEMAP_LOWER_CURVE.comment=Adjusts contrast of darker colors. + +option.TONEMAP_UPPER_CURVE=Tonemap Upper Curve +option.TONEMAP_UPPER_CURVE.comment=Adjusts contrast of brighter colors. + +option.TONEMAP_WHITE_CURVE=Tonemap White Curve +option.TONEMAP_WHITE_CURVE.comment=Adjusts how quickly the tonemapped color can reach maximum brightness. + +option.TONEMAP_WHITE_PATH=Tonemap White Path +option.TONEMAP_WHITE_PATH.comment=Adjusts how quickly bright and saturated color turns into white. + +option.SATURATION=Saturation +option.SATURATION.comment=Adjusts saturation of all colors. + +option.VIBRANCE=Vibrance +option.VIBRANCE.comment=Adjusts saturation of less saturated colors, well saturated colors are less affected. + +#More Exposure Config +option.AUTO_EXPOSURE_RADIUS=Auto Exposure Radius +option.AUTO_EXPOSURE_RADIUS.comment=Adjusts how much of the screen being used for exposure calculation. +value.AUTO_EXPOSURE_RADIUS.0.002=Very Low +value.AUTO_EXPOSURE_RADIUS.0.04=Low +value.AUTO_EXPOSURE_RADIUS.0.18=Medium +value.AUTO_EXPOSURE_RADIUS.0.35=High +value.AUTO_EXPOSURE_RADIUS.0.7=Very High + +option.AUTO_EXPOSURE_SPEED=Auto Exposure Speed +option.AUTO_EXPOSURE_SPEED.comment=Adjusts how fast the exposure change occurs. §c[-]§rFast speed or above may cause flashing in combination with low radius. +value.AUTO_EXPOSURE_SPEED.0.0033=Very Slow +value.AUTO_EXPOSURE_SPEED.0.01=Slow +value.AUTO_EXPOSURE_SPEED.0.033=Medium +value.AUTO_EXPOSURE_SPEED.0.1=Fast +value.AUTO_EXPOSURE_SPEED.0.33=Very Fast + +#Color Grading Config +option.CG_RR=Red - Red Value +option.CG_RG=Red - Green Value +option.CG_RB=Red - Blue Value +option.CG_RI=Red Strength Value +option.CG_RM=Minimal Red Value +option.CG_RC=Red Curve Value + +option.CG_GR=Green - Red Value +option.CG_GG=Green - Green Value +option.CG_GB=Green - Blue Value +option.CG_GI=Green Strength Value +option.CG_GM=Minimal Green Value +option.CG_GC=Green Curve Value + +option.CG_BR=Blue - Red Value +option.CG_BG=Blue - Green Value +option.CG_BB=Blue - Blue Value +option.CG_BI=Blue Strength Value +option.CG_BM=Minimal Blue Value +option.CG_BC=Blue Curve Value + +option.CG_TR=Tint - Red Value +option.CG_TG=Tint - Green Value +option.CG_TB=Tint - Blue Value +option.CG_TI=Tint Strength Value +option.CG_TM=Tint Mix Value + +#Extras +option.OUTLINE=Outline +option.OUTLINE.comment=Enables outline effect. §c[-]§rBlack, Colored, and 1.12 Update Art are not fully compatible with volumetric clouds. +value.OUTLINE.0=OFF +value.OUTLINE.1=Black +value.OUTLINE.2=Colored +value.OUTLINE.3=1.12 Update Art +value.OUTLINE.4=Dungeons + +option.TOON_LIGHTMAP=Toon Lightmap +option.TOON_LIGHTMAP.comment=Reduces the quality of vanilla lighting for cel shading. §e[*]§rThis option is known for making the game "look bad", only enable this when needed. + +option.RETRO_FILTER=Retro Filter +option.RETRO_FILTER.comment=Adds pixelation and dithering. §c[-]§rIncompatible with anti-aliasing. + +option.RETRO_FILTER_SIZE=Retro Filter Size +option.RETRO_FILTER_SIZE.comment=Adjusts pixel size for retro filter. + +option.WORLD_CURVATURE=World Curvature +option.WORLD_CURVATURE.comment=Enables world curvature. §e[*]§rWorks in overworld only. §c[-]§rMissing chunks are handled by Minecraft itself which I can't fix. §c[-]§rMay break block selection highlight on 1.17. + +option.WORLD_CURVATURE_SIZE=World Curvature Size +option.WORLD_CURVATURE_SIZE.comment=Adjusts world curvature size. Negative values will bend the world upwards. + +#Animations +option.WORLD_TIME_ANIMATION=World Time Animation +option.WORLD_TIME_ANIMATION.comment=Use ingame time for moving objects. §e[*]§rThis option is mostly used when making cinematics. §c[-]§rThis option completely stops animation in the Nether & End. + +option.ANIMATION_SPEED=Animation Speed +option.ANIMATION_SPEED.comment=Adjusts animation speed. + +#Waving Blocks +option.WAVING_GRASS=Grass +option.WAVING_GRASS.comment=Allows grass to wave. + +option.WAVING_CROP=Crops +option.WAVING_CROP.comment=Allows plants on farmlands to wave. + +option.WAVING_PLANT=Plants +option.WAVING_PLANT.comment=Allows various plants to wave. + +option.WAVING_TALL_PLANT=Tall Plants +option.WAVING_TALL_PLANT.comment=Allows 2 block height plants to wave. + +option.WAVING_LEAF=Leaves +option.WAVING_LEAF.comment=Allows leaves to wave. + +option.WAVING_VINE=Vines +option.WAVING_VINE.comment=Allows vines to wave. + +option.WAVING_WATER=Water +option.WAVING_WATER.comment=Allows water to wave. + +option.WAVING_LAVA=Lava +option.WAVING_LAVA.comment=Allows lava to wave. + +option.WAVING_FIRE=Fire +option.WAVING_FIRE.comment=Allows fire to wave. + +option.WAVING_LANTERN=Lantern +option.WAVING_LANTERN.comment=Allows lantern to wave. \ No newline at end of file diff --git a/shaders/lib/antialiasing/fxaa.glsl b/shaders/lib/antialiasing/fxaa.glsl new file mode 100644 index 0000000..3780048 --- /dev/null +++ b/shaders/lib/antialiasing/fxaa.glsl @@ -0,0 +1,166 @@ +//FXAA 3.11 from http://blog.simonrodriguez.fr/articles/30-07-2016_implementing_fxaa.html +float quality[12] = float[12] (1.0, 1.0, 1.0, 1.0, 1.0, 1.5, 2.0, 2.0, 2.0, 2.0, 4.0, 8.0); + +#if FXAA_EDGE_SENSITIVITY == 0 +float edgeThreshold = 0.25; +float edgeThresholdMin = 0.0625; +#elif FXAA_EDGE_SENSITIVITY == 1 +float edgeThreshold = 0.125; +float edgeThresholdMin = 0.0312; +#elif FXAA_EDGE_SENSITIVITY == 2 +float edgeThreshold = 0.063; +float edgeThresholdMin = 0.0156; +#endif + +vec3 FXAA311(vec3 color) { + int iterations = 12; + + vec2 view = 1.0 / vec2(viewWidth, viewHeight); + + float lumaCenter = GetLuminance(color); + float lumaDown = GetLuminance(texture2DLod(colortex1, texCoord + vec2( 0.0, -1.0) * view, 0.0).rgb); + float lumaUp = GetLuminance(texture2DLod(colortex1, texCoord + vec2( 0.0, 1.0) * view, 0.0).rgb); + float lumaLeft = GetLuminance(texture2DLod(colortex1, texCoord + vec2(-1.0, 0.0) * view, 0.0).rgb); + float lumaRight = GetLuminance(texture2DLod(colortex1, texCoord + vec2( 1.0, 0.0) * view, 0.0).rgb); + + float lumaMin = min(lumaCenter, min(min(lumaDown, lumaUp), min(lumaLeft, lumaRight))); + float lumaMax = max(lumaCenter, max(max(lumaDown, lumaUp), max(lumaLeft, lumaRight))); + + float lumaRange = lumaMax - lumaMin; + + if (lumaRange > max(edgeThresholdMin, lumaMax * edgeThreshold)) { + float lumaDownLeft = GetLuminance(texture2DLod(colortex1, texCoord + vec2(-1.0, -1.0) * view, 0.0).rgb); + float lumaUpRight = GetLuminance(texture2DLod(colortex1, texCoord + vec2( 1.0, 1.0) * view, 0.0).rgb); + float lumaUpLeft = GetLuminance(texture2DLod(colortex1, texCoord + vec2(-1.0, 1.0) * view, 0.0).rgb); + float lumaDownRight = GetLuminance(texture2DLod(colortex1, texCoord + vec2( 1.0, -1.0) * view, 0.0).rgb); + + float lumaDownUp = lumaDown + lumaUp; + float lumaLeftRight = lumaLeft + lumaRight; + + float lumaLeftCorners = lumaDownLeft + lumaUpLeft; + float lumaDownCorners = lumaDownLeft + lumaDownRight; + float lumaRightCorners = lumaDownRight + lumaUpRight; + float lumaUpCorners = lumaUpRight + lumaUpLeft; + + float edgeHorizontal = abs(-2.0 * lumaLeft + lumaLeftCorners ) + + abs(-2.0 * lumaCenter + lumaDownUp ) * 2.0 + + abs(-2.0 * lumaRight + lumaRightCorners); + float edgeVertical = abs(-2.0 * lumaUp + lumaUpCorners ) + + abs(-2.0 * lumaCenter + lumaLeftRight ) * 2.0 + + abs(-2.0 * lumaDown + lumaDownCorners ); + + bool isHorizontal = (edgeHorizontal >= edgeVertical); + + float luma1 = isHorizontal ? lumaDown : lumaLeft; + float luma2 = isHorizontal ? lumaUp : lumaRight; + float gradient1 = luma1 - lumaCenter; + float gradient2 = luma2 - lumaCenter; + + bool is1Steepest = abs(gradient1) >= abs(gradient2); + float gradientScaled = 0.25 * max(abs(gradient1), abs(gradient2)); + + float stepLength = isHorizontal ? view.y : view.x; + + float lumaLocalAverage = 0.0; + + if (is1Steepest) { + stepLength = - stepLength; + lumaLocalAverage = 0.5 * (luma1 + lumaCenter); + } else { + lumaLocalAverage = 0.5 * (luma2 + lumaCenter); + } + + vec2 currentUv = texCoord; + if (isHorizontal) { + currentUv.y += stepLength * 0.5; + } else { + currentUv.x += stepLength * 0.5; + } + + vec2 offset = isHorizontal ? vec2(view.x, 0.0) : vec2(0.0, view.y); + + vec2 uv1 = currentUv - offset; + vec2 uv2 = currentUv + offset; + + float lumaEnd1 = GetLuminance(texture2DLod(colortex1, uv1, 0.0).rgb); + float lumaEnd2 = GetLuminance(texture2DLod(colortex1, uv2, 0.0).rgb); + lumaEnd1 -= lumaLocalAverage; + lumaEnd2 -= lumaLocalAverage; + + bool reached1 = abs(lumaEnd1) >= gradientScaled; + bool reached2 = abs(lumaEnd2) >= gradientScaled; + bool reachedBoth = reached1 && reached2; + + if (!reached1) { + uv1 -= offset; + } + if (!reached2) { + uv2 += offset; + } + + if (!reachedBoth) { + for(int i = 2; i < iterations; i++) { + if (!reached1) { + lumaEnd1 = GetLuminance(texture2DLod(colortex1, uv1, 0.0).rgb); + lumaEnd1 = lumaEnd1 - lumaLocalAverage; + } + if (!reached2) { + lumaEnd2 = GetLuminance(texture2DLod(colortex1, uv2, 0.0).rgb); + lumaEnd2 = lumaEnd2 - lumaLocalAverage; + } + + reached1 = abs(lumaEnd1) >= gradientScaled; + reached2 = abs(lumaEnd2) >= gradientScaled; + reachedBoth = reached1 && reached2; + + if (!reached1) { + uv1 -= offset * quality[i]; + } + if (!reached2) { + uv2 += offset * quality[i]; + } + + if (reachedBoth) break; + } + } + + float distance1 = isHorizontal ? (texCoord.x - uv1.x) : (texCoord.y - uv1.y); + float distance2 = isHorizontal ? (uv2.x - texCoord.x) : (uv2.y - texCoord.y); + + bool isDirection1 = distance1 < distance2; + float distanceFinal = min(distance1, distance2); + + float edgeThickness = (distance1 + distance2); + + float pixelOffset = - distanceFinal / edgeThickness + 0.5; + + bool isLumaCenterSmaller = lumaCenter < lumaLocalAverage; + + bool correctVariation = ((isDirection1 ? lumaEnd1 : lumaEnd2) < 0.0) != isLumaCenterSmaller; + + float finalOffset = correctVariation ? pixelOffset : 0.0; + + float lumaAverage = (1.0 / 12.0) * (2.0 * (lumaDownUp + lumaLeftRight) + lumaLeftCorners + lumaRightCorners); + float subPixelOffset1 = clamp(abs(lumaAverage - lumaCenter) / lumaRange, 0.0, 1.0); + float subPixelOffset2 = (-2.0 * subPixelOffset1 + 3.0) * subPixelOffset1 * subPixelOffset1; + float subPixelOffsetFinal = subPixelOffset2 * subPixelOffset2 * FXAA_SUBPIXEL; + + #ifdef TAA + subPixelOffsetFinal *= 0.5; + #endif + + finalOffset = max(finalOffset, subPixelOffsetFinal); + + // Compute the final UV coordinates. + vec2 finalUv = texCoord; + if (isHorizontal) { + finalUv.y += finalOffset * stepLength; + } else { + finalUv.x += finalOffset * stepLength; + } + + color = texture2DLod(colortex1, finalUv, 0.0).rgb; + } + + return color; +} \ No newline at end of file diff --git a/shaders/lib/antialiasing/taa.glsl b/shaders/lib/antialiasing/taa.glsl new file mode 100644 index 0000000..90d3591 --- /dev/null +++ b/shaders/lib/antialiasing/taa.glsl @@ -0,0 +1,182 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +vec2 neighbourOffsets[8] = vec2[8]( + vec2( 0.0, -1.0), + vec2(-1.0, 0.0), + vec2( 1.0, 0.0), + vec2( 0.0, 1.0), + vec2(-1.0, -1.0), + vec2( 1.0, -1.0), + vec2(-1.0, 1.0), + vec2( 1.0, 1.0) +); + +vec3 GetBlurredColor(vec2 view) { + float blurFactor = 0.1667; + vec3 color = texture2DLod(colortex1, texCoord + neighbourOffsets[4] * blurFactor / view, 0).rgb; + color+= texture2DLod(colortex1, texCoord + neighbourOffsets[5] * blurFactor / view, 0).rgb; + color+= texture2DLod(colortex1, texCoord + neighbourOffsets[6] * blurFactor / view, 0).rgb; + color+= texture2DLod(colortex1, texCoord + neighbourOffsets[7] * blurFactor / view, 0).rgb; + + color /= 4.0; + + return color; +} + +#ifdef TAA_SELECTIVE +float GetSkipFlag(float depth, vec2 view) { + float skip = texture2D(colortex3, texCoord.xy).b; + float skipDepth = depth; + + for (int i = 0; i < 4; i++) { + float sampleDepth = texture2D(depthtex1, texCoord + neighbourOffsets[i + 4] / view).r; + float sampleSkip = texture2D(colortex3, texCoord + neighbourOffsets[i + 4] / view).b; + + skip = (sampleDepth < skipDepth && sampleSkip == 0) ? 0 : skip; + skipDepth = min(skipDepth, sampleDepth); + } + + return skip; +} +#endif + +//Previous frame reprojection from Chocapic13 +vec2 Reprojection(vec3 pos) { + pos = pos * 2.0 - 1.0; + + vec4 viewPosPrev = gbufferProjectionInverse * vec4(pos, 1.0); + viewPosPrev /= viewPosPrev.w; + viewPosPrev = gbufferModelViewInverse * viewPosPrev; + + vec3 cameraOffset = cameraPosition - previousCameraPosition; + cameraOffset *= float(pos.z > 0.56); + + vec4 previousPosition = viewPosPrev + vec4(cameraOffset, 0.0); + previousPosition = gbufferPreviousModelView * previousPosition; + previousPosition = gbufferPreviousProjection * previousPosition; + return previousPosition.xy / previousPosition.w * 0.5 + 0.5; +} + +//Catmull-Rom sampling from Filmic SMAA presentation +vec3 textureCatmullRom(sampler2D colortex, vec2 texcoord, vec2 view) { + vec2 position = texcoord * view; + vec2 centerPosition = floor(position - 0.5) + 0.5; + vec2 f = position - centerPosition; + vec2 f2 = f * f; + vec2 f3 = f * f2; + + float c = 0.7; + vec2 w0 = -c * f3 + 2.0 * c * f2 - c * f; + vec2 w1 = (2.0 - c) * f3 - (3.0 - c) * f2 + 1.0; + vec2 w2 = -(2.0 - c) * f3 + (3.0 - 2.0 * c) * f2 + c * f; + vec2 w3 = c * f3 - c * f2; + + vec2 w12 = w1 + w2; + vec2 tc12 = (centerPosition + w2 / w12) / view; + + vec2 tc0 = (centerPosition - 1.0) / view; + vec2 tc3 = (centerPosition + 2.0) / view; + vec4 color = vec4(texture2DLod(colortex, vec2(tc12.x, tc0.y ), 0).gba, 1.0) * (w12.x * w0.y ) + + vec4(texture2DLod(colortex, vec2(tc0.x, tc12.y), 0).gba, 1.0) * (w0.x * w12.y) + + vec4(texture2DLod(colortex, vec2(tc12.x, tc12.y), 0).gba, 1.0) * (w12.x * w12.y) + + vec4(texture2DLod(colortex, vec2(tc3.x, tc12.y), 0).gba, 1.0) * (w3.x * w12.y) + + vec4(texture2DLod(colortex, vec2(tc12.x, tc3.y ), 0).gba, 1.0) * (w12.x * w3.y ); + return color.rgb / color.a; +} + +vec3 RGBToYCoCg(vec3 col) { + return vec3( + col.r * 0.25 + col.g * 0.5 + col.b * 0.25, + col.r * 0.5 - col.b * 0.5, + col.r * -0.25 + col.g * 0.5 + col.b * -0.25 + ); +} + +vec3 YCoCgToRGB(vec3 col) { + float n = col.r - col.b; + return vec3(n + col.g, col.r + col.b, n - col.g); +} + +vec3 ClipAABB(vec3 q,vec3 aabb_min, vec3 aabb_max){ + vec3 p_clip = 0.5 * (aabb_max + aabb_min); + vec3 e_clip = 0.5 * (aabb_max - aabb_min) + 0.00000001; + + vec3 v_clip = q - vec3(p_clip); + vec3 v_unit = v_clip.xyz / e_clip; + vec3 a_unit = abs(v_unit); + float ma_unit = max(a_unit.x, max(a_unit.y, a_unit.z)); + + if (ma_unit > 1.0) + return vec3(p_clip) + v_clip / ma_unit; + else + return q; +} + +vec3 NeighbourhoodClipping(vec3 color, vec3 tempColor, vec2 view) { + vec3 minclr = RGBToYCoCg(color); + vec3 maxclr = minclr; + + for(int i = 0; i < 8; i++) { + vec2 offset = neighbourOffsets[i] * view; + vec3 clr = texture2DLod(colortex1, texCoord + offset, 0.0).rgb; + + clr = RGBToYCoCg(clr); + minclr = min(minclr, clr); maxclr = max(maxclr, clr); + } + + tempColor = RGBToYCoCg(tempColor); + tempColor = ClipAABB(tempColor, minclr, maxclr); + + return YCoCgToRGB(tempColor); +} + +vec4 TemporalAA(inout vec3 color, float tempData) { + vec2 view = vec2(viewWidth, viewHeight); + + vec3 blur = GetBlurredColor(view); + float depth = texture2D(depthtex1, texCoord).r; + + #ifdef TAA_SELECTIVE + float skip = GetSkipFlag(depth, view); + + if (skip > 0.0) { + color = blur; + return vec4(tempData, vec3(0.0)); + } + #endif + + vec3 coord = vec3(texCoord, depth); + vec2 prvCoord = Reprojection(coord); + + vec3 tempColor = textureCatmullRom(colortex2, prvCoord, view); + + if(tempColor == vec3(0.0)) { + color = blur; + return vec4(tempData, color); + } + + vec3 tempColorRaw = tempColor; + tempColor = NeighbourhoodClipping(color, tempColor, 1.0 / view); + + #if TAA_MODE == 0 + vec2 velocity = (texCoord - prvCoord.xy) * view; + float blendFactor = float( + prvCoord.x > 0.0 && prvCoord.x < 1.0 && + prvCoord.y > 0.0 && prvCoord.y < 1.0 + ); + blendFactor *= exp(-length(velocity)) * 0.2 + 0.7; + + color = mix(color, tempColor, blendFactor); + #endif + + vec3 outColor = color; + + #if TAA_MODE == 1 + color = mix(color, tempColor, 0.5); + #endif + + return vec4(tempData, outColor); +} \ No newline at end of file diff --git a/shaders/lib/atmospherics/clouds.glsl b/shaders/lib/atmospherics/clouds.glsl new file mode 100644 index 0000000..fcb58e8 --- /dev/null +++ b/shaders/lib/atmospherics/clouds.glsl @@ -0,0 +1,385 @@ +#ifdef OVERWORLD +float CloudSampleBase(vec2 coord, vec2 wind, float cloudGradient, float sunCoverage, float dither, float multiplier) { + coord.xy *= 0.004; + + #if CLOUD_BASE == 0 + float noiseBase = texture2D(noisetex, coord * 0.25 + wind).r; + #else + float noiseBase = texture2D(noisetex, coord * 0.5 + wind).g; + noiseBase = pow(1.0 - noiseBase, 2.0) * 0.5 + 0.25; + #endif + + float detailZ = floor(cloudGradient * float(CLOUD_THICKNESS)) * 0.04; + float noiseDetailLow = texture2D(noisetex, coord.xy * 0.5 - wind * 2.0 + detailZ).b; + float noiseDetailHigh = texture2D(noisetex, coord.xy * 0.5 - wind * 2.0 + detailZ + 0.04).b; + float noiseDetail = mix(noiseDetailLow, noiseDetailHigh, fract(cloudGradient * float(CLOUD_THICKNESS))); + + float noiseCoverage = abs(cloudGradient - 0.125); + noiseCoverage *= cloudGradient > 0.125 ? (2.14 - CLOUD_AMOUNT * 0.1) : 8.0; + noiseCoverage = noiseCoverage * noiseCoverage * 4.0; + + float noise = mix(noiseBase, noiseDetail, 0.0476 * CLOUD_DETAIL) * 21.0 - noiseCoverage; + noise = mix(noise, 21.0 - noiseCoverage * 2.5, 0.33 * rainStrength); + + noise = max(noise - (sunCoverage * 3.0 + CLOUD_AMOUNT), 0.0); + noise *= CLOUD_DENSITY * multiplier; + noise *= (1.0 - 0.75 * rainStrength); + noise = noise / sqrt(noise * noise + 0.5); + + return noise; +} + +float CloudSampleSkybox(vec2 coord, vec2 wind, float cloudGradient, float sunCoverage, float dither) { + return CloudSampleBase(coord, wind, cloudGradient, sunCoverage, dither, 0.125); +} + +float CloudSampleVolumetric(vec2 coord, vec2 wind, float cloudGradient, float sunCoverage, float dither) { + coord.xy /= CLOUD_VOLUMETRIC_SCALE; + return CloudSampleBase(coord, wind, cloudGradient, sunCoverage, dither, 0.125); +} + +float InvLerp(float v, float l, float h) { + return clamp((v - l) / (h - l), 0.0, 1.0); +} + +vec4 DrawCloudSkybox(vec3 viewPos, float z, float dither, vec3 lightCol, vec3 ambientCol, bool fadeFaster) { + if (z < 1.0) return vec4(0.0); + + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + int samples = CLOUD_THICKNESS * 2; + + float cloud = 0.0, cloudLighting = 0.0; + + float sampleStep = 1.0 / samples; + float currentStep = dither * sampleStep; + + vec3 nViewPos = normalize(viewPos); + float VoU = dot(nViewPos, upVec); + float VoL = dot(nViewPos, lightVec); + + float sunCoverage = mix(abs(VoL), max(VoL, 0.0), shadowFade); + sunCoverage = pow(clamp(sunCoverage * 2.0 - 1.0, 0.0, 1.0), 12.0) * (1.0 - rainStrength); + + vec2 wind = vec2( + frametime * CLOUD_SPEED * 0.0005, + sin(frametime * CLOUD_SPEED * 0.001) * 0.005 + ) * CLOUD_HEIGHT / 15.0; + + vec3 cloudColor = vec3(0.0); + + if (VoU > 0.025) { + vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz); + + float halfVoL = mix(abs(VoL) * 0.8, VoL, shadowFade) * 0.5 + 0.5; + float halfVoLSqr = halfVoL * halfVoL; + float scattering = pow(halfVoL, 6.0); + float noiseLightFactor = (2.0 - 1.5 * VoL * shadowFade) * CLOUD_DENSITY * 0.5; + + for(int i = 0; i < samples; i++) { + if (cloud > 0.99) break; + vec3 planeCoord = wpos * ((CLOUD_HEIGHT + currentStep * CLOUD_THICKNESS) / wpos.y); + vec2 coord = cameraPosition.xz * 0.0625 * 16.0 / CLOUD_VOLUMETRIC_SCALE + planeCoord.xz; + + float noise = CloudSampleSkybox(coord, wind, currentStep, sunCoverage, dither); + + float sampleLighting = pow(currentStep, 1.125 * halfVoLSqr + 0.875) * 0.8 + 0.2; + sampleLighting *= 1.0 - pow(noise, noiseLightFactor); + + cloudLighting = mix(cloudLighting, sampleLighting, noise * (1.0 - cloud * cloud)); + cloud = mix(cloud, 1.0, noise); + + currentStep += sampleStep; + } + cloudLighting = mix(cloudLighting, 1.0, (1.0 - cloud * cloud) * scattering * 0.5); + cloudLighting *= (1.0 - 0.9 * rainStrength); + + cloudColor = mix( + ambientCol * (0.3 * sunVisibility + 0.5), + lightCol * (0.85 + 1.15 * scattering), + cloudLighting + ); + cloudColor *= 1.0 - 0.4 * rainStrength; + + cloud *= clamp(1.0 - exp(-16.0 / max(fogDensity, 0.5) * VoU + 0.5), 0.0, 1.0); + + if (fadeFaster) { + cloud *= 1.0 - pow(1.0 - VoU, 4.0); + } + } + cloudColor *= CLOUD_BRIGHTNESS * (0.5 - 0.25 * (1.0 - sunVisibility) * (1.0 - rainStrength)); + // cloudColor *= voidFade; + #if MC_VERSION >= 11800 + cloudColor *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + cloudColor *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + #ifdef UNDERGROUND_SKY + cloud *= mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + #endif + + return vec4(cloudColor, cloud * cloud * CLOUD_OPACITY); +} + +vec3 GetReflectedCameraPos(vec3 worldPos, vec3 normal) { + vec4 worldNormal = gbufferModelViewInverse * vec4(normal, 1.0); + worldNormal.xyz /= worldNormal.w; + + vec3 cameraPos = cameraPosition + 2.0 * worldNormal.xyz * dot(worldPos, worldNormal.xyz); + cameraPos = cameraPos + reflect(worldPos, worldNormal.xyz); //bobbing stabilizer, works like magic + + return cameraPos; +} + +vec4 DrawCloudVolumetric(vec3 viewPos, vec3 cameraPos, float z, float dither, vec3 lightCol, vec3 ambientCol, inout float cloudViewLength, bool fadeFaster) { + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + vec3 nViewPos = normalize(viewPos); + vec3 worldPos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz; + vec3 nWorldPos = normalize(worldPos); + float viewLength = length(viewPos); + + float cloudHeight = CLOUD_HEIGHT * CLOUD_VOLUMETRIC_SCALE + 70; + // float cloudHeight = CLOUD_HEIGHT * CLOUD_VOLUMETRIC_SCALE + cameraPosition.y; + // float cloudHeight = 63; + + float lowerY = cloudHeight; + float upperY = cloudHeight + CLOUD_THICKNESS * CLOUD_VOLUMETRIC_SCALE; + + float lowerPlane = (lowerY - cameraPos.y) / nWorldPos.y; + float upperPlane = (upperY - cameraPos.y) / nWorldPos.y; + + float nearestPlane = max(min(lowerPlane, upperPlane), 0.0); + float furthestPlane = max(lowerPlane, upperPlane); + + float maxcloudViewLength = cloudViewLength; + + if (furthestPlane < 0) return vec4(0.0); + + float planeDifference = furthestPlane - nearestPlane; + + vec3 startPos = cameraPos + nearestPlane * nWorldPos; + + float scaling = abs(cameraPosition.y - (upperY + lowerY) * 0.5) / ((upperY - lowerY) * 0.5); + scaling = clamp((scaling - 1.0) * CLOUD_THICKNESS * 0.125, 0.0, 1.0); + + float sampleLength = CLOUD_THICKNESS * CLOUD_VOLUMETRIC_SCALE / 2.0; + sampleLength /= (4.0 * nWorldPos.y * nWorldPos.y) * scaling + 1.0; + vec3 sampleStep = nWorldPos * sampleLength; + int samples = int(min(planeDifference / sampleLength, 32) + 1); + + vec3 samplePos = startPos + sampleStep * dither; + float sampleTotalLength = nearestPlane + sampleLength * dither; + + vec2 wind = vec2( + frametime * CLOUD_SPEED * 0.0005, + sin(frametime * CLOUD_SPEED * 0.001) * 0.005 + ) * CLOUD_HEIGHT / 15.0; + + float cloud = 0.0; + float cloudFaded = 0.0; + float cloudLighting = 0.0; + + float VoU = dot(nViewPos, upVec); + float VoL = dot(nViewPos, lightVec); + + float sunCoverage = mix(abs(VoL), max(VoL, 0.0), shadowFade); + sunCoverage = pow(clamp(sunCoverage * 2.0 - 1.0, 0.0, 1.0), 12.0) * (1.0 - rainStrength); + + float halfVoL = mix(abs(VoL) * 0.8, VoL, shadowFade) * 0.5 + 0.5; + float halfVoLSqr = halfVoL * halfVoL; + + float scattering = pow(halfVoL, 6.0); + float noiseLightFactor = (2.0 - 1.5 * VoL * shadowFade) * CLOUD_DENSITY * 0.5; + + float viewLengthSoftMin = viewLength - sampleLength * 0.5; + float viewLengthSoftMax = viewLength + sampleLength * 0.5; + + float fade = 1.0; + float fadeStart = 32.0 / max(fogDensity, 0.5); + float fadeEnd = (fadeFaster ? 80.0 : 240.0) / max(fogDensity, 0.5); + + for (int i = 0; i < samples; i++) { + if (cloud > 0.99) break; + if (sampleTotalLength > viewLengthSoftMax && z < 1.0) break; + + float cloudGradient = InvLerp(samplePos.y, lowerY, upperY); + float xzNormalizedDistance = length(samplePos.xz - cameraPos.xz) / CLOUD_VOLUMETRIC_SCALE; + + float noise = CloudSampleVolumetric(samplePos.xz, wind, cloudGradient, sunCoverage, dither); + noise *= step(lowerY, samplePos.y) * step(samplePos.y, upperY); + + float sampleLighting = pow(cloudGradient, 1.125 * halfVoLSqr + 0.875) * 0.8 + 0.2; + sampleLighting *= 1.0 - pow(noise, noiseLightFactor); + + float sampleFade = InvLerp(xzNormalizedDistance, fadeEnd, fadeStart); + fade *= mix(1.0, sampleFade, noise * (1.0 - cloud)); + noise *= step(xzNormalizedDistance, fadeEnd); + + cloudLighting = mix(cloudLighting, sampleLighting, noise * (1.0 - cloud * cloud)); + + if (z < 1.0) { + noise *= InvLerp(sampleTotalLength, viewLengthSoftMax, viewLengthSoftMin); + } + + cloud = mix(cloud, 1.0, noise); + + if (cloudViewLength == maxcloudViewLength && cloud > 0.5) { + cloudViewLength = sampleTotalLength; + } + + samplePos += sampleStep; + sampleTotalLength += sampleLength; + } + + cloudFaded = cloud * fade; + + cloudLighting = mix(cloudLighting, 1.0, (1.0 - cloud * cloud) * scattering * 0.5); + cloudLighting *= (1.0 - 0.9 * rainStrength); + + vec3 cloudColor = mix( + ambientCol * (0.3 * sunVisibility + 0.5), + lightCol * (0.85 + 1.15 * scattering), + cloudLighting + ); + + cloudColor *= 1.0 - 0.4 * rainStrength; + cloudColor *= CLOUD_BRIGHTNESS * (0.5 - 0.25 * (1.0 - sunVisibility) * (1.0 - rainStrength)); + + cloudFaded *= cloudFaded * CLOUD_OPACITY; + + if (cloudFaded < dither) { + cloudViewLength = maxcloudViewLength; + } + + return vec4(cloudColor, cloudFaded); +} + +float GetNoise(vec2 pos) { + return fract(sin(dot(pos, vec2(12.9898, 4.1414))) * 43758.5453); +} + +void DrawStars(inout vec3 color, vec3 viewPos) { + vec3 wpos = vec3(gbufferModelViewInverse * vec4(viewPos * 100.0, 1.0)); + vec3 planeCoord = wpos / (wpos.y + length(wpos.xz)); + vec2 wind = vec2(frametime, 0.0); + vec2 coord = planeCoord.xz * 0.4 + cameraPosition.xz * 0.0001 + wind * 0.00125; + coord = floor(coord * 1024.0) / 1024.0; + + float VoU = clamp(dot(normalize(viewPos), upVec), 0.0, 1.0); + float VoL = dot(normalize(viewPos), sunVec); + float multiplier = sqrt(sqrt(VoU)) * 5.0 * (1.0 - rainStrength) * moonVisibility; + + float star = 1.0; + if (VoU > 0.0) { + star *= GetNoise(coord.xy); + star *= GetNoise(coord.xy + 0.10); + star *= GetNoise(coord.xy + 0.23); + } + star = clamp(star - 0.8125, 0.0, 1.0) * multiplier; + //star *= voidFade; + #if MC_VERSION >= 11800 + star *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + star *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + #ifdef UNDERGROUND_SKY + star *= mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + #endif + + float moonFade = smoothstep(-0.997,-0.992, VoL); + star *= moonFade; + + color += star * pow(lightNight, vec3(0.8)); +} + +#ifdef AURORA +#include "/lib/color/auroraColor.glsl" + +float AuroraSample(vec2 coord, vec2 wind, float VoU) { + float noise = texture2D(noisetex, coord * 0.0625 + wind * 0.25).b * 3.0; + noise+= texture2D(noisetex, coord * 0.03125 + wind * 0.15).b * 3.0; + + noise = max(1.0 - 4.0 * (0.5 * VoU + 0.5) * abs(noise - 3.0), 0.0); + + return noise; +} + +vec3 DrawAurora(vec3 viewPos, float dither, int samples) { + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + float sampleStep = 1.0 / samples; + float currentStep = dither * sampleStep; + + float VoU = dot(normalize(viewPos), upVec); + + float visibility = moonVisibility * (1.0 - rainStrength) * (1.0 - rainStrength); + + #ifdef WEATHER_PERBIOME + visibility *= isCold * isCold; + #endif + + vec2 wind = vec2( + frametime * CLOUD_SPEED * 0.000125, + sin(frametime * CLOUD_SPEED * 0.05) * 0.00025 + ); + + vec3 aurora = vec3(0.0); + + if (VoU > 0.0 && visibility > 0.0) { + vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz); + for(int i = 0; i < samples; i++) { + vec3 planeCoord = wpos * ((8.0 + currentStep * 7.0) / wpos.y) * 0.004; + + vec2 coord = cameraPosition.xz * 0.00004 + planeCoord.xz; + coord += vec2(coord.y, -coord.x) * 0.3; + + float noise = AuroraSample(coord, wind, VoU); + + if (noise > 0.0) { + noise *= texture2D(noisetex, coord * 0.125 + wind * 0.25).b; + noise *= 0.5 * texture2D(noisetex, coord + wind * 16.0).b + 0.75; + noise = noise * noise * 3.0 * sampleStep; + noise *= max(sqrt(1.0 - length(planeCoord.xz) * 3.75), 0.0); + + vec3 auroraColor = mix(auroraLowCol, auroraHighCol, pow(currentStep, 0.4)); + aurora += noise * auroraColor * exp2(-6.0 * i * sampleStep); + } + currentStep += sampleStep; + } + } + // visibility *= voidFade; + #if MC_VERSION >= 11800 + visibility *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + visibility *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + #ifdef UNDERGROUND_SKY + visibility *= mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + #endif + + return aurora * visibility; +} +#endif +#endif \ No newline at end of file diff --git a/shaders/lib/atmospherics/fog.glsl b/shaders/lib/atmospherics/fog.glsl new file mode 100644 index 0000000..4e364ef --- /dev/null +++ b/shaders/lib/atmospherics/fog.glsl @@ -0,0 +1,190 @@ +#ifdef OVERWORLD +vec3 GetFogColor(vec3 viewPos) { + vec3 nViewPos = normalize(viewPos); + float lViewPos = length(viewPos) / 64.0; + lViewPos = 1.0 - exp(-lViewPos * lViewPos); + + float VoU = clamp(dot(nViewPos, upVec), -1.0, 1.0); + float VoL = clamp(dot(nViewPos, sunVec), -1.0, 1.0); + + float density = 0.4; + float nightDensity = 1.0; + float weatherDensity = 1.5; + float groundDensity = 0.08 * (4.0 - 3.0 * sunVisibility) * + (10.0 * rainStrength * rainStrength + 1.0); + + float exposure = exp2(timeBrightness * 0.75 - 0.75); + float nightExposure = exp2(-3.5); + + float baseGradient = exp(-(VoU * 0.5 + 0.5) * 0.5 / density); + + float groundVoU = clamp(-VoU * 0.5 + 0.5, 0.0, 1.0); + float ground = 1.0 - exp(-groundDensity / groundVoU); + + vec3 fog = fogCol * baseGradient / (SKY_I * SKY_I); + fog = fog / sqrt(fog * fog + 1.0) * exposure * sunVisibility * (SKY_I * SKY_I); + + float sunMix = (VoL * 0.5 + 0.5) * pow(clamp(1.0 - VoU, 0.0, 1.0), 2.0 - sunVisibility) * + pow(1.0 - timeBrightness * 0.6, 3.0); + float horizonMix = pow(1.0 - abs(VoU), 2.5) * 0.125; + float lightMix = (1.0 - (1.0 - sunMix) * (1.0 - horizonMix)) * lViewPos; + + vec3 lightFog = pow(lightSun, vec3(4.0 - sunVisibility)) * baseGradient; + lightFog = lightFog / (1.0 + lightFog * rainStrength); + + fog = mix( + sqrt(fog * (1.0 - lightMix)), + sqrt(lightFog), + lightMix + ); + fog *= fog; + + float nightGradient = exp(-(VoU * 0.5 + 0.5) * 0.35 / nightDensity); + vec3 nightFog = lightNight * lightNight * nightGradient * nightExposure; + fog = mix(nightFog, fog, sunVisibility * sunVisibility); + + float rainGradient = exp(-(VoU * 0.5 + 0.5) * 0.125 / weatherDensity); + vec3 weatherFog = weatherCol.rgb * weatherCol.rgb; + weatherFog *= GetLuminance(ambientCol / (weatherFog)) * (0.2 * sunVisibility + 0.2); + fog = mix(fog, weatherFog * rainGradient, rainStrength); + fog = mix(minLightCol * 0.5, fog * eBS, eBS); + + //fog *= voidFade; + #if MC_VERSION >= 11800 + fog *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + fog *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + return fog; +} +#endif + +void NormalFog(inout vec3 color, vec3 viewPos) { + float viewLength = length(viewPos); + + vec4 worldPos = gbufferModelViewInverse * vec4(viewPos, 1.0); + worldPos.xyz /= worldPos.w; + + #if FAR_VANILLA_FOG > 0 + #if FAR_VANILLA_FOG_STYLE == 0 + float fogFactor = viewLength; + #else + float fogFactor = length(worldPos.xz); + #endif + #endif + + #ifdef OVERWORLD + float fog = viewLength * fogDensity / 1024.0; + float clearDay = sunVisibility * (1.0 - rainStrength); + + #ifdef DISTANT_HORIZONS + fog *= FOG_DENSITY_DH; + #endif + + fog *= mix(FOG_DENSITY_INDOOR, mix(1.0, FOG_DENSITY_WEATHER, rainStrength) / mix(1.0 / FOG_DENSITY_NIGHT, 1.0, clearDay) * eBS, eBS); + fog = min(fog, (fog - 0.8) * 0.25 + 0.8); + + #ifdef FOG_HEIGHT + fog *= exp2(-max(worldPos.y + cameraPosition.y - FOG_HEIGHT_Y, 0.0) / exp2(FOG_HEIGHT_FALLOFF)); + #endif + + fog = 1.0 - exp(-2.0 * pow(fog, 0.35 * clearDay * eBS + 1.25)); + + vec3 fogColor = GetFogColor(viewPos); + + #if FAR_VANILLA_FOG == 1 || FAR_VANILLA_FOG == 3 + if(isEyeInWater == 0.0){ + #if MC_VERSION >= 11800 + float fogOffset = 0.0; + #else + float fogOffset = 12.0; + #endif + + float fogFar = far; + float vanillaDensity = 0.2; + #ifdef DISTANT_HORIZONS + fogFar = dhFarPlane * 0.5; + vanillaDensity = 0.4; + #endif + + float vanillaFog = 1.0 - (fogFar - (fogFactor + fogOffset)) / (vanillaDensity * fogFar * FOG_DENSITY_VANILLA); + vanillaFog = clamp(vanillaFog, 0.0, 1.0); + + if(vanillaFog > 0.0){ + vec3 vanillaFogColor = GetSkyColor(viewPos, false); + + vanillaFogColor *= 1.0 + nightVision; + #ifdef CLASSIC_EXPOSURE + vanillaFogColor *= 4.0 - 3.0 * eBS; + #endif + + fogColor *= fog; + + fog = mix(fog, 1.0, vanillaFog); + if(fog > 0.0) fogColor = mix(fogColor, vanillaFogColor, vanillaFog) / fog; + } + } + #endif + #endif + + #ifdef NETHER + float fog = 2.0 * pow(viewLength * fogDensity / 256.0, 1.5); + + #if FAR_VANILLA_FOG == 2 || FAR_VANILLA_FOG == 3 + #ifndef DISTANT_HORIZONS + fog += 6.0 * pow(fogFactor * 1.5 / far, 4.0); + #else + fog += 6.0 * pow(fogFactor * 3.0 / dhFarPlane, 4.0); + #endif + #endif + + fog = 1.0 - exp(-fog); + + vec3 fogColor = netherCol.rgb * 0.0425; + #endif + + #ifdef END + float fog = viewLength * fogDensity / 512.0; + + #if FAR_VANILLA_FOG == 2 || FAR_VANILLA_FOG == 3 + #ifndef DISTANT_HORIZONS + fog += 2.0 * pow(fogFactor * 1.5 / far, 4.0); + #else + fog += 2.0 * pow(fogFactor * 3.0 / dhFarPlane, 4.0); + #endif + #endif + + fog = 1.0 - exp(-fog); + + vec3 fogColor = endCol.rgb * 0.003; + #ifndef LIGHT_SHAFT + fogColor *= 4.0; + #endif + #endif + + color = mix(color, fogColor, fog); +} + +void BlindFog(inout vec3 color, vec3 viewPos) { + float fog = length(viewPos) * max(blindFactor * 0.2, darknessFactor * 0.075); + fog = (1.0 - exp(-6.0 * fog * fog * fog)) * max(blindFactor, darknessFactor); + color = mix(color, vec3(0.0), fog); +} + +vec3 denseFogColor[2] = vec3[2]( + vec3(1.0, 0.3, 0.01), + vec3(0.1, 0.16, 0.2) +); + +void DenseFog(inout vec3 color, vec3 viewPos) { + float fog = length(viewPos) * 0.5; + fog = (1.0 - exp(-4.0 * fog * fog * fog)); + color = mix(color, denseFogColor[isEyeInWater - 2], fog); +} + +void Fog(inout vec3 color, vec3 viewPos) { + NormalFog(color, viewPos); + if (isEyeInWater > 1) DenseFog(color, viewPos); + if (blindFactor > 0.0 || darknessFactor > 0.0) BlindFog(color, viewPos); +} \ No newline at end of file diff --git a/shaders/lib/atmospherics/sky.glsl b/shaders/lib/atmospherics/sky.glsl new file mode 100644 index 0000000..e9dbcd4 --- /dev/null +++ b/shaders/lib/atmospherics/sky.glsl @@ -0,0 +1,77 @@ +#ifdef OVERWORLD +vec3 GetSkyColor(vec3 viewPos, bool isReflection) { + vec3 nViewPos = normalize(viewPos); + + float VoU = clamp(dot(nViewPos, upVec), -1.0, 1.0); + float VoL = clamp(dot(nViewPos, sunVec), -1.0, 1.0); + + float groundDensity = 0.1 * (4.0 - 3.0 * sunVisibility) * + (10.0 * rainStrength * rainStrength + 1.0); + + float exposure = exp2(timeBrightness * 0.75 - 0.75 + SKY_EXPOSURE_D); + float nightExposure = exp2(-3.5 + SKY_EXPOSURE_N); + float weatherExposure = exp2(SKY_EXPOSURE_W); + + float gradientCurve = mix(SKY_HORIZON_F, SKY_HORIZON_N, VoL); + float baseGradient = exp(-(1.0 - pow(1.0 - max(VoU, 0.0), gradientCurve)) / + SKY_DENSITY_D); + + #if SKY_GROUND > 0 + float groundVoU = clamp(-VoU * 1.015 - 0.015, 0.0, 1.0); + float ground = 1.0 - exp(-groundDensity * max(fogDensity, 0.125) / groundVoU); + #if SKY_GROUND == 1 + if (!isReflection) ground = 1.0; + #endif + #else + float ground = 1.0; + #endif + + vec3 sky = skyCol; + #ifdef SKY_VANILLA + sky = mix(sky, fogCol, pow(1.0 - max(VoU, 0.0), 4.0)); + #endif + sky *= baseGradient / (SKY_I * SKY_I); + sky = sky / sqrt(sky * sky + 1.0) * exposure * sunVisibility * (SKY_I * SKY_I); + + float sunMix = (VoL * 0.5 + 0.5) * pow(clamp(1.0 - VoU, 0.0, 1.0), 2.0 - sunVisibility) * + pow(1.0 - timeBrightness * 0.6, 3.0); + float horizonMix = pow(1.0 - abs(VoU), 2.5) * 0.125; + float lightMix = (1.0 - (1.0 - sunMix) * (1.0 - horizonMix)); + + vec3 lightSky = pow(lightSun, vec3(4.0 - sunVisibility)) * baseGradient; + lightSky = lightSky / (1.0 + lightSky * rainStrength); + + sky = mix( + sqrt(sky * (1.0 - lightMix)), + sqrt(lightSky), + lightMix + ); + sky *= sky; + + float nightGradient = exp(-max(VoU, 0.0) / SKY_DENSITY_N); + vec3 nightSky = lightNight * lightNight * nightGradient * nightExposure; + sky = mix(nightSky, sky, sunVisibility * sunVisibility); + + float rainGradient = exp(-max(VoU, 0.0) / SKY_DENSITY_W); + vec3 weatherSky = weatherCol.rgb * weatherCol.rgb * weatherExposure; + weatherSky *= GetLuminance(ambientCol / (weatherSky)) * (0.2 * sunVisibility + 0.2); + sky = mix(sky, weatherSky * rainGradient, rainStrength); + + sky *= ground; + + #ifdef UNDERGROUND_SKY + float ug = mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + sky = mix(minLightCol * 0.125, sky, ug); + #endif + + // sky *= voidFade; + #if MC_VERSION >= 11800 + sky *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + sky *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + return sky; +} + +#endif \ No newline at end of file diff --git a/shaders/lib/atmospherics/sunmoon.glsl b/shaders/lib/atmospherics/sunmoon.glsl new file mode 100644 index 0000000..a8645a3 --- /dev/null +++ b/shaders/lib/atmospherics/sunmoon.glsl @@ -0,0 +1,85 @@ +void RoundSunMoon(inout vec3 color, vec3 viewPos, vec3 sunColor, vec3 moonColor) { + vec3 nViewPos = normalize(viewPos); + + float VoL = dot(nViewPos, sunVec); + float VoU = dot(nViewPos, upVec); + + if (VoU < -0.1) { + return; + } + + float isMoon = float(VoL < 0.0); + + float sunMoonSize = (0.007 - 0.004 * isMoon) * ROUND_SUN_MOON_SIZE; + + float sun = pow(smoothstep(1.0 - sunMoonSize, 1.0, abs(VoL)), 3.0); + float miniGlare = pow(abs(VoL), 192.0 + 64.0 * isMoon) * (0.05 - 0.04 * isMoon); + + float sunFade = smoothstep(0.0, 1.0, 1.0 - pow(1.0 - max(VoU * 0.98 + 0.02, 0.0), 8.0)); + float glareFade = smoothstep(0.0, 1.0, 1.0 - pow(1.0 - max(VoU * 0.93 + 0.07, 0.0), 8.0)); + float rainVisibility = 1.0 - sqrt(rainStrength); + + vec3 moonNormal = vec3(0.0); + + if (sun > 0.0 && isMoon > 0.5 && moonPhase > 0) { + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle + 0.0001 - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + + vec3 nextSunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + vec3 sunTangent = normalize(nextSunVec - sunVec); + vec3 sunBinormal = -cross(sunVec, sunTangent); + + float VoLt = dot(nViewPos, sunTangent); + float VoLb = dot(nViewPos, sunBinormal); + + float rad = 0.08 * sqrt(ROUND_SUN_MOON_SIZE); + + float moonNormalX = clamp(VoLt / rad, -1.0, 1.0); + float moonNormalY = clamp(VoLb / rad, -1.0, 1.0); + float moonNormalZ = sqrt(1.0 - moonNormalX * moonNormalX - moonNormalY * moonNormalY); + moonNormal = vec3(moonNormalX, moonNormalY, moonNormalZ); + if (sun > 0.0 && (moonNormalX * moonNormalX + moonNormalY * moonNormalY) > 1) color.r += 8.0; + + vec3 moonPhaseVec = moonPhaseVecs[moonPhase]; + float moonPhase = smoothstep(moonDiffuse[moonPhase].x, moonDiffuse[moonPhase].y, dot(moonNormal, moonPhaseVec)); + float glaremoonPhase = (1.0 - moonPhase) * pow(sun,0.25); + sun *= moonPhase; + miniGlare *= 1.0 - glaremoonPhase; + } + + sun *= sunFade * rainVisibility; + miniGlare *= glareFade * rainVisibility; + + float sunColorPower = pow(1.0 - max(VoU, 0.0), 16.0) * 4.0 * sunVisibility + 1.0; + + vec3 sunCol = pow(sunColor, vec3(sunColorPower)) * sunVisibility * SUN_INTENSITY * SUN_INTENSITY; + vec3 moonCol = moonColor * moonVisibility * MOON_INTENSITY * MOON_INTENSITY; + vec3 sunMoonCol = mix(sunCol, moonCol, isMoon); + + color += (sun + miniGlare) * sunMoonCol * 4.0; +} + +void SunGlare(inout vec3 color, vec3 viewPos, vec3 lightCol) { + float VoL = dot(normalize(viewPos), lightVec); + float visfactor = 0.05 * (-0.8 * timeBrightness + 1.0) * (3.0 * rainStrength + 1.0); + float invvisfactor = 1.0 - visfactor; + + float visibility = clamp(VoL * 0.5 + 0.5, 0.0, 1.0); + visibility = visfactor / (1.0 - invvisfactor * visibility) - visfactor; + visibility = clamp(visibility * 1.015 / invvisfactor - 0.015, 0.0, 1.0); + visibility = mix(1.0, visibility, 0.03125 * eBS + 0.96875) * (1.0 - rainStrength * eBS * 0.875); + visibility *= shadowFade * LIGHT_SHAFT_STRENGTH; + //visibility *= voidFade; + #if MC_VERSION >= 11800 + visibility *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + visibility *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + #ifdef LIGHT_SHAFT + if (isEyeInWater == 1) color += 0.25 * lightCol * visibility; + #else + color += 0.25 * lightCol * visibility * (1.0 + 0.25 * isEyeInWater); + #endif +} \ No newline at end of file diff --git a/shaders/lib/atmospherics/volumetricLight.glsl b/shaders/lib/atmospherics/volumetricLight.glsl new file mode 100644 index 0000000..0585b7c --- /dev/null +++ b/shaders/lib/atmospherics/volumetricLight.glsl @@ -0,0 +1,162 @@ +float GetLogarithmicDepth(float dist) { + return (far * (dist - near)) / (dist * (far - near)); +} + +float GetLinearDepth2(float depth) { + return 2.0 * near * far / (far + near - (2.0 * depth - 1.0) * (far - near)); +} + +vec4 DistortShadow(vec4 shadowpos, float distortFactor) { + shadowpos.xy *= 1.0 / distortFactor; + shadowpos.z = shadowpos.z * 0.2; + shadowpos = shadowpos * 0.5 + 0.5; + + return shadowpos; +} + +vec4 GetWorldSpace(float shadowdepth, vec2 texCoord) { + vec4 viewPos = gbufferProjectionInverse * (vec4(texCoord, shadowdepth, 1.0) * 2.0 - 1.0); + viewPos /= viewPos.w; + + vec4 wpos = gbufferModelViewInverse * viewPos; + wpos /= wpos.w; + + return wpos; +} + +vec4 GetShadowSpace(vec4 wpos) { + wpos = shadowModelView * wpos; + wpos = shadowProjection * wpos; + wpos /= wpos.w; + + float distb = sqrt(wpos.x * wpos.x + wpos.y * wpos.y); + float distortFactor = 1.0 - shadowMapBias + distb * shadowMapBias; + wpos = DistortShadow(wpos,distortFactor); + + return wpos; +} + +//Light shafts from Robobo1221 (modified) +vec3 GetLightShafts(float pixeldepth0, float pixeldepth1, vec3 color, float dither) { + vec3 vl = vec3(0.0); + + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + vec3 screenPos = vec3(texCoord, pixeldepth0); + vec4 viewPos = gbufferProjectionInverse * (vec4(screenPos, 1.0) * 2.0 - 1.0); + viewPos /= viewPos.w; + + vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + float VoL = dot(normalize(viewPos.xyz), lightVec); + + #ifdef OVERWORLD + float visfactor = 0.05 * (-0.8 * timeBrightness + 1.0) * (3.0 * rainStrength + 1.0); + float invvisfactor = 1.0 - visfactor; + + float visibility = clamp(VoL * 0.5 + 0.5, 0.0, 1.0); + visibility = visfactor / (1.0 - invvisfactor * visibility) - visfactor; + visibility = clamp(visibility * 1.015 / invvisfactor - 0.015, 0.0, 1.0); + visibility = mix(1.0, visibility, 0.03125 * eBS + 0.96875); + #endif + + #ifdef END + VoL = pow(VoL * 0.5 + 0.5, 16.0) * 0.75 + 0.25; + float visibility = VoL; + #endif + + visibility *= 0.14285 * float(pixeldepth0 > 0.56); + + if (visibility > 0.0) { + float maxDist = 128.0; + + float depth0 = GetLinearDepth2(pixeldepth0); + float depth1 = GetLinearDepth2(pixeldepth1); + vec4 worldposition = vec4(0.0); + vec4 shadowposition = vec4(0.0); + + vec3 watercol = mix(vec3(1.0), + waterColor.rgb / (waterColor.a * waterColor.a), + pow(waterAlpha, 0.25)); + + for(int i = 0; i < 7; i++) { + float minDist = exp2(i + dither) - 0.95; + if (minDist >= maxDist) break; + + if (depth1 < minDist || (depth0 < minDist && color == vec3(0.0))) { + break; + } + + worldposition = GetWorldSpace(GetLogarithmicDepth(minDist), texCoord.st); + shadowposition = GetShadowSpace(worldposition); + shadowposition.z += 0.0512 / shadowMapResolution; + + if (length(shadowposition.xy * 2.0 - 1.0) < 1.0) { + float shadow0 = shadow2D(shadowtex0, shadowposition.xyz).z; + + vec3 shadowCol = vec3(0.0); + #ifdef SHADOW_COLOR + if (shadow0 < 1.0) { + float shadow1 = shadow2D(shadowtex1, shadowposition.xyz).z; + if (shadow1 > 0.0) { + shadowCol = texture2D(shadowcolor0, shadowposition.xy).rgb; + shadowCol *= shadowCol * shadow1; + #ifdef WATER_CAUSTICS + shadowCol *= 16.0 - 15.0 * (1.0 - (1.0 - shadow0) * (1.0 - shadow0)); + #endif + } + } + #endif + + shadow0 *= shadow0; + shadowCol *= shadowCol; + + vec3 shadow = clamp(shadowCol * (1.0 - shadow0) + shadow0, vec3(0.0), vec3(16.0)); + + if (depth0 < minDist) shadow *= color; + else if (isEyeInWater == 1.0) { + #ifdef WATER_SHADOW_COLOR + shadow *= 0.125 * (1.0 + eBS); + #else + shadow *= watercol * 0.01 * (1.0 + eBS); + #endif + } + + #ifdef END + vec3 npos = worldposition.xyz + cameraPosition.xyz + vec3(frametime * 4.0, 0, 0); + float n3da = texture2D(noisetex, npos.xz / 512.0 + floor(npos.y / 3.0) * 0.35).r; + float n3db = texture2D(noisetex, npos.xz / 512.0 + floor(npos.y / 3.0 + 1.0) * 0.35).r; + float noise = mix(n3da, n3db, fract(npos.y / 3.0)); + noise = sin(noise * 28.0 + frametime * 4.0) * 0.25 + 0.5; + shadow *= noise; + #endif + + vl += shadow; + } + else{ + vl += 1.0; + } + } + + //vl *= voidFade; + #if MC_VERSION >= 11800 + vl *= clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0); + #else + vl *= clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0); + #endif + + #ifdef UNDERGROUND_SKY + vl *= mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + #endif + + vl = sqrt(vl * visibility); + if(dot(vl, vl) > 0.0) vl += (dither - 0.25) / 128.0; + } + + return vl; +} \ No newline at end of file diff --git a/shaders/lib/atmospherics/waterFog.glsl b/shaders/lib/atmospherics/waterFog.glsl new file mode 100644 index 0000000..369f0be --- /dev/null +++ b/shaders/lib/atmospherics/waterFog.glsl @@ -0,0 +1,28 @@ +#if (WATER_MODE == 1 || WATER_MODE == 3) && !defined SKY_VANILLA && (!defined NETHER || !defined NETHER_VANILLA) +uniform vec3 fogColor; +#endif + +vec4 GetWaterFog(vec3 viewPos) { + float fog = length(viewPos) / waterFogRange; + fog = 1.0 - exp(-2.0 * fog); + + #if WATER_MODE == 0 || WATER_MODE == 2 + vec3 waterFogColor = waterColor.rgb * waterColor.a; + #elif WATER_MODE == 1 || WATER_MODE == 3 + vec3 waterFogColor = fogColor * fogColor * 0.125; + #endif + waterFogColor *= WATER_F * WATER_F * (1.0 - max(blindFactor, darknessFactor)); + + #ifdef OVERWORLD + vec3 waterFogTint = lightCol * eBS * shadowFade * 0.9 + 0.1; + #endif + #ifdef NETHER + vec3 waterFogTint = netherCol.rgb; + #endif + #ifdef END + vec3 waterFogTint = endCol.rgb; + #endif + waterFogTint = sqrt(waterFogTint * length(waterFogTint)); + + return vec4(waterFogColor * waterFogTint, fog); +} \ No newline at end of file diff --git a/shaders/lib/atmospherics/weatherDensity.glsl b/shaders/lib/atmospherics/weatherDensity.glsl new file mode 100644 index 0000000..f76a259 --- /dev/null +++ b/shaders/lib/atmospherics/weatherDensity.glsl @@ -0,0 +1,14 @@ +#if defined WEATHER_PERBIOME && defined OVERWORLD +float fogDensity = FOG_DENSITY * mix( + 1.0, + ( + FOG_DENSITY_COLD * isCold + + FOG_DENSITY_DRY * (isDesert + isMesa + isSavanna) + + FOG_DENSITY_DAMP * (isSwamp + isMushroom + isJungle) + ) / max(weatherWeight, 0.0001), + weatherWeight +); + +#else +float fogDensity = FOG_DENSITY; +#endif \ No newline at end of file diff --git a/shaders/lib/color/auroraColor.glsl b/shaders/lib/color/auroraColor.glsl new file mode 100644 index 0000000..f34dff0 --- /dev/null +++ b/shaders/lib/color/auroraColor.glsl @@ -0,0 +1,4 @@ +vec3 auroraLowColSqrt = vec3(AURORA_LR, AURORA_LG, AURORA_LB) * AURORA_LI / 255.0; +vec3 auroraLowCol = auroraLowColSqrt * auroraLowColSqrt; +vec3 auroraHighColSqrt = vec3(AURORA_HR, AURORA_HG, AURORA_HB) * AURORA_HI / 255.0; +vec3 auroraHighCol = auroraHighColSqrt * auroraHighColSqrt; \ No newline at end of file diff --git a/shaders/lib/color/blocklightColor.glsl b/shaders/lib/color/blocklightColor.glsl new file mode 100644 index 0000000..eda5607 --- /dev/null +++ b/shaders/lib/color/blocklightColor.glsl @@ -0,0 +1,2 @@ +vec3 blocklightColSqrt = vec3(BLOCKLIGHT_R, BLOCKLIGHT_G, BLOCKLIGHT_B) * BLOCKLIGHT_I / 255.0; +vec3 blocklightCol = blocklightColSqrt * blocklightColSqrt; \ No newline at end of file diff --git a/shaders/lib/color/dimensionColor.glsl b/shaders/lib/color/dimensionColor.glsl new file mode 100644 index 0000000..012b406 --- /dev/null +++ b/shaders/lib/color/dimensionColor.glsl @@ -0,0 +1,14 @@ +#ifdef OVERWORLD +#include "lightColor.glsl" +#endif + +#ifdef NETHER +#include "netherColor.glsl" +#endif + +#ifdef END +#include "endColor.glsl" +#endif + +vec3 minLightColSqrt = vec3(MINLIGHT_R, MINLIGHT_G, MINLIGHT_B) * MINLIGHT_I / 255.0; +vec3 minLightCol = minLightColSqrt * minLightColSqrt * 0.04; \ No newline at end of file diff --git a/shaders/lib/color/endColor.glsl b/shaders/lib/color/endColor.glsl new file mode 100644 index 0000000..316f0ff --- /dev/null +++ b/shaders/lib/color/endColor.glsl @@ -0,0 +1,2 @@ +vec4 endColSqrt = vec4(vec3(END_R, END_G, END_B) / 255.0, 1.0) * END_I; +vec4 endCol = endColSqrt * endColSqrt; \ No newline at end of file diff --git a/shaders/lib/color/lightColor.glsl b/shaders/lib/color/lightColor.glsl new file mode 100644 index 0000000..5c5d3b1 --- /dev/null +++ b/shaders/lib/color/lightColor.glsl @@ -0,0 +1,69 @@ +vec3 lightMorning = vec3(LIGHT_MR, LIGHT_MG, LIGHT_MB) * LIGHT_MI / 255.0; +vec3 lightDay = vec3(LIGHT_DR, LIGHT_DG, LIGHT_DB) * LIGHT_DI / 255.0; +vec3 lightEvening = vec3(LIGHT_ER, LIGHT_EG, LIGHT_EB) * LIGHT_EI / 255.0; +vec3 lightNight = vec3(LIGHT_NR, LIGHT_NG, LIGHT_NB) * LIGHT_NI * 0.3 / 255.0; + +vec3 ambientMorning = vec3(AMBIENT_MR, AMBIENT_MG, AMBIENT_MB) * AMBIENT_MI / 255.0; +vec3 ambientDay = vec3(AMBIENT_DR, AMBIENT_DG, AMBIENT_DB) * AMBIENT_DI / 255.0; +vec3 ambientEvening = vec3(AMBIENT_ER, AMBIENT_EG, AMBIENT_EB) * AMBIENT_EI / 255.0; +vec3 ambientNight = vec3(AMBIENT_NR, AMBIENT_NG, AMBIENT_NB) * AMBIENT_NI * 0.3 / 255.0; + +#ifdef WEATHER_PERBIOME +uniform float isDesert, isMesa, isCold, isSwamp, isMushroom, isSavanna, isJungle; + +vec4 weatherRain = vec4(vec3(WEATHER_RR, WEATHER_RG, WEATHER_RB) / 255.0, 1.0) * WEATHER_RI; +vec4 weatherCold = vec4(vec3(WEATHER_CR, WEATHER_CG, WEATHER_CB) / 255.0, 1.0) * WEATHER_CI; +vec4 weatherDesert = vec4(vec3(WEATHER_DR, WEATHER_DG, WEATHER_DB) / 255.0, 1.0) * WEATHER_DI; +vec4 weatherBadlands = vec4(vec3(WEATHER_BR, WEATHER_BG, WEATHER_BB) / 255.0, 1.0) * WEATHER_BI; +vec4 weatherSwamp = vec4(vec3(WEATHER_SR, WEATHER_SG, WEATHER_SB) / 255.0, 1.0) * WEATHER_SI; +vec4 weatherMushroom = vec4(vec3(WEATHER_MR, WEATHER_MG, WEATHER_MB) / 255.0, 1.0) * WEATHER_MI; +vec4 weatherSavanna = vec4(vec3(WEATHER_VR, WEATHER_VG, WEATHER_VB) / 255.0, 1.0) * WEATHER_VI; +vec4 weatherJungle = vec4(vec3(WEATHER_JR, WEATHER_JG, WEATHER_JB) / 255.0, 1.0) * WEATHER_JI; + +float weatherWeight = isCold + isDesert + isMesa + isSwamp + isMushroom + isSavanna + isJungle; + +vec4 weatherCol = mix( + weatherRain, + ( + weatherCold * isCold + weatherDesert * isDesert + weatherBadlands * isMesa + + weatherSwamp * isSwamp + weatherMushroom * isMushroom + weatherSavanna * isSavanna + + weatherJungle * isJungle + ) / max(weatherWeight, 0.0001), + weatherWeight +); + +#else +vec4 weatherCol = vec4(vec3(WEATHER_RR, WEATHER_RG, WEATHER_RB) / 255.0, 1.0) * WEATHER_RI; +#endif + +float mefade = 1.0 - clamp(abs(timeAngle - 0.5) * 8.0 - 1.5, 0.0, 1.0); +float dfade = 1.0 - pow(1.0 - timeBrightness, 1.5); + +vec3 CalcSunColor(vec3 morning, vec3 day, vec3 evening) { + vec3 me = mix(morning, evening, mefade); + return mix(me, day, dfade); +} + +vec3 CalcLightColor(vec3 sun, vec3 night, vec3 weatherCol) { + vec3 c = mix(night, sun, sunVisibility); + c = mix(c, dot(c, vec3(0.299, 0.587, 0.114)) * weatherCol, rainStrength); + return c * c; +} + +vec3 lightSun = mix(mix(lightMorning, lightEvening, mefade), lightDay, dfade); + +vec3 ambientSun = mix(mix(ambientMorning, ambientEvening, mefade), ambientDay, dfade); + +vec3 lightColRaw = mix(lightNight, lightSun, sunVisibility); +vec3 lightColSqrt = mix(lightColRaw, dot(lightColRaw, vec3(0.299, 0.587, 0.114)) * weatherCol.rgb, rainStrength); +vec3 lightCol = lightColSqrt * lightColSqrt; + +vec3 ambientColRaw = mix(ambientNight, ambientSun, sunVisibility); +vec3 ambientColSqrt = mix(ambientColRaw, dot(ambientColRaw, vec3(0.299, 0.587, 0.114)) * weatherCol.rgb, rainStrength); +vec3 ambientCol = ambientColSqrt * ambientColSqrt; + +// vec3 lightSun = CalcSunColor(lightMorning, lightDay, lightEvening); +// vec3 ambientSun = CalcSunColor(ambientMorning, ambientDay, ambientEvening); + +// vec3 lightCol = CalcLightColor(lightSun, lightNight, weatherCol.rgb); +// vec3 ambientCol = CalcLightColor(ambientSun, ambientNight, weatherCol.rgb); \ No newline at end of file diff --git a/shaders/lib/color/netherColor.glsl b/shaders/lib/color/netherColor.glsl new file mode 100644 index 0000000..56b69d1 --- /dev/null +++ b/shaders/lib/color/netherColor.glsl @@ -0,0 +1,28 @@ +vec4 netherNether = vec4(vec3(NETHER_NR, NETHER_NG, NETHER_NB) / 255.0, 1.0) * NETHER_NI; +vec4 netherValley = vec4(vec3(NETHER_VR, NETHER_VG, NETHER_VB) / 255.0, 1.0) * NETHER_VI; +vec4 netherCrimson = vec4(vec3(NETHER_CR, NETHER_CG, NETHER_CB) / 255.0, 1.0) * NETHER_CI; +vec4 netherWarped = vec4(vec3(NETHER_WR, NETHER_WG, NETHER_WB) / 255.0, 1.0) * NETHER_WI; +vec4 netherBasalt = vec4(vec3(NETHER_BR, NETHER_BG, NETHER_BB) / 255.0, 1.0) * NETHER_BI; + +#ifdef NETHER_VANILLA +uniform vec3 fogColor; +vec4 netherColSqrt = vec4(normalize(fogColor + 0.0001), length(fogColor)); +#else +#ifdef WEATHER_PERBIOME +uniform float isValley, isCrimson, isWarped, isBasalt; +float nBiomeWeight = isValley + isCrimson + isWarped + isBasalt; + +vec4 netherColSqrt = mix( + netherNether, + ( + netherValley * isValley + netherCrimson * isCrimson + + netherWarped * isWarped + netherBasalt * isBasalt + ) / max(nBiomeWeight, 0.0001), + nBiomeWeight +); +#else +vec4 netherColSqrt = netherNether; +#endif +#endif + +vec4 netherCol = netherColSqrt * netherColSqrt; \ No newline at end of file diff --git a/shaders/lib/color/skyColor.glsl b/shaders/lib/color/skyColor.glsl new file mode 100644 index 0000000..43dab0f --- /dev/null +++ b/shaders/lib/color/skyColor.glsl @@ -0,0 +1,15 @@ +#ifdef SKY_VANILLA +uniform vec3 skyColor; +uniform vec3 fogColor; + +vec3 skyCol = pow(skyColor, vec3(2.2)) * SKY_I * SKY_I; +#ifdef SKY_VANILLA_USE_FOG +vec3 fogCol = pow(fogColor, vec3(2.2)) * SKY_I * SKY_I; +#else +vec3 fogCol = skyCol; +#endif +#else +vec3 skyColSqrt = vec3(SKY_R, SKY_G, SKY_B) * SKY_I / 255.0; +vec3 skyCol = skyColSqrt * skyColSqrt; +vec3 fogCol = skyCol; +#endif \ No newline at end of file diff --git a/shaders/lib/color/specularColor.glsl b/shaders/lib/color/specularColor.glsl new file mode 100644 index 0000000..9798c24 --- /dev/null +++ b/shaders/lib/color/specularColor.glsl @@ -0,0 +1,32 @@ +vec3 GetMetalCol(float f0) { + int metalidx = int(f0 * 255.0); + + if (metalidx == 230) return vec3(0.24867, 0.22965, 0.21366); + if (metalidx == 231) return vec3(0.88140, 0.57256, 0.11450); + if (metalidx == 232) return vec3(0.81715, 0.82021, 0.83177); + if (metalidx == 233) return vec3(0.27446, 0.27330, 0.27357); + if (metalidx == 234) return vec3(0.84430, 0.48677, 0.22164); + if (metalidx == 235) return vec3(0.36501, 0.35675, 0.37653); + if (metalidx == 236) return vec3(0.42648, 0.37772, 0.31138); + if (metalidx == 237) return vec3(0.91830, 0.89219, 0.83662); + return vec3(1.0); +} + +vec3 GetSpecularColor(float skylight, float metalness, vec3 baseReflectance){ + vec3 specularColor = vec3(0.0); + #ifdef OVERWORLD + vec3 lightME = mix(lightMorning, lightEvening, mefade); + vec3 lightDaySpec = mix(sqrt(lightME), sqrt(lightDay), dfade * 0.7); + vec3 lightNightSpec = sqrt(lightNight * LIGHT_NI * 0.2); + specularColor = mix(lightNightSpec, lightDaySpec * lightDaySpec, sunVisibility); + specularColor *= specularColor * skylight; + #endif + #ifdef END + specularColor = endCol.rgb * 0.35; + #endif + + specularColor = pow(specularColor, vec3(1.0 - 0.5 * metalness)) * + pow(max(length(specularColor), 0.0001), 0.5 * metalness); + + return specularColor; +} \ No newline at end of file diff --git a/shaders/lib/color/waterColor.glsl b/shaders/lib/color/waterColor.glsl new file mode 100644 index 0000000..3323090 --- /dev/null +++ b/shaders/lib/color/waterColor.glsl @@ -0,0 +1,5 @@ +vec4 waterColorSqrt = vec4(vec3(WATER_R, WATER_G, WATER_B) / 255.0, 1.0) * WATER_I; +vec4 waterColor = waterColorSqrt * waterColorSqrt; + +const float waterAlpha = WATER_A; +const float waterFogRange = 64.0 / WATER_FOG_DENSITY; \ No newline at end of file diff --git a/shaders/lib/lighting/ambientOcclusion.glsl b/shaders/lib/lighting/ambientOcclusion.glsl new file mode 100644 index 0000000..9894917 --- /dev/null +++ b/shaders/lib/lighting/ambientOcclusion.glsl @@ -0,0 +1,95 @@ +vec2 OffsetDist(float x) { + float n = fract(x * 8.0) * 3.1415; + return vec2(cos(n), sin(n)) * x; +} + +float AmbientOcclusion(float dither) { + float ao = 0.0; + + float depth = texture2D(depthtex0, texCoord).r; + if(depth >= 1.0) return 1.0; + + float hand = float(depth < 0.56); + depth = GetLinearDepth(depth); + + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + float currentStep = 0.198 * dither + 0.01; + + float radius = 0.5; + float fovScale = gbufferProjection[1][1] / 1.37; + float distScale = max((far - near) * depth + near, 5.0); + vec2 scale = radius * vec2(1.0 / aspectRatio, 1.0) * fovScale / distScale; + float mult = (0.7 / radius) * (far - near) * (hand > 0.5 ? 1024.0 : 1.0); + + for(int i = 0; i < 5; i++) { + vec2 offset = OffsetDist(currentStep) * scale; + float angle = 0.0, dist = 0.0; + + for(int i = 0; i < 2; i++){ + float sampleDepth = GetLinearDepth(texture2D(depthtex0, texCoord + offset).r); + float aoSample = (depth - sampleDepth) * mult / currentStep; + angle += clamp(0.5 - aoSample, 0.0, 1.0); + dist += clamp(0.25 * aoSample - 1.0, 0.0, 1.0); + offset = -offset; + } + + ao += clamp(angle + dist, 0.0, 1.0); + currentStep += 0.198; + } + ao *= 0.2; + + return ao; +} + +#ifdef DISTANT_HORIZONS +float DHAmbientOcclusion(float dither) { + float ao = 0.0; + + float depth = texture2D(dhDepthTex0, texCoord).r; + if(depth >= 1.0) return 1.0; + + depth = GetDHLinearDepth(depth); + + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + float currentStep = 0.198 * dither + 0.01; + + float radius = 4.0; + float fovScale = gbufferProjection[1][1] / 1.37; + float distScale = max((dhFarPlane - dhNearPlane) * depth + dhNearPlane, 5.0); + vec2 scale = radius * vec2(1.0 / aspectRatio, 1.0) * fovScale / distScale; + float mult = (0.7 / radius) * (dhFarPlane - dhNearPlane); + + for(int i = 0; i < 5; i++) { + vec2 offset = OffsetDist(currentStep) * scale; + float angle = 0.0, dist = 0.0; + + for(int i = 0; i < 2; i++){ + float sampleDepth = GetDHLinearDepth(texture2D(dhDepthTex0, texCoord + offset).r); + float aoSample = (depth - sampleDepth) * mult / currentStep; + angle += clamp(0.5 - aoSample, 0.0, 1.0); + dist += clamp(0.25 * aoSample - 1.0, 0.0, 1.0); + offset = -offset; + } + + ao += clamp(angle + dist, 0.0, 1.0); + currentStep += 0.198; + } + ao *= 0.2; + + return ao; +} +#endif \ No newline at end of file diff --git a/shaders/lib/lighting/coloredBlocklight.glsl b/shaders/lib/lighting/coloredBlocklight.glsl new file mode 100644 index 0000000..8278985 --- /dev/null +++ b/shaders/lib/lighting/coloredBlocklight.glsl @@ -0,0 +1,35 @@ +vec2 Reprojection(vec3 pos) { + pos = pos * 2.0 - 1.0; + + vec4 viewPosPrev = gbufferProjectionInverse * vec4(pos, 1.0); + viewPosPrev /= viewPosPrev.w; + viewPosPrev = gbufferModelViewInverse * viewPosPrev; + + vec3 cameraOffset = cameraPosition - previousCameraPosition; + cameraOffset *= float(pos.z > 0.56); + + vec4 previousPosition = viewPosPrev + vec4(cameraOffset, 0.0); + previousPosition = gbufferPreviousModelView * previousPosition; + previousPosition = gbufferPreviousProjection * previousPosition; + return previousPosition.xy / previousPosition.w * 0.5 + 0.5; +} + +vec3 ApplyMultiColoredBlocklight(vec3 blocklightCol, vec3 screenPos) { + if (screenPos.z > 0.56) { + screenPos.xy = Reprojection(screenPos); + } + vec3 coloredLight = texture2DLod(colortex9, screenPos.xy, 2).rgb; + + #ifndef MCBL_LEGACY_COLOR + vec3 coloredLightNormalized = coloredLight + 0.000001; + coloredLightNormalized = normalize(coloredLightNormalized * coloredLightNormalized) * 0.875 + 0.125; + coloredLightNormalized *= GetLuminance(blocklightCol) * 1.7; + float coloredLightMix = min((coloredLight.r + coloredLight.g + coloredLight.b) * 2048.0, 1.0); + #else + vec3 coloredLightNormalized = normalize(coloredLight + 0.00001); + coloredLightNormalized *= GetLuminance(blocklightCol) / GetLuminance(coloredLightNormalized); + float coloredLightMix = min((coloredLight.r + coloredLight.g + coloredLight.b) * 256.0, 1.0); + #endif + + return mix(blocklightCol, coloredLightNormalized, coloredLightMix); +} \ No newline at end of file diff --git a/shaders/lib/lighting/forwardLighting.glsl b/shaders/lib/lighting/forwardLighting.glsl new file mode 100644 index 0000000..788c855 --- /dev/null +++ b/shaders/lib/lighting/forwardLighting.glsl @@ -0,0 +1,153 @@ +#if defined OVERWORLD || defined END +#include "/lib/lighting/shadows.glsl" +#endif + +void GetLighting(inout vec3 albedo, out vec3 shadow, vec3 viewPos, vec3 worldPos, vec3 normal, + vec2 lightmap, float smoothLighting, float NoL, float vanillaDiffuse, + float parallaxShadow, float emission, float subsurface, float basicSubsurface) { + #if EMISSIVE == 0 || (!defined ADVANCED_MATERIALS && EMISSIVE == 1) + emission = 0.0; + #endif + + #ifndef SSS + subsurface = 0.0; + #endif + + #ifndef BASIC_SSS + basicSubsurface = 0.0; + #endif + + #if defined OVERWORLD || defined END + #ifdef SHADOW + if (NoL > 0.0 || basicSubsurface > 0.0) { + shadow = GetShadow(worldPos, normal, NoL, basicSubsurface, lightmap.y); + } + shadow *= parallaxShadow; + shadow = max(shadow, vec3(0.0)); + NoL = clamp(NoL * 1.01 - 0.01, 0.0, 1.0); + #else + shadow = GetShadow(worldPos, normal, NoL, basicSubsurface, lightmap.y); + #endif + + #ifdef SHADOW_CLOUD + float cloudShadow = GetCloudShadow(worldPos); + shadow *= cloudShadow; + #endif + + float scattering = 0.0; + if (basicSubsurface > 0.0){ + float VoL = clamp(dot(normalize(viewPos.xyz), lightVec) * 0.5 + 0.5, 0.0, 1.0); + scattering = pow(VoL, 16.0) * (1.0 - rainStrength) * basicSubsurface * shadowFade; + NoL = mix(NoL, 1.0, sqrt(basicSubsurface) * 0.7); + NoL = mix(NoL, 1.0, scattering); + } + + #ifdef SHADOW + vec3 fullShadow = max(shadow * NoL, vec3(0.0)); + #else + vec3 fullShadow = vec3(shadow); + #ifdef OVERWORLD + float timeBrightnessAbs = abs(sin(timeAngle * 6.28318530718)); + fullShadow *= 0.25 + 0.5 * (1.0 - (1.0 - timeBrightnessAbs) * (1.0 - timeBrightnessAbs)); + fullShadow *= mix(pow(vanillaDiffuse, 1.0 + timeBrightnessAbs), 1.0, basicSubsurface * 0.4); + #else + fullShadow *= 0.75; + #endif + #endif + + #ifdef ADVANCED_MATERIALS + if (subsurface > 0.0){ + vec3 subsurfaceShadow = GetSubsurfaceShadow(worldPos, subsurface, lightmap.y); + + float VoL = clamp(dot(normalize(viewPos.xyz), lightVec) * 0.5 + 0.5, 0.0, 1.0); + float scattering = pow(VoL, 16.0) * (1.0 - rainStrength) * shadowFade; + + vec3 subsurfaceColor = normalize(albedo + 0.00001) * 1.2; + subsurfaceColor = mix(subsurfaceColor, vec3(1.0), pow(subsurfaceShadow, vec3(4.0))); + subsurfaceColor = mix(subsurfaceColor, vec3(4.0), scattering) * sqrt(subsurface); + + fullShadow = mix(subsurfaceColor * subsurfaceShadow, vec3(1.0), fullShadow); + } + #endif + + #ifdef OVERWORLD + float shadowMult = (1.0 - 0.95 * rainStrength) * shadowFade; + vec3 sceneLighting = mix(ambientCol * lightmap.y, lightCol, fullShadow * shadowMult); + sceneLighting *= lightmap.y * lightmap.y * (1.0 + scattering * shadow); + + #ifdef CLASSIC_EXPOSURE + sceneLighting *= 4.0 - 3.0 * eBS; + #endif + #endif + + #ifdef END + vec3 sceneLighting = endCol.rgb * (0.04 * fullShadow + 0.015); + #endif + + #else + vec3 sceneLighting = netherColSqrt.rgb * 0.07; + #endif + + float newLightmap = pow(lightmap.x, 10.0) * 1.6 + lightmap.x * 0.6; + vec3 blockLighting = blocklightCol * newLightmap * newLightmap; + + vec3 minLighting = minLightCol * (1.0 - lightmap.y * lightmap.y); + + #ifdef TOON_LIGHTMAP + minLighting *= floor(smoothLighting * 8.0 + 1.001) / 4.0; + smoothLighting = 1.0; + #endif + + vec3 albedoNormalized = normalize(albedo.rgb + 0.00001); + vec3 emissiveLighting = mix(albedoNormalized, vec3(1.0), emission * 0.5); + emissiveLighting *= emission * 4.0; + + float lightFlatten = clamp(1.0 - pow(1.0 - emission, 128.0), 0.0, 1.0); + vanillaDiffuse = mix(vanillaDiffuse, 1.0, lightFlatten); + smoothLighting = mix(smoothLighting, 1.0, lightFlatten); + + float nightVisionLighting = nightVision * 0.25; + + #ifdef ALBEDO_BALANCING + float albedoLength = length(albedo.rgb); + albedoLength /= sqrt((albedoLength * albedoLength) * 0.25 * (1.0 - lightFlatten) + 1.0); + albedo.rgb = albedoNormalized * albedoLength; + #endif + + //albedo = vec3(0.5); + albedo *= max(sceneLighting + blockLighting + emissiveLighting + nightVisionLighting + minLighting, vec3(0.0)); + albedo *= vanillaDiffuse * smoothLighting * smoothLighting; + + #ifdef DESATURATION + #ifdef OVERWORLD + float desatAmount = 1.0 - sqrt(max(sqrt(length(fullShadow / 3.0)) * lightmap.y, lightmap.y)) * + sunVisibility * (1.0 - rainStrength * 0.7); + desatAmount*= smoothstep(0.25, 1.0, (1.0 - lightmap.x) * (1.0 - lightmap.x)) * (1.0 - lightFlatten); + desatAmount = 1.0 - desatAmount; + + vec3 desatNight = normalize(lightNight * lightNight + 0.000001); + vec3 desatWeather = normalize(weatherCol.rgb * weatherCol.rgb + 0.000001); + + float desatNWMix = (1.0 - sunVisibility) * (1.0 - rainStrength); + + vec3 desatColor = mix(desatWeather, desatNight, desatNWMix); + desatColor = mix(vec3(0.4), desatColor, sqrt(lightmap.y)) * 1.7; + #endif + + #ifdef NETHER + float desatAmount = 1.0 - smoothstep(0.25, 1.0, (1.0 - lightmap.x) * (1.0 - lightmap.x)) * (1.0 - lightFlatten); + + vec3 desatColor = normalize(netherColSqrt.rgb + 0.000001) * 1.7; + #endif + + #ifdef END + float desatAmount = 1.0 - smoothstep(0.25, 1.0, (1.0 - lightmap.x) * (1.0 - lightmap.x)) * (1.0 - lightFlatten); + + vec3 desatColor = normalize(endCol.rgb + 0.000001) * 1.7; + #endif + + vec3 desatAlbedo = mix(albedo, GetLuminance(albedo) * desatColor, 1.0 - DESATURATION_FACTOR * 0.4); + + albedo = mix(desatAlbedo, albedo, desatAmount); + #endif +} \ No newline at end of file diff --git a/shaders/lib/lighting/shadows.glsl b/shaders/lib/lighting/shadows.glsl new file mode 100644 index 0000000..d94ac68 --- /dev/null +++ b/shaders/lib/lighting/shadows.glsl @@ -0,0 +1,308 @@ +#ifdef SHADOW +uniform sampler2DShadow shadowtex0; + +#ifdef SHADOW_COLOR +uniform sampler2DShadow shadowtex1; +uniform sampler2D shadowcolor0; +#endif + +// uniform sampler2D shadowtex0; + +// #ifdef SHADOW_COLOR +// uniform sampler2D shadowtex1; +// uniform sampler2D shadowcolor0; +// #endif + +vec2 shadowOffsets[9] = vec2[9]( + vec2( 0.0, 0.0), + vec2( 0.0, 1.0), + vec2( 0.7, 0.7), + vec2( 1.0, 0.0), + vec2( 0.7,-0.7), + vec2( 0.0,-1.0), + vec2(-0.7,-0.7), + vec2(-1.0, 0.0), + vec2(-0.7, 0.7) +); + +float biasDistribution[10] = float[10]( + 0.0, 0.057, 0.118, 0.184, 0.255, 0.333, 0.423, 0.529, 0.667, 1.0 +); + +float getShadow(sampler2D shadowtex, vec2 shadowPosXY, float shadowPosZ) { + float shadow = texture2D(shadowtex,shadowPosXY).x; + shadow = clamp((shadow - shadowPosZ)*16384.0+0.5,0.0,1.0); + return shadow; +} + +float texture2DShadow2x2(sampler2D shadowtex, vec3 shadowPos) { + shadowPos.xy -= 0.5 / shadowMapResolution; + vec2 frac = fract(shadowPos.xy * shadowMapResolution); + shadowPos.xy = (floor(shadowPos.xy * shadowMapResolution) + 0.5) / shadowMapResolution; + + float shadow0 = getShadow(shadowtex,shadowPos.st + vec2(0.0, 0.0) / shadowMapResolution, shadowPos.z); + float shadow1 = getShadow(shadowtex,shadowPos.st + vec2(0.0, 1.0) / shadowMapResolution, shadowPos.z); + float shadow2 = getShadow(shadowtex,shadowPos.st + vec2(1.0, 0.0) / shadowMapResolution, shadowPos.z); + float shadow3 = getShadow(shadowtex,shadowPos.st + vec2(1.0, 1.0) / shadowMapResolution, shadowPos.z); + + float shadowx0 = mix(shadow0, shadow1, frac.y); + float shadowx1 = mix(shadow2, shadow3, frac.y); + + float shadow = mix(shadowx0, shadowx1, frac.x); + + return shadow; +} + +float texture2DShadow(sampler2D shadowtex, vec3 shadowPos) { + return texture2DShadow2x2(shadowtex, shadowPos); +} + +float texture2DShadow(sampler2DShadow shadowtex, vec3 shadowPos) { + return shadow2D(shadowtex, shadowPos).x; +} + +vec3 DistortShadow(vec3 worldPos, float distortFactor) { + worldPos.xy /= distortFactor; + worldPos.z *= 0.2; + return worldPos * 0.5 + 0.5; +} + +float GetCurvedBias(int i, float dither) { + return mix(biasDistribution[i], biasDistribution[i+1], dither); +} + +float InterleavedGradientNoise() { + float n = 52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y); + return fract(n + frameCounter * 1.618); +} + +vec3 SampleBasicShadow(vec3 shadowPos, float subsurface) { + float shadow0 = texture2DShadow(shadowtex0, vec3(shadowPos.st, shadowPos.z)); + + vec3 shadowCol = vec3(0.0); + #ifdef SHADOW_COLOR + if (shadow0 < 1.0) { + shadowCol = texture2D(shadowcolor0, shadowPos.st).rgb * + texture2DShadow(shadowtex1, vec3(shadowPos.st, shadowPos.z)); + #ifdef WATER_CAUSTICS + shadowCol *= 4.0; + #endif + } + #endif + + shadow0 *= mix(shadow0, 1.0, subsurface); + shadowCol *= shadowCol; + + return clamp(shadowCol * (1.0 - shadow0) + shadow0, vec3(0.0), vec3(16.0)); +} + +vec3 SampleFilteredShadow(vec3 shadowPos, float offset, float subsurface) { + float shadow0 = 0.0; + + for (int i = 0; i < 9; i++) { + vec2 shadowOffset = shadowOffsets[i] * offset; + shadow0 += texture2DShadow(shadowtex0, vec3(shadowPos.st + shadowOffset, shadowPos.z)); + } + shadow0 /= 9.0; + + vec3 shadowCol = vec3(0.0); + #ifdef SHADOW_COLOR + if (shadow0 < 0.999) { + for (int i = 0; i < 9; i++) { + vec2 shadowOffset = shadowOffsets[i] * offset; + vec3 shadowColSample = texture2D(shadowcolor0, shadowPos.st + shadowOffset).rgb * + texture2DShadow(shadowtex1, vec3(shadowPos.st + shadowOffset, shadowPos.z)); + #ifdef WATER_CAUSTICS + shadowColSample *= 4.0; + #endif + shadowCol += shadowColSample; + } + shadowCol /= 9.0; + } + #endif + + shadow0 *= mix(shadow0, 1.0, subsurface); + shadowCol *= shadowCol; + + return clamp(shadowCol * (1.0 - shadow0) + shadow0, vec3(0.0), vec3(16.0)); +} + +vec3 GetShadow(vec3 worldPos, vec3 normal, float NoL, float subsurface, float skylight) { + #if SHADOW_PIXEL > 0 + worldPos = (floor((worldPos + cameraPosition) * SHADOW_PIXEL + 0.01) + 0.5) / + SHADOW_PIXEL - cameraPosition; + #endif + + vec3 shadowPos = ToShadow(worldPos); + + float distb = sqrt(dot(shadowPos.xy, shadowPos.xy)); + float distortFactor = distb * shadowMapBias + (1.0 - shadowMapBias); + + #if SHADOW_BIAS == 1 + if (subsurface == 0) { + float distortNBias = distortFactor * shadowDistance / 256.0; + distortNBias *= distortNBias; + + vec3 worldNormal = (gbufferModelViewInverse * vec4(normal, 0.0)).xyz; + worldPos += worldNormal * distortNBias * 8192.0 / shadowMapResolution; + shadowPos = ToShadow(worldPos); + + distb = sqrt(dot(shadowPos.xy, shadowPos.xy)); + distortFactor = distb * shadowMapBias + (1.0 - shadowMapBias); + } + #endif + + shadowPos = DistortShadow(shadowPos, distortFactor); + + bool doShadow = shadowPos.x > 0.0 && shadowPos.x < 1.0 && + shadowPos.y > 0.0 && shadowPos.y < 1.0; + + #ifdef OVERWORLD + doShadow = doShadow && skylight > 0.001; + #endif + + if (!doShadow) return vec3(1.0); + + float bias = 0.0; + float offset = 1.0 / shadowMapResolution; + + #if SHADOW_BIAS == 0 + float biasFactor = sqrt(1.0 - NoL * NoL) / NoL; + float distortBias = distortFactor * shadowDistance / 256.0; + distortBias *= 8.0 * distortBias; + float distanceBias = sqrt(dot(worldPos.xyz, worldPos.xyz)) * 0.005; + + bias = (distortBias * biasFactor + distanceBias + 0.05) / shadowMapResolution; + #else + bias = 0.35 / shadowMapResolution; + #endif + + if (subsurface > 0.0) { + float blurFadeIn = clamp(distb * 20.0, 0.0, 1.0); + float blurFadeOut = 1.0 - clamp(distb * 10.0 - 2.0, 0.0, 1.0); + float blurMult = blurFadeIn * blurFadeOut * (1.0 - NoL); + blurMult = blurMult * 1.5 + 1.0; + + offset = 0.0007 * blurMult; + bias = 0.0002; + } + + #if SHADOW_PIXEL > 0 + bias += 0.0025 / SHADOW_PIXEL; + #endif + + shadowPos.z -= bias; + + #ifdef SHADOW_FILTER + vec3 shadow = SampleFilteredShadow(shadowPos, offset, subsurface); + #else + vec3 shadow = SampleBasicShadow(shadowPos, subsurface); + #endif + + return shadow; +} + +vec3 GetSubsurfaceShadow(vec3 worldPos, float subsurface, float skylight) { + float gradNoise = InterleavedGradientNoise(); + + vec3 shadowPos = ToShadow(worldPos); + + float distb = sqrt(dot(shadowPos.xy, shadowPos.xy)); + float distortFactor = distb * shadowMapBias + (1.0 - shadowMapBias); + shadowPos = DistortShadow(shadowPos, distortFactor); + + vec3 subsurfaceShadow = vec3(0.0); + + vec3 offsetScale = vec3(0.002 / distortFactor, 0.002 / distortFactor, 0.001) * (subsurface * 0.75 + 0.25); + + for(int i = 0; i < 12; i++) { + gradNoise = fract(gradNoise + 1.618); + float rot = gradNoise * 6.283; + float dist = (i + gradNoise) / 12.0; + + vec2 offset2D = vec2(cos(rot), sin(rot)) * dist; + float offsetZ = -(dist * dist + 0.025); + + vec3 offset = vec3(offset2D, offsetZ) * offsetScale; + + vec3 samplePos = shadowPos + offset; + float shadow0 = texture2DShadow(shadowtex0, samplePos); + + vec3 shadowCol = vec3(0.0); + #ifdef SHADOW_COLOR + if (shadow0 < 1.0) { + shadowCol = texture2D(shadowcolor0, samplePos.st).rgb * + texture2DShadow(shadowtex1, samplePos); + #ifdef WATER_CAUSTICS + shadowCol *= 4.0; + #endif + } + #endif + + subsurfaceShadow += clamp(shadowCol * (1.0 - shadow0) + shadow0, vec3(0.0), vec3(1.0)); + } + subsurfaceShadow /= 12.0; + subsurfaceShadow *= subsurfaceShadow; + + return subsurfaceShadow; +} +#else +vec3 GetShadow(vec3 worldPos, vec3 normal, float NoL, float subsurface, float skylight) { + #ifdef OVERWORLD + float skylightShadow = smoothstep(0.866,1.0,skylight); + skylightShadow *= skylightShadow; + + return vec3(skylightShadow); + #else + return vec3(1.0); + #endif +} + +vec3 GetSubsurfaceShadow(vec3 worldPos, float subsurface, float skylight) { + return vec3(0.0); +} +#endif + +float GetCloudShadow(vec3 worldPos) { + vec2 wind = vec2( + frametime * CLOUD_SPEED * 0.0005, + sin(frametime * CLOUD_SPEED * 0.001) * 0.005 + ) * CLOUD_HEIGHT / 15.0; + + vec3 coveragePos = worldPos; + worldPos += cameraPosition; + + vec3 worldLightVec = (gbufferModelViewInverse * vec4(lightVec, 0.0)).xyz; + + float cloudHeight = CLOUD_HEIGHT * CLOUD_VOLUMETRIC_SCALE + 70; + worldPos.xz += worldLightVec.xz / worldLightVec.y * max(cloudHeight - worldPos.y, 0.0); + coveragePos.xz += worldLightVec.xz / worldLightVec.y * -coveragePos.y; + + float scaledThickness = CLOUD_THICKNESS * CLOUD_VOLUMETRIC_SCALE; + float cloudFadeOut = 1.0 - clamp((worldPos.y - cloudHeight) / scaledThickness, 0.0, 1.0); + float coverageFadeOut = 1.0 - clamp((cameraPosition.y - cloudHeight) / scaledThickness, 0.0, 1.0); + + vec2 coord = worldPos.xz / CLOUD_VOLUMETRIC_SCALE; + + float sunCoverageSize = CLOUD_VOLUMETRIC_SCALE * 3.0 / worldLightVec.y; + float sunCoverage = max(1.0 - length(coveragePos.xz) / sunCoverageSize, 0.0) * coverageFadeOut; + + coord.xy *= 0.004; + + #if CLOUD_BASE == 0 + float noiseBase = texture2D(noisetex, coord * 0.25 + wind).r; + #else + float noiseBase = texture2D(noisetex, coord * 0.5 + wind).g; + noiseBase = pow(1.0 - noiseBase, 2.0) * 0.5 + 0.25; + #endif + + float noise = mix(noiseBase, 1.0, 0.33 * rainStrength) * 21.0; + + noise = max(noise - (sunCoverage * 3.0 + CLOUD_AMOUNT), 0.0); + noise *= CLOUD_DENSITY * 0.125; + noise *= (1.0 - 0.75 * rainStrength); + noise = noise / sqrt(noise * noise + 0.5); + noise *= cloudFadeOut; + + return 1.0 - noise * CLOUD_OPACITY * 0.85; +} \ No newline at end of file diff --git a/shaders/lib/materials/materialHandling/terrainMaterials.glsl b/shaders/lib/materials/materialHandling/terrainMaterials.glsl new file mode 100644 index 0000000..bfca3d5 --- /dev/null +++ b/shaders/lib/materials/materialHandling/terrainMaterials.glsl @@ -0,0 +1,2548 @@ +if (mat >= 10000) { +if (mat < 11024) { + if (mat < 10512) { + if (mat < 10256) { + if (mat < 10128) { + if (mat < 10064) { + if (mat < 10032) { + if (mat < 10016) { + if (mat < 10008) { + if (mat < 10004) { // No directional shading + noDirectionalShading = true; + } + else /*if (mat < 10008)*/ { // Grounded Waving Foliage + subsurfaceMode = 1, noSmoothLighting = true, noDirectionalShading = true; + + #ifdef GBUFFERS_TERRAIN + DoFoliageColorTweaks(color.rgb, shadowMult, snowMinNdotU, lViewPos); + + #ifdef COATED_TEXTURES + doTileRandomisation = false; + #endif + #endif + + #if SHADOW_QUALITY == -1 + shadowMult *= 1.0 - 0.3 * (signMidCoordPos.y + 1.0) * (1.0 - abs(signMidCoordPos.x)) + + 0.5 * (1.0 - signMidCoordPos.y) * invNoonFactor; // consistency357381 + #endif + } + } else { + if (mat < 10012) { // Leaves + #include "/lib/materials/specificMaterials/terrain/leaves.glsl" + } + else /*if (mat < 10016)*/ { // Vine + subsurfaceMode = 3, centerShadowBias = true; noSmoothLighting = true; + + #if defined COATED_TEXTURES && defined GBUFFERS_TERRAIN + doTileRandomisation = false; + #endif + + float factor = color.g; + smoothnessG = factor * 0.5; + highlightMult = factor * 4.0 + 2.0; + float fresnel = clamp(1.0 + dot(newNormal, normalize(viewPos)), 0.0, 1.0); + highlightMult *= 1.0 - pow2(pow2(fresnel)); + } + } + } else { + if (mat < 10024) { + if (mat < 10020) { // Non-waving Foliage + subsurfaceMode = 1, noSmoothLighting = true, noDirectionalShading = true; + } + else /*if (mat < 10024)*/ { // Upper Waving Foliage + subsurfaceMode = 1, noSmoothLighting = true, noDirectionalShading = true; + + #ifdef GBUFFERS_TERRAIN + DoFoliageColorTweaks(color.rgb, shadowMult, snowMinNdotU, lViewPos); + + #ifdef COATED_TEXTURES + doTileRandomisation = false; + #endif + #endif + + #if SHADOW_QUALITY == -1 + shadowMult *= 1.0 + invNoonFactor; // consistency357381 + #endif + } + } else { + if (mat < 10028) { // Modded Ores + #ifdef GLOWING_ORE_MODDED + float epsilon = 0.00001; + vec2 absMidCoordPosM = absMidCoordPos - epsilon; + vec3 avgBorderColor = vec3(0.0); + + avgBorderColor += texture2D(tex, midCoord + vec2( absMidCoordPosM.x, absMidCoordPosM.y)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2(-absMidCoordPosM.x, absMidCoordPosM.y)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2( absMidCoordPosM.x,-absMidCoordPosM.y)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2(-absMidCoordPosM.x,-absMidCoordPosM.y)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2(epsilon, absMidCoordPosM.y)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2(epsilon,-absMidCoordPosM.y)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2( absMidCoordPosM.x, epsilon)).rgb; + avgBorderColor += texture2D(tex, midCoord + vec2(-absMidCoordPosM.x, epsilon)).rgb; + avgBorderColor *= 0.125; + + vec3 colorDif = abs(avgBorderColor - color.rgb); + emission = max(colorDif.r, max(colorDif.g, colorDif.b)); + emission = pow2(emission * 2.5 - 0.15); + + emission *= GLOWING_ORE_MULT; + //color.rgb = avgBorderColor; + #endif + } + else /*if (mat < 10032)*/ { // Modded Light Sources + noSmoothLighting = true; noDirectionalShading = true; + emission = GetLuminance(color.rgb) * 2.5; + } + } + } + } else { + if (mat < 10048) { + if (mat < 10040) { + if (mat < 10036) { // Stone Bricks++ + smoothnessG = pow2(pow2(color.g)) * 2.0; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + else /*if (mat < 10040)*/ { // Anvil+ + #include "/lib/materials/specificMaterials/terrain/anvil.glsl" + } + } else { + if (mat < 10044) { // Rails + #if ANISOTROPIC_FILTER == 0 + albedo = texture2DLod(texture, texCoord, 0); + #endif + + noSmoothLighting = true; + if (color.r > 0.1 && color.g + color.b < 0.1) { // Redstone Parts + noSmoothLighting = true; noDirectionalShading = true; + lmCoordM.x = min(lmCoordM.x * 0.9, 0.77); + + if (color.r > 0.5) { + albedo.rgb *= color.rgb; + emission = 8.0 * color.r; + } else if (color.r > color.g * 2.0) { + materialMask = OSIEBCA * 5.0; // Redstone Fresnel + + float factor = pow2(color.r); + smoothnessG = 0.4; + highlightMult = factor + 0.4; + + smoothnessD = factor * 0.7 + 0.3; + } + } else if (abs(color.r - color.b) < 0.15) { // Iron Parts + #include "/lib/materials/specificMaterials/terrain/ironBlock.glsl" + } else if (color.g > color.b * 2.0) { // Gold Parts + #include "/lib/materials/specificMaterials/terrain/goldBlock.glsl" + } else { // Wood Parts + #include "/lib/materials/specificMaterials/planks/oakPlanks.glsl" + } + } + else /*if (mat < 10048)*/ { // Empty Cauldron, Hopper + noSmoothLighting = true; + lmCoordM.x = min(lmCoordM.x, 0.9333); + + #include "/lib/materials/specificMaterials/terrain/anvil.glsl" + } + } + } else { + if (mat < 10056) { + if (mat < 10052) { // Water Cauldron + noSmoothLighting = true; + lmCoordM.x = min(lmCoordM.x, 0.9333); + + vec3 worldPos = playerPos + cameraPosition; + vec3 fractPos = fract(worldPos.xyz); + vec2 coordM = abs(fractPos.xz - 0.5); + if (max(coordM.x, coordM.y) < 0.375 && fractPos.y > 0.3 && NdotU > 0.9) { + #if WATER_STYLE < 3 + vec3 colorP = color.rgb / glColor.rgb; + smoothnessG = min(pow2(pow2(dot(colorP.rgb, colorP.rgb) * 0.4)), 1.0); + highlightMult = 3.25; + smoothnessD = 0.8; + #else + smoothnessG = 0.3; + smoothnessD = 1.0; + #endif + + // #include "/lib/materials/specificMaterials/translucents/water.glsl" + + #ifdef COATED_TEXTURES + noiseFactor = 0.0; + #endif + } else { + #include "/lib/materials/specificMaterials/terrain/anvil.glsl" + } + } + else /*if (mat < 10056)*/ { // Powder Snow Cauldron + noSmoothLighting = true; + lmCoordM.x = min(lmCoordM.x, 0.9333); + + vec3 worldPos = playerPos + cameraPosition; + vec3 fractPos = fract(worldPos.xyz); + vec2 coordM = abs(fractPos.xz - 0.5); + if (max(coordM.x, coordM.y) < 0.375 && + fractPos.y > 0.3 && + NdotU > 0.9) { + + #include "/lib/materials/specificMaterials/terrain/snow.glsl" + } else { + #include "/lib/materials/specificMaterials/terrain/anvil.glsl" + } + } + } else { + if (mat < 10060) { // Lava Cauldron + noSmoothLighting = true; + lmCoordM.x = min(lmCoordM.x, 0.9333); + + vec3 worldPos = playerPos + cameraPosition; + vec3 fractPos = fract(worldPos.xyz); + vec2 coordM = abs(fractPos.xz - 0.5); + if (max(coordM.x, coordM.y) < 0.375 && + fractPos.y > 0.3 && + NdotU > 0.9) { + + #include "/lib/materials/specificMaterials/terrain/lava.glsl" + } else { + #include "/lib/materials/specificMaterials/terrain/anvil.glsl" + } + } + else /*if (mat < 10064)*/ { // Lever + if (color.r > color.g + color.b) { + albedo.rgb *= color.rgb; + emission = 4.0; + } else { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } + } + } + } + } + } else { + if (mat < 10096) { + if (mat < 10080) { + if (mat < 10072) { + if (mat < 10068) { // Lectern + #include "/lib/materials/specificMaterials/planks/oakPlanks.glsl" + } + else /*if (mat < 10072)*/ { // Lava + #include "/lib/materials/specificMaterials/terrain/lava.glsl" + + #if defined COATED_TEXTURES && defined GBUFFERS_TERRAIN + doTileRandomisation = false; + #endif + } + } else { + if (mat < 10076) { // Fire + noSmoothLighting = true, noDirectionalShading = true; + emission = 2.35; + albedo.rgb *= sqrt1(GetLuminance(color.rgb)); + } + else /*if (mat < 10080)*/ { // Soul Fire + noSmoothLighting = true, noDirectionalShading = true; + emission = 1.5; + albedo.rgb = pow1_5(color.rgb); + } + } + } else { + if (mat < 10088) { + if (mat < 10084) { // Stone+, Coal Ore, Smooth Stone+, Grindstone, Stonecutter + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + else /*if (mat < 10088)*/ { // Granite+ + smoothnessG = pow2(pow2(color.r)) * 0.5; + smoothnessD = smoothnessG; + } + } else { + if (mat < 10092) { // Diorite+ + smoothnessG = pow2(color.g) * 0.5; + smoothnessD = smoothnessG; + + #ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.75, shadowMult, highlightMult); + #endif + } + else /*if (mat < 10096)*/ { // Andesite+ + smoothnessG = pow2(pow2(color.g)); + smoothnessD = smoothnessG; + } + } + } + } else { + if (mat < 10112) { + if (mat < 10104) { + if (mat < 10100) { // Polished Granite+ + smoothnessG = 0.1 + color.r * 0.4; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + else /*if (mat < 10104)*/ { // Polished Diorite+ + smoothnessG = pow2(color.g) * 0.7; + smoothnessD = smoothnessG; + + #ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.75, shadowMult, highlightMult); + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } else { + if (mat < 10108) { // Polished Andesite+, Packed Mud, Mud Bricks+, Bricks+ + smoothnessG = pow2(color.g); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + else /*if (mat < 10112)*/ { // Deepslate:Non-polished Variants, Deepslate Coal Ore + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + } else { + if (mat < 10120) { + if (mat < 10116) { // Deepslate:Polished Variants, Mud, Mangrove Roots, Muddy Mangrove Roots + smoothnessG = pow2(color.g) * 2.0; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + else /*if (mat < 10120)*/ { // Calcite + highlightMult = pow2(color.g) + 1.0; + smoothnessG = 1.0 - color.g * 0.5; + smoothnessD = smoothnessG; + + #ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.75, shadowMult, highlightMult); + #endif + } + } else { + if (mat < 10124) { // Dripstone+, Daylight Detector + smoothnessG = color.r * 0.35 + 0.2; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + else /*if (mat < 10128)*/ { // Snowy Variants of Grass Block, Podzol, Mycelium + float dotColor = dot(color.rgb, color.rgb); + if (dotColor > 1.5) { // Snowy Variants:Snowy Part + #include "/lib/materials/specificMaterials/terrain/snow.glsl" + } else { // Snowy Variants:Dirt Part + #include "/lib/materials/specificMaterials/terrain/dirt.glsl" + } + } + } + } + } + } + } else { + if (mat < 10192) { + if (mat < 10160) { + if (mat < 10144) { + if (mat < 10136) { + if (mat < 10132) { // Dirt, Coarse Dirt, Rooted Dirt, Podzol:Normal, Mycelium:Normal, Farmland:Dry + #include "/lib/materials/specificMaterials/terrain/dirt.glsl" + } + else /*if (mat < 10136)*/ { // Grass Block:Normal + if (glColor.b < 0.999) { // Grass Block:Normal:Grass Part + smoothnessG = pow2(color.g); + + #ifdef SNOWY_WORLD + snowMinNdotU = min(pow2(pow2(color.g)) * 1.9, 0.1); + color.rgb = color.rgb * 0.5 + 0.5 * (color.rgb / glColor.rgb); + #endif + } else { //Grass Block:Normal:Dirt Part + #include "/lib/materials/specificMaterials/terrain/dirt.glsl" + } + } + } else { + if (mat < 10140) { // Farmland:Wet + if (NdotU > 0.99) { // Farmland:Wet:Top Part + #if MC_VERSION >= 11300 + smoothnessG = clamp(pow2(pow2(1.0 - color.r)) * 2.5, 0.5, 1.0); + highlightMult = 0.5 + smoothnessG * smoothnessG * 2.0; + smoothnessD = smoothnessG * 0.75; + #else + smoothnessG = 0.5 * (1.0 + abs(color.r - color.b) + color.b); + smoothnessD = smoothnessG * 0.5; + #endif + } else { // Farmland:Wet:Dirt Part + #include "/lib/materials/specificMaterials/terrain/dirt.glsl" + } + } + else /*if (mat < 10144)*/ { // Netherrack + #include "/lib/materials/specificMaterials/terrain/netherrack.glsl" + } + } + } else { + if (mat < 10152) { + if (mat < 10148) { // Warped Nylium, Warped Wart Block + if (color.g == color.b && color.g > 0.0001) { // Warped Nylium:Netherrack Part + #include "/lib/materials/specificMaterials/terrain/netherrack.glsl" + } else { // Warped Nylium:Nylium Part, Warped Wart Block + smoothnessG = color.g * 0.5; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } + else /*if (mat < 10152)*/ { // Crimson Nylium, Nether Wart Block + if (color.g == color.b && color.g > 0.0001 && color.r < 0.522) { // Crimson Nylium:Netherrack Part + #include "/lib/materials/specificMaterials/terrain/netherrack.glsl" + } else { // Crimson Nylium:Nylium Part, Nether Wart Block + smoothnessG = color.r * 0.5; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } + } else { + if (mat < 10156) { // Cobblestone+, Mossy Cobblestone+, Furnace:Unlit, Smoker:Unlit, Blast Furnace:Unlit, Moss Block+, Lodestone, Piston, Sticky Piston, Dispenser, Dropper + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } + else /*if (mat < 10160)*/ { // Oak Planks++:Clean Variants, Bookshelf, Crafting Table, Tripwire Hook + #include "/lib/materials/specificMaterials/planks/oakPlanks.glsl" + } + } + } + } else { + if (mat < 10176) { + if (mat < 10168) { + if (mat < 10164) { // Oak Log, Oak Wood + if (color.g > 0.48 || + CheckForColor(color.rgb, vec3(126, 98, 55)) || + CheckForColor(color.rgb, vec3(150, 116, 65))) { // Oak Log:Clean Part + #include "/lib/materials/specificMaterials/planks/oakPlanks.glsl" + } else { // Oak Log:Wood Part, Oak Wood + #include "/lib/materials/specificMaterials/terrain/oakWood.glsl" + } + } + else /*if (mat < 10168)*/ { // Spruce Planks++:Clean Variants + #include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl" + } + } else { + if (mat < 10172) { // Spruce Log, Spruce Wood + if (color.g > 0.25) { // Spruce Log:Clean Part + #include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl" + } else { // Spruce Log:Wood Part, Spruce Wood + smoothnessG = pow2(color.g) * 2.5; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + } + } + else /*if (mat < 10176)*/ { // Birch Planks++:Clean Variants, Scaffolding, Loom + #include "/lib/materials/specificMaterials/planks/birchPlanks.glsl" + } + } + } else { + if (mat < 10184) { + if (mat < 10180) { // Birch Log, Birch Wood + if (color.r - color.b > 0.15) { // Birch Log:Clean Part + #include "/lib/materials/specificMaterials/planks/birchPlanks.glsl" + } else { // Birch Log:Wood Part, Birch Wood + smoothnessG = pow2(color.g) * 0.25; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 1.25; + #endif + } + } + else /*if (mat < 10184)*/ { // Jungle Planks++:Clean Variants, Composter + #include "/lib/materials/specificMaterials/planks/junglePlanks.glsl" + } + } else { + if (mat < 10188) { // Jungle Log, Jungle Wood + if (color.g > 0.405) { // Jungle Log:Clean Part + #include "/lib/materials/specificMaterials/planks/junglePlanks.glsl" + } else { // Jungle Log:Wood Part, Jungle Wood + smoothnessG = pow2(pow2(color.g)) * 5.0; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } + else /*if (mat < 10192)*/ { // Acacia Planks++:Clean Variants + #include "/lib/materials/specificMaterials/planks/acaciaPlanks.glsl" + } + } + } + } + } else { + if (mat < 10224) { + if (mat < 10208) { + if (mat < 10200) { + if (mat < 10196) { // Acacia Log, Acacia Wood + if (color.r - color.b > 0.2) { // Acacia Log:Clean Part + #include "/lib/materials/specificMaterials/planks/acaciaPlanks.glsl" + } else { // Acacia Log:Wood Part, Acacia Wood + smoothnessG = pow2(color.b) * 1.3; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + } + else /*if (mat < 10200)*/ { // Dark Oak Planks++:Clean Variants + #include "/lib/materials/specificMaterials/planks/darkOakPlanks.glsl" + } + } else { + if (mat < 10204) { // Dark Oak Log, Dark Oak Wood + if (color.r - color.g > 0.08 || + CheckForColor(color.rgb, vec3(48, 30, 14))) { // Dark Oak Log:Clean Part + #include "/lib/materials/specificMaterials/planks/darkOakPlanks.glsl" + } else { // Dark Oak Log:Wood Part, Dark Oak Wood + smoothnessG = color.r * 0.4; + smoothnessD = smoothnessG; + } + } + else /*if (mat < 10208)*/ { // Mangrove Planks++:Clean Variants + #include "/lib/materials/specificMaterials/planks/mangrovePlanks.glsl" + } + } + } else { + if (mat < 10216) { + if (mat < 10212) { // Mangrove Log, Mangrove Wood + if (color.r - color.g > 0.2) { // Mangrove Log:Clean Part + #include "/lib/materials/specificMaterials/planks/mangrovePlanks.glsl" + } else { // Mangrove Log:Wood Part, Mangrove Wood + smoothnessG = pow2(color.r) * 0.6; + smoothnessD = smoothnessG; + } + } + else /*if (mat < 10216)*/ { // Crimson Planks++:Clean Variants + #include "/lib/materials/specificMaterials/planks/crimsonPlanks.glsl" + } + } else { + if (mat < 10220) { // Crimson Stem, Crimson Hyphae + if (color.r / color.b > 2.5) { // Emissive Part + emission = pow2(color.r) * 6.5; + albedo.gb *= 0.5; + } else { // Flat Part + #include "/lib/materials/specificMaterials/planks/crimsonPlanks.glsl" + } + } + else /*if (mat < 10224)*/ { // Warped Planks++:Clean Variants + #include "/lib/materials/specificMaterials/planks/warpedPlanks.glsl" + } + } + } + } else { + if (mat < 10240) { + if (mat < 10232) { + if (mat < 10228) { // Warped Stem, Warped Hyphae + //if (color.r < 0.12 || color.r + color.g * 3.0 < 3.4 * color.b) { // Emissive Part + if (color.r < 0.37 * color.b || color.r + color.g * 3.0 < 3.4 * color.b) { // Emissive Part + emission = pow2(color.g + 0.2 * color.b) * 4.5 + 0.15; + } else { // Flat Part + #include "/lib/materials/specificMaterials/planks/warpedPlanks.glsl" + } + } + else /*if (mat < 10232)*/ { // Bedrock + smoothnessG = color.b * 0.2 + 0.1; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 1.5; + #endif + } + } else { + if (mat < 10236) { // Sand, Suspicious Sand + smoothnessG = pow(color.g, 16.0) * 2.0; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG * 0.7; + highlightMult = 2.0; + + #ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.5, shadowMult, highlightMult); + + DoOceanBlockTweaks(smoothnessD); + #endif + + #if RAIN_PUDDLES >= 1 + noPuddles = 1.0; + #endif + } + else /*if (mat < 10240)*/ { // Red Sand + smoothnessG = pow(color.r * 1.08, 16.0) * 2.0; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG * 0.7; + highlightMult = 2.0; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + + #if RAIN_PUDDLES >= 1 + noPuddles = 1.0; + #endif + } + } + } else { + if (mat < 10248) { + if (mat < 10244) { // Sandstone+ + highlightMult = 2.0; + smoothnessG = pow2(pow2(color.g)) * 0.5; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG * 0.7; + + #ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.5, shadowMult, highlightMult); + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + else /*if (mat < 10248)*/ { // Red Sandstone+ + highlightMult = 2.0; + smoothnessG = pow2(pow2(color.r * 1.05)) * 0.5; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG * 0.7; + + #ifdef COATED_TEXTURES + noiseFactor = 0.5; + #endif + } + } else { + if (mat < 10252) { // Netherite Block + #include "/lib/materials/specificMaterials/terrain/netheriteBlock.glsl" + } + else /*if (mat < 10256)*/ { // Ancient Debris + smoothnessG = pow2(color.r); + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 1.5; + #endif + + #ifdef GLOWING_ORE_ANCIENTDEBRIS + emission = min(pow2(color.g * 6.0), 8.0); + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + #endif + } + } + } + } + } + } + } else { + if (mat < 10384) { + if (mat < 10320) { + if (mat < 10288) { + if (mat < 10272) { + if (mat < 10264) { + if (mat < 10260) { // Iron Bars + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/terrain/ironBlock.glsl" + } + else /*if (mat < 10264)*/ { // Iron Door, Iron Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/terrain/ironBlock.glsl" + } + } else { + if (mat < 10268) { // Iron Block, Heavy Weighted Pressure Plate + #include "/lib/materials/specificMaterials/terrain/ironBlock.glsl" + albedo.rgb *= max(color.r, 0.85) * 0.9; + } + else /*if (mat < 10272)*/ { // Raw Iron Block + #include "/lib/materials/specificMaterials/terrain/rawIronBlock.glsl" + } + } + } else { + if (mat < 10280) { + if (mat < 10276) { // Iron Ore + if (color.r != color.g) { // Iron Ore:Raw Iron Part + #include "/lib/materials/specificMaterials/terrain/rawIronBlock.glsl" + #ifdef GLOWING_ORE_IRON + if (color.r - color.b > 0.15) { + emission = pow1_5(color.r) * 1.5; + color.rgb *= pow(color.rgb, vec3(0.5 * min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Iron Ore:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + else /*if (mat < 10280)*/ { // Deepslate Iron Ore + if (color.r != color.g) { // Deepslate Iron Ore:Raw Iron Part + #include "/lib/materials/specificMaterials/terrain/rawIronBlock.glsl" + #ifdef GLOWING_ORE_IRON + if (color.r - color.b > 0.15) { + emission = pow1_5(color.r) * 1.5; + color.rgb *= pow(color.rgb, vec3(0.5 * min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Deepslate Iron Ore:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + } else { + if (mat < 10284) { // Raw Copper Block + #include "/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl" + } + else /*if (mat < 10288)*/ { // Copper Ore + if (color.r != color.g) { // Copper Ore:Raw Copper Part + #include "/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl" + #ifdef GLOWING_ORE_COPPER + if (max(color.r * 0.5, color.g) - color.b > 0.05) { + emission = color.r * 2.0 + 0.7; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Copper Ore:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + } + } + } else { + if (mat < 10304) { + if (mat < 10296) { + if (mat < 10292) { // Deepslate Copper Ore + if (color.r != color.g) { // Deepslate Copper Ore:Raw Copper Part + #include "/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl" + #ifdef GLOWING_ORE_COPPER + if (max(color.r * 0.5, color.g) - color.b > 0.05) { + emission = color.r * 2.0 + 0.7; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Deepslate Copper Ore:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + else /*if (mat < 10296)*/ { // Copper Block++:All Non-raw Variants + #include "/lib/materials/specificMaterials/terrain/copperBlock.glsl" + } + } else { + if (mat < 10300) { // Raw Gold Block + #include "/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl" + } + else /*if (mat < 10304)*/ { // Gold Ore + if (color.r != color.g || color.r > 0.99) { // Gold Ore:Raw Gold Part + #include "/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl" + #ifdef GLOWING_ORE_GOLD + if (color.g - color.b > 0.15) { + emission = color.r + 1.0; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Gold Ore:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + } + } else { + if (mat < 10312) { + if (mat < 10308) { // Deepslate Gold Ore + if (color.r != color.g || color.r > 0.99) { // Deepslate Gold Ore:Raw Gold Part + #include "/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl" + #ifdef GLOWING_ORE_GOLD + if (color.g - color.b > 0.15) { + emission = color.r + 1.0; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Deepslate Gold Ore:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + else /*if (mat < 10312)*/ { // Nether Gold Ore + if (color.g != color.b) { // Nether Gold Ore:Raw Gold Part + #include "/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl" + #ifdef GLOWING_ORE_NETHERGOLD + emission = color.g * 1.5; + emission *= GLOWING_ORE_MULT; + #endif + } else { // Nether Gold Ore:Netherrack Part + #include "/lib/materials/specificMaterials/terrain/netherrack.glsl" + } + } + } else { + if (mat < 10316) { // Gold Block, Light Weighted Pressure Plate + #include "/lib/materials/specificMaterials/terrain/goldBlock.glsl" + } + else /*if (mat < 10320)*/ { // Diamond Block + #include "/lib/materials/specificMaterials/terrain/diamondBlock.glsl" + } + } + } + } + } else { + if (mat < 10352) { + if (mat < 10336) { + if (mat < 10328) { + if (mat < 10324) { // Diamond Ore + if (color.b / color.r > 1.5 || color.b > 0.8) { // Diamond Ore:Diamond Part + #include "/lib/materials/specificMaterials/terrain/diamondBlock.glsl" + #ifdef GLOWING_ORE_DIAMOND + emission = color.g + 1.5; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Diamond Ore:Stone Part, Diamond Ore:StoneToDiamond part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + else /*if (mat < 10328)*/ { // Deepslate Diamond Ore + if (color.b / color.r > 1.5 || color.b > 0.8) { // Deepslate Diamond Ore:Diamond Part + #include "/lib/materials/specificMaterials/terrain/diamondBlock.glsl" + #ifdef GLOWING_ORE_DIAMOND + emission = color.g + 1.5; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Deepslate Diamond Ore:Deepslate Part, Deepslate Diamond Ore:DeepslateToDiamond part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + } else { + if (mat < 10332) { // Amethyst Block, Budding Amethyst + // materialMask = OSIEBCA; // Intense Fresnel + float factor = pow2(color.r); + smoothnessG = 0.8 - factor * 0.3; + highlightMult = factor * 3.0; + smoothnessD = factor; + + #if GLOWING_AMETHYST >= 2 + emission = dot(color.rgb, color.rgb) * 0.3; + #endif + + albedo.rgb *= 0.7 + 0.3 * GetLuminance(albedo.rgb); + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + else /*if (mat < 10336)*/ { // Amethyst Cluster, Amethyst Buds + materialMask = OSIEBCA; // Intense Fresnel + float factor = pow2(albedo.r); + smoothnessG = 0.8 - factor * 0.3; + highlightMult = factor * 3.0; + smoothnessD = factor; + + noSmoothLighting = true; + lmCoordM.x *= 0.85; + + #if GLOWING_AMETHYST >= 1 && defined GBUFFERS_TERRAIN + vec3 worldPos = playerPos.xyz + cameraPosition.xyz; + vec3 blockPos = abs(fract(worldPos) - vec3(0.5)); + float maxBlockPos = max(blockPos.x, max(blockPos.y, blockPos.z)); + emission = pow2(max0(1.0 - maxBlockPos * 1.85) * albedo.g) * 7.0; + + if (CheckForColor(albedo.rgb, vec3(254, 203, 230))) + emission = pow(emission, max0(1.0 - 0.2 * max0(emission - 1.0))); + + albedo.g *= 1.0 - emission * 0.07; + + emission *= 1.3; + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + } + } else { + if (mat < 10344) { + if (mat < 10340) { // Emerald Block + #include "/lib/materials/specificMaterials/terrain/emeraldBlock.glsl" + } + else /*if (mat < 10344)*/ { // Emerald Ore + float dif = GetMaxColorDif(albedo.rgb); + if (dif > 0.4 || albedo.b > 0.85) { // Emerald Ore:Emerald Part + #include "/lib/materials/specificMaterials/terrain/emeraldBlock.glsl" + #ifdef GLOWING_ORE_EMERALD + emission = 2.0; + albedo.rgb *= pow(albedo.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Emerald Ore:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + } else { + if (mat < 10348) { // Deepslate Emerald Ore + float dif = GetMaxColorDif(albedo.rgb); + if (dif > 0.4 || albedo.b > 0.85) { // Deepslate Emerald Ore:Emerald Part + #include "/lib/materials/specificMaterials/terrain/emeraldBlock.glsl" + #ifdef GLOWING_ORE_EMERALD + emission = 2.0; + albedo.rgb *= pow(albedo.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Deepslate Emerald Ore:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + else /*if (mat < 10352)*/ { // Azalea, Flowering Azalea + subsurfaceMode = 2; + // shadowMult = vec3(0.85); + } + } + } + } else { + if (mat < 10368) { + if (mat < 10360) { + if (mat < 10356) { // Lapis Block + #include "/lib/materials/specificMaterials/terrain/lapisBlock.glsl" + + #ifdef EMISSIVE_LAPIS_BLOCK + emission = pow2(dot(color.rgb, color.rgb)) * 10.0; + #endif + } + else /*if (mat < 10360)*/ { // Lapis Ore + if (color.r != color.g) { // Lapis Ore:Lapis Part + #include "/lib/materials/specificMaterials/terrain/lapisBlock.glsl" + smoothnessG *= 0.5; + smoothnessD *= 0.5; + #ifdef GLOWING_ORE_LAPIS + if (color.b - color.r > 0.2) { + emission = 2.0; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Lapis Ore:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + } else { + if (mat < 10364) { // Deepslate Lapis Ore + if (color.r != color.g) { // Deepslate Lapis Ore:Lapis Part + #include "/lib/materials/specificMaterials/terrain/lapisBlock.glsl" + smoothnessG *= 0.5; + smoothnessD *= 0.5; + #ifdef GLOWING_ORE_LAPIS + if (color.b - color.r > 0.2) { + emission = 2.0; + color.rgb *= pow(color.rgb, vec3(min1(GLOWING_ORE_MULT))); + emission *= GLOWING_ORE_MULT; + } + #endif + } else { // Deepslate Lapis Ore:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + else /*if (mat < 10368)*/ { // Quartz Block++ + #include "/lib/materials/specificMaterials/terrain/quartzBlock.glsl" + } + } + } else { + if (mat < 10376) { + if (mat < 10372) { // Nether Quartz Ore + if (color.g != color.b) { // Nether Quartz Ore:Quartz Part + #include "/lib/materials/specificMaterials/terrain/quartzBlock.glsl" + #ifdef GLOWING_ORE_NETHERQUARTZ + emission = pow2(color.b * 1.6); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Nether Quartz Ore:Netherrack Part + #include "/lib/materials/specificMaterials/terrain/netherrack.glsl" + } + } + else /*if (mat < 10376)*/ { // Obsidian + #include "/lib/materials/specificMaterials/terrain/obsidian.glsl" + } + } else { + if (mat < 10380) { // Purpur Block+ + highlightMult = 2.0; + smoothnessG = pow2(color.r) * 0.6; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.5; + #endif + } + else /*if (mat < 10384)*/ { // Snow, Snow Block, Powder Snow + #include "/lib/materials/specificMaterials/terrain/snow.glsl" + } + } + } + } + } + } else { + if (mat < 10448) { + if (mat < 10416) { + if (mat < 10400) { + if (mat < 10392) { + if (mat < 10388) { // Packed Ice + materialMask = OSIEBCA; // Intense Fresnel + float factor = pow2(color.g); + float factor2 = pow2(factor); + smoothnessG = 1.0 - 0.5 * factor; + highlightMult = factor2 * 3.5; + smoothnessD = factor; + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + else /*if (mat < 10392)*/ { // Blue Ice + materialMask = OSIEBCA; // Intense Fresnel + float factor = min1(pow2(color.g) * 1.38); + float factor2 = pow2(factor); + smoothnessG = 1.0 - 0.5 * factor; + highlightMult = factor2 * 3.5; + smoothnessD = pow1_5(color.g); + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + } else { + if (mat < 10396) { // Pumpkin, Carved Pumpkin + #include "/lib/materials/specificMaterials/terrain/pumpkin.glsl" + } + else /*if (mat < 10400)*/ { // Jack o'Lantern + #include "/lib/materials/specificMaterials/terrain/pumpkin.glsl" + noSmoothLighting = true, noDirectionalShading = true; + lmCoordM.y = 0.0; + lmCoordM.x = 1.0; + + #if MC_VERSION >= 11300 + if (color.b > 0.28 && color.r > 0.9) { + float factor = pow2(color.g); + emission = pow2(factor) * factor * 5.0; + } + #else + if (color.b < 0.4) + emission = clamp01(color.g * 1.3 - color.r) * 5.0; + #endif + } + } + } else { + if (mat < 10408) { + if (mat < 10404) { // Sea Pickle:Not Waterlogged + noSmoothLighting = true; + } + else /*if (mat < 10408)*/ { // Sea Pickle:Waterlogged + noSmoothLighting = true; + if (color.b > 0.5) { // Sea Pickle:Emissive Part + #ifdef GBUFFERS_TERRAIN + color.g *= 1.1; + emission = 5.0; + #endif + } + } + } else { + if (mat < 10412) { // Basalt+ + smoothnessG = color.r * 0.35; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + else /*if (mat < 10416)*/ { // Glowstone + noSmoothLighting = true; noDirectionalShading = true; + lmCoordM = vec2(0.9, 0.0); + + emission = max0(color.g - 0.3) * 4.6; + albedo.rg += emission * vec2(0.15, 0.05); + } + } + } + } else { + if (mat < 10432) { + if (mat < 10424) { + if (mat < 10420) { // Nether Bricks+ + float factor = smoothstep1(min1(color.r * 1.5)); + factor = factor > 0.12 ? factor : factor * 0.5; + smoothnessG = factor; + smoothnessD = factor; + } + else /*if (mat < 10424)*/ { // Red Nether Bricks+ + float factor = color.r * 0.9; + factor = color.r > 0.215 ? factor : factor * 0.25; + smoothnessG = factor; + smoothnessD = factor; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } else { + if (mat < 10428) { // Melon + smoothnessG = color.r * 0.75; + smoothnessD = color.r * 0.5; + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + else /*if (mat < 10432)*/ { // End Stone++, + #include "/lib/materials/specificMaterials/terrain/endStone.glsl" + } + } + } else { + if (mat < 10440) { + if (mat < 10436) { // Terracotta+ + smoothnessG = 0.25; + highlightMult = 1.5; + smoothnessD = 0.17; + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + else /*if (mat < 10440)*/ { // Glazed Terracotta+ + smoothnessG = 0.75; + smoothnessD = 0.35; + + #ifdef COATED_TEXTURES + noiseFactor = 0.5; + #endif + } + } else { + if (mat < 10444) { // Prismarine+, Prismarine Bricks+ + smoothnessG = pow2(color.g) * 0.8; + highlightMult = 1.5; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + else /*if (mat < 10448)*/ { // Dark Prismarine+ + smoothnessG = min1(pow2(color.g) * 2.0); + highlightMult = 1.5; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } + } + } + } else { + if (mat < 10480) { + if (mat < 10464) { + if (mat < 10456) { + if (mat < 10452) { // Sea Lantern + noSmoothLighting = true; noDirectionalShading = true; + lmCoordM.x = 0.85; + + smoothnessD = min1(max0(0.5 - color.r) * 2.0); + smoothnessG = color.g; + + float blockRes = absMidCoordPos.x * atlasSize.x; + vec2 signMidCoordPosM = (floor((signMidCoordPos + 1.0) * blockRes) + 0.5) / blockRes - 1.0; + float dotsignMidCoordPos = dot(signMidCoordPosM, signMidCoordPosM); + float lBlockPosM = pow2(max0(1.0 - 1.7 * pow2(pow2(dotsignMidCoordPos)))); + emission = pow2(color.b) * 1.6 + 2.2 * lBlockPosM; + + emission *= 0.4 + max0(0.6 - 0.006 * lViewPos); + + albedo.rb *= vec2(1.13, 1.1); + + #ifdef COATED_TEXTURES + noiseFactor = 0.5; + #endif + } + else /*if (mat < 10456)*/ { // Magma Block + noSmoothLighting = true; noDirectionalShading = true; + lmCoordM = vec2(0.75, 0.0); + + if (color.g > 0.22) { // Emissive Part + emission = pow2(pow2(color.r)) * 4.0; + + #if RAIN_PUDDLES >= 1 + noPuddles = color.g * 4.0; + #endif + + albedo.gb *= max(2.0 - 11.0 * pow2(color.g), 0.5); + + maRecolor = vec3(emission * 0.075); + } else { // Netherrack Part + #include "/lib/materials/specificMaterials/terrain/netherrack.glsl" + + emission = 0.2; + } + + } + } else { + if (mat < 10460) { // Command Block+ + albedo = texture2DLod(texture, texCoord, 0); + + vec2 coord = signMidCoordPos; + float blockRes = absMidCoordPos.x * atlasSize.x; + vec2 absCoord = abs(coord); + float maxCoord = max(absCoord.x, absCoord.y); + + float dif = GetMaxColorDif(color.rgb); + + if ( // This mess exists because Iris' midCoord is slightly inaccurate + dif > 0.1 && maxCoord < 0.375 && + !CheckForColor(color.rgb, vec3(111, 73, 43)) && + !CheckForColor(color.rgb, vec3(207, 166, 139)) && + !CheckForColor(color.rgb, vec3(155, 139, 207)) && + !CheckForColor(color.rgb, vec3(161, 195, 180)) && + !CheckForColor(color.rgb, vec3(201, 143, 107)) && + !CheckForColor(color.rgb, vec3(135, 121, 181)) && + !CheckForColor(color.rgb, vec3(131, 181, 145)) + ) { + emission = 6.0; + albedo.rgb *= color.rgb; + highlightMult = 2.0; + maRecolor = vec3(0.5); + } else { + smoothnessG = dot(color.rgb, color.rgb) * 0.33; + smoothnessD = smoothnessG; + } + } + else /*if (mat < 10464)*/ { // Concrete+ except Lime + smoothnessG = 0.4; + highlightMult = 1.5; + smoothnessD = 0.3; + + #ifdef COATED_TEXTURES + noiseFactor = 0.2; + #endif + } + } + } else { + if (mat < 10472) { + if (mat < 10468) { // Concrete Powder+ + smoothnessG = 0.2; + smoothnessD = 0.1; + + #ifdef COATED_TEXTURES + noiseFactor = 0.5; + #endif + } + else /*if (mat < 10472)*/ { // Coral Block+ + #include "/lib/materials/specificMaterials/terrain/coral.glsl" + } + } else { + if (mat < 10476) { // Coral Fan+, Coral+ + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/terrain/coral.glsl" + } + else /*if (mat < 10480)*/ { // Crying Obsidian + #include "/lib/materials/specificMaterials/terrain/cryingObsidian.glsl" + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + } + } + } else { + if (mat < 10496) { + if (mat < 10488) { + if (mat < 10484) { // Blackstone++ + #include "/lib/materials/specificMaterials/terrain/blackstone.glsl" + } + else /*if (mat < 10488)*/ { // Gilded Blackstone + if (color.r > color.b * 3.0) { // Gilded Blackstone:Gilded Part + #include "/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl" + #ifdef GLOWING_ORE_GILDEDBLACKSTONE + emission = color.g * 1.5; + emission *= GLOWING_ORE_MULT; + #endif + } else { // Gilded Blackstone:Blackstone Part + #include "/lib/materials/specificMaterials/terrain/blackstone.glsl" + } + + } + } else { + if (mat < 10492) { // Lily Pad + noSmoothLighting = true; + subsurfaceMode = 2; + + #if defined COATED_TEXTURES && defined GBUFFERS_TERRAIN + doTileRandomisation = false; + #endif + + #ifdef IPBR + float factor = min1(color.g * 2.0); + smoothnessG = factor * 0.5; + highlightMult = factor; + #endif + } + else /*if (mat < 10496)*/ { // Dirt Path + #include "/lib/materials/specificMaterials/terrain/dirt.glsl" + #ifdef GBUFFERS_TERRAIN + glColor.a = sqrt(glColor.a); + #endif + } + } + } else { + if (mat < 10504) { + if (mat < 10500) { // Torch + noDirectionalShading = true; + + if (color.r > 0.95) { + noSmoothLighting = true; + lmCoordM.x = 1.0; + emission = GetLuminance(color.rgb) * 4.1; + albedo.r *= 1.4; + albedo.b *= 0.5; + } else + #ifdef GBUFFERS_TERRAIN + if (abs(NdotU) < 0.5) { + lmCoordM.x = min1(0.7 + 0.3 * pow2(1.0 - signMidCoordPos.y)); + } + #else + noSmoothLighting = false; + lmCoordM.x = 0.9; + #endif + + emission += 0.0001; // No light reducing during noon + } + else /*if (mat < 10504)*/ { // End Rod + noDirectionalShading = true; + + #ifdef GBUFFERS_TERRAIN + vec3 fractPos = abs(fract(playerPos + cameraPosition) - 0.5); + float maxCoord = max(fractPos.x, max(fractPos.y, fractPos.z)); + lmCoordM.x = maxCoord < 0.4376 ? 0.97 : 0.8; + #else + lmCoordM.x = 0.9; + #endif + + float dotColor = dot(color.rgb, color.rgb); + if (dotColor > 2.0) { + emission = 2.8; + emission *= 0.4 + max0(0.6 - 0.006 * lViewPos); + + albedo.rgb = pow2(color.rgb); + albedo.g *= 0.95; + } + } + } else { + if (mat < 10508) { // Chorus Plant + + } + else /*if (mat < 10512)*/ { // Chorus Flower:Alive + float dotColor = dot(color.rgb, color.rgb); + if (dotColor > 1.0) + emission = pow2(pow2(pow2(dotColor * 0.33))) + 0.2 * dotColor; + } + } + } + } + } + } + } + } else { + if (mat < 10768) { + if (mat < 10640) { + if (mat < 10576) { + if (mat < 10544) { + if (mat < 10528) { + if (mat < 10520) { + if (mat < 10516) { // Chorus Flower:Dead + if (color.b < color.g) { + emission = 10.7; + albedo.rgb *= color.rgb * dot(color.rgb, color.rgb) * vec3(0.4, 0.35, 0.4); + } + } + else /*if (mat < 10520)*/ { // Furnace:Lit + lmCoordM.x *= 0.95; + + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + + float dotColor = dot(color.rgb, color.rgb); + emission = 2.5 * dotColor * max0(pow2(pow2(pow2(color.r))) - color.b) + pow(dotColor * 0.35, 32.0); + albedo.r *= 1.0 + 0.1 * emission; + } + } else { + if (mat < 10524) { // Cactus + float factor = sqrt1(color.r); + smoothnessG = factor * 0.5; + highlightMult = factor; + } + else /*if (mat < 10528)*/ { // Note Block, Jukebox + float factor = color.r * 0.5; + smoothnessG = factor; + smoothnessD = factor; + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + } + } else { + if (mat < 10536) { + if (mat < 10532) { // Soul Torch + noSmoothLighting = true; noDirectionalShading = true; + lmCoordM.x = min(lmCoordM.x * 0.9, 0.77); + + if (color.b > 0.6) { + emission = 2.7; + albedo.rgb = pow1_5(color.rgb); + albedo.r = min1(color.r + 0.1); + } + emission += 0.0001; // No light reducing during noon + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10536)*/ { // Brown Mushroom Block + if (color.r > color.g && color.g > color.b && color.b > 0.37) { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } else { + float factor = pow2(color.r) * color.r * 0.8; + highlightMult = 1.5; + smoothnessG = factor; + smoothnessD = factor * 0.9; + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + } + } else { + if (mat < 10540) { // Red Mushroom Block + if (color.r > color.g && color.g > color.b && color.b > 0.37) { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } else { + float factor = min1(pow2(color.g) + 0.25); + highlightMult = 1.5; + smoothnessG = factor; + smoothnessD = factor * 0.7; + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + } + else /*if (mat < 10544)*/ { // Mushroom Stem, + if (color.r > color.g && color.g > color.b && color.b < 0.6) { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } else { + float factor = pow2(pow2(color.g)); + highlightMult = 1.5; + smoothnessG = factor; + smoothnessD = factor * 0.5; + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + } + } + } + } else { + if (mat < 10560) { + if (mat < 10552) { + if (mat < 10548) { // Glow Lichen + noSmoothLighting = true; + + #if GLOWING_LICHEN > 0 + float dotColor = dot(color.rgb, color.rgb); + emission = min(pow2(pow2(dotColor) * dotColor) * 1.4 + dotColor * 0.9, 6.0); + emission = mix(emission, dotColor * 1.5, min1(lViewPos / 96.0)); // Less noise in the distance + + #if GLOWING_LICHEN == 1 + float skyLightFactor = pow2(1.0 - min1(lmCoord.y * 2.9)); + emission *= skyLightFactor; + + color.r *= 1.0 + 0.15 * skyLightFactor; + #else + color.r *= 1.15; + #endif + #endif + } + else /*if (mat < 10552)*/ { // Enchanting Table:Base + float dotColor = dot(color.rgb, color.rgb); + if (dotColor < 0.19 && color.r < color.b) { + #include "/lib/materials/specificMaterials/terrain/obsidian.glsl" + } else if (color.g >= color.r) { + #include "/lib/materials/specificMaterials/terrain/diamondBlock.glsl" + } else { + smoothnessG = color.r * 0.3 + 0.1; + } + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + } else { + if (mat < 10556) { // End Portal Frame:Inactive + noSmoothLighting = true; + + if (abs(color.r - color.g - 0.05) < 0.10) { + #include "/lib/materials/specificMaterials/terrain/endStone.glsl" + } else { + #include "/lib/materials/specificMaterials/terrain/endPortalFrame.glsl" + } + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10560)*/ { // End Portal Frame:Active + noSmoothLighting = true; + + if (abs(color.r - color.g - 0.05) < 0.10) { + #include "/lib/materials/specificMaterials/terrain/endStone.glsl" + } else { + #include "/lib/materials/specificMaterials/terrain/endPortalFrame.glsl" + + vec2 absCoord = abs(fract(playerPos.xz + cameraPosition.xz) - 0.5); + float maxCoord = max(absCoord.x, absCoord.y); + if (maxCoord < 0.2505) { // End Portal Frame:Eye of Ender + smoothnessG = 0.5; + smoothnessD = 0.5; + emission = pow2(min(color.g, 0.25)) * 170.0 * (0.28 - maxCoord); + } else { + float minCoord = min(absCoord.x, absCoord.y); + if (CheckForColor(color.rgb, vec3(153, 198, 147)) + && minCoord > 0.25) { // End Portal Frame:Emissive Corner Bits + emission = 1.4; + albedo.rgb = vec3(0.45, 1.0, 0.6); + } + } + } + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + } + } else { + if (mat < 10568) { + if (mat < 10564) { // Lantern + noSmoothLighting = true; + lmCoordM.x = 0.77; + + #include "/lib/materials/specificMaterials/terrain/lanternMetal.glsl" + + emission = 4.3 * max0(color.r - color.b); + emission += min(pow2(pow2(0.75 * dot(color.rgb, color.rgb))), 5.0); + albedo.gb *= pow(vec2(0.8, 0.7), vec2(sqrt(emission) * 0.5)); + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10568)*/ { // Soul Lantern + noSmoothLighting = true; + lmCoordM.x = min(lmCoordM.x, 0.77); // consistency748523 + + #include "/lib/materials/specificMaterials/terrain/lanternMetal.glsl" + + emission = 1.45 * max0(color.g - color.r * 2.0); + emission += 1.17 * min(pow2(pow2(0.55 * dot(color.rgb, color.rgb))), 3.5); + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + } else { + if (mat < 10572) { // Turtle Egg, Sniffer Egg + smoothnessG = (color.r + color.g) * 0.35; + smoothnessD = (color.r + color.g) * 0.25; + } + else /*if (mat < 10576)*/ { // Dragon Egg + emission = float(color.b > 0.1) * 10.0 + 1.25; + } + } + } + } + } else { + if (mat < 10608) { + if (mat < 10592) { + if (mat < 10584) { + if (mat < 10580) { // Smoker:Lit + lmCoordM.x *= 0.95; + + float dotColor = dot(color.rgb, color.rgb); + if (color.r > color.b * 2.0 && dotColor > 0.7) { + emission = 2.5 * dotColor; + albedo.r *= 1.5; + } else { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } + } + else /*if (mat < 10584)*/ { // Blast Furnace:Lit + lmCoordM.x *= 0.95; + + float dotColor = dot(color.rgb, color.rgb); + if (color.r > color.b * 2.0 && dotColor > 0.7) { + emission = pow2(color.g) * (20.0 - 13.7 * float(color.b > 0.25)); + albedo.r *= 1.5; + } else { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } + } + } else { + if (mat < 10588) { // Candles:Lit + noSmoothLighting = true; + + albedo.rgb *= 1.0 + pow2(max(-signMidCoordPos.y, float(NdotU > 0.9) * 1.2)); + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10592)*/ { // Respawn Anchor:Unlit + noSmoothLighting = true; + + #include "/lib/materials/specificMaterials/terrain/cryingObsidian.glsl" + emission += 0.2; + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + } + } else { + if (mat < 10600) { + if (mat < 10596) { // Respawn Anchor:Lit + noSmoothLighting = true; + + #include "/lib/materials/specificMaterials/terrain/cryingObsidian.glsl" + + vec2 absCoord = abs(signMidCoordPos); + if (NdotU > 0.9 && max(absCoord.x, absCoord.y) < 0.754) { // Portal + highlightMult = 0.0; + smoothnessD = 0.0; + emission = pow2(color.r) * color.r * 16.0; + maRecolor = vec3(0.0); + } else if (color.r + color.g > 1.3) { // Respawn Anchor:Glowstone Part + emission = 4.5 * sqrt3(max0(color.r + color.g - 1.3)); + } + + emission += 0.3; + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10600)*/ { // Redstone Wire:Lit + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + + #if COLORED_LIGHTING == 0 + emission = pow2(min(color.r, 0.9)) * 4.0; + #else + vec3 colorP = color.rgb / glColor.rgb; + emission = pow2((colorP.r + color.r) * 0.5) * 3.5; + #endif + + albedo.gb *= 0.25; + } + } else { + if (mat < 10604) { // Redstone Wire:Unlit + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + } + else /*if (mat < 10608)*/ { // Redstone Torch + #include "/lib/materials/specificMaterials/terrain/redstoneTorch.glsl" + emission += 0.0001; // No light reducing during noon + } + } + } + } else { + if (mat < 10624) { + if (mat < 10616) { + if (mat < 10612) { // Redstone Block + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + #ifdef EMISSIVE_REDSTONE_BLOCK + emission = 0.75 + 3.0 * pow2(pow2(color.r)); + color.gb *= 0.65; + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + #endif + } + else /*if (mat < 10616)*/ { // Redstone Ore:Unlit + if (color.r - color.g > 0.2) { // Redstone Ore:Unlit:Redstone Part + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + #ifdef GLOWING_ORE_REDSTONE + emission = color.r * pow1_5(color.r) * 4.0; + color.gb *= 1.0 - 0.9 * min1(GLOWING_ORE_MULT); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Redstone Ore:Unlit:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + } + } else { + if (mat < 10620) { // Redstone Ore:Lit + if (color.r - color.g > 0.2) { // Redstone Ore:Lit:Redstone Part + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + emission = pow2(color.r) * color.r * 5.5; + albedo.gb *= 0.1; + } else { // Redstone Ore:Lit:Stone Part + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + } + noSmoothLighting = true; + } + else /*if (mat < 10624)*/ { // Deepslate Redstone Ore:Unlit + if (color.r - color.g > 0.2) { // Deepslate Redstone Ore:Unlit:Redstone Part + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + #ifdef GLOWING_ORE_REDSTONE + emission = color.r * pow1_5(color.r) * 4.0; + color.gb *= 1.0 - 0.9 * min1(GLOWING_ORE_MULT); + emission *= GLOWING_ORE_MULT; + #endif + } else { // Deepslate Redstone Ore:Unlit:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + } + } + } else { + if (mat < 10632) { + if (mat < 10628) { // Deepslate Redstone Ore:Lit + if (color.r - color.g > 0.2) { // Deepslate Redstone Ore:Lit:Redstone Part + #include "/lib/materials/specificMaterials/terrain/redstoneBlock.glsl" + emission = pow2(color.r) * color.r * 6.0; + albedo.gb *= 0.05; + } else { // Deepslate Redstone Ore:Lit:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } + noSmoothLighting = true; + } + else /*if (mat < 10632)*/ { // Cave Vines:No Glow Berries + subsurfaceMode = 1; + lmCoordM.x *= 0.875; + } + } else { + if (mat < 10636) { // Cave Vines:With Glow Berries + subsurfaceMode = 1; + lmCoordM.x *= 0.875; + + if (color.r > 0.64) { + emission = color.r < 0.75 ? 2.5 : 8.0; + albedo.rgb = color.rgb * vec3(1.0, 0.8, 0.6); + } + } + else /*if (mat < 10640)*/ { // Redstone Lamp:Unlit + materialMask = OSIEBCA; // Intense Fresnel + smoothnessG = color.r * 0.5 + 0.2; + float factor = pow2(smoothnessG); + highlightMult = factor * 2.0 + 1.0; + smoothnessD = min1(factor * 2.0); + } + } + } + } + } + } else { + if (mat < 10704) { + if (mat < 10672) { + if (mat < 10656) { + if (mat < 10648) { + if (mat < 10644) { // Redstone Lamp:Lit + noDirectionalShading = true; + lmCoordM.x = 0.89; + + materialMask = OSIEBCA; // Intense Fresnel + smoothnessG = color.r * 0.35 + 0.2; + float factor = pow2(smoothnessG); + highlightMult = factor * 2.0 + 1.0; + smoothnessD = min1(factor * 2.0); + + if (color.b > 0.1) { + float dotColor = dot(color.rgb, color.rgb); + #if MC_VERSION >= 11300 + emission = pow2(dotColor) * 1.0; + #else + emission = dotColor * 1.2; + #endif + albedo.rgb = pow1_5(color.rgb); + maRecolor = vec3(emission * 0.2); + } + } + else /*if (mat < 10648)*/ { // Repeater, Comparator + #if ANISOTROPIC_FILTER > 0 + color = texture2D(tex, texCoord); // Fixes artifacts + color.rgb *= glColor.rgb; + #endif + + vec3 absDif = abs(vec3(color.r - color.g, color.g - color.b, color.r - color.b)); + float maxDif = max(absDif.r, max(absDif.g, absDif.b)); + if (maxDif > 0.125 || color.b > 0.99) { // Redstone Parts + if (color.r < 0.999 && color.b > 0.4) albedo.gb *= 0.5; // Comparator:Emissive Wire + + #include "/lib/materials/specificMaterials/terrain/redstoneTorch.glsl" + } else { // Quartz Base + float factor = pow2(color.g) * 0.6; + + smoothnessG = factor; + highlightMult = 1.0 + 2.5 * factor; + smoothnessD = factor; + } + } + } else { + if (mat < 10652) { // Shroomlight + noSmoothLighting = true; noDirectionalShading = true; + lmCoordM = vec2(1.0, 0.0); + + float dotColor = dot(color.rgb, color.rgb); + emission = min(pow2(pow2(pow2(dotColor * 0.6))), 6.0) * 0.8 + 0.5; + } + else /*if (mat < 10656)*/ { // Campfire:Lit + #ifdef GBUFFERS_TERRAIN + vec3 fractPos = fract(playerPos + cameraPosition) - 0.5; + lmCoordM.x = pow2(pow2(smoothstep1(1.0 - 0.4 * dot(fractPos.xz, fractPos.xz)))); + #endif + + float dotColor = dot(color.rgb, color.rgb); + if (color.r > color.b && color.r - color.g < 0.15 && dotColor < 1.4) { + #include "/lib/materials/specificMaterials/terrain/oakWood.glsl" + } else if (color.r > color.b || dotColor > 2.9) { + noDirectionalShading = true; + emission = 3.5; + albedo.rgb *= sqrt1(GetLuminance(color.rgb)); + } + } + } + } else { + if (mat < 10664) { + if (mat < 10660) { // Soul Campfire:Lit + noSmoothLighting = true; + + float dotColor = dot(color.rgb, color.rgb); + if (color.r > color.b) { + #include "/lib/materials/specificMaterials/terrain/oakWood.glsl" + } else if (color.g - color.r > 0.1 || dotColor > 2.9) { + noDirectionalShading = true; + emission = 2.1; + albedo.rgb *= sqrt1(GetLuminance(color.rgb)); + } + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10664)*/ { // Campfire:Unlit, Soul Campfire:Unlit + noSmoothLighting = true; + + if (color.r > color.b) { + #include "/lib/materials/specificMaterials/terrain/oakWood.glsl" + } + } + } else { + if (mat < 10668) { // Observer + if (color.r > 0.1 && color.g + color.b < 0.1) { + #include "/lib/materials/specificMaterials/terrain/redstoneTorch.glsl" + } else { + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } + } + else /*if (mat < 10672)*/ { // Wool+, Carpet+ except Lime + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } + } + } else { + if (mat < 10688) { + if (mat < 10680) { + if (mat < 10676) { // Bone Block + smoothnessG = color.r * 0.2; + smoothnessD = smoothnessG; + + #ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.5, shadowMult, highlightMult); + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.33; + #endif + } + else /*if (mat < 10680)*/ { // Barrel, Beehive, Bee Nest, Honeycomb Block + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } + } else { + if (mat < 10684) { // Ochre Froglight + float frogPow = 8.0; + #include "/lib/materials/specificMaterials/terrain/froglights.glsl" + } + else /*if (mat < 10688)*/ { // Verdant Froglight + float frogPow = 16.0; + #include "/lib/materials/specificMaterials/terrain/froglights.glsl" + } + } + } else { + if (mat < 10696) { + if (mat < 10692) { // Pearlescent Froglight + float frogPow = 24.0; + #include "/lib/materials/specificMaterials/terrain/froglights.glsl" + } + else /*if (mat < 10696)*/ { // Reinforced Deepslate + if (abs(color.r - color.g) < 0.01) { // Reinforced Deepslate:Deepslate Part + #include "/lib/materials/specificMaterials/terrain/deepslate.glsl" + } else { // Reinforced Deepslate:Sculk + float boneFactor = max0(color.r * 1.25 - color.b); + + if (boneFactor < 0.0001) emission = 0.15; + + smoothnessG = min1(boneFactor * 1.7); + smoothnessD = smoothnessG; + } + } + } else { + if (mat < 10700) { // Sculk, Sculk Catalyst, Sculk Vein, Sculk Sensor:Unlit + float boneFactor = max0(color.r * 1.25 - color.b); + + if (boneFactor < 0.0001) { + emission = pow2(max0(color.g - color.r)) * 1.7; + + #ifdef GBUFFERS_TERRAIN + vec2 bpos = floor(playerPos.xz + cameraPosition.xz + 0.501) + + floor(playerPos.y + cameraPosition.y + 0.501); + bpos = bpos * 0.01 + 0.003 * frameTimeCounter; + emission *= pow2(texture2D(noisetex, bpos).r * pow1_5(texture2D(noisetex, bpos * 0.5).r)); + emission *= 6.0; + #endif + } + + smoothnessG = min1(boneFactor * 1.7); + smoothnessD = smoothnessG; + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10704)*/ { // Sculk Shrieker + float boneFactor = max0(color.r * 1.25 - color.b); + + if (boneFactor < 0.0001) { + emission = pow2(max0(color.g - color.r)) * 2.0; + + #ifdef GBUFFERS_TERRAIN + vec2 coordFactor = abs(fract(playerPos.xz + cameraPosition.xz) - 0.5); + float coordFactorM = max(coordFactor.x, coordFactor.y); + if (coordFactorM < 0.43) emission += color.g * 7.0; + #endif + } + + smoothnessG = min1(boneFactor * 1.7); + smoothnessD = smoothnessG; + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + } + } + } + } else { + if (mat < 10736) { + if (mat < 10720) { + if (mat < 10712) { + if (mat < 10708) { // Sculk Sensor:Lit + lmCoordM = vec2(0.0, 0.0); + emission = pow2(max0(color.g - color.r)) * 7.0 + 0.7; + } + else /*if (mat < 10712)*/ { // Spawner + smoothnessG = color.b + 0.2; + smoothnessD = smoothnessG; + + emission = 7.0 * float(CheckForColor(color.rgb, vec3(110, 4, 83))); + } + } else { + if (mat < 10716) { // Tuff++ + smoothnessG = color.r * 0.3; + smoothnessD = smoothnessG; + + #if COLORED_LIGHTING == 0 + /* Tweak to make caves with Glow Lichen look better lit and closer to vanilla Minecraft. */ + lmCoordM = pow(lmCoordM + 0.0001, vec2(0.65)); + #endif + } + else /*if (mat < 10720)*/ { // Clay + highlightMult = 2.0; + smoothnessG = pow2(pow2(color.g)) * 0.5; + smoothnessG = min1(smoothnessG); + smoothnessD = smoothnessG * 0.7; + + #ifdef GBUFFERS_TERRAIN + DoOceanBlockTweaks(smoothnessD); + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + } + } + } else { + if (mat < 10728) { + if (mat < 10724) { // Ladder + noSmoothLighting = true; + } + else /*if (mat < 10728)*/ { // Gravel, Suspicious Gravel + #include "/lib/materials/specificMaterials/terrain/stone.glsl" + + #ifdef GBUFFERS_TERRAIN + DoOceanBlockTweaks(smoothnessD); + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 1.25; + #endif + } + } else { + if (mat < 10732) { // Flower Pot, Potted Stuff:Without Subsurface + noSmoothLighting = true; + } + else /*if (mat < 10736)*/ { // Potted Stuff:With Subsurface + noSmoothLighting = true; + + float NdotE = dot(newNormal, eastVec); + if (abs(abs(NdotE) - 0.5) < 0.4) { + subsurfaceMode = 1, noDirectionalShading = true; + } + } + } + } + } else { + if (mat < 10752) { + if (mat < 10744) { + if (mat < 10740) { // Structure Block, Jigsaw Block + float blockRes = absMidCoordPos.x * atlasSize.x; + vec2 signMidCoordPosM = (floor((signMidCoordPos + 1.0) * blockRes) + 0.5) / blockRes - 1.0; + float dotsignMidCoordPos = dot(signMidCoordPosM, signMidCoordPosM); + float lBlockPosM = pow2(max0(1.0 - 1.125 * pow2(dotsignMidCoordPos))); + + emission = 4.5 * lBlockPosM; + albedo.rgb = pow2(color.rgb); + } + else /*if (mat < 10744)*/ { // Chain + noSmoothLighting = true; + lmCoordM.x = min(lmCoordM.x, 0.77); // consistency748523 + + #include "/lib/materials/specificMaterials/terrain/lanternMetal.glsl" + } + } else { + if (mat < 10748) { // Soul Sand, Soul Soil + smoothnessG = color.r * 0.4; + smoothnessD = color.r * 0.25; + } + else /*if (mat < 10752)*/ { // Dried Kelp Block + smoothnessG = pow2(color.b) * 0.8; + smoothnessD = smoothnessG; + + #ifdef COATED_TEXTURES + noiseFactor = 0.5; + #endif + } + } + } else { + if (mat < 10760) { + if (mat < 10756) { // Bamboo + if (absMidCoordPos.x > 0.005) + subsurfaceMode = 1, noSmoothLighting = true, noDirectionalShading = true; + // No further material properties as bamboo jungles are already slow + } + else /*if (mat < 10760)*/ { // Block of Bamboo, Bamboo Planks++ + #include "/lib/materials/specificMaterials/planks/bambooPlanks.glsl" + } + } else { + if (mat < 10764) { // Cherry Planks++ + #include "/lib/materials/specificMaterials/planks/cherryPlanks.glsl" + } + else /*if (mat < 10768)*/ { // Cherry Log, Cherry Wood + if (color.g > 0.33) { // Cherry Log:Clean Part + #include "/lib/materials/specificMaterials/planks/cherryPlanks.glsl" + } else { // Cherry Log:Wood Part, Cherry Wood + smoothnessG = pow2(color.r); + smoothnessD = smoothnessG; + } + } + } + } + } + } + } + } else { + if (mat < 10896) { + if (mat < 10832) { + if (mat < 10800) { + if (mat < 10784) { + if (mat < 10776) { + if (mat < 10772) { // Torchflower + subsurfaceMode = 1, noSmoothLighting = true, noDirectionalShading = true; + + #ifdef GBUFFERS_TERRAIN + DoFoliageColorTweaks(color.rgb, shadowMult, snowMinNdotU, lViewPos); + + emission = (1.0 - abs(signMidCoordPos.x)) * max0(0.7 - abs(signMidCoordPos.y + 0.7)); + emission = pow1_5(emission) * 2.5; + #endif + + #if SHADOW_QUALITY == -1 + shadowMult *= 1.0 - 0.3 * (signMidCoordPos.y + 1.0) * (1.0 - abs(signMidCoordPos.x)) + + 0.5 * (1.0 - signMidCoordPos.y) * invNoonFactor; // consistency357381 + #endif + } + else /*if (mat < 10776)*/ { // Potted Torchflower + noSmoothLighting = true; + + float NdotE = dot(newNormal, eastVec); + if (abs(abs(NdotE) - 0.5) < 0.4) { + subsurfaceMode = 1, noDirectionalShading = true; + + #ifdef GBUFFERS_TERRAIN + emission = (1.0 - abs(signMidCoordPos.x)) * max0(0.7 - abs(signMidCoordPos.y + 0.7)); + emission = pow1_5(emission) * 2.5; + #endif + } + } + } else { + if (mat < 10780) { // Crimson Fungus, Warped Fungus + noSmoothLighting = true; + + if (color.r > 0.91) { + emission = 3.0 * color.g; + albedo.r *= 1.2; + maRecolor = vec3(0.1); + } + } + else /*if (mat < 10784)*/ { // Potted Crimson Fungus, Potted Warped Fungus + noSmoothLighting = true; + + float NdotE = dot(newNormal, eastVec); + if (abs(abs(NdotE) - 0.5) < 0.4) { + if (color.r > 0.91) { + emission = 3.0 * color.g; + albedo.r *= 1.2; + maRecolor = vec3(0.1); + } + } + } + } + } else { + if (mat < 10792) { + if (mat < 10788) { // Calibrated Sculk Sensor:Unlit + #if ANISOTROPIC_FILTER == 0 + vec4 checkColor = color; + #else + vec4 checkColor = texture2D(tex, texCoord); // Fixes artifacts + #endif + if (checkColor.r + checkColor.b > checkColor.g * 2.2 || checkColor.r > 0.99) { // Amethyst Part + #if GLOWING_AMETHYST >= 1 && defined GBUFFERS_TERRAIN + vec2 absCoord = abs(signMidCoordPos); + float maxBlockPos = max(absCoord.x, absCoord.y); + emission = pow2(max0(1.0 - maxBlockPos) * color.g) * 5.4 + 1.2 * color.g; + + color.g *= 1.0 - emission * 0.07; + color.rgb *= color.g; + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } else { // Sculk Part + float boneFactor = max0(color.r * 1.25 - color.b); + + if (boneFactor < 0.0001) emission = pow2(max0(color.g - color.r)); + + smoothnessG = min1(boneFactor * 1.7); + smoothnessD = smoothnessG; + } + + #ifdef SNOWY_WORLD + snowFactor = 0.0; + #endif + } + else /*if (mat < 10792)*/ { // Calibrated Sculk Sensor:Lit + lmCoordM = vec2(0.0, 0.0); + + #if ANISOTROPIC_FILTER == 0 + vec4 checkColor = color; + #else + vec4 checkColor = texture2D(tex, texCoord); // Fixes artifacts + #endif + if (checkColor.r + checkColor.b > checkColor.g * 2.2 || checkColor.r > 0.99) { // Amethyst Part + lmCoordM.x = 1.0; + + #if GLOWING_AMETHYST >= 1 && defined GBUFFERS_TERRAIN + vec2 absCoord = abs(signMidCoordPos); + float maxBlockPos = max(absCoord.x, absCoord.y); + emission = pow2(max0(1.0 - maxBlockPos) * color.g) * 5.4 + 1.2 * color.g; + + color.g *= 1.0 - emission * 0.07; + color.rgb *= color.g; + #endif + + #ifdef COATED_TEXTURES + noiseFactor = 0.66; + #endif + } else { // Sculk Part + emission = pow2(max0(color.g - color.r)) * 7.0 + 0.7; + } + } + } else { + if (mat < 10796) { // Oak Door, Oak Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/oakPlanks.glsl" + } + else /*if (mat < 10800)*/ { // Spruce Door, Spruce Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl" + } + } + } + } else { + if (mat < 10816) { + if (mat < 10808) { + if (mat < 10804) { // Birch Door, Birch Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/birchPlanks.glsl" + } + else /*if (mat < 10808)*/ { // Jungle Door, Jungle Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/junglePlanks.glsl" + } + } else { + if (mat < 10812) { // Acacia Door, Acacia Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/acaciaPlanks.glsl" + } + else /*if (mat < 10816)*/ { // Dark Oak Door, Dark Oak Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/darkOakPlanks.glsl" + } + } + } else { + if (mat < 10824) { + if (mat < 10820) { // Mangrove Door, Mangrove Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/mangrovePlanks.glsl" + } + else /*if (mat < 10824)*/ { // Crimson Door, Crimson Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/crimsonPlanks.glsl" + } + } else { + if (mat < 10828) { // Warped Door, Warped Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/warpedPlanks.glsl" + } + else /*if (mat < 10832)*/ { // Bamboo Door, Bamboo Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/bambooPlanks.glsl" + } + } + } + } + } else { + if (mat < 10864) { + if (mat < 10848) { + if (mat < 10840) { + if (mat < 10836) { // Cherry Door, Cherry Trapdoor + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/planks/cherryPlanks.glsl" + } + else /*if (mat < 10840)*/ { // Brewing Stand + #ifdef GBUFFERS_TERRAIN + vec3 worldPos = playerPos + cameraPosition; + vec3 fractPos = fract(worldPos.xyz); + vec3 coordM = abs(fractPos.xyz - 0.5); + float cLength = dot(coordM, coordM) * 1.3333333; + cLength = pow2(1.0 - cLength); + + if (color.r + color.g > color.b * 3.0 && max(coordM.x, coordM.z) < 0.07) { + emission = 2.5 * pow1_5(cLength); + } else { + lmCoordM.x = max(lmCoordM.x * 0.9, cLength); + + #include "/lib/materials/specificMaterials/terrain/cobblestone.glsl" + } + #else + emission = max0(color.r + color.g - color.b * 1.8 - 0.3) * 2.2; + #endif + } + } else { + if (mat < 10844) { // Lime Concrete + smoothnessG = 0.4; + highlightMult = 1.5; + smoothnessD = 0.3; + + #ifdef COATED_TEXTURES + noiseFactor = 0.2; + #endif + + #ifdef GREEN_SCREEN_LIME + materialMask = OSIEBCA * 240.0; // Green Screen Lime Blocks + #endif + } + else /*if (mat < 10848)*/ { // Lime Carpet, Lime Wool + #ifdef COATED_TEXTURES + noiseFactor = 0.77; + #endif + + #ifdef GREEN_SCREEN_LIME + materialMask = OSIEBCA * 240.0; // Green Screen Lime Blocks + #endif + } + } + } else { + if (mat < 10856) { + if (mat < 10852) { // Crafter + smoothnessG = pow2(color.b); + smoothnessD = max(smoothnessG, 0.2); + + if (color.r > 2.5 * (color.g + color.b)) { + emission = 4.0; + albedo.rgb *= color.rgb; + } + } + // else /*if (mat < 10856)*/ { // Copper Bulb:BrighterOnes + // #include "/lib/materials/specificMaterials/terrain/copperBulb.glsl" + // } + } else { + if (mat < 10860) { // Copper Bulb:DimmerOnes + #include "/lib/materials/specificMaterials/terrain/copperBulb.glsl" + emission *= 0.85; + } + else /*if (mat < 10864)*/ { // Copper Door+, Copper Trapdoor+ + noSmoothLighting = true; + #include "/lib/materials/specificMaterials/terrain/copperBlock.glsl" + } + } + } + } else { + if (mat < 10880) { + if (mat < 10872) { + if (mat < 10868) { // Candles:Unlit + + } + else /*if (mat < 10872)*/ { // Trial Spawner:NotOmiNdotUs:Active, Vault:NotOmiNdotUs:Active + smoothnessG = max0(color.b - color.r * 0.5); + smoothnessD = smoothnessG; + + emission = max0(color.r - color.b) * 3.0; + albedo.rgb = pow(color.rgb, vec3(1.0 + 0.5 * sqrt(emission))); + } + } else { + if (mat < 10876) { // Trial Spawner:Inactive, Vault:Inactive + smoothnessG = max0(color.b - color.r * 0.5); + smoothnessD = smoothnessG; + } + else /*if (mat < 10880)*/ { // Trial Spawner:OmiNdotUs:Active, Vault:OmiNdotUs:Active + float maxComponent = max(max(color.r, color.g), color.b); + float minComponent = min(min(color.r, color.g), color.b); + float saturation = (maxComponent - minComponent) / (1.0 - abs(maxComponent + minComponent - 1.0)); + + smoothnessG = max0(color.b - pow2(saturation) * 0.5) * 0.5 + 0.1; + smoothnessD = smoothnessG; + + emission = saturation > 0.5 ? 4.0 : 0.0; + albedo.rgb = pow(color.rgb, vec3(1.0 + (0.3 + 0.5 * color.r) * emission)); + } + } + } else { + if (mat < 10888) { + if (mat < 10884) { // Several Non-solid Blocks + + } + else /*if (mat < 10888)*/ { // Weeping Vines, Twisting Vines + noSmoothLighting = true; + + #if defined COATED_TEXTURES && defined GBUFFERS_TERRAIN + doTileRandomisation = false; + #endif + + if (color.r > 0.91) { + emission = 3.0 * color.g; + albedo.r *= 1.2; + maRecolor = vec3(0.1); + } + } + } else { + if (mat < 10892) { // Hay Block + smoothnessG = pow2(color.r) * 0.5; + highlightMult *= 1.5; + smoothnessD = float(color.r > color.g * 2.0) * 0.3; + } + else /*if (mat < 10896)*/ { // + + } + } + } + } + } + } else { + if (mat < 10960) { + if (mat < 10928) { + if (mat < 10912) { + if (mat < 10904) { + if (mat < 10900) { // + + } + else /*if (mat < 10904)*/ { // + + } + } else { + if (mat < 10908) { // + + } + else /*if (mat < 10912)*/ { // + + } + } + } else { + if (mat < 10920) { + if (mat < 10916) { // + + } + else /*if (mat < 10920)*/ { // + + } + } else { + if (mat < 10924) { // + + } + else /*if (mat < 10928)*/ { // + + } + } + } + } else { + if (mat < 10944) { + if (mat < 10936) { + if (mat < 10932) { // + + } + else /*if (mat < 10936)*/ { // + + } + } else { + if (mat < 10940) { // + + } + else /*if (mat < 10944)*/ { // + + } + } + } else { + if (mat < 10952) { + if (mat < 10948) { // + + } + else /*if (mat < 10952)*/ { // + + } + } else { + if (mat < 10956) { // + + } + else /*if (mat < 10960)*/ { // + + } + } + } + } + } else { + if (mat < 10992) { + if (mat < 10976) { + if (mat < 10968) { + if (mat < 10964) { // + + } + else /*if (mat < 10968)*/ { // + + } + } else { + if (mat < 10972) { // + + } + else /*if (mat < 10976)*/ { // + + } + } + } else { + if (mat < 10984) { + if (mat < 10980) { // + + } + else /*if (mat < 10984)*/ { // + + } + } else { + if (mat < 10988) { // + + } + else /*if (mat < 10992)*/ { // + + } + } + } + } else { + if (mat < 11008) { + if (mat < 11000) { + if (mat < 10996) { // + + } + else /*if (mat < 11000)*/ { // + + } + } else { + if (mat < 11004) { // + + } + else /*if (mat < 11008)*/ { // + + } + } + } else { + if (mat < 11016) { + if (mat < 11012) { // + + } + else /*if (mat < 11016)*/ { // + + } + } else { + if (mat < 11020) { // + + } + else /*if (mat < 11024)*/ { // + + } + } + } + } + } + } + } + } +} +} \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/others/endPortalEffect.glsl b/shaders/lib/materials/specificMaterials/others/endPortalEffect.glsl new file mode 100644 index 0000000..a494cea --- /dev/null +++ b/shaders/lib/materials/specificMaterials/others/endPortalEffect.glsl @@ -0,0 +1,100 @@ +// End Portal fix by fayer3#2332 (Modified) +vec3[8] colors = vec3[]( + vec3(0.3472479, 0.6559956, 0.7387838) * 1.5, + vec3(0.6010780, 0.7153565, 1.060625 ), + vec3(0.4221090, 0.8135094, 0.9026056), + vec3(0.3492291, 1.0241201, 1.8612821), + vec3(0.7543085, 0.8238697, 0.6803233), + vec3(0.4144472, 0.5648165, 0.8037 ), + vec3(0.508905 , 0.6719649, 0.9982805), + vec3(0.5361914, 0.4476583, 0.8008522)); +color.rgb = vec3(0.4214321, 0.4722309, 1.9922364) * 0.08; + +float dither = Bayer64(gl_FragCoord.xy); +#ifdef TAA + dither = fract(dither + 1.61803398875 * mod(float(frameCounter), 3600.0)); + int repeat = 4; +#else + int repeat = 8; +#endif +float dismult = 0.5; +for (int j = 0; j < repeat; j++) { + float add = float(j + dither) * 0.0625 / float(repeat); + for (int i = 1; i <= 8; i++) { + float colormult = 0.9/(30.0+i); + float rotation = (i - 0.1 * i + 0.71 * i - 11 * i + 21) * 0.01 + i * 0.01; + float Cos = cos(radians(rotation)); + float Sin = sin(radians(rotation)); + vec2 offset = vec2(0.0, 1.0/(3600.0/24.0)) * pow(16.0 - i, 2.0) * 0.004; + + vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos * (i * dismult + 1), 1.0)).xyz); + if (abs(NdotU) > 0.9) { + wpos.xz /= wpos.y; + wpos.xz *= 0.06 * sign(- playerPos.y); + wpos.xz *= abs(playerPos.y) + i * dismult + add; + wpos.xz -= cameraPosition.xz * 0.05; + } else { + vec3 absPos = abs(playerPos); + if (abs(dot(normal, eastVec)) > 0.9) { + wpos.xz = wpos.yz / wpos.x; + wpos.xz *= 0.06 * sign(- playerPos.x); + wpos.xz *= abs(playerPos.x) + i * dismult + add; + wpos.xz -= cameraPosition.yz * 0.05; + } else { + wpos.xz = wpos.yx / wpos.z; + wpos.xz *= 0.06 * sign(- playerPos.z); + wpos.xz *= abs(playerPos.z) + i * dismult + add; + wpos.xz -= cameraPosition.yx * 0.05; + } + } + vec2 pos = wpos.xz; + + vec2 wind = fract((frameTimeCounter + 984.0) * (i + 8) * 0.125 * offset); + vec2 coord = mat2(Cos, Sin, -Sin, Cos) * pos + wind; + if (mod(float(i), 4) < 1.5) coord = coord.yx + vec2(-1.0, 1.0) * wind.y; + + vec3 psample = pow(texture2D(tex, coord).rgb, vec3(0.85)) * colors[i-1] * colormult; + color.rgb += psample * length(psample.rgb) * (3000.0 / repeat); + } +} +color.rgb *= vec3(0.09, 0.077, 0.07); +emission = 10.0; +noDirectionalShading = true; + +#ifdef COATED_TEXTURES + noiseFactor = 0.0; +#endif + +#ifdef PORTAL_EDGE_EFFECT + //vec3 voxelPos = SceneToVoxel(mix(playerPos, vec3(0.0), -0.02)); // Fixes weird parallax offset + vec3 voxelPos = SceneToVoxel(playerPos); + + float portalOffset = 0.08333 * dither; + vec3[4] portalOffsets = vec3[]( + vec3( portalOffset, 0, portalOffset), + vec3( portalOffset, 0,-portalOffset), + vec3(-portalOffset, 0, portalOffset), + vec3(-portalOffset, 0,-portalOffset) + ); + + float edge = 0.0; + for (int i = 0; i < 4; i++) { + int voxel = int(texelFetch(voxel_sampler, ivec3(voxelPos + portalOffsets[i]), 0).r); + if (voxel == 58 || voxel == 255) { // End Portal Frame or Bedrock + edge = 1.0; break; + } + } + + #ifdef END + // No edge effect in the middle of the return fountain + vec2 var1 = abs(playerPos.xz + cameraPosition.xz - 0.5); + float var2 = max(var1.x, var1.y); + if (var2 > 1.0) + #endif + + { + vec4 edgeColor = vec4(vec3(0.3, 0.6, 0.7), 1.0); + color = mix(color, edgeColor, edge); + emission = mix(emission, 5.0, edge); + } +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/others/signText.glsl b/shaders/lib/materials/specificMaterials/others/signText.glsl new file mode 100644 index 0000000..c196c54 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/others/signText.glsl @@ -0,0 +1,15 @@ +normalM = upVec; + +highlightMult = 0.0; +shadowMult = vec3(0.0); + +#if MC_VERSION >= 11700 + if (lmCoord.x > 0.99) { // Glowing Sign Text + lmCoordM = vec2(0.0); + + emission = 1.0; + + color.rgb *= length(color.rgb) + 0.5; + } else // Normal Sign Text +#endif +color.rgb *= 5.0; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/acaciaPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/acaciaPlanks.glsl new file mode 100644 index 0000000..8ea0ab5 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/acaciaPlanks.glsl @@ -0,0 +1,6 @@ +smoothnessG = pow2(pow2(color.r)) * 0.65; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.5; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/bambooPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/bambooPlanks.glsl new file mode 100644 index 0000000..2b0a45e --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/bambooPlanks.glsl @@ -0,0 +1,3 @@ +smoothnessG = color.r * 0.4; + +smoothnessD = color.r * 0.3; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/birchPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/birchPlanks.glsl new file mode 100644 index 0000000..6ed814d --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/birchPlanks.glsl @@ -0,0 +1,6 @@ +smoothnessG = pow2(pow2(color.g)) * 0.75; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/cherryPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/cherryPlanks.glsl new file mode 100644 index 0000000..80ef5a9 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/cherryPlanks.glsl @@ -0,0 +1,6 @@ +smoothnessG = pow2(pow2(color.g)) * 0.7; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/crimsonPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/crimsonPlanks.glsl new file mode 100644 index 0000000..2506ad2 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/crimsonPlanks.glsl @@ -0,0 +1,6 @@ +smoothnessG = pow2(color.r) * 0.7; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.77; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/darkOakPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/darkOakPlanks.glsl new file mode 100644 index 0000000..7b61730 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/darkOakPlanks.glsl @@ -0,0 +1,6 @@ +smoothnessG = color.r * 0.7; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/junglePlanks.glsl b/shaders/lib/materials/specificMaterials/planks/junglePlanks.glsl new file mode 100644 index 0000000..68e61b6 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/junglePlanks.glsl @@ -0,0 +1,7 @@ +smoothnessG = pow2(pow2(pow2(color.g))) * 12.0; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/mangrovePlanks.glsl b/shaders/lib/materials/specificMaterials/planks/mangrovePlanks.glsl new file mode 100644 index 0000000..cc5f933 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/mangrovePlanks.glsl @@ -0,0 +1,3 @@ +smoothnessG = pow2(color.r) * 0.7; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/oakPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/oakPlanks.glsl new file mode 100644 index 0000000..56e3772 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/oakPlanks.glsl @@ -0,0 +1,7 @@ +smoothnessG = pow2(pow2(pow2(color.g))) * 12.0; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.77; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/sprucePlanks.glsl b/shaders/lib/materials/specificMaterials/planks/sprucePlanks.glsl new file mode 100644 index 0000000..6d37644 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/sprucePlanks.glsl @@ -0,0 +1,7 @@ +smoothnessG = pow2(pow2(color.g)) * 8.0; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/planks/warpedPlanks.glsl b/shaders/lib/materials/specificMaterials/planks/warpedPlanks.glsl new file mode 100644 index 0000000..434288d --- /dev/null +++ b/shaders/lib/materials/specificMaterials/planks/warpedPlanks.glsl @@ -0,0 +1,6 @@ +smoothnessG = pow2(color.g) * 0.7; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.77; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/anvil.glsl b/shaders/lib/materials/specificMaterials/terrain/anvil.glsl new file mode 100644 index 0000000..f55110b --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/anvil.glsl @@ -0,0 +1,6 @@ +smoothnessG = color.r; +smoothnessD = color.r; + +#ifdef COATED_TEXTURES + noiseFactor = 0.33; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/blackstone.glsl b/shaders/lib/materials/specificMaterials/terrain/blackstone.glsl new file mode 100644 index 0000000..cd04345 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/blackstone.glsl @@ -0,0 +1,2 @@ +smoothnessG = color.r; +smoothnessD = color.r * 0.65; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/cobblestone.glsl b/shaders/lib/materials/specificMaterials/terrain/cobblestone.glsl new file mode 100644 index 0000000..6aa428e --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/cobblestone.glsl @@ -0,0 +1,3 @@ +smoothnessG = pow2(pow2(color.g)); +smoothnessD = smoothnessG; +smoothnessG = max(smoothnessG, 0.3 * color.g * float(color.g > color.b * 1.5)); \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/copperBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/copperBlock.glsl new file mode 100644 index 0000000..81bbfc3 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/copperBlock.glsl @@ -0,0 +1,10 @@ +materialMask = OSIEBCA * 2.0; // Copper Fresnel +smoothnessG = pow2(pow2(color.r)) + pow2(max0(color.g - color.r * 0.5)) * 0.3; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; + +color.rgb *= 0.6 + 0.7 * GetLuminance(color.rgb); + +#ifdef COATED_TEXTURES + noiseFactor = 0.5; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/copperBulb.glsl b/shaders/lib/materials/specificMaterials/terrain/copperBulb.glsl new file mode 100644 index 0000000..dba61fc --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/copperBulb.glsl @@ -0,0 +1,20 @@ +noSmoothLighting = true; + +vec3 hsvColor = rgb2hsv(color.rgb); +if (abs(hsvColor.r - 0.09722) < 0.04305 && hsvColor.b > 0.7) { // Active Light Part + smoothnessG = 0.75; + smoothnessD = 0.35; + + float blockRes = absMidCoordPos.x * atlasSize.x; + vec2 signMidCoordPosM = (floor((signMidCoordPos + 1.0) * blockRes) + 0.5) / blockRes - 1.0; + float dotsignMidCoordPos = dot(signMidCoordPosM, signMidCoordPosM); + float lBlockPosM = pow2(max0(1.0 - 1.7 * pow2(pow2(dotsignMidCoordPos)))); + + emission = pow2(lmCoordM.x) + 0.3 * color.r; + emission *= (0.7 + 2.0 * pow2(lBlockPosM)); +} else if (color.r > 2.5 * (color.g + color.b)) { // Middle Redstone Part + emission = 4.0; + color.rgb *= color.rgb; +} else { // Copper Base + #include "/lib/materials/specificMaterials/terrain/copperBlock.glsl" +} \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/coral.glsl b/shaders/lib/materials/specificMaterials/terrain/coral.glsl new file mode 100644 index 0000000..77d5d72 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/coral.glsl @@ -0,0 +1,7 @@ +float lColor = length(color.rgb); +smoothnessG = lColor * 0.2; +smoothnessD = lColor * 0.15; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/cryingObsidian.glsl b/shaders/lib/materials/specificMaterials/terrain/cryingObsidian.glsl new file mode 100644 index 0000000..ffcdada --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/cryingObsidian.glsl @@ -0,0 +1,11 @@ +#include "/lib/materials/specificMaterials/terrain/obsidian.glsl" + +highlightMult *= 0.5; + +float factor0 = sqrt2(max0(color.b - color.g * 6.0)); +float factor1 = pow2(color.b); +emission = 1.35 + pow2(pow2(factor1)) * 7.5; +emission *= factor0; +color.r *= 1.15; + +maRecolor = vec3(factor0 * min(max0(factor1 * 0.7 - 0.1) * 1.3, 0.5)); \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/deepslate.glsl b/shaders/lib/materials/specificMaterials/terrain/deepslate.glsl new file mode 100644 index 0000000..0cfccda --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/deepslate.glsl @@ -0,0 +1,8 @@ +smoothnessG = pow2(color.g) * 1.5; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; + +#if COLORED_LIGHTING == 0 + /* Tweak to make caves with Glow Lichen look better lit and closer to vanilla Minecraft. */ + lmCoordM = pow(lmCoordM + 0.0001, vec2(0.65)); +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/diamondBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/diamondBlock.glsl new file mode 100644 index 0000000..72deb02 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/diamondBlock.glsl @@ -0,0 +1,25 @@ +materialMask = OSIEBCA; // Intense Fresnel + +float factor = max(max(color.g, 0.8),max(color.b, 0.8)); +float factor2 = pow2(factor); +#ifdef GBUFFERS_TERRAIN + float factor4 = pow2(factor2); +#else + float factor4 = factor2; +#endif + +smoothnessG = factor - pow2(pow2(color.g)) * 0.4; +highlightMult = 3.0 * max(pow2(factor4), 0.2); + +smoothnessD = factor4 * 0.75; + +#if MC_VERSION < 11300 + highlightMult *= 2.0; + smoothnessD /= 0.75; +#endif + +color.rgb *= 0.7 + 0.4 * GetLuminance(color.rgb); + +#ifdef COATED_TEXTURES + noiseFactor = 0.5; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/dirt.glsl b/shaders/lib/materials/specificMaterials/terrain/dirt.glsl new file mode 100644 index 0000000..342053e --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/dirt.glsl @@ -0,0 +1 @@ +smoothnessG = color.r * 0.1 + 0.1; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/emeraldBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/emeraldBlock.glsl new file mode 100644 index 0000000..f2e049c --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/emeraldBlock.glsl @@ -0,0 +1,14 @@ +materialMask = OSIEBCA; // Intense Fresnel + +float factor = pow2(sqrt2(GetLuminance(color.rgb))); +float factor2 = pow2(factor); +float factor4 = pow2(factor2); + +smoothnessG = factor - factor4 * 0.4; +highlightMult = 3.0 * factor4; + +smoothnessD = factor4 * 0.75; + +#ifdef COATED_TEXTURES + noiseFactor = 0.5; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/endPortalFrame.glsl b/shaders/lib/materials/specificMaterials/terrain/endPortalFrame.glsl new file mode 100644 index 0000000..65dba9f --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/endPortalFrame.glsl @@ -0,0 +1,3 @@ +// End Portal Frame:Green Parts +smoothnessG = 0.25; +smoothnessD = 0.45; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/endStone.glsl b/shaders/lib/materials/specificMaterials/terrain/endStone.glsl new file mode 100644 index 0000000..d34805f --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/endStone.glsl @@ -0,0 +1,7 @@ +float factor = pow2(pow2(color.r)); +smoothnessG = factor * 0.65; +smoothnessD = smoothnessG * 0.6; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/froglights.glsl b/shaders/lib/materials/specificMaterials/terrain/froglights.glsl new file mode 100644 index 0000000..95432de --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/froglights.glsl @@ -0,0 +1,10 @@ +noSmoothLighting = true; noDirectionalShading = true; +lmCoordM = vec2(1.0, 0.0); + +float blockRes = absMidCoordPos.x * atlasSize.x; +vec2 signMidCoordPosM = abs((floor((signMidCoordPos + 1.0) * blockRes) + 0.5) / blockRes - 1.0); +float value = 1.0 - max(signMidCoordPosM.x, signMidCoordPosM.y); +emission = 0.3 + value + pow(dot(color.rgb, color.rgb) * 0.33, frogPow); +emission *= 1.7; + +color.rgb = pow2(color.rgb); \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/goldBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/goldBlock.glsl new file mode 100644 index 0000000..9b202b9 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/goldBlock.glsl @@ -0,0 +1,20 @@ +materialMask = OSIEBCA * 3.0; // Gold Fresnel + +#ifdef GBUFFERS_TERRAIN + float colorG2 = pow2(max(color.g, color.r)); +#else + float colorG2 = color.g; +#endif +float colorG4 = pow2(colorG2); +float factor = max(color.g, 0.8); + +smoothnessG = min1(factor - colorG4 * 0.2); +highlightMult = 3.5 * max(colorG4, 0.7); + +smoothnessD = colorG4; + +color.rgb *= 0.5 + 0.4 * GetLuminance(color.rgb); + +#ifdef COATED_TEXTURES + noiseFactor = 0.33; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/ironBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/ironBlock.glsl new file mode 100644 index 0000000..9be9421 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/ironBlock.glsl @@ -0,0 +1,14 @@ +#ifdef GBUFFERS_TERRAIN + smoothnessG = pow2(pow2(color.r * 3)); +#else + smoothnessG = pow2(color.r * 3); +#endif +highlightMult = smoothnessG * 3.0; +smoothnessD = smoothnessG; +materialMask = OSIEBCA; // Intense Fresnel + +color.rgb *= 0.8+ .5 * GetLuminance(color.rgb); + +#ifdef COATED_TEXTURES + noiseFactor = 0.33; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/lanternMetal.glsl b/shaders/lib/materials/specificMaterials/terrain/lanternMetal.glsl new file mode 100644 index 0000000..374efc7 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/lanternMetal.glsl @@ -0,0 +1,6 @@ +smoothnessG = color.b; +smoothnessD = color.b; + +#ifdef COATED_TEXTURES + noiseFactor = 0.66; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/lapisBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/lapisBlock.glsl new file mode 100644 index 0000000..1b562e0 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/lapisBlock.glsl @@ -0,0 +1,6 @@ +smoothnessG = pow2(color.b) * 0.8; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.5; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/lava.glsl b/shaders/lib/materials/specificMaterials/terrain/lava.glsl new file mode 100644 index 0000000..0903620 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/lava.glsl @@ -0,0 +1,30 @@ +// Tweak to prevent the animation of lava causing brightness pulsing +vec3 avgColor = vec3(0.0); +ivec2 itexCoordC = ivec2(midCoord * atlasSize + 0.0001); +for (int x = -8; x < 8; x += 2) { + for (int y = -8; y < 8; y += 2) { + avgColor += texelFetch(tex, itexCoordC + ivec2(x, y), 0).rgb; + } +} +color.rgb /= max(GetLuminance(avgColor) * 0.0390625, 0.001); + +#ifdef NETHER + vec3 worldPos = playerPos + cameraPosition; + vec2 lavaPos = (floor(worldPos.xz * 16.0) + worldPos.y * 32.0) * 0.000666; + vec2 wind = vec2(frameTimeCounter * 0.012, 0.0); + + float noiseSample = texture2D(noisetex, lavaPos + wind).g; + noiseSample = noiseSample - 0.5; + noiseSample *= 0.1; + color.rgb = pow(color.rgb, vec3(1.0 + noiseSample)); +#endif + +noDirectionalShading = true; +lmCoordM = vec2(0.0); +emission = GetLuminance(color.rgb) * 6.5; + +maRecolor = vec3(clamp(pow2(pow2(pow2(smoothstep1(emission * 0.28)))), 0.12, 0.4) * 1.3) * vec3(1.0, vec2(0.7)); + +#if RAIN_PUDDLES >= 1 + noPuddles = 1.0; +#endif diff --git a/shaders/lib/materials/specificMaterials/terrain/leaves.glsl b/shaders/lib/materials/specificMaterials/terrain/leaves.glsl new file mode 100644 index 0000000..d8b692a --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/leaves.glsl @@ -0,0 +1,26 @@ +subsurfaceMode = 2; + +#ifdef GBUFFERS_TERRAIN + materialMask = OSIEBCA * 253.0; // Reduced Edge TAA + + #ifdef COATED_TEXTURES + doTileRandomisation = false; + #endif +#endif + +#ifdef IPBR + float factor = min1(pow2(color.g - 0.15 * (color.r + color.b)) * 2.5); + smoothnessG = factor * 0.5; + highlightMult = factor * 4.0 + 2.0; + float fresnel = clamp(1.0 + dot(normalM, normalize(viewPos)), 0.0, 1.0); + highlightMult *= 1.0 - pow2(pow2(fresnel)); +#endif + +#ifdef SNOWY_WORLD + snowMinNdotU = min(pow2(pow2(color.g)), 0.1); + color.rgb = color.rgb * 0.5 + 0.5 * (color.rgb / glColor.rgb); +#endif + +#if SHADOW_QUALITY > -1 && SHADOW_QUALITY < 3 + shadowMult = vec3(sqrt1(max0(max(lmCoordM.y, min1(lmCoordM.x * 2.0)) - 0.95) * 20.0)); +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/netheriteBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/netheriteBlock.glsl new file mode 100644 index 0000000..88229f9 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/netheriteBlock.glsl @@ -0,0 +1,8 @@ +smoothnessG = pow2(color.r * 2.0); +smoothnessG = min1(smoothnessG); +highlightMult = smoothnessG * 2.0; +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.33; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/netherrack.glsl b/shaders/lib/materials/specificMaterials/terrain/netherrack.glsl new file mode 100644 index 0000000..c5fba0f --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/netherrack.glsl @@ -0,0 +1,7 @@ +#if MC_VERSION >= 11300 + smoothnessG = pow2(color.r) * 1.5; + smoothnessG = min1(smoothnessG); +#else + smoothnessG = color.r * 0.4 + 0.2; +#endif +smoothnessD = smoothnessG; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/oakWood.glsl b/shaders/lib/materials/specificMaterials/terrain/oakWood.glsl new file mode 100644 index 0000000..763ba83 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/oakWood.glsl @@ -0,0 +1,3 @@ +smoothnessG = pow2(pow2(color.g)) * 2.5; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/obsidian.glsl b/shaders/lib/materials/specificMaterials/terrain/obsidian.glsl new file mode 100644 index 0000000..a768754 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/obsidian.glsl @@ -0,0 +1,13 @@ +materialMask = OSIEBCA; // Intense Fresnel + +float factor = max0(0.3 - abs(color.r - 0.3)) * 1.5; + +smoothnessG = factor; +highlightMult = 2.0 + min1(smoothnessG * 2.0) * 1.5; +smoothnessG = min1(smoothnessG); + +smoothnessD = min1(factor + 0.07); + +#ifdef COATED_TEXTURES + noiseFactor = 1.25; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/pumpkin.glsl b/shaders/lib/materials/specificMaterials/terrain/pumpkin.glsl new file mode 100644 index 0000000..a5c240c --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/pumpkin.glsl @@ -0,0 +1 @@ +smoothnessG = color.g * 0.25; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/quartzBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/quartzBlock.glsl new file mode 100644 index 0000000..d0c0122 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/quartzBlock.glsl @@ -0,0 +1,19 @@ +materialMask = OSIEBCA; // Intense Fresnel + +float factor = color.g; +float factor2 = pow2(factor); +float factor4 = pow2(factor2); +float factor8 = pow2(factor4); + +smoothnessG = factor - factor8 * 0.5; +highlightMult = 3.5 * factor8; + +smoothnessD = factor8; + +#ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.5, shadowMult, highlightMult); +#endif + +#ifdef COATED_TEXTURES + noiseFactor = 0.5; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl new file mode 100644 index 0000000..baf471f --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/rawCopperBlock.glsl @@ -0,0 +1,4 @@ +materialMask = OSIEBCA * 2.0; // Copper Fresnel +smoothnessG = pow2(color.r + color.g * 0.25) * 0.4; +smoothnessG = min1(smoothnessG); +smoothnessD = min1(smoothnessG * smoothnessG * 2.0); \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl new file mode 100644 index 0000000..4168ef6 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/rawGoldBlock.glsl @@ -0,0 +1,3 @@ +materialMask = OSIEBCA * 3.0; // Gold Fresnel +smoothnessG = pow2(pow2(color.g)); +smoothnessD = 0.5 * (smoothnessG + color.b); \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/rawIronBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/rawIronBlock.glsl new file mode 100644 index 0000000..6ffa82a --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/rawIronBlock.glsl @@ -0,0 +1,3 @@ +materialMask = OSIEBCA; // Intense Fresnel +smoothnessG = pow2(pow2(color.r)) * 0.7; +smoothnessD = smoothnessG * 0.6; \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/redstoneBlock.glsl b/shaders/lib/materials/specificMaterials/terrain/redstoneBlock.glsl new file mode 100644 index 0000000..7bc1fa0 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/redstoneBlock.glsl @@ -0,0 +1,11 @@ +materialMask = OSIEBCA * 5.0; // Redstone Fresnel + +float factor = pow2(color.r); +smoothnessG = 0.4; +highlightMult = factor + 0.2; + +smoothnessD = factor * 0.5 + 0.1; + +#ifdef COATED_TEXTURES + noiseFactor = 0.77; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/redstoneTorch.glsl b/shaders/lib/materials/specificMaterials/terrain/redstoneTorch.glsl new file mode 100644 index 0000000..ac7d320 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/redstoneTorch.glsl @@ -0,0 +1,15 @@ +noSmoothLighting = true; noDirectionalShading = true; +lmCoordM.x = min(lmCoordM.x * 0.9, 0.77); + +if (color.r > 0.65) { + emission = (3.5 - 2.25 * color.g) * 0.97; + color.rgb *= color.rgb; +} else if (color.r > color.g * 2.0) { + materialMask = OSIEBCA * 5.0; // Redstone Fresnel + + float factor = pow2(color.r); + smoothnessG = 0.4; + highlightMult = factor + 0.4; + + smoothnessD = factor * 0.7 + 0.3; +} \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/snow.glsl b/shaders/lib/materials/specificMaterials/terrain/snow.glsl new file mode 100644 index 0000000..6cc4f52 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/snow.glsl @@ -0,0 +1,12 @@ +smoothnessG = (1.0 - pow(color.g, 64.0) * 0.3) * 0.4; +highlightMult = 2.0; + +smoothnessD = smoothnessG; + +#ifdef GBUFFERS_TERRAIN + DoBrightBlockTweaks(color.rgb, 0.5, shadowMult, highlightMult); +#endif + +#if RAIN_PUDDLES >= 1 + noPuddles = 1.0; +#endif \ No newline at end of file diff --git a/shaders/lib/materials/specificMaterials/terrain/stone.glsl b/shaders/lib/materials/specificMaterials/terrain/stone.glsl new file mode 100644 index 0000000..47dc809 --- /dev/null +++ b/shaders/lib/materials/specificMaterials/terrain/stone.glsl @@ -0,0 +1,7 @@ +smoothnessG = pow2(pow2(color.g)) * 1.5; +smoothnessG = min1(smoothnessG); +smoothnessD = smoothnessG; + +#ifdef COATED_TEXTURES + noiseFactor = 0.77; +#endif \ No newline at end of file diff --git a/shaders/lib/post/lensFlare.glsl b/shaders/lib/post/lensFlare.glsl new file mode 100644 index 0000000..966ba9b --- /dev/null +++ b/shaders/lib/post/lensFlare.glsl @@ -0,0 +1,96 @@ +float fovmult = gbufferProjection[1][1] / 1.37373871; + +float BaseLens(vec2 lightPos, float size, float dist, float hardness) { + vec2 lensCoord = (texCoord + (lightPos * dist - 0.5)) * vec2(aspectRatio, 1.0); + float lens = clamp(1.0 - length(lensCoord) / (size * fovmult), 0.0, 1.0 / hardness) * hardness; + lens *= lens; lens *= lens; + return lens; +} + +float OverlapLens(vec2 lightPos, float size, float dista, float distb) { + return BaseLens(lightPos, size, dista, 2.0) * BaseLens(lightPos, size, distb, 2.0); +} + +float PointLens(vec2 lightPos, float size, float dist) { + return BaseLens(lightPos, size, dist, 1.5) + BaseLens(lightPos, size * 4.0, dist, 1.0) * 0.5; +} + +float RingLensTransform(float lensFlare) { + return pow(1.0 - pow(1.0 - pow(lensFlare, 0.25), 10.0), 5.0); +} +float RingLens(vec2 lightPos, float size, float distA, float distB) { + float lensFlare1 = RingLensTransform(BaseLens(lightPos, size, distA, 1.0)); + float lensFlare2 = RingLensTransform(BaseLens(lightPos, size, distB, 1.0)); + + float lensFlare = clamp(lensFlare2 - lensFlare1, 0.0, 1.0); + lensFlare *= sqrt(lensFlare); + return lensFlare; +} + +float AnamorphicLens(vec2 lightPos, float size, float dist) { + vec2 lensCoord = abs(texCoord + (lightPos.xy * dist - 0.5)) * vec2(aspectRatio * 0.07, 2.0); + float lens = clamp(1.0 - length(pow(lensCoord / (size * fovmult), vec2(0.85))) * 4.0, 0.0, 1.0); + lens *= lens * lens; + return lens; +} + +vec3 RainbowLens(vec2 lightPos, float size, float dist, float rad) { + vec2 lensCoord = (texCoord + (lightPos * dist - 0.5)) * vec2(aspectRatio,1.0); + float lens = clamp(1.0 - length(lensCoord) / (size * fovmult), 0.0, 1.0); + + vec3 rainbowLens = + (smoothstep(0.0, rad, lens) - smoothstep(rad, rad * 2.0, lens)) * vec3(1.0, 0.0, 0.0) + + (smoothstep(rad * 0.5, rad * 1.5, lens) - smoothstep(rad * 1.5, rad * 2.5, lens)) * vec3(0.0, 1.0, 0.0) + + (smoothstep(rad, rad * 2.0, lens) - smoothstep(rad * 2.0, rad * 3.0, lens)) * vec3(0.0, 0.0, 1.0) + ; + + return rainbowLens; +} + +vec3 LensTint(vec3 lens, float truePos) { + float isMoon = truePos * 0.5 + 0.5; + + float visibility = mix(sunVisibility,moonVisibility, isMoon); + lens = mix(lens, GetLuminance(lens) * lightNight, isMoon * 0.98); + return lens * visibility; +} + +void LensFlare(inout vec3 color, vec2 lightPos, float truePos, float multiplier) { + float falloffBase = length(lightPos * vec2(aspectRatio, 1.0)); + float falloffIn = pow(clamp(falloffBase * 10.0, 0.0, 1.0), 2.0); + float falloffOut = clamp(falloffBase * 3.0 - 1.5, 0.0, 1.0); + + if (falloffOut < 0.999) { + vec3 lensFlare = ( + BaseLens(lightPos, 0.3, -0.45, 1.0) * vec3(2.2, 1.2, 0.1) * 0.07 + + BaseLens(lightPos, 0.3, 0.10, 1.0) * vec3(2.2, 0.4, 0.1) * 0.03 + + BaseLens(lightPos, 0.3, 0.30, 1.0) * vec3(2.2, 0.2, 0.1) * 0.04 + + BaseLens(lightPos, 0.3, 0.50, 1.0) * vec3(2.2, 0.4, 2.5) * 0.05 + + BaseLens(lightPos, 0.3, 0.70, 1.0) * vec3(1.8, 0.4, 2.5) * 0.06 + + BaseLens(lightPos, 0.3, 0.95, 1.0) * vec3(0.1, 0.2, 2.5) * 0.10 + + + OverlapLens(lightPos, 0.18, -0.30, -0.41) * vec3(2.5, 1.2, 0.1) * 0.010 + + OverlapLens(lightPos, 0.16, -0.18, -0.29) * vec3(2.5, 0.5, 0.1) * 0.020 + + OverlapLens(lightPos, 0.15, 0.06, 0.19) * vec3(2.5, 0.2, 0.1) * 0.015 + + OverlapLens(lightPos, 0.14, 0.15, 0.28) * vec3(1.8, 0.1, 1.2) * 0.015 + + OverlapLens(lightPos, 0.16, 0.24, 0.37) * vec3(1.0, 0.1, 2.5) * 0.015 + + + PointLens(lightPos, 0.03, -0.55) * vec3(2.5, 1.6, 0.0) * 0.20 + + PointLens(lightPos, 0.02, -0.40) * vec3(2.5, 1.0, 0.0) * 0.15 + + PointLens(lightPos, 0.04, 0.43) * vec3(2.5, 0.6, 0.6) * 0.20 + + PointLens(lightPos, 0.02, 0.60) * vec3(0.2, 0.6, 2.5) * 0.15 + + PointLens(lightPos, 0.03, 0.67) * vec3(0.2, 1.6, 2.5) * 0.25 + + + RingLens(lightPos, 0.25, 0.43, 0.45) * vec3(0.10, 0.35, 2.50) * 1.5 + + RingLens(lightPos, 0.18, 0.98, 0.99) * vec3(0.15, 1.00, 2.55) * 2.5 + ) * (falloffIn - falloffOut) + ( + AnamorphicLens(lightPos, 1.0, -1.0) * vec3(0.3,0.7,1.0) * 0.35 + + RainbowLens(lightPos, 0.525, -1.0, 0.2) * 0.05 + + RainbowLens(lightPos, 2.0, 4.0, 0.1) * 0.05 + ) * (1.0 - falloffOut); + + lensFlare = LensTint(lensFlare, truePos); + + color = mix(color, vec3(1.0), lensFlare * multiplier * multiplier); + } +} \ No newline at end of file diff --git a/shaders/lib/post/outline.glsl b/shaders/lib/post/outline.glsl new file mode 100644 index 0000000..c905352 --- /dev/null +++ b/shaders/lib/post/outline.glsl @@ -0,0 +1,78 @@ +void Outline(vec3 color, bool secondPass, out vec4 outerOutline, out vec4 innerOutline) { + float ph = ceil(viewHeight / 1440.0) / viewHeight; + float pw = ph / aspectRatio; + + float oOutlineMask = 1.0, iOutlineMask = 1.0, iBevel = 1.0; + vec3 oOutlineColor = vec3(0.0), iOutlineColor = color; + + float z = texture2D(depthtex0, texCoord).r; + float linZ = GetLinearDepth(z); + float minZ = z, maxZ = z; + + int sampleCount = viewHeight >= 720.0 ? 12 : 4; + + #ifdef RETRO_FILTER + ph = RETRO_FILTER_SIZE / viewHeight; + pw = ph / aspectRatio; + sampleCount = 4; + #endif + + for (int i = 0; i < sampleCount; i++) { + vec2 offset = vec2(pw, ph) * outlineOffsets[i]; + float linSampleZSum = 0.0, linSampleZDiff = 0.0; + + for (int j = 0; j < 2; j++) { + float sampleZ = texture2D(depthtex0, texCoord + offset).r; + float linSampleZ = GetLinearDepth(sampleZ); + + #ifdef OUTLINE_OUTER_COLOR + if((GetLinearDepth(minZ) - 0.125 / far) > linSampleZ) { + oOutlineColor = texture2D(colortex0, texCoord + offset).rgb; + } + #endif + + linSampleZSum += linSampleZ; + if(j == 0) linSampleZDiff = linSampleZ; + else linSampleZDiff -= linSampleZ; + + minZ = min(minZ, sampleZ); + maxZ = max(maxZ, sampleZ); + offset = -offset; + } + + #ifdef OUTLINE_OUTER + oOutlineMask *= clamp(1.0 - (linZ * 2.0 - linSampleZSum) * far * 0.25, 0.0, 1.0); + #endif + + #ifdef OUTLINE_INNER + linSampleZSum -= abs(linSampleZDiff) * 0.5; + iOutlineMask *= clamp(1.125 + (linZ * 2.0 - linSampleZSum) * 32.0 * far, 0.0, 1.0); + #endif + } + + #if ALPHA_BLEND == 0 + oOutlineColor *= oOutlineColor; + #endif + + oOutlineColor = sqrt(oOutlineColor) * 0.35; + oOutlineColor *= oOutlineColor; + oOutlineMask = 1.0 - oOutlineMask; + + iOutlineColor = sqrt(iOutlineColor) * 1.2; + iOutlineColor *= iOutlineColor; + iOutlineMask = 1.0 - iOutlineMask; + + vec4 viewPos = gbufferProjectionInverse * (vec4(texCoord.x, texCoord.y, minZ, 1.0) * 2.0 - 1.0); + viewPos /= viewPos.w; + + if (oOutlineMask > 0.001) { + Fog(oOutlineColor, viewPos.xyz); + if (isEyeInWater == 1.0 && secondPass) { + vec4 waterFog = GetWaterFog(viewPos.xyz); + oOutlineColor = mix(oOutlineColor, waterFog.rgb, waterFog.a); + } + } + + outerOutline = vec4(oOutlineColor, oOutlineMask); + innerOutline = vec4(iOutlineColor, iOutlineMask); +} \ No newline at end of file diff --git a/shaders/lib/reflections/complexFresnel.glsl b/shaders/lib/reflections/complexFresnel.glsl new file mode 100644 index 0000000..cd90fd6 --- /dev/null +++ b/shaders/lib/reflections/complexFresnel.glsl @@ -0,0 +1,47 @@ +vec3 GetN(int idx) { + if (idx == 230) return vec3(2.9114, 2.9497, 2.5845); + if (idx == 231) return vec3(0.18299, 0.42108, 1.3734); + if (idx == 232) return vec3(1.3456, 0.96521, 0.61722); + if (idx == 233) return vec3(3.1071, 3.1812, 2.3230); + if (idx == 234) return vec3(0.27105, 0.67693, 1.3164); + if (idx == 235) return vec3(1.9100, 1.8300, 1.4400); + if (idx == 236) return vec3(2.3757, 2.0847, 1.8453); + if (idx == 237) return vec3(0.15943, 0.14512, 0.13547); + return vec3(0.0); +} + +vec3 GetK(int idx) { + if (idx == 230) return vec3(3.0893, 2.9318, 2.7670); + if (idx == 231) return vec3(3.4242, 2.3459, 1.7704); + if (idx == 232) return vec3(7.4746, 6.3995, 5.3031); + if (idx == 233) return vec3(3.3314, 3.3291, 3.1350); + if (idx == 234) return vec3(3.6092, 2.6248, 2.2921); + if (idx == 235) return vec3(3.5100, 3.4000, 3.1800); + if (idx == 236) return vec3(4.2655, 3.7153, 3.1365); + if (idx == 237) return vec3(3.9291, 3.1900, 2.3808); + return vec3(1.0); +} + +vec3 ComplexFresnel(float fresnel, float f0) { + int metalidx = int(f0 * 255.0); + vec3 k = GetK(metalidx); + vec3 n = GetN(metalidx); + float f = 1.0 - fresnel; + + vec3 k2 = k * k; + vec3 n2 = n * n; + float f2 = f * f; + + vec3 rs_num = n2 + k2 - 2 * n * f + f2; + vec3 rs_den = n2 + k2 + 2 * n * f + f2; + vec3 rs = rs_num / rs_den; + + vec3 rp_num = (n2 + k2) * f2 - 2 * n * f + 1; + vec3 rp_den = (n2 + k2) * f2 + 2 * n * f + 1; + vec3 rp = rp_num / rp_den; + + vec3 fresnel3 = clamp(0.5 * (rs + rp), vec3(0.0), vec3(1.0)); + fresnel3 *= fresnel3; + + return fresnel3; +} \ No newline at end of file diff --git a/shaders/lib/reflections/rainPuddles.glsl b/shaders/lib/reflections/rainPuddles.glsl new file mode 100644 index 0000000..17495e1 --- /dev/null +++ b/shaders/lib/reflections/rainPuddles.glsl @@ -0,0 +1,86 @@ +float GetPuddles(vec3 worldPos, vec2 coord, float skylight, float NoU, float wetness) { + if (wetness < 0.001) return 0.0; + + worldPos = (worldPos + cameraPosition) * 0.005; + + float height = texture2DGradARB(normals, coord, dcdx, dcdy).a; + height = mix(1.0, height, PARALLAX_DEPTH); + height = smoothstep(1.0, 0.95, height) * 0.1 - 0.05; + float noise = texture2D(noisetex, worldPos.xz * 0.5 ).r * 0.375; + noise+= texture2D(noisetex, worldPos.xz * 0.125).r * 0.625; + noise = noise + height + (wetness * REFLECTION_RAIN_AMOUNT - 0.5); + + float puddles = smoothstep(0.4, 0.6, noise); + + #ifdef WEATHER_PERBIOME + float weatherWeight = isCold + isDesert + isMesa + isSavanna; + puddles *= 1.0 - weatherWeight; + #endif + + puddles *= clamp(skylight * 32.0 - 31.0, 0.0, 1.0) * clamp(NoU, 0.0, 1.0); + + return puddles; +} + +float rand(vec2 worldPos){ + return fract(sin(dot(worldPos, vec2(12.9898, 4.1414))) * 43758.5453); +} + +vec2 getpos(vec2 i){ + return vec2(rand(i), rand(i + 1.0)) * 0.5 + 0.25; +} + +float GetRipple(vec3 worldPos, vec2 offset) { + vec2 ppos = worldPos.xz + offset * 0.1 + frametime * 0.01; + ppos = vec2(ppos.x * 0.7 + ppos.y * 0.7, ppos.x * -0.7 + ppos.y * 0.7) * 0.8; + vec2 ppossh = ppos + vec2(fract(0.618 * floor(ppos.y)) * sin(frametime * 0.05), 0.0); + vec2 pposfr = fract(ppossh); + vec2 pposfl = floor(ppossh); + + float val = texture2D(noisetex, ppos / 64.0 + frametime * 0.007).r * 0.125; + val += texture2D(noisetex, ppos / 64.0 - frametime * 0.005).r * 0.125; + + float seed = rand(pposfl); + float rippleTime = frametime * 1.7 + fract(seed * 1.618); + float rippleSeed = seed + floor(rippleTime) * 1.618; + vec2 ripplePos = getpos(pposfl + rippleSeed); + float ripple = clamp(1.0 - 4.0 * length(pposfr - ripplePos), 0.0, 1.0); + ripple = clamp(ripple + fract(rippleTime) - 1.0, 0.0, 1.0); + ripple = sin(min(ripple * 6.0 * 3.1415, 3.0 * 3.1415)) * pow(1.0 - fract(rippleTime), 2.0); + val += ripple * 0.3; + + //if(pposfr.x < 0.01 || pposfr.y < 0.01) val += 0.85; + + return val; +} + +vec3 GetPuddleNormal(vec3 worldPos, vec3 viewPos, mat3 tbn) { + vec3 puddlePos = worldPos + cameraPosition; + float normalOffset = 0.1; + + float fresnel = pow(clamp(1.0 + dot(normalize(normal), normalize(viewPos)), 0.0, 1.0), 7.5); + float normalStrength = 0.35 * (1.0 - fresnel); + + float h1 = GetRipple(puddlePos, vec2( normalOffset, 0.0)); + float h2 = GetRipple(puddlePos, vec2(-normalOffset, 0.0)); + float h3 = GetRipple(puddlePos, vec2(0.0, normalOffset)); + float h4 = GetRipple(puddlePos, vec2(0.0, -normalOffset)); + + float xDelta = (h2 - h1) / normalOffset; + float yDelta = (h4 - h3) / normalOffset; + + vec3 normalMap = vec3(xDelta, yDelta, 1.0 - (xDelta * xDelta + yDelta * yDelta)); + normalMap = normalMap * normalStrength + vec3(0.0, 0.0, 1.0 - normalStrength); + + return clamp(normalize(normalMap * tbn), vec3(-1.0), vec3(1.0)); +} + +void ApplyPuddleToMaterial(float puddles, inout vec4 albedo, inout float smoothness, inout float f0, float porosity) { + float puddleSmoothness = sqrt(1.0 - 0.75 * porosity); + float puddleDarkening = (0.5 * porosity + 0.15); + + smoothness = mix(smoothness, 1.0, puddles * puddleSmoothness); + f0 = max(f0, puddles * 0.02); + + albedo.rgb *= 1.0 - (puddles * puddleDarkening); +} \ No newline at end of file diff --git a/shaders/lib/reflections/raytrace.glsl b/shaders/lib/reflections/raytrace.glsl new file mode 100644 index 0000000..06df323 --- /dev/null +++ b/shaders/lib/reflections/raytrace.glsl @@ -0,0 +1,89 @@ +vec3 nvec3(vec4 pos) { + return pos.xyz/pos.w; +} + +vec4 nvec4(vec3 pos) { + return vec4(pos.xyz, 1.0); +} + +float cdist(vec2 coord) { + return max(abs(coord.x - 0.5), abs(coord.y - 0.5)) * 1.85; +} + +#if REFLECTION_MODE == 0 +float errMult = 1.0; +#elif REFLECTION_MODE == 1 +float errMult = 1.3; +#else +float errMult = 1.6; +#endif + +vec4 Raytrace(sampler2D depthtex, vec3 viewPos, vec3 normal, float dither, out float border, + int maxf, float stp, float ref, float inc) { + vec3 pos = vec3(0.0); + float dist = 0.0; + + #ifdef TAA + #if TAA_MODE == 0 + dither = fract(dither + frameCounter * 0.618); + #else + dither = fract(dither + frameCounter * 0.5); + #endif + #endif + + vec3 start = viewPos + normal * 0.075; + + vec3 vector = stp * reflect(normalize(viewPos), normalize(normal)); + viewPos += vector; + vec3 tvector = vector; + + int sr = 0; + + for(int i = 0; i < 30; i++) { + pos = nvec3(gbufferProjection * nvec4(viewPos)) * 0.5 + 0.5; + if (pos.x < -0.05 || pos.x > 1.05 || pos.y < -0.05 || pos.y > 1.05) break; + + vec3 rfragpos = vec3(pos.xy, texture2D(depthtex,pos.xy).r); + rfragpos = nvec3(gbufferProjectionInverse * nvec4(rfragpos * 2.0 - 1.0)); + dist = abs(dot(normalize(start - rfragpos), normal)); + + float err = length(viewPos - rfragpos); + float lVector = length(vector) * pow(length(tvector), 0.1) * errMult; + if (err < lVector) { + sr++; + if (sr >= maxf) break; + tvector -= vector; + vector *= ref; + } + vector *= inc; + tvector += vector; + viewPos = start + tvector * (0.025 * dither + 0.975); + } + + border = cdist(pos.st); + + #ifdef REFLECTION_PREVIOUS + //Previous frame reprojection from Chocapic13 + vec4 viewPosPrev = gbufferProjectionInverse * vec4(pos * 2.0 - 1.0, 1.0); + viewPosPrev /= viewPosPrev.w; + + viewPosPrev = gbufferModelViewInverse * viewPosPrev; + + vec4 previousPosition = viewPosPrev + vec4(cameraPosition - previousCameraPosition, 0.0); + previousPosition = gbufferPreviousModelView * previousPosition; + previousPosition = gbufferPreviousProjection * previousPosition; + pos.xy = previousPosition.xy / previousPosition.w * 0.5 + 0.5; + #endif + + return vec4(pos, dist); +} + +vec4 BasicReflect(vec3 viewPos, vec3 normal, out float border) { + vec3 reflectedViewPos = reflect(viewPos, normal) + normal * dot(viewPos, normal) * 0.5; + + vec3 pos = nvec3(gbufferProjection * nvec4(reflectedViewPos)) * 0.5 + 0.5; + + border = cdist(pos.st); + + return vec4(pos, 0.0); +} \ No newline at end of file diff --git a/shaders/lib/reflections/roughReflections.glsl b/shaders/lib/reflections/roughReflections.glsl new file mode 100644 index 0000000..445f0ce --- /dev/null +++ b/shaders/lib/reflections/roughReflections.glsl @@ -0,0 +1,67 @@ +#ifdef REFLECTION_PREVIOUS +#define colortexR colortex5 +#else +#define colortexR colortex0 +#endif + +vec4 RoughReflection(vec3 viewPos, vec3 normal, float dither, float smoothness) { + vec4 color = vec4(0.0); + float border = 0.0; + + vec4 pos = Raytrace(depthtex0, viewPos, normal, dither, border, 6, 0.5, 0.1, 1.8); + border = clamp(13.333 * (1.0 - border) * (0.9 * smoothness + 0.1), 0.0, 1.0); + + float fovScale = gbufferProjection[1][1] / 1.37; + + if (pos.z < 1.0 - 1e-5) { + #ifdef REFLECTION_ROUGH + float dist = 0.03125 * pow(1.0 - smoothness, 2.0) * pos.a * fovScale; + float lod = log2(viewHeight * dist); + #else + float lod = 0.0; + #endif + + if (lod < 1.0) { + color.a = texture2DLod(colortex6, pos.st, 1.0).b; + if (color.a > 0.001) color.rgb = texture2DLod(colortexR, pos.st, 1.0).rgb; + #ifdef REFLECTION_PREVIOUS + color.rgb = pow(color.rgb * 2.0, vec3(8.0)); + #else + #if ALPHA_BLEND == 0 + color.rgb = pow(color.rgb, vec3(2.2)); + #endif + #endif + }else{ + for(int i = -2; i <= 2; i++) { + for(int j = -2; j <= 2; j++) { + vec2 refOffset = vec2(i, j) * exp2(lod - 1.0) / vec2(viewWidth, viewHeight); + vec2 refCoord = pos.st + refOffset; + float alpha = texture2DLod(colortex6, refCoord, lod).b; + if (alpha > 0.001) { + vec3 ssrSample = texture2DLod(colortexR, refCoord, max(lod - 1.0, 0.0)).rgb; + + #ifdef REFLECTION_PREVIOUS + ssrSample = pow(ssrSample * 2.0, vec3(8.0)); + #else + #if ALPHA_BLEND == 0 + ssrSample = pow(ssrSample, vec3(2.2)); + #endif + #endif + + color.rgb += ssrSample; + color.a += alpha; + } + } + } + color /= 25.0; + } + + //Fog(color.rgb, (gbufferProjectionInverse * pos).xyz); + + color *= color.a; + color.a = clamp(color.a * 2.0 - 1.0, 0.0, 1.0) * border; + // color.a = pos.a * float(border > 0.0); + } + + return color; +} \ No newline at end of file diff --git a/shaders/lib/reflections/simpleReflections.glsl b/shaders/lib/reflections/simpleReflections.glsl new file mode 100644 index 0000000..847f610 --- /dev/null +++ b/shaders/lib/reflections/simpleReflections.glsl @@ -0,0 +1,65 @@ +vec4 SimpleReflection(vec3 viewPos, vec3 normal, float dither, out float reflectionMask) { + vec4 color = vec4(0.0); + float border = 0.0; + reflectionMask = 0.0; + + vec4 pos = Raytrace(depthtex1, viewPos, normal, dither, border, 4, 1.0, 0.1, 2.0); + border = clamp(13.333 * (1.0 - border), 0.0, 1.0); + + #ifdef REFLECTION_SKYBOX + float zThreshold = 1.0 + 1e-5; + #else + float zThreshold = 1.0; + #endif + + if (pos.z < zThreshold) { + #if MC_VERSION > 10800 + color = texture2D(gaux2, pos.st); + #else + color = texture2DLod(gaux2, pos.st, 0); + #endif + reflectionMask = color.a; + + #ifdef REFLECTION_SKYBOX + color.a = 1.0; + #endif + + color.a *= border; + reflectionMask *= border; + } + + return color; +} + +vec4 DHReflection(vec3 viewPos, vec3 normal, float dither, out float reflectionMask) { + vec4 color = vec4(0.0); + float border = 0.0; + reflectionMask = 0.0; + + vec4 pos = BasicReflect(viewPos, normal, border); + border = clamp(13.333 * (1.0 - border), 0.0, 1.0); + + #ifdef REFLECTION_SKYBOX + float zThreshold = 1.0 + 1e-5; + #else + float zThreshold = 1.0; + #endif + + if (pos.z < zThreshold) { + #if MC_VERSION > 10800 + color = texture2D(gaux2, pos.st); + #else + color = texture2DLod(gaux2, pos.st, 0); + #endif + reflectionMask = color.a; + + #ifdef REFLECTION_SKYBOX + color.a = 1.0; + #endif + + color.a *= border; + reflectionMask *= border; + } + + return color; +} \ No newline at end of file diff --git a/shaders/lib/settings.glsl b/shaders/lib/settings.glsl new file mode 100644 index 0000000..7c36e78 --- /dev/null +++ b/shaders/lib/settings.glsl @@ -0,0 +1,488 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +/* +You can edit this file to enable, disable, and tweak features. +Make sure to make a copy of this file before editing as backup. + +#define with a name only is a toggleable feature. +Adding double slash (//) disables a feature + #define FEATURE -> feature is enabled +//#define FEATURE -> feature is disabled + +#define with a name and value is either a multi option feature or a parameter. +Parameter tends to contain lots of values, some starts with const int/float. +Use the values provided within the squared bracket comment (//[...]), +Do not add double slash on these lines, as it may cause errors. + #define MULTI_OPTION_FEATURE 0 //[0 1 2] -> 0 is the current value + #define PARAMETER 1.00 //[0.00 0.25 ... 1.75 2.00] -> 1.00 is the current value + +Read lang/en_US.lang to get the description of what every option does. +Please don't edit anything from Undefine section and onwards. +*/ + +//Shader Options// + + #define ABOUT 0 //[0] + +//Lighting// + #define SHADOW + const int shadowMapResolution = 2048; //[512 1024 1536 2048 3072 4096 8192] + const float shadowDistance = 256.0; //[128.0 192.0 256.0 384.0 512.0 768.0 1024.0] + #define SHADOW_COLOR + #define SHADOW_FILTER + const float sunPathRotation = -40.0; //[-85.0 -80.0 -75.0 -70.0 -65.0 -60.0 -55.0 -50.0 -45.0 -40.0 -35.0 -30.0 -25.0 -20.0 -15.0 -10.0 -5.0 0.0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0] + const float shadowMapBias = 1.0 - 25.6 / shadowDistance; + + #define SHADOW_ENTITY + #define SHADOW_BLOCK_ENTITY + #define SHADOW_VEGETATION + #define SHADOW_CLOUD + #define SHADOW_BIAS 0 //[0 1] + #define SHADOW_PIXEL 0 //[0 16 32 64 128] + + #define AO + #define AO_STRENGTH 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define DESATURATION + #define DESATURATION_FACTOR 1.5 //[2.0 1.5 1.0 0.5 0.0] + #define MULTICOLORED_BLOCKLIGHT +//#define DYNAMIC_HANDLIGHT +//#define WHITE_WORLD + + #define MCBL_ANTI_BLEED +//#define MCBL_LEGACY_COLOR + +//Material// +//#define ADVANCED_MATERIALS + #define MATERIAL_FORMAT 1 //[0 1 2] + + #define REFLECTION 2 //[0 1 2] + #define REFLECTION_TRANSLUCENT + #define REFLECTION_SPECULAR + #define REFLECTION_ROUGH + #define REFLECTION_RAIN + #define REFLECTION_RAIN_AMOUNT 1.0 //[0.4 0.5 0.6 0.7 1.0] +//#define REFLECTION_PREVIOUS +//#define SPECULAR_HIGHLIGHT_ROUGH +//#define ALBEDO_METAL + #define REFLECTION_MODE 1 //[0 1 2] + #define REFLECTION_SKY_FALLOFF 1 //[1 2 4 8 16] +//#define REFLECTION_SKYBOX + + #define PARALLAX + #define PARALLAX_DEPTH 0.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50] + #define PARALLAX_QUALITY 128 //[16 32 64 128 256 512] + #define PARALLAX_DISTANCE 64 //[8 16 32 48 64 80 96 112 128] + #define SELF_SHADOW + #define SELF_SHADOW_ANGLE 2.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0] + #define SELF_SHADOW_QUALITY 8 //[8 16 32] + #define SELF_SHADOW_STRENGTH 16 //[4 8 16 32 64] +//#define DIRECTIONAL_LIGHTMAP + #define DIRECTIONAL_LIGHTMAP_STRENGTH 1.0 //[2.0 1.4 1.0 0.7 0.5] + #define GENERATED_NORMALS + #define GENERATED_NORMAL_MULT 100 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150 160 170 180 190 200 250 300 400] + #define GENERATED_NORMAL_THRESHOLD 0.05 //[0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.20] + #define GENERATED_NORMAL_CLAMP 0.20 //[0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20 0.22 0.24 0.26 0.28 0.30 0.32 0.34 0.36 0.38 0.40] + #define GENERATED_NORMAL_RESOLUTION 128 //[16 32 64 128 256 512] + #define NORMAL_DAMPENING + #define NORMAL_PLANTS + + #define SSS + #define BASIC_SSS + #define EMISSIVE 2 //[0 1 2] + #define REFRACTION 0 //[0 1 2] + #define ALBEDO_BALANCING + #define ALPHA_BLEND 0 //[0 1] + #define ENTITY_FLASH + +//Atmospherics// + #define LIGHT_SHAFT + #define LIGHT_SHAFT_STRENGTH 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define WEATHER_PERBIOME + #define WEATHER + #define WEATHER_OPACITY 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.50 5.00 5.50 6.00 6.50 7.00 7.50 8.00] + + #define SKY_DENSITY_D 0.35 //[0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00] + #define SKY_EXPOSURE_D 0.00 //[-1.00 -0.75 -0.50 -0.25 0.00 0.25 0.50 0.75 1.00] + #define SKY_DENSITY_N 0.65 //[0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00] + #define SKY_EXPOSURE_N 0.00 //[-1.00 -0.75 -0.50 -0.25 0.00 0.25 0.50 0.75 1.00] + #define SKY_DENSITY_W 1.50 //[1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00] + #define SKY_EXPOSURE_W 0.00 //[-1.00 -0.75 -0.50 -0.25 0.00 0.25 0.50 0.75 1.00] + #define SKY_HORIZON_N 1.00 //[0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50] + #define SKY_HORIZON_F 1.50 //[0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50] + #define SKY_DESATURATION + #define SKY_GROUND 2 //[0 1 2] +//#define UNDERGROUND_SKY +//#define SHADER_END_SKY +//#define SKY_DEFERRED + + #define CLOUDS 2 //[0 1 2 3] + #define CLOUD_BASE 0 //[0 1] + #define CLOUD_DENSITY 4 //[1 2 4 6 8] + #define CLOUD_AMOUNT 10.0 //[12.0 11.0 10.0 9.0 8.0] + #define CLOUD_HEIGHT 10.0 //[5.0 7.5 10.0 12.5 15.0] + #define CLOUD_THICKNESS 5 //[2 4 5 7 10] + #define CLOUD_DETAIL 1.0 //[0.3 0.7 1.0 1.3 1.7] + #define CLOUD_SPEED 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.50 3.00 3.50 4.00] + #define CLOUD_OPACITY 1.0 //[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0] + #define CLOUD_BRIGHTNESS 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define CLOUD_VOLUMETRIC_SCALE 12.4 //[6.0 12.4 16.0] + + #define FOG_DENSITY 1.00 //[0.00 0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_HEIGHT + #define FAR_VANILLA_FOG 2 //[0 1 2 3] + + #define FOG_DENSITY_NIGHT 4.00 //[1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75 6.00 6.25 6.50 6.75 7.00 7.25 7.50 7.75 8.00] + #define FOG_DENSITY_WEATHER 1.50 //[1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_DENSITY_COLD 1.00 //[0.00 0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_DENSITY_DRY 1.00 //[0.00 0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_DENSITY_DAMP 1.00 //[0.00 0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_DENSITY_INDOOR 1.00 //[0.00 0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_DENSITY_DH 1.00 //[0.00 0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00] + + #define FOG_HEIGHT_Y 62 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 62 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 136 144 152 160 168 172 180 188 192] + #define FOG_HEIGHT_FALLOFF 7.00 //[3.00 3.50 4.00 4.50 5.00 5.50 6.00 6.50 7.00 7.50 8.00 8.50 9.00] + + #define FAR_VANILLA_FOG_STYLE 0 //[0 1] + #define FOG_DENSITY_VANILLA 1.00 //[0.12 0.25 0.37 0.50 0.62 0.75 0.87 1.00 1.12 1.25 1.37 1.50 1.62 1.75 1.87 2.00 2.12 2.25 2.37 2.50 2.62 2.75 2.87 3.00 3.12 3.25 3.37 3.50 3.62 3.75 3.87 4.00] + #define FOG_VANILLA_CLOUD 3 //[0 1 2 3] + +//#define ROUND_SUN_MOON + #define ROUND_SUN_MOON_SIZE 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50] + #define STARS +//#define AURORA + #define SKYBOX_INTENSITY 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define SKYBOX_OPACITY 0.50 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00] + #define SUN_INTENSITY 1.50 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00] + #define MOON_INTENSITY 1.50 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00] + +//Water// + #define WATER_MODE 0 //[0 1 2 3] + #define WATER_ALPHA_MODE 0 //[0 1] + #define WATER_SHADOW_MODE 0 //[0 1 2 3] + #define WATER_NORMALS 1 //[0 1 2] + #define WATER_PARALLAX +//#define WATER_SHADOW_COLOR +//#define WATER_CAUSTICS + #define WATER_BUMP 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define WATER_DETAIL 0.25 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50] + #define WATER_SHARPNESS 0.2 //[0.8 0.5 0.2] + #define WATER_SPEED 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.50 3.00 3.50 4.00] + #define WATER_FOG 0 //[0 1] + #define WATER_FOG_DENSITY 1.00 //[0.25 0.50 0.75 1.00 1.50 2.00 2.50 3.00 3.50 4.00] + #define WATER_CAUSTICS_STRENGTH 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define WATER_PIXEL 0 //[0 16 32 64 128] + +//Post Effects// +//#define DOF + #define DOF_STRENGTH 8.0 //[1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 384.0 512.0] +//#define MOTION_BLUR + #define MOTION_BLUR_STRENGTH 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define BLOOM + #define BLOOM_STRENGTH 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00] + #define BLOOM_CONTRAST 0 //[-4 -3 -2 -1 0 1 2 3 4] + #define BLOOM_RADIUS 5 //[1 2 3 4 5 6 7] + #define LENS_FLARE + #define LENS_FLARE_STRENGTH 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + #define VIGNETTE + #define VIGNETTE_STRENGTH 1.06 //[0.26 0.51 0.72 0.91 1.06 1.19 1.28 1.36 1.40 1.41] +//#define DIRTY_LENS + #define CHROMATIC_ABERRATION 0 //[0 1 2] + #define UNDERWATER_DISTORTION + +//Anti-aliasing + #define FXAA +//#define TAA + + #define FXAA_SUBPIXEL 0.75 //[0.00 0.25 0.50 0.75 1.00] + #define FXAA_EDGE_SENSITIVITY 1 //[0 1 2] + + #define TAA_MODE 0 //[0 1] +//#define TAA_SELECTIVE + +//Color// + #define LIGHT_MR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_MG 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_MB 80 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_MI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define AMBIENT_MR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_MG 204 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_MB 144 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_MI 0.35 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define LIGHT_DR 196 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_DG 220 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_DB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_DI 1.40 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define AMBIENT_DR 120 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_DG 172 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_DB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_DI 0.60 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define LIGHT_ER 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_EG 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_EB 80 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_EI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define AMBIENT_ER 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_EG 204 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_EB 144 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_EI 0.35 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define LIGHT_NR 96 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_NG 192 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_NB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define LIGHT_NI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define AMBIENT_NR 96 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_NG 192 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_NB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AMBIENT_NI 0.60 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define MINLIGHT_R 128 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define MINLIGHT_G 128 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define MINLIGHT_B 128 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define MINLIGHT_I 0.70 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00] + + #define BLOCKLIGHT_R 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define BLOCKLIGHT_G 212 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define BLOCKLIGHT_B 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define BLOCKLIGHT_I 0.85 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define SKY_R 96 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define SKY_G 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define SKY_B 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define SKY_I 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WATER_R 64 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WATER_G 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WATER_B 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WATER_I 0.35 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + #define WATER_A 0.70 //[0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00] + #define WATER_F 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_RR 176 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_RG 224 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_RB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_RI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_CR 216 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_CG 240 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_CB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_CI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_DR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_DG 232 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_DB 180 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_DI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_BR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_BG 216 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_BB 176 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_BI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_SR 200 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_SG 224 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_SB 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_SI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_MR 216 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_MG 216 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_MB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_MI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_VR 224 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_VG 224 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_VB 224 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_VI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define WEATHER_JR 176 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_JG 232 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_JB 232 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define WEATHER_JI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define AURORA_LR 80 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AURORA_LG 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AURORA_LB 180 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AURORA_LI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define AURORA_HR 80 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AURORA_HG 80 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AURORA_HB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define AURORA_HI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define NETHER_NR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_NG 96 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_NB 32 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_NI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define NETHER_VR 104 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_VG 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_VB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_VI 0.60 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define NETHER_CR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_CG 32 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_CB 24 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_CI 1.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define NETHER_WR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_WG 160 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_WB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_WI 0.60 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define NETHER_BR 236 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_BG 216 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_BB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define NETHER_BI 0.55 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define END_R 192 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define END_G 196 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define END_B 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define END_I 0.90 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + +//#define SKY_VANILLA + #define SKY_VANILLA_USE_FOG +//#define NETHER_VANILLA +//#define EMISSIVE_RECOLOR + +//Tonemap & Color Grading// + #define EXPOSURE 0.00 //[-2.00 -1.75 -1.50 -1.25 -1.00 -0.75 -0.50 -0.25 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00] + +//#define AUTO_EXPOSURE +//#define CLASSIC_EXPOSURE + #define AUTO_EXPOSURE_RADIUS 0.7 //[0.002 0.04 0.18 0.35 0.7] + #define AUTO_EXPOSURE_SPEED 0.033 //[0.0033 0.01 0.033 0.1 0.33] + +//#define COLOR_GRADING + + #define TONEMAP_LOWER_CURVE 1.0 //[0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5] + #define TONEMAP_UPPER_CURVE 1.0 //[0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5] + #define TONEMAP_WHITE_CURVE 2.0 //[1.0 1.5 2.0 2.5 3.0 3.5 4.0] + #define TONEMAP_WHITE_PATH 1.00 //[0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00] + + #define SATURATION 1.00 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00] + #define VIBRANCE 1.00 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00] + + #define CG_RR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_RG 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_RB 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_RI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + #define CG_RM 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_RC 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define CG_GR 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_GG 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_GB 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_GI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + #define CG_GM 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_GC 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define CG_BR 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_BG 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_BB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_BI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + #define CG_BM 0 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_BC 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + + #define CG_TR 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_TG 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_TB 255 //[0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 255] + #define CG_TI 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00] + #define CG_TM 0.0 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0] + +//Extras// + #define OUTLINE 0 //[0 1 2 3 4] +//#define TOON_LIGHTMAP +//#define RETRO_FILTER + #define RETRO_FILTER_SIZE 2 //[2 3 4 5 6 7 8] +//#define WORLD_CURVATURE + #define WORLD_CURVATURE_SIZE 256 //[-256 -512 -1024 -2048 -4096 4096 2048 1024 512 256 128 64 32 16] + +//Animations// +//#define WORLD_TIME_ANIMATION + #define ANIMATION_SPEED 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.50 3.00 3.50 4.00 5.00 6.00 7.00 8.00] + #define WAVING_GRASS + #define WAVING_CROP + #define WAVING_PLANT + #define WAVING_TALL_PLANT + #define WAVING_LEAF + #define WAVING_VINE + #define WAVING_WATER + #define WAVING_LAVA + #define WAVING_FIRE + #define WAVING_LANTERN + +//Undefine// + #ifdef NETHER + #undef LIGHT_SHAFT + #undef LENS_FLARE + #undef SKY_VANILLA + #undef REFLECTION_RAIN + #endif + + #ifdef END + #undef LENS_FLARE + #undef REFLECTION_RAIN + #endif + + #ifndef SHADOW + #undef LIGHT_SHAFT + #endif + +//Outline Params// + #if OUTLINE > 0 + #define OUTLINE_ENABLED + #endif + + #if OUTLINE == 1 + #define OUTLINE_OUTER + #endif + + #if OUTLINE == 2 + #define OUTLINE_OUTER + #define OUTLINE_OUTER_COLOR + #endif + + #if OUTLINE == 3 + #define OUTLINE_OUTER + #define OUTLINE_OUTER_COLOR + #define OUTLINE_INNER + #endif + + #if OUTLINE == 4 + #define OUTLINE_INNER + #endif + +//Retro Filter Removes AA// + #ifdef RETRO_FILTER + #undef FXAA + #undef TAA + #endif + +//Normal Skip for 1.15 - 1.16 G7// + #if MC_VERSION >= 11500 && MC_VERSION < 11605 + #define NORMAL_SKIP + #endif + +//Multi-colored Unavailable on 1.16.5 and below// + #if MC_VERSION < 11605 + // #undef MULTICOLORED_BLOCKLIGHT //not working properly for some reason + #endif + +//Show In Shader Options// + #ifdef SHADOW_ENTITY + #endif + + #ifdef SHADOW_BLOCK_ENTITY + #endif + + #ifdef TAA_SELECTIVE + #endif + + #ifdef SKY_DEFERRED + #endif \ No newline at end of file diff --git a/shaders/lib/surface/directionalLightmap.glsl b/shaders/lib/surface/directionalLightmap.glsl new file mode 100644 index 0000000..a18986b --- /dev/null +++ b/shaders/lib/surface/directionalLightmap.glsl @@ -0,0 +1,25 @@ +mat3 GetLightmapTBN(vec3 viewPos) { + mat3 lightmapTBN = mat3(normalize(dFdx(viewPos)), normalize(dFdy(viewPos)), vec3(0.0)); + lightmapTBN[2] = cross(lightmapTBN[0], lightmapTBN[1]); + + return lightmapTBN; +} + +float DirectionalLightmap(float lightmap, float lightmapRaw, vec3 normal, mat3 lightmapTBN) { + if (lightmap < 0.001) return lightmap; + + vec2 deriv = vec2(dFdx(lightmapRaw), dFdy(lightmapRaw)) * 256.0; + vec3 dir = normalize(vec3( + deriv.x * lightmapTBN[0] + + 0.0005 * lightmapTBN[2] + + deriv.y * lightmapTBN[1] + )); + + float pwr = clamp(dot(normal, dir), -1.0, 1.0); + if (abs(pwr) > 0.0) + pwr = pow(abs(pwr), DIRECTIONAL_LIGHTMAP_STRENGTH) * sign(pwr) * lightmap; + if (length(deriv) > 0.001) + lightmap = pow(lightmap, max(1.0 - pwr, 0.001)); + + return lightmap; +} \ No newline at end of file diff --git a/shaders/lib/surface/generatedNormals.glsl b/shaders/lib/surface/generatedNormals.glsl new file mode 100644 index 0000000..cad0f1c --- /dev/null +++ b/shaders/lib/surface/generatedNormals.glsl @@ -0,0 +1,85 @@ +const float normalThreshold = GENERATED_NORMAL_THRESHOLD; +const float normalClamp = GENERATED_NORMAL_CLAMP; +const float packSizeGN = GENERATED_NORMAL_RESOLUTION; + +#ifndef GBUFFERS_HAND + const float normalMult = GENERATED_NORMAL_MULT * 0.05; +#else + const float normalMult = GENERATED_NORMAL_MULT * 0.03; +#endif + +float GetDif(float lOriginalAlbedo, vec2 offsetCoord) { + #ifndef GBUFFERS_WATER + float lNearbyAlbedo = length(texture2D(texture, offsetCoord).rgb); + #else + vec4 textureSample = texture2D(texture, offsetCoord); + float lNearbyAlbedo = length(textureSample.rgb * textureSample.a * 1); + #endif + + #ifdef GBUFFERS_ENTITIES + lOriginalAlbedo = abs(lOriginalAlbedo - 1.0); + lNearbyAlbedo = abs(lNearbyAlbedo - 1.0); + #endif + + float dif = lOriginalAlbedo - lNearbyAlbedo; + + #ifdef GBUFFERS_ENTITIES + dif = -dif; + #endif + + #ifndef GBUFFERS_WATER + if (dif > 0.0) dif = max(dif - normalThreshold, 0.0); + else dif = min(dif + normalThreshold, 0.0); + #endif + + return clamp(dif, -normalClamp, normalClamp); +} + +void GenerateNormals(inout vec3 normal, vec3 color) { + #ifndef ENTITY_GN_AND_CT + #if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND + return; + #endif + #endif + + vec2 absMidCoordPos2 = absMidCoordPos * 4.0; + float lOriginalAlbedo = length(color.rgb); + + float normalMult = max0(1 - mipDelta) * normalMult; + + #ifndef SAFER_GENERATED_NORMALS + vec2 offsetR = 16.0 / atlasSizeM; + #else + vec2 offsetR = max(absMidCoordPos2.x, absMidCoordPos2.y) * vec2(float(atlasSizeM.y) / float(atlasSizeM.x), 1); + #endif + offsetR /= packSizeGN; + + vec2 midCoord = texCoord - midCoordPos; + vec2 maxOffsetCoord = midCoord + absMidCoordPos; + vec2 minOffsetCoord = midCoord - absMidCoordPos; + if (normalMult > 0.0) { + vec3 normalMap = vec3(0.0, 0.0, 1.0); + + vec2 offsetCoord = texCoord + vec2( 0.0, offsetR.y); + if (offsetCoord.y < maxOffsetCoord.y) + normalMap.y += GetDif(lOriginalAlbedo, offsetCoord); + + offsetCoord = texCoord + vec2( offsetR.x, 0.0); + if (offsetCoord.x < maxOffsetCoord.x) + normalMap.x += GetDif(lOriginalAlbedo, offsetCoord); + + offsetCoord = texCoord + vec2( 0.0,-offsetR.y); + if (offsetCoord.y > minOffsetCoord.y) + normalMap.y -= GetDif(lOriginalAlbedo, offsetCoord); + + offsetCoord = texCoord + vec2(-offsetR.x, 0.0); + if (offsetCoord.x > minOffsetCoord.x) + normalMap.x -= GetDif(lOriginalAlbedo, offsetCoord); + + normalMap.xy *= normalMult; + normalMap.xy = clamp(normalMap.xy, vec2(-1.0), vec2(1.0)); + + if (normalMap.xy != vec2(0.0, 0.0)) + normal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + } +} \ No newline at end of file diff --git a/shaders/lib/surface/ggx.glsl b/shaders/lib/surface/ggx.glsl new file mode 100644 index 0000000..ed95e44 --- /dev/null +++ b/shaders/lib/surface/ggx.glsl @@ -0,0 +1,108 @@ +//GGX area light approximation from Decima Engine: Advances in Lighting and AA presentation +float GetNoHSquared(float radiusTan, float NoL, float NoV, float VoL) { + float radiusCos = 1.0 / sqrt(1.0 + radiusTan * radiusTan); + + float RoL = 2.0 * NoL * NoV - VoL; + if (RoL >= radiusCos) + return 1.0; + + float rOverLengthT = radiusCos * radiusTan / sqrt(1.0 - RoL * RoL); + float NoTr = rOverLengthT * (NoV - RoL * NoL); + float VoTr = rOverLengthT * (2.0 * NoV * NoV - 1.0 - RoL * VoL); + + float triple = sqrt(clamp(1.0 - NoL * NoL - NoV * NoV - VoL * VoL + 2.0 * NoL * NoV * VoL, 0.0, 1.0)); + + float NoBr = rOverLengthT * triple, VoBr = rOverLengthT * (2.0 * triple * NoV); + float NoLVTr = NoL * radiusCos + NoV + NoTr, VoLVTr = VoL * radiusCos + 1.0 + VoTr; + float p = NoBr * VoLVTr, q = NoLVTr * VoLVTr, s = VoBr * NoLVTr; + float xNum = q * (-0.5 * p + 0.25 * VoBr * NoLVTr); + float xDenom = p * p + s * ((s - 2.0 * p)) + NoLVTr * ((NoL * radiusCos + NoV) * VoLVTr * VoLVTr + + q * (-0.5 * (VoLVTr + VoL * radiusCos) - 0.5)); + float twoX1 = 2.0 * xNum / (xDenom * xDenom + xNum * xNum); + float sinTheta = twoX1 * xDenom; + float cosTheta = 1.0 - twoX1 * xNum; + NoTr = cosTheta * NoTr + sinTheta * NoBr; + VoTr = cosTheta * VoTr + sinTheta * VoBr; + + float newNoL = NoL * radiusCos + NoTr; + float newVoL = VoL * radiusCos + VoTr; + float NoH = NoV + newNoL; + float HoH = 2.0 * newVoL + 2.0; + return clamp(NoH * NoH / HoH, 0.0, 1.0); +} + +float GGXTrowbridgeReitz(float NoHsqr, float roughness){ + float roughnessSqr = roughness * roughness; + float distr = NoHsqr * (roughnessSqr - 1.0) + 1.0; + return roughnessSqr / (3.14159 * distr * distr); +} + +float SchlickGGX(float NoL, float NoV, float roughness){ + float k = roughness * 0.5; + + float smithL = 0.5 / (NoL * (1.0 - k) + k); + float smithV = 0.5 / (NoV * (1.0 - k) + k); + + return smithL * smithV; +} + +vec3 SphericalGaussianFresnel(float HoL, vec3 baseReflectance){ + float fresnel = exp2(((-5.55473 * HoL) - 6.98316) * HoL); + return fresnel * (1.0 - baseReflectance) + baseReflectance; +} + +vec3 GGX(vec3 normal, vec3 viewPos, float smoothness, vec3 baseReflectance, float sunSize) { + float roughness = max(1.0 - smoothness, 0.025); roughness *= roughness; + viewPos = -viewPos; + + vec3 halfVec = normalize(lightVec + viewPos); + + float HoL = clamp(dot(halfVec, lightVec), 0.0, 1.0); + float NoL = clamp(dot(normal, lightVec), 0.0, 1.0); + float NoV = clamp(dot(normal, viewPos), -1.0, 1.0); + float VoL = dot(lightVec, viewPos); + + float NoHsqr = GetNoHSquared(sunSize, NoL, NoV, VoL); + if (NoV < 0.0){ + NoHsqr = dot(normal, halfVec); + NoHsqr *= NoHsqr; + } + NoV = max(NoV, 0.0); + + float D = GGXTrowbridgeReitz(NoHsqr, roughness); + vec3 F = SphericalGaussianFresnel(HoL, baseReflectance); + float G = SchlickGGX(NoL, NoV, roughness); + + float Fl = max(length(F), 0.001); + vec3 Fn = F / Fl; + + float specular = D * Fl * G; + vec3 specular3 = specular / (1.0 + 0.03125 / 4.0 * specular) * Fn * NoL; + + #ifndef SPECULAR_HIGHLIGHT_ROUGH + specular3 *= 1.0 - roughness * roughness; + #endif + + return specular3; +} + +vec3 GetSpecularHighlight(vec3 normal, vec3 viewPos, float smoothness, vec3 baseReflectance, + vec3 specularColor, vec3 shadow, float smoothLighting) { + if (dot(shadow, shadow) < 0.00001) return vec3(0.0); + #ifndef SPECULAR_HIGHLIGHT_ROUGH + if (smoothness < 0.00002) return vec3(0.0); + #endif + + smoothLighting *= smoothLighting; + + #ifdef END + smoothness *= 0.75; + #endif + + vec3 specular = GGX(normal, normalize(viewPos), smoothness, baseReflectance, + (0.025 * sunVisibility + 0.05) * ROUND_SUN_MOON_SIZE); + specular *= shadow * shadowFade * smoothLighting; + specular *= (1.0 - rainStrength) * (1.0 - rainStrength); + + return specular * specularColor; +} \ No newline at end of file diff --git a/shaders/lib/surface/materialDeferred.glsl b/shaders/lib/surface/materialDeferred.glsl new file mode 100644 index 0000000..5d8de6c --- /dev/null +++ b/shaders/lib/surface/materialDeferred.glsl @@ -0,0 +1,18 @@ +void GetMaterials(out float smoothness, out float skyOcclusion, out vec3 normal, out vec3 fresnel3, + vec2 coord) { + vec3 specularData = texture2D(colortex3, coord).rgb; + + smoothness = specularData.r; + smoothness *= smoothness; + smoothness /= 2.0 - smoothness; + + skyOcclusion = specularData.g; + #if REFLECTION_SKY_FALLOFF > 1 + skyOcclusion = clamp(1.0 - (1.0 - skyOcclusion) * REFLECTION_SKY_FALLOFF, 0.0, 1.0); + #endif + skyOcclusion *= skyOcclusion; + + normal = DecodeNormal(texture2D(colortex6, coord).xy); + + fresnel3 = texture2D(colortex7, coord).rgb * smoothness; +} \ No newline at end of file diff --git a/shaders/lib/surface/materialGbuffers.glsl b/shaders/lib/surface/materialGbuffers.glsl new file mode 100644 index 0000000..c762296 --- /dev/null +++ b/shaders/lib/surface/materialGbuffers.glsl @@ -0,0 +1,130 @@ +void GetMaterials(out float smoothness, out float metalness, out float f0, inout float emission, + inout float subsurface, out float porosity, out float ao, out vec3 normalMap, + vec2 newCoord, vec2 dcdx, vec2 dcdy) +{ + float emissionMat = 0.0; + + + + #if MATERIAL_FORMAT == 0 + #ifdef PARALLAX + vec4 specularMap = texture2DGradARB(specular, newCoord, dcdx, dcdy); + #else + vec4 specularMap = texture2D(specular, texCoord); + #endif + + smoothness = specularMap.r; + + f0 = 0.04; + metalness = specularMap.g; + + emissionMat = specularMap.b * specularMap.b; + + porosity = 0.5 - 0.5 * smoothness; + subsurface = specularMap.a > 0.0 ? 1.0 - specularMap.a : 0.0; + + #ifdef PARALLAX + normalMap = texture2DGradARB(normals, newCoord, dcdx, dcdy).xyz * 2.0 - 1.0; + #else + normalMap = texture2D(normals, texCoord).xyz * 2.0 - 1.0; + #endif + ao = 1.0; + + if (normalMap.x + normalMap.y < -1.999) normalMap = vec3(0.0, 0.0, 1.0); + #endif + + #if MATERIAL_FORMAT == 1 + vec4 specularMap = texture2DLod(specular, newCoord, 0); + smoothness = specularMap.r; + + f0 = specularMap.g; + metalness = f0 >= 0.9 ? 1.0 : 0.0; + + emissionMat = specularMap.a < 1.0 ? clamp(specularMap.a * 1.004 - 0.004, 0.0, 1.0) : 0.0; + emissionMat *= emissionMat; + + porosity = specularMap.b <= 0.251 ? specularMap.b * 3.984 : 0.0; + subsurface = specularMap.b > 0.251 ? clamp(specularMap.b * 1.335 - 0.355, 0.0, 1.0) : 0.0; + + #ifdef PARALLAX + normalMap = vec3(texture2DGradARB(normals, newCoord, dcdx, dcdy).xy, 0.0) * 2.0 - 1.0; + ao = texture2DGradARB(normals, newCoord, dcdx, dcdy).z; + #else + normalMap = vec3(texture2D(normals, texCoord).xy, 0.0) * 2.0 - 1.0; + ao = texture2D(normals, texCoord).z; + #endif + + if (normalMap.x + normalMap.y > -1.999) { + if (length(normalMap.xy) > 1.0) normalMap.xy = normalize(normalMap.xy); + normalMap.z = sqrt(1.0 - dot(normalMap.xy, normalMap.xy)); + normalMap = normalize(clamp(normalMap, vec3(-1.0), vec3(1.0))); + }else{ + normalMap = vec3(0.0, 0.0, 1.0); + ao = 1.0; + } + #endif + + #if EMISSIVE == 2 + emission = mix(emissionMat, 1.0, emission); + #else + emission = emissionMat; + #endif + + #ifdef NORMAL_DAMPENING + mipx = dcdx * atlasSize; + mipy = dcdy * atlasSize; + mipDelta = max(dot(mipx, mipx), dot(mipy, mipy)); + miplevel = max(0.25 * log2(mipDelta), 0.0); + + normalMap = normalize(mix(vec3(0.0, 0.0, 1.0), normalMap, 1.0 / exp2(miplevel))); + #endif + + + + #if MATERIAL_FORMAT == 2 + vec4 specularMap = texture2DLod(specular, newCoord, 0); + smoothness = specularMap.r; + + f0 = specularMap.g; + metalness = f0 >= 0.9 ? 1.0 : 0.0; + + emissionMat = specularMap.a < 1.0 ? clamp(specularMap.a * 1.004 - 0.004, 0.0, 1.0) : 0.0; + emissionMat *= emissionMat; + + porosity = specularMap.b <= 0.251 ? specularMap.b * 3.984 : 0.0; + subsurface = specularMap.b > 0.251 ? clamp(specularMap.b * 1.335 - 0.355, 0.0, 1.0) : 0.0; + + #ifdef PARALLAX + normalMap = vec3(texture2DGradARB(normals, newCoord, dcdx, dcdy).xy, 0.0) * 2.0 - 1.0; + ao = texture2DGradARB(normals, newCoord, dcdx, dcdy).z; + #else + normalMap = vec3(texture2D(normals, texCoord).xy, 0.0) * 2.0 - 1.0; + ao = texture2D(normals, texCoord).z; + #endif + + if (normalMap.x + normalMap.y > -1.999) { + if (length(normalMap.xy) > 1.0) normalMap.xy = normalize(normalMap.xy); + normalMap.z = sqrt(1.0 - dot(normalMap.xy, normalMap.xy)); + normalMap = normalize(clamp(normalMap, vec3(-1.0), vec3(1.0))); + }else{ + normalMap = vec3(0.0, 0.0, 1.0); + ao = 1.0; + } + #endif + + #if EMISSIVE == 2 + emission = mix(emissionMat, 1.0, emission); + #else + emission = emissionMat; + #endif + + #ifdef NORMAL_DAMPENING + mipx = dcdx * atlasSize; + mipy = dcdy * atlasSize; + mipDelta = max(dot(mipx, mipx), dot(mipy, mipy)); + miplevel = max(0.25 * log2(mipDelta), 0.0); + + normalMap = normalize(mix(vec3(0.0, 0.0, 1.0), normalMap, 1.0 / exp2(miplevel))); + #endif + +} \ No newline at end of file diff --git a/shaders/lib/surface/materialHandling/blockEntityMaterials.glsl b/shaders/lib/surface/materialHandling/blockEntityMaterials.glsl new file mode 100644 index 0000000..fb619a7 --- /dev/null +++ b/shaders/lib/surface/materialHandling/blockEntityMaterials.glsl @@ -0,0 +1,105 @@ +// if (blockEntityId < 60028) { +// if (blockEntityId < 60012) { +// if (blockEntityId < 60004) { +// if (blockEntityId == 10548) { // Enchanting Table:Book +// smoothnessG = pow2(color.g) * 0.35; + +// if (color.b < 0.0001 && color.r > color.g) { +// emission = color.g * 4.0; +// } +// } else if (blockEntityId == 60000) { // + +// } +// } else { +// if (blockEntityId == 60004) { // Signs +// noSmoothLighting = true; + +// if (glColor.r + glColor.g + glColor.b <= 2.99 || lmCoord.x > 0.999) { // Sign Text +// #include "/lib/materials/specificMaterials/others/signText.glsl" +// } + +// #ifdef COATED_TEXTURES +// noiseFactor = 0.66; +// #endif +// } else /*if (blockEntityId == 60008)*/ { // Chest +// noSmoothLighting = true; + +// smoothnessG = pow2(color.g); + +// #ifdef COATED_TEXTURES +// noiseFactor = 0.66; +// #endif +// } +// } +// } else { +// if (blockEntityId < 60020) { +// if (blockEntityId == 60012) { // Ender Chest +// noSmoothLighting = true; + +// float factor = min(pow2(color.g), 0.25); +// smoothnessG = factor * 2.0; + +// if (color.g > color.r || color.b > color.g) +// emission = pow2(factor) * 20.0; +// emission += 0.35; + +// #ifdef COATED_TEXTURES +// noiseFactor = 0.66; +// #endif +// } else /*if (blockEntityId == 60016)*/ { // Shulker Box+, Banner+, Head+, Bed+ +// noSmoothLighting = true; +// #ifdef COATED_TEXTURES +// noiseFactor = 0.2; +// #endif +// } +// } else { +// if (blockEntityId == 60020) { // Conduit +// noSmoothLighting = true; +// lmCoordM.x = 0.9; + +// if (color.b > color.r) { // Conduit:Wind, Conduit:Blue Pixels of The Eye +// emission = color.r * 16.0; +// } else if (color.r > color.b * 2.5) { // Conduit:Red Pixels of The Eye +// emission = 20.0; +// color.rgb *= vec3(1.0, 0.25, 0.1); +// } +// } else /*if (blockEntityId == 60024)*/ { // End Portal, End Gateway +// #include "/lib/materials/specificMaterials/others/endPortalEffect.glsl" +// } +// } +// } +// } else { +// if (blockEntityId < 60044) { +// if (blockEntityId < 60036) { +// if (blockEntityId == 60028) { // + +// } else /*if (blockEntityId == 60032)*/ { // Bell +// if (color.r + color.g > color.b + 0.5) { // Bell:Golden Part +// #include "/lib/materials/specificMaterials/terrain/goldBlock.glsl" +// } else { +// #include "/lib/materials/specificMaterials/terrain/stone.glsl" +// } +// } +// } else { +// if (blockEntityId == 60036) { // + +// } else /*if (blockEntityId == 60040)*/ { // + +// } +// } +// } else { +// if (blockEntityId < 60052) { +// if (blockEntityId == 60044) { // + +// } else /*if (blockEntityId == 60048)*/ { // + +// } +// } else { +// if (blockEntityId == 60052) { // + +// } else if (blockEntityId == 60056) { // + +// } +// } +// } +// } \ No newline at end of file diff --git a/shaders/lib/surface/parallax.glsl b/shaders/lib/surface/parallax.glsl new file mode 100644 index 0000000..8a58bb1 --- /dev/null +++ b/shaders/lib/surface/parallax.glsl @@ -0,0 +1,76 @@ +vec4 ReadNormal(vec2 coord) { + coord = fract(coord) * vTexCoordAM.pq + vTexCoordAM.st; + return texture2DGradARB(normals, coord, dcdx, dcdy); +} + +vec2 GetParallaxCoord(vec2 texCoord, float parallaxFade, out float surfaceDepth) { + vec2 coord = vTexCoord.st; + surfaceDepth = 1.0; + + if (viewVector != viewVector) { + return texCoord; + } + + float sampleStep = 1.0 / PARALLAX_QUALITY; + float currentStep = 1.0; + + vec2 scaledDir = viewVector.xy * PARALLAX_DEPTH / -viewVector.z; + vec2 stepDir = scaledDir * sampleStep * (1.0 - parallaxFade); + + vec3 normalMap = ReadNormal(coord).xyz * 2.0 - 1.0; + float normalCheck = normalMap.x + normalMap.y; + if (parallaxFade >= 1.0 || normalCheck < -1.999) return texCoord; + + float depth = ReadNormal(coord).a; + + for(int i = 0; i < PARALLAX_QUALITY; i++){ + if (currentStep <= depth) break; + coord += stepDir; + depth = ReadNormal(coord).a; + currentStep -= sampleStep; + } + + coord = fract(coord.st) * vTexCoordAM.pq + vTexCoordAM.st; + surfaceDepth = currentStep; + + return coord; +} + +float GetParallaxShadow(float surfaceDepth, float parallaxFade, vec2 coord, vec3 lightVec, + mat3 tbn) { + float parallaxshadow = 1.0; + if(parallaxFade >= 1.0) return 1.0; + + float height = surfaceDepth; + if(height > 1.0 - 0.5 / PARALLAX_QUALITY) return 1.0; + + vec3 parallaxdir = tbn * lightVec; + parallaxdir.xy *= PARALLAX_DEPTH * SELF_SHADOW_ANGLE; + vec2 newvTexCoord = (coord - vTexCoordAM.st) / vTexCoordAM.pq; + float sampleStep = 0.32 / SELF_SHADOW_QUALITY; + + vec2 ptexCoord = fract(newvTexCoord + parallaxdir.xy * sampleStep) * + vTexCoordAM.pq + vTexCoordAM.st; + + float texHeight = texture2DGradARB(normals, coord, dcdx, dcdy).a; + float texHeightOffset = texture2DGradARB(normals, ptexCoord, dcdx, dcdy).a; + + float texFactor = clamp((height - texHeightOffset) / sampleStep + 1.0, 0.0, 1.0); + + height = mix(height, texHeight, texFactor); + + for(int i = 0; i < SELF_SHADOW_QUALITY; i++) { + float currentHeight = height + parallaxdir.z * sampleStep * i; + vec2 parallaxCoord = fract(newvTexCoord + parallaxdir.xy * i * sampleStep) * + vTexCoordAM.pq + vTexCoordAM.st; + float offsetHeight = texture2DGradARB(normals, parallaxCoord, dcdx, dcdy).a; + float sampleShadow = clamp(1.0 - (offsetHeight - currentHeight) * SELF_SHADOW_STRENGTH, 0.0, 1.0); + parallaxshadow = min(parallaxshadow, sampleShadow); + if (parallaxshadow < 0.01) break; + } + parallaxshadow *= parallaxshadow; + + parallaxshadow = mix(parallaxshadow, 1.0, parallaxFade); + + return parallaxshadow; +} \ No newline at end of file diff --git a/shaders/lib/util/commonFunctions.glsl b/shaders/lib/util/commonFunctions.glsl new file mode 100644 index 0000000..e9e80fc --- /dev/null +++ b/shaders/lib/util/commonFunctions.glsl @@ -0,0 +1,15 @@ +float min1(float x) { + return min(x, 1.0); +} +float max0(float x) { + return max(x, 0.0); +} +float clamp01(float x) { + return clamp(x, 0.0, 1.0); +} +vec2 clamp01(vec2 x) { + return clamp(x, vec2(0.0), vec2(1.0)); +} +vec3 clamp01(vec3 x) { + return clamp(x, vec3(0.0), vec3(1.0)); +} \ No newline at end of file diff --git a/shaders/lib/util/dFdxdFdy.glsl b/shaders/lib/util/dFdxdFdy.glsl new file mode 100644 index 0000000..0509a2d --- /dev/null +++ b/shaders/lib/util/dFdxdFdy.glsl @@ -0,0 +1,7 @@ +#ifndef INCLUDE_DFDX_DFDY +#define INCLUDE_DFDX_DFDY + +vec2 dcdx = dFdx(texCoord.xy); +vec2 dcdy = dFdy(texCoord.xy); + +#endif \ No newline at end of file diff --git a/shaders/lib/util/dither.glsl b/shaders/lib/util/dither.glsl new file mode 100644 index 0000000..707e68b --- /dev/null +++ b/shaders/lib/util/dither.glsl @@ -0,0 +1,16 @@ +//Dithering from Jodie +float Bayer2(vec2 a) { + a = floor(a); + return fract(a.x * 0.5 + a.y * a.y * 0.75); +} + +#define Bayer4(a) (Bayer2(a * 0.5) * 0.25 + Bayer2(a)) +#define Bayer8(a) (Bayer4(a * 0.5) * 0.25 + Bayer2(a)) + +float BayerCloud2(vec2 a) { + a = floor(a); + return fract(a.x * 0.5 + a.y * 0.75); +} + +#define BayerCloud4(a) (BayerCloud2(a * 0.5) * 0.25 + BayerCloud2(a)) +#define BayerCloud8(a) (BayerCloud4(a * 0.5) * 0.25 + BayerCloud2(a)) \ No newline at end of file diff --git a/shaders/lib/util/encode.glsl b/shaders/lib/util/encode.glsl new file mode 100644 index 0000000..448f6d4 --- /dev/null +++ b/shaders/lib/util/encode.glsl @@ -0,0 +1,15 @@ +//Spheremap Transform from https://aras-p.info/texts/CompactNormalStorage.html +vec2 EncodeNormal(vec3 n) { + float f = sqrt(n.z * 8.0 + 8.0); + return n.xy / f + 0.5; +} + +vec3 DecodeNormal(vec2 enc) { + vec2 fenc = enc * 4.0 - 2.0; + float f = dot(fenc,fenc); + float g = sqrt(1.0 - f / 4.0); + vec3 n; + n.xy = fenc * g; + n.z = 1.0 - f / 2.0; + return n; +} \ No newline at end of file diff --git a/shaders/lib/util/jitter.glsl b/shaders/lib/util/jitter.glsl new file mode 100644 index 0000000..f394b9b --- /dev/null +++ b/shaders/lib/util/jitter.glsl @@ -0,0 +1,27 @@ +//Jitter offset from Chocapic13 +uniform float framemod8; +uniform float framemod2; + +vec2 jitterOffsets8[8] = vec2[8]( + vec2( 0.125,-0.375), + vec2(-0.125, 0.375), + vec2( 0.625, 0.125), + vec2( 0.375,-0.625), + vec2(-0.625, 0.625), + vec2(-0.875,-0.125), + vec2( 0.375,-0.875), + vec2( 0.875, 0.875) + ); +vec2 jitterOffsets2[2] = vec2[2]( + vec2( 1.0, 0.0), + vec2( 0.0, 1.0) + ); + +vec2 TAAJitter(vec2 coord, float w) { + #if TAA_MODE == 0 + vec2 offset = jitterOffsets8[int(framemod8)] * (w / vec2(viewWidth, viewHeight)); + #else + vec2 offset = jitterOffsets2[int(framemod2)] * (w / vec2(viewWidth, viewHeight)); + #endif + return coord + offset; +} \ No newline at end of file diff --git a/shaders/lib/util/outlineDepth.glsl b/shaders/lib/util/outlineDepth.glsl new file mode 100644 index 0000000..6f233fc --- /dev/null +++ b/shaders/lib/util/outlineDepth.glsl @@ -0,0 +1,20 @@ +void DepthOutline(inout float z, sampler2D depthtex) { + float ph = ceil(viewHeight / 1440.0) / viewHeight; + float pw = ph / aspectRatio; + + int sampleCount = viewHeight >= 720.0 ? 12 : 4; + + #ifdef RETRO_FILTER + ph = RETRO_FILTER_SIZE / viewHeight; + pw = ph / aspectRatio; + sampleCount = 4; + #endif + + for (int i = 0; i < sampleCount; i++) { + vec2 offset = vec2(pw, ph) * outlineOffsets[i]; + for (int j = 0; j < 2; j++) { + z = min(z, texture2D(depthtex, texCoord + offset).r); + offset = -offset; + } + } +} \ No newline at end of file diff --git a/shaders/lib/util/outlineMask.glsl b/shaders/lib/util/outlineMask.glsl new file mode 100644 index 0000000..99b2ccf --- /dev/null +++ b/shaders/lib/util/outlineMask.glsl @@ -0,0 +1,24 @@ +float GetOutlineMask() { + float ph = ceil(viewHeight / 1440.0) / viewHeight; + float pw = ph / aspectRatio; + + int sampleCount = viewHeight >= 720.0 ? 12 : 4; + + #ifdef RETRO_FILTER + ph = RETRO_FILTER_SIZE / viewHeight; + pw = ph / aspectRatio; + sampleCount = 4; + #endif + + float mask = 0.0; + for (int i = 0; i < sampleCount; i++) { + vec2 offset = vec2(pw, ph) * outlineOffsets[i]; + for (int j = 0; j < 2; j++){ + mask += float(texture2D(depthtex0, texCoord + offset).r < + texture2D(depthtex1, texCoord + offset).r); + offset = -offset; + } + } + + return float(mask > 0.5); +} \ No newline at end of file diff --git a/shaders/lib/util/outlineOffset.glsl b/shaders/lib/util/outlineOffset.glsl new file mode 100644 index 0000000..2cd98d5 --- /dev/null +++ b/shaders/lib/util/outlineOffset.glsl @@ -0,0 +1,14 @@ +vec2 outlineOffsets[12] = vec2[12]( + vec2( 0.0, 1.0), + vec2( 1.0, 0.0), + vec2( 1.0, 1.0), + vec2(-1.0, 1.0), + vec2( 2.0, 0.0), + vec2( 0.0, 2.0), + vec2( 2.0, 1.0), + vec2( 1.0, 2.0), + vec2(-1.0, 2.0), + vec2(-2.0, 1.0), + vec2( 2.0, 2.0), + vec2(-2.0, 2.0) +); \ No newline at end of file diff --git a/shaders/lib/util/spaceConversion.glsl b/shaders/lib/util/spaceConversion.glsl new file mode 100644 index 0000000..9de5fb1 --- /dev/null +++ b/shaders/lib/util/spaceConversion.glsl @@ -0,0 +1,20 @@ +#define diagonal3(m) vec3((m)[0].x, (m)[1].y, m[2].z) +#define projMAD(m, v) (diagonal3(m) * (v) + (m)[3].xyz) + +vec3 ToNDC(vec3 pos) { + vec4 iProjDiag = vec4(gbufferProjectionInverse[0].x, + gbufferProjectionInverse[1].y, + gbufferProjectionInverse[2].zw); + vec3 p3 = pos * 2.0 - 1.0; + vec4 viewPos = iProjDiag * p3.xyzz + gbufferProjectionInverse[3]; + return viewPos.xyz / viewPos.w; +} + +vec3 ToWorld(vec3 pos) { + return mat3(gbufferModelViewInverse) * pos + gbufferModelViewInverse[3].xyz; +} + +vec3 ToShadow(vec3 pos) { + vec3 shadowpos = mat3(shadowModelView) * pos + shadowModelView[3].xyz; + return projMAD(shadowProjection, shadowpos); +} \ No newline at end of file diff --git a/shaders/lib/vertex/waving.glsl b/shaders/lib/vertex/waving.glsl new file mode 100644 index 0000000..7eed0d1 --- /dev/null +++ b/shaders/lib/vertex/waving.glsl @@ -0,0 +1,133 @@ +const float pi = 3.1415927; +float pi2wt = 6.2831854 * (frametime * 24.0); + +float GetNoise(vec2 pos) { + return fract(sin(dot(pos, vec2(12.9898, 4.1414))) * 43758.5453); +} + +float Noise2D(vec2 pos) { + vec2 flr = floor(pos); + vec2 frc = fract(pos); + frc = frc * frc * (3.0 - 2.0 * frc); + + float n00 = GetNoise(flr); + float n01 = GetNoise(flr + vec2(0.0, 1.0)); + float n10 = GetNoise(flr + vec2(1.0, 0.0)); + float n11 = GetNoise(flr + vec2(1.0, 1.0)); + + float n0 = mix(n00, n01, frc.y); + float n1 = mix(n10, n11, frc.y); + + return mix(n0, n1, frc.x) - 0.5; +} + +vec3 CalcMove(vec3 pos, float density, float speed, vec2 mult) { + pos = pos * density + frametime * speed; + vec3 wave = vec3(Noise2D(pos.yz), Noise2D(pos.xz + 0.333), Noise2D(pos.xy + 0.667)); + return wave * vec3(mult, mult.x); +} + +float CalcLilypadMove(vec3 worldpos) { + float wave = sin(2 * pi * (frametime * 0.7 + worldpos.x * 0.14 + worldpos.z * 0.07)) + + sin(2 * pi * (frametime * 0.5 + worldpos.x * 0.10 + worldpos.z * 0.20)); + return wave * 0.0125; +} + +float CalcLavaMove(vec3 worldpos) { + float fy = fract(worldpos.y + 0.005); + + if (fy > 0.01) { + float wave = sin(pi * (frametime * 0.7 + worldpos.x * 0.14 + worldpos.z * 0.07)) + + sin(pi * (frametime * 0.5 + worldpos.x * 0.10 + worldpos.z * 0.20)); + return wave * 0.0125; + } else return 0.0; +} + +vec3 CalcLanternMove(vec3 position) { + vec3 frc = fract(position); + frc = vec3(frc.x - 0.5, fract(frc.y - 0.001) - 1.0, frc.z - 0.5); + vec3 flr = position - frc; + float offset = flr.x * 2.4 + flr.y * 2.7 + flr.z * 2.2; + + float rmult = pi * 0.016; + float rx = sin(frametime + offset) * rmult; + float ry = sin(frametime * 1.7 + offset) * rmult; + float rz = sin(frametime * 1.4 + offset) * rmult; + mat3 rotx = mat3( + 1, 0, 0, + 0, cos(rx), -sin(rx), + 0, sin(rx), cos(rx) + ); + mat3 roty = mat3( + cos(ry), 0, sin(ry), + 0, 1, 0, + -sin(ry), 0, cos(ry) + ); + mat3 rotz = mat3( + cos(rz), -sin(rz), 0, + sin(rz), cos(rz), 0, + 0, 0, 1 + ); + frc = rotx * roty * rotz * frc; + + return flr + frc - position; +} + +vec3 WavingBlocks(vec3 position, int blockID, float istopv) { + vec3 wave = vec3(0.0); + vec3 worldpos = position + cameraPosition; + + #ifdef WAVING_GRASS + if (blockID == 100 && istopv > 0.9) + wave += CalcMove(worldpos, 0.35, 1.0, vec2(0.25, 0.06)); + #endif + + #ifdef WAVING_CROP + if (blockID == 104 && (istopv > 0.9 || fract(worldpos.y + 0.0675) > 0.01)) + wave += CalcMove(worldpos, 0.35, 1.0, vec2(0.15, 0.06)); + #endif + + #ifdef WAVING_PLANT + if (blockID == 101 && (istopv > 0.9 || fract(worldpos.y + 0.005) > 0.01)) + wave += CalcMove(worldpos, 0.7, 1.35, vec2(0.12, 0.00)); + if (blockID == 107 || blockID == 207) + wave += CalcMove(worldpos, 0.5, 1.25, vec2(0.06, 0.00)); + if (blockID == 108) + wave.y += CalcLilypadMove(worldpos); + #endif + + #ifdef WAVING_TALL_PLANT + if (blockID == 102 && (istopv > 0.9 || fract(worldpos.y + 0.005) > 0.01) || + blockID == 103) + wave += CalcMove(worldpos, 0.35, 1.15, vec2(0.15, 0.06)); + #endif + + #ifdef WAVING_LEAF + if (blockID == 105) + wave += CalcMove(worldpos, 0.25, 1.0, vec2(0.08, 0.08)); + #endif + + #ifdef WAVING_VINE + if (blockID == 106) + wave += CalcMove(worldpos, 0.35, 1.25, vec2(0.06, 0.06)); + #endif + + #ifdef WAVING_LAVA + if (blockID == 203) + wave.y += CalcLavaMove(worldpos); + #endif + + #ifdef WAVING_FIRE + if (blockID == 204 && istopv > 0.9) + wave += CalcMove(worldpos, 1.0, 1.5, vec2(0.0, 0.37)); + #endif + + #ifdef WAVING_LANTERN + if (blockID == 206) + wave += CalcLanternMove(worldpos); + #endif + + position += wave; + + return position; +} \ No newline at end of file diff --git a/shaders/lib/vertex/worldCurvature.glsl b/shaders/lib/vertex/worldCurvature.glsl new file mode 100644 index 0000000..c897bfa --- /dev/null +++ b/shaders/lib/vertex/worldCurvature.glsl @@ -0,0 +1,3 @@ +float WorldCurvature(vec2 pos) { + return dot(pos, pos) / WORLD_CURVATURE_SIZE; +} \ No newline at end of file diff --git a/shaders/program/composite.glsl b/shaders/program/composite.glsl new file mode 100644 index 0000000..bb543ea --- /dev/null +++ b/shaders/program/composite.glsl @@ -0,0 +1,336 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float blindFactor, darknessFactor, nightVision; +uniform float darknessLightFactor; +uniform float far, near; +uniform float frameTimeCounter; +uniform float rainStrength; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; +uniform mat4 gbufferProjection, gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowModelView; +uniform mat4 shadowProjection; + +uniform sampler2D colortex0; +uniform sampler2D colortex1; +uniform sampler2D depthtex0; +uniform sampler2D depthtex1; + +#ifdef LIGHT_SHAFT +uniform sampler2DShadow shadowtex0; +uniform sampler2DShadow shadowtex1; +uniform sampler2D shadowcolor0; +uniform sampler2D noisetex; +#endif + +#if REFRACTION > 0 +uniform sampler2D colortex6; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform vec3 previousCameraPosition; + +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; + +uniform sampler2D colortex8; +uniform sampler2D colortex9; +#endif + +#ifdef OUTLINE_ENABLED +uniform sampler2D gaux1; +#endif + +#ifdef DISTANT_HORIZONS +uniform float dhFarPlane; +#endif + +//Optifine Constants// +const bool colortex5Clear = false; + +#ifdef MULTICOLORED_BLOCKLIGHT +const bool colortex9Clear = false; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp(dot(sunVec, upVec) + 0.05, 0.0, 0.1) * 10.0; + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float GetLinearDepth(float depth) { + return (2.0 * near) / (far + near - depth * (far - near)); +} + +#ifdef MULTICOLORED_BLOCKLIGHT +vec2 Reprojection(vec3 pos) { + pos = pos * 2.0 - 1.0; + + vec4 viewPosPrev = gbufferProjectionInverse * vec4(pos, 1.0); + viewPosPrev /= viewPosPrev.w; + viewPosPrev = gbufferModelViewInverse * viewPosPrev; + + vec3 cameraOffset = cameraPosition - previousCameraPosition; + cameraOffset *= float(pos.z > 0.56); + + vec4 previousPosition = viewPosPrev + vec4(cameraOffset, 0.0); + previousPosition = gbufferPreviousModelView * previousPosition; + previousPosition = gbufferPreviousProjection * previousPosition; + return previousPosition.xy / previousPosition.w * 0.5 + 0.5; +} + +vec2 OffsetDist(float x) { + float n = fract(x * 8.0) * 6.283; + return vec2(cos(n), sin(n)) * x * x; +} + +vec3 GetMultiColoredBlocklight(vec2 coord, float z, float dither) { + vec2 prevCoord = Reprojection(vec3(coord, z)); + float lz = GetLinearDepth(z); + + float distScale = clamp((far - near) * lz + near, 4.0, 128.0); + float fovScale = gbufferProjection[1][1] / 1.37; + + vec2 blurstr = vec2(1.0 / aspectRatio, 1.0) * 2.5 * fovScale / distScale; + + vec3 lightAlbedo = texture2D(colortex8, coord).rgb; + vec3 previousColoredLight = vec3(0.0); + + #ifdef MCBL_ANTI_BLEED + float linearZ = GetLinearDepth(z); + #endif + + float mask = clamp(2.0 - 2.0 * max(abs(prevCoord.x - 0.5), abs(prevCoord.y - 0.5)), 0.0, 1.0); + + for(int i = 0; i < 4; i++) { + vec2 offset = OffsetDist((dither + i) * 0.25) * blurstr; + offset = floor(offset * vec2(viewWidth, viewHeight) + 0.5) / vec2(viewWidth, viewHeight); + + #ifdef MCBL_ANTI_BLEED + vec2 sampleZPos = coord + offset; + float sampleZ0 = texture2D(depthtex0, sampleZPos).r; + float sampleZ1 = texture2D(depthtex1, sampleZPos).r; + float linearSampleZ = GetLinearDepth(sampleZ1 >= 1.0 ? sampleZ0 : sampleZ1); + + float sampleWeight = clamp(abs(linearZ - linearSampleZ) * far / 16.0, 0.0, 1.0); + sampleWeight = 1.0 - sampleWeight * sampleWeight; + #else + float sampleWeight = 1.0; + #endif + + previousColoredLight += texture2D(colortex9, prevCoord.xy + offset).rgb * sampleWeight; + } + + previousColoredLight *= 0.25; + previousColoredLight *= previousColoredLight * mask; + + return sqrt(mix(previousColoredLight, lightAlbedo * lightAlbedo / 0.1, 0.1)); +} +#endif + +//Includes// +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/skyColor.glsl" +#include "/lib/color/waterColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/atmospherics/waterFog.glsl" + +#ifdef LIGHT_SHAFT +#include "/lib/atmospherics/volumetricLight.glsl" +#endif + +#ifdef OUTLINE_ENABLED +#include "/lib/color/blocklightColor.glsl" +#include "/lib/util/outlineOffset.glsl" +#include "/lib/util/outlineDepth.glsl" +#include "/lib/util/outlineMask.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" +#include "/lib/atmospherics/sky.glsl" +#include "/lib/atmospherics/fog.glsl" +#include "/lib/post/outline.glsl" +#endif + +//Program// +void main() { + vec4 color = texture2D(colortex0, texCoord); + vec3 translucent = texture2D(colortex1,texCoord).rgb; + float z0 = texture2D(depthtex0, texCoord).r; + float z1 = texture2D(depthtex1, texCoord).r; + + vec4 screenPos = vec4(texCoord.x, texCoord.y, z0, 1.0); + vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + + #if REFRACTION > 0 + if (z1 > z0) { + vec3 distort = texture2D(colortex6, texCoord).xyz; + float fovScale = gbufferProjection[1][1] / 1.37; + distort.xy = distort.xy * 2.0 - 1.0; + distort.xy *= vec2(1.0 / aspectRatio, 1.0) * fovScale / max(length(viewPos.xyz), 8.0); + + vec2 newCoord = texCoord + distort.xy; + #if MC_VERSION > 10800 + float distortMask = texture2D(colortex6, newCoord).b * distort.b; + #else + float distortMask = texture2DLod(colortex6, newCoord, 0).b * distort.b; + #endif + + if (distortMask == 1.0 && z0 > 0.56) { + z0 = texture2D(depthtex0, newCoord).r; + z1 = texture2D(depthtex1, newCoord).r; + #if MC_VERSION > 10800 + color.rgb = texture2D(colortex0, newCoord).rgb; + #else + color.rgb = texture2DLod(colortex0, newCoord, 0).rgb; + #endif + } + + screenPos = vec4(newCoord.x, newCoord.y, z0, 1.0); + viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + } + #endif + + #if ALPHA_BLEND == 0 + color.rgb *= color.rgb; + #endif + + #ifdef OUTLINE_ENABLED + vec4 outerOutline = vec4(0.0), innerOutline = vec4(0.0); + float outlineMask = GetOutlineMask(); + if (outlineMask > 0.5 || isEyeInWater > 0.5) + Outline(color.rgb, true, outerOutline, innerOutline); + + if(z1 > z0) { + float worldDistance = length(viewPos.xyz) / far; + float distantFade = 1.0 - smoothstep(0.6, 1.1, worldDistance); + innerOutline.a *= distantFade; + + color.rgb = mix(color.rgb, innerOutline.rgb, innerOutline.a); + } + + #ifdef OUTLINE_OUTER + float outlineZ = z0; + DepthOutline(outlineZ, depthtex0); + + vec4 outlineViewPos = gbufferProjectionInverse * (vec4(texCoord, outlineZ, 1.0) * 2.0 - 1.0); + outlineViewPos /= outlineViewPos.w; + + float outlineViewLength = length(outlineViewPos.xyz); + float cloudViewLength = texture2D(gaux1, screenPos.xy).r * (far * 2.0); + outerOutline.a *= step(outlineViewLength, cloudViewLength); + #endif + #endif + + if (isEyeInWater == 1.0) { + vec4 waterFog = GetWaterFog(viewPos.xyz); + waterFog.a = mix(waterAlpha * 0.5, 1.0, waterFog.a); + color.rgb = mix(sqrt(color.rgb), sqrt(waterFog.rgb), waterFog.a); + color.rgb *= color.rgb; + } + + #ifdef OUTLINE_ENABLED + color.rgb = mix(color.rgb, outerOutline.rgb, outerOutline.a); + #endif + + #ifdef LIGHT_SHAFT + float blueNoise = texture2D(noisetex, gl_FragCoord.xy / 512.0).b; + vec3 vl = GetLightShafts(z0, z1, translucent, blueNoise); + #else + vec3 vl = vec3(0.0); + #endif + + color.rgb *= clamp(1.0 - 2.0 * darknessLightFactor, 0.0, 1.0); + + vec3 reflectionColor = pow(color.rgb, vec3(0.125)) * 0.5; + + #ifdef MULTICOLORED_BLOCKLIGHT + float dither = Bayer8(gl_FragCoord.xy); + float lightZ = z1 >= 1.0 ? z0 : z1; + vec3 coloredLight = GetMultiColoredBlocklight(texCoord, lightZ, dither); + #endif + + /*DRAWBUFFERS:01*/ + gl_FragData[0] = color; + gl_FragData[1] = vec4(vl, 1.0); + + #ifdef MULTICOLORED_BLOCKLIGHT + /*DRAWBUFFERS:019*/ + gl_FragData[2] = vec4(coloredLight, 1.0); + + #ifdef REFLECTION_PREVIOUS + /*DRAWBUFFERS:0195*/ + gl_FragData[3] = vec4(reflectionColor, float(z0 < 1.0)); + #endif + #else + #ifdef REFLECTION_PREVIOUS + /*DRAWBUFFERS:015*/ + gl_FragData[2] = vec4(reflectionColor, float(z0 < 1.0)); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); +} + +#endif diff --git a/shaders/program/composite1.glsl b/shaders/program/composite1.glsl new file mode 100644 index 0000000..249d41f --- /dev/null +++ b/shaders/program/composite1.glsl @@ -0,0 +1,102 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform int isEyeInWater; +uniform int worldTime; + +uniform float blindFactor, darknessFactor; +uniform float rainStrength; +uniform float shadowFade, voidFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform sampler2D colortex0; +uniform sampler2D colortex1; + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp(dot(sunVec, upVec) + 0.05, 0.0, 0.1) * 10.0; + +vec2 vlOffsets[4] = vec2[4]( + vec2( 1.5, 0.5), + vec2(-0.5, 1.5), + vec2(-1.5, -0.5), + vec2( 0.5, -1.5) +); + +//Includes// +#include "/lib/color/dimensionColor.glsl" + +//Program// +void main() { + vec4 color = texture2D(colortex0, texCoord.xy); + + vec3 vl = texture2D(colortex1, texCoord.xy + vlOffsets[0] / vec2(viewWidth, viewHeight)).rgb; + vl+= texture2D(colortex1, texCoord.xy + vlOffsets[1] / vec2(viewWidth, viewHeight)).rgb; + vl+= texture2D(colortex1, texCoord.xy + vlOffsets[2] / vec2(viewWidth, viewHeight)).rgb; + vl+= texture2D(colortex1, texCoord.xy + vlOffsets[3] / vec2(viewWidth, viewHeight)).rgb; + vl*= vl * 0.0625; + + #ifdef OVERWORLD + vl *= lightCol * 0.25; + #endif + + #ifdef END + vl *= endCol.rgb * 0.1; + #endif + + vl *= LIGHT_SHAFT_STRENGTH * (1.0 - rainStrength * eBS * 0.875) * shadowFade * + (1.0 - max(blindFactor, darknessFactor)); + + color.rgb += vl; + + /*DRAWBUFFERS:0*/ + gl_FragData[0] = color; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); +} + +#endif \ No newline at end of file diff --git a/shaders/program/composite2.glsl b/shaders/program/composite2.glsl new file mode 100644 index 0000000..b6e2d10 --- /dev/null +++ b/shaders/program/composite2.glsl @@ -0,0 +1,109 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform float viewWidth, viewHeight, aspectRatio; + +uniform vec3 cameraPosition, previousCameraPosition; + +uniform mat4 gbufferPreviousProjection, gbufferProjectionInverse; +uniform mat4 gbufferModelView, gbufferPreviousModelView, gbufferModelViewInverse; + +uniform sampler2D colortex0; +uniform sampler2D depthtex1; + +//Common Functions// +vec3 MotionBlur(vec3 color, float z, float dither) { + + float hand = float(z < 0.56); + + if (hand < 0.5) { + float mbwg = 0.0; + vec2 doublePixel = 2.0 / vec2(viewWidth, viewHeight); + vec3 mblur = vec3(0.0); + + vec4 currentPosition = vec4(texCoord, z, 1.0) * 2.0 - 1.0; + + vec4 viewPos = gbufferProjectionInverse * currentPosition; + viewPos = gbufferModelViewInverse * viewPos; + viewPos /= viewPos.w; + + vec3 cameraOffset = cameraPosition - previousCameraPosition; + + vec4 previousPosition = viewPos + vec4(cameraOffset, 0.0); + previousPosition = gbufferPreviousModelView * previousPosition; + previousPosition = gbufferPreviousProjection * previousPosition; + previousPosition /= previousPosition.w; + + vec2 velocity = (currentPosition - previousPosition).xy; + velocity = velocity / (1.0 + length(velocity)) * MOTION_BLUR_STRENGTH * 0.02; + + vec2 coord = texCoord.st - velocity * (1.5 + dither); + for(int i = 0; i < 5; i++, coord += velocity) { + vec2 sampleCoord = clamp(coord, doublePixel, 1.0 - doublePixel); + float mask = float(texture2D(depthtex1, sampleCoord).r > 0.56); + mblur += texture2DLod(colortex0, sampleCoord, 0.0).rgb * mask; + mbwg += mask; + } + mblur /= max(mbwg, 1.0); + + return mblur; + } + else return color; +} + + +//Includes// +#include "/lib/util/dither.glsl" + +#ifdef OUTLINE_OUTER +#include "/lib/util/outlineOffset.glsl" +#include "/lib/util/outlineDepth.glsl" +#endif + +//Program// +void main() { + vec3 color = texture2DLod(colortex0, texCoord, 0.0).rgb; + + #ifdef MOTION_BLUR + float z = texture2D(depthtex1, texCoord.st).x; + float dither = Bayer8(gl_FragCoord.xy); + + #ifdef OUTLINE_OUTER + DepthOutline(z, depthtex1); + #endif + + color = MotionBlur(color, z, dither); + #endif + + /*DRAWBUFFERS:0*/ + gl_FragData[0] = vec4(color,1.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/composite3.glsl b/shaders/program/composite3.glsl new file mode 100644 index 0000000..e24a5f9 --- /dev/null +++ b/shaders/program/composite3.glsl @@ -0,0 +1,151 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform float viewWidth, viewHeight, aspectRatio; +uniform float centerDepthSmooth; + +uniform mat4 gbufferProjection; + +uniform sampler2D colortex0; +uniform sampler2D depthtex1; + +//Optifine Constants// +const bool colortex0MipmapEnabled = true; + +//Common Variables// +vec2 dofOffsets[60] = vec2[60]( + vec2( 0.0 , 0.25 ), + vec2(-0.2165 , 0.125 ), + vec2(-0.2165 , -0.125 ), + vec2( 0 , -0.25 ), + vec2( 0.2165 , -0.125 ), + vec2( 0.2165 , 0.125 ), + vec2( 0 , 0.5 ), + vec2(-0.25 , 0.433 ), + vec2(-0.433 , 0.25 ), + vec2(-0.5 , 0 ), + vec2(-0.433 , -0.25 ), + vec2(-0.25 , -0.433 ), + vec2( 0 , -0.5 ), + vec2( 0.25 , -0.433 ), + vec2( 0.433 , -0.2 ), + vec2( 0.5 , 0 ), + vec2( 0.433 , 0.25 ), + vec2( 0.25 , 0.433 ), + vec2( 0 , 0.75 ), + vec2(-0.2565 , 0.7048), + vec2(-0.4821 , 0.5745), + vec2(-0.51295, 0.375 ), + vec2(-0.7386 , 0.1302), + vec2(-0.7386 , -0.1302), + vec2(-0.51295, -0.375 ), + vec2(-0.4821 , -0.5745), + vec2(-0.2565 , -0.7048), + vec2(-0 , -0.75 ), + vec2( 0.2565 , -0.7048), + vec2( 0.4821 , -0.5745), + vec2( 0.51295, -0.375 ), + vec2( 0.7386 , -0.1302), + vec2( 0.7386 , 0.1302), + vec2( 0.51295, 0.375 ), + vec2( 0.4821 , 0.5745), + vec2( 0.2565 , 0.7048), + vec2( 0 , 1 ), + vec2(-0.2588 , 0.9659), + vec2(-0.5 , 0.866 ), + vec2(-0.7071 , 0.7071), + vec2(-0.866 , 0.5 ), + vec2(-0.9659 , 0.2588), + vec2(-1 , 0 ), + vec2(-0.9659 , -0.2588), + vec2(-0.866 , -0.5 ), + vec2(-0.7071 , -0.7071), + vec2(-0.5 , -0.866 ), + vec2(-0.2588 , -0.9659), + vec2(-0 , -1 ), + vec2( 0.2588 , -0.9659), + vec2( 0.5 , -0.866 ), + vec2( 0.7071 , -0.7071), + vec2( 0.866 , -0.5 ), + vec2( 0.9659 , -0.2588), + vec2( 1 , 0 ), + vec2( 0.9659 , 0.2588), + vec2( 0.866 , 0.5 ), + vec2( 0.7071 , 0.7071), + vec2( 0.5 , 0.8660), + vec2( 0.2588 , 0.9659) +); + +//Common Functions// +vec3 DepthOfField(vec3 color, float z) { + vec3 dof = vec3(0.0); + float hand = float(z < 0.56); + + float fovScale = gbufferProjection[1][1] / 1.37; + float coc = max(abs(z - centerDepthSmooth) * DOF_STRENGTH - 0.01, 0.0); + coc = coc / sqrt(coc * coc + 0.1); + + if (coc > 0.0 && hand < 0.5) { + for(int i = 0; i < 60; i++) { + vec2 offset = dofOffsets[i] * coc * 0.015 * fovScale * vec2(1.0 / aspectRatio, 1.0); + float lod = log2(viewHeight * aspectRatio * coc * fovScale / 320.0); + dof += texture2DLod(colortex0, texCoord + offset, lod).rgb; + } + dof /= 60.0; + } + else dof = color; + return dof; +} + +//Includes// +#ifdef OUTLINE_OUTER +#include "/lib/util/outlineOffset.glsl" +#include "/lib/util/outlineDepth.glsl" +#endif + +//Program// +void main() { + vec3 color = texture2DLod(colortex0, texCoord, 0.0).rgb; + + #ifdef DOF + float z = texture2D(depthtex1, texCoord.st).x; + + #ifdef OUTLINE_OUTER + DepthOutline(z, depthtex1); + #endif + + color = DepthOfField(color, z); + #endif + + /*DRAWBUFFERS:0*/ + gl_FragData[0] = vec4(color,1.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/composite4.glsl b/shaders/program/composite4.glsl new file mode 100644 index 0000000..91ae266 --- /dev/null +++ b/shaders/program/composite4.glsl @@ -0,0 +1,87 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform float viewWidth, viewHeight, aspectRatio; + +uniform sampler2D colortex0; + +//Optifine Constants// +const bool colortex0MipmapEnabled = true; + +//Common Variables// +float ph = 0.8 / min(360.0, viewHeight); +float pw = ph / aspectRatio; +vec2 view = vec2(1.0 / viewWidth, 1.0 / viewHeight); + +float weight[6] = float[6](0.0556, 0.1667, 0.2777, 0.2777, 0.1667, 0.0556); + +//Common Functions// +vec3 BloomTile(float lod, vec2 coord, vec2 offset) { + vec3 bloom = vec3(0.0), temp = vec3(0.0); + float scale = exp2(lod); + coord = (coord - offset) * scale; + vec2 padding = vec2(0.5) + 2.0 * view * scale; + + if (abs(coord.x - 0.5) < padding.x && abs(coord.y - 0.5) < padding.y) { + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 6; j++) { + float wg = weight[i] * weight[j]; + vec2 pixelOffset = vec2((float(i) - 2.5) * pw, (float(j) - 2.5) * ph); + vec2 sampleCoord = coord + pixelOffset * scale; + bloom += texture2D(colortex0, sampleCoord).rgb * wg; + } + } + } + + return bloom; +} + +#include "/lib/util/dither.glsl" + +//Program// +void main() { + vec2 bloomCoord = texCoord * viewHeight * 0.8 / min(360.0, viewHeight); + vec3 blur = BloomTile(1.0, bloomCoord, vec2(0.0 , 0.0 )); + blur += BloomTile(2.0, bloomCoord, vec2(0.50 , 0.0 ) + vec2( 4.0, 0.0) * view); + blur += BloomTile(3.0, bloomCoord, vec2(0.50 , 0.25 ) + vec2( 4.0, 4.0) * view); + blur += BloomTile(4.0, bloomCoord, vec2(0.625 , 0.25 ) + vec2( 8.0, 4.0) * view); + blur += BloomTile(5.0, bloomCoord, vec2(0.6875 , 0.25 ) + vec2(12.0, 4.0) * view); + blur += BloomTile(6.0, bloomCoord, vec2(0.625 , 0.3125) + vec2( 8.0, 8.0) * view); + blur += BloomTile(7.0, bloomCoord, vec2(0.640625 , 0.3125) + vec2(12.0, 8.0) * view); + + blur = pow(blur / 32.0, vec3(0.25)); + + blur = clamp(blur + (Bayer8(gl_FragCoord.xy) - 0.5) / 384.0, vec3(0.0), vec3(1.0)); + + /* DRAWBUFFERS:1 */ + gl_FragData[0] = vec4(blur, 1.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/composite5.glsl b/shaders/program/composite5.glsl new file mode 100644 index 0000000..8a17f00 --- /dev/null +++ b/shaders/program/composite5.glsl @@ -0,0 +1,429 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform int isEyeInWater; +uniform int worldTime; + +uniform float blindFactor, darknessFactor; +uniform float frameTimeCounter; +uniform float rainStrength; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform ivec2 eyeBrightnessSmooth; + +uniform sampler2D colortex0; +uniform sampler2D colortex1; +uniform sampler2D colortex2; +uniform sampler2D noisetex; +uniform sampler2D depthtex0; + +#ifdef DIRTY_LENS +uniform sampler2D depthtex2; +#endif + +#ifdef LENS_FLARE +uniform vec3 sunPosition; +uniform mat4 gbufferProjection; +#endif + +#ifdef UNDERGROUND_SKY +uniform vec3 cameraPosition; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform sampler2D colortex9; +#endif + +//Optifine Constants// +const bool colortex2Clear = false; + +#ifdef AUTO_EXPOSURE +const bool colortex0MipmapEnabled = true; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +const bool colortex9MipmapEnabled = true; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float pw = 1.0 / viewWidth; +float ph = 1.0 / viewHeight; + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color, vec3(0.299, 0.587, 0.114)); +} + +void UnderwaterDistort(inout vec2 texCoord) { + vec2 originalTexCoord = texCoord; + + texCoord += vec2( + cos(texCoord.y * 32.0 + frameTimeCounter * 3.0), + sin(texCoord.x * 32.0 + frameTimeCounter * 1.7) + ) * 0.0005; + + float mask = float( + texCoord.x > 0.0 && texCoord.x < 1.0 && + texCoord.y > 0.0 && texCoord.y < 1.0 + ) + ; + if (mask < 0.5) texCoord = originalTexCoord; +} + +void RetroDither(inout vec3 color, float dither) { + color.rgb = pow(color.rgb, vec3(0.25)); + float lenColor = length(color); + vec3 normColor = color / lenColor; + + dither = mix(dither, 0.5, exp(-2.0 * lenColor)) - 0.25; + color = normColor * floor(lenColor * 16.0 + dither * 1.7) / 16.0; + + color = max(pow(color.rgb, vec3(4.0)), vec3(0.0)); +} + +vec3 GetBloomTile(float lod, vec2 coord, vec2 offset) { + float scale = exp2(lod); + float resScale = 1.25 * min(360.0, viewHeight) / viewHeight; + vec3 bloom = texture2D(colortex1, (coord / scale + offset) * resScale).rgb; + bloom *= bloom; bloom *= bloom * 32.0; + return bloom; +} + +void Bloom(inout vec3 color, vec2 coord) { + vec2 view = vec2(1.0 / viewWidth, 1.0 / viewHeight); + vec3 blur1 = GetBloomTile(1.0, coord, vec2(0.0 , 0.0 ) + vec2( 0.5, 0.0) * view); + vec3 blur2 = GetBloomTile(2.0, coord, vec2(0.50 , 0.0 ) + vec2( 4.5, 0.0) * view); + vec3 blur3 = GetBloomTile(3.0, coord, vec2(0.50 , 0.25 ) + vec2( 4.5, 4.0) * view); + vec3 blur4 = GetBloomTile(4.0, coord, vec2(0.625 , 0.25 ) + vec2( 8.5, 4.0) * view); + vec3 blur5 = GetBloomTile(5.0, coord, vec2(0.6875 , 0.25 ) + vec2(12.5, 4.0) * view); + vec3 blur6 = GetBloomTile(6.0, coord, vec2(0.625 , 0.3125) + vec2( 8.5, 8.0) * view); + vec3 blur7 = GetBloomTile(7.0, coord, vec2(0.640625 , 0.3125) + vec2(12.5, 8.0) * view); + + #ifdef DIRTY_LENS + float newAspectRatio = 1.777777777777778 / aspectRatio; + vec2 scale = vec2(max(newAspectRatio, 1.0), max(1.0 / newAspectRatio, 1.0)); + float dirt = texture2D(depthtex2, (coord - 0.5) / scale + 0.5).r; + dirt *= length(blur6 / (1.0 + blur6)); + blur3 *= dirt * 2.0 + 1.0; + blur4 *= dirt * 4.0 + 1.0; + blur5 *= dirt * 8.0 + 1.0; + blur6 *= dirt * 16.0 + 1.0; + blur7 *= dirt * 32.0 + 1.0; + #endif + + #if BLOOM_RADIUS == 1 + vec3 blur = blur1; + #elif BLOOM_RADIUS == 2 + vec3 blur = (blur1 * 1.23 + blur2) / 2.23; + #elif BLOOM_RADIUS == 3 + vec3 blur = (blur1 * 1.71 + blur2 * 1.52 + blur3) / 4.23; + #elif BLOOM_RADIUS == 4 + vec3 blur = (blur1 * 2.46 + blur2 * 2.25 + blur3 * 1.71 + blur4) / 7.42; + #elif BLOOM_RADIUS == 5 + vec3 blur = (blur1 * 3.58 + blur2 * 3.35 + blur3 * 2.72 + blur4 * 1.87 + blur5) / 12.52; + #elif BLOOM_RADIUS == 6 + vec3 blur = (blur1 * 5.25 + blur2 * 4.97 + blur3 * 4.20 + blur4 * 3.13 + blur5 * 2.00 + blur6) / 20.55; + #elif BLOOM_RADIUS == 7 + vec3 blur = (blur1 * 7.76 + blur2 * 7.41 + blur3 * 6.43 + blur4 * 5.04 + blur5 * 3.51 + blur6 * 2.11 + blur7) / 33.26; + #endif + + #if BLOOM_CONTRAST == 0 + color = mix(color, blur, 0.2 * BLOOM_STRENGTH); + #else + vec3 bloomContrast = vec3(exp2(BLOOM_CONTRAST * 0.25)); + color = pow(color, bloomContrast); + blur = pow(blur, bloomContrast); + vec3 bloomStrength = pow(vec3(0.2 * BLOOM_STRENGTH), bloomContrast); + color = mix(color, blur, bloomStrength); + color = pow(color, 1.0 / bloomContrast); + #endif + +} + +void AutoExposure(inout vec3 color, inout float exposure, float tempExposure) { + float exposureLod = log2(viewHeight * AUTO_EXPOSURE_RADIUS); + + exposure = length(texture2DLod(colortex0, vec2(0.5), exposureLod).rgb); + exposure = max(exposure, 0.0001); + + color /= 2.0 * tempExposure + 0.125; +} + +void ColorGrading(inout vec3 color) { + vec3 cgColor = pow(color.r, CG_RC) * pow(vec3(CG_RR, CG_RG, CG_RB) / 255.0, vec3(2.2)) + + pow(color.g, CG_GC) * pow(vec3(CG_GR, CG_GG, CG_GB) / 255.0, vec3(2.2)) + + pow(color.b, CG_BC) * pow(vec3(CG_BR, CG_BG, CG_BB) / 255.0, vec3(2.2)); + vec3 cgMin = pow(vec3(CG_RM, CG_GM, CG_BM) / 255.0, vec3(2.2)); + color = (cgColor * (1.0 - cgMin) + cgMin) * vec3(CG_RI, CG_GI, CG_BI); + + vec3 cgTint = pow(vec3(CG_TR, CG_TG, CG_TB) / 255.0, vec3(2.2)) * GetLuminance(color) * CG_TI; + color = mix(color, cgTint, CG_TM); +} + +vec3 RGB2HSV(vec3 c){ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +vec3 HSV2RGB(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void Notorious6Test(inout vec3 color) { + vec2 testCoord = texCoord * vec2(8.0,6.0) - vec2(3.5, 1.0); + + // if (testCoord.x > 0 && testCoord.x < 1 && testCoord.y > 0 && testCoord.y < 1){ + // float h = floor((1.0 - testCoord.y) * 18.0) / 18.0; + + // color = pow(HSV2RGB(vec3(h, 1.0, 1.0)), vec3(2.2)); + // color *= exp2(floor(testCoord.x * 20.0) - 10.0); + + // color /= exp2(2.0 + EXPOSURE); + // } + + if (testCoord.x > -2 && testCoord.x < 3 && testCoord.y > 0 && testCoord.y < 1){ + float h = floor((1.0 - testCoord.y) * 18.0) / 18.0; + float s = pow(floor(testCoord.x) * 0.25 + 0.5, 0.5); + + color = pow(HSV2RGB(vec3(h, s, 1.0)), vec3(2.2)); + color *= exp2(floor(fract(testCoord.x) * 20.0) - 10.0); + + color /= exp2(2.0 + EXPOSURE); + } +} + +mat3 inverseMatrix(mat3 m) { + float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2]; + float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2]; + float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2]; + + float b01 = a22 * a11 - a12 * a21; + float b11 = -a22 * a10 + a12 * a20; + float b21 = a21 * a10 - a11 * a20; + + float det = a00 * b01 + a01 * b11 + a02 * b21; + + return mat3( + b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11), + b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10), + b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10) + ) / det; +} + +void BSLTonemap(inout vec3 color) { + color *= exp2(2.0 + EXPOSURE); + + float s = TONEMAP_WHITE_PATH; + + float a = 0.03 * s; + float b = 0.01 * s; + float c = 1.0 - (a + b); + float d = 1.0 - (a + a); + + mat3 desatMatrix = mat3( + vec3(c, a, b), + vec3(a, d, a), + vec3(b, a, c) + ); + + mat3 satMatrix = inverseMatrix(desatMatrix); + + color *= desatMatrix; + + color = color / pow(pow(color, vec3(TONEMAP_WHITE_CURVE)) + 1.0, vec3(1.0 / TONEMAP_WHITE_CURVE)); + color = pow(color, mix(vec3(TONEMAP_LOWER_CURVE), vec3(TONEMAP_UPPER_CURVE), sqrt(color))); + + color *= satMatrix; + + color = clamp(color, vec3(0.0), vec3(1.0)); +} + +void ColorSaturation(inout vec3 color) { + float grayVibrance = (color.r + color.g + color.b) / 3.0; + float graySaturation = dot(color, vec3(0.299, 0.587, 0.114)); + + float mn = min(color.r, min(color.g, color.b)); + float mx = max(color.r, max(color.g, color.b)); + float sat = (1.0 - (mx - mn)) * (1.0 - mx) * grayVibrance * 5.0; + vec3 lightness = vec3((mn + mx) * 0.5); + + color = mix(color, mix(color, lightness, 1.0 - VIBRANCE), sat); + color = mix(color, lightness, (1.0 - lightness) * (2.0 - VIBRANCE) / 2.0 * abs(VIBRANCE - 1.0)); + color = color * SATURATION - graySaturation * (SATURATION - 1.0); +} + +#ifdef LENS_FLARE +vec2 GetLightPos() { + vec4 tpos = gbufferProjection * vec4(sunPosition, 1.0); + tpos.xyz /= tpos.w; + return tpos.xy / tpos.z * 0.5; +} +#endif + +//Includes// +#include "/lib/color/lightColor.glsl" + +#ifdef LENS_FLARE +#include "/lib/post/lensFlare.glsl" +#endif + +#ifdef RETRO_FILTER +#include "/lib/util/dither.glsl" +#endif + +//Program// +void main() { + vec2 newTexCoord = texCoord; + + #ifdef UNDERWATER_DISTORTION + if (isEyeInWater == 1.0) UnderwaterDistort(newTexCoord); + #endif + + vec3 color = texture2D(colortex0, newTexCoord).rgb; + + #ifdef AUTO_EXPOSURE + float tempExposure = texture2D(colortex2, vec2(pw, ph)).r; + #endif + + #ifdef LENS_FLARE + float tempVisibleSun = texture2D(colortex2, vec2(3.0 * pw, ph)).r; + #endif + + vec3 temporalColor = vec3(0.0); + #ifdef TAA + temporalColor = texture2D(colortex2, texCoord).gba; + #endif + + #ifdef RETRO_FILTER + float dither = Bayer8(gl_FragCoord.xy / RETRO_FILTER_SIZE); + RetroDither(color.rgb, dither); + #endif + + #ifdef BLOOM + Bloom(color, newTexCoord); + #endif + + #ifdef AUTO_EXPOSURE + float exposure = 1.0; + AutoExposure(color, exposure, tempExposure); + #endif + + // Notorious6Test(color); + + #ifdef COLOR_GRADING + ColorGrading(color); + #endif + + #ifdef VIGNETTE + float screenDist = length(texCoord - 0.5); + screenDist *= screenDist * 0.3535 + 0.75; + color *= 1.0 - screenDist * VIGNETTE_STRENGTH; + #endif + + BSLTonemap(color); + + #ifdef LENS_FLARE + vec2 lightPos = GetLightPos(); + float truePos = sign(sunVec.z); + + float visibleSun = float(texture2D(depthtex0, lightPos + 0.5).r >= 1.0); + visibleSun *= max(1.0 - isEyeInWater, eBS) * (1.0 - max(blindFactor, darknessFactor)) * (1.0 - rainStrength); + + #ifdef UNDERGROUND_SKY + visibleSun *= mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + #endif + + float multiplier = tempVisibleSun * LENS_FLARE_STRENGTH * (length(color) * 0.25 + 0.25); + + if (multiplier > 0.001) LensFlare(color, lightPos, truePos, multiplier); + #endif + + float temporalData = 0.0; + + #ifdef AUTO_EXPOSURE + if (texCoord.x < 2.0 * pw && texCoord.y < 2.0 * ph) + temporalData = mix(tempExposure, sqrt(exposure), AUTO_EXPOSURE_SPEED); + #endif + + #ifdef LENS_FLARE + if (texCoord.x > 2.0 * pw && texCoord.x < 4.0 * pw && texCoord.y < 2.0 * ph) + temporalData = mix(tempVisibleSun, visibleSun, 0.125); + #endif + + color = pow(color, vec3(1.0 / 2.2)); + + ColorSaturation(color); + + float filmGrain = texture2D(noisetex, texCoord * vec2(viewWidth, viewHeight) / 512.0).b; + color += (filmGrain - 0.5) / 256.0; + + #ifdef MULTICOLORED_BLOCKLIGHT + vec3 coloredLight = texture2DLod(colortex9, texCoord.xy, 2).rgb; + coloredLight *= 0.99; + #endif + + /* DRAWBUFFERS:12 */ + gl_FragData[0] = vec4(color, 1.0); + gl_FragData[1] = vec4(temporalData,temporalColor); + + #ifdef MULTICOLORED_BLOCKLIGHT + /*DRAWBUFFERS:129*/ + gl_FragData[2] = vec4(coloredLight, 1.0); + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); +} + +#endif \ No newline at end of file diff --git a/shaders/program/composite6.glsl b/shaders/program/composite6.glsl new file mode 100644 index 0000000..7a17a7b --- /dev/null +++ b/shaders/program/composite6.glsl @@ -0,0 +1,61 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform float frameTimeCounter; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform sampler2D colortex1; + +//Optifine Constants// +#ifdef LIGHT_SHAFT +const bool colortex1MipmapEnabled = true; +#endif + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color, vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/antialiasing/fxaa.glsl" + +//Program// +void main() { + vec3 color = texture2DLod(colortex1, texCoord, 0.0).rgb; + + #ifdef FXAA + color = FXAA311(color); + #endif + + /*DRAWBUFFERS:1*/ + gl_FragData[0] = vec4(color, 1.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/composite7.glsl b/shaders/program/composite7.glsl new file mode 100644 index 0000000..196247b --- /dev/null +++ b/shaders/program/composite7.glsl @@ -0,0 +1,80 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform int frameCounter; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform vec3 cameraPosition, previousCameraPosition; + +uniform mat4 gbufferPreviousProjection, gbufferProjectionInverse; +uniform mat4 gbufferPreviousModelView, gbufferModelViewInverse; + +uniform sampler2D colortex1; +uniform sampler2D colortex2; +uniform sampler2D depthtex1; + +#ifdef TAA_SELECTIVE +uniform sampler2D colortex3; +#endif + +//Optifine Constants// +#ifdef LIGHT_SHAFT +const bool colortex1MipmapEnabled = true; +#endif + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color, vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/antialiasing/taa.glsl" + +//Program// +void main() { + vec2 newTexCoord = texCoord; + #if defined TAA && TAA_MODE == 1 + vec2 offset = frameCounter % 2 == 0 ? vec2(0.5, 0.0) : vec2(0.0, 0.5); + newTexCoord += offset / vec2(viewWidth, viewHeight); + #endif + + vec3 color = texture2DLod(colortex1, newTexCoord, 0.0).rgb; + vec4 prev = vec4(texture2DLod(colortex2, texCoord, 0).r, 0.0, 0.0, 0.0); + + #ifdef TAA + prev = TemporalAA(color, prev.r); + #endif + + /*DRAWBUFFERS:12*/ + gl_FragData[0] = vec4(color, 1.0); + gl_FragData[1] = vec4(prev); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/deferred.glsl b/shaders/program/deferred.glsl new file mode 100644 index 0000000..3f4a8e1 --- /dev/null +++ b/shaders/program/deferred.glsl @@ -0,0 +1,77 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform int frameCounter; + +uniform float far, near; +uniform float frameTimeCounter; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform mat4 gbufferProjection; + +uniform sampler2D depthtex0; +uniform sampler2D noisetex; + +#ifdef DISTANT_HORIZONS +uniform float dhFarPlane, dhNearPlane; +uniform sampler2D dhDepthTex0; +#endif + +//Common Functions// +float GetLinearDepth(float depth) { + return (2.0 * near) / (far + near - depth * (far - near)); +} + +#ifdef DISTANT_HORIZONS +float GetDHLinearDepth(float depth) { + return (2.0 * dhNearPlane) / (dhFarPlane + dhNearPlane - depth * (dhFarPlane - dhNearPlane)); +} +#endif + +//Includes// +#include "/lib/lighting/ambientOcclusion.glsl" + +//Program// +void main() { + float blueNoise = texture2D(noisetex, gl_FragCoord.xy / 512.0).b; + float ao = AmbientOcclusion(blueNoise); + + #ifdef DISTANT_HORIZONS + float z = texture2D(depthtex0, texCoord.xy).r; + if (z == 1.0) { + ao = DHAmbientOcclusion(blueNoise); + } + #endif + + /* DRAWBUFFERS:4 */ + gl_FragData[0] = vec4(ao, 0.0, 0.0, 0.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif diff --git a/shaders/program/deferred1.glsl b/shaders/program/deferred1.glsl new file mode 100644 index 0000000..fc303d5 --- /dev/null +++ b/shaders/program/deferred1.glsl @@ -0,0 +1,545 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec, eastVec; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int moonPhase; +uniform int worldTime; + +uniform float blindFactor, darknessFactor, nightVision; +uniform float far, near; +uniform float frameTimeCounter; +uniform float rainStrength; +uniform float shadowFade, voidFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjection, gbufferPreviousProjection, gbufferProjectionInverse; +uniform mat4 gbufferModelView, gbufferPreviousModelView, gbufferModelViewInverse; + +uniform sampler2D colortex0; +uniform sampler2D colortex3; +uniform sampler2D depthtex0; +uniform sampler2D noisetex; + +#ifdef AO +uniform sampler2D colortex4; +#endif + +#if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex5; +uniform sampler2D colortex6; +uniform sampler2D colortex7; +// uniform sampler2D noisetex; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform sampler2D colortex8; +uniform sampler2D colortex9; +#endif + +#ifdef DISTANT_HORIZONS +uniform float dhFarPlane, dhNearPlane; + +uniform mat4 dhProjectionInverse; + +uniform sampler2D dhDepthTex0; +#endif + +//Optifine Constants// +#if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR +const bool colortex0MipmapEnabled = true; +const bool colortex5MipmapEnabled = true; +const bool colortex6MipmapEnabled = true; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +vec2 aoSampleOffsets[4] = vec2[4]( + vec2( 1.5, 0.5), + vec2(-0.5, 1.5), + vec2(-1.5, -0.5), + vec2( 0.5, -1.5) +); + +vec2 aoDepthOffsets[4] = vec2[4]( + vec2( 2.0, 1.0), + vec2(-1.0, 2.0), + vec2(-2.0, -1.0), + vec2( 1.0, -2.0) +); + +vec2 glowOffsets[16] = vec2[16]( + vec2( 0.0, -1.0), + vec2(-1.0, 0.0), + vec2( 1.0, 0.0), + vec2( 0.0, 1.0), + vec2(-1.0, -2.0), + vec2( 0.0, -2.0), + vec2( 1.0, -2.0), + vec2(-2.0, -1.0), + vec2( 2.0, -1.0), + vec2(-2.0, 0.0), + vec2( 2.0, 0.0), + vec2(-2.0, 1.0), + vec2( 2.0, 1.0), + vec2(-1.0, 2.0), + vec2( 0.0, 2.0), + vec2( 1.0, 2.0) +); + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +vec3 moonPhaseVecs[8] = vec3[8]( + vec3( 0.0 , 0.0 , 1.0 ), + vec3( 0.0 , -0.89, 0.45), + vec3( 0.0 , -1.0 , 0.0 ), + vec3( 0.0 , -0.45, -0.89), + vec3( 0.0 , 0.0 , -1.0 ), + vec3( 0.0 , 0.45, -0.89), + vec3( 0.0 , 1.0 , 0.0 ), + vec3( 0.0 , 0.89, 0.45) +); + +vec2 moonDiffuse[8] = vec2[8]( + vec2( 0.0 , 0.0 ), + vec2(-0.125, 1.0 ), + vec2(-0.2 , 0.625), + vec2(-0.8 , 0.375), + vec2(-0.75 , -0.25 ), + vec2(-0.8 , 0.375), + vec2(-0.2 , 0.625), + vec2(-0.125, 1.0 ) +); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float GetLinearDepth(float depth) { + return (2.0 * near) / (far + near - depth * (far - near)); +} + +#ifdef AO +float GetAmbientOcclusion(float z){ + float ao = 0.0; + float tw = 0.0; + float lz = GetLinearDepth(z); + + for(int i = 0; i < 4; i++){ + vec2 sampleOffset = aoSampleOffsets[i] / vec2(viewWidth, viewHeight); + vec2 depthOffset = aoDepthOffsets[i] / vec2(viewWidth, viewHeight); + float samplez = GetLinearDepth(texture2D(depthtex0, texCoord + depthOffset).r); + float wg = max(1.0 - 2.0 * far * abs(lz - samplez), 0.00001); + ao += texture2D(colortex4, texCoord + sampleOffset).r * wg; + tw += wg; + } + ao /= tw; + if(tw < 0.0001) ao = texture2D(colortex4, texCoord).r; + + return pow(ao, AO_STRENGTH); +} + +#ifdef DISTANT_HORIZONS +float GetDHLinearDepth(float depth) { + return (2.0 * dhNearPlane) / (dhFarPlane + dhNearPlane - depth * (dhFarPlane - dhNearPlane)); +} + +float GetDHAmbientOcclusion(float dhZ){ + float ao = 0.0; + float tw = 0.0; + float lz = GetDHLinearDepth(dhZ); + + for(int i = 0; i < 4; i++){ + vec2 sampleOffset = aoSampleOffsets[i] / vec2(viewWidth, viewHeight); + vec2 depthOffset = aoDepthOffsets[i] / vec2(viewWidth, viewHeight); + float samplez = GetDHLinearDepth(texture2D(dhDepthTex0, texCoord + depthOffset).r); + float wg = max(1.0 - 2.0 * far * abs(lz - samplez), 0.00001); + ao += texture2D(colortex4, texCoord + sampleOffset).r * wg; + tw += wg; + } + ao /= tw; + if(tw < 0.0001) ao = texture2D(colortex4, texCoord).r; + + return pow(ao, AO_STRENGTH + 1.0); +} +#endif +#endif + +void GlowOutline(inout vec3 color){ + for(int i = 0; i < 16; i++){ + vec2 glowOffset = glowOffsets[i] / vec2(viewWidth, viewHeight); + float glowSample = texture2D(colortex3, texCoord.xy + glowOffset).b; + if(glowSample < 0.5){ + if(i < 4) color.rgb = vec3(0.0); + else color.rgb = vec3(0.5); + break; + } + } +} + +//Includes// +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/skyColor.glsl" +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/waterColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" +#include "/lib/atmospherics/sky.glsl" +#include "/lib/atmospherics/fog.glsl" +#include "/lib/atmospherics/clouds.glsl" +#include "/lib/atmospherics/sunmoon.glsl" + +#ifdef OUTLINE_ENABLED +#include "/lib/util/outlineOffset.glsl" +#include "/lib/util/outlineDepth.glsl" +#include "/lib/atmospherics/waterFog.glsl" +#include "/lib/post/outline.glsl" +#endif + +#if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR +#include "/lib/util/encode.glsl" +#include "/lib/reflections/raytrace.glsl" +#include "/lib/reflections/complexFresnel.glsl" +#include "/lib/surface/materialDeferred.glsl" +#include "/lib/reflections/roughReflections.glsl" +#endif + +#ifdef END +vec3 GetEndSkyColor(vec3 viewPos) { + vec4 worldPos = gbufferModelViewInverse * vec4(viewPos.xyz, 1.0); + worldPos.xyz /= worldPos.w; + + worldPos = normalize(worldPos); + + vec3 sky = vec3(0.0); + vec3 absWorldPos = abs(worldPos.xyz); + float maxViewDir = absWorldPos.x; + sky = vec3(worldPos.yz, 0.0); + if (absWorldPos.y > maxViewDir) { + maxViewDir = absWorldPos.y; + sky = vec3(worldPos.xz, 0.0); + } + if (absWorldPos.z > maxViewDir) { + maxViewDir = absWorldPos.z; + sky = vec3(worldPos.xy, 0.0); + } + vec2 skyUV = sky.xy * 2.0; + skyUV = (floor(skyUV * 512.0) + 0.5) / 512.0; + float noise = texture2D(noisetex, skyUV).b; + sky = vec3(1.0) * pow(noise * 0.3 + 0.35, 2.0); + sky *= sky; + sky *= endCol.rgb * 0.03; + return sky; +} +#endif + +//Program// +void main() { + vec4 color = texture2D(colortex0, texCoord); + float z = texture2D(depthtex0, texCoord).r; + + #ifdef DISTANT_HORIZONS + float dhZ = texture2D(dhDepthTex0, texCoord).r; + #endif + + float dither = Bayer8(gl_FragCoord.xy); + + #if ALPHA_BLEND == 0 + if (z == 1.0) color.rgb = max(color.rgb - dither / vec3(128.0), vec3(0.0)); + color.rgb *= color.rgb; + #endif + + vec4 screenPos = vec4(texCoord, z, 1.0); + vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + + #ifdef OUTLINE_ENABLED + vec4 outerOutline = vec4(0.0), innerOutline = vec4(0.0); + Outline(color.rgb, false, outerOutline, innerOutline); + + color.rgb = mix(color.rgb, innerOutline.rgb, innerOutline.a); + #endif + + if (z < 1.0) { + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + float smoothness = 0.0, skyOcclusion = 0.0; + vec3 normal = vec3(0.0), fresnel3 = vec3(0.0); + + GetMaterials(smoothness, skyOcclusion, normal, fresnel3, texCoord); + + if (smoothness > 0.0) { + vec4 reflection = vec4(0.0); + vec3 skyReflection = vec3(0.0); + + float ssrMask = clamp(length(fresnel3) * 400.0 - 1.0, 0.0, 1.0); + if(ssrMask > 0.0) reflection = RoughReflection(viewPos.xyz, normal, dither, smoothness); + reflection.a *= ssrMask; + + if (reflection.a < 1.0) { + #ifdef OVERWORLD + vec3 skyRefPos = reflect(normalize(viewPos.xyz), normal); + skyReflection = GetSkyColor(skyRefPos, true); + + #ifdef REFLECTION_ROUGH + float cloudMixRate = smoothness * smoothness * (3.0 - 2.0 * smoothness); + #else + float cloudMixRate = 1.0; + #endif + + #ifdef AURORA + skyReflection += DrawAurora(skyRefPos * 100.0, dither, 12) * cloudMixRate; + #endif + + #if CLOUDS == 1 + vec4 cloud = DrawCloudSkybox(skyRefPos * 100.0, 1.0, dither, lightCol, ambientCol, false); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a * cloudMixRate); + #endif + #if CLOUDS == 2 + vec4 worldPos = gbufferModelViewInverse * vec4(viewPos.xyz, 1.0); + worldPos.xyz /= worldPos.w; + + vec3 cameraPos = GetReflectedCameraPos(worldPos.xyz, normal); + float cloudViewLength = 0.0; + + vec4 cloud = DrawCloudVolumetric(skyRefPos * 8192.0, cameraPos, 1.0, dither, lightCol, ambientCol, cloudViewLength, true); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a * cloudMixRate); + #endif + + float NoU = clamp(dot(normal, upVec), -1.0, 1.0); + float NoE = clamp(dot(normal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + + (0.5 - abs(NoE)) * (1.0 - abs(NoU)) * 0.1; + vanillaDiffuse *= vanillaDiffuse; + + #ifdef CLASSIC_EXPOSURE + skyReflection *= 4.0 - 3.0 * eBS; + #endif + + skyReflection = mix(vanillaDiffuse * minLightCol, skyReflection, skyOcclusion); + #endif + #ifdef NETHER + skyReflection = netherCol.rgb * 0.04; + #endif + #ifdef END + skyReflection = endCol.rgb * 0.025; + #endif + } + + reflection.rgb = max(mix(skyReflection, reflection.rgb, reflection.a), vec3(0.0)); + + color.rgb += reflection.rgb * fresnel3; + } + #endif + + #ifdef AO + color.rgb *= GetAmbientOcclusion(z); + #endif + + Fog(color.rgb, viewPos.xyz); + + #ifdef DISTANT_HORIZONS + } else if (dhZ < 1.0) { + z = 1.0 - 1e-5; + + vec4 dhScreenPos = vec4(texCoord, dhZ, 1.0); + viewPos = dhProjectionInverse * (dhScreenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + + #ifdef AO + color.rgb *= GetDHAmbientOcclusion(dhZ); + #endif + + Fog(color.rgb, viewPos.xyz); + #endif + } else { + #if defined OVERWORLD && defined SKY_DEFERRED + color.rgb += GetSkyColor(viewPos.xyz, false); + + #ifdef ROUND_SUN_MOON + vec3 lightMA = mix(lightMorning, lightEvening, mefade); + vec3 sunColor = mix(lightMA, sqrt(lightDay * lightMA * LIGHT_DI), timeBrightness); + vec3 moonColor = sqrt(lightNight); + + RoundSunMoon(color.rgb, viewPos.xyz, sunColor, moonColor); + #endif + + #ifdef STARS + if (moonVisibility > 0.0) DrawStars(color.rgb, viewPos.xyz); + #endif + + #ifdef AURORA + color.rgb += DrawAurora(viewPos.xyz, dither, 24); + #endif + + SunGlare(color.rgb, viewPos.xyz, lightCol); + + color.rgb *= 1.0 + nightVision; + #ifdef CLASSIC_EXPOSURE + color.rgb *= 4.0 - 3.0 * eBS; + #endif + #endif + #ifdef NETHER + color.rgb = netherCol.rgb * 0.0425; + #endif + #ifdef END + #ifdef SHADER_END_SKY + color.rgb = GetEndSkyColor(viewPos.xyz); + #endif + + #ifndef LIGHT_SHAFT + float VoL = dot(normalize(viewPos.xyz), lightVec); + VoL = pow(VoL * 0.5 + 0.5, 16.0) * 0.75 + 0.25; + color.rgb += endCol.rgb * 0.04 * VoL; + #endif + #endif + + if (isEyeInWater == 2) { + #ifdef EMISSIVE_RECOLOR + color.rgb = pow(blocklightCol / BLOCKLIGHT_I, vec3(4.0)) * 2.0; + #else + color.rgb = vec3(1.0, 0.3, 0.01); + #endif + } + + if (blindFactor > 0.0 || darknessFactor > 0.0) color.rgb *= 1.0 - max(blindFactor, darknessFactor); + } + + vec4 cloud = vec4(0.0); + float cloudDither = BayerCloud8(gl_FragCoord.xy); + + float cloudMaxDistance = 2.0 * far; + #ifdef DISTANT_HORIZONS + cloudMaxDistance = max(cloudMaxDistance, dhFarPlane); + #endif + + float cloudViewLength = cloudMaxDistance; + float cloudSampleZ = z; + + #ifdef OUTLINE_OUTER + DepthOutline(cloudSampleZ, depthtex0); + #endif + + #ifdef OVERWORLD + #if CLOUDS == 1 + cloud = DrawCloudSkybox(viewPos.xyz, cloudSampleZ, cloudDither, lightCol, ambientCol, false); + #endif + + #if CLOUDS == 2 + vec4 cloudViewPos = viewPos; + + #ifdef OUTLINE_OUTER + cloudViewPos = gbufferProjectionInverse * (vec4(texCoord, cloudSampleZ, 1.0) * 2.0 - 1.0); + cloudViewPos /= cloudViewPos.w; + #endif + + cloud = DrawCloudVolumetric(cloudViewPos.xyz, cameraPosition, cloudSampleZ, cloudDither, lightCol, ambientCol, cloudViewLength, false); + #endif + + #ifndef LIGHT_SHAFT + SunGlare(cloud.rgb, viewPos.xyz, lightCol); + #endif + + color.rgb = mix(color.rgb, cloud.rgb, cloud.a); + #endif + cloudViewLength /= cloudMaxDistance; + + #ifdef OUTLINE_ENABLED + outerOutline.rgb = mix(outerOutline.rgb, cloud.rgb, cloud.a); + color.rgb = mix(color.rgb, outerOutline.rgb, outerOutline.a); + #endif + + #if MC_VERSION >= 10900 && !defined IS_IRIS + float isGlowing = texture2D(colortex3, texCoord).b; + if (isGlowing > 0.5) GlowOutline(color.rgb); + #endif + + vec3 reflectionColor = pow(color.rgb, vec3(0.125)) * 0.5; + + #if ALPHA_BLEND == 0 + color.rgb = sqrt(max(color.rgb, vec3(0.0))); + #endif + + float reflectionMask = float(z < 1.0); + #ifdef DISTANT_HORIZONS + reflectionMask = max(reflectionMask, float(dhZ < 1.0)); + #endif + + /*DRAWBUFFERS:04 */ + gl_FragData[0] = color; + gl_FragData[1] = vec4(cloudViewLength, 0.0, 0.0, 1.0); + + #if !defined REFLECTION_PREVIOUS && REFRACTION == 0 + /*DRAWBUFFERS:045*/ + gl_FragData[2] = vec4(reflectionColor, reflectionMask); + #elif defined REFLECTION_PREVIOUS && REFRACTION > 0 + /*DRAWBUFFERS:046*/ + gl_FragData[2] = vec4(0.0, 0.0, 0.0, 1.0); + #elif !defined REFLECTION_PREVIOUS && REFRACTION > 0 + /*DRAWBUFFERS:0456*/ + gl_FragData[2] = vec4(reflectionColor, reflectionMask); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec, eastVec; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); +} + +#endif diff --git a/shaders/program/dh_terrain.glsl b/shaders/program/dh_terrain.glsl new file mode 100644 index 0000000..07ea8ed --- /dev/null +++ b/shaders/program/dh_terrain.glsl @@ -0,0 +1,290 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float mat; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float far; +uniform float frameTimeCounter; +uniform float blindFactor, darknessFactor, nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 dhProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D noisetex; + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#ifdef ADVANCED_MATERIALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +mat4 gbufferProjectionInverse = dhProjectionInverse; + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float GetBlueNoise3D(vec3 pos, vec3 normal) { + pos = (floor(pos + 0.01) + 0.5) / 512.0; + + vec3 worldNormal = (gbufferModelViewInverse * vec4(normal, 0.0)).xyz; + vec3 noise3D = vec3( + texture2D(noisetex, pos.yz).b, + texture2D(noisetex, pos.xz).b, + texture2D(noisetex, pos.xy).b + ); + + float noiseX = noise3D.x * abs(worldNormal.x); + float noiseY = noise3D.y * abs(worldNormal.y); + float noiseZ = noise3D.z * abs(worldNormal.z); + float noise = noiseX + noiseY + noiseZ; + + return noise - 0.5; +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +//Program// +void main() { + vec4 albedo = color; + vec3 newNormal = normal; + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float foliage = float(mat > 0.98 && mat < 1.02); + float leaves = float(mat > 1.98 && mat < 2.02); + float emissive = float(mat > 2.98 && mat < 3.02); + float lava = float(mat > 3.98 && mat < 4.02); + float candle = float(mat > 4.98 && mat < 5.02); + + float metalness = 0.0; + float emission = emissive + lava; + float subsurface = 0.0; + float basicSubsurface = leaves * 0.5; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0) * 0.4; + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + float dither = Bayer8(gl_FragCoord.xy); + + float viewLength = length(viewPos); + float minDist = (dither - 1.0) * 16.0 + far; + if (viewLength < minDist) { + discard; + } + + vec3 noisePos = (worldPos + cameraPosition) * 4.0; + float albedoLuma = GetLuminance(albedo.rgb); + float noiseAmount = (1.0 - albedoLuma * albedoLuma) * 0.05; + float albedoNoise = GetBlueNoise3D(noisePos, normal); + albedo.rgb = clamp(albedo.rgb + albedoNoise * noiseAmount, vec3(0.0), vec3(1.0)); + // albedo.rgb = vec3(albedoNoise + 0.5); + + #ifdef TOON_LIGHTMAP + lightmap = floor(lmCoord * 14.999) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + vec3 outNormal = newNormal; + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + #ifndef NORMAL_PLANTS + if (foliage > 0.5) vanillaDiffuse *= 1.8; + #endif + if (leaves > 0.5) { + float halfNoL = dot(newNormal, lightVec) * 0.5 + 0.5; + basicSubsurface *= halfNoL * step(length(albedo.rgb), 1.7); + } + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, 1.0, NoL, + vanillaDiffuse, 1.0, emission, subsurface, basicSubsurface); + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } else albedo.a = 0.0; + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float mat; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 dhProjection; +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#include "/lib/vertex/waving.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + int blockID = dhMaterialId; + + normal = normalize(gl_NormalMatrix * gl_Normal); + + color = gl_Color; + + mat = 0.0; + + if (blockID == DH_BLOCK_LEAVES){ + mat = 2.0; + color.rgb *= 1.3; + } + if (blockID == DH_BLOCK_ILLUMINATED) + mat = 3.0; + if (blockID == DH_BLOCK_LAVA) { + mat = 4.0; + lmCoord.x += 0.0667; + } + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + + #ifdef WORLD_CURVATURE + position.y -= WorldCurvature(position.xz); + #endif + + gl_Position = dhProjection * gbufferModelView * position; + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/dh_water.glsl b/shaders/program/dh_water.glsl new file mode 100644 index 0000000..7af1d5d --- /dev/null +++ b/shaders/program/dh_water.glsl @@ -0,0 +1,535 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float mat; +varying float dist; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal, binormal, tangent; +varying vec3 sunVec, upVec, eastVec; +varying vec3 viewVector; + +varying vec4 color; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float blindFactor, darknessFactor, nightVision; +uniform float dhFarPlane; +uniform float far, near; +uniform float frameTimeCounter; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade, voidFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition, previousCameraPosition; + +uniform mat4 dhProjection, dhPreviousProjection, dhProjectionInverse; +uniform mat4 gbufferModelView, gbufferPreviousModelView, gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D gaux2; +uniform sampler2D depthtex1; +uniform sampler2D depthtex2; +uniform sampler2D noisetex; + +#if CLOUDS == 2 +uniform sampler2D gaux1; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#ifdef ADVANCED_MATERIALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +mat4 gbufferProjection = dhProjection; +mat4 gbufferPreviousProjection = dhPreviousProjection; +mat4 gbufferProjectionInverse = dhProjectionInverse; + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float GetWaterHeightMap(vec3 worldPos, vec2 offset) { + float noise = 0.0; + + vec2 wind = vec2(frametime) * 0.5 * WATER_SPEED; + + worldPos.xz += worldPos.y * 0.2; + + #if WATER_NORMALS == 1 + offset /= 256.0; + float noiseA = texture2D(noisetex, (worldPos.xz - wind) / 256.0 + offset).g; + float noiseB = texture2D(noisetex, (worldPos.xz + wind) / 48.0 + offset).g; + #elif WATER_NORMALS == 2 + offset /= 256.0; + float noiseA = texture2D(noisetex, (worldPos.xz - wind) / 256.0 + offset).r; + float noiseB = texture2D(noisetex, (worldPos.xz + wind) / 96.0 + offset).r; + noiseA *= noiseA; noiseB *= noiseB; + #endif + + #if WATER_NORMALS > 0 + noise = mix(noiseA, noiseB, WATER_DETAIL); + #endif + + return noise * WATER_BUMP; +} + +vec3 GetParallaxWaves(vec3 worldPos, vec3 viewVector) { + vec3 parallaxPos = worldPos; + + for(int i = 0; i < 4; i++) { + float height = -1.25 * GetWaterHeightMap(parallaxPos, vec2(0.0)) + 0.25; + parallaxPos.xz += height * viewVector.xy / dist; + } + return parallaxPos; +} + +vec3 GetWaterNormal(vec3 worldPos, vec3 viewPos, vec3 viewVector) { + vec3 waterPos = worldPos + cameraPosition; + + #if WATER_PIXEL > 0 + waterPos = floor(waterPos * WATER_PIXEL) / WATER_PIXEL; + #endif + + #ifdef WATER_PARALLAX + waterPos = GetParallaxWaves(waterPos, viewVector); + #endif + + float normalOffset = WATER_SHARPNESS; + + float fresnel = pow(clamp(1.0 + dot(normalize(normal), normalize(viewPos)), 0.0, 1.0), 8.0); + float normalStrength = 0.35 * (1.0 - fresnel); + + float h1 = GetWaterHeightMap(waterPos, vec2( normalOffset, 0.0)); + float h2 = GetWaterHeightMap(waterPos, vec2(-normalOffset, 0.0)); + float h3 = GetWaterHeightMap(waterPos, vec2(0.0, normalOffset)); + float h4 = GetWaterHeightMap(waterPos, vec2(0.0, -normalOffset)); + + float xDelta = (h2 - h1) / normalOffset; + float yDelta = (h4 - h3) / normalOffset; + + vec3 normalMap = vec3(xDelta, yDelta, 1.0 - (xDelta * xDelta + yDelta * yDelta)); + return normalMap * normalStrength + vec3(0.0, 0.0, 1.0 - normalStrength); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/skyColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/color/waterColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" +#include "/lib/atmospherics/sky.glsl" +#include "/lib/atmospherics/clouds.glsl" +#include "/lib/atmospherics/fog.glsl" +#include "/lib/atmospherics/waterFog.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/reflections/raytrace.glsl" +#include "/lib/reflections/simpleReflections.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +//Program// +void main() { + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + + float opaqueDepth = texture2D(depthtex1, screenPos.xy).r; + if (opaqueDepth < 1.0) discard; + + vec4 albedo = color; + vec3 newNormal = normal; + float smoothness = 0.0; + vec3 lightAlbedo = vec3(0.0); + + vec3 vlAlbedo = vec3(1.0); + vec3 refraction = vec3(0.0); + + float cloudBlendOpacity = 1.0; + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float water = float(mat > 0.98 && mat < 1.02); + float glass = float(mat > 1.98 && mat < 2.02); + float translucent = float(mat > 2.98 && mat < 3.02); + float portal = float(mat > 3.98 && mat < 4.02); + + float metalness = 0.0; + float emission = portal; + float subsurface = 0.0; + float basicSubsurface = water; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0) * 0.4; + + #ifndef REFLECTION_TRANSLUCENT + glass = 0.0; + translucent = 0.0; + #endif + + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + float dither = Bayer8(gl_FragCoord.xy); + + float viewLength = length(viewPos); + float minDist = (dither - 1.0) * 16.0 + far; + if (viewLength < minDist) { + discard; + } + + #if CLOUDS == 2 + float cloudMaxDistance = 2.0 * far; + #ifdef DISTANT_HORIZONS + cloudMaxDistance = max(cloudMaxDistance, dhFarPlane); + #endif + + float cloudViewLength = texture2D(gaux1, screenPos.xy).r * cloudMaxDistance; + + cloudBlendOpacity = step(viewLength, cloudViewLength); + + if (cloudBlendOpacity == 0) { + discard; + } + // albedo.rgb *= fract(viewLength); + #endif + + vec3 normalMap = vec3(0.0, 0.0, 1.0); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + #if WATER_NORMALS == 1 || WATER_NORMALS == 2 + if (water > 0.5) { + normalMap = GetWaterNormal(worldPos, viewPos, viewVector); + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + } + #endif + + #if REFRACTION == 1 + refraction = vec3((newNormal.xy - normal.xy) * 0.5 + 0.5, float(albedo.a < 0.95) * water); + #elif REFRACTION == 2 + refraction = vec3((newNormal.xy - normal.xy) * 0.5 + 0.5, float(albedo.a < 0.95)); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lmCoord * 14.999) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + vlAlbedo = albedo.rgb; + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + if (water > 0.5) { + #if WATER_MODE == 0 + albedo.rgb = waterColor.rgb * waterColor.a; + #elif WATER_MODE == 1 + // do nothing + #elif WATER_MODE == 2 + float waterLuma = length(albedo.rgb / pow(color.rgb, vec3(2.2))) * 2.0; + albedo.rgb = waterLuma * waterColor.rgb * waterColor.a; + #elif WATER_MODE == 3 + albedo.rgb = color.rgb * color.rgb * 0.35; + #endif + #if WATER_ALPHA_MODE == 0 + albedo.a = waterAlpha; + #endif + vlAlbedo = sqrt(albedo.rgb); + baseReflectance = vec3(0.02); + } + + vlAlbedo = mix(vec3(1.0), vlAlbedo, sqrt(albedo.a)) * (1.0 - pow(albedo.a, 64.0)); + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, color.a, NoL, + vanillaDiffuse, 1.0, emission, subsurface, basicSubsurface); + + float fresnel = pow(clamp(1.0 + dot(newNormal, normalize(viewPos)), 0.0, 1.0), 5.0); + + if (water > 0.5 || ((translucent + glass) > 0.5 && albedo.a < 0.95)) { + #if REFLECTION > 0 + vec4 reflection = vec4(0.0); + vec3 skyReflection = vec3(0.0); + float reflectionMask = 0.0; + + fresnel = fresnel * 0.98 + 0.02; + fresnel*= max(1.0 - isEyeInWater * 0.5 * water, 0.5); + // fresnel = 1.0; + + #if REFLECTION == 2 + reflection = DHReflection(viewPos, newNormal, dither, reflectionMask); + reflection.rgb = pow(reflection.rgb * 2.0, vec3(8.0)); + #endif + + if (reflection.a < 1.0) { + #ifdef OVERWORLD + vec3 skyRefPos = reflect(normalize(viewPos), newNormal); + skyReflection = GetSkyColor(skyRefPos, true); + + #ifdef AURORA + skyReflection += DrawAurora(skyRefPos * 100.0, dither, 12); + #endif + + #if CLOUDS == 1 + vec4 cloud = DrawCloudSkybox(skyRefPos * 100.0, 1.0, dither, lightCol, ambientCol, true); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a); + #endif + #if CLOUDS == 2 + vec3 cameraPos = GetReflectedCameraPos(worldPos, newNormal); + float cloudViewLength = 0.0; + + vec4 cloud = DrawCloudVolumetric(skyRefPos * 8192.0, cameraPos, 1.0, dither, lightCol, ambientCol, cloudViewLength, true); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a); + #endif + + #ifdef CLASSIC_EXPOSURE + skyReflection *= 4.0 - 3.0 * eBS; + #endif + + float waterSkyOcclusion = lightmap.y; + #if REFLECTION_SKY_FALLOFF > 1 + waterSkyOcclusion = clamp(1.0 - (1.0 - waterSkyOcclusion) * REFLECTION_SKY_FALLOFF, 0.0, 1.0); + #endif + waterSkyOcclusion *= waterSkyOcclusion; + skyReflection *= waterSkyOcclusion; + #endif + + #ifdef NETHER + skyReflection = netherCol.rgb * 0.04; + #endif + + #ifdef END + skyReflection = endCol.rgb * 0.01; + #endif + + skyReflection *= clamp(1.0 - isEyeInWater, 0.0, 1.0); + } + + reflection.rgb = max(mix(skyReflection, reflection.rgb, reflection.a), vec3(0.0)); + + #if defined OVERWORLD || defined END + vec3 specularColor = GetSpecularColor(lightmap.y, 0.0, vec3(1.0)); + + vec3 specular = GetSpecularHighlight(newNormal, viewPos, 0.9, vec3(0.02), + specularColor, shadow, color.a); + #if ALPHA_BLEND == 0 + float specularAlpha = pow(mix(albedo.a, 1.0, fresnel), 2.2) * fresnel; + #else + float specularAlpha = mix(albedo.a , 1.0, fresnel) * fresnel; + #endif + + reflection.rgb += specular * (1.0 - reflectionMask) / specularAlpha; + #endif + + albedo.rgb = mix(albedo.rgb, reflection.rgb, fresnel); + albedo.a = mix(albedo.a, 1.0, fresnel); + #endif + } + + #if WATER_FOG == 1 + if((isEyeInWater == 0 && water > 0.5) || (isEyeInWater == 1 && water < 0.5)) { + float opaqueDepth = texture2D(depthtex1, screenPos.xy).r; + vec3 opaqueScreenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), opaqueDepth); + #ifdef TAA + vec3 opaqueViewPos = ToNDC(vec3(TAAJitter(opaqueScreenPos.xy, -0.5), opaqueScreenPos.z)); + #else + vec3 opaqueViewPos = ToNDC(opaqueScreenPos); + #endif + + vec4 waterFog = GetWaterFog(opaqueViewPos - viewPos.xyz); + albedo = mix(waterFog, vec4(albedo.rgb, 1.0), albedo.a); + } + #endif + + Fog(albedo.rgb, viewPos); + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + albedo.a *= cloudBlendOpacity; + + /* DRAWBUFFERS:01 */ + gl_FragData[0] = albedo; + gl_FragData[1] = vec4(vlAlbedo, 1.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float mat; +varying float dist; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal, binormal, tangent; +varying vec3 sunVec, upVec, eastVec; +varying vec3 viewVector; + +varying vec4 color; + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; +attribute vec4 at_tangent; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Common Functions// +float WavingWater(vec3 worldPos) { + worldPos += cameraPosition; + float fractY = fract(worldPos.y + 0.005); + + float wave = sin(6.2831854 * (frametime * 0.7 + worldPos.x * 0.14 + worldPos.z * 0.07)) + + sin(6.2831854 * (frametime * 0.5 + worldPos.x * 0.10 + worldPos.z * 0.20)); + if (fractY > 0.01) return wave * 0.0125; + + return 0.0; +} + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + int blockID = dhMaterialId; + + normal = normalize(gl_NormalMatrix * gl_Normal); + binormal = normalize(gbufferModelView[2].xyz); + tangent = normalize(gbufferModelView[0].xyz); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + color = gl_Color; + + mat = 0.0; + + if (blockID == DH_BLOCK_WATER) mat = 1.0; + + const vec2 sunRotationData = vec2( + cos(sunPathRotation * 0.01745329251994), + -sin(sunPathRotation * 0.01745329251994) + ); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = tangent; + + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + + #ifdef WAVING_WATER + float istopv = gl_MultiTexCoord0.t < mc_midTexCoord.t ? 1.0 : 0.0; + if (blockID == 300 || blockID == 302 || blockID == 304) position.y += WavingWater(position.xyz); + #endif + + #ifdef WORLD_CURVATURE + position.y -= WorldCurvature(position.xz); + #endif + + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + if (mat == 0.0) gl_Position.z -= 0.00001; + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/final.glsl b/shaders/program/final.glsl new file mode 100644 index 0000000..6d656c4 --- /dev/null +++ b/shaders/program/final.glsl @@ -0,0 +1,123 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform sampler2D colortex1; + +uniform float viewWidth, viewHeight; +uniform float aspectRatio, frameTimeCounter; + +//Optifine Constants// +/* +const int colortex0Format = R11F_G11F_B10F; //main scene +const int colortex1Format = RGB8; //raw translucent, vl, bloom, final scene +const int colortex2Format = RGBA16; //temporal data +const int colortex3Format = RGB8; //smoothness, sky occlusion, entity mask +const int gaux1Format = R8; //cloud alpha, ao +const int gaux2Format = RGB10_A2; //reflection image +const int gaux3Format = RGBA16; //opaque normals, refraction vector +const int gaux4Format = RGBA16; //fresnel +const int colortex8Format = RGB8; //colored light +const int colortex9Format = RGB16F; //colored light +*/ + +const bool shadowHardwareFiltering = true; +const float shadowDistanceRenderMul = 1.0; + +const int noiseTextureResolution = 512; + +const float drynessHalflife = 5.0; +const float wetnessHalflife = 30.0; + +//Common Functions// +#ifdef TAA +vec2 sharpenOffsets[4] = vec2[4]( + vec2( 1.0, 0.0), + vec2( 0.0, 1.0), + vec2(-1.0, 0.0), + vec2( 0.0, -1.0) +); + +void SharpenFilter(inout vec3 color, vec2 coord) { + float mult = MC_RENDER_QUALITY * 0.0625; + vec2 view = 1.0 / vec2(viewWidth, viewHeight); + + vec3 mincolor = color; + vec3 maxcolor = color; + + color *= mult * 4.0 + 1.0; + + for(int i = 0; i < 4; i++) { + vec2 offset = sharpenOffsets[i] * view; + vec3 colorSample = texture2DLod(colortex1, coord + offset, 0).rgb; + color -= colorSample * mult; + + mincolor = min(mincolor, colorSample); + maxcolor = max(maxcolor, colorSample); + } + + color = clamp(color, mincolor, maxcolor); +} +#endif + +#ifdef SHADOW +#endif + +//Program// +void main() { + vec2 newTexCoord = texCoord; + + #ifdef RETRO_FILTER + vec2 view = vec2(viewWidth, viewHeight) / float(RETRO_FILTER_SIZE); + float offset = (ceil(RETRO_FILTER_SIZE * 0.5) - 0.5) / float(RETRO_FILTER_SIZE); + newTexCoord = (floor(newTexCoord * view) + offset) / view; + #endif + + vec3 color = texture2DLod(colortex1, newTexCoord, 0).rgb; + + #if CHROMATIC_ABERRATION > 0 + float caStrength = 0.004 * CHROMATIC_ABERRATION; + vec2 caScale = vec2(1.0 / aspectRatio, 1.0); + color *= vec3(0.0,1.0,0.0); + color += texture2DLod(colortex1, mix(newTexCoord, vec2(0.5), caScale * -caStrength), 0).rgb * vec3(1.0,0.0,0.0); + color += texture2DLod(colortex1, mix(newTexCoord, vec2(0.5), caScale * -caStrength * 0.5), 0).rgb * vec3(0.5,0.5,0.0); + color += texture2DLod(colortex1, mix(newTexCoord, vec2(0.5), caScale * caStrength * 0.5), 0).rgb * vec3(0.0,0.5,0.5); + color += texture2DLod(colortex1, mix(newTexCoord, vec2(0.5), caScale* caStrength), 0).rgb * vec3(0.0,0.0,1.0); + + color /= vec3(1.5,2.0,1.5); + #endif + + #if defined FXAA && defined TAA + SharpenFilter(color, newTexCoord); + #endif + + gl_FragColor = vec4(color, 1.0); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_armor_glint.glsl b/shaders/program/gbuffers_armor_glint.glsl new file mode 100644 index 0000000..40e805e --- /dev/null +++ b/shaders/program/gbuffers_armor_glint.glsl @@ -0,0 +1,86 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec4 color; + +//Uniforms// +uniform ivec2 eyeBrightnessSmooth; + +uniform sampler2D texture; + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + albedo.rgb = pow(albedo.rgb,vec3(2.2)) / (4.0 - 3.0 * eBS); + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec4 color; + +//Uniforms// +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth; +uniform float viewHeight; +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +uniform mat4 gbufferModelView; +uniform mat4 gbufferModelViewInverse; +#endif + +//Includes// +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + color = gl_Color; + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + if (gl_ProjectionMatrix[2][2] < -0.5) position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #if defined TAA && !defined TAA_SELECTIVE + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_basic.glsl b/shaders/program/gbuffers_basic.glsl new file mode 100644 index 0000000..24fe678 --- /dev/null +++ b/shaders/program/gbuffers_basic.glsl @@ -0,0 +1,247 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D noisetex; + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +//Program// +void main() { + vec4 albedo = color; + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + albedo.a = albedo.a * 0.5 + 0.5; + + #ifdef WHITE_WORLD + if (albedo.a > 0.9) albedo.rgb = vec3(0.35); + #endif + + float NoL = clamp(dot(normal, lightVec) * 1.01 - 0.01, 0.0, 1.0); + + float NoU = clamp(dot(normal, upVec), -1.0, 1.0); + float NoE = clamp(dot(normal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, 1.0, NoL, + vanillaDiffuse, 1.0, 0.0, 0.0, 0.0); + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:08 */ + gl_FragData[1] = vec4(0.0,0.0,0.0,1.0); + + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:08367 */ + gl_FragData[2] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[3] = vec4(0.0, 0.0, float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[4] = vec4(0.0, 0.0, 0.0, 1.0); + #endif + #else + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[2] = vec4(0.0, 0.0, float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; +uniform mat4 gbufferProjectionInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + color = gl_Color; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gbufferProjectionInverse * ftransform(); + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_beaconbeam.glsl b/shaders/program/gbuffers_beaconbeam.glsl new file mode 100644 index 0000000..a3773d7 --- /dev/null +++ b/shaders/program/gbuffers_beaconbeam.glsl @@ -0,0 +1,104 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec4 color; + +//Uniforms// +uniform sampler2D texture; + +//Includes// +#include "/lib/color/blocklightColor.glsl" + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + + #ifdef EMISSIVE_RECOLOR + if (dot(color.rgb, vec3(1.0)) > 2.66) { + float ec = length(albedo.rgb); + albedo.rgb = blocklightCol * (ec * 0.63 / BLOCKLIGHT_I) + ec * 0.07; + } + #endif + + albedo.rgb = pow(albedo.rgb,vec3(2.2)) * 4.0; + + #ifdef WHITE_WORLD + albedo.rgb = vec3(2.0); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + albedo.a = sqrt(albedo.a); + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[2] = vec4(0.0, 0.0, float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec4 color; + +//Uniforms// +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth; +uniform float viewHeight; +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +uniform mat4 gbufferModelView; +uniform mat4 gbufferModelViewInverse; +#endif + +//Includes// +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + color = gl_Color; + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + if (gl_ProjectionMatrix[2][2] < -0.5) position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_block.glsl b/shaders/program/gbuffers_block.glsl new file mode 100644 index 0000000..05eee04 --- /dev/null +++ b/shaders/program/gbuffers_block.glsl @@ -0,0 +1,522 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" +#include "/lib/util/commonFunctions.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS + varying float dist; + + varying vec3 binormal, tangent; + + varying vec3 viewVector; + + varying vec4 vTexCoord, vTexCoordAM; + + flat varying vec2 absMidCoordPos; + varying vec2 signMidCoordPos; + +#endif + +//Uniforms// +uniform int blockEntityId; +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight, aspectRatio; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D noisetex; + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS +uniform ivec2 atlasSize; +vec2 atlasSizeM = atlasSize; + +uniform sampler2D specular; +uniform sampler2D normals; +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); + +vec2 mipx; +vec2 mipy; +float mipDelta; +float miplevel; +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +#if defined GENERATED_NORMALS + mat3 tbnMatrix = mat3( + tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z + ); + + vec2 midCoordPos = absMidCoordPos * signMidCoordPos; +#endif + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA + #include "/lib/util/jitter.glsl" +#endif + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS + #include "/lib/util/encode.glsl" + #include "/lib/reflections/complexFresnel.glsl" + #include "/lib/surface/materialGbuffers.glsl" + #include "/lib/surface/parallax.glsl" + + #ifdef GENERATED_NORMALS + #include "/lib/surface/generatedNormals.glsl" + #endif +#endif + + + +#ifdef MULTICOLORED_BLOCKLIGHT + #include "/lib/lighting/coloredBlocklight.glsl" +#endif + +#ifdef NORMAL_SKIP + #undef PARALLAX + #undef SELF_SHADOW +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + #ifdef GENERATED_NORMALS + vec3 colorP = albedo.rgb; + #endif + vec3 newNormal = normal, geoNormal = normal, shadowMult = vec3(1.0); + float smoothness = 0.0; + vec3 lightAlbedo = vec3(0.0); + + #ifdef ADVANCED_MATERIALS + vec2 newCoord = vTexCoord.st * absMidCoordPos + signMidCoordPos; + float surfaceDepth = 1.0; + float parallaxFade = clamp((dist - PARALLAX_DISTANCE) / 32.0, 0.0, 1.0); + + #if MC_VERSION >= 11300 + float skipAdvMat = float(blockEntityId == 10400); + #else + float skipAdvMat = float(blockEntityId == 63 || blockEntityId == 68); + #endif + + #ifdef PARALLAX + if (skipAdvMat < 0.5) { + newCoord = GetParallaxCoord(texCoord, parallaxFade, surfaceDepth); + albedo = texture2DGradARB(texture, newCoord, dcdx, dcdy) * color; + } + #endif + + float skyOcclusion = 0.0; + vec3 fresnel3 = vec3(0.0); + #endif + + if(blockEntityId == 10401) albedo.a = 0.0; + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float metalness = 0.0; + float emission = float(blockEntityId == 10205); + float subsurface = 0.0; + float basicSubsurface = float(blockEntityId == 10109) * 0.5; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0); + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #ifdef ADVANCED_MATERIALS + float f0 = 0.0, porosity = 0.5, ao = 1.0; + vec3 normalMap = vec3(0.0, 0.0, 1.0); + #ifdef GENERATED_NORMALS + #include "/lib/surface/materialHandling/blockEntityMaterials.glsl" + #else + GetMaterials(smoothness, metalness, f0, emission, subsurface, porosity, ao, normalMap, + newCoord, dcdx, dcdy); + #endif + + #ifdef NORMAL_SKIP + normalMap = vec3(0.0, 0.0, 1.0); + + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector) + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #elif defined GENERATED_NORMALS + GenerateNormals(newNormal, albedo.rgb); + #endif + + #ifdef EMISSIVE_RECOLOR + if (blockEntityId == 10205 && dot(color.rgb, vec3(1.0)) > 2.66) { + float ec = length(albedo.rgb); + albedo.rgb = blocklightCol * (ec * 0.63 / BLOCKLIGHT_I) + ec * 0.07; + } + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + lightAlbedo = albedo.rgb + 0.00001; + lightAlbedo = sqrt(normalize(lightAlbedo) * emission); + #endif + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + float parallaxShadow = 1.0; + #ifdef ADVANCED_MATERIALS + vec3 rawAlbedo = albedo.rgb * 0.999 + 0.001; + albedo.rgb *= ao; + + #ifdef REFLECTION_SPECULAR + albedo.rgb *= 1.0 - metalness * smoothness; + #endif + + float doParallax = 0.0; + #ifdef SELF_SHADOW + #ifdef OVERWORLD + doParallax = float(lightmap.y > 0.0 && NoL > 0.0); + #endif + #ifdef END + doParallax = float(NoL > 0.0); + #endif + + if (doParallax > 0.5) { + parallaxShadow = GetParallaxShadow(surfaceDepth, parallaxFade, newCoord, lightVec, + tbnMatrix); + } + #endif + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, color.a, NoL, + vanillaDiffuse, parallaxShadow, emission, subsurface, basicSubsurface); + + #ifdef ADVANCED_MATERIALS + skyOcclusion = lightmap.y; + + baseReflectance = mix(vec3(f0), rawAlbedo, metalness); + float fresnel = pow(clamp(1.0 + dot(newNormal, normalize(viewPos.xyz)), 0.0, 1.0), 5.0); + + fresnel3 = mix(baseReflectance, vec3(1.0), fresnel); + #if MATERIAL_FORMAT == 1 + if (f0 >= 0.9 && f0 < 1.0) { + baseReflectance = GetMetalCol(f0); + fresnel3 = ComplexFresnel(pow(fresnel, 0.2), f0); + #ifdef ALBEDO_METAL + fresnel3 *= rawAlbedo; + #endif + } + #endif + + float aoSquared = ao * ao; + shadow *= aoSquared; fresnel3 *= aoSquared; + albedo.rgb = albedo.rgb * (1.0 - fresnel3 * smoothness * smoothness * (1.0 - metalness)); + #endif + + #if (defined OVERWORLD || defined END) && (defined ADVANCED_MATERIALS || defined SPECULAR_HIGHLIGHT_ROUGH) + vec3 specularColor = GetSpecularColor(lightmap.y, metalness, baseReflectance); + + albedo.rgb += GetSpecularHighlight(newNormal, viewPos, smoothness, baseReflectance, + specularColor, shadow * vanillaDiffuse, color.a); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR && defined REFLECTION_ROUGH + normalMap = mix(vec3(0.0, 0.0, 1.0), normalMap, smoothness); + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + if(blockEntityId == 10205) albedo.a = sqrt(albedo.a); + #endif + } + + if(blockEntityId == 10401) { + vec2 portalCoord = gl_FragCoord.xy / vec2(viewWidth, viewHeight); + portalCoord = (portalCoord - 0.5) * vec2(aspectRatio, 1.0); + + vec3 portColSqrt = vec3(END_R, END_G, END_B) / 255.0 * END_I; + vec3 portCol = portColSqrt * portColSqrt * 0.05; + vec2 wind = vec2(0, frametime * 0.025); + + float portal = texture2D(noisetex, portalCoord * 0.1 + wind * 0.05).r * 0.25 + 0.375; + + #ifdef END + portal *= 0.5; + #endif + + portal+= texture2D(texture, portalCoord * 0.5 + wind).r * 1.4; + portal+= texture2D(texture, portalCoord + wind + 0.15).r; + portal+= texture2D(texture, portalCoord * 2.0 + wind + 0.30).r * 0.7; + portal+= texture2D(texture, portalCoord * 4.0 + wind + 0.45).r * 0.5; + + albedo.rgb = portal * portal * portCol.rgb; + albedo.a = 1.0; + + lightAlbedo = normalize(albedo.rgb * 20.0 + 0.00001); + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:08 */ + gl_FragData[1] = vec4(lightAlbedo, 1.0); + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:08367 */ + gl_FragData[2] = vec4(smoothness, skyOcclusion, 0.0, 1.0); + gl_FragData[3] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[4] = vec4(fresnel3, 1.0); + #endif + #else + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(smoothness, skyOcclusion, 0.0, 1.0); + gl_FragData[2] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[3] = vec4(fresnel3, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS + varying float dist; + + varying vec2 signMidCoordPos; + flat varying vec2 absMidCoordPos; + + varying vec3 binormal, tangent; + varying vec3 viewVector; + + varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; + +#ifdef ADVANCED_MATERIALS +attribute vec4 mc_midTexCoord; +attribute vec4 at_tangent; +#endif + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + if (normal != normal) normal = -upVec; // Mod Fix: Fixes Better Nether Fireflies + + + #ifdef ADVANCED_MATERIALS + binormal = normalize(gl_NormalMatrix * cross(at_tangent.xyz, gl_Normal.xyz) * at_tangent.w); + tangent = normalize(gl_NormalMatrix * at_tangent.xyz); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + vec2 midCoord = (gl_TextureMatrix[0] * mc_midTexCoord).st; + vec2 texMinMidCoord = texCoord - midCoord; + + vTexCoordAM.pq = abs(texMinMidCoord) * 2; + vTexCoordAM.st = min(texCoord, midCoord - texMinMidCoord); + + vTexCoord.xy = sign(texMinMidCoord) * 0.5 + 0.5; + + signMidCoordPos = sign(texMinMidCoord) * (5 + 5); + absMidCoordPos = abs(texMinMidCoord); + + + #endif + + color = gl_Color; + + if(color.a < 0.1) color.a = 1.0; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_clouds.glsl b/shaders/program/gbuffers_clouds.glsl new file mode 100644 index 0000000..af2567f --- /dev/null +++ b/shaders/program/gbuffers_clouds.glsl @@ -0,0 +1,155 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int isEyeInWater; +uniform int worldTime; + +uniform float rainStrength; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform sampler2D texture; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +//Includes// +#include "/lib/color/lightColor.glsl" +#include "/lib/util/spaceConversion.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +//Program// +void main() { + #if CLOUDS != 3 + discard; + #endif + + vec4 albedo = texture2D(texture, texCoord); + albedo.rgb = pow(albedo.rgb,vec3(2.2)); + + float NoU = clamp(dot(normal, upVec), -1.0, 1.0); + float NoE = clamp(dot(normal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (-0.333 + abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse = mix(vanillaDiffuse, 0.75, rainStrength * 0.75); + vanillaDiffuse*= vanillaDiffuse; + + albedo.rgb *= lightCol * vanillaDiffuse * CLOUD_BRIGHTNESS; + albedo.rgb *= mix(0.4 - 0.25 * rainStrength, 0.5 - 0.425 * rainStrength, sunVisibility); + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #if FOG_VANILLA_CLOUD > 0 + #if FOG_VANILLA_CLOUD == 1 + float vanillaFogEnd = 4.0; + #elif FOG_VANILLA_CLOUD == 2 + float vanillaFogEnd = 2.0; + #else + float vanillaFogEnd = 1.0; + #endif + + float worldDistance = length(worldPos.xz) / 256.0; + float vanillaFog = 1.0 - smoothstep(0.5, vanillaFogEnd, worldDistance); + + albedo.a *= color.a * vanillaFog; + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[2] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth; +uniform float viewHeight; +#include "/lib/util/jitter.glsl" +#endif + +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + color = gl_Color; + + normal = normalize(gl_NormalMatrix * gl_Normal); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + gl_Position = ftransform(); + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_damagedblock.glsl b/shaders/program/gbuffers_damagedblock.glsl new file mode 100644 index 0000000..305d22b --- /dev/null +++ b/shaders/program/gbuffers_damagedblock.glsl @@ -0,0 +1,79 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +uniform sampler2D texture; + +//Program// +void main() { + //Texture + vec4 albedo = texture2D(texture, texCoord); + + #if ALPHA_BLEND == 1 + albedo.rgb = pow(albedo.rgb,vec3(2.2)) * 2.25; + #endif + + #ifdef WHITE_WORLD + albedo.a = 0.0; + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +//Uniforms// +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth; +uniform float viewHeight; +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +uniform mat4 gbufferModelView; +uniform mat4 gbufferModelViewInverse; +#endif + +//Includes// +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_entities.glsl b/shaders/program/gbuffers_entities.glsl new file mode 100644 index 0000000..4b49c6f --- /dev/null +++ b/shaders/program/gbuffers_entities.glsl @@ -0,0 +1,459 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying float dist; + +varying vec3 binormal, tangent; +varying vec3 viewVector; + +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int entityId; +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform vec4 entityColor; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D noisetex; + +#ifdef ADVANCED_MATERIALS +uniform ivec2 atlasSize; + +uniform sampler2D specular; +uniform sampler2D normals; +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#ifdef ADVANCED_MATERIALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef ADVANCED_MATERIALS +#include "/lib/util/encode.glsl" +#include "/lib/reflections/complexFresnel.glsl" +#include "/lib/surface/materialGbuffers.glsl" +#include "/lib/surface/parallax.glsl" +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +#ifdef NORMAL_SKIP +#undef PARALLAX +#undef SELF_SHADOW +#endif + +#if MC_VERSION <= 10710 +#undef PARALLAX +#undef SELF_SHADOW +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + vec3 newNormal = normal; + float smoothness = 0.0; + + #ifdef ADVANCED_MATERIALS + vec2 newCoord = vTexCoord.st * vTexCoordAM.pq + vTexCoordAM.st; + float surfaceDepth = 1.0; + float parallaxFade = clamp((dist - PARALLAX_DISTANCE) / 32.0, 0.0, 1.0); + float skipAdvMat = float(entityId == 10100); + + #ifdef PARALLAX + if (skipAdvMat < 0.5) { + newCoord = GetParallaxCoord(texCoord, parallaxFade, surfaceDepth); + albedo = texture2DGradARB(texture, newCoord, dcdx, dcdy) * color; + } + #endif + + float skyOcclusion = 0.0; + vec3 fresnel3 = vec3(0.0); + #endif + + #ifdef ENTITY_FLASH + albedo.rgb = mix(albedo.rgb, entityColor.rgb, entityColor.a); + #endif + + float lightningBolt = float(entityId == 10101); + if(lightningBolt > 0.5) { + #ifdef OVERWORLD + albedo.rgb = weatherCol.rgb / weatherCol.a; + albedo.rgb *= albedo.rgb * albedo.rgb; + #endif + #ifdef NETHER + albedo.rgb = sqrt(netherCol.rgb / netherCol.a); + #endif + #ifdef END + albedo.rgb = endCol.rgb / endCol.a; + #endif + albedo.a = 1.0; + } + + if (albedo.a > 0.001 && lightningBolt < 0.5) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float metalness = 0.0; + float emission = float(entityColor.a > 0.05) * 0.125; + float subsurface = 0.0; + vec3 baseReflectance = vec3(0.04); + + emission *= dot(albedo.rgb, albedo.rgb) * 0.333; + + #ifndef ENTITY_FLASH + emission = 0.0; + #endif + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #if defined TAA && !defined TAA_SELECTIVE + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #ifdef ADVANCED_MATERIALS + float f0 = 0.0, porosity = 0.5, ao = 1.0; + vec3 normalMap = vec3(0.0, 0.0, 1.0); + + GetMaterials(smoothness, metalness, f0, emission, subsurface, porosity, ao, normalMap, + newCoord, dcdx, dcdy); + + #ifdef NORMAL_SKIP + normalMap = vec3(0.0, 0.0, 1.0); + #endif + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector && skipAdvMat < 0.5) + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + float parallaxShadow = 1.0; + #ifdef ADVANCED_MATERIALS + vec3 rawAlbedo = albedo.rgb * 0.999 + 0.001; + albedo.rgb *= ao; + + #ifdef REFLECTION_SPECULAR + albedo.rgb *= 1.0 - metalness * smoothness; + #endif + + float doParallax = 0.0; + #ifdef SELF_SHADOW + #ifdef OVERWORLD + doParallax = float(lightmap.y > 0.0 && NoL > 0.0); + #endif + #ifdef END + doParallax = float(NoL > 0.0); + #endif + + if (doParallax > 0.5) { + parallaxShadow = GetParallaxShadow(surfaceDepth, parallaxFade, newCoord, lightVec, + tbnMatrix); + } + #endif + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, 1.0, NoL, + vanillaDiffuse, parallaxShadow, emission, subsurface, 0.0); + + #ifdef ADVANCED_MATERIALS + skyOcclusion = lightmap.y; + + baseReflectance = mix(vec3(f0), rawAlbedo, metalness); + float fresnel = pow(clamp(1.0 + dot(newNormal, normalize(viewPos.xyz)), 0.0, 1.0), 5.0); + + fresnel3 = mix(baseReflectance, vec3(1.0), fresnel); + #if MATERIAL_FORMAT == 1 + if (f0 >= 0.9 && f0 < 1.0) { + baseReflectance = GetMetalCol(f0); + fresnel3 = ComplexFresnel(pow(fresnel, 0.2), f0); + #ifdef ALBEDO_METAL + fresnel3 *= rawAlbedo; + #endif + } + #endif + + float aoSquared = ao * ao; + shadow *= aoSquared; fresnel3 *= aoSquared; + albedo.rgb = albedo.rgb * (1.0 - fresnel3 * smoothness * smoothness * (1.0 - metalness)); + #endif + + #if (defined OVERWORLD || defined END) && (defined ADVANCED_MATERIALS || defined SPECULAR_HIGHLIGHT_ROUGH) + vec3 specularColor = GetSpecularColor(lightmap.y, metalness, baseReflectance); + + albedo.rgb += GetSpecularHighlight(newNormal, viewPos, smoothness, baseReflectance, + specularColor, shadow * vanillaDiffuse, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR && defined REFLECTION_ROUGH + normalMap = mix(vec3(0.0, 0.0, 1.0), normalMap, smoothness); + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:08 */ + gl_FragData[1] = vec4(0.0,0.0,0.0,1.0); + + #if defined TAA_SELECTIVE && !(defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR) + /* DRAWBUFFERS:083 */ + gl_FragData[2] = vec4(0.0, 0.0, 0.25, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:08367 */ + gl_FragData[2] = vec4(smoothness, skyOcclusion, 0.25, 1.0); + gl_FragData[3] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[4] = vec4(fresnel3, 1.0); + #endif + #else + #if defined TAA_SELECTIVE && !(defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR) + /* DRAWBUFFERS:03 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.25, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(smoothness, skyOcclusion, 0.25, 1.0); + gl_FragData[2] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[3] = vec4(fresnel3, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying float dist; + +varying vec3 binormal, tangent; +varying vec3 viewVector; + +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; + +#ifdef ADVANCED_MATERIALS +attribute vec4 mc_midTexCoord; +attribute vec4 at_tangent; +#endif + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + #ifdef ADVANCED_MATERIALS + tangent = normalize(gl_NormalMatrix * at_tangent.xyz); + binormal = normalize(gl_NormalMatrix * cross(at_tangent.xyz, gl_Normal.xyz) * at_tangent.w); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + vec2 midCoord = (gl_TextureMatrix[0] * mc_midTexCoord).st; + vec2 texMinMidCoord = texCoord - midCoord; + + vTexCoordAM.pq = abs(texMinMidCoord) * 2; + vTexCoordAM.st = min(texCoord, midCoord - texMinMidCoord); + + vTexCoord.xy = sign(texMinMidCoord) * 0.5 + 0.5; + #endif + + color = gl_Color; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #if defined TAA && !defined TAA_SELECTIVE + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_entities_glowing.glsl b/shaders/program/gbuffers_entities_glowing.glsl new file mode 100644 index 0000000..ce9efb4 --- /dev/null +++ b/shaders/program/gbuffers_entities_glowing.glsl @@ -0,0 +1,454 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying float dist; + +varying vec3 binormal, tangent; +varying vec3 viewVector; + +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int entityId; +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform vec4 entityColor; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D noisetex; + +#ifdef ADVANCED_MATERIALS +uniform ivec2 atlasSize; + +uniform sampler2D specular; +uniform sampler2D normals; +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#ifdef ADVANCED_MATERIALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef ADVANCED_MATERIALS +#include "/lib/util/encode.glsl" +#include "/lib/reflections/complexFresnel.glsl" +#include "/lib/surface/materialGbuffers.glsl" +#include "/lib/surface/parallax.glsl" +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +#ifdef NORMAL_SKIP +#undef PARALLAX +#undef SELF_SHADOW +#endif + +#if MC_VERSION <= 10710 +#undef PARALLAX +#undef SELF_SHADOW +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + vec3 newNormal = normal; + float smoothness = 0.0; + + #ifdef ADVANCED_MATERIALS + vec2 newCoord = vTexCoord.st * vTexCoordAM.pq + vTexCoordAM.st; + float surfaceDepth = 1.0; + float parallaxFade = clamp((dist - PARALLAX_DISTANCE) / 32.0, 0.0, 1.0); + float skipAdvMat = float(entityId == 10100); + + #ifdef PARALLAX + if (skipAdvMat < 0.5) { + newCoord = GetParallaxCoord(texCoord, parallaxFade, surfaceDepth); + albedo = texture2DGradARB(texture, newCoord, dcdx, dcdy) * color; + } + #endif + + float skyOcclusion = 0.0; + vec3 fresnel3 = vec3(0.0); + #endif + + #ifdef ENTITY_FLASH + albedo.rgb = mix(albedo.rgb, entityColor.rgb, entityColor.a); + #endif + + float lightningBolt = float(entityId == 10101); + if(lightningBolt > 0.5) { + #ifdef OVERWORLD + albedo.rgb = weatherCol.rgb / weatherCol.a; + albedo.rgb *= albedo.rgb * albedo.rgb; + #endif + #ifdef NETHER + albedo.rgb = sqrt(netherCol.rgb / netherCol.a); + #endif + #ifdef END + albedo.rgb = endCol.rgb / endCol.a; + #endif + albedo.a = 1.0; + } + + if (albedo.a > 0.001 && lightningBolt < 0.5) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float metalness = 0.0; + float emission = float(entityColor.a > 0.05); + float subsurface = 0.0; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0) * 0.125; + + #ifndef ENTITY_FLASH + emission = 0.0; + #endif + + float correctedZ = (gl_FragCoord.z * 2.0 - 1.0) * 100.0 * 0.5 + 0.5; + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), correctedZ); + #if defined TAA && !defined TAA_SELECTIVE + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #ifdef ADVANCED_MATERIALS + float f0 = 0.0, porosity = 0.5, ao = 1.0; + vec3 normalMap = vec3(0.0, 0.0, 1.0); + + GetMaterials(smoothness, metalness, f0, emission, subsurface, porosity, ao, normalMap, + newCoord, dcdx, dcdy); + + #ifdef NORMAL_SKIP + normalMap = vec3(0.0, 0.0, 1.0); + #endif + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector && skipAdvMat < 0.5) + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + float parallaxShadow = 1.0; + #ifdef ADVANCED_MATERIALS + vec3 rawAlbedo = albedo.rgb * 0.999 + 0.001; + albedo.rgb *= ao; + + #ifdef REFLECTION_SPECULAR + albedo.rgb *= 1.0 - metalness * smoothness; + #endif + + float doParallax = 0.0; + #ifdef SELF_SHADOW + #ifdef OVERWORLD + doParallax = float(lightmap.y > 0.0 && NoL > 0.0); + #endif + #ifdef END + doParallax = float(NoL > 0.0); + #endif + + if (doParallax > 0.5) { + parallaxShadow = GetParallaxShadow(surfaceDepth, parallaxFade, newCoord, lightVec, + tbnMatrix); + } + #endif + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, 1.0, NoL, + vanillaDiffuse, parallaxShadow, emission, subsurface, 0.0); + + #ifdef ADVANCED_MATERIALS + skyOcclusion = lightmap.y; + + baseReflectance = mix(vec3(f0), rawAlbedo, metalness); + float fresnel = pow(clamp(1.0 + dot(newNormal, normalize(viewPos.xyz)), 0.0, 1.0), 5.0); + + fresnel3 = mix(baseReflectance, vec3(1.0), fresnel); + #if MATERIAL_FORMAT == 1 + if (f0 >= 0.9 && f0 < 1.0) { + baseReflectance = GetMetalCol(f0); + fresnel3 = ComplexFresnel(pow(fresnel, 0.2), f0); + #ifdef ALBEDO_METAL + fresnel3 *= rawAlbedo; + #endif + } + #endif + + float aoSquared = ao * ao; + shadow *= aoSquared; fresnel3 *= aoSquared; + albedo.rgb = albedo.rgb * (1.0 - fresnel3 * smoothness * smoothness * (1.0 - metalness)); + #endif + + #if (defined OVERWORLD || defined END) && (defined ADVANCED_MATERIALS || defined SPECULAR_HIGHLIGHT_ROUGH) + vec3 specularColor = GetSpecularColor(lightmap.y, metalness, baseReflectance); + + albedo.rgb += GetSpecularHighlight(newNormal, viewPos, smoothness, baseReflectance, + specularColor, shadow * vanillaDiffuse, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR && defined REFLECTION_ROUGH + normalMap = mix(vec3(0.0, 0.0, 1.0), normalMap, smoothness); + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + + /* DRAWBUFFERS:03 */ + gl_FragData[0] = albedo; + gl_FragData[1] = vec4(0.0, 0.0, 1.0, 1.0); + + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:038 */ + gl_FragData[2] = vec4(0.0,0.0,0.0,1.0); + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:03867 */ + gl_FragData[1] = vec4(smoothness, skyOcclusion, 1.0, 1.0); + gl_FragData[3] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[4] = vec4(fresnel3, 1.0); + #endif + #else + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(smoothness, skyOcclusion, 1.0, 1.0); + gl_FragData[2] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[3] = vec4(fresnel3, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying float dist; + +varying vec3 binormal, tangent; +varying vec3 viewVector; + +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; + +#ifdef ADVANCED_MATERIALS +attribute vec4 mc_midTexCoord; +attribute vec4 at_tangent; +#endif + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + #ifdef ADVANCED_MATERIALS + tangent = normalize(gl_NormalMatrix * at_tangent.xyz); + binormal = normalize(gl_NormalMatrix * cross(at_tangent.xyz, gl_Normal.xyz) * at_tangent.w); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + vec2 midCoord = (gl_TextureMatrix[0] * mc_midTexCoord).st; + vec2 texMinMidCoord = texCoord - midCoord; + + vTexCoordAM.pq = abs(texMinMidCoord) * 2; + vTexCoordAM.st = min(texCoord, midCoord - texMinMidCoord); + + vTexCoord.xy = sign(texMinMidCoord) * 0.5 + 0.5; + #endif + + color = gl_Color; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + gl_Position.z *= 0.01; + + #if defined TAA && !defined TAA_SELECTIVE + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_hand.glsl b/shaders/program/gbuffers_hand.glsl new file mode 100644 index 0000000..6a74e4d --- /dev/null +++ b/shaders/program/gbuffers_hand.glsl @@ -0,0 +1,467 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float isMainHand; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying float dist; + +varying vec3 binormal, tangent; +varying vec3 viewVector; + +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int frameCounter; +uniform int heldItemId, heldItemId2; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D noisetex; + +#ifdef ADVANCED_MATERIALS +uniform ivec2 atlasSize; + +uniform sampler2D specular; +uniform sampler2D normals; +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#ifdef ADVANCED_MATERIALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float GetHandItem(int id) { + return float((heldItemId == id && isMainHand > 0.5) || (heldItemId2 == id && isMainHand < 0.5)); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef ADVANCED_MATERIALS +#include "/lib/util/encode.glsl" +#include "/lib/reflections/complexFresnel.glsl" +#include "/lib/surface/materialGbuffers.glsl" +#include "/lib/surface/parallax.glsl" +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +#ifdef NORMAL_SKIP +#undef PARALLAX +#undef SELF_SHADOW +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + vec3 newNormal = normal; + float smoothness = 0.0; + vec3 lightAlbedo = vec3(0.0); + + #ifdef ADVANCED_MATERIALS + vec2 newCoord = vTexCoord.st * vTexCoordAM.pq + vTexCoordAM.st; + float surfaceDepth = 1.0; + float skipAdvMat = float(heldItemId == 358 || (heldItemId2 == 358 && isMainHand < 0.5)); + + #ifdef PARALLAX + if (skipAdvMat < 0.5) { + newCoord = GetParallaxCoord(texCoord, 0.0, surfaceDepth); + albedo = texture2DGradARB(texture, newCoord, dcdx, dcdy) * color; + } + #endif + + float skyOcclusion = 0.0; + vec3 fresnel3 = vec3(0.0); + #endif + + if (albedo.a > 0.001) { + #ifdef TOON_LIGHTMAP + vec2 lightmap = floor(lmCoord * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #else + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + #endif + lightmap.x = max(lightmap.x, GetHandItem(213)); + + float emissive = (GetHandItem(50) + GetHandItem(89) + GetHandItem(213)); + + float metalness = 0.0; + float emission = emissive; + float subsurface = 0.0; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0) * 0.25; + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z + 0.38); + #if defined TAA && !defined TAA_SELECTIVE + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #ifdef ADVANCED_MATERIALS + float f0 = 0.0, porosity = 0.5, ao = 1.0; + vec3 normalMap = vec3(0.0, 0.0, 1.0); + + GetMaterials(smoothness, metalness, f0, emission, subsurface, porosity, ao, normalMap, + newCoord, dcdx, dcdy); + + #ifdef NORMAL_SKIP + normalMap = vec3(0.0, 0.0, 1.0); + #endif + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector) + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp(heldLightValue / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + float doRecolor = GetHandItem(89) + GetHandItem(213); + + float ec = GetLuminance(albedo.rgb) * 1.7; + #ifdef EMISSIVE_RECOLOR + if (doRecolor > 0.5) { + albedo.rgb = blocklightCol * pow(ec, 1.5) / (BLOCKLIGHT_I * BLOCKLIGHT_I); + albedo.rgb /= 0.7 * albedo.rgb + 0.7; + } + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + lightAlbedo = albedo.rgb + 0.00001; + lightAlbedo = sqrt(normalize(lightAlbedo) * emission * emissive); + #endif + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + float parallaxShadow = 1.0; + #ifdef ADVANCED_MATERIALS + vec3 rawAlbedo = albedo.rgb * 0.999 + 0.001; + albedo.rgb *= ao * ao; + + #ifdef REFLECTION_SPECULAR + albedo.rgb *= 1.0 - metalness * smoothness; + #endif + + float doParallax = 0.0; + #ifdef SELF_SHADOW + #ifdef OVERWORLD + doParallax = float(lightmap.y > 0.0 && NoL > 0.0); + #endif + #ifdef END + doParallax = float(NoL > 0.0); + #endif + + if (doParallax > 0.5 && skipAdvMat < 0.5) { + parallaxShadow = GetParallaxShadow(surfaceDepth, 0.0, newCoord, lightVec, tbnMatrix); + } + #endif + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, vec3(0.0), lightmap, 1.0, NoL, + vanillaDiffuse, parallaxShadow, emission, subsurface, 0.0); + + #ifdef ADVANCED_MATERIALS + skyOcclusion = lightmap.y; + + baseReflectance = mix(vec3(f0), rawAlbedo, metalness); + float fresnel = pow(clamp(1.0 + dot(newNormal, normalize(viewPos.xyz)), 0.0, 1.0), 5.0); + + fresnel3 = mix(baseReflectance, vec3(1.0), fresnel); + #if MATERIAL_FORMAT == 1 + if (f0 >= 0.9 && f0 < 1.0) { + baseReflectance = GetMetalCol(f0); + fresnel3 = ComplexFresnel(pow(fresnel, 0.2), f0); + #ifdef ALBEDO_METAL + fresnel3 *= rawAlbedo; + #endif + } + #endif + + float aoSquared = ao * ao; + shadow *= aoSquared; fresnel3 *= aoSquared; + albedo.rgb = albedo.rgb * (1.0 - fresnel3 * smoothness * smoothness * (1.0 - metalness)); + #endif + + #if (defined OVERWORLD || defined END) && (defined ADVANCED_MATERIALS || defined SPECULAR_HIGHLIGHT_ROUGH) + vec3 specularColor = GetSpecularColor(lightmap.y, metalness, baseReflectance); + + albedo.rgb += GetSpecularHighlight(newNormal, viewPos, smoothness, baseReflectance, + specularColor, shadow * vanillaDiffuse, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR && defined REFLECTION_ROUGH + normalMap = mix(vec3(0.0, 0.0, 1.0), normalMap, smoothness); + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:08 */ + gl_FragData[1] = vec4(lightAlbedo,1.0); + + #if defined TAA_SELECTIVE && !(defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR) + /* DRAWBUFFERS:083 */ + gl_FragData[2] = vec4(0.0, 0.0, 0.25, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:08367 */ + gl_FragData[2] = vec4(smoothness, skyOcclusion, 0.25, 1.0); + gl_FragData[3] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[4] = vec4(fresnel3, 1.0); + #endif + #else + #if defined TAA_SELECTIVE && !(defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR) + /* DRAWBUFFERS:03 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.25, 1.0); + #endif + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(smoothness, skyOcclusion, 0.25, 1.0); + gl_FragData[2] = vec4(EncodeNormal(newNormal), float(gl_FragCoord.z < 1.0), 1.0); + gl_FragData[3] = vec4(fresnel3, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float isMainHand; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying float dist; + +varying vec3 binormal, tangent; +varying vec3 viewVector; + +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; +uniform mat4 gbufferProjection; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; + +#ifdef ADVANCED_MATERIALS +attribute vec4 mc_midTexCoord; +attribute vec4 at_tangent; +#endif + + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + #ifdef ADVANCED_MATERIALS + binormal = normalize(gl_NormalMatrix * cross(at_tangent.xyz, gl_Normal.xyz) * at_tangent.w); + tangent = normalize(gl_NormalMatrix * at_tangent.xyz); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + vec2 midCoord = (gl_TextureMatrix[0] * mc_midTexCoord).st; + vec2 texMinMidCoord = texCoord - midCoord; + + vTexCoordAM.pq = abs(texMinMidCoord) * 2; + vTexCoordAM.st = min(texCoord, midCoord - texMinMidCoord); + + vTexCoord.xy = sign(texMinMidCoord) * 0.5 + 0.5; + #endif + + color = gl_Color; + + isMainHand = float(gl_ModelViewMatrix[3][0] > 0.0); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + if (gl_ProjectionMatrix[2][2] < -0.5) position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #if defined TAA && !defined TAA_SELECTIVE + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif + + #if MC_VERSION >= 11500 + isMainHand = float(gl_Position.x > 0.0); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_skybasic.glsl b/shaders/program/gbuffers_skybasic.glsl new file mode 100644 index 0000000..4b5c883 --- /dev/null +++ b/shaders/program/gbuffers_skybasic.glsl @@ -0,0 +1,166 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float star; + +varying vec3 upVec, sunVec; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int moonPhase; +uniform int worldTime; + +uniform float blindFactor, darknessFactor; +uniform float far, near; +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float shadowFade, voidFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView; +uniform mat4 gbufferModelViewInverse; +uniform mat4 gbufferProjectionInverse; + +uniform sampler2D noisetex; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +vec3 lightVec = sunVec * (1.0 - 2.0 * float(timeAngle > 0.5325 && timeAngle < 0.9675)); + +vec3 moonPhaseVecs[8] = vec3[8]( + vec3( 0.0 , 0.0 , 1.0 ), + vec3( 0.0 , -0.89, 0.45), + vec3( 0.0 , -1.0 , 0.0 ), + vec3( 0.0 , -0.45, -0.89), + vec3( 0.0 , 0.0 , -1.0 ), + vec3( 0.0 , 0.45, -0.89), + vec3( 0.0 , 1.0 , 0.0 ), + vec3( 0.0 , 0.89, 0.45) +); + +vec2 moonDiffuse[8] = vec2[8]( + vec2( 0.0 , 0.0 ), + vec2(-0.125, 1.0 ), + vec2(-0.2 , 0.625), + vec2(-0.8 , 0.375), + vec2(-0.75 , -0.25 ), + vec2(-0.8 , 0.375), + vec2(-0.2 , 0.625), + vec2(-0.125, 1.0 ) +); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/skyColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" +#include "/lib/atmospherics/clouds.glsl" +#include "/lib/atmospherics/sky.glsl" +#include "/lib/atmospherics/sunmoon.glsl" + +//Program// +void main() { + vec3 albedo = vec3(0.0); + + #if defined OVERWORLD && !defined SKY_DEFERRED + vec4 screenPos = vec4(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z, 1.0); + vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + + albedo = GetSkyColor(viewPos.xyz, false); + + #ifdef ROUND_SUN_MOON + vec3 lightMA = mix(lightMorning, lightEvening, mefade); + vec3 sunColor = mix(lightMA, sqrt(lightDay * lightMA * LIGHT_DI), timeBrightness); + vec3 moonColor = lightNight * 1.25; + + RoundSunMoon(albedo, viewPos.xyz, sunColor, moonColor); + #endif + + #ifdef STARS + if (moonVisibility > 0.0) DrawStars(albedo.rgb, viewPos.xyz); + #endif + + float dither = Bayer8(gl_FragCoord.xy); + + #ifdef AURORA + albedo.rgb += DrawAurora(viewPos.xyz, dither, 24); + #endif + + SunGlare(albedo, viewPos.xyz, lightCol); + + albedo.rgb *= 1.0 + nightVision; + #ifdef CLASSIC_EXPOSURE + albedo.rgb *= 4.0 - 3.0 * eBS; + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + albedo.rgb = albedo.rgb + dither / vec3(128.0); + #endif + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = vec4(albedo, 1.0 - star); +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float star; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + + gl_Position = ftransform(); + + star = float(gl_Color.r == gl_Color.g && gl_Color.g == gl_Color.b && gl_Color.r > 0.0); +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_skytextured.glsl b/shaders/program/gbuffers_skytextured.glsl new file mode 100644 index 0000000..69415a3 --- /dev/null +++ b/shaders/program/gbuffers_skytextured.glsl @@ -0,0 +1,175 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 upVec, sunVec; + +varying vec4 color; + +//Uniforms// +uniform int renderStage; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjectionInverse; + +uniform sampler2D texture; +uniform sampler2D gaux1; + +#ifndef MC_RENDER_STAGE_SUN +#define MC_RENDER_STAGE_SUN 1 +#endif + +#ifndef MC_RENDER_STAGE_MOON +#define MC_RENDER_STAGE_MOON 1 +#endif + +#ifndef MC_RENDER_STAGE_CUSTOM_SKY +#define MC_RENDER_STAGE_CUSTOM_SKY 1 +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +//Includes// +#include "/lib/color/dimensionColor.glsl" +#include "/lib/util/dither.glsl" + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord); + + #ifdef OVERWORLD + albedo *= color; + albedo.rgb = pow(albedo.rgb, vec3(2.2)) * albedo.a; + + #if MC_VERSION >= 11605 + vec4 screenPos = vec4(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z, 1.0); + vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + + float VoU = dot(normalize(viewPos.xyz), upVec); + + float sunFade = smoothstep(0.0, 1.0, 1.0 - pow(1.0 - max(VoU * 0.975 + 0.025, 0.0), 8.0)); + sunFade *= sunFade; + + if (renderStage == MC_RENDER_STAGE_CUSTOM_SKY) { + albedo.rgb *= SKYBOX_INTENSITY * SKYBOX_INTENSITY; + albedo.a *= SKYBOX_OPACITY; + } + if (renderStage == MC_RENDER_STAGE_SUN) { + albedo.rgb *= SUN_INTENSITY * SUN_INTENSITY * sunFade; + } + if (renderStage == MC_RENDER_STAGE_MOON) { + albedo.rgb *= MOON_INTENSITY * MOON_INTENSITY * sunFade; + } + #else + albedo.rgb *= SKYBOX_INTENSITY * SKYBOX_INTENSITY; + albedo.a *= SKYBOX_OPACITY; + #endif + + #ifdef ROUND_SUN_MOON + if (renderStage == MC_RENDER_STAGE_SUN || renderStage == MC_RENDER_STAGE_MOON) { + albedo *= 0.0; + } + #endif + + #ifdef SKY_DESATURATION + vec3 desat = GetLuminance(albedo.rgb) * pow(lightNight, vec3(1.6)) * 4.0; + albedo.rgb = mix(desat, albedo.rgb, sunVisibility); + #endif + + #ifdef UNDERGROUND_SKY + albedo.rgb *= mix(clamp((cameraPosition.y - 48.0) / 16.0, 0.0, 1.0), 1.0, eBS); + #endif + #endif + + #ifdef END + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #ifdef SKY_DESATURATION + albedo.rgb = GetLuminance(albedo.rgb) * endCol.rgb; + #endif + + albedo.rgb *= SKYBOX_INTENSITY * 0.02 * 16.0 / 16.0; + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec3 sunVec, upVec; + +varying vec4 color; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth; +uniform float viewHeight; +#include "/lib/util/jitter.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + color = gl_Color; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + + gl_Position = ftransform(); + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_spidereyes.glsl b/shaders/program/gbuffers_spidereyes.glsl new file mode 100644 index 0000000..996c68a --- /dev/null +++ b/shaders/program/gbuffers_spidereyes.glsl @@ -0,0 +1,92 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord; + +varying vec4 color; + +//Uniforms// +uniform sampler2D texture; + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + albedo.rgb = pow(albedo.rgb,vec3(2.2)) * 4.0; + + #ifdef WHITE_WORLD + albedo.rgb = vec3(2.0); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[2] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord; + +varying vec4 color; + +//Uniforms// +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth; +uniform float viewHeight; +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +uniform mat4 gbufferModelView; +uniform mat4 gbufferModelViewInverse; +#endif + +//Includes// +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + color = gl_Color; + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #if defined TAA && !defined TAA_SELECTIVE + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_terrain.glsl b/shaders/program/gbuffers_terrain.glsl new file mode 100644 index 0000000..fe587ca --- /dev/null +++ b/shaders/program/gbuffers_terrain.glsl @@ -0,0 +1,709 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float mat, recolor; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec, northVec; + +varying vec4 color; + +varying vec4 glColor; + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS + varying float dist; + + varying vec3 binormal, tangent; + + varying vec3 viewVector; + + varying vec4 vTexCoord, vTexCoordAM; + + flat varying vec2 absMidCoordPos; + varying vec2 signMidCoordPos; + +#endif + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float nightVision; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; + +uniform sampler2D noisetex; + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS + uniform ivec2 atlasSize; + vec2 atlasSizeM = atlasSize; + + uniform sampler2D specular; + uniform sampler2D normals; + + #ifdef REFLECTION_RAIN + uniform float wetness; + + uniform mat4 gbufferModelView; + #endif +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +//Common Variables// + +float NdotU = dot(normal, upVec); +float NdotUmax0 = max(NdotU, 0.0); + +const float OSIEBCA = 1.0 / 255.0; +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +vec4 debugNormals; + +vec2 mipx; +vec2 mipy; +float mipDelta; +float miplevel; + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +#if defined GENERATED_NORMALS + mat3 tbnMatrix = mat3( + tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z + ); + + vec2 midCoordPos = absMidCoordPos * signMidCoordPos; +#endif + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float max0(float x) { + return max(x, 0.0); +} + +float min1(float x) { + return min(x, 1.0); +} + +float pow2(float x) { + return x * x; +} +vec2 pow2(vec2 x) { + return x * x; +} + +vec3 pow2(vec3 x) { + return x * x; +} +float pow1_5(float x) { // Faster pow(x, 1.5) approximation (that isn't accurate at all) if x is between 0 and 1 + return x - x * pow2(1.0 - x); // Thanks to SixthSurge +} +vec2 pow1_5(vec2 x) { + return x - x * pow2(1.0 - x); +} +vec3 pow1_5(vec3 x) { + return x - x * pow2(1.0 - x); +} + +bool CheckForColor(vec3 albedo, vec3 check) { // Thanks to Builderb0y + vec3 dif = albedo - check * 0.003921568; + return dif == clamp(dif, vec3(-0.001), vec3(0.001)); +} + +float GetMaxColorDif(vec3 color) { + vec3 dif = abs(vec3(color.r - color.g, color.g - color.b, color.r - color.b)); + return max(dif.r, max(dif.g, dif.b)); +} + +float smoothstep1(float x) { + return x * x * (3.0 - 2.0 * x); +} +vec2 smoothstep1(vec2 x) { + return x * x * (3.0 - 2.0 * x); +} +vec3 smoothstep1(vec3 x) { + return x * x * (3.0 - 2.0 * x); +} +float sqrt1(float x) { // Faster sqrt() approximation (that isn't accurate at all) if x is between 0 and 1 + return x * (2.0 - x); // Thanks to Builderb0y +} +vec2 sqrt1(vec2 x) { + return x * (2.0 - x); +} +vec3 sqrt1(vec3 x) { + return x * (2.0 - x); +} +vec4 sqrt1(vec4 x) { + return x * (2.0 - x); +} +vec3 ViewToPlayer(vec3 pos) { + return mat3(gbufferModelViewInverse) * pos + gbufferModelViewInverse[3].xyz; +} + +float sqrt3(float x) { + x = 1.0 - x; + x *= x; + x *= x; + x *= x; + return 1.0 - x; +} +vec2 sqrt3(vec2 x) { + x = 1.0 - x; + x *= x; + x *= x; + x *= x; + return 1.0 - x; +} +vec3 sqrt3(vec3 x) { + x = 1.0 - x; + x *= x; + x *= x; + x *= x; + return 1.0 - x; +} +vec4 sqrt3(vec4 x) { + x = 1.0 - x; + x *= x; + x *= x; + x *= x; + return 1.0 - x; +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#if defined ADVANCED_MATERIALS || defined GENERATED_NORMALS + #include "/lib/util/encode.glsl" + #include "/lib/reflections/complexFresnel.glsl" + #include "/lib/surface/directionalLightmap.glsl" + #include "/lib/surface/materialGbuffers.glsl" + #include "/lib/surface/parallax.glsl" + + #ifdef GENERATED_NORMALS + #include "/lib/surface/generatedNormals.glsl" + #endif + + #ifdef REFLECTION_RAIN + #include "/lib/reflections/rainPuddles.glsl" + #endif +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * vec4(color.rgb, 1.0); + vec3 newNormal = normal; + float smoothnessD = 0.0, materialMask = 0.0, skyLightFactor = 0.0; + float smoothness = 0.0; + vec3 lightAlbedo = vec3(0.0); + int subsurfaceMode = 0; + float smoothnessG = 0.0, highlightMult = 1.0, emission = 0.0; + vec2 lmCoordM = lmCoord; + + #ifdef ADVANCED_MATERIALS + vec2 newCoord = vTexCoord.st * vTexCoordAM.pq + vTexCoordAM.st; + float surfaceDepth = 1.0; + float parallaxFade = clamp((dist - PARALLAX_DISTANCE) / 32.0, 0.0, 1.0); + float skipAdvMat = float(mat > 3.98 && mat < 4.02); + + #ifdef PARALLAX + if(skipAdvMat < 0.5) { + newCoord = GetParallaxCoord(texCoord, parallaxFade, surfaceDepth); + albedo = texture2DGradARB(texture, newCoord, dcdx, dcdy) * vec4(color.rgb, 1.0); + } + #endif + + float skyOcclusion = 0.0; + vec3 fresnel3 = vec3(0.0); + #endif + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float foliage = float(mat > 0.98 && mat < 1.02); + float leaves = float(mat > 1.98 && mat < 2.02); + float emissive = float(mat > 2.98 && mat < 3.02); + float lava = float(mat > 3.98 && mat < 4.02); + float candle = float(mat > 4.98 && mat < 5.02); + + float metalness = 0.0; + float emission = (emissive + candle + lava); + float subsurface = 0.0; + float basicSubsurface = (foliage + candle) * 0.5 + leaves; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0) * 0.4; + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + vec3 playerPos = ViewToPlayer(viewPos); + float lViewPos = length(viewPos); + + bool noSmoothLighting = false, noDirectionalShading = false, noVanillaAO = false, centerShadowBias = false, noGeneratedNormals = false, doTileRandomisation = true; + + #ifdef ADVANCED_MATERIALS + float f0 = 0.0, porosity = 0.5, ao = 1.0; + vec3 normalMap = vec3(0.0, 0.0, 1.0); + GetMaterials(smoothness, metalness, f0, emission, subsurface, porosity, ao, normalMap, + newCoord, dcdx, dcdy); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + #ifndef GENERATED_NORMALS + if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector) + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + #endif + #endif + + #ifdef GENERATED_NORMALS + // #include "/lib/materials/materialHandling/terrainMaterials.glsl" + GenerateNormals(newNormal, albedo.rgb); + #endif + debugNormals = vec4(newNormal , 1.0); + + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #ifdef EMISSIVE_RECOLOR + float ec = GetLuminance(albedo.rgb) * 1.7; + if (recolor > 0.5) { + albedo.rgb = blocklightCol * pow(ec, 1.5) / (BLOCKLIGHT_I * BLOCKLIGHT_I); + albedo.rgb /= 0.7 * albedo.rgb + 0.7; + } + if (lava > 0.5) { + albedo.rgb = pow(blocklightCol * ec / BLOCKLIGHT_I, vec3(2.0)); + albedo.rgb /= 0.5 * albedo.rgb + 0.5; + } + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + lightAlbedo = albedo.rgb + 0.00001; + if (lava > 0.5) { + #ifndef MCBL_LEGACY_COLOR + lightAlbedo = pow(lightAlbedo, vec3(0.25)); + #else + lightAlbedo = sqrt(lightAlbedo) * 0.98 + 0.02; + #endif + } + lightAlbedo = sqrt(normalize(lightAlbedo) * emission); + #endif + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + vec3 outNormal = newNormal; + #ifdef NORMAL_PLANTS + if (foliage > 0.5){ + newNormal = upVec; + + #ifdef ADVANCED_MATERIALS + newNormal = normalize(mix(outNormal, newNormal, normalMap.z * normalMap.z)); + #endif + } + #endif + + + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + #ifndef NORMAL_PLANTS + if (foliage > 0.5) vanillaDiffuse *= 1.8; + #endif + + float parallaxShadow = 1.0; + #ifdef ADVANCED_MATERIALS + vec3 rawAlbedo = albedo.rgb * 0.999 + 0.001; + albedo.rgb *= ao * ao; + + #ifdef REFLECTION_SPECULAR + albedo.rgb *= 1.0 - metalness * smoothness; + #endif + + float doParallax = 0.0; + #ifdef SELF_SHADOW + float parallaxNoL = dot(outNormal, lightVec); + #ifdef OVERWORLD + doParallax = float(lightmap.y > 0.0 && parallaxNoL > 0.0); + #endif + #ifdef END + doParallax = float(parallaxNoL > 0.0); + #endif + + if (doParallax > 0.5 && skipAdvMat < 0.5) { + parallaxShadow = GetParallaxShadow(surfaceDepth, parallaxFade, newCoord, lightVec, + tbnMatrix); + } + #endif + + #ifdef DIRECTIONAL_LIGHTMAP + mat3 lightmapTBN = GetLightmapTBN(viewPos); + lightmap.x = DirectionalLightmap(lightmap.x, lmCoord.x, outNormal, lightmapTBN); + lightmap.y = DirectionalLightmap(lightmap.y, lmCoord.y, outNormal, lightmapTBN); + #endif + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, color.a, NoL, + vanillaDiffuse, parallaxShadow, emission, subsurface, basicSubsurface); + + #ifdef ADVANCED_MATERIALS + float puddles = 0.0; + #ifdef REFLECTION_RAIN + float puddlesNoU = dot(outNormal, upVec); + + puddles = GetPuddles(worldPos, newCoord, lightmap.y, puddlesNoU, wetness); + puddles *= 1.0 - lava; + + ApplyPuddleToMaterial(puddles, albedo, smoothness, f0, porosity); + + if (puddles > 0.001 && rainStrength > 0.001) { + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + vec3 puddleNormal = GetPuddleNormal(worldPos, viewPos, tbnMatrix); + outNormal = normalize( + mix(outNormal, puddleNormal, puddles * sqrt(1.0 - porosity) * rainStrength) + ); + } + #endif + + skyOcclusion = lightmap.y; + + baseReflectance = mix(vec3(f0), rawAlbedo, metalness); + float fresnel = pow(clamp(1.0 + dot(outNormal, normalize(viewPos.xyz)), 0.0, 1.0), 5.0); + + fresnel3 = mix(baseReflectance, vec3(1.0), fresnel); + #if MATERIAL_FORMAT == 1 + if (f0 >= 0.9 && f0 < 1.0) { + baseReflectance = GetMetalCol(f0); + fresnel3 = ComplexFresnel(pow(fresnel, 0.2), f0); + #ifdef ALBEDO_METAL + fresnel3 *= rawAlbedo; + #endif + } + #endif + + float aoSquared = ao * ao; + shadow *= aoSquared; fresnel3 *= aoSquared; + albedo.rgb = albedo.rgb * (1.0 - fresnel3 * smoothness * smoothness * (1.0 - metalness)); + #endif + + #if (defined OVERWORLD || defined END) && (defined ADVANCED_MATERIALS || defined SPECULAR_HIGHLIGHT_ROUGH) + vec3 specularColor = GetSpecularColor(lightmap.y, metalness, baseReflectance); + + + albedo.rgb += GetSpecularHighlight(newNormal, viewPos, smoothness, baseReflectance, + specularColor, shadow * vanillaDiffuse, color.a); + #endif + + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR && defined REFLECTION_ROUGH + // newNormal = outNormal; + // if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector) { + // normalMap = mix(vec3(0.0, 0.0, 1.0), normalMap, smoothness); + // newNormal = mix(normalMap * tbnMatrix, newNormal, 1.0 - pow(1.0 - puddles, 4.0)); + // newNormal = clamp(normalize(newNormal), vec3(-1.0), vec3(1.0)); + // } + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } else albedo.a = 0.0; + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:08 */ + gl_FragData[1] = vec4(lightAlbedo, 1.0); + + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:08367 */ + gl_FragData[2] = vec4(smoothness, skyOcclusion, 0.0, 1.0); + gl_FragData[3] = vec4(newNormal, 1.0); + gl_FragData[4] = vec4(fresnel3, 1.0); + #endif + #else + #if defined ADVANCED_MATERIALS && defined REFLECTION_SPECULAR + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(smoothness, skyOcclusion, 0.0, 1.0); + gl_FragData[2] = vec4(newNormal, 1.0); + gl_FragData[3] = vec4(fresnel3, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float mat, recolor; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec, northVec; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS + varying float dist; + + varying vec2 signMidCoordPos; + flat varying vec2 absMidCoordPos; + + varying vec3 binormal, tangent; + varying vec3 viewVector; + + varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; + +#ifdef ADVANCED_MATERIALS +attribute vec4 at_tangent; +#endif + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#include "/lib/vertex/waving.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +vec3 GetSunVector() { + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + #ifdef OVERWORLD + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + return normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + #elif defined END + float ang = 0.0; + return normalize((gbufferModelView * vec4(vec3(0.0, sunRotationData * 2000.0), 1.0)).xyz); + #else + return vec3(0.0); + #endif +} + + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + int blockID = int(mod(max(mc_Entity.x - 10000, 0), 10000)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + #ifdef ADVANCED_MATERIALS + binormal = normalize(gl_NormalMatrix * cross(at_tangent.xyz, gl_Normal.xyz) * at_tangent.w); + tangent = normalize(gl_NormalMatrix * at_tangent.xyz); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + if (mc_Entity.x == 0) + viewVector /= 0.0; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + vec2 midCoord = (gl_TextureMatrix[0] * mc_midTexCoord).st; + vec2 texMinMidCoord = texCoord - midCoord; + + vTexCoordAM.pq = abs(texMinMidCoord) * 2; + vTexCoordAM.st = min(texCoord, midCoord - texMinMidCoord); + signMidCoordPos = sign(texMinMidCoord); + absMidCoordPos = abs(texMinMidCoord); + + vTexCoord.xy = sign(texMinMidCoord) * 0.5 + 0.5; + #endif + + color = gl_Color; + + mat = 0.0; recolor = 0.0; + + if (blockID >= 100 && blockID < 200) + mat = 1.0; + if (blockID == 105 || blockID == 106){ + mat = 2.0; + color.rgb *= 1.225; + } + if (blockID >= 200 && blockID < 300) + mat = 3.0; + if (blockID == 203){ + mat = 4.0; + lmCoord.x += 0.0667; + } + if (blockID == 208) + mat = 5.0; + + if (blockID == 201 || blockID == 205 || blockID == 206) + recolor = 1.0; + + if (blockID == 202) + lmCoord.x -= 0.0667; + + if (color.a < 0.1) + color.a = 1.0; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = GetSunVector(); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + northVec = normalize(gbufferModelView[2].xyz); + + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + + float istopv = gl_MultiTexCoord0.t < mc_midTexCoord.t ? 1.0 : 0.0; + position.xyz = WavingBlocks(position.xyz, blockID, istopv); + + #ifdef WORLD_CURVATURE + position.y -= WorldCurvature(position.xz); + #endif + + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_textured.glsl b/shaders/program/gbuffers_textured.glsl new file mode 100644 index 0000000..6f07ffb --- /dev/null +++ b/shaders/program/gbuffers_textured.glsl @@ -0,0 +1,316 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float blindFactor, darknessFactor, nightVision; +uniform float far, near; +uniform float frameTimeCounter; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade, voidFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferProjectionInverse; +uniform mat4 gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D noisetex; + +#ifdef SOFT_PARTICLES +uniform sampler2D depthtex0; +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform mat4 gbufferPreviousModelView; +uniform mat4 gbufferPreviousProjection; +uniform vec3 previousCameraPosition; + +uniform sampler2D colortex9; +#endif + +#ifdef DISTANT_HORIZONS +uniform float dhFarPlane; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +#ifdef SOFT_PARTICLES +float GetLinearDepth(float depth) { + return (2.0 * near) / (far + near - depth * (far - near)); +} +#endif + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/skyColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" +#include "/lib/atmospherics/sky.glsl" +#include "/lib/atmospherics/fog.glsl" +#include "/lib/lighting/forwardLighting.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * color; + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #if defined TAA && !defined TAA_SELECTIVE + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + float NoL = 1.0; + //NoL = clamp(dot(normal, lightVec) * 1.01 - 0.01, 0.0, 1.0); + + float NoU = clamp(dot(normal, upVec), -1.0, 1.0); + float NoE = clamp(dot(normal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, 1.0, NoL, + 1.0, 1.0, 0.0, 0.0, 0.0); + + #if defined FOG && MC_VERSION >= 11500 + Fog(albedo.rgb, viewPos); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + + #ifdef SOFT_PARTICLES + float linearZ = GetLinearDepth(gl_FragCoord.z) * (far - near); + float backZ = texture2D(depthtex0, gl_FragCoord.xy / vec2(viewWidth, viewHeight)).r; + float linearBackZ = GetLinearDepth(backZ) * (far - near); + + float difference = clamp(linearBackZ - linearZ, 0.0, 1.0); + difference = difference * difference * (3.0 - 2.0 * difference); + + float opaqueThreshold = fract(Bayer8(gl_FragCoord.xy) + frameTimeCounter * 8.0); + + if (albedo.a > 0.999) albedo.a *= float(difference > opaqueThreshold); + else albedo.a *= difference; + #endif + + /* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; + + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:08 */ + gl_FragData[1] = vec4(0.0,0.0,0.0,1.0); + + #if defined TAA_SELECTIVE && !defined ADVANCED_MATERIALS + /* DRAWBUFFERS:083 */ + gl_FragData[2] = vec4(0.0, 0.0, 0.25, 1.0); + #endif + + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:08367 */ + gl_FragData[2] = vec4(0.0, 0.0, 0.25, 1.0); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[4] = vec4(0.0, 0.0, 0.0, 1.0); + #endif + #else + #if defined TAA_SELECTIVE && !defined ADVANCED_MATERIALS + /* DRAWBUFFERS:03 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.25, 1.0); + #endif + + #ifdef ADVANCED_MATERIALS + /* DRAWBUFFERS:0367 */ + gl_FragData[1] = vec4(0.0, 0.0, 0.25, 1.0); + gl_FragData[2] = vec4(0.0, 0.0, 0.0, 1.0); + gl_FragData[3] = vec4(0.0, 0.0, 0.0, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 normal; +varying vec3 sunVec, upVec, eastVec; + +varying vec4 color; + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +#ifdef SOFT_PARTICLES +uniform float far, near; +#endif + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Common Functions// +#ifdef SOFT_PARTICLES +float GetLinearDepth(float depth) { + return (2.0 * near) / (far + near - depth * (far - near)); +} + +float GetLogarithmicDepth(float depth) { + return -(2.0 * near / depth - (far + near)) / (far - near); +} +#endif + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + + color = gl_Color; + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + #ifdef WORLD_CURVATURE + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + position.y -= WorldCurvature(position.xz); + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + #else + gl_Position = ftransform(); + #endif + + #ifdef SOFT_PARTICLES + gl_Position.z = GetLinearDepth(gl_Position.z / gl_Position.w) * (far - near); + gl_Position.z -= 0.25; + gl_Position.z = GetLogarithmicDepth(gl_Position.z / (far - near)) * gl_Position.w; + #endif + + #if defined TAA && !defined TAA_SELECTIVE + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_water.glsl b/shaders/program/gbuffers_water.glsl new file mode 100644 index 0000000..77a8dd8 --- /dev/null +++ b/shaders/program/gbuffers_water.glsl @@ -0,0 +1,775 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float mat; +varying float dist; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal, binormal, tangent; +varying vec3 sunVec, upVec, eastVec; +varying vec3 viewVector; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int frameCounter; +uniform int isEyeInWater; +uniform int worldTime; + +uniform float blindFactor, darknessFactor, nightVision; +uniform float far, near; +uniform float frameTimeCounter; +uniform float rainStrength; +uniform float screenBrightness; +uniform float shadowFade, voidFade; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform vec3 cameraPosition, previousCameraPosition; + +uniform mat4 gbufferProjection, gbufferPreviousProjection, gbufferProjectionInverse; +uniform mat4 gbufferModelView, gbufferPreviousModelView, gbufferModelViewInverse; +uniform mat4 shadowProjection; +uniform mat4 shadowModelView; + +uniform sampler2D texture; +uniform sampler2D gaux2; +uniform sampler2D depthtex1; +uniform sampler2D depthtex2; +uniform sampler2D noisetex; + +#ifdef ADVANCED_MATERIALS +uniform ivec2 atlasSize; + +uniform sampler2D specular; +uniform sampler2D normals; + +#ifdef REFLECTION_RAIN +uniform float wetness; +#endif +#endif + +#ifdef DYNAMIC_HANDLIGHT +uniform int heldBlockLightValue; +uniform int heldBlockLightValue2; +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +uniform sampler2D colortex8; +uniform sampler2D colortex9; +#endif + +#if CLOUDS == 2 +uniform sampler2D gaux1; +#endif + +#ifdef DISTANT_HORIZONS +uniform float dhFarPlane; +#endif + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp((dot( sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); +float moonVisibility = clamp((dot(-sunVec, upVec) + 0.05) * 10.0, 0.0, 1.0); + +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +#ifdef ADVANCED_MATERIALS +vec2 dcdx = dFdx(texCoord); +vec2 dcdy = dFdy(texCoord); +#endif + +vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0); + +//Common Functions// +float GetLuminance(vec3 color) { + return dot(color,vec3(0.299, 0.587, 0.114)); +} + +float GetWaterHeightMap(vec3 worldPos, vec2 offset) { + float noise = 0.0; + + vec2 wind = vec2(frametime) * 0.5 * WATER_SPEED; + + worldPos.xz += worldPos.y * 0.2; + + #if WATER_NORMALS == 1 + offset /= 256.0; + float noiseA = texture2D(noisetex, (worldPos.xz - wind) / 256.0 + offset).g; + float noiseB = texture2D(noisetex, (worldPos.xz + wind) / 48.0 + offset).g; + #elif WATER_NORMALS == 2 + offset /= 256.0; + float noiseA = texture2D(noisetex, (worldPos.xz - wind) / 256.0 + offset).r; + float noiseB = texture2D(noisetex, (worldPos.xz + wind) / 96.0 + offset).r; + noiseA *= noiseA; noiseB *= noiseB; + #endif + + #if WATER_NORMALS > 0 + noise = mix(noiseA, noiseB, WATER_DETAIL); + #endif + + return noise * WATER_BUMP; +} + +vec3 GetParallaxWaves(vec3 worldPos, vec3 viewVector) { + vec3 parallaxPos = worldPos; + + for(int i = 0; i < 4; i++) { + float height = -1.25 * GetWaterHeightMap(parallaxPos, vec2(0.0)) + 0.25; + parallaxPos.xz += height * viewVector.xy / dist; + } + return parallaxPos; +} + +vec3 GetWaterNormal(vec3 worldPos, vec3 viewPos, vec3 viewVector) { + vec3 waterPos = worldPos + cameraPosition; + + #if WATER_PIXEL > 0 + waterPos = floor(waterPos * WATER_PIXEL) / WATER_PIXEL; + #endif + + #ifdef WATER_PARALLAX + waterPos = GetParallaxWaves(waterPos, viewVector); + #endif + + float normalOffset = WATER_SHARPNESS; + + float fresnel = pow(clamp(1.0 + dot(normalize(normal), normalize(viewPos)), 0.0, 1.0), 8.0); + float normalStrength = 0.35 * (1.0 - fresnel); + + float h1 = GetWaterHeightMap(waterPos, vec2( normalOffset, 0.0)); + float h2 = GetWaterHeightMap(waterPos, vec2(-normalOffset, 0.0)); + float h3 = GetWaterHeightMap(waterPos, vec2(0.0, normalOffset)); + float h4 = GetWaterHeightMap(waterPos, vec2(0.0, -normalOffset)); + + float xDelta = (h2 - h1) / normalOffset; + float yDelta = (h4 - h3) / normalOffset; + + vec3 normalMap = vec3(xDelta, yDelta, 1.0 - (xDelta * xDelta + yDelta * yDelta)); + return normalMap * normalStrength + vec3(0.0, 0.0, 1.0 - normalStrength); +} + +//Includes// +#include "/lib/color/blocklightColor.glsl" +#include "/lib/color/dimensionColor.glsl" +#include "/lib/color/skyColor.glsl" +#include "/lib/color/specularColor.glsl" +#include "/lib/color/waterColor.glsl" +#include "/lib/util/dither.glsl" +#include "/lib/util/spaceConversion.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" +#include "/lib/atmospherics/sky.glsl" +#include "/lib/atmospherics/clouds.glsl" +#include "/lib/atmospherics/fog.glsl" +#include "/lib/atmospherics/waterFog.glsl" +#include "/lib/lighting/forwardLighting.glsl" +#include "/lib/reflections/raytrace.glsl" +#include "/lib/reflections/simpleReflections.glsl" +#include "/lib/surface/ggx.glsl" + +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef ADVANCED_MATERIALS +#include "/lib/reflections/complexFresnel.glsl" +#include "/lib/surface/directionalLightmap.glsl" +#include "/lib/surface/materialGbuffers.glsl" +#include "/lib/surface/parallax.glsl" + +#ifdef REFLECTION_RAIN +#include "/lib/reflections/rainPuddles.glsl" +#endif +#endif + +#ifdef MULTICOLORED_BLOCKLIGHT +#include "/lib/lighting/coloredBlocklight.glsl" +#endif + +//Program// +void main() { + vec4 albedo = texture2D(texture, texCoord) * vec4(color.rgb, 1.0); + vec3 newNormal = normal; + float smoothness = 0.0; + vec3 lightAlbedo = vec3(0.0); + + #ifdef ADVANCED_MATERIALS + vec2 newCoord = vTexCoord.st * vTexCoordAM.pq + vTexCoordAM.st; + float surfaceDepth = 1.0; + float parallaxFade = clamp((dist - PARALLAX_DISTANCE) / 32.0, 0.0, 1.0); + float skipAdvMat = float(mat > 0.98 && mat < 1.02); + + #ifdef PARALLAX + if(skipAdvMat < 0.5) { + newCoord = GetParallaxCoord(texCoord, parallaxFade, surfaceDepth); + albedo = texture2DGradARB(texture, newCoord, dcdx, dcdy) * vec4(color.rgb, 1.0); + } + #endif + #endif + + vec3 vlAlbedo = vec3(1.0); + vec3 refraction = vec3(0.0); + + float cloudBlendOpacity = 1.0; + + if (albedo.a > 0.001) { + vec2 lightmap = clamp(lmCoord, vec2(0.0), vec2(1.0)); + + float water = float(mat > 0.98 && mat < 1.02); + float glass = float(mat > 1.98 && mat < 2.02); + float translucent = float(mat > 2.98 && mat < 3.02); + float portal = float(mat > 3.98 && mat < 4.02); + + float metalness = 0.0; + float emission = portal; + float subsurface = 0.0; + float basicSubsurface = water; + vec3 baseReflectance = vec3(0.04); + + emission *= pow(max(max(albedo.r, albedo.g), albedo.b), 4.0) * 0.4; + + #ifndef REFLECTION_TRANSLUCENT + glass = 0.0; + translucent = 0.0; + #endif + + vec3 screenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z); + #ifdef TAA + vec3 viewPos = ToNDC(vec3(TAAJitter(screenPos.xy, -0.5), screenPos.z)); + #else + vec3 viewPos = ToNDC(screenPos); + #endif + vec3 worldPos = ToWorld(viewPos); + + float dither = Bayer8(gl_FragCoord.xy); + + #if CLOUDS == 2 + float cloudViewLength = texture2D(gaux1, screenPos.xy).r * (far * 2.0); + + float viewLength = length(viewPos); + cloudBlendOpacity = step(viewLength, cloudViewLength); + + if (cloudBlendOpacity == 0) { + discard; + } + // albedo.rgb *= fract(viewLength); + #endif + + vec3 normalMap = vec3(0.0, 0.0, 1.0); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + #if WATER_NORMALS == 1 || WATER_NORMALS == 2 + if (water > 0.5) { + normalMap = GetWaterNormal(worldPos, viewPos, viewVector); + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + } + #endif + + #ifdef ADVANCED_MATERIALS + float f0 = 0.0, porosity = 0.5, ao = 1.0, skyOcclusion = 0.0; + if (water < 0.5) { + GetMaterials(smoothness, metalness, f0, emission, subsurface, porosity, ao, normalMap, + newCoord, dcdx, dcdy); + + if ((normalMap.x > -0.999 || normalMap.y > -0.999) && viewVector == viewVector) + newNormal = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0)); + } + #endif + + #if REFRACTION == 1 + refraction = vec3((newNormal.xy - normal.xy) * 0.5 + 0.5, float(albedo.a < 0.95) * water); + #elif REFRACTION == 2 + refraction = vec3((newNormal.xy - normal.xy) * 0.5 + 0.5, float(albedo.a < 0.95)); + #endif + + #ifdef DYNAMIC_HANDLIGHT + float heldLightValue = max(float(heldBlockLightValue), float(heldBlockLightValue2)); + float handlight = clamp((heldLightValue - 2.0 * length(viewPos)) / 15.0, 0.0, 0.9333); + lightmap.x = max(lightmap.x, handlight); + #endif + + #ifdef TOON_LIGHTMAP + lightmap = floor(lightmap * 14.999 * (0.75 + 0.25 * color.a)) / 14.0; + lightmap = clamp(lightmap, vec2(0.0), vec2(1.0)); + #endif + + albedo.rgb = pow(albedo.rgb, vec3(2.2)); + + vlAlbedo = albedo.rgb; + + #ifdef MULTICOLORED_BLOCKLIGHT + vec3 opaquelightAlbedo = texture2D(colortex8, screenPos.xy).rgb; + if (water < 0.5) { + opaquelightAlbedo *= vlAlbedo; + } + lightAlbedo = albedo.rgb + 0.00001; + + if (portal > 0.5) { + lightAlbedo = lightAlbedo * 0.95 + 0.05; + } + + lightAlbedo = normalize(lightAlbedo + 0.00001) * emission; + lightAlbedo = mix(opaquelightAlbedo, sqrt(lightAlbedo), albedo.a); + #endif + + #ifdef WHITE_WORLD + albedo.rgb = vec3(0.35); + #endif + + if (water > 0.5) { + #if WATER_MODE == 0 + albedo.rgb = waterColor.rgb * waterColor.a; + #elif WATER_MODE == 1 + // do nothing + #elif WATER_MODE == 2 + float waterLuma = length(albedo.rgb / pow(color.rgb, vec3(2.2))) * 2.0; + albedo.rgb = waterLuma * waterColor.rgb * waterColor.a; + #elif WATER_MODE == 3 + albedo.rgb = color.rgb * color.rgb * 0.35; + #endif + #if WATER_ALPHA_MODE == 0 + albedo.a = waterAlpha; + #endif + vlAlbedo = sqrt(albedo.rgb); + baseReflectance = vec3(0.02); + } + + vlAlbedo = mix(vec3(1.0), vlAlbedo, sqrt(albedo.a)) * (1.0 - pow(albedo.a, 64.0)); + + float NoL = clamp(dot(newNormal, lightVec), 0.0, 1.0); + + float NoU = clamp(dot(newNormal, upVec), -1.0, 1.0); + float NoE = clamp(dot(newNormal, eastVec), -1.0, 1.0); + float vanillaDiffuse = (0.25 * NoU + 0.75) + (0.667 - abs(NoE)) * (1.0 - abs(NoU)) * 0.15; + vanillaDiffuse*= vanillaDiffuse; + + float parallaxShadow = 1.0; + #ifdef ADVANCED_MATERIALS + vec3 rawAlbedo = albedo.rgb * 0.999 + 0.001; + albedo.rgb *= ao; + + #ifdef REFLECTION_SPECULAR + albedo.rgb *= 1.0 - metalness * smoothness; + #endif + + #ifdef SELF_SHADOW + if (lightmap.y > 0.0 && NoL > 0.0 && water < 0.5) { + parallaxShadow = GetParallaxShadow(surfaceDepth, parallaxFade, newCoord, lightVec, + tbnMatrix); + } + #endif + + #ifdef DIRECTIONAL_LIGHTMAP + mat3 lightmapTBN = GetLightmapTBN(viewPos); + lightmap.x = DirectionalLightmap(lightmap.x, lmCoord.x, newNormal, lightmapTBN); + lightmap.y = DirectionalLightmap(lightmap.y, lmCoord.y, newNormal, lightmapTBN); + #endif + #endif + + #ifdef MULTICOLORED_BLOCKLIGHT + blocklightCol = ApplyMultiColoredBlocklight(blocklightCol, screenPos); + #endif + + vec3 shadow = vec3(0.0); + GetLighting(albedo.rgb, shadow, viewPos, worldPos, normal, lightmap, 1.0, NoL, + vanillaDiffuse, parallaxShadow, emission, subsurface, basicSubsurface); + + #ifdef ADVANCED_MATERIALS + float puddles = 0.0; + #ifdef REFLECTION_RAIN + if (water < 0.5) { + puddles = GetPuddles(worldPos, newCoord, lightmap.y, NoU, wetness); + } + + ApplyPuddleToMaterial(puddles, albedo, smoothness, f0, porosity); + + if (puddles > 0.001 && rainStrength > 0.001) { + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + vec3 puddleNormal = GetPuddleNormal(worldPos, viewPos, tbnMatrix); + newNormal = normalize( + mix(newNormal, puddleNormal, puddles * sqrt(1.0 - porosity) * rainStrength) + ); + } + #endif + #endif + + float fresnel = pow(clamp(1.0 + dot(newNormal, normalize(viewPos)), 0.0, 1.0), 5.0); + + if (water > 0.5 || ((translucent + glass) > 0.5 && albedo.a < 0.95)) { + #if REFLECTION > 0 + vec4 reflection = vec4(0.0); + vec3 skyReflection = vec3(0.0); + float reflectionMask = 0.0; + + fresnel = fresnel * 0.98 + 0.02; + fresnel*= max(1.0 - isEyeInWater * 0.5 * water, 0.5); + // fresnel = 1.0; + + #if REFLECTION == 2 + reflection = SimpleReflection(viewPos, newNormal, dither, reflectionMask); + reflection.rgb = pow(reflection.rgb * 2.0, vec3(8.0)); + #endif + + if (reflection.a < 1.0) { + #ifdef OVERWORLD + vec3 skyRefPos = reflect(normalize(viewPos), newNormal); + skyReflection = GetSkyColor(skyRefPos, true); + + #ifdef AURORA + skyReflection += DrawAurora(skyRefPos * 100.0, dither, 12); + #endif + + #if CLOUDS == 1 + vec4 cloud = DrawCloudSkybox(skyRefPos * 100.0, 1.0, dither, lightCol, ambientCol, true); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a); + #endif + #if CLOUDS == 2 + vec3 cameraPos = GetReflectedCameraPos(worldPos, newNormal); + float cloudViewLength = 0.0; + + vec4 cloud = DrawCloudVolumetric(skyRefPos * 8192.0, cameraPos, 1.0, dither, lightCol, ambientCol, cloudViewLength, true); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a); + #endif + + #ifdef CLASSIC_EXPOSURE + skyReflection *= 4.0 - 3.0 * eBS; + #endif + + float waterSkyOcclusion = lightmap.y; + #if REFLECTION_SKY_FALLOFF > 1 + waterSkyOcclusion = clamp(1.0 - (1.0 - waterSkyOcclusion) * REFLECTION_SKY_FALLOFF, 0.0, 1.0); + #endif + waterSkyOcclusion *= waterSkyOcclusion; + skyReflection *= waterSkyOcclusion; + #endif + + #ifdef NETHER + skyReflection = netherCol.rgb * 0.04; + #endif + + #ifdef END + skyReflection = endCol.rgb * 0.01; + #endif + + skyReflection *= clamp(1.0 - isEyeInWater, 0.0, 1.0); + } + + reflection.rgb = max(mix(skyReflection, reflection.rgb, reflection.a), vec3(0.0)); + + #if defined OVERWORLD || defined END + vec3 specularColor = GetSpecularColor(lightmap.y, 0.0, vec3(1.0)); + + vec3 specular = GetSpecularHighlight(newNormal, viewPos, 0.9, vec3(0.02), + specularColor, shadow, color.a); + #if ALPHA_BLEND == 0 + float specularAlpha = pow(mix(albedo.a, 1.0, fresnel), 2.2) * fresnel; + #else + float specularAlpha = mix(albedo.a , 1.0, fresnel) * fresnel; + #endif + + reflection.rgb += specular * (1.0 - reflectionMask) / specularAlpha; + #endif + + albedo.rgb = mix(albedo.rgb, reflection.rgb, fresnel); + albedo.a = mix(albedo.a, 1.0, fresnel); + #endif + }else{ + #ifdef ADVANCED_MATERIALS + skyOcclusion = lightmap.y; + #if REFLECTION_SKY_FALLOFF > 1 + skyOcclusion = clamp(1.0 - (1.0 - skyOcclusion) * REFLECTION_SKY_FALLOFF, 0.0, 1.0); + #endif + skyOcclusion *= skyOcclusion; + + baseReflectance = mix(vec3(f0), rawAlbedo, metalness); + + #ifdef REFLECTION_SPECULAR + vec3 fresnel3 = mix(baseReflectance, vec3(1.0), fresnel); + #if MATERIAL_FORMAT == 0 + if (f0 >= 0.9 && f0 < 1.0) { + baseReflectance = GetMetalCol(f0); + fresnel3 = ComplexFresnel(pow(fresnel, 0.2), f0); + #ifdef ALBEDO_METAL + fresnel3 *= rawAlbedo; + #endif + } + #endif + + float aoSquared = ao * ao; + shadow *= aoSquared; fresnel3 *= aoSquared * smoothness * smoothness; + + if (smoothness > 0.0) { + vec4 reflection = vec4(0.0); + vec3 skyReflection = vec3(0.0); + float reflectionMask = 0.0; + + float ssrMask = clamp(length(fresnel3) * 400.0 - 1.0, 0.0, 1.0); + if(ssrMask > 0.0) reflection = SimpleReflection(viewPos, newNormal, dither, reflectionMask); + reflection.rgb = pow(reflection.rgb * 2.0, vec3(8.0)); + reflection.a *= ssrMask; + + if (reflection.a < 1.0) { + #ifdef OVERWORLD + vec3 skyRefPos = reflect(normalize(viewPos.xyz), newNormal); + skyReflection = GetSkyColor(skyRefPos, true); + + #ifdef AURORA + skyReflection += DrawAurora(skyRefPos * 100.0, dither, 12); + #endif + + #if CLOUDS == 1 + vec4 cloud = DrawCloudSkybox(skyRefPos * 100.0, 1.0, dither, lightCol, ambientCol, false); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a); + #endif + #if CLOUDS == 2 + vec3 cameraPos = GetReflectedCameraPos(worldPos, newNormal); + float cloudViewLength = 0.0; + + vec4 cloud = DrawCloudVolumetric(skyRefPos * 8192.0, cameraPos, 1.0, dither, lightCol, ambientCol, cloudViewLength, true); + skyReflection = mix(skyReflection, cloud.rgb, cloud.a); + #endif + + #ifdef CLASSIC_EXPOSURE + skyReflection *= 4.0 - 3.0 * eBS; + #endif + + skyReflection = mix(vanillaDiffuse * minLightCol, skyReflection, skyOcclusion); + #endif + + #ifdef NETHER + skyReflection = netherCol.rgb * 0.04; + #endif + + #ifdef END + skyReflection = endCol.rgb * 0.01; + #endif + } + + reflection.rgb = max(mix(skyReflection, reflection.rgb, reflectionMask), vec3(0.0)); + + albedo.rgb = albedo.rgb * (1.0 - fresnel3 * (1.0 - metalness)) + + reflection.rgb * fresnel3; + albedo.a = mix(albedo.a, 1.0, GetLuminance(fresnel3)); + } + #endif + #endif + + #if defined OVERWORLD || defined END + vec3 specularColor = GetSpecularColor(lightmap.y, metalness, baseReflectance); + + albedo.rgb += GetSpecularHighlight(newNormal, viewPos, smoothness, baseReflectance, + specularColor, shadow * vanillaDiffuse, color.a); + #endif + } + + #if WATER_FOG == 1 + if((isEyeInWater == 0 && water > 0.5) || (isEyeInWater == 1 && water < 0.5)) { + float opaqueDepth = texture2D(depthtex1, screenPos.xy).r; + vec3 opaqueScreenPos = vec3(gl_FragCoord.xy / vec2(viewWidth, viewHeight), opaqueDepth); + #ifdef TAA + vec3 opaqueViewPos = ToNDC(vec3(TAAJitter(opaqueScreenPos.xy, -0.5), opaqueScreenPos.z)); + #else + vec3 opaqueViewPos = ToNDC(opaqueScreenPos); + #endif + + vec4 waterFog = GetWaterFog(opaqueViewPos - viewPos.xyz); + albedo = mix(waterFog, vec4(albedo.rgb, 1.0), albedo.a); + } + #endif + + Fog(albedo.rgb, viewPos); + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + #endif + } + albedo.a *= cloudBlendOpacity; + + /* DRAWBUFFERS:01 */ + gl_FragData[0] = albedo; + gl_FragData[1] = vec4(vlAlbedo, 1.0); + + #ifdef MULTICOLORED_BLOCKLIGHT + /* DRAWBUFFERS:018 */ + gl_FragData[2] = vec4(lightAlbedo, 1.0); + #if REFRACTION > 0 + /* DRAWBUFFERS:0186 */ + gl_FragData[3] = vec4(refraction, 1.0); + #endif + #else + #if REFRACTION > 0 + /* DRAWBUFFERS:016 */ + gl_FragData[2] = vec4(refraction, 1.0); + #endif + #endif +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float mat; +varying float dist; + +varying vec2 texCoord, lmCoord; + +varying vec3 normal, binormal, tangent; +varying vec3 sunVec, upVec, eastVec; +varying vec3 viewVector; + +varying vec4 color; + +#ifdef ADVANCED_MATERIALS +varying vec4 vTexCoord, vTexCoordAM; +#endif + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; +uniform float timeAngle; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; + +#ifdef TAA +uniform int frameCounter; + +uniform float viewWidth, viewHeight; +#endif + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; +attribute vec4 at_tangent; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Common Functions// +float WavingWater(vec3 worldPos) { + worldPos += cameraPosition; + float fractY = fract(worldPos.y + 0.005); + + float wave = sin(6.2831854 * (frametime * 0.7 + worldPos.x * 0.14 + worldPos.z * 0.07)) + + sin(6.2831854 * (frametime * 0.5 + worldPos.x * 0.10 + worldPos.z * 0.20)); + if (fractY > 0.01) return wave * 0.0125; + + return 0.0; +} + +//Includes// +#ifdef TAA +#include "/lib/util/jitter.glsl" +#endif + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp((lmCoord - 0.03125) * 1.06667, vec2(0.0), vec2(0.9333, 1.0)); + + int blockID = int(mod(max(mc_Entity.x - 10000, 0), 10000)); + + normal = normalize(gl_NormalMatrix * gl_Normal); + binormal = normalize(gl_NormalMatrix * cross(at_tangent.xyz, gl_Normal.xyz) * at_tangent.w); + tangent = normalize(gl_NormalMatrix * at_tangent.xyz); + + mat3 tbnMatrix = mat3(tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + viewVector = tbnMatrix * (gl_ModelViewMatrix * gl_Vertex).xyz; + + dist = length(gl_ModelViewMatrix * gl_Vertex); + + #ifdef ADVANCED_MATERIALS + vec2 midCoord = (gl_TextureMatrix[0] * mc_midTexCoord).st; + vec2 texMinMidCoord = texCoord - midCoord; + + vTexCoordAM.pq = abs(texMinMidCoord) * 2; + vTexCoordAM.st = min(texCoord, midCoord - texMinMidCoord); + + vTexCoord.xy = sign(texMinMidCoord) * 0.5 + 0.5; + #endif + + color = gl_Color; + + if(color.a < 0.1) color.a = 1.0; + + mat = 0.0; + + if (blockID == 300 || blockID == 304) mat = 1.0; + if (blockID == 301) mat = 2.0; + if (blockID == 302) mat = 3.0; + if (blockID == 303) mat = 4.0; + + const vec2 sunRotationData = vec2( + cos(sunPathRotation * 0.01745329251994), + -sin(sunPathRotation * 0.01745329251994) + ); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + eastVec = normalize(gbufferModelView[0].xyz); + + vec4 position = gbufferModelViewInverse * gl_ModelViewMatrix * gl_Vertex; + + #ifdef WAVING_WATER + float istopv = gl_MultiTexCoord0.t < mc_midTexCoord.t ? 1.0 : 0.0; + if (blockID == 300 || blockID == 302 || blockID == 304) position.y += WavingWater(position.xyz); + #endif + + #ifdef WORLD_CURVATURE + position.y -= WorldCurvature(position.xz); + #endif + + gl_Position = gl_ProjectionMatrix * gbufferModelView * position; + if (mat == 0.0) gl_Position.z -= 0.00001; + + #ifdef TAA + gl_Position.xy = TAAJitter(gl_Position.xy, gl_Position.w); + #endif +} + +#endif \ No newline at end of file diff --git a/shaders/program/gbuffers_weather.glsl b/shaders/program/gbuffers_weather.glsl new file mode 100644 index 0000000..2600fd4 --- /dev/null +++ b/shaders/program/gbuffers_weather.glsl @@ -0,0 +1,126 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 upVec, sunVec; + +//Uniforms// +uniform int isEyeInWater; +uniform int worldTime; + +uniform float nightVision; +uniform float rainStrength; +uniform float timeAngle, timeBrightness; +uniform float viewWidth, viewHeight; + +uniform ivec2 eyeBrightnessSmooth; + +uniform mat4 gbufferProjectionInverse; + +uniform sampler2D texture; +uniform sampler2D depthtex0; + +//Common Variables// +float eBS = eyeBrightnessSmooth.y / 240.0; +float sunVisibility = clamp(dot(sunVec, upVec) + 0.05, 0.0, 0.1) * 10.0; + +//Common Functions// +void Defog(inout vec3 albedo, float fogDensity) { + float z = texture2D(depthtex0,gl_FragCoord.xy/vec2(viewWidth,viewHeight)).r; + if (z == 1.0) return; + + vec4 screenPos = vec4(gl_FragCoord.xy / vec2(viewWidth, viewHeight), z, 1.0); + vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0); + viewPos /= viewPos.w; + + float fog = length(viewPos) * fogDensity / 256.0; + float clearDay = sunVisibility * (1.0 - rainStrength); + fog *= (0.5 * rainStrength + 1.0) / (3.0 * clearDay + 1.0); + fog = 1.0 - exp(-2.0 * pow(fog, 0.25 * clearDay + 1.25) * eBS); + albedo.rgb /= 1.0 - fog; +} + +//Includes// +#include "/lib/color/lightColor.glsl" +#include "/lib/color/blocklightColor.glsl" +#include "/lib/atmospherics/weatherDensity.glsl" + +//Program// +void main() { + #if defined NETHER || defined END + discard; + #endif + + vec4 albedo = vec4(0.0); + + albedo.a = texture2D(texture, texCoord).a; + + if (albedo.a > 0.001) { + albedo.rgb = texture2D(texture, texCoord).rgb; + + albedo.a *= 0.25 * rainStrength * length(albedo.rgb / 3.0) * float(albedo.a > 0.1); + albedo.rgb = sqrt(albedo.rgb); + albedo.rgb *= (ambientCol + lmCoord.x * lmCoord.x * blocklightCol) * WEATHER_OPACITY; + + #if MC_VERSION < 10800 + albedo.a *= 4.0; + albedo.rgb *= 0.525; + #endif + + #if defined FOG && MC_VERSION < 11500 + if (gl_FragCoord.z > 0.991) Defog(albedo.rgb, fogDensity); + #endif + + #if ALPHA_BLEND == 0 + albedo.rgb = sqrt(max(albedo.rgb, vec3(0.0))); + albedo.a *= 1.4; + #endif + } + +/* DRAWBUFFERS:0 */ + gl_FragData[0] = albedo; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying vec2 texCoord, lmCoord; + +varying vec3 sunVec, upVec; + +//Uniforms// +uniform float timeAngle; + +uniform mat4 gbufferModelView; + +//Program// +void main() { + texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy; + + lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy; + lmCoord = clamp(lmCoord * 2.0 - 1.0, 0.0, 1.0); + + const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); + float ang = fract(timeAngle - 0.25); + ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; + sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); + + upVec = normalize(gbufferModelView[1].xyz); + + gl_Position = ftransform(); +} + +#endif \ No newline at end of file diff --git a/shaders/program/shadow.glsl b/shaders/program/shadow.glsl new file mode 100644 index 0000000..f2d1c3d --- /dev/null +++ b/shaders/program/shadow.glsl @@ -0,0 +1,243 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// +varying float mat; + +varying vec2 texCoord; + +#ifdef WATER_CAUSTICS +varying vec3 worldPos; +#endif + +varying vec4 color; + +//Uniforms// +uniform int blockEntityId; + +uniform sampler2D tex; + +#ifdef WATER_CAUSTICS +uniform int worldTime; + +uniform float frameTimeCounter; + +uniform sampler2D noisetex; +#endif + +//Common Variables// +#ifdef WATER_CAUSTICS +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +float GetWaterHeightMap(vec3 worldPos, vec2 offset) { + float noise = 0.0; + + vec2 wind = vec2(frametime) * 0.5 * WATER_SPEED; + + worldPos.xz -= worldPos.y * 0.2; + + #if WATER_NORMALS == 1 + offset /= 256.0; + float noiseA = texture2D(noisetex, (worldPos.xz - wind) / 256.0 + offset).g; + float noiseB = texture2D(noisetex, (worldPos.xz + wind) / 48.0 + offset).g; + #elif WATER_NORMALS == 2 + offset /= 256.0; + float noiseA = texture2D(noisetex, (worldPos.xz - wind) / 256.0 + offset).r; + float noiseB = texture2D(noisetex, (worldPos.xz + wind) / 96.0 + offset).r; + noiseA *= noiseA; noiseB *= noiseB; + #endif + + #if WATER_NORMALS > 0 + noise = mix(noiseA, noiseB, WATER_DETAIL); + #endif + + return noise * WATER_CAUSTICS_STRENGTH; +} +#endif + +#ifdef WATER_SHADOW_COLOR +#include "/lib/color/waterColor.glsl" +#endif + +//Program// +void main() { + #if MC_VERSION >= 11300 + if (blockEntityId == 10205) discard; + #endif + + vec4 albedo = texture2D(tex, texCoord.xy); + albedo.rgb *= color.rgb; + + float premult = float(mat > 0.98 && mat < 1.02); + float water = float(mat > 1.98 && mat < 2.02); + float disable = float(mat > 2.98 && mat < 3.02); + if (albedo.a < 0.01 || disable > 0.5) discard; + + if (water > 0.5) { + #if !defined WATER_SHADOW_COLOR && !defined WATER_CAUSTICS + discard; + #else + #ifdef WATER_SHADOW_COLOR + #if WATER_MODE == 0 + albedo.rgb = pow(waterColor.rgb / waterColor.a, vec3(0.25)); + #elif WATER_MODE == 1 + albedo.rgb = sqrt(albedo.rgb); + #elif WATER_MODE == 2 + float waterLuma = length(albedo.rgb * albedo.rgb / pow(color.rgb, vec3(2.2))) * 2.0; + albedo.rgb = sqrt(waterLuma * sqrt(waterColor.rgb / waterColor.a)); + #elif WATER_MODE == 3 + albedo.rgb = sqrt(color.rgb * 0.59); + #endif + + #if WATER_ALPHA_MODE == 0 + albedo.a = waterAlpha; + #endif + #else + albedo.rgb = vec3(1.0); + #endif + + #ifdef WATER_CAUSTICS + float normalOffset = WATER_SHARPNESS + 0.2; + + float normalStrength = 0.35; + + float h0 = GetWaterHeightMap(worldPos, vec2(0.0)); + float h1 = GetWaterHeightMap(worldPos, vec2( normalOffset, 0.0)); + float h2 = GetWaterHeightMap(worldPos, vec2(-normalOffset, 0.0)); + float h3 = GetWaterHeightMap(worldPos, vec2(0.0, normalOffset)); + float h4 = GetWaterHeightMap(worldPos, vec2(0.0, -normalOffset)); + + float xDeltaA = (h1 - h0) / normalOffset; + float xDeltaB = (h2 - h0) / normalOffset; + float yDeltaA = (h3 - h0) / normalOffset; + float yDeltaB = (h4 - h0) / normalOffset; + + float height = max((xDeltaA * -xDeltaB + yDeltaA * -yDeltaB), 0.0); + + #if WATER_NORMALS == 1 + height *= 48.0; + #elif WATER_NORMALS == 2 + height *= 24.0; + #endif + + #ifdef WATER_SHADOW_COLOR + height /= length(albedo.rgb); + #endif + + height /= sqrt(height * height / 9.0 + 1.0); + + albedo.rgb *= 1.0 + height; + #endif + #endif + } + + #ifdef SHADOW_COLOR + albedo.rgb = mix(vec3(1.0), albedo.rgb, 1.0 - pow(1.0 - albedo.a, 1.5)); + albedo.rgb *= 1.0 - pow(albedo.a, 96.0); + #else + if ((premult > 0.5 && albedo.a < 0.98)) albedo.a = 0.0; + #endif + + #ifdef WATER_CAUSTICS + albedo.rgb *= 0.25; + #endif + + gl_FragData[0] = albedo; +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// +varying float mat; + +varying vec2 texCoord; + +#ifdef WATER_CAUSTICS +varying vec3 worldPos; +#endif + +varying vec4 color; + +//Uniforms// +uniform int worldTime; + +uniform float frameTimeCounter; + +uniform vec3 cameraPosition; + +uniform mat4 gbufferModelView, gbufferModelViewInverse; +uniform mat4 shadowProjection, shadowProjectionInverse; +uniform mat4 shadowModelView, shadowModelViewInverse; + +//Attributes// +attribute vec4 mc_Entity; +attribute vec4 mc_midTexCoord; + +//Common Variables// +#ifdef WORLD_TIME_ANIMATION +float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED; +#else +float frametime = frameTimeCounter * ANIMATION_SPEED; +#endif + +//Includes// +#include "/lib/vertex/waving.glsl" + +#ifdef WORLD_CURVATURE +#include "/lib/vertex/worldCurvature.glsl" +#endif + +//Program// +void main() { + texCoord = gl_MultiTexCoord0.xy; + + int blockID = int(mod(max(mc_Entity.x - 10000, 0), 10000)); + + color = gl_Color; + + mat = 0; + if (blockID == 301 || blockID == 302) mat = 1; + if (blockID == 300 || blockID == 304) mat = 2; + + #ifndef SHADOW_VEGETATION + if (blockID >= 100 && blockID <= 104) mat = 3; + #endif + + vec4 position = shadowModelViewInverse * shadowProjectionInverse * ftransform(); + + #ifdef WATER_CAUSTICS + worldPos = position.xyz + cameraPosition.xyz; + #endif + + float istopv = gl_MultiTexCoord0.t < mc_midTexCoord.t ? 1.0 : 0.0; + position.xyz = WavingBlocks(position.xyz, blockID, istopv); + + #ifdef WORLD_CURVATURE + position.y -= WorldCurvature(position.xz); + #endif + + gl_Position = shadowProjection * shadowModelView * position; + + float dist = sqrt(gl_Position.x * gl_Position.x + gl_Position.y * gl_Position.y); + float distortFactor = dist * shadowMapBias + (1.0 - shadowMapBias); + + gl_Position.xy *= 1.0 / distortFactor; + gl_Position.z = gl_Position.z * 0.2; +} + +#endif \ No newline at end of file diff --git a/shaders/program/template.glsl b/shaders/program/template.glsl new file mode 100644 index 0000000..7a9a55d --- /dev/null +++ b/shaders/program/template.glsl @@ -0,0 +1,55 @@ +/* +BSL Shaders v8 Series by Capt Tatsu +https://bitslablab.com +*/ + +//Settings// +#include "/lib/settings.glsl" + +//Fragment Shader/////////////////////////////////////////////////////////////////////////////////// +#ifdef FSH + +//Varyings// + +//Uniforms// + +//Attributes// + +//Optifine Constants// + +//Common Variables// + +//Common Functions// + +//Includes// + +//Program// +void main() { + +} + +#endif + +//Vertex Shader///////////////////////////////////////////////////////////////////////////////////// +#ifdef VSH + +//Varyings// + +//Uniforms// + +//Attributes// + +//Optifine Constants// + +//Common Variables// + +//Common Functions// + +//Includes// + +//Program// +void main() { + +} + +#endif diff --git a/shaders/shaders.properties b/shaders/shaders.properties new file mode 100644 index 0000000..b67aee2 --- /dev/null +++ b/shaders/shaders.properties @@ -0,0 +1,220 @@ +#BSL Shaders Shader Properties + +#Profiles +profile.MINIMUM=!AO !LIGHT_SHAFT !SHADOW !SHADOW_COLOR !SHADOW_FILTER shadowMapResolution=512 shadowDistance=128.0 +profile.LOW=profile.MINIMUM SHADOW shadowMapResolution=1024 shadowDistance=128.0 +profile.MEDIUM=profile.LOW AO SHADOW_FILTER shadowMapResolution=1536 shadowDistance=192.0 +profile.HIGH=profile.MEDIUM LIGHT_SHAFT SHADOW_COLOR shadowMapResolution=2048 shadowDistance=256.0 +profile.ULTRA=profile.HIGH shadowMapResolution=3072 shadowDistance=512.0 + +#Force Video Settings +dynamicHandLight=true +oldHandLight=false +oldLighting=false +particles.ordering=mixed +separateAo=true +shadow.culling=true +underwaterOverlay=false +vignette=false + +#Screen Setup +screen= ABOUT [LIGHTING] [MATERIAL] [ATMOSPHERICS] [WATER] [CAMERA] [ANTIALIASING] [COLOR] [CGT] [EXTRAS] [ANIMATION] + +screen.LIGHTING= SHADOW [SHADOW_CONFIG] shadowMapResolution shadowDistance SHADOW_FILTER SHADOW_COLOR AO AO_STRENGTH DESATURATION DESATURATION_FACTOR MULTICOLORED_BLOCKLIGHT [MCBL] DYNAMIC_HANDLIGHT WHITE_WORLD +screen.SHADOW_CONFIG= SHADOW_ENTITY SHADOW_BLOCK_ENTITY SHADOW_VEGETATION SHADOW_CLOUD sunPathRotation SHADOW_BIAS SHADOW_PIXEL +screen.MCBL= MCBL_ANTI_BLEED MCBL_LEGACY_COLOR + +screen.MATERIAL= ADVANCED_MATERIALS MATERIAL_FORMAT [SPECULAR] [NORMALS] SSS BASIC_SSS EMISSIVE REFRACTION ALBEDO_BALANCING ALPHA_BLEND ENTITY_FLASH +screen.SPECULAR= REFLECTION REFLECTION_TRANSLUCENT REFLECTION_SPECULAR REFLECTION_ROUGH REFLECTION_RAIN REFLECTION_RAIN_AMOUNT REFLECTION_PREVIOUS SPECULAR_HIGHLIGHT_ROUGH ALBEDO_METAL REFLECTION_MODE REFLECTION_SKY_FALLOFF REFLECTION_SKYBOX +screen.NORMALS= PARALLAX PARALLAX_DEPTH PARALLAX_QUALITY PARALLAX_DISTANCE SELF_SHADOW SELF_SHADOW_ANGLE SELF_SHADOW_QUALITY SELF_SHADOW_STRENGTH GENERATED_NORMALS [GENERATED_NORMAL_SETTINGS] DIRECTIONAL_LIGHTMAP DIRECTIONAL_LIGHTMAP_STRENGTH NORMAL_DAMPENING NORMAL_PLANTS + +screen.GENERATED_NORMAL_SETTINGS= GENERATED_NORMAL_MULT GENERATED_NORMAL_THRESHOLD GENERATED_NORMAL_CLAMP GENERATED_NORMAL_RESOLUTION + +screen.ATMOSPHERICS= [CLOUDS] [FOG] [SKY] [SKYBOX] LIGHT_SHAFT LIGHT_SHAFT_STRENGTH WEATHER_PERBIOME WEATHER_OPACITY +screen.SKY= SKY_DENSITY_D SKY_EXPOSURE_D SKY_DENSITY_N SKY_EXPOSURE_N SKY_DENSITY_W SKY_EXPOSURE_W SKY_HORIZON_N SKY_HORIZON_F SKY_DESATURATION SKY_GROUND UNDERGROUND_SKY SHADER_END_SKY SKY_DEFERRED +screen.CLOUDS= CLOUDS CLOUD_BASE CLOUD_DENSITY CLOUD_AMOUNT CLOUD_HEIGHT CLOUD_THICKNESS CLOUD_DETAIL CLOUD_SPEED CLOUD_OPACITY CLOUD_BRIGHTNESS CLOUD_VOLUMETRIC_SCALE +screen.FOG= FOG_DENSITY [FOG_DENSITY] FOG_HEIGHT [FOG_HEIGHT] FAR_VANILLA_FOG [FOG_VANILLA] +screen.FOG_DENSITY= FOG_DENSITY_NIGHT FOG_DENSITY_WEATHER FOG_DENSITY_COLD FOG_DENSITY_DRY FOG_DENSITY_DAMP FOG_DENSITY_INDOOR FOG_DENSITY_DH +screen.FOG_HEIGHT= FOG_HEIGHT_Y FOG_HEIGHT_FALLOFF +screen.FOG_VANILLA= FAR_VANILLA_FOG_STYLE FOG_DENSITY_VANILLA FOG_VANILLA_CLOUD +screen.SKYBOX= ROUND_SUN_MOON ROUND_SUN_MOON_SIZE STARS AURORA SKYBOX_INTENSITY SKYBOX_OPACITY SUN_INTENSITY MOON_INTENSITY + +screen.WATER= WATER_MODE WATER_ALPHA_MODE WATER_NORMALS WATER_PARALLAX WATER_SHADOW_COLOR WATER_CAUSTICS WATER_DETAIL WATER_SHARPNESS WATER_BUMP WATER_SPEED WATER_FOG WATER_FOG_DENSITY WATER_CAUSTICS_STRENGTH WATER_PIXEL + +screen.CAMERA= DOF DOF_STRENGTH MOTION_BLUR MOTION_BLUR_STRENGTH BLOOM BLOOM_STRENGTH BLOOM_CONTRAST BLOOM_RADIUS LENS_FLARE LENS_FLARE_STRENGTH VIGNETTE VIGNETTE_STRENGTH DIRTY_LENS CHROMATIC_ABERRATION UNDERWATER_DISTORTION + +screen.ANTIALIASING= FXAA TAA FXAA_SUBPIXEL FXAA_EDGE_SENSITIVITY TAA_MODE TAA_SELECTIVE + +screen.COLOR= [LIGHT_COLOR] [BLOCKLIGHT_COLOR] [SKY_COLOR] [WATER_COLOR] [WEATHER_COLOR] [AURORA_COLOR] [NETHER_COLOR] [END_COLOR] +screen.LIGHT_COLOR= [LIGHT_M] [AMBIENT_M] [LIGHT_D] [AMBIENT_D] [LIGHT_E] [AMBIENT_E] [LIGHT_N] [AMBIENT_N] [MINLIGHT] +screen.LIGHT_M= LIGHT_MR LIGHT_MG LIGHT_MB LIGHT_MI +screen.LIGHT_D= LIGHT_DR LIGHT_DG LIGHT_DB LIGHT_DI +screen.LIGHT_E= LIGHT_ER LIGHT_EG LIGHT_EB LIGHT_EI +screen.LIGHT_N= LIGHT_NR LIGHT_NG LIGHT_NB LIGHT_NI +screen.AMBIENT_M= AMBIENT_MR AMBIENT_MG AMBIENT_MB AMBIENT_MI +screen.AMBIENT_D= AMBIENT_DR AMBIENT_DG AMBIENT_DB AMBIENT_DI +screen.AMBIENT_E= AMBIENT_ER AMBIENT_EG AMBIENT_EB AMBIENT_EI +screen.AMBIENT_N= AMBIENT_NR AMBIENT_NG AMBIENT_NB AMBIENT_NI +screen.MINLIGHT= MINLIGHT_R MINLIGHT_G MINLIGHT_B MINLIGHT_I +screen.BLOCKLIGHT_COLOR= BLOCKLIGHT_R BLOCKLIGHT_G BLOCKLIGHT_B BLOCKLIGHT_I EMISSIVE_RECOLOR +screen.SKY_COLOR= SKY_R SKY_G SKY_B SKY_I SKY_VANILLA SKY_VANILLA_USE_FOG +screen.WATER_COLOR= WATER_R WATER_G WATER_B WATER_I WATER_A WATER_F +screen.WEATHER_COLOR= [WEATHER_R] [WEATHER_C] [WEATHER_D] [WEATHER_B] [WEATHER_S] [WEATHER_M] [WEATHER_V] [WEATHER_J] +screen.WEATHER_R= WEATHER_RR WEATHER_RG WEATHER_RB WEATHER_RI +screen.WEATHER_C= WEATHER_CR WEATHER_CG WEATHER_CB WEATHER_CI +screen.WEATHER_D= WEATHER_DR WEATHER_DG WEATHER_DB WEATHER_DI +screen.WEATHER_B= WEATHER_BR WEATHER_BG WEATHER_BB WEATHER_BI +screen.WEATHER_S= WEATHER_SR WEATHER_SG WEATHER_SB WEATHER_SI +screen.WEATHER_M= WEATHER_MR WEATHER_MG WEATHER_MB WEATHER_MI +screen.WEATHER_V= WEATHER_VR WEATHER_VG WEATHER_VB WEATHER_VI +screen.WEATHER_J= WEATHER_JR WEATHER_JG WEATHER_JB WEATHER_JI +screen.AURORA_COLOR= [AURORA_L] [AURORA_H] +screen.AURORA_L= AURORA_LR AURORA_LG AURORA_LB AURORA_LI +screen.AURORA_H= AURORA_HR AURORA_HG AURORA_HB AURORA_HI +screen.NETHER_COLOR= [NETHER_N] [NETHER_V] [NETHER_C] [NETHER_W] [NETHER_B] NETHER_VANILLA +screen.NETHER_N= NETHER_NR NETHER_NG NETHER_NB NETHER_NI +screen.NETHER_V= NETHER_VR NETHER_VG NETHER_VB NETHER_VI +screen.NETHER_C= NETHER_CR NETHER_CG NETHER_CB NETHER_CI +screen.NETHER_W= NETHER_WR NETHER_WG NETHER_WB NETHER_WI +screen.NETHER_B= NETHER_BR NETHER_BG NETHER_BB NETHER_BI +screen.END_COLOR= END_R END_G END_B END_I + +screen.CGT= EXPOSURE AUTO_EXPOSURE CLASSIC_EXPOSURE [EXPOSURE_CONFIG] COLOR_GRADING [COLOR_GRADING_CONFIG] TONEMAP_LOWER_CURVE TONEMAP_UPPER_CURVE TONEMAP_WHITE_CURVE TONEMAP_WHITE_PATH SATURATION VIBRANCE +screen.EXPOSURE_CONFIG= AUTO_EXPOSURE_RADIUS AUTO_EXPOSURE_SPEED +screen.COLOR_GRADING_CONFIG= [CG_R] [CG_G] [CG_B] [CG_T] +screen.CG_R= CG_RR CG_RG CG_RB CG_RI CG_RM CG_RC +screen.CG_G= CG_GR CG_GG CG_GB CG_GI CG_GM CG_GC +screen.CG_B= CG_BR CG_BG CG_BB CG_BI CG_BM CG_BC +screen.CG_T= CG_TR CG_TG CG_TB CG_TI CG_TM + +screen.EXTRAS= OUTLINE TOON_LIGHTMAP RETRO_FILTER RETRO_FILTER_SIZE WORLD_CURVATURE WORLD_CURVATURE_SIZE + +screen.ANIMATION= WORLD_TIME_ANIMATION ANIMATION_SPEED WAVING_GRASS WAVING_CROP WAVING_PLANT WAVING_TALL_PLANT WAVING_LEAF WAVING_VINE WAVING_WATER WAVING_LAVA WAVING_FIRE WAVING_LANTERN + +#Set Sliders +sliders=shadowMapResolution shadowDistance sunPathRotation SHADOW_PIXEL AO_STRENGTH DESATURATION_FACTOR REFLECTION_RAIN_AMOUNT REFLECTION_SKY_FALLOFF PARALLAX_DEPTH PARALLAX_QUALITY PARALLAX_DISTANCE SELF_SHADOW_ANGLE SELF_SHADOW_QUALITY SELF_SHADOW_STRENGTH DIRECTIONAL_LIGHTMAP_STRENGTH DOF_STRENGTH MOTION_BLUR_STRENGTH BLOOM_STRENGTH BLOOM_CONTRAST BLOOM_RADIUS LENS_FLARE_STRENGTH VIGNETTE_STRENGTH EXPOSURE AUTO_EXPOSURE_RADIUS AUTO_EXPOSURE_SPEED TONEMAP_LOWER_CURVE TONEMAP_UPPER_CURVE TONEMAP_WHITE_CURVE TONEMAP_WHITE_PATH SATURATION VIBRANCE CG_RR CG_RG CG_RB CG_RI CG_RM CG_RC CG_GR CG_GG CG_GB CG_GI CG_GM CG_GC CG_BR CG_BG CG_BB CG_BI CG_BM CG_BC CG_TR CG_TG CG_TB CG_TI CG_TM FXAA_SUBPIXEL FXAA_EDGE_SENSITIVITY LIGHT_MR LIGHT_MG LIGHT_MB LIGHT_MI LIGHT_DR LIGHT_DG LIGHT_DB LIGHT_DI LIGHT_ER LIGHT_EG LIGHT_EB LIGHT_EI LIGHT_NR LIGHT_NG LIGHT_NB LIGHT_NI AMBIENT_MR AMBIENT_MG AMBIENT_MB AMBIENT_MI AMBIENT_DR AMBIENT_DG AMBIENT_DB AMBIENT_DI AMBIENT_ER AMBIENT_EG AMBIENT_EB AMBIENT_EI AMBIENT_NR AMBIENT_NG AMBIENT_NB AMBIENT_NI MINLIGHT_R MINLIGHT_G MINLIGHT_B MINLIGHT_I BLOCKLIGHT_R BLOCKLIGHT_G BLOCKLIGHT_B BLOCKLIGHT_I SKY_R SKY_G SKY_B SKY_I WATER_R WATER_G WATER_B WATER_I WATER_A WATER_F WEATHER_RR WEATHER_RG WEATHER_RB WEATHER_RI WEATHER_CR WEATHER_CG WEATHER_CB WEATHER_CI WEATHER_DR WEATHER_DG WEATHER_DB WEATHER_DI WEATHER_BR WEATHER_BG WEATHER_BB WEATHER_BI WEATHER_SR WEATHER_SG WEATHER_SB WEATHER_SI WEATHER_MR WEATHER_MG WEATHER_MB WEATHER_MI WEATHER_VR WEATHER_VG WEATHER_VB WEATHER_VI WEATHER_JR WEATHER_JG WEATHER_JB WEATHER_JI AURORA_LR AURORA_LG AURORA_LB AURORA_LI AURORA_HR AURORA_HG AURORA_HB AURORA_HI NETHER_NR NETHER_NG NETHER_NB NETHER_NI NETHER_VR NETHER_VG NETHER_VB NETHER_VI NETHER_CR NETHER_CG NETHER_CB NETHER_CI NETHER_WR NETHER_WG NETHER_WB NETHER_WI NETHER_BR NETHER_BG NETHER_BB NETHER_BI END_R END_G END_B END_I CLOUD_DENSITY CLOUD_AMOUNT CLOUD_HEIGHT CLOUD_THICKNESS CLOUD_DETAIL CLOUD_OPACITY CLOUD_SPEED CLOUD_BRIGHTNESS CLOUD_VOLUMETRIC_SCALE SKY_DENSITY_D SKY_EXPOSURE_D SKY_DENSITY_N SKY_EXPOSURE_N SKY_DENSITY_W SKY_EXPOSURE_W SKY_HORIZON_N SKY_HORIZON_F SKYBOX_INTENSITY SKYBOX_OPACITY SUN_INTENSITY MOON_INTENSITY FOG_DENSITY FOG_DENSITY_NIGHT FOG_DENSITY_WEATHER FOG_DENSITY_COLD FOG_DENSITY_DRY FOG_DENSITY_DAMP FOG_DENSITY_INDOOR FOG_DENSITY_DH FOG_HEIGHT_Y FOG_HEIGHT_FALLOFF FOG_DENSITY_VANILLA LIGHT_SHAFT_STRENGTH ROUND_SUN_MOON_SIZE WEATHER_OPACITY WATER_SHARPNESS WATER_DETAIL WATER_BUMP WATER_SPEED WATER_FOG_DENSITY WATER_CAUSTICS_STRENGTH WATER_PIXEL RETRO_FILTER_SIZE WORLD_CURVATURE_SIZE ANIMATION_SPEED GENERATED_NORMAL_MULT GENERATED_NORMAL_THRESHOLD GENERATED_NORMAL_CLAMP GENERATED_NORMAL_RESOLUTION + +#Program Toggle +program.world0/shadow.enabled=SHADOW +program.world-1/shadow.enabled=SHADOW +program.world1/shadow.enabled=SHADOW +program.world0/deferred.enabled=AO +program.world-1/deferred.enabled=AO +program.world1/deferred.enabled=AO +program.world0/composite1.enabled=LIGHT_SHAFT +program.world1/composite1.enabled=LIGHT_SHAFT +program.world0/composite2.enabled=MOTION_BLUR +program.world-1/composite2.enabled=MOTION_BLUR +program.world1/composite2.enabled=MOTION_BLUR +program.world0/composite3.enabled=DOF +program.world-1/composite3.enabled=DOF +program.world1/composite3.enabled=DOF +program.world0/composite6.enabled=FXAA && !RETRO_FILTER +program.world-1/composite6.enabled=FXAA && !RETRO_FILTER +program.world1/composite6.enabled=FXAA && !RETRO_FILTER +program.world0/composite7.enabled=TAA && !RETRO_FILTER +program.world-1/composite7.enabled=TAA && !RETRO_FILTER +program.world1/composite7.enabled=TAA && !RETRO_FILTER + +#Disable Fast Leaves +alphaTest.gbuffers_terrain=GREATER 0.1 + +#Allow Low Opacity +alphaTest.gbuffers_clouds=GREATER 0.005 +alphaTest.gbuffers_hand=GREATER 0.005 +alphaTest.gbuffers_water=GREATER 0.001 +alphaTest.gbuffers_weather=GREATER 0.0001 + +#Enable Beacon Beam Depth +beacon.beam.depth=true + +#Custom Texture +texture.noise=tex/noise.png +texture.composite.depthtex2=tex/dirt.png + +#Custom Time Uniform +#variable.float.tAmin=frac(sunAngle - 0.033333333) +#variable.float.tAlin=if(tAmin < 0.433333333, tAmin * 1.15384615385, tAmin * 0.882352941176 + 0.117647058824) +#variable.float.hA=if(tAlin > 0.5, 1.0, 0.0) +#variable.float.tAfrc=frac(tAlin * 2.0) +#variable.float.tAfrs=tAfrc * tAfrc * (3.0 - 2.0 * tAfrc) +#variable.float.tAmix=if(hA < 0.5, 0.3, -0.1) +#uniform.float.timeAngle=(tAfrc * (1.0 - tAmix) + tAfrs * tAmix + hA) * 0.5 +#uniform.float.shadowFade=clamp(1.0 - (abs(abs(sunAngle - 0.5) - 0.25) - 0.23) * 100.0, 0.0, 1.0) +uniform.float.timeAngle=worldTime / 24000 +variable.float.shadowFadeOut1=clamp((worldTime - 12330) / 230, 0.0, 1.0) +variable.float.shadowFadeIn1=clamp((worldTime - 13010) / 220, 0.0, 1.0) +variable.float.shadowFadeOut2=clamp((worldTime - 22770) / 220, 0.0, 1.0) +variable.float.shadowFadeIn2=clamp((worldTime - 23440) / 230, 0.0, 1.0) +uniform.float.shadowFade=1.0 - (shadowFadeOut1 - shadowFadeIn1 + shadowFadeOut2 - shadowFadeIn2) +uniform.float.timeBrightness=max(sin(timeAngle * 6.28318530718), 0.0) + +#Custom Blindness Uniform +variable.float.blindFactorSqrt=clamp(blindness * 2.0 - 1.0, 0.0, 1.0) +uniform.float.blindFactor=blindFactorSqrt * blindFactorSqrt + +#Custom Biome Uniforms +variable.float.yCold1=if(cameraPosition.y >= 93.0, 1, 0) +variable.float.yCold2=if(cameraPosition.y >= 123.0, 1, 0) +variable.float.yCold3=if(cameraPosition.y >= 153.0, 1, 0) + +#if MC_VERSION >= 11800 +uniform.float.isCold=smooth(1, if(in(biome, BIOME_GROVE, BIOME_FROZEN_OCEAN, BIOME_FROZEN_RIVER, BIOME_SNOWY_PLAINS, BIOME_SNOWY_BEACH, BIOME_SNOWY_TAIGA, BIOME_ICE_SPIKES), 1, 0), 10, 10) + \ + smooth(11, if(in(biome, BIOME_WINDSWEPT_HILLS, BIOME_STONY_SHORE, BIOME_WINDSWEPT_FOREST, BIOME_WINDSWEPT_GRAVELLY_HILLS), 1, 0) * yCold1, 10, 10) + \ + smooth(12, if(in(biome, BIOME_TAIGA, BIOME_OLD_GROWTH_PINE_TAIGA), 1, 0) * yCold2, 10, 10) + \ + smooth(13, if(in(biome, BIOME_OLD_GROWTH_SPRUCE_TAIGA), 1, 0) * yCold3, 10, 10) +uniform.float.isDesert=smooth(2, if(in(biome, BIOME_DESERT), 1, 0), 10, 10) +uniform.float.isMesa=smooth(3, if(in(biome, BIOME_BADLANDS, BIOME_WOODED_BADLANDS, BIOME_ERODED_BADLANDS), 1, 0), 10, 10) +uniform.float.isSwamp=smooth(4, if(in(biome, BIOME_SWAMP, BIOME_MANGROVE_SWAMP), 1, 0), 10, 10) +uniform.float.isMushroom=smooth(5, if(in(biome, BIOME_MUSHROOM_FIELDS), 1, 0), 10, 10) +uniform.float.isSavanna=smooth(6, if(in(biome, BIOME_SAVANNA, BIOME_SAVANNA_PLATEAU), 1, 0), 10, 10) +uniform.float.isJungle=smooth(7, if(in(biome, BIOME_JUNGLE, BIOME_SPARSE_JUNGLE, BIOME_BAMBOO_JUNGLE), 1, 0), 10, 10) + +uniform.float.isValley=smooth(8, if(in(biome, BIOME_SOUL_SAND_VALLEY), 1, 0), 10, 10) +uniform.float.isCrimson=smooth(9, if(in(biome, BIOME_CRIMSON_FOREST), 1, 0), 10, 10) +uniform.float.isWarped=smooth(10, if(in(biome, BIOME_WARPED_FOREST), 1, 0), 10, 10) +uniform.float.isBasalt=smooth(11, if(in(biome, BIOME_BASALT_DELTAS), 1, 0), 10, 10) + +uniform.float.voidFade=clamp((cameraPosition.y + 70.0) / 8.0, 0.0, 1.0) +#else +uniform.float.isCold=smooth(1, if(in(biome, 10, 11, 12, 13, 26, 30, 31, 140, 158), 1, 0), 10, 10) + \ + smooth(11, if(in(biome, 3, 25, 34, 131, 162), 1, 0) * yCold1, 10, 10) + \ + smooth(12, if(in(biome, 5, 19, 32, 33, 133), 1, 0) * yCold2, 10, 10) + \ + smooth(13, if(in(biome, 160, 161), 1, 0) * yCold3, 10, 10) +uniform.float.isDesert=smooth(2, if(in(biome, 2, 17, 130), 1, 0), 10, 10) +uniform.float.isMesa=smooth(3, if(in(biome, 37, 38, 39, 165, 166, 167), 1, 0), 10, 10) +uniform.float.isSwamp=smooth(4, if(in(biome, 6, 134), 1, 0), 10, 10) +uniform.float.isMushroom=smooth(5, if(in(biome, 14, 15), 1, 0), 10, 10) +uniform.float.isSavanna=smooth(6, if(in(biome, 35, 36, 163, 164), 1, 0), 10, 10) +uniform.float.isJungle=smooth(7, if(in(biome, 21, 22, 23, 48, 49, 149, 151), 1, 0), 10, 10) + +uniform.float.isValley=smooth(8, if(in(biome, 170), 1, 0), 10, 10) +uniform.float.isCrimson=smooth(9, if(in(biome, 171), 1, 0), 10, 10) +uniform.float.isWarped=smooth(10, if(in(biome, 172), 1, 0), 10, 10) +uniform.float.isBasalt=smooth(11, if(in(biome, 173), 1, 0), 10, 10) + +uniform.float.voidFade=clamp((cameraPosition.y + 6.0) / 8.0, 0.0, 1.0) +#endif + +#Frame Jitter Uniform +uniform.float.framemod8 = frameCounter % 8 +uniform.float.framemod2 = frameCounter % 2 + +#Disable Frustum Culling When Necessary +#ifdef WORLD_CURVATURE +frustum.culling=false +#endif + +#Disable Entity Shadows If Disabled +#ifndef SHADOW_ENTITY +shadowEntities=false +#endif +#ifndef SHADOW_BLOCK_ENTITY +shadowBlockEntities=false +#endif + +#Disable Distant Horizons Shadow +#ifdef DISTANT_HORIZONS +dhShadow.enabled = false +blend.dh_water=SRC_ALPHA ONE_MINUS_SRC_ALPHA ONE ONE_MINUS_SRC_ALPHA +#endif \ No newline at end of file diff --git a/shaders/tex/dirt.png b/shaders/tex/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..14dd337e9666a7ec97c6a4b06b547b74def7bfc9 GIT binary patch literal 83276 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�h<9-{>68@J*AW0=*BG)=yC4tok zDrIL904MJ9u#EESH@BJU^wq}bRwxnLskO^q6yX=GJ6Qh$7j+W<{XBnq00000NkvXX Hu0mjf$?Ml{ literal 0 HcmV?d00001 diff --git a/shaders/tex/dirt.png.mcmeta b/shaders/tex/dirt.png.mcmeta new file mode 100644 index 0000000..1902a88 --- /dev/null +++ b/shaders/tex/dirt.png.mcmeta @@ -0,0 +1,7 @@ +{ + "texture": + { + "blur": true, + "clamp": true + } +} \ No newline at end of file diff --git a/shaders/tex/noise.png b/shaders/tex/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..71fb2f29ae8411e3d73a6b73ea05c61de6a30e9b GIT binary patch literal 678019 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≺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

8GB# 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%0D}^|s?- zb!4kVTmpG%s16&{(}0WOa1rD;RqF>0dY#BuH2jR&BcSsqwK}_KdOf(jgq%}Ww${u( z8*VcB^B`Vi_!iDFQ-!2Sd-%B`8kFhVarVh5`>P078BvoK*E;Z07j$Ce<%0EO&Rdyh z?-{VlMW-8(pX%A$5@xn*`fA=tsbg6(pqh>;cAm1-6ojqX=kA7+JGz)4J{mDdqq~~h9RaxsZU|Npk3UqCp=+KlrUPr%N zAI6M+4&{(IdOleQT>Xt_{0O;-wzK_zlFn#qZij%!aDu=eRXQz_es7aJ#@%tye~Xw# zk=UKo!!0xsu#vX=sCJf>(@zyzZOjh>UWdRtI(Wd2-t^5=XxRz%SkFh zmSHdA{!7T-NZci9Qs0fYgW!>7@$fpbH-OtC@VqaFrj!C~Q{axp_!?$kQJj3Pj(0<; zyQS2k)NJ?Qb3XYw6JA!DUsV!MEY+QCFbvYI(D}gllQlue>1yoX17~jyom}Z$2}xte zUM7-TOln^~z1xtxSuhYp*P<{N@E6L>TQ$ywO4nL?uL~YFv|fejfRP2_c}Pts=DUnl zTIozd>~~_0mBjBPzFf(^Ol9M-#I=4n8vZ51>r^%-;4`` zX-yY9y9x!<3+AI*G@*c}WvB_{>kh~he2Yfg%Jie29+@OUA9 z1$xzrgZXFz;2R^bqz)b7vM~<&Akt;7`IyjKp!Ip4PL9}l=`9!df3E)A6|?+6H;C$% zfVB)N%kGnQwt8|h(}Rh6M#_#7kHe+|5?aMOLj6uk{#Az$^v#wk2AR!0uaUIhFLEXk z(u~_hu{XCo(Vry;`RKG;=p*8v5zvy2&Cus+*-pg%t_$ao5;+BcBL*+`K)-7GePp_7 z^pUZ0k#&iN14A`d7Vk4ogCFxV0 zDRT-}+IphH>bq)$4<3l+A7O5?8&9&y-AVI0BST{~ux`*g(pRU+_mS5}v7?yurDQK~ zeyx@}vgoI}_5#VKF}Rtq(}0eu64@%ywv=wQ$uiB(25_WeCjm>=5#P9=g`F>P_#k6? z3vn_}Zv?n;!MXx?Eiz_If;=YlT^7E?#EY_% zjaep5Z*5v>aF>L0LvWjr>nqr$8a&|P7Cw28$OTf5Nx-H_^Q;JaDbzUbb8s~w^OSRS zz#g>q>!swQ5?ux4?TBBbOoo}0f?OMeeO3G`V*jG;0Xedf#3wCrJ_ULg>w%8^2giTM zU{9W&m-GgSudc8fSWa)mdw}?yQZw?TX{~8^f$Ay5)kbuY<`<=p5VhS0??U>Y#7n8j zxV$sxLt_3PSL1=|4e<>UeRdW$eMi(E001BWNkl0&Pk<$tEB*u?0@{$IF&x)_l2S3KDW5i3bZl8uXxoA89kCniFZs9K-|DgCixUjlz zeiY)}&f;m9bTqh~k8Z{29SYBAy`fI{hH|>ue6|z*Ai#Bo-4@$xw7*J&4M=<|^o^P7 z2EHf;tU(f|F#bZbe{ryth0j*2AyL#r6nbgBT;uyv;LkKT?DMrL{)>ahYq2DYwrMt1 z!QC!f9lL*3m@U=doMc|Hb3KSJ5~etW-B`HU1a}3h`x*XlQ#2X68HfJB!Ch3=XKcRm zW(xhF;MYhvgjkD1rw@@o+IT)dod9^cR92+e*>br{!sgn3Q?dUjIC?(5r&jkWQ%!Ju zDO3$@v!R~;2=E!%U~36~nxn_G^|w~NT=gH1o|1S`h2Dh4OdQ`R%)1q)BVuPAavPFQ z8hDo>#SZyRCkInfrpQ{uR?DLIbL7z0>K_36QlYDB z+0&LgTl@7)vcCgbK=@NgSC`{PC#-f*yq7@h68NtM;B8Bc1mXn}RpIag0iH})L+as< z0hq45%Ztz~OCJnbe@3n%xOL!OBH`^sZp+#GiPJJk)+I%2p}vQ@8)A1tF_A>?XxvS@ zFJp0ct=by}GtRZ* zlJF)BPjQx{v^tCLsD~#3c(oP0S7t^qFehRC6q)%V`YhwD^3Ct{;X&yv$JXEiZl2a1 zID9-JS7KaRq(|k{W|=t=*`tuN5!>$@cb%=eOFj$3ZiG%JU^;;h3D8ohRRSK*2ghsm z5}#hB+21kPUk0YTa;jxkUSO>~$~u z!G{X{kTh4bXnwgGg3tqm-yg2n?7X|%Vq--^m>iPP|_x}E-<*gZ!hA>sWLGP z+ehgt3i zy|C!#n;R_lizP0xOc(TaZy@#Vfb~8CLrAf$)*ALD9LaVO=eDb;0|iU>ATM73)tV znhCs*fL#gD1Y6&1@ext&lvHMPA}g5;Drp9x;WkLQ^i0MUl0JlMx2U`cr3YfjRpSsn z%;C`_=|${|h<85)0~nr#@q) z?xYS2BDA8y1R#&6U}qNqD0&K25~x=tv=JR=?0Y1vk=liF5&-=OJrOy>AZxcxp@W9A^`hqbHu<)v-CQw7hTBP6r15tRZ|&Db#=Me zkkDNqSr=MRp-axfPtG|H0RI&A({cJe!KRj~U+nl#EdS-KGE3LTL>uv#=3iRoX#obG zP;6mFQTh$F&c?IL)i&y4@82totUxVtmam{Q$Q(PQ&;c~sLBOOo2sy#wPsea|bi%N6_ zd<740v!#`Sn=shvgwN49A0qhHXD7^biiSeb4Z_ZxHV^4B=)CHXdujYtBy)^kFJ1QP;D_KWphK0FNvM`Zp9}7awK;K%y{S(|;;2I|p7gM#%fa@dm zRMuKs?X4;CKEW;k*vaFIB%WNvl&}hrau>!mg-M7b6SRYcX+Z2Ux<^jeH_!)g6~eIy z9yL+l|IFb$z8B*|LXNfh0w^zpF}C=#DYe(KYYYDMrOAtUdTfw5X4^X@K7e%3dVId0 znE-;8IX)=OpLUe-)G5k;L3l$oE>ln&Jy-I}8TgcC>%rUq(o?`c(I<-c>n9hThU%4Qz_jp(~$ ze4mE>Q*19`y`?=^LIm-<%zns8UPb8H0*I>F9TXiQ*29)r0r^a&o>92Fw&sK6Ug|q4 z`8se$V`l=kHyQf8!M$qO`;q;QfLj1r%&kocw!qdgjN1}X2aAg;r8H=pBD-S#uvF8E zNgtamtF|vLXLC7SWZ)s2bhhos1ONS;zX!4fMe;)*j7RhXiY_;1Jq!nA_%y9lDCTQ9 zi3MH!>=Rz$+8jI>=`mD|X8A?w!U2cxjl)e*7{v1aQ+SZ1okPHZoM^#MJvJt3clFo? z+r2WG6v#cO**p$^(CjF)U$wje5^kyGH=fonc#badTOof6PQ2jIK|rVT@PTUly$4-t z_F?k@2v51{OV@I+-!5-nrm&;5I!AVE?e#VEB8es`vL>e{+2MmQ_m&8i&Oq8$)={u->8=+6x=5KEP2*8W6+UoP^0sjr~ODXuG zl>C@s8)Ij0Qm#woJCp`*d1|88Q<*u1qTdNWUd6_x$Qa-}74hQ^?~7pvD8JNbJut6H zc|1$2llC!c?FmZzoQ#I5OnIp~RS*8)z?K@l9;n5xdMtq7XY`SBG(2yboPxPB`Vks|2G_;l8&LQctBJ&_r>)k&-r<;;0<;0RMT~X{G%o`0`c^Z) zx{T#cH58S&a9r`5C8@RH?ht-zaF(l?0dG*nr&^gyaBj8|_X=?p<3$RuCH8B@V2@*_ zhw(7W+D5^jmRT?2JuW?@z`m35Qm*FIi~6x>vaKF>z;=hP(N2E@ZZ20}*!r8s>Lx3? zFq9WF@EVEgi1LprREvO))85rZ;u)J}V{t_a`~mSnU|*fo_odL0tUW#-{jaWSLgE%e zd}z?-eDqcgf1T+o5&YcHN4fRQ8MD{0=?>}5%s31_Xrk9y!R{8K%pnPB-XE9W_ShBM(-&0_o z#LFV_0Y^!sAkrA3Z=rrSj_UCETFpBuv9df)%j9Muovqp@n7HhqoLE`m3Z%r3jo6PjQ1R@G_JF@!G^*erwYErt_Q`WC2u z#quR7Z!E?yD7?qTi>UfNtJi7sW2NZ{;=09rlM~-B)SsHQ_2QudUvWM=sR9gB&N$C~ zs6@3zDw#k}<>8+IUSfld1YhW)w-H|vN3F|pD=alCV26~oq9AX`!J7l{qJ$HTsD$e4 zQg|rG(;9A2U zP3r?jjV$=r7yKbP{IKobnNI&Nru}kwo{laQaE6N>hlvlh-AOtR@o2Z??WKAu3;QI% z^&B*^!P*4)h@&D1Y7%%YV_#OdU1R;Gi@qwh{!$uL$w%mhNlNU$4keqmMImodEx8`_dTS3ehdVc^HU`py=$NMp^x3r{76Hm3 z`_?ioa;6gq_B9HI!ssPT>MDJ#81zE$x`Hm_W{Xx|P%*w(y@E(JPc5qT^NzaM5(6x7 zXTZDE@MAIP>qh6S=qT2gJMb-1xHA_|%ad;*TpfmQmgHNI{8k{oNSF&S94g>{Mfz7O z@EyDd=|7R$8>2~CYZ0;kG48*lXmN~xjcXsmstThoBeJc+y*Ed`Q2b*DO%bqL6&jo| zeVeKQ!Wx{BYpczFm@KG@Urd9wAXtjr?=c=CqG`M^mC|J~yEB&89K-iA*s%dDVeZtb z;7dQhTZnnJ@%&odmV(Pt{FEO~!Jxf%pQuRPo;EK#a9KmNMxr?YUhIP}2)!ePdvbP_ zjD92L2gRN=MH_0>KlyNxQoB6$a@zbu;J?JhBM43*`3-`7DSpbBPbF*xP3s)|l7Y*L z?AgUmvxMCz$Hp6&b-?-nEz7{urJy4<_j~#MC-w3aTIS+UY;c(`w<}yHfR8}Yj__`_ z{$IxaH-j(Cpf@f?4Lwj#ftmk>!(1{$$(t#Bii@2w{J`?>^3cA@!ZMe<>8RH@YlGZr zHtYe>gN9sJMgIb*VX>M7xJ(;;up`?X^WnQhr@J;|FyurE>@F#J8@J2U!*GBS+&o26*3 zvDoe3Hvcc%du%_p&m&vDuN@5z+;wbr_^?-zLv7w()VKY zr;i>bcv7|5C&{HDy~2swC-nm%dLe*cMCj`z=$Q~pTywZY-;d0AfhV{@k;m&Jad)8C zrp$)AVnu+mrS8cxzggN|fz|3-(jY@7l&Yjn*A>zG>n;0nvDimZ!+9kUivkUlM;khtnfi$>GBxY+g&ZWBOkVzpjCk zi^<+Jo^9j>5+2Q?CQ?0kvG^XFhw|~EocMsD8EG)eh}RhEsO6n9`jo+sEAa+bY^Vfj z7alCZmwDtBjQ^lywFT>@^+^-mnvdR2$`%Ig%b^DhdQpM56gAmKJDEtT7>; zP-W&Q^Don*mFi*S9uExw?$fU9U4d$a{iWDrRu7irhLGG@>ko}+ zCxxdVu(B>#NAY72{+L5Y0x&s+S9$&<9nU+RZ|~`A(%^FtUy}nH()hc&=Ef*qQUHGx z>!+BW#o^v!{dNck3%jSwcLB6FqfQp$0}_5K!)Z#F1M?T9cY5|#sdB&!a&#+BN94t* z9DfM&lU%*m*#0vz0}*^RRPO~*owPMtnbm1Et4xipR`=%2w?6sTqGyv%AEx`}(KH_K z1A2%9pEy-CKdUc5nu+KarMje4lfZP$ze?Y*?OLS&BX(@DkKv?}|}>fly~?N;(OS1(A(g#<+xBWHug z$0OVi+jmp;JQX(*G^5CyjoqDY;z}#|ok$!)xFylO8Ec7nYh~`!x`zqA3&MJKzHM4tOOhiP>_E3T^6FXalIF|VPdoT5{C zH|K?8V)i6XGzaFn$ga?2JV`XpflH}%tHu{wCDk(o@FX}Qpjdg1&%IW|SmXR-d-f!(!vIabYbg#^gA41?2w7@S9s zBt=6Gr$ll+VRK!)IsrZ|;K7{VFX3%58Wy4fSvaE<)=8LyrJx%C#}xb}59b@RK8CXZ zTAXA}3h1!T&M3)z>jvF2dVdue6L|xh)BDThT{8DjWKQP8o+0mH3R@eBUtG{x;p5WO z2KoyvS39D-q5zz@6bz$P@Ir(IyPg}B2Aa+^tc&hqBSp@Nw5Il)= zH3Cf{(=P%?G1!m7Uo^g@1n(%K-5G2uU=1)6x$bx-e9xH6nd#b?&vH~Vq!&}us)qlQ zNe(Y2n`!>J*j(*6GZ7pn5?vJ7OhscK_LTCNb{^N_?|^;}^#rPZOR`n5`ZmjZ;rRC0 zT$F_KWMWmoRsp(~kXna!bfSloqNOpv8@MT!h4SFy8q@@+V~}i&%qU%6fB^ z*i;;C$?&UV@=YcI@c9|{bdZ>9;rL-KX3rCf>IU={0p$!!LuK=&8(8vUSCE6{aCsRUqQT|>e~V2g54TRa+X?*Dm>-kzqlk}_V4DqAVrw#VZUJbR zr7v)JCux3;;7@@wzsA{6VE>*gESGwF+KdGFMxdI-a(YCMI>`eO_&Y+ga%6Z!dm#G< z=2pkxb|^p2gM12h#MX_m^?{JP%fZG9*(GVNBJ^pG{urynoYd81C1nq1tShqMamr2+ zI80e5OHDh4HbeG(75OO19;9F>j9OaYcuHOv=>M|dnu_=i8ZG6~t0n4NZ0)aMQ$zE2 zm>*GqjkFv9aM$zfjw(2a(-C>E5fSeh@=*@{LF`97JQnb;mA>1d3mvxBshM4b=Th1Y zg8fG(ko{NVS%vzUp z^vpj1JbunpmFwpyFLra&d^Fd%^R#t9I)iAuga#+iiPll{vX;Ncs4Svy3j7CCwqHd2mWG~+GJag0Q7ulO0jss<*%u{ zEyEXFG2Mu)&IGFVy;Pvm`TOd`XA#ebYJg(z8NJNM46>!CkPKiigJ)N>nOt?D=HD16 z645dx+d$YsTSI{J74&yjx~r;C1too?JKZGKxXH(e^Q!HQquxJ`-3_B95Y51BPbSsX zrndt&!r(oSJk3>2ReVEj_9|UdPHJ~~g;JK2sL;#i&wKg>-~6J*mNL}C56+P2#UO5h zGhOoW*+B1%)TfHCa|)v+-=Or*^{lpOXEE~D3hQ#C>P32?(47bzltwL5*ehlA(`+rX z8%GX|@RXSL3E6ekq^HdWN&b_arG9Q*ZBPu7s}DnTKGmK9-GCFd8j^uz3Rh-9)BT#uXu7%CcLjY{`NE+7n3l- zpC{1d=Wb$bP`o~rhIlU!Z{(pkt17OQ(0RZsX=N;er zcMDM&MIsR;Bcvsxh)M}*7=@J5kfc&7MM^Y8QG{+PyOdo*Hi#6BN2x%WDaBt3?tTMkD zxGG1Q<$0H8PV+MV@pAXiqb_X@B>I{#o)W2RXmN@SW;BQoj;o##9&OODqS?*jx6`rZXpB--6?zUZM8|gv zdBBanbb?uK{1ca72(?VAAE5n2<9*EBj_}B$v!Ws0y)nJwDE%Z>*VLJB6nh~eW0Za^ zG&2Iy24z+?dha5P8l2fjlUJ3>_Llr-HGD(pa&5a3KB>qaZov1IY`+}tlVba-)L)Lu zBw5%>A$SR7CG-^Qyj2)ikl#@+DUd{tULxE z=h0;jdE3_yCE-LA{o#rdmU|LtewFu88JHD`sR=osfiDrfo|uyo>TyrKLBXUP{hEg+ z%3pmVIQbtLHHZ|nj}+s{wPv!9wZmExFd?+48cn1ymjs>C^7XWq6<{Nzb20MW~j*OJmF zD!Rm|r;6&|qIt+uwN5;-EPgfx7Bc5mRc(zARcI~$+e5RQD z8)RqIlqR@hv!}1KxKD+?KAr0s=Zi;5yGd*wB&IuurzgoqidtKKYlIIKaGyG7mFD9C zZ54s5g}xC4O$+u*6P;Dc)~V>?jJ+0%*3F_PW%PxLn)A|99Cr-KhehU%(XXCeJv96k(mda0l1jbiC=(!_X#qn2;X+1C)|9Mmv0{DZ}6jO7VId= zc^2G}bv`S|0V#cwlrKZ_V!3Ri%syfdLiM_({{XlHxf7^e+Js&T-QJczmZuXN^|%u1 z5ulZaK{p>P;H=&OFaD?A3*k7==F4ms3)@thE=(LQimjHN!NIT)JYnT!3Y^nm&%)?< zy*iXo8(cLfP`@KS$gtvNWtN-a}<31*(CwPq|0Z ztVfs_R-i*`aYc-u1aN1O{%y#kL_MO+{(5;h z>#cXWWMj4etH!TGJ>8OvA~08iUjyf-_ES#NLi!nK*wxlrDQ*k}amnI5acttX<@b!NLpOOv#VRc8h2If|$M zC)X!bZ;;r_$ub>xcfpMuj->cnMt=jcrP0fUY4{uTK8EUZ-~wUaSEy)7JA_(Ml}6w< zBK|O92gr^TVm>4F624{N(1d+G4{k@WZ_2ip^0|T-TctW+v)cxv5@=D<8A!}VZFYF( zDVI+Wa3CY+O1#FRkILjU8*Y=%gNpU_;2;+cgEmo6or~sD66{QujxaSYp!G$v<*&q_ zu58{sUX9K7R(>wQ)1mxKqvc4o1@=d+1{TSdSZ@i#KZy9ti#suJLu{@ipe72gw)Pfl zKEP%Q?&I$D!4)oQ%G^63Ip2ck5IM`DS&)C2_g)dHntHmZD9#kxGMs7E$^__>K(nB}LVzE&T>waPN^gU_Cd;mh5({It0m4>Z zoMPdeK#b4C}-|J0-w$GkGuvyu42HSKH6VIH4hR2GYyQ~D(zKY;jS%peYv zk|s5rR0QqH!yaC7C@4K$D2!C$P97{3@+=>aO1Xi?xB1{B5Z~{pyvI+%Xt08-DfyN< z-y(mm3@U$5pp_bZD(uoQxF(LzO`E9*b)lfq=(A&dP6}ny zV7UjHaZ+xb;el=)=Fg}rtx>^hC99Pj8iR*p+TY+d1=-8kl{ng8t*%Ssc@F=+z&E%? zTX~Ksmc@BtqWMPlr==q}7y#4@$I*}0djR=&MD)XY^hQc9cEVOtyi_tnE6^j19@42v zu^Dl~E~|$_6@%0>FxfHouJTF?oanHtKBck@iE&bGi|{L$EIUl@s&mSL9-ELKyX1vL zVp4|fXZDE<*-G(vh&BgyKF1F@9>#uKR&j!vwN31GE#% z&IbLCio1}4(D+XAq$DGw`KXGz;-sJ8;+D7YmnDMI~nSK zLp#0!p2^7MG@oT?1qZt;^qCo0RtCSS7Co7&67Vl5UWrRnszt$pJFUDX7d>2*mjX0g z+6U{=W(G$S+!e8VeVB9D9K$Cmw-z`{J@?z1MDqk2$I(!PpC?W^OHJpQr%-x2NNurX zTpXIp(o!rt#JX9@{sZ9pa$-v1^(l=Y6e@7${xm3+8Pv^CmUR+{f4e zs-BXjUj$ELG9{6x2k44uCdDRJXcQI@z#4pwA^BUnV2&_s=7z8iU z=%zB!szU!Sjh7YaohZ47CZ-nf-GSRaMTa8255WdWrvP>{;h#jdRSvGGhVRg*ou|7J zdsi7fmAkit5Jpi6}HHVg~5sNEdyS$;Au|oCvfyZ-DG(^SzmW(|l#0#P9WYxY#Fr`kWNcdPn9Ei1!CYq&7 z-Lj%dWAv^YzvF`!NKH70&}D`lYLG1gHYj0NU~-OdCkSu0a$l__Nhka#FyCu(!hzpv z`&(>3qF@SFUnK0Sfv%`PA7tPY9;q|B7ezORXeU8?tl1FZW&vIkkrnlLISBfC=6ugy zCt)82Iw*aLBm+3wMZuy1m|PQ0W8iif_JMjjz;{yhW#EIldaBX}R&+=;V`9Z;{bM#$H}Rue2s(7`jrB>tpb&0&OC3 zFvq5P<~&dJMzX0BKEvUvWNEXAACgxLRB}F&tu%aDxB!q`we+DfK?H1 z*21<^_z^>^BYUGqwm7ndi*^7#PT|uFdT|Nf%tfm>eBrqIJt3Y1rIo_I#K}kyypU4= zoMu*8SO@9JfUUJ?3s8F^x+lwemy*}IWV-LaN0Y6h^wN^kwGeL&?fH$OCaHI}u>FmC zv0z)$;=ZEzt_aT|&ai6KAqDqi@s^DiMeY?=wios^5soYAuL|Vdf6y`Len=DN#qPu~ z-s-}!)cu>NaX9}?Mpn}3HA;S}v@0?F0+2Ih>30l1#=I?o*AjLYq6>6%PC?&MZ_lFo zUEf|{MZ22(%fL=LPP*pF<3P1jX1|5YB|4+djB6D4S{w_7Y59jmS_%ZwAgoS@251f768@WB0+D)F>yO#!F*asi_vTCEQdX zb4%z-g;(UsKQXHh;s;dlK&5TLWsQq_`H8+PGfSFoP@FG=M+xs1in*BfD))au;yDy% zfqnzxt`OW0?MiKrhx(7m-YW19CEF~rJFLF!Z*y7(^rA8=bhi|`xy=6Qi`iCn0PMY=+R9rydEf!uK>-Kqk#R2<%n(RlmuP=8S^}NyjlYAzkS0Ov93H_V1kEEL=_%%;o z#GGrb(~{XPlCMzg8|psd@;?gUoH*(Q3!NIGU7p#Q#tp7GgybfSH&wb9mw2<1npS1b zOMtsQ(^Zm{wYr(M-y8Y|#0MaF9OO>cjn9hssR+#~f%PufUJff_ecEw!3$a%;fv<#i z*}rlvRDWjlKaoAJ(KgHIRS7u4$YDy1;c}7(+c{=4)!$T@qqRDxN;j3MtD4A*Q29S6 zobg$^8-R6;oa5lGmT&jO83)3jPtN@4!p+3}MT2t?>|9G9PT6}|v8*ya1MsfGy$=WH znD_vS$M~k*3DK7YLtJw)0Y8=OCEC5N=>BT$4v#-4`1%uUhTxYc!4kc>6Snbr0{=Q?N{~;WETczvyIo67Z#@SCkJ}7 zfWr>sA53vkTzrKVhhp(FLhrj~mBO>3ZB6iDZO&HcUZ$@|$7@5m&*Pi1JCVaL3$Rs% z`Yusg<`{PmpUp-ZVqM@yHLfkjHYX zr#4aWm$5SnXf{u-63)YfRRhFgvkdZ6)8PChxXX{4!Nxw7*Dl=&9!`@Qo=tjF@Mo{Vzk`N${fyb~AB%VeqH{vjAOMPm>mmj&pkpg%u*|djh?6 zT-H{}TO8ZLM@M|R&6AH4wYmg13Dcb6l?rsgL75Kk&P5wU6f5xs6mvNpg7G>Idgss> zY9A%>V@`C9XH(he)>_*pVJOK@lfn5E95;AIfj(a4c24kC7*Bz`9q{vca&^omhkjF$ zxiwpTW9R|Ic4g6$EE`e*@9@wL$srU23(-fBUP95kG3H6|W6}~AFLzzX`unqRMubOL zHL|214`FZ4)UpHMtq@f&Pn2_&pYN2BB>Lk<(v z8L@38e{Ln|fa4V~%qq1V*$XB8seorjd`^(~B2FDBprH-HnQ=JS${8BW1aMSQKY0wc za`c+CtYm1VVoTCqPvl)$gd-Bs3=?dD;Ap~ZO~G3b2_rkS0uQc$mkIuE!H?3;gU#We zuG*f5Yh2z!=zB`h8A^01MK4R;n3fZ**;tBfK3-XGAI_5Hku%m2r+fN;DYC7JGfXAk z%Oo-;HM%j`wqO`XYay;>bh%S@iB2$1UM#1dDwreU3SGQ45&h6aFG@xSgt&w1Gib31 zC|#S31{hO8Y-2O>Pz5GQ^t4MB6Sz#-P8IkL#Ig>*38=5a+}z{EuXJIKU)o!yTSKu7 zMr#1rj_lZ?9Hn!2u>A63$XiT;0#la8Q8^YiljbXv zU?q#Lmtv>ZcNT5B&aOXf--qBNf_he)L6!O$uaqSv&&v9Q)dbrHe_YBX!s%_CR#BWw z7slA&1}(d2m4&u9E}n0SAq|)EkOg`Tb>~|rN!X=;b40IWY=ooUv-ar-zpUM_T3D6lAY)iV3Bkkm~J}IUCD~k@(P2cL4y3G$+WFjX@!Zb_+X8!84_x4bgnp zHeqCACUKSZhBd%>bznwGL{9i!d3ZCn6QLy8@Omz1rtv;UjE(i<1d#rkoUHL61b?RN zdqlSt`01Ff2F`gF9EPGkD_<0(Pa1rw;Wljt8-I$9+eGkd$hKM8QAb_0e%Z*Gv1oCS zK3R}UBYB!tJAH6V3ifbFe_tKqx?>1#6>?iKT9mgF>YWZ4j4QLN%cH3->W;(Daq%gn z#{e|fdQBpyna4Iq@B+m4!+22%994Lu2e$g&^APn7_2qtaCMb2X;m|sBgJ+(><}?B> zV`7;L&ijwv5yQVJc_9(CaqTIMQ4h~tk{}l-IWv>mk7#q>snYQ>PA@7C@5{(`0)4C9 z!-lu3v=5z##)tOd6j~kf3vr?@LW7{b$HVv4!+~+>B?3B>!)n6M$81+5ZjpuU#b|?v z%BlG?>8zwOTZy|Q@r97TZo#I&+*M097xBalUE8F%)#U%SqPK?YLiCbOjw8C2OTOdw zSD@eY(O%?iX=-jyqR;a7OvIj(w)25#S%o-H#z#{4t17oL<4&Z`r39aE{Wi#4B-Mk* z_0k-^IOU#^aQ6%HOGs}`+g&ZZ0z{{4wz1xCn-5P3)LBBDTu%1YM3V^INclw&e5l=) z%o$K=Ua56E8@&RU-WL5(MRsFSE6uakoZUbtVp3qv*}gp{=?aL?rJ_TGUXZL)qiWk+ zTo2@Aq@OL>4`VX*FuojvRW4c|!mA5*NXicPz#qhXMDz)Ra#VN9*paTjmzW$8mjH4o zLi;?}Uz;qkzjH964s|;Mj|+MmLE9WX!J4Xa-MPYE2h9&2eZR!U9>K4rq61}OrWSu$ zH3i#+k^Mb}zct#W*0#;q3T02PC7T^Qq=`u}`++w90QG!m-o{|7Mz0^k!z{R_rCmzx zpQnIn(tebWs!pJEQh!%X+FEpyM|R4%&NcVsz&iz0g`D0%EK7vE@!50BN*QIyhU_k^{Yj7~beuU0h%D;zaH#yN@S6)+4Q#hYe5uOzUon5$~ z(#|ntWr%lj@s^($CGduX8kw^DMe&D*@I@T-W%-ejx*fr{52zE>>>7o~LiJfwQdw|E zl<1|}e-*29D%j`L8=iJfC&|xrazRA80{aW1A1Bx&2{Oo#Ck0)@WG#++r0kEm_&HSU z&ZEn@zDWi@EByi0KRWVb9=8Fu-a{9Z+dV*EPcu(Lw+^z0a(Z=yx}?AiPXCI~pt#gc zh3ARlA+Na9lh3)}BkcWaaZ7-osbQC}pduIDRv&c&qKCyJS+uoA??>`#f_51GV_@eI z{}#;Z1zaQf2MPDM#gEze!i4Nxr~c03*QGm`BsVhu*=FE80(up~bCg-e(dEATtP6T! zJc)j4VlAWa6A+2&yot}!1d8kh+vGf3Zw9(w16F-`0X=SuEA!eqX3t9B4iRKpN z7Y9w(8r>lY+aqsXK5>R|rwBBaky9<1uJB9JY#{nuZUzTxEKuJU;U6&=T7k~d=u)fu zCDlW&`cl$f0i5Bu>!sOQV3!%UjYOxU;!9EKA`dT7VxNfzqj(UF4sy5<&?9NKjkB~5 z-^rn~L-M5tmuvR7?;Ov_=ZL*Qg?;n-SBBc2%Knt{PK#eD7Jk)HMyW+PwN$9R2~;NG z(+vF>m?0KPwO`g!+aGyLwy^pnjSa^4d#ONY^Kh#r>+Up&B`KgR% zV7F>DH)YQ8!+}lIwE*%E;)C%h8}$w3`^R9nf6-z?R;KCND$~=z*9m?RB_2GeI~jEYbR^2FPd=xPnUR9vD8AU=!E#Q zK}|}K4VZlql1=5oW>}gQN3F5?*+r8Cc;}dza0nC|@khc80OUr_$}08LviMP^-l!G( zeXuOex>h)gUGhZAdniLTrolHJdABL`EuIPKM&=H4`AZI31MEFna;HaI3p5}SJ5}^H zG=nUDJ4**<*~<;2_i?u?@NX-6f)+Rp<~w>UgwwL5H-}rB!10xI8^R}9cwf$$dX#-$ za>J}M6@%{S++}GhE@Y=EpEgf7>kJs`)GVZ{#45!|!8Sm06UFO7hCZm^9pufcX zg2dv`EYI1!mH4)VxjzXexU{O|7G&Z=>y|cqP|FNz;JIl&t~WY zK3L`Bv7CNe^t$sD5XqM$>nJ1Cgi z0DiOhd+iR6QVrahmO>At#UpOG9W*SdX}q5l>O}NXV9pbu){D-qgrk%6!{*L(nz$gF zUSy)%cz{j32-{u;Of846m4|oG_`{;EC2S}`ixgiK_@l%0HPGpvK_(qs&2zUGisw{B z%R#YYD6ZnNfZ`hnxC6UK>cMzS|Arp4ndZp7x7xY2nr)?I8Rjnr{^_Ok(?u3jHZ8>u zCDNXyG7E7Eus27MVFOr6&hyCmT>uk>_N*57sB!*pM4Cm$u7a-hXQTyuo2bKGu( z--gju<@Q{sFx@TPdQ!ZJpd}7E-!sfc3q)~sZK1L@zPlc5$Xc%vERT7|61g$wJ?)V8 zPBb7D9RSLepf)gPDf}touP52Ugm<0wmxq2Xr1=umiSUyur7MGeWu@gz{p?0nN&OIx zzva2fv=CRsgR9gK7iT4$rqn|v@RB0WQTVxL9VI?oL^p)wR-XQV!j~P@J_|{$Na*1MZET!wqG_;>77$Ijg8wDzL4< z24_Y4BheZiUYC-IbfHD z;Oqh&qSU~uQcZ=pJ856>&3Y(Jp(-5puXjx&J9IvR36#YjpVgPb|7#khVFUL-4^r1iiV2a zWKluc2^zmd*!4Owu8Pc~HYnKV0{Wiflj_{_plJ=@#0J_oa;r)5B!T`5=*vETDCu0U z_zx*Kq6(@^)H@;9F}o8WpylK!?g!L-AD@=M|1dI4INyhf9wmBDtsW`CQz>y831=I{ z$|y`Hrg`aMZt@`GpJL}Lg#X6I1F(0NZ7e!NLZ=^1TzB0P^37V7O6pBe=@g z`zlq!Rd;y!H_P6r$6p^Hw~1&|N)o0e6hjjBEC!nxIU&;52dLgUx5;D;@hXd{4@zb0 zT=(Ua_^C3#!zr$)6lXYgJCc)60P2#@eDJ(auYfFG|!G%XLGEM_BcZX5PioIk*d0fl}`PXW*AB5pZs=KC?N6c*m z+zrtUCDPsH(JQlR}_CG*a6{(09_1dCQDZo7|E*+ z(suRPQQw`(+>^M!PMZT+^G6-LWS zytr`2glzNt>-m8vI1EMJct;^6i+Bqqt zr%3$)2^utBtL0dp?-HpD#d}=#zu4Z9lWzoMLn(S5NAGhz+T%wtSmKpUQgV%mHbXsI zhU)`zI^zqqY8j9R>e1mO9bAn@sPJp0^Nr>`1IBWA20|Yr(ys{`DDCx#FN3T@=q%Rw zajur6Kwj8yEWA=Wy=&p^p>shQ`Y5y$1M*8^-jne6uPUP?oFbfxjQ!{ z+AA@xfmUVRdPEzF_G|*)L+1O0z8~r8MmnTmeyo7|n}ho_X$`@-S$gl0^!&6cFUR+! z!|xH8mc!>r(#-)28cds7HoRaDcyeS})T;*Ua>-Q`F2v+%L%ul-zBT3m4lm3XTEgJ{ zNX)3#3w+YyFm6!lSFBPfK9qxXb#_2Xk9O!mj#hBDhQ2 zYD2*<<@hy0u9Wx+LuVxLMIpH>>3y4Gl?i=?huau3E35vLqzA=weDPm0-plzoTegw; zdv)>;Kh;s-MkKG|asL`|tu;56*r5}=od9jp=v@|{K=#cTkJ9cP5ue%;|K;n&fj%`w zKX&YTiZ4R`S=QN^4__u|O#)n{`4qSGW|i(#&<}d%8Q^TO`dEy613EzA4z4}}qOQt* zY``E(WWbhc#Vkf zX#BRZ>l@fK;&s>PWfyF4{Du?GATNDS)3Wz)`lpQDQbQjyw8}U)7;}@rdvW6NYW=^W zE%QLf65HUgGcatR^u0>|hbs5UZ1Pd*D2jsX0L z5FZS@rupI;n;RbF`xWFVJbY1PZ$nXYi8>wjKCU)f)8WI&97N84#%#;e%>{Pw7~dPm zEtS`+%={11nnX&MJFPfgt>sB&@J$LkBXFgL|7x3*=G_X@5W!26b|AKyf_bDaSXfnT z8^$x5qJbW3XX(WTAEszVDf}CS-z)sG&;HSNRMCuT!2eS3N*-Ls1Ksc==atSo3 zl>FzY|Ftqtl;k&5KVO6AQQq3HUdHP{^gI=RE5NT29Y#dg2pnYmb&l4CJQLIY&1jc0 z)d`uKBmS=~Ev^%b3GC#f2Qzp^Lf_6|M?*fv;7=n~Gk9lgyJg)wWpvF6{YJp9s6wZC z<_pPBj?miXa0z#xFZpwGQCr70EfuSk=%-A1ME8=+cv6|}l`^w%^d2(nL-LW}Zyx0B zOKb(z!v%WX4`(vnAsJ1~>n64ALT%2Y`X+|%RcO04Z+Y@lY@UFoC%5y3J`n54Y5O)7 z_h4{p1poR^)id%mWitSIpRnoDyvXTL1~0Q>QY?Rs?b?F*TB|WguB$K|B>h;16Db;A z)K@5W1e5MauT6vRdE8osO$mB55pT!*WEbu9RZl|}6um!>ntnd~zFgiUz(%T<6wHY- z*fUKJdHPMHUchuLp=l0k0pBXvw=r8#GGA1XO8~4+qjty0DazRm;b8=tG}>)hc#_9f z8U90rKacUWa$3ViRpul@iACDQ4ac7fO{?6 zTd%rjWv5fsZ_U6r8BiIa?_9gA=v*x59$4Nsls5{pKY$xt`#gfZj+-9Mz@a4iqZUrA zgF`tyO~U4(c}jrO1i9Am$1C847|+D?+5~zS%VS6I_!94C&7Q1TcMNt{8_1DZR%fFumRstgXAzhN**SG;PD-`OnCk&rm<3Crc*U{n zt$Z`mHv@2v)YA^j9zpREBaaZe%S%?X;C#pq$H@&r;%Z|)3)CTBomGlA{}+EyZBEXJ zp{}|Bn2&w9u?7y*@GfLe&XUGPGAzMA@MZhvYP3bK6}?|9yWCNKI`(#jZgNRWXm>#U z7-xS1c7rnaMeq;-FITC939w$6zhbjmnk#)UH6|z9OjjMrkcok%yg!uh>r&$I54SKg)x32?FN8pV{ zwMFRW25*+SrHVc&1LK;D z6{UC+vFm)g-U(-T(cS>QEzJqbcd_U)+0eFF99$G@wCtzk`!eoO4EC#H+nQinjDHNk zcw#POss-2c5dAHt&m70yivA^$U7S^CRp=ouZUX4F8TWY~o?*=whQ1z~9Rw{P&NvA- zMy55e<>mMl=q-dim%(#X?$b!E@p5m%u$dyGjNccO)k^g!uxBRBfV};kp?N9#R59LF z4u6Z`{S5c5LVYXHg$A^(xA2Q{xF`nmNU0QN)(zT>=E8TrWp3p994;fDj= zHlfEE^LoiV*I>TmY7e$AoB}fjR2*_{aL@y#=#`_mX(qg+nf@W8H$wa(;5{U|yTGP2 zf+j-D2+TfZc3JRwy>raNqnhE#mHsTsRsymcHLh-|bCuvGX}72O%}IBrua=PLDosuf zY?HkDT+3A@xv{?Vy$PmbFb8`zhty;e+>%Jm@ZA2Ge-QDX0y@T(^J(!kN4_T2HCEkL zBtKW+%kj1CmnT@3kgd!aNxe&p>6vl*u%GxPt)|=f5l@bmHa-@QkA#~my_gku`|=-C3+Y=NWldqe0G)dGgO^o(>nr-FuR80nl$(kqE`g|=m@)*kU1LN zk~6ysptUj^1fDGPxPqMr@qZXM$?Mqw^kb-<<a-azqlR(ql=n5JQ)Z*)E z{HBKSr+vpcv*=5m(*8Q**BUN4xwh5Cb1$yG_`KjZfX?hKdjlV0m$f@M+% zS#p&HRPnPZ$RPo(!dMX_M$)*PasK2g~eU zVw-7lUBs3nc&%hLOisY!5)2LtybZDQ04_M@6PNxElKV9HECW7d!6Fqqjix6N7vsJ!=1D9SW(Xt3Wt>_8I+YJ4c0qIgw?=%)R(?Tn+G@Qsu9=I5*DNHuO zpvHAb6Ll>vH1cqGLHK#OTkGCPrFf|q3?D@5YGJ!0H~^@YA)Zv7YQvLbJU77Z$gFqP zp~U)nT;+h?23JacC-zR&@eQ(6j^lUIurbZ1*060UR9}V8q96_I1kp9iur`-w16BU>aT8 zr82EqVu((^5%DRQR}=O#g=ILp$y1QQ4UEkJem@B76kXGleV*XGp!yQ&3mbGdsqZhs zla7Xy^I<0?*VN<1Idw}4yqBWGDJUxZi7!8c=0{0}GxM-xWhGwZ>q*dhijJWCy4tOL&-{km~hNweU+xF_zfzH+ z;zFwX1mccDIPGX@CXL5g^^#E+bA2bV%#9v)MPH#ynjCKMR@TDxCj1r1dysmuQiU|; zaj_wYXM545HA-vvYDnh#;7ekihz>+#ra?`!yxM1Hax$IkCr{St3NsXwt`+BB0;t!`57lWb8A3t200#l*_!^L9$Bs)@rxg!=&J_%B4zu0vX{{L zQT#m*ZiS_3$*`8oeH>2l?avffr0}aQxK4{bIrwyrY^oz0>v#=H{}j3#0^2kUD?nUC zdV}N}WO4#Q50|46<+Nji$5d)?BmF_kwT|ix)IHo@qR3TwHW*u{Laj!sg$?Id>t`$A zR>Ek}Uo1H-pb52VYY~1|!i!4!U1RSll9ny~G0hWMpDi$Eg0Y_(-A3tg<@S4k)Pk0E$MzW%RyOwso-ZwK9bM4}&L&-m_z z*tTP4R0iyG$g9Lj68HZE!3Ut0;{pKScYo`jXS69HGfBv(kdYOUkP;2ub`&i_X=v{< zTSU`}C_6$%2pJivG)`yyILMl{8B0wUM69 z;Xb6_&V^mldT2fUnW{sQ{~1`vje8B`-9<7mz+;%Z%@?(a`SrMJ?SMW2c0qUw=Dnrg zi_?oJzD(y%c0tD|SSjKv~rwUzc z=#0Z=Wt}?6;}rd0d)H*?Ar!-v<}}|glBp9 zDuy>Hcv2x;m5;v8idq+KDw}1VY@^5>&?Z)O}rFv_z z2bZ2k{x@Fo45Ob2FtnIzoCjU1L{}u5<7fyEPCM?O7mKD6tSEuXEPBGn*J`#MqOE}* z1JDDEz1xbFEP6i3G&k11K(;?5<_5_yNm?e(5133YS?5NmYY;x3fXh#T59iUHHaq z1n;!G1x9{w46Ua4xaamE^c#&{ZE)YBaJ#G5QS^rr!zCUF;vPAF5-5D2g3}Y#IA%K< z@RUQ~e64bM_GXLZB}cBc;UG+WLuVUsnoj;w{QXFNl=HWdp!aSBFALBqO>ov# z;|O>uG7WX=QllnW;ALNZVS=-Sn1pyyijmFX|A>7G)jJvJ4xFDk9FU_MJm;wt>xKC< zAY6$^w;UL1NBxQVJkY%{IL#H!h1@RTY$Y1UK^rT+#DOg}@1a#^Cv}Zh&0wis;O7lo zq`)NTjcLfd6@#IUzMq=AlZJ^xtgyuIRbT;>|9U7d?becRjp>9WyE}I7(Xdkz-R322 z4A|rA9a8Rq;`~UQFVR<(;W_EJ=$bmCpQ^Jy07-`GxgcsD^6%^A1dLC0@tqmGzX|%h z5ol~j1G)IS08XXq1K@q@>&vsOm4j|3)_=e(t%D7|7+j@x*|H+7Hq_%XLyMF-H-?{D zrWF_0C3;E&YKfAOS=f=PN+vIDu=dx2$yN52X1Q~rbC*%)=kTSHO~ZFxeJ#d+DVqMr zz6V@PwOM?KK0U^FZ(D7c-!~`R}=vl@W z($b4|uz*EpD>EoSnHXIzl68e>L{@(*={(L}v2ydE?rQNFS-(2#->&0_%c@Tes*1s> ziJ4Ny9jelIC+;MXTI#v=6kceTwxxqwAilt6o~8EZO_8b*0Pd=x&lCJMb>~U@(ITd4 zbR?teY_K=OXEFIk0~%;i!|Zbs>p=`pD>E6$30zfkTBFdhB)P}p?<;WwGw&gm2G&f? z?$T@pakh)pamRW5Btui+P((Kea5_QlFxd*oOl_Ala2^xQ6j)v+U*=RVN4}t86{RC+ z`Yj2n3}2hb*#PVa*;Y3_jaq$N(u}Zk3BB8~4kFk!fV0!o$y=kFvLRU(VKmf;o3N=; z^pi4swg%sxBL5kyZQxoqzs@xL?l&~Y{&*9uOU!+-SwNvsXa;GRR4jTt7-Pf>oOj{o zVI%G_Vx=~_a5O{~Mn?W^e!1fz|2P)QTyw5wAy*d=<)&oLhO?@@9?jjS8OfH-$e1}s z%}rF%GmAOeqDs@!CE!IP?PRpC#zc6u<8=1Ox3(n=ZsUjsJLn0cOJMRR75iv3)a9X& zr)9wO7|es@S!J!()|1Tbpxxigu;9?uTAsk-Q;#>*#wxoTee1y*>)OPgq>>gX`5XaH zy5vI#3JNC!+8*R=k?m=x%78qm>Gd^giq^kq`94U-Q!=6jOrW)-j2^0oby;hgy~FG*S2LQex~J;aBB8fCy8oU}2xr9oYa?wr{N z(W52+R&*VeYazP5jG+M|3v!DAC(`6IZBJnCuq18OITKB~C9_eLG*pad;z1)X@_COq zxh1E!Ib={|KNyl%tJ%vH_z$L=R-sfQtFP-GM3!Yle;*F{Pu#(iHGzMPD)e*9lT5ga z$Sn%g#BczB`#HL^l5EMtl~6q%^9NDbLy8-O7$fBezNsy$dCD{j;V^C8fs!kEvd@+T z+3x~6M7b?FR9KJU=6q_l5HJIX_b|Vi>9IzBd=kIej+)!a(7fb%{Id-gB6_GuKEwVw>T!nP*(g2+5n)ZhOH0!m+Y$z)59Wl^P;2besH z%a0#V>QbOdr5;|%?{kw|8>x#^pr4&QV-jKHL-qJmXbva%e42VNZ*|GrGZcQ$!W|&l z;L>Sn{gjFBFnq16cW5-4sp}(S1YYDRnu-TGavl|%Y`xTh8ywP|fNzv|MVSwdlY@wj zpmrujmBDNBXo&|VAaN0rj%8Md=!FPg19eK0ufp`wB->3@EU_{js#K5-AGMMz1HV^; z|Co#(MdEcCX8%j(XOl;oiGIx`v|+y-X=alJh|h@qu}SguvcI}YPGOh=I@3zsk+#2P z@`u>;KW5$~{6Jbi-h%baperph9;%;pe2Wn?Q_=QNo)436gjrQeE{#DSt_uxvwT*98 zWMLitq-+h(y4U2$bmP{f*#T^460^7o>1ctW+`1>u%tHA=x$IZ?>YLu@^tBj$A;9Az zu1LanlHv^@*yhK}bmE|7n^xyANDx~KK$9wbw`bk;FPU_ly=&`!u-q?IIM4M*!>Gth zT~q!_Bo-Oo4a?aPJivq1B54Ek*O*)gyq~mppF_7ezQp0rdESGml>r)GFaqnfl`P0w z#gsiXsoWD~pU7J0IsV;F*c>Kn3TCIkampulJRYDYr8CCZ_d$AtWq+BZ#=G=erd|MG zqYbw+H5tP33O|SKF2d_sWYUCU54CbMyJk{hf={AO+zX?(3?4M6NN2)>MH z&!Rh$q=!|IOY`~+h%PBva|Jvj4XF*6QLxUVcc<0DoH)fc(_a z;M1gO#?UCus+il#N*yA2P>Q8o`mt*UBAC?5rvr4paNA?&qYQlCO`fO44mi95@msi@ zR%_au`erHMeC8t`o< zIVTlYn6fr}WEovmpV?=;K0at-%QvY!2kL8(dXeZYWjHIr>!kgDExz%DN;A{*WH>yB z+Yr_&fHx-iTF;#;QzK%Sjo=VvwdS&ONiGh-uhKtJj>1g*n`<5`fsS?j6$#&p$k!H` z=+TuB93lE@kDlVV15*eD;Z#xXh5gBfe~aYHG1{1@yM3^-0as@9>kRxVP*2z0m`zW> za5dADfu4!w)f|p3vG!#L_-Oh;@M0bO*5DVk=}@chH+WyY6PE0uH2EtPtp&-4v3SBa z9caR0x$aoJ2k>1`wf6C~8Z8lGd6;~bsGgqa4I-n1dYX*IVsg6tDk+_>!WYwWewKVl z@xArQ5EMNFlGWTyDbiab+AX9{3N$T77b0f`Pd{UOYfO4E&-K>X!xp^XRgWNu3g&Vd zk86-$Xc4+-UM)RQM^-90IECg^CRb`cHjmz~X2005kJy9FPn%d7lkKv=#K zhi!=X5rW$-d|yh$RP+>PVjeBF&G$S^g5t)*@eB^zX)Sql+tH{~sBbLN2{AnqBy+er z9r34)Y2vc2ac+D8JsGM@5 zkCHdW!QID-^Zj69Qo1^wypc*?&+s8wZ-($Ip&KdjxiqJiqW(4Nt`qoC;a!??E^!QX zta90%Nyu(v4~#_NU%3l`nFJ58&1P&~1JLnR1>zI1T!GP_LfzxT`k1a@Xg1>i3fw&= z3k&S#Fxx!?N*VGewXT(>3K-_#{w_F;nkTqPN3^>QHkR1Z2KOhGFTvc_ipmMO$j?M? zk}y=|2`8e@eVrD1p^V$pnEis*bNt@$nS=LFjgD zF9^}S5Vb6r`UW$Xs*O$H#}4UAOm`mph4`PNQFRo&NM%zkpXKnUlDVwG{7U?mGPq5N z!3bOuSR-pw-GDbLgTG0U%iQ$iY3EeO>zqeB)A&hD&j##D;cU@fADUf9>h+BZp9b-+ zjCjq7-q(dWGTy_JPl4&A;Bx3ZB6M4*mpO2AQ#Kf)uE*^WiEdnp+PHOJ7XSbt07*na zR5aFui29eSwguH9Ou9PaLXk{~_2WFb#nqo+G9klX>>b(s8q1vm*sZ-La+0c2;it`Hn4sgFRU3yG+PKCX2@@$DFWqMDF zHzV*0j$X^FU(->a7~c?BEo0F+6U+Du7V0RpZ9hy`OYic()VqpgUZh?_yJ~kUJH(;!xmqw~@ zUViTBmxOKsQuiTsU*Zqr;q?Su;wCQ`lVjp0plAAY3v;>yHtvudQehrwtY6S-#sM%< zi0-(+puK>>m4;8rB+pZQauyxQkqb2ZMe`0?S4eo>QF*~hNtKFzFZ0icoa34^9oXM> z-m=|R8sAbhALj63?EDn6;X+6lE1NdS%a0QE zSpe1;H5TGRb2Z19DRroIwYb5+VUE5mWzsHsTCxjccY2lV7NO>Wo?8-cl})EqyxyP* z$ML^9S_G0$ux@UXK6RP5_k)vM(=Tgg1N@DV?-tA_MR8VE|7FFKs^iAex!l%m8E7f+ zOO4^5#;h-uev#m$Fj-=uld7Fs2wtpXRXOW@N?!`B?MiL2ZsHo0rq9+h=2i*Vwn$@Tl$JBRgsl_usSIwH)8RR zAFidMZ4}P)`TWChM^kkQh(>|%m8?0hpgP;$IUaCR=is z9WPRFTtZt5HV-=Y3-qQ)UJ~H21bvL@sC9>o?nl**X4=xULy@nx$rF-!vEBeWo=Y; z6H4|(Ym?jO}I6oBeh?4A?m-}ekGKg0Qc@V$_4E1364T68s$rD1p6D5xZ;4GJSX=66B@V*c} z8oRfLY;pi6LuVlNdNiiJa;5>GaTu?}s2NuojD`W=L-clo`0+S8^|)w!M6Zm=yC5@| zlI@c9tSojWT zTA8RNQECEK7YKgbCAF44TqL{8rJM4wX-;&tytf^AWsGLIu%8EKq4*Gh3j+N|Y{nPl z4-vZEH=`{6MLF3Lk`EDBRRAZ&W>AVOGyr8ln!oIHo3$f&hlM*!-M-%R^7V&=enfD8 z2i$Lw1EK7O!BPtz!sM0+9d+>)wq8|&pC(|QAEY%sDD^uu`4)=_q58H)4mt_^M0K|u zUBTdUfQ&Do_AOBsBwrx7)~0hU+z7@qV{=7fmS=GZ>kSlljQ#u5ayEo-<=t-`>lTA< zRcM;aeg*nd0o&Jy%@3O)#j>A5-^J>)B5VrT#f})5G4C~?F21~$vKu65i~0LZe^AzE z7UaQ_UIfGiF1Wc3d&rHZ8*wNx9g#gOt6N*q9?Zu_;1LgY!2B7{xsRY0F8wK=^oP7Y z!Z+62{ki!it9uf9daP&GsZBAxzr^-f_J=rrTU(NWjv3Vw~e<=C%tK@nF{WcV!u>B zr1k7N^JT$IX#qAn;8zd73Gn|gS#N`1i5#xQu0+mnkhdjhz;V4WG*f*&zyeE|UgwA- zg#Ck5Z`;i}@D)IIL}pogrMW~~&IwaP=HvWyW ziMIL#pusk}P~fygA4X<(owdCL<_f${fJHv4YXiSAaP*;gb~;$);+GS0i4fZ}aEQi3 zIO*!hK|wOSfxqXf_n{dg_$PwD#c}D7em#$7IBF-*8x5X<%@Gr?HfoP+uFCRzqVUWJ z_BfoskD%*gedGk4E_D%FwP9*1my7DvZ5g&V6Hl>VJHyvw`HM?eDm@l}QH|B3K#Wpg zN7?MESAPe|URi9^gm0&*?F6*VtM-~+gHd~Jw^pQMt<^!P%~^I3nf@LdHxh6Y4Yw!7#w2Vd;6#jr1T0SY0M0*=@e#fe``UN>U83*RlXm1$>KKJ`;N_aC80vHVNRXY0f|H{rP4(}YK%eEbM09A>M9HAJOuH>sg%cNEYY zocMdpdvh~NcpU{i8S&f7@auroN3`!@YiR*D@=0~Qu^LHS$zMzHdD^VXgfBSBWLID5 z!ihLuCuIu(zN^Leq`*Ut9Bs*(m_tv!9-HUAcwdIcSu#GCUgvm~WyW%>7a+e9wp#MR zak2%-s|-|%bVkYz!qv7oAA)s0G9hi5!=tLWvG{(d3rg(f(c6h!2y_c4&LZ_rWAiMH zvvx2BCy^Cxpz(l=j4d;S($#{VhMeb}`14d~rT7yHe1PL;^6_0c^^}c{A}(wrIglyV zjHsqW-xHG)Hls1|igZ|!%oEAOiG1mVAtn4fV^<*5*@E4Wt#xXC-aeegYZ!-8EUH6m ztJ#PQyWY0Ww)Hv`{fgp;9EdP{0Hbx#bjzA<7}XeebVx3S;6)94WJqt}KN|$kM&=TN z#<}<%j~+`~O^E3S&<%Mu)P;*2H3Wf^Jluqu&M4?`Xo)30s46iR~?4E|Bfd6>U$*L_TzDh?5o6OTv#?L1XjJYuJ*u2?q5g3 zdn|bdN0r$0MdG5EKi8nICGhklTokJ^icd<34H>qVCCiTM%P=}l**e6Y1_-6V%@*w8 zCfo`qV9~dZHVabcBy?Q@IzfCjw4_XZX=pL49@j|Lryii0@1<-KN6%!EzFzV^<+pm` z2^H)riE@K_s9*|;er0=SIrde5B!aBewSnvNhX{tf&Ao_@!* zcR1FRtalcnT`|8tK~uCfsxCdVkpEPr??}=u8|a->b@Fsi8^3RnID_v^v4hlE0LZkw zc}C*5LVKg48_Uk;W#=tLKPl3eV>r{mix7Cu(rXAbl`(ZyqY~VO@VNz^KH(4H(Hf$k zE8rifJZQue3szK8|&31uFox^&n0}j z8jh)Udbr+-=5CubBMNLTCy}oggQTyIwj_9qAV-UA0G8iiR8g;fP1OJFWC8>CAgczr z_xbJ%$7o;Ao}f}j(&pyA;{w>Kl2v6@BUbF2@i~d_4$p}|@+_+FlklAY4;92fHMAD2GHi(N%;n^w zJUTx^FSWfZ5`4Ip{ZJ>@hRFx@YJ*V=EA0&!4XnTcVFe3%0zZt%=>%&e9))Huz~d2{ zqw#A}PKIDztzO08_i3^?V^vs4aPoNBL%w}`Km(b&!?(5q+q21g+AeWW$dfm0wGHXz zwfNQ;G>`R?GCaz`#7g}UgKswA*OT};p&r-hpFEgC<*5p^Ro1XV5+Lk5Bx0k~%)Zc9Juc?|4;U7vQe>@n8PivP^ z$()p5g$uvd@Y;sxVVmzq`sG@<{4c#ZN;;-wzNu-FGE+h{gv++Je%EGOt?-A?Ul1ny zLOskkD*=8%QOfLvUV0+1KU7W;;K{aJO%>5-w6;%%-VT~xk++{sgNLM;Zpj}Va6^^# zsN+o}mAC241Q)O1@_V2zO3YRDqDh^Lfb~T`aksP0XCwZU2BQyY4J1B9hq2?3L8SczFxfmqNPCgwBY9s zo`u9HtT#G%CMAa~^`0fG09*;dOe{y!q&?CJGZzxNAKPbI>31vKz1VscS%pNs5+xZO zZAbjg*lZ^B&9ugl@6+-D9c|`G$rG;t^b|@~W_d@Tr$|v7L>n!6$TK(Q&8+6IhXrqU z%YCrFGvt@Y{8LK~!Dc0bS5vEGr8^%B?9PXVs`>=Th zhWCp2!$?d~AZzGn31GH)1cIv-@0RDKwCd^V&S~=`1zQWrpLKkYG>=l2gXCdMp$q2; zK8cByR54;6E)!9kols{z-9QE-`{~51^s@^Qor%oHlJse?&ntm>JRC%$Ix2=EKAXyg z5DXKc7xEQ{(WZ!<+1Q$r#m8cNzXQj%h|eVQaW7C%z(g(mFL^7a_B7&aobWpo&xC+V z@^#)iLdX~rk3?W0#g_@|yF#i^pL#3Ps6~c(IdDf_-;%){9P4?D>;mk3l6qgKafF*^ z@HV1mH9!%10ZET`SUX|26DG9f0~Pwhy!Dd{7ZZK9D{rt+F(6xxTXT*#Ec>n0TZU_G zIS_E2G7|{;#ij+@-Ym>b0N+6DpL7n!nJJQ-?ywoe4AXJ9|J39%zB6Tw$m01S{3!(Q zox+kT=d+Ca7E_%e|FS;%iK%*9Jb^_wrDDp)5c+ivxRvmIgdQ-sv!*+~I zucDm&I%hZYy!i&~&m@nzYMlq_GjOdHoUr)RoVY&4TQ*C&(WH$1H%&Yi%0rHUTFfn| z_sZarL;SZw@?0hVlIm{U-WTEdDKI02mgm*Z951-~<>R<}iOw#tNhNw$Ondokbm)8s zycYy*WV7pC=MrGuFKx}?0AI|LVS|d>LH>KCyuKPqkt->jRRbe|)|9LcD7`e}&i3tR1N&viIwiv6AlaXR zA5gSd!$<4k)WeQ@jISVx>xzW3xuJDaA^KLw3pjXN;42+^jgP91upQ9p3Bd(QK2Vki zFdJQ>7Zvq9&tL>g%$}p&V<()|wrAULrQ!V&(IF0R6H$N72NZ)Ps9fa1qcvzmo!Sud zm#WNam*pJ$+bv)Mq?- z3U_LEKhj&g!YQnLN-0`a2Ujwkalk1OY^ampSLtCb!4=K)mP#`qgSsbhD#Z;3-WrR? zYLln9m>DOsjMgx65~sfa_C$;a22dq%cG3J!$U2Cu$R1lt{ZC|;s$5W&9_d=`nI5me zP-=18y%(oH!PaJ*%(BHO8m{HhtBJlZF!%c5laVSHRKA3kDKwUt4^AcXn%UzAt?1Z1xIrh= z65i^#x`Uw49Q{ICcXH6yG`W{py#bmPqMV~nk@AX?Db+wv`k027S*nPW?lPHsLcIZr z=bQVXnyh6@8~&6-nr-Qa*{@$a{OvDv$chOCXZfEQCm6B zL~6GTYy4!0)~gVFm$OfbHnnljJoq@3EU%IeFgPouTe2u4$PIxIb;d1$CKet@=sy~r z0@zKF`pVW{*<>{!J5vrJ>4+~HU+STX{M_`j`+@H~70e%;u zbTxjxi93~e6@KuWiJsK@gw25+Ep_9AiJI<_mmN}1WsRfyx$GMYp8?aIA^Whx`X6x? zl)WMUrV5tzb=E!0K~oj)+eAI&f^7~3OpK=SJSQ%@@+B+Tk`dP`eNGrXT-KzFURAnq z9Btf>wjCj?Rxe1a%^CfUk4`;?fnr9PB?im~^2)|$Od4IBa|RiAA$2bYYz}}MIJ&xw z?lClMNC9Krr0r+R^m*4>ZHX)5@J|)Jtc%B~|M#h4VEicpTJd7fu{hy-gvK@j3dZnb;;Hwtb@_ivKk}!aUA^t{2QEbVZ>L3FpbP< zT&640>ltUApFX+3dSkGJnAQRvMe0jec1@dO7Q876OSt%36fBJSDn@S9tT8ctJk^(p zi}2ZJHO(ZA(oyG9bXiGGA$qPWZn2Ut0@Vr0Mmcl9ql25k3L6ZTAnnr^5`seP{!5qt z6Qj_1!R%;i|4*2) zMf9`9ju7`MV%M>794&t%#bh4eUlMD}dTflYRA8wOy7}z-dh2yYqgMFtR%BiZeILO` z^QwC#S>}r6MYD~O=^5)4;@uf!8w9&i!H1xE*)2a8`R9XpPNn!RBOM^$!1m<;%#1*n z1YfS%ca88wDwol?vsA(YYXsV!wk8rwy5L5m7L?(qhI}E>cO1Ou$mLFao#WSp{vyiv zCuG>M;IsPj%rLw?;kU=)<*4ugEDXpcyK%h1jv9OZcUhrq@dOOF`AM7D%nadq^~PxY z5i$yr&s=;B0gEJ9ACq+od!cduHN5{C<6ac4U8e%iUMh^hwX3PVY z+NC9o^)?04SkF?ZIaAjeDKLE!ntKAVC_t@?*5Z2lF(oa5J3y!UOO9ZYPV0x2)dA@@ zxjGMlB?O(NRkvDv9<*%N+Cj+-OV!Z$`I30}1fl|cq40=ubfy%;L%1S=Z426}gCCW| zLIk6fd6mJrIqPwYbcT3U1eY9T?W;A@b479s0jnraD5*2({wy_Sd2H7 z#5^UgkgBVO4`4FUv0j&8b(nO^@GfciBh+_!=3_hg&{AzRx{4?F82(;Sja8^8wSKnf zO5m--kh%C3>f9K(PbZ#YV4f5ABRm#*nNN4tTJ?eYl7sPOvQ1eh#c@#MD;2eIqP|iL zN9EkcRJ>JAKY~`d>Q%Qy3r<~UgcsWHpOG=&jRY3wLf?1GXZ!5qjxQn zNrR~#Yi`Q{NDRYxfI<(3&YHvCOqO0x^OmD(fj9!yZCQL?n(U#>hHguczA?@ZFNy!^ zf}JW^0?n8I(Yr!WlMlLAB%3pENIpK16OUT@vk1Lr%&;oHCu=5XGDfm@>coi1|6av& zilS=~lznnm8TF{KYQoHL+uN0QI#;Ad(_CjsPK}ZSvHtl8UQmmAOEuil?-4N5#4}8E z9x@M9IRltCuOvSR!Xx#`jZ|-U^vqPkbu?Uy2OXGE>UQcccB9cqjE%5sz;Dp9b!w>Z zPCS-+5U|r7=z8!G2Ts7iM(`?5x466uiB!QfcfrgwpOFF+fovNE*DLiKCbtMYFF{RD z*i#R){Uy7X2Uq669vl4@(|ZFj5Xi=`xLlXIGd?H{?r_KumV$O}4ouB6>Zf{BmSk># zrvm4(a;CPyy&xd{9Qv8f-_+5Pazi&0Zl%%0W=X%3)U34ZN8olNrrNS+Dv6;O2h3KW zS1Y-`oE(VwOE&Dp$iR?ZV(i-^Zv;#2bkr;%qCmY9p{@nza-7-hrN-H2sEY1V{ti2w zcvAd0QO}F`tAE3xT>p`RPp9CNCShAUagqE1i26Ez!SP@|=X-54)8LgtJ(fn(DVU>6 zLsI@)5D(}2fg05N5d2Mm)tKB(Elar1E5wQUrXe^g%J;Hxm(Q;&6nDw+PMhzN@_`2U zZ;H*&nx?MWb|IT=A3$V8t&PsE3l)MgkPlHcN%!;yEn~2jW zT4~bR2;Pt2y#}tg&3vG*Lh5G>J3HV&Y-nz`>|dCE&@yZDPE%oDZ`)gBYF9yb z5b0e-e1;`DQ8^wI2Fqd}68(fgM~a`!q3>KcFoe@;Q!j<&n!m-C0N!=F>Ye7-IC{3F zzHQ^52<6g*GzhXc54)7<+nW8);K{alsT7?HWbd^2BIZ|M-oF{Y0*linxW-{i1^PRa zdXSOPH9f@ z&}@*|>+#7lJkKq?7?&;zK;I0yUYCdJ(v(!PAB7!q;d~6o7n2$c#vTjj95-(?#l5PX z2UxlzGY{09?OkZ-NU+cu^dh#82Ys%S6&SVz?ep_R?m&y*l+7g8iCdm{F zt(Ek#2J}}GG9Ac$ChEr3a)ZxQswq$(DgJ_iS4r91kaIdm7~TK?AOJ~3K~wE(jcF}+Ts`O3M>h6{3L zW=uE#3m=p4zN~$p44x3-b7$y3Yqk4mbjX9dWm1q) zL5n|*lQkJ0?Z{Y8-xEM9)Uxx;po;U?VVHOyyVQV7JsmQ&tqMpUk9iVa%>=s%K~Y)<|@xc##WMMuk;X;gWi|)CHFy)VvI?Ea6+rNjpz`Y)8j2 z|2M!N2c%_FHJQli20X3NLmF3lKNQq4PA z=3St_RpwB0HP!ImfDR7Lwi4NhQ2%mtTI9E}%6*(xkz^-cm_ku3aD+N zp(oK}JTve(UKyueJ;gb6g1u0p>)Z74UeK0bb+)a1YDk+eC^*q0UX1d&&h zq-R-P=IOIjIM1x{E_x4x)&Gc>68()U+et9A#9s^bc}3Hy2wzvURRy{d+Px9F0NER| zw1IkO0`E7@7C?Qm4jUn}B`sgz-q!!Ds+`rh!n{^W)}AmgaI+(T9U1x%STjA@I|sTT zFvHUu-SS>o-o?~!ify9iZ5_Sq#}hJUmNvg|+@(r1W^y3N?W~7S1?GH+H~D6ZAMXX= zYR|sdMeTfbwiWbL@(YI!238iq-(d2BiCT!@CP!ZY*&8r@K)8ph*#}{|y@Z#!bW%Wf zq|JM-TF&+F)W0cP+HCpP=G5&Odo{$p6nx#M>m|M{Vf&z(nWo#Q`zUj7&ghqG_>*ot zQp8suwO&k#S4i}$7cV8r5LTW~mkBC^TXBXZ;z0G%B@MFl4(dWT1ydY1lev0_IgQ26g*lC_Ew40NwC4l8XMiz%sg7F zUZ&({%b5ewW{oZ-=v)V0Sc&%5qH+`TP8I5y$gKt42&-+7uA*iIRCA^2X7pa$G;{HC z2d_uu9iP&H96C87A3Xk&S;shScuvgN2s|ue? z^r^P}TFRT{M5*Td-m>ll%t~qY72~zO946EsfvzsfcdKNDtzKkie+Aqqbbowxs~ud7 zRIpbB-mvvQjQQ^ z^{x}-?jo)Y*?Vaa$U-%!FPxI7Y%Vh`5rNryJ^$S0kNdP16UIvN!eyO!fiR6M{@?TNKEaYTl6$$H1%;o4y;wz z0ka39R}wlb05`;Xv4GP9`WVGW0NquBePa6nu+FXo?U=gXAx{(fFj5DLV&8Eyt`0qF ztj{gIjEGyKsNR=NyyT-;-&SIuC3>Z%4`F&PMdwD|<6%0+$ru(%m(y5lh^ZMthMrS2?F@XN?QL)P6f5Kh^4j5}aMY zYs%3>I%twp|ATB4VJdLbF&z_-(ZW$D>{)f{+*(=9brojB@rI)6ON+UIf1~9`>u;`W z$VKJ-Nxa>WAPt|VVU0*WPvWyvI+xbByJ|LrBbBaa@=l;%BxbSEp5&_%*%6lZVE>vH z;qMvIPlFCL<>hI|47f6l@3*{3iS?l1=lq`__yE+gY#0E1@B3NrI_GexsAx|ul~PI? zN)jPyBBaa^WoBe$6G<{6+BBr`m-ay8(@wI_amKrzanJv{V$n6x(|xd+ktG>#09BiC ze7_ZUCumC@+L_S0D))#RJf`htZkBuC0$)9dOY>kPpuU;I_e1`5y}2T}QYQw$Dg zW|9k!A^i|mn>Fbdqf?JXq!jl$u1(2Kam2$u>@LAShv7F787Hm4(W$t&tv=cS^f7AA zl)ydAb~wSL%8Htt*AUpQ8V(h*x_PprS+Xb)>z(jFTpUEAinP4Vg3bs&Z^`?y`<zdf1x$^FGc_fJ*KLnt`!GsFSQ zthp(GmXYZKOyYPW;vR!d6~2q4E=jpdEdIi${Z9ptq~WdrRaVNJZ|+OSE7PSZu&fgK zplc>HfvieYi9N55HDOMV6GS&p-j)HMW=;2^eyTxFuyKz7#RU9)42>+1 zB^e4`ep}YPhUyKDSVK_ZzmnY)lT%9Wep2oz?W^3RBRe?++p_3?fWA>lR(NPq9$w+_ z4;ebgN1rCB14oN1yeI48mx^crh9@92A|)?{=ot1tI-c3w!apHrPKU|+c`)4i+l#^H zfqymghgjWD^3zPNOIqB^;r+V!oNL#Wb-rGmoY?1LwO{iAik(X0RXKG>s5YJ?2W8QL zvZ^L2AZ@M@t~NFr?R8a`<42Eg`a}(DI|Z6^(G20 zAZkK|Ix1q;`;jTMYV$kUhvgoDn^>Y$HMcK+X|hTqzmm zn<*8b4?}0$WPKr9XYo#13^gQ@c&*imx6JBW@qF+W)OvlPwJ z^ya{f5Ah!ky9TF6*0W#3c&tw|hr}67Z!aVdL)zeiSA zp$_#XP2g~cFU-)TP0iy+?X4MhUY0eXb~X;zNU*RWIbDLD1oeo`M;Y)~g{@&?9-*JN zwqxqaB}c&nWjhssleFECm|9og?Igo<(dkM|&VaFLHbA21^61_?xm41%iMO_3ZfTH@ z{0Fx}KD&yY8vB=oYKALcPw6p;kN5P!7`%XZ8;>`uV9Pn}8`yOrJfhKWmGOo&`P9H| zWw^oWJ5zdoE}2H+pA-3Z3124IUrN24XNMw~4bXl79~1g3-+qj7x0GGs(r=I3-#D3x z&}~BhqN8Vd^m}4%Q*dBj{dUW&D)w44z19P-aJ)SWPB-=tHq8MDQhE-xzd~?< z0Ot`{oq%g7bYrgzwe3OvU_BYCu;AX{Y*f-Y_VlMljg z6`UZPGxpj=IW)hS_`}M<74iXJPOF2r6?yB39OLwZm~AZbt6VY~;}>&g#HsN`mFjaK z&n=nRi9Eetewo$#IetOgde=P4K~<=B>c-b492oQA4e3iNbPo@8c9T0uoQCS0GQJVx z1tA!g5w8Vq45%K%7I1b9TE%oTcUP$F-Bz(+q z*SlmdB9{nxwI?%WG^EPy?cutz*ptWz#N8adk(=uvdo`r#S~UG+d0mjSHgZFXy zW^kgfBkJm$=|iF)S+aY-`nA&RK~An7y${VV&2WbtK8eS}Xt_HwH3&R`yEIQ?^XftT zJ)~o}X^oSafqovLKc({kCVjb|t0GH$c8wwzh5Xdx{>GBGTBN&$87IaUmh?j$#1ubF z+%}Z8cipVxuUFg&+=5R&&f|f<(TV@LZ--u2he1!xcVsJI+FE$Op%dfcSEBr!NPaCP zZLRKJfCu-{EwM8xB721GYt0ZS-pHA+o4_d!c@NVsFudC5+9M;m^SBNQn6}06bz;LZ zof0`vIg3Bn9!EWy@HK`nH>y)pdv}K1$h`&1KdBVla##%(QH08Mjd8m=m8nPX z7Q7EN=_BpWLR^uFN1h~`SJWon2Er*Xyvyqr=ZSLHh3f6kg|AhLC z>6$Wlv=hM|5ME+(21(!h?vpg3k!hI?pUEqnUud7P|eyR6m?r zT;WYS!Fw{G=NZ1kL(@`bx?_5{V3mh#K(5P}(JcN9L`x4R_X+S!o^CCWHVsTGZ;(fZ z<79hY9Z_I|qk}Yk&8NQx)XU)yp?MZ2eVp?7b;*cElh)3e2rNbL49m_Ze$zNTJ@US% zplgVh)QEjTyiyH5tF&ji=1f#1u<=?_-s>g16FseDF2TuED1OPBCz`0gn*-OiV`wxU z!yh21r(`vQPf+}#3m-V>WJV&Om~unHahHeP&q{3 z-b8F^DqhU!Rvyh+`#JzGgr(Dyx=}j6AdJ>U#Z!vq$|Jf4vPVj?AJC(t1b}dkBhF=J zBY+QBK1jH`{-f)Uv45m&8mogvqYI^;N26K*hZ~z?^c_qu#C}3iK;gi24cD~G5i{jKG`fxyFdE0yuEhQY!DI?{S~OTt z+~BphXr9Mc;o$$2H<+a!srIWSyETe(HaZW4{j+jQMlMImtD%^BTs=_`IxwdJcut7= zM#;9kyotaWM!a7LH7%TFd=0EjCHPKd4}%hWHaEaEgH$?ayRaQCi#~WXO|HRsc>@00uYV2IU{^hsv$GMZr09Bwl}o%cb=MPTNQsLYXGQEh z5Aa=<6U$CYpoH+DT>J-!_ept!2`BmSITVaB=0X8?Ik4cfp|N+VD<{EdU7}|ZOXjD* z`X=NrjqXwSCg=}B=&&D7<>F*xrd6vUKI;HrpA>GP=+%wh`#g7nn{EK^LWKWg&OvTY zOZ1Txxil+I2k{j)ZkzB6E9D}EPH8lC$3ROO&2`J$pz{v2R}1h`*?lL>oJ}fr7v#N% zkQ#$8nK$EO}wVKu#cT*j>RNKptKCO~YX=y)o>;(}W5QD$8X;};ZbNEru{g3hM zkNWKrJx!sDV=}K~&h(0@9%SIJ~;%3JIt>nOP}fqzH#@iO~3(yNgDzBw7;hYwq` zm)L$W*ii^NTDQFbog4V$mFZg*%h&KLDnQ;O_mz^jtf*Ju^*rpGMGFyL9t@YqMz|+2c3d&at_@;tg8mi7|JtUR;xj=Up!|RD|(?~}U`Aa=~Q1U;*{8NR7 z**MCD$#XLKKco8yd=S{ZjQ`dwzNMM&*gD<>$ZRgI(`dTT*I@5A4+d^(R*L=Wt9{6u zi`l;xzE}|7x~O9e?m39QtaodV;tqfxYlgqA5Q~hyIDuQKcpsK8hwzplZj*7&J(6xA z^-e){V&~IR>B2G_t?eBa{i&VhI5@*)ZyIl6qj#&aV~LrR#n*6r5x~7A?i#bU9=|lB zbCmoWu$nyF3Gq2i$;&x>0`w|L<^rT2XcE5h?P5rYD!9pK8rV#J*g4vFbo)_<13 zUcg>T>>11s1LP%R7ApH*WOunEkt+MuJ+1@v2IYX<6&=KnZ6g$(_J_ef=7LJ7<;2bI8zncH;|SZx5}Uc4tvws zCtcJjFVAR5dJA;{!EFw!ccFZY!#f=OFV;6fy37~T;^NkQ#V1g_(c_~7c?MrYX#Yotu|c~C+?58WRN&DF zp9#G>X)j8#RtoKC!Y|;#7J+^P=0yc(#^8Gf-y-Bhi{>!c&7$)V+(N*s8lECyn+WX7 zssWCA1v{52_7}0=3q089=j!Z>&CM}_R=e)33h&K=dZeKCI^>}iW`QRbR+6qH^+g1> z)QP4C@x%3WP)z^H+4pU^nSwu;yi=OdZdrRHK?5j!rP|C(%jT|JD$Fl6-e>=i&L`02 zj=4=1kLYkt;_uU>TbA}P>UIzfFd&CooRP-aCSYwz4#V^gA|A5g zMGkE4g0s`MCav~E{UkIO(KVdyk}Le5p=fbV-WOInT`$K?j-8t#?$?< zBeVZ#xyd-~Y~k5BIX6VN`|Jjd_tb)}L^Q1j?T*8Xjk(YWNTF^g4|T9nn}o8vV( z_g(BQ1>|lK%qw}*<8(K~#sKGUgfh0YJ}f<)MB}WQS0%s7iuZN2Mv32<8Ey2ZN#idK zajR0XD~>;C68%`Mn>$HoQC78bkw7TtpYB{%28SPm}MW8h!&<3L{CAwg0Rt83_|)BT>4guK{e**20Rd}zFa;R z+nS=DO~H%SeZmi}I92JogK7E#jd}%OvqoVVUzyiEp{i^YdylBM_v_&$)Z4fd%Wii++3FTw3&NFY z1(93<<7GyUjrHM!=2OTY%6PZ(%+r*9sKkz?rvug}KrI;?=F-mzM+Li_ zqeoo(8-;m=S6jX?^tajEAkQ7+2Fpcyp2dM9I?(boQ)=qQKc&snCRrgv>_l^6c!Mox zgLnYZy(~OlFwYjmDO$Z z&AU|oEWnEZw?O0qL86i!SpeT-opZ$;WB)DiqmkP^?@uUZx46zm=3LCkr7`>tCZmj* zEb;f04JG(>A4kl8Ry$8Ls#^}q-VJ7OE&NKW(*R%)J)1!fIC8!gEyHj}v7A=rMNN~J z69EgMz{wmYPjbyVW`Chcf2`&)@(DA)rLn{KILpq#_KOUh>*4hje1O&USd0zKoq&Fh z_&vzp2v9%3pOfq(mtKd-zLfV1OLwyA%al3*qvf{zHU_^N*in+61=A|l?E!wwklPc! z9lNVWXzW?UPJj5!Tuy>a3%pri~@$33OTSc4Yv@n8L4$eyv=cMm0l|W7}8BO=wamD zM*LK?{kU0IDK}$yQ9+Ky@ftUITiFlm`AvjpshNY}Y>T@^?&UPth*OW2`BtZ#^W&br zT9&ha1XwHZR#={z#4jLqD^*jt$Y?MwqL*>_pij=E=q4lzG=9uWmT35ZL;mq$4WUCB zU&-lT4r<4paXP(;o4?!J%oQvy>_~TkHR^_2_u}d+jhwAmT_`-{3hG082*Tv@Dd^Ft@-^hy; zj&h#ppH@>VQ7fdj=GE2)_rJY?tdJnLx!$=*>Hm!B9^1AYRu@#W{}Lx{R;O(yB;4|Q zifB@u_JQf`h<25BMTKqapq4-nj?}e8_e|lV+Iu~l{vrUAF}$9U)lKbNC)RKF8-E0) zGaR)_#z-lcRd;c`EXRKJo!iPZwq$96xpiblJ*X+g!$C4NhG%m7fk8`4usy&J(tsbLm9Yn&^}WUgX6PH`)Jv!25F zG3pSKCPciD63du6FOF^|<@Ta<2}(Yyu=|^sbpaZVym6__?3VshC!%Y3vMLCB>8JzJ z!>t1~f4IRL9^^iAD5h+(fbZAAKM&CZ4(e;bpc=5ago_%E=WK}YbWhkxRpn_;`P!V= z;(?;EGmop+3gGoddxu2#IJlK|dZF|cj_HOWH1=CSJ}v0^$JIm)+i_uYPE00ZXJ!TZ6h!Tjcto0yj?oD&9mAb=29*feE7(P4crRfeTfPfFsmee++I|lCeuD8T>zbEeH z6}F=zf5NaebMEook22mxsq`cHU?A?XmhAulAOJ~3K~z9DJNUemJ{z0=(qxnOS%R-Z~1%;(m4*gLHb6?S=R`MNxSyAYFmt+&&leRcy$FmCvwJ;>~+c; z3v^@J?sDlVft^z=Z}IGj3f)+Ac+uOyxzF&P3U;aE)Vbz-Xi0+pQsmnJp5fpd5Pq|% z{F})43sIkPc@HQKG39nSQLoHc9rr-ugBX;v<~hm|V!wi54Ix)@@}|e;I4&-Lc@BDs z(rMCG064?SRK4h`!9YY(iW0=PXW4lgEP~{Fjm|ba!-6*e`LhVVhUPXM_p6X@3bX@! zfOa~S>^~9tgR!d#e*-yZV*Xo<(wyHKfXfYiA@XqIUsZ%7u)5z>hg0@2=lzQ$qwu^M z^r59sV0KO>wJPTZ7-eeEP^bpyOBYAw#7WA=OopUa7S6&LhmPU?3&#IAvd025E3t_t z{iR-1gz2MXWYLKMzQheDXUfZHJOP_8EQQRO(ggL%pH zKQ}@*7UbUs>@UGx9Bk71JSFcn(RwT{fT{{aJ!N^RP4*vAD0YfujWmCO8i#qwTRiN)b!EE(u#$$JR_$tbm7sy5q zu7P+ghmVG!wN|T@J(7=RBxR5muW3TL{(_qiE&hQgPnx6?RIn*po@GDNpi5(RvVhyI z?2q+IWc&nWIPAt9ErVyGK$N_28jJs+)3;* z#xJ0}Z3y3q_$`jlZR(<9+3^k87j#V%#-l_2)rDC!OhK*j5-C_ zGmYK~%-covNysLr=Zl%4UIucW+{g?p9UAk`1H#6IOr2v&#Y0m1H8Y?{k2bWjgN6=Tn)`GRH+ z@Nh>7f*6;IAQJHFAY25?)3lh1SwXcGn>} z>pyX2F_~9Z1E?M0s;gbO&9}pmgL$yPx_@aM(4?(Y9}7Jn!A=QG9X6dKJ)goh0e?27 zUUAI}uK%>pha-1%LT)UAUP6pe>K>fTNUKXIoJQTWn{FF;H-yQ|IC_K1GmQDYlKh74 zT8t|pUy`^h8?z5b&JjX3HD`;My^D$eIi@E!*TM4Sx@3&D%L2Syheu7}YMOKgsPu-BIGv?K9F1?lDNn>qd@ zaGv(;R3e8v$>rL797e5$=!I3cG*T5#Q|vz9=(1z}j8f`)X&YI1m21A!Jgnt)5Zx?j z`yxM6W8jm1I2mb^Wo3IEq%(oLFXuiQxGM?YPTX#ky@;KW))|{8ms__5_DafWDOhEV zda_p42+#|YL5aNpM}K>=T+};g^b{#?G3u*W)x~fCYe1C0cM%=K=#6snj#d=fr6mI# zxFM@~5Pbu6rAXfN;LAWirqqW%eA@$`G4+Ta4d!ABfb$I9?1BT8vJ+N&%i>KBZ1!Vdcs^ic8Q>Mh zAPBaKI*gO zPsp>ep$v6qe1YSqB09S4v26PON)&RlE##A-zulv^;O=dzsX2kDQxxPJ^e&@;+<6wz zjN`P_USB_TT;yt_^b?24Ll}SHkh#b?KSo!ULAg%oK+{JROeHRtqm;a?2Ab6LiIrW#AbX@N@r0uh=UWQBSZ1JU7bg5BuWd40voYYVpcOY(G5`#qf ze?q*+aSZ)Fp?#PX&ul7w^X2`XotVWFEL`ql1`I-Q5uxX4mr-vRU@2_xYbM$`g;`$t zS_Ha7`LWfLIfT@XXR=#^nwNsrj>!=5i;kZ;lAPGcB+QIf`hKe4Li7_4pD5uhmRvy0 z6ZPc6qxinGb8%H_itkq05PRVak<=x6Fr#M!<6?Nop(l#m8ZU4ho;LV`n4}$Ns)wF) z(e;SGQ^D6Ew9wJF!tm`vctM?dDyDvdt^jtGk5{IgwKRCr^{13*f#Zh)bG;vbM|B$` zM>m*9L-tdnf7DBzoh9=Kot>n9Ztxz-`X%lkG5k_Tmy+`B*>DFfUntb8$H-F6Hwg4Hkw5sl zM-%z9BgY4D8ZehthJ$JHJx-ogZAiRjgYZ5gM8W-ta7*Dcvb`g&fXf%Wu>EtD*o(=G~z(44rqZ-?o z-e0K|kG@rQb;Le$B{E4LQ5O3%aRZ_dH&{$3|nIS;x@dnD(hf zPaZPsop@}fe2SAe+&=8Wdk|<1X#c#^%VRf5a9Ac@K~^3^4JG+UoNUXhO-797@=JnO z1u&D+r*gQQxHnsGtD;{Slu%>2y(>T!uIkP0Er#xP+(kj~1g5)?=$MPWoH@C|KFI71 zM72!7&4i97K~Lip5#7_AwDja@D5-*lg*GhNr0en0p#vdI%NLu;-6q*`H0p=sT&NyT zm(R+TCn4GYc=!R(ON7%W>s*i~UoqH5yPF;Onu5Dh`c_~EXhJl&i|>@<_P@?;=qrav3Qh8q%{9{@Og%QHuBa`-{XVk z8I(|I8szj0TupUzXg7HvQ*90+^ilX8?l(*L**HCn)V1HLT1G&9gg3k3cB<=|q{fs+YwvCvll$}>5*#ut`^ZUxqZbWW? z_&NsKTQmcpJxa_fghP%bA4WE<&|2$s$n(b<%xVF?2l&;5UF({mzImF&&&py=QtWQy zMJaO{UcU|!7FZjIxXJ{lU1gu z@?vzPr&IU|7BCdm#?G8|r4Am#=qXvzHc;DvezlA` z#_2BHACvY3l`GuH*2i^uJt>B}Q{?f0EWrGH;yvP~$B68`2w!fv)5!J{_^*$MCIg9g zCk_f8K9R^(LcZ4^)!4r_5!FwAIc{Remitk16m{{>|ZXCZ`Y5xx7C>*azN1IPFPgTH?EO{^# z*B0zEn$9ugeg|HOTra|7Sn`xC?2~bybg}?Pe;qbw9s+j)Jk^8`Cds_CPWj*{v7=%# zPU*k7*v<5Fy7Z5V?gX+e)&q)3k9=}gBpw&$b`SeJe2c|@foRxa+1i2kS$(NKVQ?*D(p9bQ3AKfB=TVPWp$#}dIQ3a&N zS#hnAdy8gvS^uAeD~-4oIIC2w;*C~G;i%KT7?K2Nd827?YcO@(a7j+Q#?Wa6%csU$tS4M)WJ#&86fmrzyq?kkY?hQE8j8BoKXPQj;A*oDrM z1aCPpx{k^ZLLAh`!yEN6SiT%JJ`Bq?D)Oip*2LpzX*`Lp&WodUFb3+~2D_xeyQP$w z44vtYKgUT|8t13ue0#y0S>js?=4BIZ#Cm`cmtb|G3nwx<4U+#;YI!B>S)nfmYH^~T z_v~4L=T~S$Bj!RZXEa1#9n-0z?(ZizxL{L2 zW>~a54`xx3Gj=Qz_on5$P%J5y`qZeAf)37@-c(d1^5;Ap3C+rg)+o{$(8CJONvI9o zdymqAHDbeY`y?_`l-!yKE$tRXKMCE;Q8G3Jrx#J`h}+4lc*VuM9eRe zuxSK-LF5?*`-kZ6GRe8%8Yg~-%V7q56T?nO=d5*rooUp~Ve%X_eK?v`5!~S8^9WjN zd05Es$k|2ExFYH7di`_$P6+-flKHXIM7b@5lO_#b3uOMVX5w*mp}^N0`AEKemBK%? zHorF2-7~GZmc?kgXJb=92}IR7?H8NDTn&l!M}8Az$;OCSm;Gaqu?<`%>mj zrhX}b?|^#L)i0;fuo#|{Hy@zV@3FYb7b`PKUm@;x$X%XoUJg6SH!`*d}(CV?HAIoA~J+DOex z!;JMigGUbwZso8lsCH0B`-zx zCS*Gs)8D1-@^WQDrdsbkLs~lMy8^te0bh>w0pHYAh>tzc!Z;HSv$<8amq`9Rnp72{ zTdT!Z7f*NSMjA{DY~8=IqaovQ{3?c5rQttSl{RovW zu%KIsj|`j}v3#@)Dims3VeiV@IrZ$?l39yP=PZ35p;j5a)mMLObq0jjNOzy`iv`)H z3a7cgOwnP|U6!UZh0NI=<6@7Y-{-ySykLF` z+)vel1U*()?og?#EgOLC%@JN&!#n&*mQt`2+ZR&ce4mbTl8lBQyKt34rw8Q9fVHmI zGZ1LV=({S&AZ|BSh`AW8D+L1^Ri^?vL)hB_a~;=rTQE3dFIQ%ph3CLvMCs5fl(d7SCp4Jl0PpnR zf3ABmEo|gTS8gxxK#jw*C3JfV+(w;Up7&fV=GViKwfcc7wkY)P4&9%LGo8?FG5TGZ z$F034PZ%IhKeb*Bcx0 zJ_(*l!rh)&Pt;olwL8YE8J~vScTzZPYA&(*WgWIZF}{JRW>y`w>Qe z_W!B*F{-bmPX&5a0dI~(eG>lHD7OoFE&$CE{CMbo!cc`$uNC!=^ez?w#GLf5VMMd>1p-9G_JMKHR|UCzE>u?(fKm*HXw2@ z3@%rd^`@dv19~tKZ^!c9$f6YLMZBS?;tbBaxZvhMNTernbw=7gh}6eGoyF|e1bqjB znaFF0Qe7hoExR1UJ0N-mu|Rr{LGK~W9*)VVdiF{bKY z!GnDMK^m^nao}39^)=FbDz@P|5Xc)*i8xiG!-8M@b<%?_5dDi zokhgVQu2BO`cgg^(BZ;c%-p|~Gcs|K1g{Wg|8cp!Ad!mJ3)zmz_u}}SL|z5VObX8? z>VsPNX4&2hVQqnqvTn(DCv%>vw3Arro7&_KB|fJh2JlEdyt@HEF730a*g>Lut$L#d z?Xl=Ci{~`JR|GmGp_B72lfk_P{2uE`3SdUsr1+R3ot(H&%hdPv=>dWFmg8Slq|+Od zhiL5Q;+vW#ODp8*F6v5YilCKQdo-<z{?Zazg}H&nEoBnZI%r4uw?Ed zz#C%HFY2rY?iPX1Cg5TZpOtk6VgJ%Y^tK~p;UVw6TK~V}>}o%FF74DQXEwHTqE{dX^%V6W$ZGbkrs8PwNm0H5(bg*ea+0)6%S#EEgzy}JM;$RgmGnfV-&f}L z*qqWJ7e{KW8_rK;ha;?oLly>XjwKHi<&(8xCo54(z374-9z5T5nC6!N^Q9K+oVZOE z3WwA(Ft3Si>cbB)9S+^Gz$#Lqz1 z5~&@vrE*-VYbKXhz%h;*=BS%}@S{gR=J4Sn|6d6XHRRM1{Yk-Dj5b>Lx7t)tpI%bR zybIk2sJ%TR&(&dML6)E{l#bV&hw}NN_&5$%#-)~-Xg3mpV-dq+t-T?P2FCHVkzQfR z?5uwuV87FFU8ek)r}hhQE5N_Cfaf(sxQdN;{X0GUewJO!!M^|x5AB|#=(dPAXgoAc z_GX;bl&n^|KQh}b+?}8%$8}E&-bJaG0*AO5Bzk%sxwesbiZAt@-67dk;IZpW;(l-B zo*ntWLT?4jW_czfv;X9S$3gn`EZLC5t9-q}iH;Fds)hd?!<{I-$+LrLJW$In)Esl< z=Yj3#;VT`kd|lz0DJirvAa4=Y1E?XEPI180Dsqm?Y87}Q!Na9{nssJr(!{YNh+41g zaE%)U_whC7jF#p|Lort@zV%0Z*Ix>=xOYYQ&LldVl-uL@Kx8K}^ifegQ~+5khBTT* zMKBA}4~lkXsx$?ao;3NhK)E&%cLO^dM%&zIN=^@@_#7WRn!$@Hy$QR&LwXWmIl@oY zWI{oI@mDfk$Q2NdfU>5p^c7AL7rdN;&s6btC!nbg+pA5f9;79lWi>SMAXJ>&m^@!+ z-l1@)u{SGt6yau6Tx;#l64>`UE=ihrZeK}0w0Z-uzhiY-OEoUAXVN5;x`QO^>hM%S z%SpWbxEk1qY>w~9Y0p7DBRJ6!t!>GT#A-@L`81nm?;~eGLRuYFuN1&0t=pC5FCpxV z_@tE6534Ji%Ku!kjVtTx&pkOK$zM@bet^lRaMGTZ8c6wNE&yeZ9 z)0L!$>r8J9ChPQ#64WBo*O=)7oXx!Vyp+Z1*OZ&i*vFxXq22<@SA%$V-gXA^6bpNm zoF`!VeLwqjDm#Ip_ox|&U>kvkVwx@REd`b-5P5+78}SF4rXNXX`ZdkWZ|c5w5A87^RjEA*)x>zqEXUQBaXp_zMU%DyGQx-|VC-~;pSjz+Hu^=Aamd3EkJ5{*Axyy~C& z;XL;;3$}+*KWqEt!ZkMdiiGp2nnC$LIeRfBhY9`0I45}CM@~9d6uq065l+(6Q}=}M zE{!H5H5f*-;^gNO!sk$_HXmJ;Hz#??G;2FGup=eiGlh-`vdW6ZF?hT|y{Yr6DL4r+?y^Y#i_N@ok|BA|dP^{FbYC?pNizhSo9N`Zb`CSmd;+V@bU^bJ& zvI)elviKuIe$#YPsGqBfE~?OvRiLbAuLAn_`s6*BtZ~876duZ)Zv^c}!nb8eV-D7x7 zjBYBKu{NQxT3!#H!9-$ngDozS@%Tu)jyRj!FAy42qI=RhpEkX4eqIu+Yc7ANf(u=6 zMAN%{8gXC_!!*2JSVG(Y^=@7=g zHqlkb8wS>tI-1}WZWooSkF7nDpuvW2hx$%v9u(@AGI+qy)5^pQ0^j6nE>zDV{br!v z$l#t;qH`I$5x7q~d^j;<33|QYj-iwzGz)TVo!%Lz+(pkQ-7TkMt*$Jpw>5kkfg$Da zu_ky-r8CxX9tOxY_S%(|>t%5Z4c3yBflUIntMb4z6hy1iv>amNyN4l*!R1@;`xQ5&bZQt9*J8u^hyM zfnJHCSFB0|xK-e9d@_!+zerqON@f{&Cl=j+`!KR?v^`tnbp$VLG=#*t7qa-X#$;cj zyBGBO40@QG$MSI}9p0x^wL{-&Mox?AWsY4?OwMUcb|q*nl=~ulG4ord;yN3(%M~ZX zQU$fQ)ss4pcB|qmN@}y@ziaSQIrveKsnQjIO~QDE6tCq`pJHKQQFScB>DBtfYE%5KS-WIj-)TsJB9O^`GXnbbP6A9^~R1%N}H? zF;T4;{GrHyR-~h&$7}FTjk>%g8iU|=qU*74ZOls%zCCh&NaSA3zQ*>IG=4zY4zYU2 zmqW|d4sC|V_6z~f!te_rUZKu)1vaTBdaDFRd$vys&u(9eX6@9met#H|bqOGqUcP1%8##0}#AZ z*@l1)PNKUTotu5V!^d+8xVO??g-zQKe_VxL_VlONJHribY6f-~v(TuwvhZ?Xh6t~d zqJv%ao4|`L8YRK7K+h-oRtVNgdX8cb!_p5Vm^xe9PsC=B&)Qnt4BDOY1WGn2DAl1xzWJB^OiMREUz#xWX!9?Zl~Z^jOrr#SK3rLwzU?$Ej_4JSBC5JG*+Unh9`ouyqI1{cGWL*q8l)PnWGXv8N)_&JC`I98$IlNh` z&vdbQdGb4oYZW<A+KXJ^K zKz7B+`I%siO)duZ8&|huWTkQ@NBl%h`eU;b!-txhx<>djDoya^jSP*7+;i&nsIt;UyEai>fSg(d&(`EuPFFFThVmm4U0|GtA^Oy1dm6+Rk__@}$B6Eh z$s&{YkB7Y?Io2lMsCa!D?nb>UG5wX1ADF(&foGRUUoK9{p!L?dxKX}$44hpc12H=- zCXKc6{~FOF*lo$-x3=_&tLHj+H#6Ovn=dIj3484|c&&&!NBpN&`4%bg(qD3|hUZk+ zz7^&)WCmLMpaByL_ASSJ?vb;4q7(O7nCPMvNB?S=zu$HT3rqnO1P;gy}B> zf4^pzD)jPkysZzk!QuqQJ`9qWfgi*6}{haUMj=yd$5g@ zY~ZRMgXLx9i!|(zi8gu3d<jbVqm^U!;rkCPdNw|=!7ZrKP^06f{KquWA@sr0zJ3+6hWc#)I zw@g2cQX^0~*JQXh%MAQ7Aum97TMb{AxCenV1&~#Y`z@W86{%SweGS0F75TG7E|Pdg zyJ?+(We7;KCoGqQza~KWlZml@XZ`u;h?BMH!J=O#Jhoh%!fM>-C2rG zYcQ{4^`8JITK!wmw2Z+ikPJ`g%&fQ}?Jml&_Xzy~i3y&)-HV%Ng0IR|4_{TgW}iS- zI4>34D+}N;j^?K9Dx|7O{1CQxMyhKDETQCVn%o>GGok!lnv;nd9ov1D54ZRnP3j~c zkJzxR(?0JPAzM}uhq3=tl|QIDb!rMsq3V1r$3j>M#M+dd=;7-k=BM4^Uiofb0Xcie zh-!!qpm>A`pJvG~VKIdHUQzHUk3kD!af=R5-~j>28L>$fX)lOA!texQ z7Xj4Q*jJ0-9bn!Kiurt0jLeA8)|bpp6lail4m;&BY3Vp`QujDvcUw5Mjyz+)6Ir0vtpV;Z=yjC%H)~$Zv3pZ+BgD({@>t%k zZVq-;s5dBlnZo-3JvTrZ8X!Jla=nz_G(=M% zT}${V9bH}?A8(HKMC80E-Y4si`Cjv;Xe~w0)uL%f)V<2wm378yzC?jLiC$GHx5l__ z4vwkR_ZE|l9DmG9tF)>J)oD<7X{sKN^RtV%tK(c6qkbfQCs#U%)o81?704e5{i>XA z96Pis=}vH&OaH2Mc0xT!sHG|UrK=Acnz6QhO>pu-xmejH<+!_V23Ep-T#eKqO;Y~@ zswGkv0vIw`L+h6lIyp3=P}1N! zPb+;$ffM5R4iwg#xSLn#1Clne`Iw`jX*1N6euMG;iqd05Hc5d|9DGdBdqwb_L2V3p z*_Mi$c2n*)o<5(WE4}z5fTq-go}nCaT)!5e)~(df8Te<$OiQ7wjJyx1D?|AY2|r9F z7u)!$qWqkgU#LA0<$Ix^4+dY9*sDc$4IwwyiqU!fL}dT;$Y}=llBlPFs|=cxRe!XU zZ#UHg4Y(egnXde#M4k@S-5C68#HONI8Hi4Z)ke-)mVI1B$CRaR!=w_U;cl>lffYlB&kO9w8qa=q?S7AS1CBz z5glOWV91`MV6g)067___e_PlM#?v#py8;hs^mbxnQ>je8CNk(R! z$?3SREa_Yc-`&qg8CFd3OJw-5l#^Zf5kbv)(n-i^mOa2kSEFm{Y@Z6-N5uQ9oaP>W zFP7JoqVuf2zJ$L@%P&Fwn0&q`N~UnMRpO_lytq!cJyEWuxLKqw%oksYgJT3-Xvuj@ zy~oHh%zC(b*HOBy6fC3U6J?*MH%FVhE;$sY3h33t2 zv?>B`)rbWJyo2Mr^R!P6Zm&YW2>Bj?3oY47*+FO*5LE5iB^QhjhuWa9tJojhn zs*~Mo((taB^smcrhCtN7+YM}Aj?XLLe+#0$)f*!EaswJyhuUZGUrp`JCaFDcE^THn z@#wG$*b~CXwEc#J*J}N4M!yj!qjQDhPV|uvx4BU_sz+n6CoGQR@tX*CPP5gTu7Tjk z`eZzcKeSO#gmz2VhZV+U<9@Mv5351SyRBe4Y4bW}BI27%YK~Sz6*#@bnpiZtwL6b` zr(?Rw@efk=n8Mwaxg{_|W8AbUY2(1Hj4X)Jg#mexvV(|pi|s5-=EnAcJZ+W+wGc0e zb-&u;O_9Et=r@fVj>%7r4*UlE?_lAXv-cVI^dCKxj)NcyGJ91Fih zV*7E>yPh{<+lwVvOEkhQRD$p>l$pUCmf9sS%}v@nZ?%?vmI@r4olwCE1<-2o7F*Sr>>Rhrzw*~=OBoy0E!_M3LL)+Zk} zm``2xng(quSdSL&odTc2S?{9LGUOkb)Z-Lo2^k-=3pp8tz>6C0JqVwP`4`IV)F{FL zU(<~3Z7x1&&d+vn>_<;J!S^!B#&$$KZHMev3EG}QW6JpbmQGjZ5*tn^(~r6E6;QhG zK#3W37JxkpWM$UfT(la7JT7f3s4p!_QL!00XNRmihXX8cj_|!DK8AYrPWmmOm-+e# zjiww8mf*0d8$OD{tzLdB4!(@#%yRQS*3TBhv5~x>2Iwq=DcTm{{#IP-q_P%oNXgA9 z)utAnn9zF5{t9jTk`d)#Yctcsw-YgV0MoT8Jj*BB48N^{e+QY2=zTf*N-f*`pZK6a z?+wG*Venh59xqn|m3>5GN0W(~k2B(HP1j)bx1;)S>qEG+Xs?iFhQfVg@V*JZW~DAH zxkH4v`q4V5S1a~cf<^~uN^|jg2HoMCwhXl*v;mU+*8EM#t3)^o{v9VvL&F7L>8q#= z+*^q$pm#C%dy(=a%{VxQ!T7N8WtLl=2{-!5a$f9<;+vrw5@Uh9wPBhcgG&SJdGL&k zy$X|Md9&Wa)+zE_+US&?TWQ~?@PJ6ZBdT@5EUZT}0&oSxHFjPF;$MicLYd}+jkd6;7=00fGL9y@`Z}ub(XgI?pPkZF zS^9#-S2FcDPtFl)5k{{#w5~$@Sa264Bua`MocMlb_Bd)i)?0Pyiofl%AsC+pT;kOk z^0DWBQX=PZdWR5efs-I~4Tn7d9Vy7!$o3`nK!i3ax-4>r2fF!j`)~&JqH+UGYzQt3 z$a5vMgyMacT}jz8mTc!Cg>q^_?l>g+m)tMvyzUwvb?E&C{y5}cRLTC1ihMh^9H$dH zOPWI|c7;n?VsdGMDv(}kWP4p4Lz31`G6k1DhtV2lQ6&x`O7kKH!6J}cW8qVg8eD`! z1iXwU(}|p<;PaAg)UqLKOMjF80Xk&pbCRkeK2h*5C256m0NHcEyMXfPp7(>Be#&Gn zC8;%KW$!^A!|0Mi)HA2ZF*}es&v7=-I-S$*$TB?HqgMiQpkO}tP0}Q~y+u6RS8pIQ zPQkN4_$Cbcl*|4pI2PFjAzIF1){CFla%xsDONCppp2hI>l#e%Lc$kb$7khz1*EpEb zs1G-~?;IgC0|O79;h49)WS}*hE&fN-uVZpegFor8|D~WKd^NXZ!$!GQ6_UDNi(Vsxe|Y%vX6a;2qM zf7e6|aKV{`k16m$n(xohg%N(e9&gFAQ&`o@%1t|khm!i+sCgU0c_i~<%yuaHa%gHj zI$qGx0)EM(6wG&w8&@@!+6Y@?_~kmhBkS$wVgn(YiJV(fCxqt97V0u$yTqnG&d*ZC z84R|QUR&c%EaKZS-2zpAB-g3S|BM5I|>mnLk z3R+&5 zQw4ghN=}OLyF584?HOex-#k7Ys2Ko$Tp(8hy3avlE8*P=pPiu7rSpAGx5=4>jcB}} zPmu7IFgV8)7FNqUmHhS)|4^B00NR6{Md|dt8vY})b7HVw+l7?uhTf$L>^~G;8bv3j z)T~NY;ASBQ8rv2-n{sseANIit*`gwuqs`$kejyw6 zIE=5WMpLNyGuE$#_#sTXTl=+yON;T&vUsYa);fH&G(8bHJJw6Bxdi)UDkYy6qt`;vQhz;|GELxf*_kY3n4ut0w$83_erAI7zl- z;ERy-jrEN{P6zmAgl@!Yy^dRja2f{CnzaI4Ow4Y>Dl8pek$in5I7=oc`N>U~yxNF6 zSJ)buoSuR6>riLK?f~Sogl&VMsS6Hqw%y1wCey7m?|Ha6}cJJm^dp#nDyh!<2nFYpRSL z3v46Mr`DNWjC1{F3sy%w*q_zyuFT=ABHr^lcw56*T>I#zR$K3{=r1K13v z-WTXspEWxEe<^=appWO!9-F23GiJLTX!8%=WI`i%UPz&~Smw1gK)yIz}i(ma=- ziy^uxm1-l4muvN8Ip|_QQ{3asel3!jLf@@G&k}t;wj~YMG*QdS!gGb(Q3cW&RO!e& z^0o~!!{X@SlD;boHxz+!z+wlvz$`u?-dPr(=;o8w13HjSE} zUEGZEwN@=B=AHz2jI>OnMUGr2>@#Jkr_VAD`kN;`nZCCKhNSua*x3+fR=aKu^(MRi z?kfMr43$3Z(}W%>vr|m?uV`FF@{iHtZXNBYFe#F3Bk*U-r)z&Ga6XB|jlg-ng}9jM zJ~p}u7dx=x1{i*1WT)5;*8GQrK5yAnMy4V&+e3j>lU4r5hWv(urB6}Z-$Vxrdgw9z zVoI$`$#f=3yX0AJ4|uAtM*E;zN~0u-o;LaxLhla6_)uI>1~(<~2}pIXgw^Hr>n838 zX|fKY6;1d~WM^xQO8V^r`Uun2+CEx@cfhcf6L%KzeiMy{(J59w(s|%e{pu|77NzP)9uJq(VG0!uO%DS3ch*3T9P?W19twZPY2$3yk{Lgg^L6;M)fw z`8u*zn%51uAcNlEWOM=^Z6r_o`aT?;%jNY5)It2Rgk5s%oWSi}oBF{?^`)6!gp4d_ zIpVaZ-be`Ui|z6p*;M57BWGd}XB$k@3cMlX3`#j;wLdk^v^VK-+*!(*W_Xy1+PL~e zsUHz`2ZR|YXEOaTL=&yq;KRO@G%z?bwmXGf8Q6OpQ4h#34a`(#OHIuH4?pZu1K1nN z&Q#&PIDSj2Fje{*#`imRvx81f%(4V7sDxb5vy?xbiVX3eNb8F;>LjT)xX4lLfA!9- z$5Klr|2aVYk$Q(h2dSwBWK-xg&+cGaHOhUCS)%R8MiY7ZqKw)>?WQ!o72;)*zE-bp zPGDPx7kh#je^!|gF8{_8hsyXDoQ*0dke7EIhwtafErt}c_=HCKdEoqk*jFGPY?Vpd zJ=o++c7TbOqIf8?!!qcSkUZ+?y&3SQLwc8)TWNwCz!;3@%ix(@GPPhPl*4k4H&Aaa z_l_}sxdgLAl+Lr&KEE>Ky+l)^K-JY&o?A?ol#&sNnyvLGP@jX6uQR4k26ar4-jL5K zM$d%75EEWouXe{UpJ9&!z%BevgSind)AYC>50dsvODbX(4cU>fFMxQq z=$6IK4O~xia{JS{G90vSu9h|<(;d2w!QMsqZwYTriAIfH2-GH%%+;msQS?sAUW%ic zQ7M6{1pwJ{GB_>f80WE)onL}WG?}HqiAB<@j^06aixADU?sd>@bl@}yAIE&0_U_52 zo=y2nY5C`V`YJ#5NGZL-lFvf?h$4ScKWR)23`HtotrGc2Dz;GntiUt`+jI1IIlHl3 zJOcby)$BG5%4q3F8oe9Hsg1gymZNphS!T~IZ@7}j@&E&03ZNKL_t)uzNoK?RJtISO8gX~AtmeGxR)DG6yYwGyv5O|d3pef*16{9D$o!2IQ5U znTajc^rrfdua^374p&=+YRsVf3h?3>PS*6KK)lq5`ZBz~l1?f!-LX!W>!&?Z?{Uv% zA7MMM+}==uhPmi_!5_tZ3Z+$u%~0m@k{!=U2SLkN@iG{KGV^dby@tCULvy&APIVPR zb2zS+?y3Y$h-vE#Hcees=Fa!zo#oLTAZ!jw?a=NqsSKoKEly7 ziB1G~eI>JH&R8#XnIPRTTgvIBQuQv9V~5eJ^|Y9fewvLD$xH&e0eLOW9ZeU;Aoin{FRxh8sDF25eEaLeM+JGe10Yr_hiXgh79!VE}@sFVMee~3{3&xcf(21P1*7f zQ2GPUBh~aB3cjQkVLRB;CK8W}$i^(cGN_LJrwB)6uL>8|NO;G?d*$k#_(k~1run|!A~_4aVr&xn_N@F+D0 zTy(Lf6S7YFzx1>OUF5*G(vbu7=?1OQ_E$nCR)ZQ2_7K>Eg82%)Q;eQa@-yGGbJ_fe z&I97XfIpsvcNzU0AP)+^eL6L;-2W-zpHa3X<%Pmo0SniH((^23R0&~p`956n9n zzpdH1+LZC=F)#A4o=iawCEY}PGgA)%dxAoYvKhYI%hVVbe&^`b1^8_a+X$|a@-D~L zRih_;@-`EjGfx01vh&(Azi+7cglD>m^iox^0MaL!xvHd^)~ZVrkPh)X+!svxGfY=0I;WftZ3?Q=XlW|=lnAdt?Jy%p>3EQ^vr@K4 z%cOs$dVnX-9E;}iEetRt@TIWfmo{7P(1a0x?*0gD>3yYZC>zYf1UIOiV3T|g$FF@Zw zIKj1bA?#LRM^H8Wh?-xi-tzRn(#~SZwJ08If;ZFA9k9c`cPYr!T1_*G>*5N6I?_}868hEa0L>TA$bGvEdkzNw9P$oM2SHM!kIi* zD9Bb3zTrgJ27=Rau&UfHb<|TBEOOX|j6SPz*3yrUz?c2xkANPpr~MG^8-n-iz}BW_ z6VvUBW|+Y<=Y-d9CeV54O4CzXUv5Zu&WFlC;;C!htw^ z%L_L^a5W(xAw4%|ZW8b>1r~AhyQg+4uo0Ty6Lw?HUQ&sx(#0N1Z#E%^CG@NQ@>EC#OxrIt?8H%505@pVjR5!68C3n_UzA(x8)Y(SI0s&*M? zG);ap+1C)R3E)8N?rP$Fr7{cL+>IuD#{{c#>bwj+#fXUrp5UW@t(*`?83PKOjdjhV z2xqYDTe7Dp{Y}C~I?-ArCPL?a3=Uv=j>9Pp-!}9U3if94=}q7eW;OtJ9S~hH9c<+0 zB%054-jh2_@&(FlD$!q#>l0I^rC;o&^9xmUMhUhnH&0c@hXvpjt!>wvftH0cH10#cVZ;vqij9VSOWaeAdaTcZ}l&M3EMNxcoxdy%uC zXvT%{na4`+<KnGc1p@$XwwiLvij= zki9P~bqv8df?X)^9^Yw}n01HvnLfIKqw^W*N$glZ{vfa)Hf0|mvW=%(0se*+KQ?+d z#%P$$Zwm80z5E9>{}GORTd*uP-31&%z__&ioWLz7na}@%S0(=EB0jfDUz)X*X}FMj zcS$lS--=gM~|C zuqtm3OFf;k144{v9Jrqax zmc>&X`35ED*QqPZ(OMdxeu{cFCVgwX-y6yfCibHMoR(pyHFJjw*rzBTJuY_~fx$mGj`ikl17z0_)vTOM;`jszQ?c`t^v=xD%NzJ^?SF+> zzDU<8cwrTpBK)Tj-UsuK;tuT!7<~fi)j{&A*3+xOEmdZa3lf-&55k+n=zy{tvFMMz z2AkT1QqPo}NwIy0$S;^2nKA!))*5q~Nn`;|MfLcjk_CmrRhwR1(B?wR#> zhU8pGXOv+p^jI2RM^$g4C8hrb>=n*NVct!Hp#}422|XY4whlYbr5(6)6%%!lUvU() zR)rT)=@vhJ!>A{KY6{VvR_zIa>*z^|b|YAB`1g>`3e4UDY^~`rVZL_cOr$!AaHLac z1?4Ua#v1sRQcY^W_w{rN5G!M`BM^mB;eqbwGW(+~+#&mj) zf08468VJ}&U)IT@N;OH~{YVys%|V$ZY6T7VILR0e?geU7Bs-MoD1v^Az{!%X6~4_lu4?TZ0 z`7zcbk!g?AsJL-mw*DX}#XQL;azqhU1Nj88KbPZP2(Hf=emEK27+xLdIEcGSHKx*{ zwA!Idn;HvWInmUN?gWzaIqm>WpPYFUp}P^U(*D|l`!7v2F0LTKD^N|#tA9%PY7AQ| z(}$v8kU>%%;?`uy0?G$7(%jP*rNR9eUnlr^g8xpzbI_CmvAW2oA%3N27C<}un0W@l z7dUwfvwNv`Cvv`$sAHt(9+q2#n(Bd^n7-7My<1FgyO9N%k(cCd=RrG7H`(5#^L)boo`EUmNk7DSc=dfhkQ{Kr{=sZ zv9k!JcWDG*GB=5C2n&5hFcXwwAvgGT8MaR`^;{)7S@03Qz0<0_+@4c{+bh(3ruRhX zd&*Y%&Z`uAMYQ;UZe1h_f+)rt5#Lbl{!*2`R7?k$K>Z7f+gUufI%(S^dH|c@30@kZf{|SVn+d?9SvbQKBnj34I~KvM z(k>vXlZSzXOOC<%|2(VHg9Kh4;Ik43xO{Yl_ott}7-cp?JVnFTVsd+dMLO(~ZXB4& zcE-g8B0itXr+Ml8IDS}_PE>^rP!7bp4aD;ba5lhJ;167ItC82{@$p)&8`%8~4lnHt3>k@=q>a zEh2-}@U$LM9vzdx-lN%@Y2&3%aj_qr0;9vCw1CO_1U(Sh*&IAxEY8T4CJR+^Y(7*g zEl=TSVj>yMH-!pG+LJw9z! zMRzbhLc+G#jK=qO*(Fd<;Ub+#! zbqwAU>qlL?sG7VhP)~{PkL)~2suSlV%ooP~L&w;IM{!?F7o>Tk@I)SN^B|Uboi#gr z{1}p2f|mqeDd1{`x#myA>0kb%^CG-mizdkLOq>zWEyms=>2;38Bo!!-oo<8I64hTP z?*aWORa3S4w5+rWMiXVyz0QuNWGVE1i}2zcTg#j|3=|D02ymZ}M{w+irg#Xw#ARP- zTT3*l7S7SmhOB!Qh`vSY(>S=YGS=nxMu;D(_H&N=ax8M8cXuW4>fS-bjkikOV2is;ajqy4wPVZ83Lg!j#dA=w3MR|BJOkmJ zw!bz3-y<{`n6ePf%G1L{P2urW7Cv26znXZRu(wjSqKutna8C%kNxC^}F8k*%t)ABkHau|MwWQk`&c>x z(!D|Ev!m=KXnw1}KM+QN+bZ&hT3o0EuT--64F99Sk#gPNH6Emy1dWcI0Zd)u*umv! zn}B{n&9U}zi8e&&RX6-HBU^`Za9~~n^1nv2UMn95e>BKd#2i5AWha>DWxq=2ddb{0 zKUj~Ga!=kP;@7bLD^N?AdDR8XMY9EO&+wKQJe$T#1p7m}+X~L&JYV79mpnFx%Y_+B zbucrDuXEIAuDp}mhDu!|b{WKDeDq`*o}HNAi8>RSS2Jb{)+-emo)w|PZlK<1E6#@) zh2WhAGWnR>+45l-m-wlA?%YpNWl?pERagOT=d=pD?-FtygFgX0ReIZ9;1Dv#h5wP{ zuDCFO2a~u8Pd3<*T?o9-l3@g1s@PDCZXpC3vqTmLf#~0QIbYE}0lLV-KRF$ASnSU7 zH)FOl%Q{4)I$%%be1+1F_^ir`Sc%zaRK#TW~!< zM8bZFhE^`jfi)O?&%rE9U$xFx0>@YeN%BExvJ!y;#Sxx$#CBHE1Qp-!09z*4vv7MV zp6loPy9Fl+R|3^Us8#uRT4EooC95KQH&2=-;fSodz|$ZFHuzv&101i__L6PoM3YK1h$Qj z1|V?@^E#!4DrWmA=Ll_H1y9kWC#QbcB{q?AfZ zOG}f6b|F;S8i+(8g|ZUat$CFRPmm}*e0DCg}KjKW*u&<9g95&sw zn3;(`uTo1h=xO1!53B~s9?^U~L(eFyWhv!{W>ARE&+^gC=@qz>DftSp%E+`KBnQ!B zAD>*(=_=y+U@(ea3Bz{v zqNxhU*riX)3soQjKnyDA^8qHx8dK|zsCR#q&WG95Y)r~AzNIPsh?zi|bPP8o=sidG zf#`FDCdTB^8veUf&58QPmwQ~;tlG5la9>IlLhCHO0m3?;Utmn{N-+S*)(CW{WzWa3 z83cV4ZH(;)&u~sw@WEwHcZ-gKcmUVyDS3s^zc~HGm_5w2$KW?YzLxxaA8$R)$L82_ zXr@-GdmZ#U)>CyfP?}lN5{kT#z~#QVy@($<&i{8rtqV*O9e<|PrcjCa`s+bZ{xDXtaqETeX2l1WU>G^HtSuAho~9f#fO%-RH1m*_mpsUf&KljXoX8Am7U z;%|y-Lq)K#ELuTD6_$g`N@KlXlNW7g_(M#8LGgp7=-xoiDC)BWevQMqv6zes%bB0W zVgkWu6v-VaHU%eNh2qkNq}dVw`CQ>P9yCYMat$su@n}f)0y3rA`rdNx1!O_YzODne z{FTHp9#MrCT3{?p{;||PV;wEplS=GYN4|_p-E=%9mQRGRNr+Ow+gvm+fvB5E-j@1| z7;i{0Fnk%o?>E3719ojd4u2weZ1hhdm>S`^KtDprYDs>G z*^WAUR^Ln3hD8P#@c-+Q~AVfI#A!|4a zOC3Pz0pfSZ%Hzq+Sga_ZX^Fg2nhwfY$Ve+?RS32dq5Xz**SvXTk1aS00^ZLhH)e2C zozyYep`dorm0W8ua(X!(etOChPl$vY(3tl@PK-a+wgk-0>puUtGZ?M`s) zT|QVM;ERTq0;_XOKji6JK_4`r55zA8-gmWnA4DHlk!xN42l8NvoRQEa0joF(e@1MI zm+WQXBva^|DZNmh3^@a>Nz;)G{0!+DZFdjp(a3rp(1#5NO0SEfZCEach$LW(1P@}X z7&w2QbO%7ZoDf~ZzbU4+mDqIR94R*)FrMV_ZWg^ikt>p-mG}cd{)Wop`Hg}K@_HnNQ5F&ZN9#Vq&_ z%e}|)PwB8PlhrA+xIWrht9K-NUo02o#ME54j0W@5VJA=aX9_a#M!6YX#z!V7+dyT; z9%F+7hQhF^)Y(Z>I#4!hx{3BKZy82X4NwFqogYW-9X@-$ZAobTN(Hp!wCp{)f^o#U^G%Y zGoq^z9qV9MlbICYGf8+I)wf}Ji%C}bWVr9tJN8({Zb$e<+q$ogol%S5v_z-CS^+^@ ztrwnU%>d#Lj6X=&xQGrd*q;``rcgFMhg4S5mQ|^v#A*}x`xDXcWIUm^bRH^vUoI}S zXd9ugDF&}t{(Y`)9>JUoE~D_h61k1>fq%dKJBr<9v8oy}!1p>JR8oadb%| z^^(RXWk5ja{RCSK3ZzAr*vSki!1mgS9To*(= zljH-6=azxb)BFh*z9jPtlIWdMw6ZRkm5Rp*@V2pj4b*Id_hs;ba<3;b^Nqed=R7Cz zODKPZqu$Y|xxsC?ZsnM^()_KX-;{e-)?B6iok9G8G8d%9S%%)!$XXCtpXFiuqv`%c zzH5_vM6{Eji#_(PukMrZ%DmnaW)Gb*Z5qj*7JVb@9(D1hLHKth1_7};ML)2~P^>#z zXn}zpB^fQmVuC*pV2_XvG}hTx=D)ejVx`~2aUX)N$E>e0T~xTWiuK02n~A4|a%ffD zm4}Cc9F|W;C~+~nS%Gs6<;8R|GcX-o z`g`JZKJE6>XgY?|vAH(Vi!J>(f7qNX=|Srf1BEg8C|y{Tsl4T-C?Q%mK;!4!lCM zzj*rk2zRSza|{_(1nsRPU*0gtD=u_o7N}RS3SIpiCmCS3QufOwey-4sHUBU%hos+F ztM_o~0D)hpq5*z%{b|_0L_Y^kiwe@5vxhKWr>tone^+|%ROnAy=ntLbfWZetwIWG= z^z++5{yIDP(vId4b!JIb*zyvkW`%HMz3P#L*CPEti!4oan_@6g$}hEf4&xyp`W=*Y zw(ZrHJcHx0IO&GPo)Q{eVb71~&2jjH!+(TP|Af^6R>Y!B3=ZbhE{7b}@^2~USDM)o zD7Ww&f@Vf&Wkz&NndidzC8$4<`XVH6t&DRdxF{7|eX2CMnYtE}0lxRE#;;;L-Nk9j zMrie?CY?BF(%}a>~F}6p4D(x302l5xg+3DO1`eZ-4l_D@CO|A z$+BB*`D49)wUPXx3#gG#yfe6(uoIpf4k9NR4?^s!J>3^rG5m!CRnMz~v5`oX4$yPMMonvdQ2N zG!;dnugT>!P@gK2yBC+2=^#2fBXGm`$k7=@m z_*+VHzl(2T><~m>mEcfB%N%fH;*SAgcPTF|nmZxfMBx~(P7A*Oi(zDcvIHL5ucZz154ay1{Tdx*1_lVcga1*Xqc`uB$V z)mmSlnDZU86oBd?-^@fysvk({TLQST*4+ZhD&L!*vN~6k&MS{MnB*NTZK@Qs zl=3IL>Z>}oCIa(auoVYgn3-`7%;xOZHG7k|-|={JPMxFR889hh>K-F<*#Ec`98LwV zW~0?D&<1S(oi{y8@L2_()#|zO{OzgW8e3gjBK=+SQpT#U12=}Uqmo;xdCgXvU{I#z zulZc97o9RmHS-Vo>M9R5rQkb@wRG%{DfkqGdx7=6Awwe4N8%=iwn^#ZTAt~vZjH<| z6b+NAaSa(CgVq$ZG@@~xXc~bBn&XSJqBB&RKyFMC&Nl2sv2t6H-y6n1RKQ2-$#6Sv zBjfHy{e{TWS*O7fL3b>9+8o1qo&8*-b_*ZQ}~C7B)KF_KIx)AtHIpP-wmJy!8~k-HDcUoCvZR!gLnqu>)P-cIKq zRKX4P`jN!EVY4k6;oD_B%E0E5SuV_MDi1c8g94phj`E&545RNcd`f`U0=M$n`G~f* z%@m+VC+7c3U}7c85q-Cf?nU%zk9^lj_4dtNzk}4+!2Fbg zH(BwcT>a1pw#0M+uwKkrU*}9mTOYRN_CSyS7a#TDH$0kC6;G%V=VmgCYS8WoeGxi0 zA@pBUyp70T0x^KYc@Fw7GxrhmeXPIq)wN~%ux?7;BxyIq;om9zM(j)p zK?_^Ikv10;!0Z3AmgQCVBHgAIUnbdYp8f-)-J$7}h}J2;){1^}3vVd@hoY)FiLODZ zjuxAY^(9F-C6*UrFfWs=C%U*Nw0{76YlHZ`AlsGT{MOEzjMd3!U25YgE<9y}zdbQV z6}~JF&Nt${kc?CM(v&K<$!g7R_N?AA{=!5bP&3sA{X=_bfd3~{?~I(~syM(SE&Lus zU%OyetjC6?OO5^|FntMb9GG?nb=A>lrQ|Twx2Ng50(?T?Zy1(y`GKwOis-#%@G4Ur zlPTuh;?+zoRpOd-^s~jc5PX%yUl+}s0{Rv?18jFej{M&VaT!ULJ9t^FUM|u45I(}P z&sKrY5!hozR~MsYlpPAt6s}t5iYqL?wb5N;`+v;3!D6qtvR_0Vi{!-|J)8v}*l>$w ze;cF08ei+6ZknBv^jl`#LsIXg*<8(g`|^5+KZueSAeLq7a!LA}rtPq`6S7V5lZ@II(7YGg(+aI_Mv&7gM?7%1SI0)2+*uL)ky<(;|U8_ORhO52M`j-s9} zxCVmVm0)fbFVW~piPvbg3z7pFa$iv&=3=O)j{D#a>GwcjIoFR>n=P@aVCb&;O~Uloa2ha!1HFsr zf!aP&wBI3S8FE`fImYqZ^7yk5e5}+*MYTPK1M9=qG`WVshZET6v^m>TV;ngK24~ib z12JrD#3aog7WQFaU+#mALciV^^-1)I2;L*eCFLaF$U2y2d!bw#>+L`;74l%JI zEIO{`^jLKC!I%tuJI_WUoiX~;TDsd}PcnRCDyc75vo-!Wa(WXf+$J{RpeZC_v+Ya=)F~DR;Hp0D4Gw$%?SJ%^X)|b2w?9tYiZLr0sNIk zYbd(jH~%Pi60zGDesO@i%48Wd_bdHwm44F1D{#D}(u~t|bWZM$=}i^jX(`4BdKgf@ zRE8^3g>O;3JZDCE;$n<{hS^nszi8M4C(R^9r@CTOiavwD#xvPs$=c-9eW&5e7~SOZ zb5qW#a{Mjg|Ax-cdib9Pt9f89MR>`X!TA~8UF$1jy)@8sim=Il?0Y#FVetEr-yFr8 zEOWxQw$&y>x%HI*dpR7-;ExQR#Zw!Q*D($IJJx5~Y=q$LYVsoYHnXx`wf4Kd_!#Qm zKrV~XrJ+zi#Z-j`@X#Lp=W~Up=AWK}DJZbQt0-z1V;N6s|zvsYLGs;rgo5 zw<&pV8TzScM#ijFGjw}49vq`%8F^JYH9KS4m%#>^yir7ZRMHuW-q>8`!gX2mmZ!Re zsDDac6oWM(yf_h;7fU^C)x>3Id-@BXK39`0A;GIjvLg-JCF&!bJST(Wr{ep5X1yc+ zNftfmp=o*fE>v4=n3MPvg`29tMgvyVf@dfiljge;T9hWA&oJ6wKPnBPLsxH2AS z^v(!<9)dNFY>VR;O?(JM&!?iP$TT|}HI0%sNdHaI-6@p`)M8H!RC)=%rr9B>ju>#@ z6kS&j8cVX#;RhL89*7x{Xb0q@X)xQv+==eD#0;fhG-x1$ccj!~Df2F_;xjmZuIJxki|#<*Uk$o@_&nm=q2bO3*0q*D zWytOTwmZxojiMDGUL-&r;~#K#j$&63r>Bbp9IZk151M=u`x6RcdmS+*TIP#i|1kZI z;28<4%3AZQ@!m9?>zUp*s-^5|hd+ayt2JCt(RqNsh|_b4{AsFsQ`|6A7FnPd_X6EI51=cXUuL|w7@OhEj%%oOPcYcw+gK&d{C>;hP9ft6VHmEsx?PK@z~ zL2?O zqw`boNFa9$O^ad*RQn)F66-GxZw2yk9UqkHJBDtu;O~YmL2(aTT^EoFN-NS<8wXxM z)!raprgS$a-f86?iwYBXxTT4ybI`>oSrqw=u6%cf2wfC$>FXi5U78suczwOKE{CQFb%l|0YSGuV z^o%lmk0%bLWkVV?;e;7hUI)jYpwsgFa3D4%a$nKR!pS%3(r!2Zf)hk08k9;hE_gXZ zM{|0cGXM4E>X7z~&0=PbApIN)p0a{-c(}`iiyPv(C)Kz*yK@1en18M0CJ`?U)Vu~* z?$ZmEyT`JhTUP0iuln60cSj59~w1%7eX*8;kd{YpgQ>~dOS%>#P z=;<}+;>4;>Xck%RjGk_xF%T_@_6+pGi zqVZU@)5#emdY>j&p;Bv8{GQ6YtmMMH9_zr5Ieyk+KiKwuCw)H$GfcD%6}2i3#VxB} ztOd?#X^!g=uDii@_FL9UDu2qAo&#YUDf=4pJc9#V9a!q|dN{`7msoap0%vjhoNKqT zP>n%nG?-^G%4#+wr-sx4pOZG#>5b*7)pq6_n(k!yvkdlz;1&%B9TUGB|A-aN36dST zq_-O`p<=T!{qkU88gyr}k(NW1{wGXcErtc2+{#QR7F}+Mj|g}@;KwR327En0(;|0h z4QhMHv@DW~AzlPU=d^hbsPzGSA#H7K;kSRbq{mmw>y6wx?nUNvN-VrOUUz&Iltk>9iE4Qx3OK9C`cDLn$^ z!$5x;tHCv~sY$l|qmGo~=koCoE1`xwCeZazF0p}Z211Dc%G<(D&qaJ+EMKn=mUyLc zZah3KLc~sBvLH>)@o;33$I{N#h}xV!Y2aNJcu5o|C&3yi)|TZT$6@nCjx8ofZS#KC zw8_9*A$CGKFpvX)*o2awc(7Q*H!XCPWM@M1zNPM_MlpPuqRm5nBNH(3-#nF@`)APo z82TWO2dPqL9$pJX$%U;99hs&Rpxz(hRl?d>m-!Om^*aACEj`2hXLSS;bq$tGBp2oM zqFVht741k|ZHa5RS*5Tm)c^}l4Cy`0VT8<<$tEFPZLUr58xg!ggyS5u#)B(t_KHhm zi)^*^4(LA;hh>$?G637cl2sedamBmToI~)Qym%AG@79WkPJ&BL;;s#NfFgI7tSe*s zp)z+dy$zU`I6g-BsTjVWkUf9n6GbvLXRS}{E+#ck+Cj*jp**O} ziWqOy_Q5i%pQ~P>ppQkX%k?~(97yztfKDo-UnIe)FnYHrelG@hio$#yJc3N;3jI@= zh^RUxi<5Zqd0M16+zaG0QoLVCu2bP#3~Vl{2Mfri)>!UdMbR*Us7+o-;R@HT^1RJy zr#->55&T5Lu8>@iceYskLPU+QZ!eZl6y7(rczvWEPZdwY;5p;BOXWW0VGm8-OTvj> zxVJ*ST@F4Xh3TMpP{j|+xLm8{5;cR?x-xz+tyfVwBh6naV~a3JEORqM9~pZUvTr}b zYT(Xx?u|0=90U(?w$Q_4BQhRavmuz74`7rVQS|T0MUzP4+2)p#xg!p{S4ZbrU`&8F z*Had;aWJzqbQd?tH_OMX4RQnLjEU zcf#=$9aaR3BYhW&e`I{dN>z=mIOR*%y<`#WpH|sOp4@r7F;Y;rwE*% z7ePH-0ZA`y&5_<9&$>~Y`;F>qnHMV2Fqf~O-a&;7R8va2aU*u4otoyc0f?MkS(=>+ zmwB>E>)RWmkHTnxDZOb0chlmUQuJ(jTy5jlE;yJY7Yf?6?a z*4TNN;V*%H2J3Tk`p!tDOR!fC{$nFhZXM(9cCX?sw{ihVEhBgjid-12DCX#?f^Fm# zaehiJznPb|BK55{vkhFQ$V(|?F|#p}*|5|}mP%p#p#yKW(YGO7so|&^@?U80<9HR6 zeL}F~5HD|Fd-Hfv%!ikWAJbsAYbK`f8o@6l_KdUa6>0uBW_ySkX^IO@mX@6M|18S+ z1P=Ddbrki4Vu8^|Z7?N+I@)?PjZ{hB;KMof;F}ZtXylDhcCKJgJmy?qOub68*Wj`N zhKx_)*8m+?LNTT@EU*p752@sW0N!i|!tu}MQ8kjEFugNnrf~dNLRWZBW5oX!e3ixD zMYIFf4{NntMeqI{96OYRN8|%_CIiF_9zR6D41#~K?Z#O%!$yOd^={(K$)$D#?o&9n zb4n2Pw;Nr+lFeE09w$F=_Z%BfxA|WbH&OIl1xiE{M^`n3DG@!Olbg8wp2a^pazY$; zh-CxC&p2o;fy)J(-9YQPMycph9z<4LUeaf4+{ht+C3-PL{Rny~<{NA57Dlx!<=!p& zXVw-MHpG*doCLwDI2o7~H#aiKqMzH=ZblbluoS{7!9GXyvx?%?c9Mq4ZW%3ZkjzgA zE{+tz#D7Jd1^;waoiR-r?8nF!j_ySII!9*&ni-(On2iNmAvg-aM@#r+8f*f=248%s z@n|bMjIvOff1Rj#eaZI4bOZ!Mo9m0o4u4d6urk;Rk0mHXo{h~y#aGe0zM~HqhZhA_02^(g5#U564 zohO=Cus1R2pyC}USfazNNp!O%55lBbKEAjXeMn>%3fi1vXXp8smb98W}_7BcO3tmkOoReFned1ekgX=q4d+1`*UJ$PNFMl{!u$Wx)j!_@VG9$ z2E)6h(nPyXauG1x6IHl)Q7)(s)aQt;0r)b)XDipCWUPZ{NZei0hpkMj4BiIOABx;l zuusdfX0|sY!{1}5lNJPn10K86Mgsx-Pl!$g@}6R8R4Hi7qrf#Eq|_dSM<(D4=3iPV zZ=g|^TyjMneEAgLk)Wr6EI3hA9{q#FexzS7nt8SIXQtKwGl`<}Sg?;pqphfwQMVIt zhb`Lcps9*x)s^1L1qX7;Es1`Sf}aw+GC>bj^9gA?&CnP_*Jjxq@*H-~j0naP1y zLZLz7i+23D4ki`iUk^p&a^YAO%u9#ctOns0W47#;h0>| z8$@GD!P;YSh%aq&orJd0Gs@K;4Q4pRDP%P^oTSVT4!91ZC`13Oq}wy_LPnP%_dLRy zmB9XlzOI~IjP3*GYl+X!nJEy=%dzWxepMN7!o0pT{Y9fPjJ%UEd^(PACVoFvcXQOx zzNWOm@*SscX{MohrkJab_s6EU&Dt;|8o~Woo+p!w;$R#Ie=u@?3Y_hF^;zD8(dpV! z5Z)KVg$ew(4&D1FZ_UzcQo4Q0G&s1AgvyfNMz9Luzt6)fD+Th*pVGXZQCpclnTjp| z@^KFwplB0jEwag*sb~<3&v&C0K>m}LD={V-?)1gt(3CZ>ftL3qAy1T8w;(mrb5-Ni zs8pt{%kv)i+lA|@*!(h4vVu`YbT_gY)aO^pMKm78=Q4gNsf~B4WEPK4Rg3Ripij$@WZY%s&kE}a%eq_RZqT{`dF6;K zV4?w(Zp_3_z+{y#hoto!q`Of4q8rq?$*Y9?PoTMVWDJQ{LP1%yM(HEvLZ!kqPj+j- zeZ4#e6B!$$tpgT07n5xk{|t(mw*NJW9*))Q+OSP3`~;fSJ{*`cvnl;P@ScVa2l#Vd35MM3Huhs$7;xrynFBjU;5nI%fWJ0O5fXe?B!L1R!-F8|yWQv7mauLOWRc&Tf zCp~Rx6g&<1wYK*l4^|kJYmmc)?xqnf%3~;hx}o?=EdcP#jcm3$-AavF7!a!nE3 z>g)SS(yszMWPv6OT&(E|8-I;4vdO#9bcm2N?1wmeuA6-{wB{pLf#EYDX?q6mX7k@6 z->FRRI=$*RyglXIlFf{2!vCpa-)Go5FLl`Qnnjt5fHeu~W>{VA>N1NC;$meKuL>1! z5SweG3!(Bjs@8NWD*T@*&aO#jSEviB(18|kW*ORUgTIPmeMZ$lu*H~Vq3-!F9h@h9 zV^wrZ<#u$DqHWIv|5hOGT4#CYc`qIZ)yobX3g|zajD^Y$g4a|sSLhQmo~glqPl^G? z?{0?=5;2;^+p=*vL+9&~(ow%aZLbw;9q@~ioAdgidbl#nU(Zr#IS-lC#zv{YwtHy$ z#W8C!uuo}wWy!m^j^3uoteBPi?yCVmKzJ)JRYS7(=hI7Us}It1iu%#|qLV4EDv#bz ziv>D)pcI{#)00ks)+#AOcxYr!xZ)%TH`8R74_~G9Y~@T5?tRAjUzPp{nRO+cKVdz~ z+)ltfl#pj*))_m7x*s?8Zs6qqkerIlW{Nqs7ZThL^UnazL(|Oim&;^d7TlF0M3O%p zHYN?ON+sLM!*6A{x2SE5%9!q7rJg%8>FvsUaC}B0uL=mNBUfhd3_!nvq#ZUxV6hQR z{-Q~X*bL&R5Tje`qECZleM70C6ud0eBwud{&3-D93b^04wq)^iEyq-7YSTvCyMUkx z823i#c%x*P7aX^g7bQQJCpk+^bU>Q`y(;Z1U3;BZQS2WcZOasVE4Npc#)|l&e3A{pUqb#_7LRd?14Vvw5>h`}aZ>z6$Si_-*kFRf zUmIYe@DdUn&cv5XeQzDui92ULkkO!=dAx{40S5u=!$iwUac8C4P57p2IJyFjOY1zpkI7e@eof1w>^!a8BKPK7C0=ibRXQ9(zQeUgoj3nJvmYq`Wvmu^w48--S z!m9t5)h~jDW<31K3-3)8yVwP41-;~%Ge4=O=0F%YI@`3EhNr0=3fjZWy7T;wlyvmz&v4gX~a^rf8>mn zPH*hCsZS=?hqq|4Iv2)Cd_FFYR{p6t87Cxl;udNDF`QJMp{`Dejtq=+-8Zvd`?S@% zf<0@yzeMRGF?WUe`qO@kQj}@{pOnN~SPvrR<4kZ#TFgLl5(Weh<_zD6X^OCyMz`OQq3{_(y`P3S_1v z%@DmqTe}l7KlCS-!aXQ?FVUX@(~Rh+xoLDpl0OsOQ^wv*SqrfDXTd!w*$|Dp1W8Al z+}gx%1;v%2nn8tU#nYgCBm(!GG-u^7&$Ew?6IKc)FtIGHRM!o!000ehNklmll=>eJi5tD&-^xKgi$^WK9*$&B!`snVx|j7vZ)EY6!`E z6nRncoVw`YdZjVw<&ZHV*;gNYq6%Ym{2w6a+40fF@u+IEkXe_x=1MAljmdB2sXdO> zJH!)e*+lKFw!E#bb$Ln^bkc#sw`?=I3@x?zAHKaNgkR-Rj}vs0awau###WK;9(FwM zN$#vCmWTPT3ND2*9qaxC?P0{z$cl7*0#??OwdgHqW^BTNUrqLx8tER{Jb<306AMsMVBc&NWu zc#dWV0(Xezwg>!o%?rMq3zCnx?ug~!7$%CWsKfP#;|D+lahSv6k0!{4aHWVkW}?Yi z{eKyru~W#^ODS3dxNEE%A?k|25^feC1z~a_7H@fRH)vKGvP&k8Fz;x5)Z_C#bKICt z7)nAXTh>OWJRqrYmgO<~Z)jIYE69?qUHWW}F074LI>Dt?N!ljs zxok)ALEo%sW__m8Td{jUkUI?iPk{}Br@xNC$_7)-^>GA#vdK3XzsUS!R@700Tao>q z*6Xz{FTwxw$$Or9D@A_^_1k5p9nxPx{JA7YLVfy#IL|5GP)R4!>eQV;Mh<}r#n-XhlBleU{mN0ua zvDzZiKTp=VQ58|+s^NQi^%YRBaea0p`9dV872=0nvZzSb6}%0xnS|M}a@9zIZ8o?- zgI*?@<^*9^$EI z%c}ue19+R`suAEZ^KL6AJrns8)E5-x9TH!R@iWBgtiX{Vt}De2mGRHO3|8NIs%+gOC1=lCvYQr=XWO@s0#`L-DIvtRno=a`{*mwv4KZFg-<^wKD1g z<^LSriH3Jc_;{c;dS*>*dSvuZ7HVtjSt&XyrQRXY>m=Gi(Ap4vrlM0>-Oqr@NHnw6 z@&FIP^d{e0g-L7XE=s^}u^F#rw+O$U2VbRFmb#^c{>q)Ljme7&)L{N}iGE&UyCm)C z@i+74Z5>{Ol6N_ID})`R%Q=m(I?gJoJ1NQ=zEK%@b3>IkFHm%=+=G+91 zF!U-P-G*@n@l!eHO5}}ZRy8m;7xb@ znP@>)KbGj3zP`xPccg)3*wBL@cY4pJRNT0T(nxOBwsx z;7?NM0rv$6`jpMK3%05lRd8^V<|`BDtdzYGq}SG4H*uCZO>a=itJpl=*t}AqwmPXl zY`)ovZcFsj3cXp3#sYnyjDD4{^L*6K2LHNhh15NO>;rTmqbh-XAXc~L^nFe654uaeB8%GsgN67+TlY~rR(cLE5s^I;B8c=6CU~n2BoWRwZ%`s{PPzR(KDorsW zO9B1Y<5#9ge^*XT2iJ(WhZ1A70eQTr4t0yUsBniWdt_|Qt1S#WnZG0muYk$JCc3p0 zuPfx2u>!WkyQ$tJ=+%@v(3vCX20*uCG(+Lx8iR84MkPHXZI7_+x2?>*mis3$bs>DD z9_>G^HwaN{WH%#!5y>M#GVv&Aht(^@>^1C90L~88${0^Af}#MA>adL!4!}tbR1hghT#Jy z$#Y$C2KhXr#*{}}k(vihf5W>4?$r9!Svj-txO_ed?h51}30m0JAb{UgfNS}k?_YV! zCt=dr#)lan4atqMI42xeby+irkUmYaM$gjs64T?I!txBwMKoA!se|1a1A~ zk~L{nV5Sele#v^WhAhU;&&c_|oO5kR=0vh@qV99$A1Qfm+E1qolTk3m1djrB$oD6g z>J!tjg8O}S{FLV}wUS3Y5qCN%Rv6tH!lBeYgP`X* z7{$bVpaX+Yg1^e68Hjw7AxjOnq~;|s=d`&p5dI0&qXe$W$S;7=P);e+_j<{>7VO2? zqS$#qmu}S%4Xa7UfpER?x5vpfNzzS{kq$oPkmo!)71REw)W>o0CO2v0M|alip8o$A z1UDg31pxqn=YQtCb^pi^iVj^2`=L6NK?!!y>JpiGDGEaa6J0UrqDhw|NGL&;ia_X~ z7b6Ujpi7XY)}g5A(jm$)B3n1!-@Z5VW~T2WO^hxT#7O{`tDsxyjyn6v*tw7twbR^? z@6FKT74*6)4~6PSoC=OsT-+F{zbaBrvR~*{#~ek_#bP?;J5gO@hLm0X6X|ZNTA`Wp z)T*bc30t^-pVba%?FcXzfX`kso`$O|c$8PWx10JxypQP;qkSBGO~G)0xB6;Q#N}K% zs12`@CkbCj;IuUTSsWDcrPO(rrvsccxo`}Sv!Q;tuKFW8g6sq(=PZ9OTtKNrbpDT6 z+@u|8t(1$3Aie>uhxtoPrQ|-r6HGV-at)DXkMF37r@;9@a%GgCHO0;_*BO9gHW5hP zs~Nk=x)R`=(|ha~QGFgm266LFjB$GOr|moH|E>Y=

1{*hFx?1BZSU{JszRLF@eS}0Qrmh`bP91 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�@ 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