This commit is contained in:
lucasdpt
2026-06-14 02:07:47 +02:00
parent 398e1e6ddf
commit 0129d81bd4
2475 changed files with 553889 additions and 553884 deletions
File diff suppressed because one or more lines are too long
@@ -1,498 +1,498 @@
### Last updated: February 10, 2026, 11:05 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# Copper Bulb - Weathered And Oxidized - Lit
block.10856 = weathered_copper_bulb:lit=true waxed_weathered_copper_bulb:lit=true oxidized_copper_bulb:lit=true waxed_oxidized_copper_bulb:lit=true
# Copper Bulb - Weathered And Oxidized - Unlit
block.10858 = weathered_copper_bulb:lit=false waxed_weathered_copper_bulb:lit=false oxidized_copper_bulb:lit=false waxed_oxidized_copper_bulb:lit=false
# Copper Door Unpowered - Euphoria Patches Redstone IPBR
block.10861 = copper_door:powered=false exposed_copper_door:powered=false weathered_copper_door:powered=false oxidized_copper_door:powered=false waxed_copper_door:powered=false waxed_exposed_copper_door:powered=false waxed_weathered_copper_door:powered=false waxed_oxidized_copper_door:powered=false
# Copper Door Powered - Euphoria Patches Redstone IPBR
block.10863 = copper_door:powered=true exposed_copper_door:powered=true weathered_copper_door:powered=true oxidized_copper_door:powered=true waxed_copper_door:powered=true waxed_exposed_copper_door:powered=true waxed_weathered_copper_door:powered=true waxed_oxidized_copper_door:powered=true \
\
immersiveengineering:connector_bundled immersiveengineering:connector_probe immersiveengineering:connector_redstone immersiveengineering:conveyor_redstone immersiveengineering:redstone_breaker immersiveengineering:redstone_switchboard
# Copper Trapdoor Unpowered - Euphoria Patches Redstone IPBR
block.10865 = copper_trapdoor:powered=false exposed_copper_trapdoor:powered=false weathered_copper_trapdoor:powered=false oxidized_copper_trapdoor:powered=false waxed_copper_trapdoor:powered=false waxed_exposed_copper_trapdoor:powered=false waxed_weathered_copper_trapdoor:powered=false waxed_oxidized_copper_trapdoor:powered=false
# Copper Trapdoor Powered - Euphoria Patches Redstone IPBR
block.10867 = copper_trapdoor:powered=true exposed_copper_trapdoor:powered=true weathered_copper_trapdoor:powered=true oxidized_copper_trapdoor:powered=true waxed_copper_trapdoor:powered=true waxed_exposed_copper_trapdoor:powered=true waxed_weathered_copper_trapdoor:powered=true waxed_oxidized_copper_trapdoor:powered=true
# Trial Spawner Active
block.10868 = trial_spawner:ominous=false:trial_spawner_state=active trial_spawner:ominous=false:trial_spawner_state=ejecting_reward trial_spawner:ominous=false:trial_spawner_state=waiting_for_players trial_spawner:ominous=false:trial_spawner_state=waiting_for_reward_ejection vault:ominous=false:vault_state=active vault:ominous=false:vault_state=ejecting vault:ominous=false:vault_state=unlocking
# Trial Spawner Inactive
block.10872 = vault:ominous=false:vault_state=inactive vault:ominous=true:vault_state=inactive
# Trial Spawner Cooldown
block.10873 = trial_spawner:ominous=false:trial_spawner_state=cooldown trial_spawner:ominous=false:trial_spawner_state=inactive trial_spawner:ominous=true:trial_spawner_state=cooldown trial_spawner:ominous=true:trial_spawner_state=inactive
# Trial Spawner Ominous Active
block.10876 = trial_spawner:ominous=true:trial_spawner_state=active trial_spawner:ominous=true:trial_spawner_state=ejecting_reward trial_spawner:ominous=true:trial_spawner_state=waiting_for_players trial_spawner:ominous=true:trial_spawner_state=waiting_for_reward_ejection vault:ominous=true:vault_state=active vault:ominous=true:vault_state=ejecting vault:ominous=true:vault_state=unlocking
# Nether Vines with ACT Light
block.10884 = weeping_vines_plant
# Nether Vines without ACT Light
block.10885 = weeping_vines twisting_vines_plant twisting_vines \
\
betterend:bulb_vine:shape=middle betterend:bulb_vine:shape=top betterend:charnia_cyan betterend:charnia_green betterend:charnia_light_blue betterend:charnia_orange betterend:charnia_purple betterend:charnia_red betterend:dense_vine:shape=middle betterend:dense_vine:shape=top betterend:end_lily:shape=bottom betterend:end_lily:shape=middle betterend:filalux:shape=middle betterend:filalux:shape=top betterend:jungle_vine betterend:lanceleaf betterend:magnula betterend:murkweed betterend:rubinea betterend:twisted_vine \
\
betternether:anchor_tree_vine:shape=middle betternether:anchor_tree_vine:shape=top betternether:black_vine betternether:blooming_vine betternether:eye_vine betternether:nether_reed_stem betternether:whispering_gourd_vine betternether:willow_branch:shape=middle \
\
chipped:nether_vine \
\
natura:nether_thorn_vines
# Hay Bale
block.10888 = hay_block \
\
additionalplacements:blockus.thatch_slab additionalplacements:blockus.thatch_stairs \
\
allthecompressed:hay_block_1x allthecompressed:hay_block_2x allthecompressed:hay_block_3x allthecompressed:hay_block_4x allthecompressed:hay_block_5x allthecompressed:hay_block_6x allthecompressed:hay_block_7x allthecompressed:hay_block_8x allthecompressed:hay_block_9x \
\
blockus:thatch blockus:thatch_slab blockus:thatch_stairs \
\
chipped:antique_hay_block chipped:bundled_hay_block chipped:detailed_hay_block chipped:fertile_hay_block chipped:jungle_hay_block chipped:pale_hay_block chipped:rich_hay_block chipped:swampy_hay_block \
\
farm_and_charm:barley_ball farm_and_charm:oat_ball \
\
farmersdelight:rice_bale farmersdelight:straw_bale farmersdelight:tatami \
\
hearth_and_home:thatch \
\
iceandfire:nest \
\
quark:thatch quark:thatch_slab_double \
\
supplementaries:flax_block \
\
twigs:bamboo_thatch twigs:bamboo_thatch_slab
# Hay Non-Full Blocks (Modded Only)
block.10889 = farmersdelight:full_tatami_mat farmersdelight:half_tatami_mat farmersdelight:canvas_rug \
\
additionalplacements:extshape_blockus.thatch_pressure_plate \
\
brewinandchewin:coaster \
\
chococraftplus:strawblock \
\
diagonalfences:extshape_blockus/thatch_fence \
\
diagonalwalls:extshape_blockus/thatch_wall \
\
extshape_blockus:thatch_button extshape_blockus:thatch_fence extshape_blockus:thatch_fence_gate extshape_blockus:thatch_pressure_plate extshape_blockus:thatch_quarter_piece extshape_blockus:thatch_vertical_quarter_piece extshape_blockus:thatch_vertical_slab extshape_blockus:thatch_vertical_stairs extshape_blockus:thatch_wall \
\
hearth_and_home:thatch_slab hearth_and_home:thatch_stairs \
\
mcwroofs:thatch_attic_roof mcwroofs:thatch_lower_roof mcwroofs:thatch_roof mcwroofs:thatch_steep_roof mcwroofs:thatch_top_roof mcwroofs:thatch_upper_lower_roof mcwroofs:thatch_upper_steep_roof \
\
quark:thatch_slab quark:thatch_stairs
# Normal Iron Door - Euphoria Patches Redstone IPBR
block.10891 = iron_door:powered=false \
\
immersive_weathering:exposed_iron_door immersive_weathering:rusted_iron_door immersive_weathering:waxed_exposed_iron_door immersive_weathering:waxed_iron_door:powered=false immersive_weathering:waxed_rusted_iron_door immersive_weathering:waxed_weathered_iron_door immersive_weathering:weathered_iron_door \
\
justagreenhouse:greenhouse_door \
\
supplementaries:lead_door supplementaries:silver_door \
\
tfmg:heavy_casing_door tfmg:steel_door
# Powered Iron Door - Euphoria Patches Redstone IPBR
block.10893 = iron_door:powered=true \
\
immersive_weathering:waxed_iron_door:powered=true
# Unpowered Iron Trapdoor - Euphoria Patches Redstone IPBR
block.10897 = iron_trapdoor:powered=false \
\
immersive_weathering:exposed_iron_trapdoor immersive_weathering:rusted_iron_trapdoor immersive_weathering:waxed_exposed_iron_trapdoor immersive_weathering:waxed_iron_trapdoor:powered=false immersive_weathering:waxed_rusted_iron_trapdoor immersive_weathering:waxed_weathered_iron_trapdoor immersive_weathering:weathered_iron_trapdoor \
\
supplementaries:lead_trapdoor supplementaries:silver_trapdoor
# Powered Iron Trapdoor - Euphoria Patches Redstone IPBR
block.10899 = iron_trapdoor:powered=true \
\
immersive_weathering:waxed_iron_trapdoor:powered=true
##### CANDLES #####
# Normal Candles
block.10900 = candle:lit=true candle_cake:lit=true light_gray_candle:lit=true light_gray_candle_cake:lit=true gray_candle:lit=true gray_candle_cake:lit=true black_candle:lit=true black_candle_cake:lit=true white_candle:lit=true white_candle_cake:lit=true brown_candle:lit=true brown_candle_cake:lit=true \
\
amendments:skull_candle amendments:skull_candle_wall \
\
beautify:lamp_candelabra:on=true beautify:lamp_candelabra_black:on=true beautify:lamp_candelabra_brown:on=true beautify:lamp_candelabra_gray:on=true beautify:lamp_candelabra_light_gray:on=true beautify:lamp_candelabra_white:on=true \
\
burnt:smoldering_books_start \
\
dyenamics:amber_candle:lit=true dyenamics:aquamarine_candle:lit=true dyenamics:bubblegum_candle:lit=true dyenamics:cherenkov_candle:lit=true dyenamics:conifer_candle:lit=true dyenamics:fluorescent_candle:lit=true dyenamics:honey_candle:lit=true dyenamics:icy_blue_candle:lit=true dyenamics:lavender_candle:lit=true dyenamics:maroon_candle:lit=true dyenamics:mint_candle:lit=true dyenamics:navy_candle:lit=true dyenamics:peach_candle:lit=true dyenamics:persimmon_candle:lit=true dyenamics:rose_candle:lit=true dyenamics:spring_green_candle:lit=true dyenamics:ultramarine_candle:lit=true dyenamics:wine_candle:lit=true \
\
eidolon:candle:lit=true eidolon:candlestick:lit=true eidolon:magic_candle:lit=true eidolon:magic_candlestick:lit=true \
\
luminous_nether:candle_stand_top luminous_nether:lit_skull_candle luminous_nether:lit_wither_skull_candle luminous_nether:nether_candle_stand_top luminous_nether:nether_wall_candle_on luminous_nether:wall_candle \
\
mcwlights:copper_candle_holder:lit=true mcwlights:copper_chandelier:lit=true mcwlights:copper_double_candle_holder:lit=true mcwlights:copper_low_candle_holder:lit=true mcwlights:copper_small_chandelier:lit=true mcwlights:copper_triple_candle_holder:lit=true mcwlights:copper_wall_candle_holder:lit=true mcwlights:golden_candle_holder:lit=true mcwlights:golden_chandelier:lit=true mcwlights:golden_double_candle_holder:lit=true mcwlights:golden_low_candle_holder:lit=true mcwlights:golden_small_chandelier:lit=true mcwlights:golden_triple_candle_holder:lit=true mcwlights:golden_wall_candle_holder:lit=true mcwlights:iron_candle_holder:lit=true mcwlights:iron_chandelier:lit=true mcwlights:iron_double_candle_holder:lit=true mcwlights:iron_low_candle_holder:lit=true mcwlights:iron_small_chandelier:lit=true mcwlights:iron_triple_candle_holder:lit=true mcwlights:iron_wall_candle_holder:lit=true \
\
spelunkery:salt_lamp:lit=true \
\
supplementaries:candle_holder:lit=true supplementaries:candle_holder_black:lit=true supplementaries:candle_holder_brown:lit=true supplementaries:candle_holder_gray:lit=true supplementaries:candle_holder_light_gray:lit=true supplementaries:candle_holder_white:lit=true supplementaries:statue:lit=true \
\
suppsquared:gold_candle_holder:lit=true suppsquared:gold_candle_holder_black:lit=true suppsquared:gold_candle_holder_brown:lit=true suppsquared:gold_candle_holder_gray:lit=true suppsquared:gold_candle_holder_light_gray:lit=true suppsquared:gold_candle_holder_white:lit=true \
\
tfc:candle/black:lit=true tfc:candle/brown:lit=true tfc:candle/gray:lit=true tfc:candle/light_gray:lit=true tfc:candle/white:lit=true tfc:candle:lit=true tfc:candle_cake/black:lit=true tfc:candle_cake/brown:lit=true tfc:candle_cake/gray:lit=true tfc:candle_cake/light_gray:lit=true tfc:candle_cake/white:lit=true tfc:candle_cake:lit=true \
\
the_bumblezone:super_candle:lit=true the_bumblezone:super_candle_black:lit=true the_bumblezone:super_candle_brown:lit=true the_bumblezone:super_candle_gray:lit=true the_bumblezone:super_candle_light_gray:lit=true the_bumblezone:super_candle_white:lit=true \
\
twilightforest:candelabra:lighting=dim twilightforest:candelabra:lighting=normal
# Red Candles
block.10902 = red_candle:lit=true red_candle_cake:lit=true \
\
beautify:lamp_candelabra_red:on=true \
\
luminous_nether:ritual_table \
\
supplementaries:candle_holder_red:lit=true \
\
suppsquared:gold_candle_holder_red:lit=true \
\
tfc:candle/red:lit=true tfc:candle_cake/red:lit=true \
\
the_bumblezone:super_candle_red:lit=true
# Orange Candles
block.10904 = orange_candle:lit=true orange_candle_cake:lit=true \
\
beautify:lamp_candelabra_orange:on=true \
\
oceans_enhancements:orananem oceans_enhancements:orsm oceans_enhancements:orwide \
\
supplementaries:candle_holder_orange:lit=true \
\
suppsquared:gold_candle_holder_orange:lit=true \
\
tfc:candle/orange:lit=true tfc:candle_cake/orange:lit=true \
\
the_bumblezone:super_candle_orange:lit=true
# Yellow Candles
block.10906 = yellow_candle:lit=true yellow_candle_cake:lit=true \
\
beautify:lamp_candelabra_yellow:on=true \
\
supplementaries:candle_holder_yellow:lit=true \
\
suppsquared:gold_candle_holder_yellow:lit=true \
\
tfc:candle/yellow:lit=true tfc:candle_cake/yellow:lit=true \
\
the_bumblezone:super_candle_yellow:lit=true
# Lime Candles
block.10908 = lime_candle:lit=true lime_candle_cake:lit=true \
\
beautify:lamp_candelabra_lime:on=true \
\
supplementaries:candle_holder_lime:lit=true \
\
suppsquared:gold_candle_holder_lime:lit=true \
\
tfc:candle/lime:lit=true tfc:candle_cake/lime:lit=true \
\
the_bumblezone:super_candle_lime:lit=true
# Green Candles
block.10910 = green_candle:lit=true green_candle_cake:lit=true \
\
beautify:lamp_candelabra_green:on=true \
\
supplementaries:candle_holder_green:lit=true \
\
suppsquared:gold_candle_holder_green:lit=true \
\
tfc:candle/green:lit=true tfc:candle_cake/green:lit=true \
\
the_bumblezone:super_candle_green:lit=true
# Cyan Candles
block.10912 = cyan_candle:lit=true cyan_candle_cake:lit=true \
\
beautify:lamp_candelabra_cyan:on=true \
\
supplementaries:candle_holder_cyan:lit=true \
\
suppsquared:gold_candle_holder_cyan:lit=true \
\
tfc:candle/cyan:lit=true tfc:candle_cake/cyan:lit=true \
\
the_bumblezone:super_candle_cyan:lit=true
# Light Blue Candles
block.10914 = light_blue_candle:lit=true light_blue_candle_cake:lit=true \
\
beautify:lamp_candelabra_light_blue:on=true \
\
oceans_enhancements:banem oceans_enhancements:bsm oceans_enhancements:bwide \
\
supplementaries:candle_holder_light_blue:lit=true \
\
suppsquared:gold_candle_holder_light_blue:lit=true \
\
tfc:candle/light_blue:lit=true tfc:candle_cake/light_blue:lit=true \
\
the_bumblezone:super_candle_light_blue:lit=true
# Blue Candles
block.10916 = blue_candle:lit=true blue_candle_cake:lit=true \
\
beautify:lamp_candelabra_blue:on=true \
\
supplementaries:candle_holder_blue:lit=true \
\
suppsquared:gold_candle_holder_blue:lit=true \
\
tfc:candle/blue:lit=true tfc:candle_cake/blue:lit=true \
\
the_bumblezone:super_candle_blue:lit=true
# Purple Candles
block.10918 = purple_candle:lit=true purple_candle_cake:lit=true \
\
beautify:lamp_candelabra_purple:on=true \
\
supplementaries:candle_holder_purple:lit=true \
\
suppsquared:gold_candle_holder_purple:lit=true \
\
tfc:candle/purple:lit=true tfc:candle_cake/purple:lit=true \
\
the_bumblezone:super_candle_purple:lit=true \
\
twilightforest:candelabra:lighting=ominous
# Magenta Candles
block.10920 = magenta_candle:lit=true magenta_candle_cake:lit=true \
\
beautify:lamp_candelabra_magenta:on=true \
\
supplementaries:candle_holder_magenta:lit=true \
\
suppsquared:gold_candle_holder_magenta:lit=true \
\
tfc:candle/magenta:lit=true tfc:candle_cake/magenta:lit=true \
\
the_bumblezone:super_candle_magenta:lit=true
# Pink Candles
block.10922 = pink_candle:lit=true pink_candle_cake:lit=true \
\
beautify:lamp_candelabra_pink:on=true \
\
oceans_enhancements:anemone oceans_enhancements:anemone_small oceans_enhancements:wide_sea_anemone \
\
supplementaries:candle_holder_pink:lit=true \
\
suppsquared:gold_candle_holder_pink:lit=true \
\
tfc:candle/pink:lit=true tfc:candle_cake/pink:lit=true \
\
the_bumblezone:super_candle_pink:lit=true
# Pale Hanging Moss - Euphoria Patches Interactive Foliage
block.10923 = pale_hanging_moss \
\
betterend:filalux_wings:facing=down betterend:filalux_wings:facing=east betterend:filalux_wings:facing=north betterend:filalux_wings:facing=south betterend:filalux_wings:facing=west \
\
vanillabackport:pale_hanging_moss
# Moss Block
block.10924 = moss_block pale_moss_block \
tags_moss_block \
\
allthecompressed:moss_block_1x allthecompressed:moss_block_2x allthecompressed:moss_block_3x allthecompressed:moss_block_4x allthecompressed:moss_block_5x allthecompressed:moss_block_6x allthecompressed:moss_block_7x allthecompressed:moss_block_8x allthecompressed:moss_block_9x \
\
chipped:blobby_moss_block chipped:blue_moss_block chipped:crunchy_moss_block chipped:lime_moss_block chipped:old_moss_block chipped:red_moss_block chipped:smooth_moss_block chipped:spongy_moss_block chipped:sprinkled_moss_block chipped:yellow_moss_block \
\
dynamictrees:rooty_moss dynamictrees:rooty_moss_block \
\
exdeorum:compressed_moss_block \
\
oritech:biomass_block \
\
seafarer:algae_block \
\
securitycraft:reinforced_moss_block \
\
terrainslabs:moss_slab
# Moss Carpet
block.10925 = moss_carpet
# Pale Moss Carpet
block.10927 = pale_moss_carpet
# Pale Oak Wood Full Blocks
block.10928 = pale_oak_planks stripped_pale_oak_log stripped_pale_oak_wood \
tags_everycomp_ch_tfc_pine_planks tags_everycomp_ch_tfc_white_cedar_planks \
\
aether:altar aether:freezer aether:incubator aether:skyroot_bookshelf aether:skyroot_planks aether:stripped_skyroot_log aether:stripped_skyroot_wood \
\
biomeswevegone:ironwood_bookshelf biomeswevegone:ironwood_crafting_table biomeswevegone:ironwood_planks biomeswevegone:maple_bookshelf biomeswevegone:maple_crafting_table biomeswevegone:maple_planks biomeswevegone:palm_bookshelf biomeswevegone:palm_crafting_table biomeswevegone:palm_planks biomeswevegone:pine_bookshelf biomeswevegone:pine_crafting_table biomeswevegone:pine_planks biomeswevegone:rainbow_eucalyptus_bookshelf biomeswevegone:rainbow_eucalyptus_crafting_table biomeswevegone:rainbow_eucalyptus_planks biomeswevegone:skyris_bookshelf biomeswevegone:skyris_crafting_table biomeswevegone:skyris_planks biomeswevegone:spirit_bookshelf biomeswevegone:spirit_crafting_table biomeswevegone:spirit_planks biomeswevegone:stripped_ironwood_log biomeswevegone:stripped_ironwood_wood biomeswevegone:stripped_maple_log biomeswevegone:stripped_maple_wood biomeswevegone:stripped_palm_log biomeswevegone:stripped_palm_wood biomeswevegone:stripped_palo_verde_log biomeswevegone:stripped_palo_verde_wood biomeswevegone:stripped_pine_log biomeswevegone:stripped_pine_wood biomeswevegone:stripped_rainbow_eucalyptus_log biomeswevegone:stripped_rainbow_eucalyptus_wood biomeswevegone:stripped_skyris_log biomeswevegone:stripped_skyris_wood biomeswevegone:stripped_spirit_log biomeswevegone:stripped_spirit_wood biomeswevegone:stripped_white_mangrove_log biomeswevegone:stripped_white_mangrove_wood biomeswevegone:white_mangrove_bookshelf biomeswevegone:white_mangrove_crafting_table biomeswevegone:white_mangrove_planks \
\
blockus:herringbone_white_oak_planks blockus:membrane_block blockus:mossy_dripstone_bricks blockus:mossy_white_oak_planks blockus:obsidian_bricks blockus:polished_blackstone_pillar blockus:stripped_white_oak_log blockus:stripped_white_oak_wood blockus:white_oak_cross_timber_frame blockus:white_oak_diagonal_timber_frame blockus:white_oak_mosaic blockus:white_oak_planks blockus:white_oak_small_logs blockus:white_oak_timber_frame \
\
debark:debarked_log_natura_nether_logs:variant=0 debark:debarked_log_natura_overworld_logs2:variant=2 debark:debarked_log_pvj_log_aspen debark:debarked_log_pvj_log_baobab debark:debarked_log_pvj_log_cherry_blossom debark:debarked_log_pvj_log_cottonwood \
\
natura:nether_bookshelves:type=ghostwood natura:nether_planks:type=ghostwood natura:nether_workbenches:type=ghostwood natura:overworld_bookshelves:type=silverbell natura:overworld_planks:type=silverbell natura:overworld_workbenches:type=silverbell \
\
pvj:baobab_double_slab pvj:cottonwood_double_slab pvj:planks_baobab pvj:planks_cottonwood \
\
quark:stained_planks quark:stained_planks_black_slab_double quark:stained_planks_blue_slab_double quark:stained_planks_brown_slab_double quark:stained_planks_cyan_slab_double quark:stained_planks_gray_slab_double quark:stained_planks_green_slab_double quark:stained_planks_light_blue_slab_double quark:stained_planks_lime_slab_double quark:stained_planks_magenta_slab_double quark:stained_planks_orange_slab_double quark:stained_planks_pink_slab_double quark:stained_planks_purple_slab_double quark:stained_planks_red_slab_double quark:stained_planks_silver_slab_double quark:stained_planks_white_slab_double quark:stained_planks_yellow_slab_double quark:vertical_stained_planks \
\
storagedrawers:basicdrawers \
\
tfc:wood/bookshelf/pine tfc:wood/bookshelf/white_cedar tfc:wood/clutch/pine tfc:wood/clutch/white_cedar tfc:wood/encased_axle/pine tfc:wood/encased_axle/white_cedar tfc:wood/planks/pine tfc:wood/planks/white_cedar tfc:wood/stripped_log/pine tfc:wood/stripped_log/white_cedar tfc:wood/stripped_wood/pine tfc:wood/stripped_wood/white_cedar tfc:wood/workbench/pine tfc:wood/workbench/white_cedar \
\
twilightforest:stripped_transformation_log twilightforest:stripped_transformation_wood twilightforest:transformation_planks \
\
vanillabakport:pale_oak_planks vanillabakport:stripped_pale_oak_log vanillabakport:stripped_pale_oak_wood
# Pale Oak Wood Non-Full Blocks
block.10929 = pale_oak_fence pale_oak_fence_gate pale_oak_pressure_plate pale_oak_button pale_oak_trapdoor pale_oak_shelf \
\
additionalplacements:aether.skyroot_pressure_plate additionalplacements:blockus.white_oak_pressure_plate additionalplacements:extshape_blockus.stripped_white_oak_wood_pressure_plate additionalplacements:extshape_blockus.stripped_white_oak_wood_slab additionalplacements:extshape_blockus.stripped_white_oak_wood_stairs additionalplacements:twilightforest.transformation_pressure_plate additionalplacements:twilightforest.transformation_slab additionalplacements:twilightforest.transformation_stairs \
\
aether:skyroot_button aether:skyroot_door aether:skyroot_fence aether:skyroot_fence_gate aether:skyroot_pressure_plate aether:skyroot_trapdoor \
\
biomeswevegone:ironwood_button biomeswevegone:ironwood_door biomeswevegone:ironwood_fence biomeswevegone:ironwood_fence_gate biomeswevegone:ironwood_pressure_plate biomeswevegone:ironwood_slab biomeswevegone:ironwood_stairs biomeswevegone:ironwood_trapdoor biomeswevegone:maple_button biomeswevegone:maple_door biomeswevegone:maple_fence biomeswevegone:maple_fence_gate biomeswevegone:maple_pressure_plate biomeswevegone:maple_slab biomeswevegone:maple_stairs biomeswevegone:maple_trapdoor biomeswevegone:palm_button biomeswevegone:palm_door biomeswevegone:palm_fence biomeswevegone:palm_fence_gate biomeswevegone:palm_pressure_plate biomeswevegone:palm_slab biomeswevegone:palm_stairs biomeswevegone:palm_trapdoor biomeswevegone:pine_button biomeswevegone:pine_door biomeswevegone:pine_fence biomeswevegone:pine_fence_gate biomeswevegone:pine_pressure_plate biomeswevegone:pine_slab biomeswevegone:pine_stairs biomeswevegone:pine_trapdoor biomeswevegone:rainbow_eucalyptus_button biomeswevegone:rainbow_eucalyptus_door biomeswevegone:rainbow_eucalyptus_fence biomeswevegone:rainbow_eucalyptus_fence_gate biomeswevegone:rainbow_eucalyptus_pressure_plate biomeswevegone:rainbow_eucalyptus_slab biomeswevegone:rainbow_eucalyptus_stairs biomeswevegone:rainbow_eucalyptus_trapdoor biomeswevegone:skyris_button biomeswevegone:skyris_door biomeswevegone:skyris_fence biomeswevegone:skyris_fence_gate biomeswevegone:skyris_pressure_plate biomeswevegone:skyris_slab biomeswevegone:skyris_stairs biomeswevegone:skyris_trapdoor biomeswevegone:spirit_button biomeswevegone:spirit_door biomeswevegone:spirit_fence biomeswevegone:spirit_fence_gate biomeswevegone:spirit_pressure_plate biomeswevegone:spirit_roots biomeswevegone:spirit_slab biomeswevegone:spirit_stairs biomeswevegone:spirit_trapdoor biomeswevegone:white_mangrove_button biomeswevegone:white_mangrove_door biomeswevegone:white_mangrove_fence biomeswevegone:white_mangrove_fence_gate biomeswevegone:white_mangrove_pressure_plate biomeswevegone:white_mangrove_slab biomeswevegone:white_mangrove_stairs biomeswevegone:white_mangrove_trapdoor \
\
blockus:mossy_white_oak_slab blockus:mossy_white_oak_stairs blockus:stripped_white_oak_post blockus:white_oak_button blockus:white_oak_door blockus:white_oak_fence blockus:white_oak_fence_gate blockus:white_oak_grate blockus:white_oak_lattice blockus:white_oak_mosaic_slab blockus:white_oak_mosaic_stairs blockus:white_oak_post blockus:white_oak_pressure_plate blockus:white_oak_slab blockus:white_oak_stairs blockus:white_oak_trapdoor \
\
diagonalfences:aether/skyroot_fence diagonalfences:blockus/white_oak_fence diagonalfences:extshape_blockus/stripped_white_oak_wood_fence diagonalfences:minecraft/pale_oak_fence diagonalfences:twilightforest/transformation_fence \
\
diagonalwalls:extshape_blockus/herringbone_white_oak_wall diagonalwalls:extshape_blockus/mossy_white_oak_wall diagonalwalls:extshape_blockus/stripped_white_oak_wood_wall diagonalwalls:extshape_blockus/white_oak_mosaic_wall diagonalwalls:extshape_blockus/white_oak_wall \
\
diagonalwindows:blockus/white_oak_lattice \
\
extshape_blockus:herringbone_white_oak_quarter_piece extshape_blockus:herringbone_white_oak_slab extshape_blockus:herringbone_white_oak_stairs extshape_blockus:herringbone_white_oak_vertical_quarter_piece extshape_blockus:herringbone_white_oak_vertical_slab extshape_blockus:herringbone_white_oak_vertical_stairs extshape_blockus:herringbone_white_oak_wall extshape_blockus:mossy_white_oak_quarter_piece extshape_blockus:mossy_white_oak_vertical_quarter_piece extshape_blockus:mossy_white_oak_vertical_slab extshape_blockus:mossy_white_oak_vertical_stairs extshape_blockus:mossy_white_oak_wall extshape_blockus:stripped_white_oak_log_quarter_piece extshape_blockus:stripped_white_oak_log_slab extshape_blockus:stripped_white_oak_log_stairs extshape_blockus:stripped_white_oak_log_vertical_quarter_piece extshape_blockus:stripped_white_oak_log_vertical_slab extshape_blockus:stripped_white_oak_log_vertical_stairs extshape_blockus:stripped_white_oak_wood_button extshape_blockus:stripped_white_oak_wood_fence extshape_blockus:stripped_white_oak_wood_fence_gate extshape_blockus:stripped_white_oak_wood_pressure_plate extshape_blockus:stripped_white_oak_wood_quarter_piece extshape_blockus:stripped_white_oak_wood_slab extshape_blockus:stripped_white_oak_wood_stairs extshape_blockus:stripped_white_oak_wood_vertical_quarter_piece extshape_blockus:stripped_white_oak_wood_vertical_slab extshape_blockus:stripped_white_oak_wood_vertical_stairs extshape_blockus:stripped_white_oak_wood_wall extshape_blockus:white_oak_mosaic_quarter_piece extshape_blockus:white_oak_mosaic_vertical_quarter_piece extshape_blockus:white_oak_mosaic_vertical_slab extshape_blockus:white_oak_mosaic_vertical_stairs extshape_blockus:white_oak_mosaic_wall extshape_blockus:white_oak_quarter_piece extshape_blockus:white_oak_vertical_quarter_piece extshape_blockus:white_oak_vertical_slab extshape_blockus:white_oak_vertical_stairs extshape_blockus:white_oak_wall \
\
natura:ghostwood_button natura:ghostwood_fence natura:ghostwood_fence_gate natura:ghostwood_pressure_plate natura:ghostwood_trap_door natura:nether_door_ghostwood natura:nether_slab:type=ghostwood natura:nether_stairs_ghostwood natura:overworld_door_silverbell natura:overworld_slab:type=silverbell natura:overworld_stairs_silverbell natura:silverbell_button natura:silverbell_fence natura:silverbell_fence_gate natura:silverbell_pressure_plate natura:silverbell_trap_door \
\
pvj:baobab_button pvj:baobab_door pvj:baobab_fence pvj:baobab_fence_gate pvj:baobab_pressure_plate pvj:baobab_slab pvj:baobab_stairs pvj:baobab_trapdoor pvj:baobab_twigs pvj:cottonwood_button pvj:cottonwood_door pvj:cottonwood_fence pvj:cottonwood_fence_gate pvj:cottonwood_pressure_plate pvj:cottonwood_slab pvj:cottonwood_stairs pvj:cottonwood_trapdoor pvj:cottonwood_twigs \
\
quark:stained_planks_black_slab quark:stained_planks_black_stairs quark:stained_planks_blue_slab quark:stained_planks_blue_stairs quark:stained_planks_brown_slab quark:stained_planks_brown_stairs quark:stained_planks_cyan_slab quark:stained_planks_cyan_stairs quark:stained_planks_gray_slab quark:stained_planks_gray_stairs quark:stained_planks_green_slab quark:stained_planks_green_stairs quark:stained_planks_light_blue_slab quark:stained_planks_light_blue_stairs quark:stained_planks_lime_slab quark:stained_planks_lime_stairs quark:stained_planks_magenta_slab quark:stained_planks_magenta_stairs quark:stained_planks_orange_slab quark:stained_planks_orange_stairs quark:stained_planks_pink_slab quark:stained_planks_pink_stairs quark:stained_planks_purple_slab quark:stained_planks_purple_stairs quark:stained_planks_red_slab quark:stained_planks_red_stairs quark:stained_planks_silver_slab quark:stained_planks_silver_stairs quark:stained_planks_white_slab quark:stained_planks_white_stairs quark:stained_planks_yellow_slab quark:stained_planks_yellow_stairs \
\
suppsquared:aether/item_shelf_skyroot suppsquared:blockus/item_shelf_white_oak suppsquared:twilightforest/item_shelf_transformation \
\
tfc:wood/barrel/pine tfc:wood/barrel/white_cedar tfc:wood/button/pine tfc:wood/button/white_cedar tfc:wood/door/pine tfc:wood/door/white_cedar tfc:wood/fence/pine tfc:wood/fence/white_cedar tfc:wood/fence_gate/pine tfc:wood/fence_gate/white_cedar tfc:wood/gear_box/pine tfc:wood/gear_box/white_cedar tfc:wood/horizontal_support/pine tfc:wood/horizontal_support/white_cedar tfc:wood/lectern/pine tfc:wood/lectern/white_cedar tfc:wood/log_fence/pine tfc:wood/log_fence/white_cedar tfc:wood/loom/pine tfc:wood/loom/white_cedar tfc:wood/planks/pine_slab tfc:wood/planks/pine_stairs tfc:wood/planks/white_cedar_slab tfc:wood/planks/white_cedar_stairs tfc:wood/pressure_plate/pine tfc:wood/pressure_plate/white_cedar tfc:wood/scribing_table/pine tfc:wood/scribing_table/white_cedar tfc:wood/sewing_table/pine tfc:wood/sewing_table/white_cedar tfc:wood/shelf/pine tfc:wood/shelf/white_cedar tfc:wood/sluice/pine tfc:wood/sluice/white_cedar tfc:wood/tool_rack/pine tfc:wood/tool_rack/white_cedar tfc:wood/trapdoor/pine tfc:wood/trapdoor/white_cedar tfc:wood/vertical_support/pine tfc:wood/vertical_support/white_cedar \
\
twilightforest:transformation_banister twilightforest:transformation_button twilightforest:transformation_door twilightforest:transformation_fence twilightforest:transformation_fence_gate twilightforest:transformation_pressure_plate twilightforest:transformation_slab twilightforest:transformation_stairs twilightforest:transformation_trapdoor \
\
vanillabackport:pale_oak_button vanillabackport:pale_oak_fence vanillabackport:pale_oak_fence_gate vanillabackport:pale_oak_pressure_plate vanillabackport:pale_oak_slab vanillabackport:pale_oak_stairs vanillabackport:pale_oak_trapdoor \
\
wilderwild:stripped_hollowed_pale_oak_log
# Pale Oak Wood Slabs and Stairs
block.10931 = pale_oak_stairs pale_oak_slab \
\
additionalplacements:aether.skyroot_slab additionalplacements:aether.skyroot_stairs additionalplacements:blockus.mossy_white_oak_slab additionalplacements:blockus.mossy_white_oak_stairs additionalplacements:blockus.white_oak_mosaic_slab additionalplacements:blockus.white_oak_mosaic_stairs additionalplacements:blockus.white_oak_slab additionalplacements:blockus.white_oak_stairs additionalplacements:extshape_blockus.herringbone_white_oak_slab additionalplacements:extshape_blockus.herringbone_white_oak_stairs additionalplacements:extshape_blockus.stripped_white_oak_log_slab additionalplacements:extshape_blockus.stripped_white_oak_log_stairs \
\
aether:skyroot_slab aether:skyroot_stairs
# Pale Oak Log Full Blocks
block.10932 = pale_oak_log pale_oak_wood \
\
aether:skyroot_log aether:skyroot_wood \
\
biomeswevegone:rainbow_eucalyptus_log biomeswevegone:rainbow_eucalyptus_wood biomeswevegone:spirit_log biomeswevegone:spirit_wood biomeswevegone:white_mangrove_log biomeswevegone:white_mangrove_wood \
\
blockus:white_oak_log blockus:white_oak_wood \
\
natura:nether_logs:type=ghostwood natura:overworld_logs:type=silverbell \
\
pvj:log_juniper \
\
tfc:wood/log/maple tfc:wood/log/palm tfc:wood/log/pine tfc:wood/log/rosewood tfc:wood/log/white_cedar tfc:wood/log/willow tfc:wood/wood/maple tfc:wood/wood/palm tfc:wood/wood/pine tfc:wood/wood/rosewood tfc:wood/wood/white_cedar tfc:wood/wood/willow \
\
twilightforest:transformation_log twilightforest:transformation_log_core:active=false twilightforest:transformation_wood \
\
vanillabackport:pale_oak_log vanillabackport:pale_oak_wood
# Pale Oak Log Non-Full Blocks (Modded Only)
block.10933 = diagonalfences:extshape_blockus/white_oak_wood_fence \
tags_everycomp_tfc_maple tags_everycomp_tfc_palm tags_everycomp_tfc_pine tags_everycomp_tfc_rosewood tags_everycomp_tfc_willow \
\
additionalplacements:extshape_blockus.white_oak_log_slab additionalplacements:extshape_blockus.white_oak_log_stairs additionalplacements:extshape_blockus.white_oak_small_logs_slab additionalplacements:extshape_blockus.white_oak_small_logs_stairs additionalplacements:extshape_blockus.white_oak_wood_pressure_plate additionalplacements:extshape_blockus.white_oak_wood_slab additionalplacements:extshape_blockus.white_oak_wood_stairs \
\
diagonalwalls:extshape_blockus/white_oak_wood_wall \
\
extshape_blockus:white_oak_log_quarter_piece extshape_blockus:white_oak_log_slab extshape_blockus:white_oak_log_stairs extshape_blockus:white_oak_log_vertical_quarter_piece extshape_blockus:white_oak_log_vertical_slab extshape_blockus:white_oak_log_vertical_stairs extshape_blockus:white_oak_small_logs_quarter_piece extshape_blockus:white_oak_small_logs_slab extshape_blockus:white_oak_small_logs_stairs extshape_blockus:white_oak_small_logs_vertical_quarter_piece extshape_blockus:white_oak_small_logs_vertical_slab extshape_blockus:white_oak_small_logs_vertical_stairs extshape_blockus:white_oak_wood_button extshape_blockus:white_oak_wood_fence extshape_blockus:white_oak_wood_fence_gate extshape_blockus:white_oak_wood_pressure_plate extshape_blockus:white_oak_wood_quarter_piece extshape_blockus:white_oak_wood_slab extshape_blockus:white_oak_wood_stairs extshape_blockus:white_oak_wood_vertical_quarter_piece extshape_blockus:white_oak_wood_vertical_slab extshape_blockus:white_oak_wood_vertical_stairs extshape_blockus:white_oak_wood_wall \
\
tfc:plant/pine_krummholz tfc:plant/white_cedar_krummholz tfc:wood/twig/maple tfc:wood/twig/palm tfc:wood/twig/pine tfc:wood/twig/rosewood tfc:wood/twig/white_cedar tfc:wood/twig/willow \
\
twilightforest:hollow_transformation_log_climbable twilightforest:hollow_transformation_log_horizontal twilightforest:hollow_transformation_log_vertical \
\
wilderwild:hollowed_pale_oak_log
# Pale Oak Door
block.10937 = pale_oak_door \
\
vanillabackport:pale_oak_door
# Resin Full Blocks
block.10940 = resin_bricks chiseled_resin_bricks resin_block \
\
vanillabackport:chiseled_resin_bricks vanillabackport:resin_block vanillabackport:resin_bricks
# Resin Non-Full Blocks
block.10941 = resin_clump resin_brick_stairs resin_brick_slab resin_brick_wall \
\
diagonalwalls:minecraft/resin_brick_wall \
\
vanillabackport:resin_brick_slab vanillabackport:resin_brick_stairs vanillabackport:resin_brick_wall vanillabackport:resin_clump
#if MC_VERSION >= 12105
# Creaking Heart Inactive 1.21.5
block.10944 = creaking_heart:creaking_heart_state=uprooted
# Creaking Heart Active 1.21.5
block.10948 = creaking_heart:creaking_heart_state=dormant creaking_heart:creaking_heart_state=awake
#else
# Creaking Heart Inactive 1.21.4
block.10944 = creaking_heart:active=false \
\
vanillabackport:creaking_heart:creaking_heart_state=uprooted
# Creaking Heart Active 1.21.4
block.10948 = creaking_heart:active=true \
\
vanillabackport:creaking_heart:creaking_heart_state=awake vanillabackport:creaking_heart:creaking_heart_state=dormant
#endif
# All snow layers except layer 8
block.10953 = snow:layers=1 snow:layers=2 snow:layers=3 snow:layers=4 snow:layers=5 snow:layers=6 snow:layers=7 \
\
terrainslabs:snow_on_top \
\
tfc:snow_pile:layers=1 tfc:snow_pile:layers=2 tfc:snow_pile:layers=3 tfc:snow_pile:layers=4 tfc:snow_pile:layers=5 tfc:snow_pile:layers=6 tfc:snow_pile:layers=7
# Target 0 Power
block.10956 = target:power=0
# Target Powered
block.10960 = target:power=1 target:power=2 target:power=3 target:power=4 target:power=5 target:power=6 target:power=7 target:power=8 target:power=9 target:power=10 target:power=11 target:power=12 target:power=13 target:power=14 target:power=15
# Sponge
block.10964 = sponge \
\
blockus:legacy_sponge \
\
openblocks:sponge
### Last updated: February 10, 2026, 11:05 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# Copper Bulb - Weathered And Oxidized - Lit
block.10856 = weathered_copper_bulb:lit=true waxed_weathered_copper_bulb:lit=true oxidized_copper_bulb:lit=true waxed_oxidized_copper_bulb:lit=true
# Copper Bulb - Weathered And Oxidized - Unlit
block.10858 = weathered_copper_bulb:lit=false waxed_weathered_copper_bulb:lit=false oxidized_copper_bulb:lit=false waxed_oxidized_copper_bulb:lit=false
# Copper Door Unpowered - Euphoria Patches Redstone IPBR
block.10861 = copper_door:powered=false exposed_copper_door:powered=false weathered_copper_door:powered=false oxidized_copper_door:powered=false waxed_copper_door:powered=false waxed_exposed_copper_door:powered=false waxed_weathered_copper_door:powered=false waxed_oxidized_copper_door:powered=false
# Copper Door Powered - Euphoria Patches Redstone IPBR
block.10863 = copper_door:powered=true exposed_copper_door:powered=true weathered_copper_door:powered=true oxidized_copper_door:powered=true waxed_copper_door:powered=true waxed_exposed_copper_door:powered=true waxed_weathered_copper_door:powered=true waxed_oxidized_copper_door:powered=true \
\
immersiveengineering:connector_bundled immersiveengineering:connector_probe immersiveengineering:connector_redstone immersiveengineering:conveyor_redstone immersiveengineering:redstone_breaker immersiveengineering:redstone_switchboard
# Copper Trapdoor Unpowered - Euphoria Patches Redstone IPBR
block.10865 = copper_trapdoor:powered=false exposed_copper_trapdoor:powered=false weathered_copper_trapdoor:powered=false oxidized_copper_trapdoor:powered=false waxed_copper_trapdoor:powered=false waxed_exposed_copper_trapdoor:powered=false waxed_weathered_copper_trapdoor:powered=false waxed_oxidized_copper_trapdoor:powered=false
# Copper Trapdoor Powered - Euphoria Patches Redstone IPBR
block.10867 = copper_trapdoor:powered=true exposed_copper_trapdoor:powered=true weathered_copper_trapdoor:powered=true oxidized_copper_trapdoor:powered=true waxed_copper_trapdoor:powered=true waxed_exposed_copper_trapdoor:powered=true waxed_weathered_copper_trapdoor:powered=true waxed_oxidized_copper_trapdoor:powered=true
# Trial Spawner Active
block.10868 = trial_spawner:ominous=false:trial_spawner_state=active trial_spawner:ominous=false:trial_spawner_state=ejecting_reward trial_spawner:ominous=false:trial_spawner_state=waiting_for_players trial_spawner:ominous=false:trial_spawner_state=waiting_for_reward_ejection vault:ominous=false:vault_state=active vault:ominous=false:vault_state=ejecting vault:ominous=false:vault_state=unlocking
# Trial Spawner Inactive
block.10872 = vault:ominous=false:vault_state=inactive vault:ominous=true:vault_state=inactive
# Trial Spawner Cooldown
block.10873 = trial_spawner:ominous=false:trial_spawner_state=cooldown trial_spawner:ominous=false:trial_spawner_state=inactive trial_spawner:ominous=true:trial_spawner_state=cooldown trial_spawner:ominous=true:trial_spawner_state=inactive
# Trial Spawner Ominous Active
block.10876 = trial_spawner:ominous=true:trial_spawner_state=active trial_spawner:ominous=true:trial_spawner_state=ejecting_reward trial_spawner:ominous=true:trial_spawner_state=waiting_for_players trial_spawner:ominous=true:trial_spawner_state=waiting_for_reward_ejection vault:ominous=true:vault_state=active vault:ominous=true:vault_state=ejecting vault:ominous=true:vault_state=unlocking
# Nether Vines with ACT Light
block.10884 = weeping_vines_plant
# Nether Vines without ACT Light
block.10885 = weeping_vines twisting_vines_plant twisting_vines \
\
betterend:bulb_vine:shape=middle betterend:bulb_vine:shape=top betterend:charnia_cyan betterend:charnia_green betterend:charnia_light_blue betterend:charnia_orange betterend:charnia_purple betterend:charnia_red betterend:dense_vine:shape=middle betterend:dense_vine:shape=top betterend:end_lily:shape=bottom betterend:end_lily:shape=middle betterend:filalux:shape=middle betterend:filalux:shape=top betterend:jungle_vine betterend:lanceleaf betterend:magnula betterend:murkweed betterend:rubinea betterend:twisted_vine \
\
betternether:anchor_tree_vine:shape=middle betternether:anchor_tree_vine:shape=top betternether:black_vine betternether:blooming_vine betternether:eye_vine betternether:nether_reed_stem betternether:whispering_gourd_vine betternether:willow_branch:shape=middle \
\
chipped:nether_vine \
\
natura:nether_thorn_vines
# Hay Bale
block.10888 = hay_block \
\
additionalplacements:blockus.thatch_slab additionalplacements:blockus.thatch_stairs \
\
allthecompressed:hay_block_1x allthecompressed:hay_block_2x allthecompressed:hay_block_3x allthecompressed:hay_block_4x allthecompressed:hay_block_5x allthecompressed:hay_block_6x allthecompressed:hay_block_7x allthecompressed:hay_block_8x allthecompressed:hay_block_9x \
\
blockus:thatch blockus:thatch_slab blockus:thatch_stairs \
\
chipped:antique_hay_block chipped:bundled_hay_block chipped:detailed_hay_block chipped:fertile_hay_block chipped:jungle_hay_block chipped:pale_hay_block chipped:rich_hay_block chipped:swampy_hay_block \
\
farm_and_charm:barley_ball farm_and_charm:oat_ball \
\
farmersdelight:rice_bale farmersdelight:straw_bale farmersdelight:tatami \
\
hearth_and_home:thatch \
\
iceandfire:nest \
\
quark:thatch quark:thatch_slab_double \
\
supplementaries:flax_block \
\
twigs:bamboo_thatch twigs:bamboo_thatch_slab
# Hay Non-Full Blocks (Modded Only)
block.10889 = farmersdelight:full_tatami_mat farmersdelight:half_tatami_mat farmersdelight:canvas_rug \
\
additionalplacements:extshape_blockus.thatch_pressure_plate \
\
brewinandchewin:coaster \
\
chococraftplus:strawblock \
\
diagonalfences:extshape_blockus/thatch_fence \
\
diagonalwalls:extshape_blockus/thatch_wall \
\
extshape_blockus:thatch_button extshape_blockus:thatch_fence extshape_blockus:thatch_fence_gate extshape_blockus:thatch_pressure_plate extshape_blockus:thatch_quarter_piece extshape_blockus:thatch_vertical_quarter_piece extshape_blockus:thatch_vertical_slab extshape_blockus:thatch_vertical_stairs extshape_blockus:thatch_wall \
\
hearth_and_home:thatch_slab hearth_and_home:thatch_stairs \
\
mcwroofs:thatch_attic_roof mcwroofs:thatch_lower_roof mcwroofs:thatch_roof mcwroofs:thatch_steep_roof mcwroofs:thatch_top_roof mcwroofs:thatch_upper_lower_roof mcwroofs:thatch_upper_steep_roof \
\
quark:thatch_slab quark:thatch_stairs
# Normal Iron Door - Euphoria Patches Redstone IPBR
block.10891 = iron_door:powered=false \
\
immersive_weathering:exposed_iron_door immersive_weathering:rusted_iron_door immersive_weathering:waxed_exposed_iron_door immersive_weathering:waxed_iron_door:powered=false immersive_weathering:waxed_rusted_iron_door immersive_weathering:waxed_weathered_iron_door immersive_weathering:weathered_iron_door \
\
justagreenhouse:greenhouse_door \
\
supplementaries:lead_door supplementaries:silver_door \
\
tfmg:heavy_casing_door tfmg:steel_door
# Powered Iron Door - Euphoria Patches Redstone IPBR
block.10893 = iron_door:powered=true \
\
immersive_weathering:waxed_iron_door:powered=true
# Unpowered Iron Trapdoor - Euphoria Patches Redstone IPBR
block.10897 = iron_trapdoor:powered=false \
\
immersive_weathering:exposed_iron_trapdoor immersive_weathering:rusted_iron_trapdoor immersive_weathering:waxed_exposed_iron_trapdoor immersive_weathering:waxed_iron_trapdoor:powered=false immersive_weathering:waxed_rusted_iron_trapdoor immersive_weathering:waxed_weathered_iron_trapdoor immersive_weathering:weathered_iron_trapdoor \
\
supplementaries:lead_trapdoor supplementaries:silver_trapdoor
# Powered Iron Trapdoor - Euphoria Patches Redstone IPBR
block.10899 = iron_trapdoor:powered=true \
\
immersive_weathering:waxed_iron_trapdoor:powered=true
##### CANDLES #####
# Normal Candles
block.10900 = candle:lit=true candle_cake:lit=true light_gray_candle:lit=true light_gray_candle_cake:lit=true gray_candle:lit=true gray_candle_cake:lit=true black_candle:lit=true black_candle_cake:lit=true white_candle:lit=true white_candle_cake:lit=true brown_candle:lit=true brown_candle_cake:lit=true \
\
amendments:skull_candle amendments:skull_candle_wall \
\
beautify:lamp_candelabra:on=true beautify:lamp_candelabra_black:on=true beautify:lamp_candelabra_brown:on=true beautify:lamp_candelabra_gray:on=true beautify:lamp_candelabra_light_gray:on=true beautify:lamp_candelabra_white:on=true \
\
burnt:smoldering_books_start \
\
dyenamics:amber_candle:lit=true dyenamics:aquamarine_candle:lit=true dyenamics:bubblegum_candle:lit=true dyenamics:cherenkov_candle:lit=true dyenamics:conifer_candle:lit=true dyenamics:fluorescent_candle:lit=true dyenamics:honey_candle:lit=true dyenamics:icy_blue_candle:lit=true dyenamics:lavender_candle:lit=true dyenamics:maroon_candle:lit=true dyenamics:mint_candle:lit=true dyenamics:navy_candle:lit=true dyenamics:peach_candle:lit=true dyenamics:persimmon_candle:lit=true dyenamics:rose_candle:lit=true dyenamics:spring_green_candle:lit=true dyenamics:ultramarine_candle:lit=true dyenamics:wine_candle:lit=true \
\
eidolon:candle:lit=true eidolon:candlestick:lit=true eidolon:magic_candle:lit=true eidolon:magic_candlestick:lit=true \
\
luminous_nether:candle_stand_top luminous_nether:lit_skull_candle luminous_nether:lit_wither_skull_candle luminous_nether:nether_candle_stand_top luminous_nether:nether_wall_candle_on luminous_nether:wall_candle \
\
mcwlights:copper_candle_holder:lit=true mcwlights:copper_chandelier:lit=true mcwlights:copper_double_candle_holder:lit=true mcwlights:copper_low_candle_holder:lit=true mcwlights:copper_small_chandelier:lit=true mcwlights:copper_triple_candle_holder:lit=true mcwlights:copper_wall_candle_holder:lit=true mcwlights:golden_candle_holder:lit=true mcwlights:golden_chandelier:lit=true mcwlights:golden_double_candle_holder:lit=true mcwlights:golden_low_candle_holder:lit=true mcwlights:golden_small_chandelier:lit=true mcwlights:golden_triple_candle_holder:lit=true mcwlights:golden_wall_candle_holder:lit=true mcwlights:iron_candle_holder:lit=true mcwlights:iron_chandelier:lit=true mcwlights:iron_double_candle_holder:lit=true mcwlights:iron_low_candle_holder:lit=true mcwlights:iron_small_chandelier:lit=true mcwlights:iron_triple_candle_holder:lit=true mcwlights:iron_wall_candle_holder:lit=true \
\
spelunkery:salt_lamp:lit=true \
\
supplementaries:candle_holder:lit=true supplementaries:candle_holder_black:lit=true supplementaries:candle_holder_brown:lit=true supplementaries:candle_holder_gray:lit=true supplementaries:candle_holder_light_gray:lit=true supplementaries:candle_holder_white:lit=true supplementaries:statue:lit=true \
\
suppsquared:gold_candle_holder:lit=true suppsquared:gold_candle_holder_black:lit=true suppsquared:gold_candle_holder_brown:lit=true suppsquared:gold_candle_holder_gray:lit=true suppsquared:gold_candle_holder_light_gray:lit=true suppsquared:gold_candle_holder_white:lit=true \
\
tfc:candle/black:lit=true tfc:candle/brown:lit=true tfc:candle/gray:lit=true tfc:candle/light_gray:lit=true tfc:candle/white:lit=true tfc:candle:lit=true tfc:candle_cake/black:lit=true tfc:candle_cake/brown:lit=true tfc:candle_cake/gray:lit=true tfc:candle_cake/light_gray:lit=true tfc:candle_cake/white:lit=true tfc:candle_cake:lit=true \
\
the_bumblezone:super_candle:lit=true the_bumblezone:super_candle_black:lit=true the_bumblezone:super_candle_brown:lit=true the_bumblezone:super_candle_gray:lit=true the_bumblezone:super_candle_light_gray:lit=true the_bumblezone:super_candle_white:lit=true \
\
twilightforest:candelabra:lighting=dim twilightforest:candelabra:lighting=normal
# Red Candles
block.10902 = red_candle:lit=true red_candle_cake:lit=true \
\
beautify:lamp_candelabra_red:on=true \
\
luminous_nether:ritual_table \
\
supplementaries:candle_holder_red:lit=true \
\
suppsquared:gold_candle_holder_red:lit=true \
\
tfc:candle/red:lit=true tfc:candle_cake/red:lit=true \
\
the_bumblezone:super_candle_red:lit=true
# Orange Candles
block.10904 = orange_candle:lit=true orange_candle_cake:lit=true \
\
beautify:lamp_candelabra_orange:on=true \
\
oceans_enhancements:orananem oceans_enhancements:orsm oceans_enhancements:orwide \
\
supplementaries:candle_holder_orange:lit=true \
\
suppsquared:gold_candle_holder_orange:lit=true \
\
tfc:candle/orange:lit=true tfc:candle_cake/orange:lit=true \
\
the_bumblezone:super_candle_orange:lit=true
# Yellow Candles
block.10906 = yellow_candle:lit=true yellow_candle_cake:lit=true \
\
beautify:lamp_candelabra_yellow:on=true \
\
supplementaries:candle_holder_yellow:lit=true \
\
suppsquared:gold_candle_holder_yellow:lit=true \
\
tfc:candle/yellow:lit=true tfc:candle_cake/yellow:lit=true \
\
the_bumblezone:super_candle_yellow:lit=true
# Lime Candles
block.10908 = lime_candle:lit=true lime_candle_cake:lit=true \
\
beautify:lamp_candelabra_lime:on=true \
\
supplementaries:candle_holder_lime:lit=true \
\
suppsquared:gold_candle_holder_lime:lit=true \
\
tfc:candle/lime:lit=true tfc:candle_cake/lime:lit=true \
\
the_bumblezone:super_candle_lime:lit=true
# Green Candles
block.10910 = green_candle:lit=true green_candle_cake:lit=true \
\
beautify:lamp_candelabra_green:on=true \
\
supplementaries:candle_holder_green:lit=true \
\
suppsquared:gold_candle_holder_green:lit=true \
\
tfc:candle/green:lit=true tfc:candle_cake/green:lit=true \
\
the_bumblezone:super_candle_green:lit=true
# Cyan Candles
block.10912 = cyan_candle:lit=true cyan_candle_cake:lit=true \
\
beautify:lamp_candelabra_cyan:on=true \
\
supplementaries:candle_holder_cyan:lit=true \
\
suppsquared:gold_candle_holder_cyan:lit=true \
\
tfc:candle/cyan:lit=true tfc:candle_cake/cyan:lit=true \
\
the_bumblezone:super_candle_cyan:lit=true
# Light Blue Candles
block.10914 = light_blue_candle:lit=true light_blue_candle_cake:lit=true \
\
beautify:lamp_candelabra_light_blue:on=true \
\
oceans_enhancements:banem oceans_enhancements:bsm oceans_enhancements:bwide \
\
supplementaries:candle_holder_light_blue:lit=true \
\
suppsquared:gold_candle_holder_light_blue:lit=true \
\
tfc:candle/light_blue:lit=true tfc:candle_cake/light_blue:lit=true \
\
the_bumblezone:super_candle_light_blue:lit=true
# Blue Candles
block.10916 = blue_candle:lit=true blue_candle_cake:lit=true \
\
beautify:lamp_candelabra_blue:on=true \
\
supplementaries:candle_holder_blue:lit=true \
\
suppsquared:gold_candle_holder_blue:lit=true \
\
tfc:candle/blue:lit=true tfc:candle_cake/blue:lit=true \
\
the_bumblezone:super_candle_blue:lit=true
# Purple Candles
block.10918 = purple_candle:lit=true purple_candle_cake:lit=true \
\
beautify:lamp_candelabra_purple:on=true \
\
supplementaries:candle_holder_purple:lit=true \
\
suppsquared:gold_candle_holder_purple:lit=true \
\
tfc:candle/purple:lit=true tfc:candle_cake/purple:lit=true \
\
the_bumblezone:super_candle_purple:lit=true \
\
twilightforest:candelabra:lighting=ominous
# Magenta Candles
block.10920 = magenta_candle:lit=true magenta_candle_cake:lit=true \
\
beautify:lamp_candelabra_magenta:on=true \
\
supplementaries:candle_holder_magenta:lit=true \
\
suppsquared:gold_candle_holder_magenta:lit=true \
\
tfc:candle/magenta:lit=true tfc:candle_cake/magenta:lit=true \
\
the_bumblezone:super_candle_magenta:lit=true
# Pink Candles
block.10922 = pink_candle:lit=true pink_candle_cake:lit=true \
\
beautify:lamp_candelabra_pink:on=true \
\
oceans_enhancements:anemone oceans_enhancements:anemone_small oceans_enhancements:wide_sea_anemone \
\
supplementaries:candle_holder_pink:lit=true \
\
suppsquared:gold_candle_holder_pink:lit=true \
\
tfc:candle/pink:lit=true tfc:candle_cake/pink:lit=true \
\
the_bumblezone:super_candle_pink:lit=true
# Pale Hanging Moss - Euphoria Patches Interactive Foliage
block.10923 = pale_hanging_moss \
\
betterend:filalux_wings:facing=down betterend:filalux_wings:facing=east betterend:filalux_wings:facing=north betterend:filalux_wings:facing=south betterend:filalux_wings:facing=west \
\
vanillabackport:pale_hanging_moss
# Moss Block
block.10924 = moss_block pale_moss_block \
tags_moss_block \
\
allthecompressed:moss_block_1x allthecompressed:moss_block_2x allthecompressed:moss_block_3x allthecompressed:moss_block_4x allthecompressed:moss_block_5x allthecompressed:moss_block_6x allthecompressed:moss_block_7x allthecompressed:moss_block_8x allthecompressed:moss_block_9x \
\
chipped:blobby_moss_block chipped:blue_moss_block chipped:crunchy_moss_block chipped:lime_moss_block chipped:old_moss_block chipped:red_moss_block chipped:smooth_moss_block chipped:spongy_moss_block chipped:sprinkled_moss_block chipped:yellow_moss_block \
\
dynamictrees:rooty_moss dynamictrees:rooty_moss_block \
\
exdeorum:compressed_moss_block \
\
oritech:biomass_block \
\
seafarer:algae_block \
\
securitycraft:reinforced_moss_block \
\
terrainslabs:moss_slab
# Moss Carpet
block.10925 = moss_carpet
# Pale Moss Carpet
block.10927 = pale_moss_carpet
# Pale Oak Wood Full Blocks
block.10928 = pale_oak_planks stripped_pale_oak_log stripped_pale_oak_wood \
tags_everycomp_ch_tfc_pine_planks tags_everycomp_ch_tfc_white_cedar_planks \
\
aether:altar aether:freezer aether:incubator aether:skyroot_bookshelf aether:skyroot_planks aether:stripped_skyroot_log aether:stripped_skyroot_wood \
\
biomeswevegone:ironwood_bookshelf biomeswevegone:ironwood_crafting_table biomeswevegone:ironwood_planks biomeswevegone:maple_bookshelf biomeswevegone:maple_crafting_table biomeswevegone:maple_planks biomeswevegone:palm_bookshelf biomeswevegone:palm_crafting_table biomeswevegone:palm_planks biomeswevegone:pine_bookshelf biomeswevegone:pine_crafting_table biomeswevegone:pine_planks biomeswevegone:rainbow_eucalyptus_bookshelf biomeswevegone:rainbow_eucalyptus_crafting_table biomeswevegone:rainbow_eucalyptus_planks biomeswevegone:skyris_bookshelf biomeswevegone:skyris_crafting_table biomeswevegone:skyris_planks biomeswevegone:spirit_bookshelf biomeswevegone:spirit_crafting_table biomeswevegone:spirit_planks biomeswevegone:stripped_ironwood_log biomeswevegone:stripped_ironwood_wood biomeswevegone:stripped_maple_log biomeswevegone:stripped_maple_wood biomeswevegone:stripped_palm_log biomeswevegone:stripped_palm_wood biomeswevegone:stripped_palo_verde_log biomeswevegone:stripped_palo_verde_wood biomeswevegone:stripped_pine_log biomeswevegone:stripped_pine_wood biomeswevegone:stripped_rainbow_eucalyptus_log biomeswevegone:stripped_rainbow_eucalyptus_wood biomeswevegone:stripped_skyris_log biomeswevegone:stripped_skyris_wood biomeswevegone:stripped_spirit_log biomeswevegone:stripped_spirit_wood biomeswevegone:stripped_white_mangrove_log biomeswevegone:stripped_white_mangrove_wood biomeswevegone:white_mangrove_bookshelf biomeswevegone:white_mangrove_crafting_table biomeswevegone:white_mangrove_planks \
\
blockus:herringbone_white_oak_planks blockus:membrane_block blockus:mossy_dripstone_bricks blockus:mossy_white_oak_planks blockus:obsidian_bricks blockus:polished_blackstone_pillar blockus:stripped_white_oak_log blockus:stripped_white_oak_wood blockus:white_oak_cross_timber_frame blockus:white_oak_diagonal_timber_frame blockus:white_oak_mosaic blockus:white_oak_planks blockus:white_oak_small_logs blockus:white_oak_timber_frame \
\
debark:debarked_log_natura_nether_logs:variant=0 debark:debarked_log_natura_overworld_logs2:variant=2 debark:debarked_log_pvj_log_aspen debark:debarked_log_pvj_log_baobab debark:debarked_log_pvj_log_cherry_blossom debark:debarked_log_pvj_log_cottonwood \
\
natura:nether_bookshelves:type=ghostwood natura:nether_planks:type=ghostwood natura:nether_workbenches:type=ghostwood natura:overworld_bookshelves:type=silverbell natura:overworld_planks:type=silverbell natura:overworld_workbenches:type=silverbell \
\
pvj:baobab_double_slab pvj:cottonwood_double_slab pvj:planks_baobab pvj:planks_cottonwood \
\
quark:stained_planks quark:stained_planks_black_slab_double quark:stained_planks_blue_slab_double quark:stained_planks_brown_slab_double quark:stained_planks_cyan_slab_double quark:stained_planks_gray_slab_double quark:stained_planks_green_slab_double quark:stained_planks_light_blue_slab_double quark:stained_planks_lime_slab_double quark:stained_planks_magenta_slab_double quark:stained_planks_orange_slab_double quark:stained_planks_pink_slab_double quark:stained_planks_purple_slab_double quark:stained_planks_red_slab_double quark:stained_planks_silver_slab_double quark:stained_planks_white_slab_double quark:stained_planks_yellow_slab_double quark:vertical_stained_planks \
\
storagedrawers:basicdrawers \
\
tfc:wood/bookshelf/pine tfc:wood/bookshelf/white_cedar tfc:wood/clutch/pine tfc:wood/clutch/white_cedar tfc:wood/encased_axle/pine tfc:wood/encased_axle/white_cedar tfc:wood/planks/pine tfc:wood/planks/white_cedar tfc:wood/stripped_log/pine tfc:wood/stripped_log/white_cedar tfc:wood/stripped_wood/pine tfc:wood/stripped_wood/white_cedar tfc:wood/workbench/pine tfc:wood/workbench/white_cedar \
\
twilightforest:stripped_transformation_log twilightforest:stripped_transformation_wood twilightforest:transformation_planks \
\
vanillabakport:pale_oak_planks vanillabakport:stripped_pale_oak_log vanillabakport:stripped_pale_oak_wood
# Pale Oak Wood Non-Full Blocks
block.10929 = pale_oak_fence pale_oak_fence_gate pale_oak_pressure_plate pale_oak_button pale_oak_trapdoor pale_oak_shelf \
\
additionalplacements:aether.skyroot_pressure_plate additionalplacements:blockus.white_oak_pressure_plate additionalplacements:extshape_blockus.stripped_white_oak_wood_pressure_plate additionalplacements:extshape_blockus.stripped_white_oak_wood_slab additionalplacements:extshape_blockus.stripped_white_oak_wood_stairs additionalplacements:twilightforest.transformation_pressure_plate additionalplacements:twilightforest.transformation_slab additionalplacements:twilightforest.transformation_stairs \
\
aether:skyroot_button aether:skyroot_door aether:skyroot_fence aether:skyroot_fence_gate aether:skyroot_pressure_plate aether:skyroot_trapdoor \
\
biomeswevegone:ironwood_button biomeswevegone:ironwood_door biomeswevegone:ironwood_fence biomeswevegone:ironwood_fence_gate biomeswevegone:ironwood_pressure_plate biomeswevegone:ironwood_slab biomeswevegone:ironwood_stairs biomeswevegone:ironwood_trapdoor biomeswevegone:maple_button biomeswevegone:maple_door biomeswevegone:maple_fence biomeswevegone:maple_fence_gate biomeswevegone:maple_pressure_plate biomeswevegone:maple_slab biomeswevegone:maple_stairs biomeswevegone:maple_trapdoor biomeswevegone:palm_button biomeswevegone:palm_door biomeswevegone:palm_fence biomeswevegone:palm_fence_gate biomeswevegone:palm_pressure_plate biomeswevegone:palm_slab biomeswevegone:palm_stairs biomeswevegone:palm_trapdoor biomeswevegone:pine_button biomeswevegone:pine_door biomeswevegone:pine_fence biomeswevegone:pine_fence_gate biomeswevegone:pine_pressure_plate biomeswevegone:pine_slab biomeswevegone:pine_stairs biomeswevegone:pine_trapdoor biomeswevegone:rainbow_eucalyptus_button biomeswevegone:rainbow_eucalyptus_door biomeswevegone:rainbow_eucalyptus_fence biomeswevegone:rainbow_eucalyptus_fence_gate biomeswevegone:rainbow_eucalyptus_pressure_plate biomeswevegone:rainbow_eucalyptus_slab biomeswevegone:rainbow_eucalyptus_stairs biomeswevegone:rainbow_eucalyptus_trapdoor biomeswevegone:skyris_button biomeswevegone:skyris_door biomeswevegone:skyris_fence biomeswevegone:skyris_fence_gate biomeswevegone:skyris_pressure_plate biomeswevegone:skyris_slab biomeswevegone:skyris_stairs biomeswevegone:skyris_trapdoor biomeswevegone:spirit_button biomeswevegone:spirit_door biomeswevegone:spirit_fence biomeswevegone:spirit_fence_gate biomeswevegone:spirit_pressure_plate biomeswevegone:spirit_roots biomeswevegone:spirit_slab biomeswevegone:spirit_stairs biomeswevegone:spirit_trapdoor biomeswevegone:white_mangrove_button biomeswevegone:white_mangrove_door biomeswevegone:white_mangrove_fence biomeswevegone:white_mangrove_fence_gate biomeswevegone:white_mangrove_pressure_plate biomeswevegone:white_mangrove_slab biomeswevegone:white_mangrove_stairs biomeswevegone:white_mangrove_trapdoor \
\
blockus:mossy_white_oak_slab blockus:mossy_white_oak_stairs blockus:stripped_white_oak_post blockus:white_oak_button blockus:white_oak_door blockus:white_oak_fence blockus:white_oak_fence_gate blockus:white_oak_grate blockus:white_oak_lattice blockus:white_oak_mosaic_slab blockus:white_oak_mosaic_stairs blockus:white_oak_post blockus:white_oak_pressure_plate blockus:white_oak_slab blockus:white_oak_stairs blockus:white_oak_trapdoor \
\
diagonalfences:aether/skyroot_fence diagonalfences:blockus/white_oak_fence diagonalfences:extshape_blockus/stripped_white_oak_wood_fence diagonalfences:minecraft/pale_oak_fence diagonalfences:twilightforest/transformation_fence \
\
diagonalwalls:extshape_blockus/herringbone_white_oak_wall diagonalwalls:extshape_blockus/mossy_white_oak_wall diagonalwalls:extshape_blockus/stripped_white_oak_wood_wall diagonalwalls:extshape_blockus/white_oak_mosaic_wall diagonalwalls:extshape_blockus/white_oak_wall \
\
diagonalwindows:blockus/white_oak_lattice \
\
extshape_blockus:herringbone_white_oak_quarter_piece extshape_blockus:herringbone_white_oak_slab extshape_blockus:herringbone_white_oak_stairs extshape_blockus:herringbone_white_oak_vertical_quarter_piece extshape_blockus:herringbone_white_oak_vertical_slab extshape_blockus:herringbone_white_oak_vertical_stairs extshape_blockus:herringbone_white_oak_wall extshape_blockus:mossy_white_oak_quarter_piece extshape_blockus:mossy_white_oak_vertical_quarter_piece extshape_blockus:mossy_white_oak_vertical_slab extshape_blockus:mossy_white_oak_vertical_stairs extshape_blockus:mossy_white_oak_wall extshape_blockus:stripped_white_oak_log_quarter_piece extshape_blockus:stripped_white_oak_log_slab extshape_blockus:stripped_white_oak_log_stairs extshape_blockus:stripped_white_oak_log_vertical_quarter_piece extshape_blockus:stripped_white_oak_log_vertical_slab extshape_blockus:stripped_white_oak_log_vertical_stairs extshape_blockus:stripped_white_oak_wood_button extshape_blockus:stripped_white_oak_wood_fence extshape_blockus:stripped_white_oak_wood_fence_gate extshape_blockus:stripped_white_oak_wood_pressure_plate extshape_blockus:stripped_white_oak_wood_quarter_piece extshape_blockus:stripped_white_oak_wood_slab extshape_blockus:stripped_white_oak_wood_stairs extshape_blockus:stripped_white_oak_wood_vertical_quarter_piece extshape_blockus:stripped_white_oak_wood_vertical_slab extshape_blockus:stripped_white_oak_wood_vertical_stairs extshape_blockus:stripped_white_oak_wood_wall extshape_blockus:white_oak_mosaic_quarter_piece extshape_blockus:white_oak_mosaic_vertical_quarter_piece extshape_blockus:white_oak_mosaic_vertical_slab extshape_blockus:white_oak_mosaic_vertical_stairs extshape_blockus:white_oak_mosaic_wall extshape_blockus:white_oak_quarter_piece extshape_blockus:white_oak_vertical_quarter_piece extshape_blockus:white_oak_vertical_slab extshape_blockus:white_oak_vertical_stairs extshape_blockus:white_oak_wall \
\
natura:ghostwood_button natura:ghostwood_fence natura:ghostwood_fence_gate natura:ghostwood_pressure_plate natura:ghostwood_trap_door natura:nether_door_ghostwood natura:nether_slab:type=ghostwood natura:nether_stairs_ghostwood natura:overworld_door_silverbell natura:overworld_slab:type=silverbell natura:overworld_stairs_silverbell natura:silverbell_button natura:silverbell_fence natura:silverbell_fence_gate natura:silverbell_pressure_plate natura:silverbell_trap_door \
\
pvj:baobab_button pvj:baobab_door pvj:baobab_fence pvj:baobab_fence_gate pvj:baobab_pressure_plate pvj:baobab_slab pvj:baobab_stairs pvj:baobab_trapdoor pvj:baobab_twigs pvj:cottonwood_button pvj:cottonwood_door pvj:cottonwood_fence pvj:cottonwood_fence_gate pvj:cottonwood_pressure_plate pvj:cottonwood_slab pvj:cottonwood_stairs pvj:cottonwood_trapdoor pvj:cottonwood_twigs \
\
quark:stained_planks_black_slab quark:stained_planks_black_stairs quark:stained_planks_blue_slab quark:stained_planks_blue_stairs quark:stained_planks_brown_slab quark:stained_planks_brown_stairs quark:stained_planks_cyan_slab quark:stained_planks_cyan_stairs quark:stained_planks_gray_slab quark:stained_planks_gray_stairs quark:stained_planks_green_slab quark:stained_planks_green_stairs quark:stained_planks_light_blue_slab quark:stained_planks_light_blue_stairs quark:stained_planks_lime_slab quark:stained_planks_lime_stairs quark:stained_planks_magenta_slab quark:stained_planks_magenta_stairs quark:stained_planks_orange_slab quark:stained_planks_orange_stairs quark:stained_planks_pink_slab quark:stained_planks_pink_stairs quark:stained_planks_purple_slab quark:stained_planks_purple_stairs quark:stained_planks_red_slab quark:stained_planks_red_stairs quark:stained_planks_silver_slab quark:stained_planks_silver_stairs quark:stained_planks_white_slab quark:stained_planks_white_stairs quark:stained_planks_yellow_slab quark:stained_planks_yellow_stairs \
\
suppsquared:aether/item_shelf_skyroot suppsquared:blockus/item_shelf_white_oak suppsquared:twilightforest/item_shelf_transformation \
\
tfc:wood/barrel/pine tfc:wood/barrel/white_cedar tfc:wood/button/pine tfc:wood/button/white_cedar tfc:wood/door/pine tfc:wood/door/white_cedar tfc:wood/fence/pine tfc:wood/fence/white_cedar tfc:wood/fence_gate/pine tfc:wood/fence_gate/white_cedar tfc:wood/gear_box/pine tfc:wood/gear_box/white_cedar tfc:wood/horizontal_support/pine tfc:wood/horizontal_support/white_cedar tfc:wood/lectern/pine tfc:wood/lectern/white_cedar tfc:wood/log_fence/pine tfc:wood/log_fence/white_cedar tfc:wood/loom/pine tfc:wood/loom/white_cedar tfc:wood/planks/pine_slab tfc:wood/planks/pine_stairs tfc:wood/planks/white_cedar_slab tfc:wood/planks/white_cedar_stairs tfc:wood/pressure_plate/pine tfc:wood/pressure_plate/white_cedar tfc:wood/scribing_table/pine tfc:wood/scribing_table/white_cedar tfc:wood/sewing_table/pine tfc:wood/sewing_table/white_cedar tfc:wood/shelf/pine tfc:wood/shelf/white_cedar tfc:wood/sluice/pine tfc:wood/sluice/white_cedar tfc:wood/tool_rack/pine tfc:wood/tool_rack/white_cedar tfc:wood/trapdoor/pine tfc:wood/trapdoor/white_cedar tfc:wood/vertical_support/pine tfc:wood/vertical_support/white_cedar \
\
twilightforest:transformation_banister twilightforest:transformation_button twilightforest:transformation_door twilightforest:transformation_fence twilightforest:transformation_fence_gate twilightforest:transformation_pressure_plate twilightforest:transformation_slab twilightforest:transformation_stairs twilightforest:transformation_trapdoor \
\
vanillabackport:pale_oak_button vanillabackport:pale_oak_fence vanillabackport:pale_oak_fence_gate vanillabackport:pale_oak_pressure_plate vanillabackport:pale_oak_slab vanillabackport:pale_oak_stairs vanillabackport:pale_oak_trapdoor \
\
wilderwild:stripped_hollowed_pale_oak_log
# Pale Oak Wood Slabs and Stairs
block.10931 = pale_oak_stairs pale_oak_slab \
\
additionalplacements:aether.skyroot_slab additionalplacements:aether.skyroot_stairs additionalplacements:blockus.mossy_white_oak_slab additionalplacements:blockus.mossy_white_oak_stairs additionalplacements:blockus.white_oak_mosaic_slab additionalplacements:blockus.white_oak_mosaic_stairs additionalplacements:blockus.white_oak_slab additionalplacements:blockus.white_oak_stairs additionalplacements:extshape_blockus.herringbone_white_oak_slab additionalplacements:extshape_blockus.herringbone_white_oak_stairs additionalplacements:extshape_blockus.stripped_white_oak_log_slab additionalplacements:extshape_blockus.stripped_white_oak_log_stairs \
\
aether:skyroot_slab aether:skyroot_stairs
# Pale Oak Log Full Blocks
block.10932 = pale_oak_log pale_oak_wood \
\
aether:skyroot_log aether:skyroot_wood \
\
biomeswevegone:rainbow_eucalyptus_log biomeswevegone:rainbow_eucalyptus_wood biomeswevegone:spirit_log biomeswevegone:spirit_wood biomeswevegone:white_mangrove_log biomeswevegone:white_mangrove_wood \
\
blockus:white_oak_log blockus:white_oak_wood \
\
natura:nether_logs:type=ghostwood natura:overworld_logs:type=silverbell \
\
pvj:log_juniper \
\
tfc:wood/log/maple tfc:wood/log/palm tfc:wood/log/pine tfc:wood/log/rosewood tfc:wood/log/white_cedar tfc:wood/log/willow tfc:wood/wood/maple tfc:wood/wood/palm tfc:wood/wood/pine tfc:wood/wood/rosewood tfc:wood/wood/white_cedar tfc:wood/wood/willow \
\
twilightforest:transformation_log twilightforest:transformation_log_core:active=false twilightforest:transformation_wood \
\
vanillabackport:pale_oak_log vanillabackport:pale_oak_wood
# Pale Oak Log Non-Full Blocks (Modded Only)
block.10933 = diagonalfences:extshape_blockus/white_oak_wood_fence \
tags_everycomp_tfc_maple tags_everycomp_tfc_palm tags_everycomp_tfc_pine tags_everycomp_tfc_rosewood tags_everycomp_tfc_willow \
\
additionalplacements:extshape_blockus.white_oak_log_slab additionalplacements:extshape_blockus.white_oak_log_stairs additionalplacements:extshape_blockus.white_oak_small_logs_slab additionalplacements:extshape_blockus.white_oak_small_logs_stairs additionalplacements:extshape_blockus.white_oak_wood_pressure_plate additionalplacements:extshape_blockus.white_oak_wood_slab additionalplacements:extshape_blockus.white_oak_wood_stairs \
\
diagonalwalls:extshape_blockus/white_oak_wood_wall \
\
extshape_blockus:white_oak_log_quarter_piece extshape_blockus:white_oak_log_slab extshape_blockus:white_oak_log_stairs extshape_blockus:white_oak_log_vertical_quarter_piece extshape_blockus:white_oak_log_vertical_slab extshape_blockus:white_oak_log_vertical_stairs extshape_blockus:white_oak_small_logs_quarter_piece extshape_blockus:white_oak_small_logs_slab extshape_blockus:white_oak_small_logs_stairs extshape_blockus:white_oak_small_logs_vertical_quarter_piece extshape_blockus:white_oak_small_logs_vertical_slab extshape_blockus:white_oak_small_logs_vertical_stairs extshape_blockus:white_oak_wood_button extshape_blockus:white_oak_wood_fence extshape_blockus:white_oak_wood_fence_gate extshape_blockus:white_oak_wood_pressure_plate extshape_blockus:white_oak_wood_quarter_piece extshape_blockus:white_oak_wood_slab extshape_blockus:white_oak_wood_stairs extshape_blockus:white_oak_wood_vertical_quarter_piece extshape_blockus:white_oak_wood_vertical_slab extshape_blockus:white_oak_wood_vertical_stairs extshape_blockus:white_oak_wood_wall \
\
tfc:plant/pine_krummholz tfc:plant/white_cedar_krummholz tfc:wood/twig/maple tfc:wood/twig/palm tfc:wood/twig/pine tfc:wood/twig/rosewood tfc:wood/twig/white_cedar tfc:wood/twig/willow \
\
twilightforest:hollow_transformation_log_climbable twilightforest:hollow_transformation_log_horizontal twilightforest:hollow_transformation_log_vertical \
\
wilderwild:hollowed_pale_oak_log
# Pale Oak Door
block.10937 = pale_oak_door \
\
vanillabackport:pale_oak_door
# Resin Full Blocks
block.10940 = resin_bricks chiseled_resin_bricks resin_block \
\
vanillabackport:chiseled_resin_bricks vanillabackport:resin_block vanillabackport:resin_bricks
# Resin Non-Full Blocks
block.10941 = resin_clump resin_brick_stairs resin_brick_slab resin_brick_wall \
\
diagonalwalls:minecraft/resin_brick_wall \
\
vanillabackport:resin_brick_slab vanillabackport:resin_brick_stairs vanillabackport:resin_brick_wall vanillabackport:resin_clump
#if MC_VERSION >= 12105
# Creaking Heart Inactive 1.21.5
block.10944 = creaking_heart:creaking_heart_state=uprooted
# Creaking Heart Active 1.21.5
block.10948 = creaking_heart:creaking_heart_state=dormant creaking_heart:creaking_heart_state=awake
#else
# Creaking Heart Inactive 1.21.4
block.10944 = creaking_heart:active=false \
\
vanillabackport:creaking_heart:creaking_heart_state=uprooted
# Creaking Heart Active 1.21.4
block.10948 = creaking_heart:active=true \
\
vanillabackport:creaking_heart:creaking_heart_state=awake vanillabackport:creaking_heart:creaking_heart_state=dormant
#endif
# All snow layers except layer 8
block.10953 = snow:layers=1 snow:layers=2 snow:layers=3 snow:layers=4 snow:layers=5 snow:layers=6 snow:layers=7 \
\
terrainslabs:snow_on_top \
\
tfc:snow_pile:layers=1 tfc:snow_pile:layers=2 tfc:snow_pile:layers=3 tfc:snow_pile:layers=4 tfc:snow_pile:layers=5 tfc:snow_pile:layers=6 tfc:snow_pile:layers=7
# Target 0 Power
block.10956 = target:power=0
# Target Powered
block.10960 = target:power=1 target:power=2 target:power=3 target:power=4 target:power=5 target:power=6 target:power=7 target:power=8 target:power=9 target:power=10 target:power=11 target:power=12 target:power=13 target:power=14 target:power=15
# Sponge
block.10964 = sponge \
\
blockus:legacy_sponge \
\
openblocks:sponge
@@ -1,491 +1,491 @@
### Last updated: February 10, 2026, 11:05 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# Purple Stained Glass Panes
block.31021 = purple_stained_glass_pane \
\
betternether:obsidian_glass_pane betternether:quartz_glass_framed_pane_purple betternether:quartz_glass_pane_purple \
\
blockus:purple_beveled_glass_pane \
\
born_in_chaos_v1:purple_stained_glass_panel \
\
chipped:arched_purple_stained_glass_pane_pillar chipped:circular_purple_stained_glass_pane chipped:fancy_purple_stained_glass_pane chipped:large_diamond_purple_stained_glass_pane chipped:ornate_purple_stained_glass_pane chipped:raster_purple_stained_glass_pane chipped:small_purple_stained_glass_pane chipped:square_purple_stained_glass_pane chipped:tiled_purple_stained_glass_pane chipped:vertical_stiped_purple_stained_glass_pane chipped:woven_purple_stained_glass_pane \
\
chisel:glasspanedyedpurple \
\
create:purple_nixie_tube \
\
createframed:horizontal_purple_stained_framed_glass_pane createframed:purple_stained_framed_glass_door createframed:purple_stained_framed_glass_pane createframed:purple_stained_framed_glass_trapdoor createframed:purple_stained_tiled_glass_pane createframed:vertical_purple_stained_framed_glass_pane \
\
diagonalwindows:blockus/purple_beveled_glass_pane diagonalwindows:createframed/horizontal_purple_stained_framed_glass_pane diagonalwindows:createframed/purple_stained_framed_glass_pane diagonalwindows:createframed/purple_stained_tiled_glass_pane diagonalwindows:createframed/vertical_purple_stained_framed_glass_pane diagonalwindows:mcwwindows/purple_mosaic_glass_pane diagonalwindows:minecraft/purple_stained_glass_pane \
\
hearth_and_home:purple_stained_barred_glass_pane \
\
mcwwindows:purple_mosaic_glass_pane \
\
securitycraft:reinforced_purple_stained_glass_pane \
\
tconstruct:purple_clear_stained_glass_pane
# Blue Stained Glass
block.31022 = blue_stained_glass \
\
betterend:umbrella_tree_membrane:color=5 betterend:umbrella_tree_membrane:color=6 betterend:umbrella_tree_membrane:color=7 \
\
betternether:quartz_glass_blue betternether:quartz_glass_framed_blue \
\
blockus:blue_beveled_glass \
\
chipped:arched_blue_stained_glass_pillar chipped:circular_blue_stained_glass chipped:fancy_blue_stained_glass chipped:large_diamond_blue_stained_glass chipped:ornate_blue_stained_glass chipped:raster_blue_stained_glass chipped:small_blue_stained_glass chipped:square_blue_stained_glass chipped:tiled_blue_stained_glass chipped:vertical_stiped_blue_stained_glass chipped:woven_blue_stained_glass \
\
chisel:glassdyedblue \
\
createframed:blue_stained_framed_glass createframed:blue_stained_tiled_glass createframed:horizontal_blue_stained_framed_glass createframed:vertical_blue_stained_framed_glass \
\
hearth_and_home:blue_stained_barred_glass \
\
mcwwindows:blue_mosaic_glass \
\
quark:crystal:variant=crystal_indigo \
\
seasonsextras:blue_greenhouse_glass \
\
securitycraft:reinforced_blue_stained_glass \
\
tconstruct:blue_clear_stained_glass \
\
tfc:blue_poured_glass
# Blue Stained Glass Panes
block.31023 = blue_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_blue betternether:quartz_glass_pane_blue \
\
blockus:blue_beveled_glass_pane \
\
chipped:arched_blue_stained_glass_pane_pillar chipped:circular_blue_stained_glass_pane chipped:fancy_blue_stained_glass_pane chipped:large_diamond_blue_stained_glass_pane chipped:ornate_blue_stained_glass_pane chipped:raster_blue_stained_glass_pane chipped:small_blue_stained_glass_pane chipped:square_blue_stained_glass_pane chipped:tiled_blue_stained_glass_pane chipped:vertical_stiped_blue_stained_glass_pane chipped:woven_blue_stained_glass_pane \
\
chisel:glasspanedyedblue \
\
create:blue_nixie_tube \
\
createframed:blue_stained_framed_glass_door createframed:blue_stained_framed_glass_pane createframed:blue_stained_framed_glass_trapdoor createframed:blue_stained_tiled_glass_pane createframed:horizontal_blue_stained_framed_glass_pane createframed:vertical_blue_stained_framed_glass_pane \
\
diagonalwindows:blockus/blue_beveled_glass_pane diagonalwindows:createframed/blue_stained_framed_glass_pane diagonalwindows:createframed/blue_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_blue_stained_framed_glass_pane diagonalwindows:createframed/vertical_blue_stained_framed_glass_pane diagonalwindows:mcwwindows/blue_mosaic_glass_pane diagonalwindows:minecraft/blue_stained_glass_pane \
\
hearth_and_home:blue_stained_barred_glass_pane \
\
mcwwindows:blue_mosaic_glass_pane \
\
quark:crystal_pane:variant=crystal_indigo \
\
securitycraft:reinforced_blue_stained_glass_pane \
\
tconstruct:blue_clear_stained_glass_pane
# Brown Stained Glass
block.31024 = brown_stained_glass \
\
betternether:quartz_glass_brown betternether:quartz_glass_framed_brown \
\
blockus:brown_beveled_glass \
\
chipped:arched_brown_stained_glass_pillar chipped:circular_brown_stained_glass chipped:fancy_brown_stained_glass chipped:large_diamond_brown_stained_glass chipped:ornate_brown_stained_glass chipped:raster_brown_stained_glass chipped:small_brown_stained_glass chipped:square_brown_stained_glass chipped:tiled_brown_stained_glass chipped:vertical_stiped_brown_stained_glass chipped:woven_brown_stained_glass \
\
chisel:glassdyedbrown \
\
cinderscapes:crystalline_smoky_quartz \
\
createframed:brown_stained_framed_glass createframed:brown_stained_tiled_glass createframed:horizontal_brown_stained_framed_glass createframed:vertical_brown_stained_framed_glass \
\
hearth_and_home:brown_stained_barred_glass \
\
immersive_weathering:vitrified_sand \
\
immersiveengineering:slag_glass \
\
mcwwindows:brown_mosaic_glass \
\
seasonsextras:brown_greenhouse_glass \
\
securitycraft:reinforced_brown_stained_glass \
\
tconstruct:brown_clear_stained_glass \
\
tfc:brown_poured_glass
# Brown Stained Glass Panes
block.31025 = brown_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_brown betternether:quartz_glass_pane_brown \
\
blockus:brown_beveled_glass_pane \
\
chipped:arched_brown_stained_glass_pane_pillar chipped:circular_brown_stained_glass_pane chipped:fancy_brown_stained_glass_pane chipped:large_diamond_brown_stained_glass_pane chipped:ornate_brown_stained_glass_pane chipped:raster_brown_stained_glass_pane chipped:small_brown_stained_glass_pane chipped:square_brown_stained_glass_pane chipped:tiled_brown_stained_glass_pane chipped:vertical_stiped_brown_stained_glass_pane chipped:woven_brown_stained_glass_pane \
\
chisel:glasspanedyedbrown \
\
create:brown_nixie_tube \
\
createframed:brown_stained_framed_glass_door createframed:brown_stained_framed_glass_pane createframed:brown_stained_framed_glass_trapdoor createframed:brown_stained_tiled_glass_pane createframed:horizontal_brown_stained_framed_glass_pane createframed:vertical_brown_stained_framed_glass_pane \
\
diagonalwindows:blockus/brown_beveled_glass_pane diagonalwindows:createframed/brown_stained_framed_glass_pane diagonalwindows:createframed/brown_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_brown_stained_framed_glass_pane diagonalwindows:createframed/vertical_brown_stained_framed_glass_pane diagonalwindows:mcwwindows/brown_mosaic_glass_pane diagonalwindows:minecraft/brown_stained_glass_pane \
\
hearth_and_home:brown_stained_barred_glass_pane \
\
mcwwindows:brown_mosaic_glass_pane \
\
securitycraft:reinforced_brown_stained_glass_pane \
\
tconstruct:brown_clear_stained_glass_pane
# Green Stained Glass
block.31026 = green_stained_glass \
\
betternether:quartz_glass_framed_green betternether:quartz_glass_green \
\
blockus:green_beveled_glass \
\
chipped:arched_green_stained_glass_pillar chipped:circular_green_stained_glass chipped:fancy_green_stained_glass chipped:large_diamond_green_stained_glass chipped:ornate_green_stained_glass chipped:raster_green_stained_glass chipped:small_green_stained_glass chipped:square_green_stained_glass chipped:tiled_green_stained_glass chipped:vertical_stiped_green_stained_glass chipped:woven_green_stained_glass \
\
chisel:glassdyedgreen \
\
createframed:green_stained_framed_glass createframed:green_stained_tiled_glass createframed:horizontal_green_stained_framed_glass createframed:vertical_green_stained_framed_glass \
\
hearth_and_home:green_stained_barred_glass \
\
iceandfire:myrmex_jungle_resin_glass \
\
mcwwindows:green_mosaic_glass \
\
seasonsextras:green_greenhouse_glass \
\
securitycraft:reinforced_green_stained_glass \
\
tconstruct:green_clear_stained_glass \
\
tfc:green_poured_glass
# Green Stained Glass Panes
block.31027 = green_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_green betternether:quartz_glass_pane_green \
\
blockus:green_beveled_glass_pane \
\
chipped:arched_green_stained_glass_pane_pillar chipped:circular_green_stained_glass_pane chipped:fancy_green_stained_glass_pane chipped:large_diamond_green_stained_glass_pane chipped:ornate_green_stained_glass_pane chipped:raster_green_stained_glass_pane chipped:small_green_stained_glass_pane chipped:square_green_stained_glass_pane chipped:tiled_green_stained_glass_pane chipped:vertical_stiped_green_stained_glass_pane chipped:woven_green_stained_glass_pane \
\
chisel:glasspanedyedgreen \
\
create:green_nixie_tube \
\
createframed:green_stained_framed_glass_door createframed:green_stained_framed_glass_pane createframed:green_stained_framed_glass_trapdoor createframed:green_stained_tiled_glass_pane createframed:horizontal_green_stained_framed_glass_pane createframed:vertical_green_stained_framed_glass_pane \
\
diagonalwindows:blockus/green_beveled_glass_pane diagonalwindows:createframed/green_stained_framed_glass_pane diagonalwindows:createframed/green_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_green_stained_framed_glass_pane diagonalwindows:createframed/vertical_green_stained_framed_glass_pane diagonalwindows:mcwwindows/green_mosaic_glass_pane diagonalwindows:minecraft/green_stained_glass_pane \
\
hearth_and_home:green_stained_barred_glass_pane \
\
mcwwindows:green_mosaic_glass_pane \
\
securitycraft:reinforced_green_stained_glass_pane \
\
tconstruct:green_clear_stained_glass_pane
# Red Stained Glass
block.31028 = red_stained_glass \
\
betternether:quartz_glass_framed_red betternether:quartz_glass_red \
\
blockus:red_beveled_glass \
\
born_in_chaos_v1:scarlet_stained_glass \
\
chipped:arched_red_stained_glass_pillar chipped:circular_red_stained_glass chipped:fancy_red_stained_glass chipped:large_diamond_red_stained_glass chipped:ornate_red_stained_glass chipped:raster_red_stained_glass chipped:small_red_stained_glass chipped:square_red_stained_glass chipped:tiled_red_stained_glass chipped:vertical_stiped_red_stained_glass chipped:woven_red_stained_glass \
\
chisel:glassdyedred \
\
createframed:horizontal_red_stained_framed_glass createframed:red_stained_framed_glass createframed:red_stained_tiled_glass createframed:vertical_red_stained_framed_glass \
\
hearth_and_home:red_stained_barred_glass \
\
mcwwindows:red_mosaic_glass \
\
naturalist:crimson_froglass \
\
quark:crystal:variant=crystal_red \
\
seasonsextras:red_greenhouse_glass \
\
securitycraft:reinforced_red_stained_glass \
\
tconstruct:red_clear_stained_glass \
\
tfc:red_poured_glass
# Red Stained Glass Panes
block.31029 = red_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_red betternether:quartz_glass_pane_red \
\
blockus:red_beveled_glass_pane \
\
born_in_chaos_v1:cursed_scarlet_ornate_glass_pane born_in_chaos_v1:scarlet_stained_glass_panel \
\
chipped:arched_red_stained_glass_pane_pillar chipped:circular_red_stained_glass_pane chipped:fancy_red_stained_glass_pane chipped:large_diamond_red_stained_glass_pane chipped:ornate_red_stained_glass_pane chipped:raster_red_stained_glass_pane chipped:small_red_stained_glass_pane chipped:square_red_stained_glass_pane chipped:tiled_red_stained_glass_pane chipped:vertical_stiped_red_stained_glass_pane chipped:woven_red_stained_glass_pane \
\
chisel:glasspanedyedred \
\
create:red_nixie_tube \
\
createframed:horizontal_red_stained_framed_glass_pane createframed:red_stained_framed_glass_door createframed:red_stained_framed_glass_pane createframed:red_stained_framed_glass_trapdoor createframed:red_stained_tiled_glass_pane createframed:vertical_red_stained_framed_glass_pane \
\
diagonalwindows:blockus/red_beveled_glass_pane diagonalwindows:createframed/horizontal_red_stained_framed_glass_pane diagonalwindows:createframed/red_stained_framed_glass_pane diagonalwindows:createframed/red_stained_tiled_glass_pane diagonalwindows:createframed/vertical_red_stained_framed_glass_pane diagonalwindows:mcwwindows/red_mosaic_glass_pane diagonalwindows:minecraft/red_stained_glass_pane \
\
hearth_and_home:red_stained_barred_glass_pane \
\
mcwwindows:red_mosaic_glass_pane \
\
naturalist:crimson_froglass_pane \
\
quark:crystal_pane:variant=crystal_red \
\
securitycraft:reinforced_red_stained_glass_pane \
\
tconstruct:red_clear_stained_glass_pane
# Black Stained Glass
# Use if your glass is multi-colored, black will preserve the lighting through the glass texture.
block.31030 = black_stained_glass \
\
betternether:quartz_glass_black betternether:quartz_glass_framed_black \
\
biomeswevegone:black_ice biomeswevegone:borealis_ice \
\
blockus:black_beveled_glass blockus:rainbow_beveled_glass blockus:rainbow_glass \
\
chipped:arched_black_stained_glass_pillar chipped:circular_black_stained_glass chipped:fancy_black_stained_glass chipped:large_diamond_black_stained_glass chipped:ornate_black_stained_glass chipped:raster_black_stained_glass chipped:small_black_stained_glass chipped:square_black_stained_glass chipped:tiled_black_stained_glass chipped:vertical_stiped_black_stained_glass chipped:woven_black_stained_glass \
\
chisel:glassdyedblack \
\
create:weathered_iron_window \
\
createframed:black_stained_framed_glass createframed:black_stained_tiled_glass createframed:horizontal_black_stained_framed_glass createframed:vertical_black_stained_framed_glass \
\
hearth_and_home:black_stained_barred_glass \
\
mcwwindows:black_mosaic_glass mcwwindows:one_way_glass \
\
quark:crystal:variant=crystal_black \
\
seasonsextras:black_greenhouse_glass \
\
securitycraft:reinforced_black_stained_glass \
\
tconstruct:black_clear_stained_glass tconstruct:soulsteel_block \
\
tfc:black_poured_glass \
\
twilightforest:auroralized_glass
# Black Stained Glass Panes
block.31031 = black_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_black betternether:quartz_glass_pane_black \
\
blockus:black_beveled_glass_pane blockus:rainbow_beveled_glass_pane blockus:rainbow_glass_pane \
\
chipped:arched_black_stained_glass_pane_pillar chipped:circular_black_stained_glass_pane chipped:fancy_black_stained_glass_pane chipped:large_diamond_black_stained_glass_pane chipped:ornate_black_stained_glass_pane chipped:raster_black_stained_glass_pane chipped:small_black_stained_glass_pane chipped:square_black_stained_glass_pane chipped:tiled_black_stained_glass_pane chipped:vertical_stiped_black_stained_glass_pane chipped:woven_black_stained_glass_pane \
\
chisel:glasspanedyedblack \
\
create:black_nixie_tube create:weathered_iron_window_pane \
\
createframed:black_stained_framed_glass_door createframed:black_stained_framed_glass_pane createframed:black_stained_framed_glass_trapdoor createframed:black_stained_tiled_glass_pane createframed:horizontal_black_stained_framed_glass_pane createframed:vertical_black_stained_framed_glass_pane \
\
diagonalwindows:blockus/black_beveled_glass_pane diagonalwindows:blockus/rainbow_beveled_glass_pane diagonalwindows:blockus/rainbow_glass_pane diagonalwindows:create/weathered_iron_window_pane diagonalwindows:createframed/black_stained_framed_glass_pane diagonalwindows:createframed/black_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_black_stained_framed_glass_pane diagonalwindows:createframed/vertical_black_stained_framed_glass_pane diagonalwindows:mcwwindows/black_mosaic_glass_pane diagonalwindows:minecraft/black_stained_glass_pane \
\
hearth_and_home:black_stained_barred_glass_pane \
\
immersiveengineering:alu_window immersiveengineering:reinforced_window immersiveengineering:steel_window immersiveengineering:treated_window \
\
mcwwindows:black_mosaic_glass_pane mcwwindows:one_way_glass_pane \
\
missingwilds:black_stained_food_jar missingwilds:black_stained_jar missingwilds:black_stained_potion_jar missingwilds:blue_stained_food_jar missingwilds:blue_stained_jar missingwilds:blue_stained_potion_jar missingwilds:brown_stained_food_jar missingwilds:brown_stained_jar missingwilds:brown_stained_potion_jar missingwilds:cyan_stained_food_jar missingwilds:cyan_stained_jar missingwilds:cyan_stained_potion_jar missingwilds:gray_stained_food_jar missingwilds:gray_stained_jar missingwilds:gray_stained_potion_jar missingwilds:green_stained_food_jar missingwilds:green_stained_jar missingwilds:green_stained_potion_jar missingwilds:light_blue_stained_food_jar missingwilds:light_blue_stained_jar missingwilds:light_blue_stained_potion_jar missingwilds:light_gray_stained_food_jar missingwilds:light_gray_stained_jar missingwilds:light_gray_stained_potion_jar missingwilds:lime_stained_food_jar missingwilds:lime_stained_jar missingwilds:lime_stained_potion_jar missingwilds:magenta_stained_food_jar missingwilds:magenta_stained_jar missingwilds:magenta_stained_potion_jar missingwilds:orange_stained_food_jar missingwilds:orange_stained_jar missingwilds:orange_stained_potion_jar missingwilds:pink_stained_food_jar missingwilds:pink_stained_jar missingwilds:pink_stained_potion_jar missingwilds:purple_stained_food_jar missingwilds:purple_stained_jar missingwilds:purple_stained_potion_jar missingwilds:red_stained_food_jar missingwilds:red_stained_jar missingwilds:red_stained_potion_jar missingwilds:white_stained_food_jar missingwilds:white_stained_jar missingwilds:white_stained_potion_jar missingwilds:yellow_stained_food_jar missingwilds:yellow_stained_jar missingwilds:yellow_stained_potion_jar \
\
quark:crystal_pane:variant=crystal_black \
\
securitycraft:reinforced_black_stained_glass_pane \
\
tconstruct:black_clear_stained_glass_pane
# Water
block.32000 = water bubble_column \
\
ad_astra:cryo_fuel ad_astra:flowing_cryo_fuel ad_astra:flowing_fuel ad_astra:flowing_oil ad_astra:fuel ad_astra:oil \
\
aether:aether_portal \
\
aquaacrobatics:bubble_column \
\
betterend:vent_bubble_column \
\
biomesoplenty:blood \
\
burnt:flowing_hot_spring_water burnt:geyser_block burnt:geyser_block_medium burnt:geyser_shoot burnt:geyser_starter burnt:geyser_starter_medium burnt:hot_spring_water \
\
butcher:brinesolution butcher:chlorine \
\
chiselsandbits:chiseled_fluid \
\
create_enchantment_industry:flowing_ink create_enchantment_industry:ink \
\
createaddition:bioethanol createaddition:flowing_bioethanol createaddition:flowing_seed_oil createaddition:seed_oil \
\
delightfulcreators:apple_cider_block delightfulcreators:melon_juice_block \
\
enderio:cloud_seed enderio:cloud_seed_concentrated enderio:dew_of_the_void enderio:fire_water enderio:hootch enderio:liquid_sunshine enderio:nutrient_distillation enderio:rocket_fuel enderio:vapor_of_levity enderio:xp_juice \
\
growthcraft_apples:fluid_applecider_apple_cider_ethereal growthcraft_apples:fluid_applecider_apple_cider_extended growthcraft_apples:fluid_applecider_apple_cider_fermented growthcraft_apples:fluid_applecider_apple_cider_intoxicated growthcraft_apples:fluid_applecider_apple_cider_poisoned growthcraft_apples:fluid_applecider_apple_cider_potent growthcraft_apples:fluid_applecider_apple_cider_potentextended growthcraft_apples:fluid_applecider_apple_juice \
\
immersiveengineering:acetaldehyde_fluid_block immersiveengineering:ethanol_fluid_block immersiveengineering:herbicide_fluid_block immersiveengineering:phenolic_resin_fluid_block immersiveengineering:plantoil_fluid_block immersiveengineering:redstone_acid_fluid_block \
\
littletiles:colored_water littletiles:colored_water_flowing \
\
milk:milk_fluid_block \
\
nyx:lunar_water \
\
sauce:source_fluid_block \
\
securitycraft:fake_water_block securitycraft:flowing_fake_water_block \
\
sliceanddice:fertilizer sliceanddice:flowing_fertilizer \
\
spelunkery:spring_water \
\
streams:river/tile.water/-1/-2 streams:river/tile.water/-1/2 streams:river/tile.water/-2/-1 streams:river/tile.water/-2/-2 streams:river/tile.water/-2/0 streams:river/tile.water/-2/1 streams:river/tile.water/-2/2 streams:river/tile.water/0/-2 streams:river/tile.water/0/0 streams:river/tile.water/0/2 streams:river/tile.water/1/-2 streams:river/tile.water/1/2 streams:river/tile.water/2/-1 streams:river/tile.water/2/-2 streams:river/tile.water/2/0 streams:river/tile.water/2/1 streams:river/tile.water/2/2 \
\
supplementaries:lumisene \
\
tconstruct:blood_fluid tconstruct:blueslime tconstruct:earth_slime_fluid tconstruct:ender_slime_fluid tconstruct:honey_fluid tconstruct:liquid_soul_fluid tconstruct:milk tconstruct:molten_amethyst_fluid tconstruct:molten_diamond_fluid tconstruct:molten_emerald_fluid tconstruct:purpleslime tconstruct:sky_slime_fluid tconstruct:venom_fluid \
\
tfc:fluid/river_water tfc:fluid/salt_water tfc:fluid/spring_water
# Ice
block.32004 = ice frosted_ice \
tags_transparent_ice \
\
aether:frosted_ice \
\
burnt:black_ice burnt:black_ice_break \
\
chisel:array/ice chisel:braid/ice chisel:chaotic_bricks/ice chisel:chaotic_medium/ice chisel:chaotic_small/ice chisel:circular/ice chisel:cracked/ice chisel:cracked_bricks/ice chisel:cut/ice chisel:dent/ice chisel:encased_bricks/ice chisel:french/ice chisel:ice chisel:ice1 chisel:ice2 chisel:icepillar chisel:jellybean/ice chisel:large_tile/ice chisel:layer/ice chisel:mosaic/ice chisel:ornate/ice chisel:panel/ice chisel:pillar/ice chisel:prism/ice chisel:raw/ice chisel:road/ice chisel:slant/ice chisel:small_bricks/ice chisel:soft_bricks/ice chisel:solid_bricks/ice chisel:tiles_medium/ice chisel:tiles_small/ice chisel:triple_bricks/ice chisel:twist/ice chisel:weaver/ice chisel:zag/ice \
\
chiselsandbits:chiseled_ice \
\
ecologics:thin_ice \
\
iceandfire:egginice \
\
immersive_weathering:frost immersive_weathering:thin_ice \
\
rare-ice:rare_ice \
\
securitycraft:reinforced_ice \
\
tfc:ice_pile tfc:icicle tfc:sea_ice \
\
yungscavebiomes:ice_sheet
# Glass
block.32008 = glass \
\
allthecompressed:glass_1x allthecompressed:glass_2x allthecompressed:glass_3x allthecompressed:glass_4x allthecompressed:glass_5x allthecompressed:glass_6x allthecompressed:glass_7x allthecompressed:glass_8x allthecompressed:glass_9x \
\
betternether:cincinnasite_frame \
\
blockbox:rough_glass \
\
blockus:beveled_glass \
\
born_in_chaos_v1:dark_stained_glass \
\
chipped:arched_leaded_glass_pillar chipped:circle_oak_glass chipped:clear_leaded_glass chipped:fancy_leaded_glass chipped:large_diamond_leaded_glass chipped:lead_woven_glass chipped:oak_bared_glass chipped:oak_bordered_glass chipped:oak_diamond_bordered_glass chipped:oak_horizontal_lined_glass chipped:oak_large_diamond_glass chipped:oak_line_bared_glass chipped:oak_ornate_bared_glass chipped:oak_snowflake_glass chipped:oak_woven_glass chipped:ornate_leaded_glass chipped:raster_leaded_glass chipped:small_diamond_leaded_glass chipped:square_leaded_glass chipped:square_oak_glass chipped:vertical_leaded_glass \
\
chisel:bubble/glass chisel:chinese/glass chisel:chinese2/glass chisel:chrono/glass chisel:dungeon/glass chisel:ironfencemodern/glass chisel:japanese/glass chisel:japanese2/glass chisel:light/glass chisel:noborder/glass chisel:ornatesteel/glass chisel:ornatesteel_old/glass chisel:screen/glass chisel:shale/glass chisel:steelframe/glass chisel:stone/glass chisel:streak/glass chisel:thick/glass chisel:thin/glass \
\
chiselsandbits:chiseled_glass \
\
createdeco:andesite_window createdeco:brass_window createdeco:copper_window createdeco:industrial_iron_window createdeco:iron_window createdeco:zinc_window \
\
growthcraft_cellar:culture_jar \
\
hearth_and_home:barred_glass \
\
immersive_weathering:frosty_glass \
\
mocreatures:gleaming_glass \
\
nyx:crystal \
\
securitycraft:reinforced_glass \
\
supplementaries:bubble_block \
\
tconstruct:clear_glass tconstruct:scorched_fuel_gauge tconstruct:scorched_glass tconstruct:scorched_ingot_gauge tconstruct:scorched_soul_glass tconstruct:seared_fuel_gauge tconstruct:seared_glass tconstruct:seared_ingot_gauge tconstruct:seared_soul_glass tconstruct:soul_glass \
\
tfc:poured_glass
# Glass Without ACL Connected Glass
block.32009 = create:tiled_glass create:horizontal_framed_glass create:framed_glass create:vertical_framed_glass create:acacia_window create:bamboo_window create:cherry_window create:crimson_window create:dark_oak_window create:industrial_iron_window create:jungle_window create:mangrove_window create:oak_window create:ornate_iron_window create:spruce_window create:warped_window \
tags_neoforge_glass \
\
createframed:andesite_alloy_window createframed:black_cardboard_window createframed:blue_cardboard_window createframed:brass_window createframed:brown_cardboard_window createframed:cardboard_window createframed:copper_window createframed:cyan_cardboard_window createframed:gray_cardboard_window createframed:green_cardboard_window createframed:light_blue_cardboard_window createframed:light_gray_cardboard_window createframed:lime_cardboard_window createframed:magenta_cardboard_window createframed:orange_cardboard_window createframed:pink_cardboard_window createframed:purple_cardboard_window createframed:red_cardboard_window createframed:white_cardboard_window createframed:yellow_cardboard_window createframed:zinc_window \
\
diagonalwindows:createframed/blue_cardboard_window_pane diagonalwindows:createframed/brass_window_pane diagonalwindows:createframed/brown_cardboard_window_pane diagonalwindows:createframed/copper_window_pane diagonalwindows:createframed/cyan_cardboard_window_pane diagonalwindows:createframed/gray_cardboard_window_pane diagonalwindows:createframed/green_cardboard_window_pane diagonalwindows:createframed/light_blue_cardboard_window_pane diagonalwindows:createframed/light_gray_cardboard_window_pane diagonalwindows:createframed/lime_cardboard_window_pane diagonalwindows:createframed/magenta_cardboard_window_pane diagonalwindows:createframed/orange_cardboard_window_pane diagonalwindows:createframed/pink_cardboard_window_pane diagonalwindows:createframed/purple_cardboard_window_pane diagonalwindows:createframed/red_cardboard_window_pane diagonalwindows:createframed/white_cardboard_window_pane diagonalwindows:createframed/yellow_cardboard_window_pane diagonalwindows:createframed/zinc_window_pane
# Glass Pane
block.32012 = glass_pane \
\
blockbox:rough_glass_pane \
\
blockus:beveled_glass_pane \
\
born_in_chaos_v1:dark_stained_glass_panel \
\
butcher:filled_jar butcher:jar \
\
chipped:arched_leaded_glass_pane_pillar chipped:circle_oak_glass_pane chipped:clear_leaded_glass_pane chipped:fancy_leaded_glass_pane chipped:large_diamond_leaded_glass_pane chipped:lead_woven_glass_pane chipped:oak_bared_glass_pane chipped:oak_bordered_glass_pane chipped:oak_diamond_bordered_glass_pane chipped:oak_horizontal_lined_glass_pane chipped:oak_large_diamond_glass_pane chipped:oak_line_bared_glass_pane chipped:oak_ornate_bared_glass_pane chipped:oak_snowflake_glass_pane chipped:oak_woven_glass_pane chipped:ornate_leaded_glass_pane chipped:raster_leaded_glass_pane chipped:small_diamond_leaded_glass_pane chipped:smooth_inlayed_ice chipped:square_leaded_glass_pane chipped:square_oak_glass_pane chipped:vertical_leaded_glass_pane \
\
createdeco:andesite_window_pane createdeco:brass_window_pane createdeco:copper_window_pane createdeco:industrial_iron_window_pane createdeco:iron_window_pane createdeco:zinc_window_pane \
\
diagonalwindows:blockus/beveled_glass_pane diagonalwindows:createframed/andesite_alloy_window_pane diagonalwindows:createframed/andesite_alloy_window_panew diagonalwindows:createframed/black_cardboard_window_pane diagonalwindows:createframed/cardboard_window_pane diagonalwindows:minecraft/glass_pane \
\
hearth_and_home:barred_glass_pane \
\
immersive_weathering:frosty_glass_pane \
\
missingwilds:food_jar missingwilds:jar missingwilds:potion_jar missingwilds:tinted_firefly_jar missingwilds:tinted_food_jar missingwilds:tinted_jar missingwilds:tinted_potion_jar \
\
securitycraft:inventory_scanner_field securitycraft:laser securitycraft:reinforced_glass_pane \
\
tconstruct:clear_glass_pane tconstruct:scorched_glass_pane tconstruct:scorched_soul_glass_pane tconstruct:seared_glass_pane tconstruct:seared_soul_glass_pane tconstruct:soul_glass_pane
# Glass Pane Without ACL Connected Glass
block.32013 = create:framed_glass_door create:framed_glass_trapdoor create:tiled_glass_pane create:framed_glass_pane create:horizontal_framed_glass_pane create:vertical_framed_glass_pane create:acacia_window_pane create:bamboo_window_pane create:cherry_window_pane create:crimson_window_pane create:dark_oak_window_pane create:industrial_iron_window_pane create:jungle_window_pane create:mangrove_window_pane create:oak_window_pane create:ornate_iron_window_pane create:spruce_window_pane create:warped_window_pane \
tags_neoforge_glass_panes \
\
createframed:andesite_alloy_window_pane createframed:black_cardboard_window_pane createframed:blue_cardboard_window_pane createframed:brass_window_pane createframed:brown_cardboard_window_pane createframed:cardboard_window_pane createframed:copper_window_pane createframed:cyan_cardboard_window_pane createframed:gray_cardboard_window_pane createframed:green_cardboard_window_pane createframed:light_blue_cardboard_window_pane createframed:light_gray_cardboard_window_pane createframed:lime_cardboard_window_pane createframed:magenta_cardboard_window_pane createframed:orange_cardboard_window_pane createframed:pink_cardboard_window_pane createframed:purple_cardboard_window_pane createframed:red_cardboard_window_pane createframed:white_cardboard_window_pane createframed:yellow_cardboard_window_pane createframed:zinc_window_pane
# Beacon
block.32016 = beacon \
\
betterend:amaranita_fur betterend:gold_chandelier betterend:iron_chandelier betterend:lumecorn betterend:terminite_chandelier betterend:thallasium_chandelier \
\
bosses_of_mass_destruction:levitation_block bosses_of_mass_destruction:mob_ward \
\
cinderscapes:umbral_flesh_block \
\
spelunkery:light_blue_glowstick
#endif
### Last updated: February 10, 2026, 11:05 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# Purple Stained Glass Panes
block.31021 = purple_stained_glass_pane \
\
betternether:obsidian_glass_pane betternether:quartz_glass_framed_pane_purple betternether:quartz_glass_pane_purple \
\
blockus:purple_beveled_glass_pane \
\
born_in_chaos_v1:purple_stained_glass_panel \
\
chipped:arched_purple_stained_glass_pane_pillar chipped:circular_purple_stained_glass_pane chipped:fancy_purple_stained_glass_pane chipped:large_diamond_purple_stained_glass_pane chipped:ornate_purple_stained_glass_pane chipped:raster_purple_stained_glass_pane chipped:small_purple_stained_glass_pane chipped:square_purple_stained_glass_pane chipped:tiled_purple_stained_glass_pane chipped:vertical_stiped_purple_stained_glass_pane chipped:woven_purple_stained_glass_pane \
\
chisel:glasspanedyedpurple \
\
create:purple_nixie_tube \
\
createframed:horizontal_purple_stained_framed_glass_pane createframed:purple_stained_framed_glass_door createframed:purple_stained_framed_glass_pane createframed:purple_stained_framed_glass_trapdoor createframed:purple_stained_tiled_glass_pane createframed:vertical_purple_stained_framed_glass_pane \
\
diagonalwindows:blockus/purple_beveled_glass_pane diagonalwindows:createframed/horizontal_purple_stained_framed_glass_pane diagonalwindows:createframed/purple_stained_framed_glass_pane diagonalwindows:createframed/purple_stained_tiled_glass_pane diagonalwindows:createframed/vertical_purple_stained_framed_glass_pane diagonalwindows:mcwwindows/purple_mosaic_glass_pane diagonalwindows:minecraft/purple_stained_glass_pane \
\
hearth_and_home:purple_stained_barred_glass_pane \
\
mcwwindows:purple_mosaic_glass_pane \
\
securitycraft:reinforced_purple_stained_glass_pane \
\
tconstruct:purple_clear_stained_glass_pane
# Blue Stained Glass
block.31022 = blue_stained_glass \
\
betterend:umbrella_tree_membrane:color=5 betterend:umbrella_tree_membrane:color=6 betterend:umbrella_tree_membrane:color=7 \
\
betternether:quartz_glass_blue betternether:quartz_glass_framed_blue \
\
blockus:blue_beveled_glass \
\
chipped:arched_blue_stained_glass_pillar chipped:circular_blue_stained_glass chipped:fancy_blue_stained_glass chipped:large_diamond_blue_stained_glass chipped:ornate_blue_stained_glass chipped:raster_blue_stained_glass chipped:small_blue_stained_glass chipped:square_blue_stained_glass chipped:tiled_blue_stained_glass chipped:vertical_stiped_blue_stained_glass chipped:woven_blue_stained_glass \
\
chisel:glassdyedblue \
\
createframed:blue_stained_framed_glass createframed:blue_stained_tiled_glass createframed:horizontal_blue_stained_framed_glass createframed:vertical_blue_stained_framed_glass \
\
hearth_and_home:blue_stained_barred_glass \
\
mcwwindows:blue_mosaic_glass \
\
quark:crystal:variant=crystal_indigo \
\
seasonsextras:blue_greenhouse_glass \
\
securitycraft:reinforced_blue_stained_glass \
\
tconstruct:blue_clear_stained_glass \
\
tfc:blue_poured_glass
# Blue Stained Glass Panes
block.31023 = blue_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_blue betternether:quartz_glass_pane_blue \
\
blockus:blue_beveled_glass_pane \
\
chipped:arched_blue_stained_glass_pane_pillar chipped:circular_blue_stained_glass_pane chipped:fancy_blue_stained_glass_pane chipped:large_diamond_blue_stained_glass_pane chipped:ornate_blue_stained_glass_pane chipped:raster_blue_stained_glass_pane chipped:small_blue_stained_glass_pane chipped:square_blue_stained_glass_pane chipped:tiled_blue_stained_glass_pane chipped:vertical_stiped_blue_stained_glass_pane chipped:woven_blue_stained_glass_pane \
\
chisel:glasspanedyedblue \
\
create:blue_nixie_tube \
\
createframed:blue_stained_framed_glass_door createframed:blue_stained_framed_glass_pane createframed:blue_stained_framed_glass_trapdoor createframed:blue_stained_tiled_glass_pane createframed:horizontal_blue_stained_framed_glass_pane createframed:vertical_blue_stained_framed_glass_pane \
\
diagonalwindows:blockus/blue_beveled_glass_pane diagonalwindows:createframed/blue_stained_framed_glass_pane diagonalwindows:createframed/blue_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_blue_stained_framed_glass_pane diagonalwindows:createframed/vertical_blue_stained_framed_glass_pane diagonalwindows:mcwwindows/blue_mosaic_glass_pane diagonalwindows:minecraft/blue_stained_glass_pane \
\
hearth_and_home:blue_stained_barred_glass_pane \
\
mcwwindows:blue_mosaic_glass_pane \
\
quark:crystal_pane:variant=crystal_indigo \
\
securitycraft:reinforced_blue_stained_glass_pane \
\
tconstruct:blue_clear_stained_glass_pane
# Brown Stained Glass
block.31024 = brown_stained_glass \
\
betternether:quartz_glass_brown betternether:quartz_glass_framed_brown \
\
blockus:brown_beveled_glass \
\
chipped:arched_brown_stained_glass_pillar chipped:circular_brown_stained_glass chipped:fancy_brown_stained_glass chipped:large_diamond_brown_stained_glass chipped:ornate_brown_stained_glass chipped:raster_brown_stained_glass chipped:small_brown_stained_glass chipped:square_brown_stained_glass chipped:tiled_brown_stained_glass chipped:vertical_stiped_brown_stained_glass chipped:woven_brown_stained_glass \
\
chisel:glassdyedbrown \
\
cinderscapes:crystalline_smoky_quartz \
\
createframed:brown_stained_framed_glass createframed:brown_stained_tiled_glass createframed:horizontal_brown_stained_framed_glass createframed:vertical_brown_stained_framed_glass \
\
hearth_and_home:brown_stained_barred_glass \
\
immersive_weathering:vitrified_sand \
\
immersiveengineering:slag_glass \
\
mcwwindows:brown_mosaic_glass \
\
seasonsextras:brown_greenhouse_glass \
\
securitycraft:reinforced_brown_stained_glass \
\
tconstruct:brown_clear_stained_glass \
\
tfc:brown_poured_glass
# Brown Stained Glass Panes
block.31025 = brown_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_brown betternether:quartz_glass_pane_brown \
\
blockus:brown_beveled_glass_pane \
\
chipped:arched_brown_stained_glass_pane_pillar chipped:circular_brown_stained_glass_pane chipped:fancy_brown_stained_glass_pane chipped:large_diamond_brown_stained_glass_pane chipped:ornate_brown_stained_glass_pane chipped:raster_brown_stained_glass_pane chipped:small_brown_stained_glass_pane chipped:square_brown_stained_glass_pane chipped:tiled_brown_stained_glass_pane chipped:vertical_stiped_brown_stained_glass_pane chipped:woven_brown_stained_glass_pane \
\
chisel:glasspanedyedbrown \
\
create:brown_nixie_tube \
\
createframed:brown_stained_framed_glass_door createframed:brown_stained_framed_glass_pane createframed:brown_stained_framed_glass_trapdoor createframed:brown_stained_tiled_glass_pane createframed:horizontal_brown_stained_framed_glass_pane createframed:vertical_brown_stained_framed_glass_pane \
\
diagonalwindows:blockus/brown_beveled_glass_pane diagonalwindows:createframed/brown_stained_framed_glass_pane diagonalwindows:createframed/brown_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_brown_stained_framed_glass_pane diagonalwindows:createframed/vertical_brown_stained_framed_glass_pane diagonalwindows:mcwwindows/brown_mosaic_glass_pane diagonalwindows:minecraft/brown_stained_glass_pane \
\
hearth_and_home:brown_stained_barred_glass_pane \
\
mcwwindows:brown_mosaic_glass_pane \
\
securitycraft:reinforced_brown_stained_glass_pane \
\
tconstruct:brown_clear_stained_glass_pane
# Green Stained Glass
block.31026 = green_stained_glass \
\
betternether:quartz_glass_framed_green betternether:quartz_glass_green \
\
blockus:green_beveled_glass \
\
chipped:arched_green_stained_glass_pillar chipped:circular_green_stained_glass chipped:fancy_green_stained_glass chipped:large_diamond_green_stained_glass chipped:ornate_green_stained_glass chipped:raster_green_stained_glass chipped:small_green_stained_glass chipped:square_green_stained_glass chipped:tiled_green_stained_glass chipped:vertical_stiped_green_stained_glass chipped:woven_green_stained_glass \
\
chisel:glassdyedgreen \
\
createframed:green_stained_framed_glass createframed:green_stained_tiled_glass createframed:horizontal_green_stained_framed_glass createframed:vertical_green_stained_framed_glass \
\
hearth_and_home:green_stained_barred_glass \
\
iceandfire:myrmex_jungle_resin_glass \
\
mcwwindows:green_mosaic_glass \
\
seasonsextras:green_greenhouse_glass \
\
securitycraft:reinforced_green_stained_glass \
\
tconstruct:green_clear_stained_glass \
\
tfc:green_poured_glass
# Green Stained Glass Panes
block.31027 = green_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_green betternether:quartz_glass_pane_green \
\
blockus:green_beveled_glass_pane \
\
chipped:arched_green_stained_glass_pane_pillar chipped:circular_green_stained_glass_pane chipped:fancy_green_stained_glass_pane chipped:large_diamond_green_stained_glass_pane chipped:ornate_green_stained_glass_pane chipped:raster_green_stained_glass_pane chipped:small_green_stained_glass_pane chipped:square_green_stained_glass_pane chipped:tiled_green_stained_glass_pane chipped:vertical_stiped_green_stained_glass_pane chipped:woven_green_stained_glass_pane \
\
chisel:glasspanedyedgreen \
\
create:green_nixie_tube \
\
createframed:green_stained_framed_glass_door createframed:green_stained_framed_glass_pane createframed:green_stained_framed_glass_trapdoor createframed:green_stained_tiled_glass_pane createframed:horizontal_green_stained_framed_glass_pane createframed:vertical_green_stained_framed_glass_pane \
\
diagonalwindows:blockus/green_beveled_glass_pane diagonalwindows:createframed/green_stained_framed_glass_pane diagonalwindows:createframed/green_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_green_stained_framed_glass_pane diagonalwindows:createframed/vertical_green_stained_framed_glass_pane diagonalwindows:mcwwindows/green_mosaic_glass_pane diagonalwindows:minecraft/green_stained_glass_pane \
\
hearth_and_home:green_stained_barred_glass_pane \
\
mcwwindows:green_mosaic_glass_pane \
\
securitycraft:reinforced_green_stained_glass_pane \
\
tconstruct:green_clear_stained_glass_pane
# Red Stained Glass
block.31028 = red_stained_glass \
\
betternether:quartz_glass_framed_red betternether:quartz_glass_red \
\
blockus:red_beveled_glass \
\
born_in_chaos_v1:scarlet_stained_glass \
\
chipped:arched_red_stained_glass_pillar chipped:circular_red_stained_glass chipped:fancy_red_stained_glass chipped:large_diamond_red_stained_glass chipped:ornate_red_stained_glass chipped:raster_red_stained_glass chipped:small_red_stained_glass chipped:square_red_stained_glass chipped:tiled_red_stained_glass chipped:vertical_stiped_red_stained_glass chipped:woven_red_stained_glass \
\
chisel:glassdyedred \
\
createframed:horizontal_red_stained_framed_glass createframed:red_stained_framed_glass createframed:red_stained_tiled_glass createframed:vertical_red_stained_framed_glass \
\
hearth_and_home:red_stained_barred_glass \
\
mcwwindows:red_mosaic_glass \
\
naturalist:crimson_froglass \
\
quark:crystal:variant=crystal_red \
\
seasonsextras:red_greenhouse_glass \
\
securitycraft:reinforced_red_stained_glass \
\
tconstruct:red_clear_stained_glass \
\
tfc:red_poured_glass
# Red Stained Glass Panes
block.31029 = red_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_red betternether:quartz_glass_pane_red \
\
blockus:red_beveled_glass_pane \
\
born_in_chaos_v1:cursed_scarlet_ornate_glass_pane born_in_chaos_v1:scarlet_stained_glass_panel \
\
chipped:arched_red_stained_glass_pane_pillar chipped:circular_red_stained_glass_pane chipped:fancy_red_stained_glass_pane chipped:large_diamond_red_stained_glass_pane chipped:ornate_red_stained_glass_pane chipped:raster_red_stained_glass_pane chipped:small_red_stained_glass_pane chipped:square_red_stained_glass_pane chipped:tiled_red_stained_glass_pane chipped:vertical_stiped_red_stained_glass_pane chipped:woven_red_stained_glass_pane \
\
chisel:glasspanedyedred \
\
create:red_nixie_tube \
\
createframed:horizontal_red_stained_framed_glass_pane createframed:red_stained_framed_glass_door createframed:red_stained_framed_glass_pane createframed:red_stained_framed_glass_trapdoor createframed:red_stained_tiled_glass_pane createframed:vertical_red_stained_framed_glass_pane \
\
diagonalwindows:blockus/red_beveled_glass_pane diagonalwindows:createframed/horizontal_red_stained_framed_glass_pane diagonalwindows:createframed/red_stained_framed_glass_pane diagonalwindows:createframed/red_stained_tiled_glass_pane diagonalwindows:createframed/vertical_red_stained_framed_glass_pane diagonalwindows:mcwwindows/red_mosaic_glass_pane diagonalwindows:minecraft/red_stained_glass_pane \
\
hearth_and_home:red_stained_barred_glass_pane \
\
mcwwindows:red_mosaic_glass_pane \
\
naturalist:crimson_froglass_pane \
\
quark:crystal_pane:variant=crystal_red \
\
securitycraft:reinforced_red_stained_glass_pane \
\
tconstruct:red_clear_stained_glass_pane
# Black Stained Glass
# Use if your glass is multi-colored, black will preserve the lighting through the glass texture.
block.31030 = black_stained_glass \
\
betternether:quartz_glass_black betternether:quartz_glass_framed_black \
\
biomeswevegone:black_ice biomeswevegone:borealis_ice \
\
blockus:black_beveled_glass blockus:rainbow_beveled_glass blockus:rainbow_glass \
\
chipped:arched_black_stained_glass_pillar chipped:circular_black_stained_glass chipped:fancy_black_stained_glass chipped:large_diamond_black_stained_glass chipped:ornate_black_stained_glass chipped:raster_black_stained_glass chipped:small_black_stained_glass chipped:square_black_stained_glass chipped:tiled_black_stained_glass chipped:vertical_stiped_black_stained_glass chipped:woven_black_stained_glass \
\
chisel:glassdyedblack \
\
create:weathered_iron_window \
\
createframed:black_stained_framed_glass createframed:black_stained_tiled_glass createframed:horizontal_black_stained_framed_glass createframed:vertical_black_stained_framed_glass \
\
hearth_and_home:black_stained_barred_glass \
\
mcwwindows:black_mosaic_glass mcwwindows:one_way_glass \
\
quark:crystal:variant=crystal_black \
\
seasonsextras:black_greenhouse_glass \
\
securitycraft:reinforced_black_stained_glass \
\
tconstruct:black_clear_stained_glass tconstruct:soulsteel_block \
\
tfc:black_poured_glass \
\
twilightforest:auroralized_glass
# Black Stained Glass Panes
block.31031 = black_stained_glass_pane \
\
betternether:quartz_glass_framed_pane_black betternether:quartz_glass_pane_black \
\
blockus:black_beveled_glass_pane blockus:rainbow_beveled_glass_pane blockus:rainbow_glass_pane \
\
chipped:arched_black_stained_glass_pane_pillar chipped:circular_black_stained_glass_pane chipped:fancy_black_stained_glass_pane chipped:large_diamond_black_stained_glass_pane chipped:ornate_black_stained_glass_pane chipped:raster_black_stained_glass_pane chipped:small_black_stained_glass_pane chipped:square_black_stained_glass_pane chipped:tiled_black_stained_glass_pane chipped:vertical_stiped_black_stained_glass_pane chipped:woven_black_stained_glass_pane \
\
chisel:glasspanedyedblack \
\
create:black_nixie_tube create:weathered_iron_window_pane \
\
createframed:black_stained_framed_glass_door createframed:black_stained_framed_glass_pane createframed:black_stained_framed_glass_trapdoor createframed:black_stained_tiled_glass_pane createframed:horizontal_black_stained_framed_glass_pane createframed:vertical_black_stained_framed_glass_pane \
\
diagonalwindows:blockus/black_beveled_glass_pane diagonalwindows:blockus/rainbow_beveled_glass_pane diagonalwindows:blockus/rainbow_glass_pane diagonalwindows:create/weathered_iron_window_pane diagonalwindows:createframed/black_stained_framed_glass_pane diagonalwindows:createframed/black_stained_tiled_glass_pane diagonalwindows:createframed/horizontal_black_stained_framed_glass_pane diagonalwindows:createframed/vertical_black_stained_framed_glass_pane diagonalwindows:mcwwindows/black_mosaic_glass_pane diagonalwindows:minecraft/black_stained_glass_pane \
\
hearth_and_home:black_stained_barred_glass_pane \
\
immersiveengineering:alu_window immersiveengineering:reinforced_window immersiveengineering:steel_window immersiveengineering:treated_window \
\
mcwwindows:black_mosaic_glass_pane mcwwindows:one_way_glass_pane \
\
missingwilds:black_stained_food_jar missingwilds:black_stained_jar missingwilds:black_stained_potion_jar missingwilds:blue_stained_food_jar missingwilds:blue_stained_jar missingwilds:blue_stained_potion_jar missingwilds:brown_stained_food_jar missingwilds:brown_stained_jar missingwilds:brown_stained_potion_jar missingwilds:cyan_stained_food_jar missingwilds:cyan_stained_jar missingwilds:cyan_stained_potion_jar missingwilds:gray_stained_food_jar missingwilds:gray_stained_jar missingwilds:gray_stained_potion_jar missingwilds:green_stained_food_jar missingwilds:green_stained_jar missingwilds:green_stained_potion_jar missingwilds:light_blue_stained_food_jar missingwilds:light_blue_stained_jar missingwilds:light_blue_stained_potion_jar missingwilds:light_gray_stained_food_jar missingwilds:light_gray_stained_jar missingwilds:light_gray_stained_potion_jar missingwilds:lime_stained_food_jar missingwilds:lime_stained_jar missingwilds:lime_stained_potion_jar missingwilds:magenta_stained_food_jar missingwilds:magenta_stained_jar missingwilds:magenta_stained_potion_jar missingwilds:orange_stained_food_jar missingwilds:orange_stained_jar missingwilds:orange_stained_potion_jar missingwilds:pink_stained_food_jar missingwilds:pink_stained_jar missingwilds:pink_stained_potion_jar missingwilds:purple_stained_food_jar missingwilds:purple_stained_jar missingwilds:purple_stained_potion_jar missingwilds:red_stained_food_jar missingwilds:red_stained_jar missingwilds:red_stained_potion_jar missingwilds:white_stained_food_jar missingwilds:white_stained_jar missingwilds:white_stained_potion_jar missingwilds:yellow_stained_food_jar missingwilds:yellow_stained_jar missingwilds:yellow_stained_potion_jar \
\
quark:crystal_pane:variant=crystal_black \
\
securitycraft:reinforced_black_stained_glass_pane \
\
tconstruct:black_clear_stained_glass_pane
# Water
block.32000 = water bubble_column \
\
ad_astra:cryo_fuel ad_astra:flowing_cryo_fuel ad_astra:flowing_fuel ad_astra:flowing_oil ad_astra:fuel ad_astra:oil \
\
aether:aether_portal \
\
aquaacrobatics:bubble_column \
\
betterend:vent_bubble_column \
\
biomesoplenty:blood \
\
burnt:flowing_hot_spring_water burnt:geyser_block burnt:geyser_block_medium burnt:geyser_shoot burnt:geyser_starter burnt:geyser_starter_medium burnt:hot_spring_water \
\
butcher:brinesolution butcher:chlorine \
\
chiselsandbits:chiseled_fluid \
\
create_enchantment_industry:flowing_ink create_enchantment_industry:ink \
\
createaddition:bioethanol createaddition:flowing_bioethanol createaddition:flowing_seed_oil createaddition:seed_oil \
\
delightfulcreators:apple_cider_block delightfulcreators:melon_juice_block \
\
enderio:cloud_seed enderio:cloud_seed_concentrated enderio:dew_of_the_void enderio:fire_water enderio:hootch enderio:liquid_sunshine enderio:nutrient_distillation enderio:rocket_fuel enderio:vapor_of_levity enderio:xp_juice \
\
growthcraft_apples:fluid_applecider_apple_cider_ethereal growthcraft_apples:fluid_applecider_apple_cider_extended growthcraft_apples:fluid_applecider_apple_cider_fermented growthcraft_apples:fluid_applecider_apple_cider_intoxicated growthcraft_apples:fluid_applecider_apple_cider_poisoned growthcraft_apples:fluid_applecider_apple_cider_potent growthcraft_apples:fluid_applecider_apple_cider_potentextended growthcraft_apples:fluid_applecider_apple_juice \
\
immersiveengineering:acetaldehyde_fluid_block immersiveengineering:ethanol_fluid_block immersiveengineering:herbicide_fluid_block immersiveengineering:phenolic_resin_fluid_block immersiveengineering:plantoil_fluid_block immersiveengineering:redstone_acid_fluid_block \
\
littletiles:colored_water littletiles:colored_water_flowing \
\
milk:milk_fluid_block \
\
nyx:lunar_water \
\
sauce:source_fluid_block \
\
securitycraft:fake_water_block securitycraft:flowing_fake_water_block \
\
sliceanddice:fertilizer sliceanddice:flowing_fertilizer \
\
spelunkery:spring_water \
\
streams:river/tile.water/-1/-2 streams:river/tile.water/-1/2 streams:river/tile.water/-2/-1 streams:river/tile.water/-2/-2 streams:river/tile.water/-2/0 streams:river/tile.water/-2/1 streams:river/tile.water/-2/2 streams:river/tile.water/0/-2 streams:river/tile.water/0/0 streams:river/tile.water/0/2 streams:river/tile.water/1/-2 streams:river/tile.water/1/2 streams:river/tile.water/2/-1 streams:river/tile.water/2/-2 streams:river/tile.water/2/0 streams:river/tile.water/2/1 streams:river/tile.water/2/2 \
\
supplementaries:lumisene \
\
tconstruct:blood_fluid tconstruct:blueslime tconstruct:earth_slime_fluid tconstruct:ender_slime_fluid tconstruct:honey_fluid tconstruct:liquid_soul_fluid tconstruct:milk tconstruct:molten_amethyst_fluid tconstruct:molten_diamond_fluid tconstruct:molten_emerald_fluid tconstruct:purpleslime tconstruct:sky_slime_fluid tconstruct:venom_fluid \
\
tfc:fluid/river_water tfc:fluid/salt_water tfc:fluid/spring_water
# Ice
block.32004 = ice frosted_ice \
tags_transparent_ice \
\
aether:frosted_ice \
\
burnt:black_ice burnt:black_ice_break \
\
chisel:array/ice chisel:braid/ice chisel:chaotic_bricks/ice chisel:chaotic_medium/ice chisel:chaotic_small/ice chisel:circular/ice chisel:cracked/ice chisel:cracked_bricks/ice chisel:cut/ice chisel:dent/ice chisel:encased_bricks/ice chisel:french/ice chisel:ice chisel:ice1 chisel:ice2 chisel:icepillar chisel:jellybean/ice chisel:large_tile/ice chisel:layer/ice chisel:mosaic/ice chisel:ornate/ice chisel:panel/ice chisel:pillar/ice chisel:prism/ice chisel:raw/ice chisel:road/ice chisel:slant/ice chisel:small_bricks/ice chisel:soft_bricks/ice chisel:solid_bricks/ice chisel:tiles_medium/ice chisel:tiles_small/ice chisel:triple_bricks/ice chisel:twist/ice chisel:weaver/ice chisel:zag/ice \
\
chiselsandbits:chiseled_ice \
\
ecologics:thin_ice \
\
iceandfire:egginice \
\
immersive_weathering:frost immersive_weathering:thin_ice \
\
rare-ice:rare_ice \
\
securitycraft:reinforced_ice \
\
tfc:ice_pile tfc:icicle tfc:sea_ice \
\
yungscavebiomes:ice_sheet
# Glass
block.32008 = glass \
\
allthecompressed:glass_1x allthecompressed:glass_2x allthecompressed:glass_3x allthecompressed:glass_4x allthecompressed:glass_5x allthecompressed:glass_6x allthecompressed:glass_7x allthecompressed:glass_8x allthecompressed:glass_9x \
\
betternether:cincinnasite_frame \
\
blockbox:rough_glass \
\
blockus:beveled_glass \
\
born_in_chaos_v1:dark_stained_glass \
\
chipped:arched_leaded_glass_pillar chipped:circle_oak_glass chipped:clear_leaded_glass chipped:fancy_leaded_glass chipped:large_diamond_leaded_glass chipped:lead_woven_glass chipped:oak_bared_glass chipped:oak_bordered_glass chipped:oak_diamond_bordered_glass chipped:oak_horizontal_lined_glass chipped:oak_large_diamond_glass chipped:oak_line_bared_glass chipped:oak_ornate_bared_glass chipped:oak_snowflake_glass chipped:oak_woven_glass chipped:ornate_leaded_glass chipped:raster_leaded_glass chipped:small_diamond_leaded_glass chipped:square_leaded_glass chipped:square_oak_glass chipped:vertical_leaded_glass \
\
chisel:bubble/glass chisel:chinese/glass chisel:chinese2/glass chisel:chrono/glass chisel:dungeon/glass chisel:ironfencemodern/glass chisel:japanese/glass chisel:japanese2/glass chisel:light/glass chisel:noborder/glass chisel:ornatesteel/glass chisel:ornatesteel_old/glass chisel:screen/glass chisel:shale/glass chisel:steelframe/glass chisel:stone/glass chisel:streak/glass chisel:thick/glass chisel:thin/glass \
\
chiselsandbits:chiseled_glass \
\
createdeco:andesite_window createdeco:brass_window createdeco:copper_window createdeco:industrial_iron_window createdeco:iron_window createdeco:zinc_window \
\
growthcraft_cellar:culture_jar \
\
hearth_and_home:barred_glass \
\
immersive_weathering:frosty_glass \
\
mocreatures:gleaming_glass \
\
nyx:crystal \
\
securitycraft:reinforced_glass \
\
supplementaries:bubble_block \
\
tconstruct:clear_glass tconstruct:scorched_fuel_gauge tconstruct:scorched_glass tconstruct:scorched_ingot_gauge tconstruct:scorched_soul_glass tconstruct:seared_fuel_gauge tconstruct:seared_glass tconstruct:seared_ingot_gauge tconstruct:seared_soul_glass tconstruct:soul_glass \
\
tfc:poured_glass
# Glass Without ACL Connected Glass
block.32009 = create:tiled_glass create:horizontal_framed_glass create:framed_glass create:vertical_framed_glass create:acacia_window create:bamboo_window create:cherry_window create:crimson_window create:dark_oak_window create:industrial_iron_window create:jungle_window create:mangrove_window create:oak_window create:ornate_iron_window create:spruce_window create:warped_window \
tags_neoforge_glass \
\
createframed:andesite_alloy_window createframed:black_cardboard_window createframed:blue_cardboard_window createframed:brass_window createframed:brown_cardboard_window createframed:cardboard_window createframed:copper_window createframed:cyan_cardboard_window createframed:gray_cardboard_window createframed:green_cardboard_window createframed:light_blue_cardboard_window createframed:light_gray_cardboard_window createframed:lime_cardboard_window createframed:magenta_cardboard_window createframed:orange_cardboard_window createframed:pink_cardboard_window createframed:purple_cardboard_window createframed:red_cardboard_window createframed:white_cardboard_window createframed:yellow_cardboard_window createframed:zinc_window \
\
diagonalwindows:createframed/blue_cardboard_window_pane diagonalwindows:createframed/brass_window_pane diagonalwindows:createframed/brown_cardboard_window_pane diagonalwindows:createframed/copper_window_pane diagonalwindows:createframed/cyan_cardboard_window_pane diagonalwindows:createframed/gray_cardboard_window_pane diagonalwindows:createframed/green_cardboard_window_pane diagonalwindows:createframed/light_blue_cardboard_window_pane diagonalwindows:createframed/light_gray_cardboard_window_pane diagonalwindows:createframed/lime_cardboard_window_pane diagonalwindows:createframed/magenta_cardboard_window_pane diagonalwindows:createframed/orange_cardboard_window_pane diagonalwindows:createframed/pink_cardboard_window_pane diagonalwindows:createframed/purple_cardboard_window_pane diagonalwindows:createframed/red_cardboard_window_pane diagonalwindows:createframed/white_cardboard_window_pane diagonalwindows:createframed/yellow_cardboard_window_pane diagonalwindows:createframed/zinc_window_pane
# Glass Pane
block.32012 = glass_pane \
\
blockbox:rough_glass_pane \
\
blockus:beveled_glass_pane \
\
born_in_chaos_v1:dark_stained_glass_panel \
\
butcher:filled_jar butcher:jar \
\
chipped:arched_leaded_glass_pane_pillar chipped:circle_oak_glass_pane chipped:clear_leaded_glass_pane chipped:fancy_leaded_glass_pane chipped:large_diamond_leaded_glass_pane chipped:lead_woven_glass_pane chipped:oak_bared_glass_pane chipped:oak_bordered_glass_pane chipped:oak_diamond_bordered_glass_pane chipped:oak_horizontal_lined_glass_pane chipped:oak_large_diamond_glass_pane chipped:oak_line_bared_glass_pane chipped:oak_ornate_bared_glass_pane chipped:oak_snowflake_glass_pane chipped:oak_woven_glass_pane chipped:ornate_leaded_glass_pane chipped:raster_leaded_glass_pane chipped:small_diamond_leaded_glass_pane chipped:smooth_inlayed_ice chipped:square_leaded_glass_pane chipped:square_oak_glass_pane chipped:vertical_leaded_glass_pane \
\
createdeco:andesite_window_pane createdeco:brass_window_pane createdeco:copper_window_pane createdeco:industrial_iron_window_pane createdeco:iron_window_pane createdeco:zinc_window_pane \
\
diagonalwindows:blockus/beveled_glass_pane diagonalwindows:createframed/andesite_alloy_window_pane diagonalwindows:createframed/andesite_alloy_window_panew diagonalwindows:createframed/black_cardboard_window_pane diagonalwindows:createframed/cardboard_window_pane diagonalwindows:minecraft/glass_pane \
\
hearth_and_home:barred_glass_pane \
\
immersive_weathering:frosty_glass_pane \
\
missingwilds:food_jar missingwilds:jar missingwilds:potion_jar missingwilds:tinted_firefly_jar missingwilds:tinted_food_jar missingwilds:tinted_jar missingwilds:tinted_potion_jar \
\
securitycraft:inventory_scanner_field securitycraft:laser securitycraft:reinforced_glass_pane \
\
tconstruct:clear_glass_pane tconstruct:scorched_glass_pane tconstruct:scorched_soul_glass_pane tconstruct:seared_glass_pane tconstruct:seared_soul_glass_pane tconstruct:soul_glass_pane
# Glass Pane Without ACL Connected Glass
block.32013 = create:framed_glass_door create:framed_glass_trapdoor create:tiled_glass_pane create:framed_glass_pane create:horizontal_framed_glass_pane create:vertical_framed_glass_pane create:acacia_window_pane create:bamboo_window_pane create:cherry_window_pane create:crimson_window_pane create:dark_oak_window_pane create:industrial_iron_window_pane create:jungle_window_pane create:mangrove_window_pane create:oak_window_pane create:ornate_iron_window_pane create:spruce_window_pane create:warped_window_pane \
tags_neoforge_glass_panes \
\
createframed:andesite_alloy_window_pane createframed:black_cardboard_window_pane createframed:blue_cardboard_window_pane createframed:brass_window_pane createframed:brown_cardboard_window_pane createframed:cardboard_window_pane createframed:copper_window_pane createframed:cyan_cardboard_window_pane createframed:gray_cardboard_window_pane createframed:green_cardboard_window_pane createframed:light_blue_cardboard_window_pane createframed:light_gray_cardboard_window_pane createframed:lime_cardboard_window_pane createframed:magenta_cardboard_window_pane createframed:orange_cardboard_window_pane createframed:pink_cardboard_window_pane createframed:purple_cardboard_window_pane createframed:red_cardboard_window_pane createframed:white_cardboard_window_pane createframed:yellow_cardboard_window_pane createframed:zinc_window_pane
# Beacon
block.32016 = beacon \
\
betterend:amaranita_fur betterend:gold_chandelier betterend:iron_chandelier betterend:lumecorn betterend:terminite_chandelier betterend:thallasium_chandelier \
\
bosses_of_mass_destruction:levitation_block bosses_of_mass_destruction:mob_ward \
\
cinderscapes:umbral_flesh_block \
\
spelunkery:light_blue_glowstick
#endif
@@ -1,85 +1,85 @@
### Last updated: February 10, 2026, 11:05 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
#
# ███████╗██╗ ██╗ ██████╗██╗ ██╗ ██╗███████╗██╗██╗ ██╗███████╗ ████████╗ ██████╗ ███████╗██╗ ██╗██████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ █████╗ ██████╗ █████╗ ████████╗ ██████╗██╗ ██╗███████╗███████╗
# ██╔════╝╚██╗██╔╝██╔════╝██║ ██║ ██║██╔════╝██║██║ ██║██╔════╝ ╚══██╔══╝██╔═══██╗ ██╔════╝██║ ██║██╔══██╗██║ ██║██╔═══██╗██╔══██╗██║██╔══██╗ ██╔══██╗██╔══██╗╚══██╔══╝██╔════╝██║ ██║██╔════╝██╔════╝
# █████╗ ╚███╔╝ ██║ ██║ ██║ ██║███████╗██║██║ ██║█████╗ ██║ ██║ ██║ █████╗ ██║ ██║██████╔╝███████║██║ ██║██████╔╝██║███████║ ██████╔╝███████║ ██║ ██║ ███████║█████╗ ███████╗
# ██╔══╝ ██╔██╗ ██║ ██║ ██║ ██║╚════██║██║╚██╗ ██╔╝██╔══╝ ██║ ██║ ██║ ██╔══╝ ██║ ██║██╔═══╝ ██╔══██║██║ ██║██╔══██╗██║██╔══██║ ██╔═══╝ ██╔══██║ ██║ ██║ ██╔══██║██╔══╝ ╚════██║
# ███████╗██╔╝ ██╗╚██████╗███████╗╚██████╔╝███████║██║ ╚████╔╝ ███████╗ ██║ ╚██████╔╝ ███████╗╚██████╔╝██║ ██║ ██║╚██████╔╝██║ ██║██║██║ ██║ ██║ ██║ ██║ ██║ ╚██████╗██║ ██║███████╗███████║
# ╚══════╝╚═╝ ╚═╝ ╚═════╝╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝
#
# This block.properties file is exclusive to Euphoria Patches - Not Compatible with normal Complementary Shaders
# Version 28 - Every time a vanilla block changes, this number will go up. Modded blocks don't affect the version number
# Last Change: more r5.6 moving around
#---------------------------------------------------------------------------------------------------------------------
#
##### IMPORTANT! WHERE TO CONTRIBUTE: #####
# If you want to contribute to the Euphoria Patches modded support library,
# Please ONLY edit the files from GitHub. https://euphoriapatches.com/properties
# See timestamp at the top of the file to ensure the latest version
# PLEASE make sure to also update the addedMods.md file on GitHub to keep the documentation updated
#
#---------------------------------------------------------------------------------------------------------------------
# Hello! Welcome to the Euphoria Patches block library made by the community. Shaders use these IDs to perform block-specific effects.
#
# block.10003: Flowers
# block.10009: Leaves
# block.10005: Foliage
# block.10024: Modded Ores (shader will do its best to detect ore-pixels if "Enable Glowing Ores" setting is on)
# block.10026: Same as 10024 but Netherrack
# block.10028: Same as 10024 but Endstone
# block.20000: No Parallax Occlusion Mapping
#
#---------------------------------------------------------------------------------------------------------------------
#
# IMPORTANT:
# Even-numbered IDs are considered solid for Colored Lighting
# Please place solid blocks ONLY under even IDs and non-solid only under odd IDs! Otherwise, it will look wrong with ACT turned on
# Even IDs prevent ACT light from leaking through, just like one would imagine it would work for full solid blocks
# EXCEPTION: Light Sources can also go to full block IDs
# Is a block you've defined not working like you think it should? See end of file for block render layer explanation.
#
#----------------------------------------------------------------------
#
# ID Info:
# * Note that odd-numbered terrain IDs are considered non-solid for Colored Lighting
# 5XXX - Block Entities
# 1XXXX - Terrain
# 2XXXX - Random stuff
# 21XXX - Modded Light Sources
# 3XXXX - Translucent
# * 31XXX - Translucents with advanced colored light tinting
# * 32XXX - Translucents with alternative shadow calculation
# 4XXXX - Items (see item.properties)
# * 44XXX - Items for colored handheld lighting
# * 45XXX - Items for other Iris exclusive features
# 5XXXX - Entities (see entity.properties)
#
#---------------------------------------------------------------------------------------------------------------------
#
#### Template for Modded Blocks: ####
#
# # Description of the block ID
# block.XXXXX = vanillaId1 vanillaId2 vanillaId3 ... \
# tags_name1 tags_name2 tags_name3 ... \
# \
# modName1:modId1 modName1:modId2 modName1:modId3 ... \
# \
# modName2:modId1 modName2:modId2 modName2:modId3 ... \
# ...
# lastModInThisIDName:modId1 lastModInThisIDName:modId2 lastModInThisIDName:modId3
# # Description of the Next block ID
# block.YYYYY = ...
# ...
# - The last line of a block.XXXXX does not have a "\"
# - XXXXX and YYYYY are placeholders for the actual numbers
# --- IDs should be grouped by mods, for every new mod it should be added in a new line using "\" ---
##### --------------------------------------------------------------------------------------------------------------------- #####
##### --------------------------------------------------------------------------------------------------------------------- #####
##### --------------------------------------------------------------------------------------------------------------------- #####
### Last updated: February 10, 2026, 11:05 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
#
# ███████╗██╗ ██╗ ██████╗██╗ ██╗ ██╗███████╗██╗██╗ ██╗███████╗ ████████╗ ██████╗ ███████╗██╗ ██╗██████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ █████╗ ██████╗ █████╗ ████████╗ ██████╗██╗ ██╗███████╗███████╗
# ██╔════╝╚██╗██╔╝██╔════╝██║ ██║ ██║██╔════╝██║██║ ██║██╔════╝ ╚══██╔══╝██╔═══██╗ ██╔════╝██║ ██║██╔══██╗██║ ██║██╔═══██╗██╔══██╗██║██╔══██╗ ██╔══██╗██╔══██╗╚══██╔══╝██╔════╝██║ ██║██╔════╝██╔════╝
# █████╗ ╚███╔╝ ██║ ██║ ██║ ██║███████╗██║██║ ██║█████╗ ██║ ██║ ██║ █████╗ ██║ ██║██████╔╝███████║██║ ██║██████╔╝██║███████║ ██████╔╝███████║ ██║ ██║ ███████║█████╗ ███████╗
# ██╔══╝ ██╔██╗ ██║ ██║ ██║ ██║╚════██║██║╚██╗ ██╔╝██╔══╝ ██║ ██║ ██║ ██╔══╝ ██║ ██║██╔═══╝ ██╔══██║██║ ██║██╔══██╗██║██╔══██║ ██╔═══╝ ██╔══██║ ██║ ██║ ██╔══██║██╔══╝ ╚════██║
# ███████╗██╔╝ ██╗╚██████╗███████╗╚██████╔╝███████║██║ ╚████╔╝ ███████╗ ██║ ╚██████╔╝ ███████╗╚██████╔╝██║ ██║ ██║╚██████╔╝██║ ██║██║██║ ██║ ██║ ██║ ██║ ██║ ╚██████╗██║ ██║███████╗███████║
# ╚══════╝╚═╝ ╚═╝ ╚═════╝╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝
#
# This block.properties file is exclusive to Euphoria Patches - Not Compatible with normal Complementary Shaders
# Version 28 - Every time a vanilla block changes, this number will go up. Modded blocks don't affect the version number
# Last Change: more r5.6 moving around
#---------------------------------------------------------------------------------------------------------------------
#
##### IMPORTANT! WHERE TO CONTRIBUTE: #####
# If you want to contribute to the Euphoria Patches modded support library,
# Please ONLY edit the files from GitHub. https://euphoriapatches.com/properties
# See timestamp at the top of the file to ensure the latest version
# PLEASE make sure to also update the addedMods.md file on GitHub to keep the documentation updated
#
#---------------------------------------------------------------------------------------------------------------------
# Hello! Welcome to the Euphoria Patches block library made by the community. Shaders use these IDs to perform block-specific effects.
#
# block.10003: Flowers
# block.10009: Leaves
# block.10005: Foliage
# block.10024: Modded Ores (shader will do its best to detect ore-pixels if "Enable Glowing Ores" setting is on)
# block.10026: Same as 10024 but Netherrack
# block.10028: Same as 10024 but Endstone
# block.20000: No Parallax Occlusion Mapping
#
#---------------------------------------------------------------------------------------------------------------------
#
# IMPORTANT:
# Even-numbered IDs are considered solid for Colored Lighting
# Please place solid blocks ONLY under even IDs and non-solid only under odd IDs! Otherwise, it will look wrong with ACT turned on
# Even IDs prevent ACT light from leaking through, just like one would imagine it would work for full solid blocks
# EXCEPTION: Light Sources can also go to full block IDs
# Is a block you've defined not working like you think it should? See end of file for block render layer explanation.
#
#----------------------------------------------------------------------
#
# ID Info:
# * Note that odd-numbered terrain IDs are considered non-solid for Colored Lighting
# 5XXX - Block Entities
# 1XXXX - Terrain
# 2XXXX - Random stuff
# 21XXX - Modded Light Sources
# 3XXXX - Translucent
# * 31XXX - Translucents with advanced colored light tinting
# * 32XXX - Translucents with alternative shadow calculation
# 4XXXX - Items (see item.properties)
# * 44XXX - Items for colored handheld lighting
# * 45XXX - Items for other Iris exclusive features
# 5XXXX - Entities (see entity.properties)
#
#---------------------------------------------------------------------------------------------------------------------
#
#### Template for Modded Blocks: ####
#
# # Description of the block ID
# block.XXXXX = vanillaId1 vanillaId2 vanillaId3 ... \
# tags_name1 tags_name2 tags_name3 ... \
# \
# modName1:modId1 modName1:modId2 modName1:modId3 ... \
# \
# modName2:modId1 modName2:modId2 modName2:modId3 ... \
# ...
# lastModInThisIDName:modId1 lastModInThisIDName:modId2 lastModInThisIDName:modId3
# # Description of the Next block ID
# block.YYYYY = ...
# ...
# - The last line of a block.XXXXX does not have a "\"
# - XXXXX and YYYYY are placeholders for the actual numbers
# --- IDs should be grouped by mods, for every new mod it should be added in a new line using "\" ---
##### --------------------------------------------------------------------------------------------------------------------- #####
##### --------------------------------------------------------------------------------------------------------------------- #####
##### --------------------------------------------------------------------------------------------------------------------- #####
@@ -1,66 +1,66 @@
### Last updated: February 10, 2026, 11:54 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# ██████╗ ███████╗███╗ ██╗██████╗ ███████╗██████╗ ██╗ █████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ██╔══██╗██╔════╝████╗ ██║██╔══██╗██╔════╝██╔══██╗ ██║ ██╔══██╗╚██╗ ██╔╝██╔════╝██╔══██╗██╔════╝
# ██████╔╝█████╗ ██╔██╗ ██║██║ ██║█████╗ ██████╔╝ ██║ ███████║ ╚████╔╝ █████╗ ██████╔╝███████╗
# ██╔══██╗██╔══╝ ██║╚██╗██║██║ ██║██╔══╝ ██╔══██╗ ██║ ██╔══██║ ╚██╔╝ ██╔══╝ ██╔══██╗╚════██║
# ██║ ██║███████╗██║ ╚████║██████╔╝███████╗██║ ██║ ███████╗██║ ██║ ██║ ███████╗██║ ██║███████║
# ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝
# Blocks use what's called render layers. This tells the game how exactly to render a block, for example:
#
# Solid is best used for blocks with no alpha channel in its texture (i.e. stone and oak planks).
# Cutout is best used for blocks with an alpha channel in its texture (i.e. saplings and foliage).
# Cutout Mipped is best used for blocks with has an alpha channel and requires mipmaps. (i.e. leaves).
# Translucent is best used for blocks that requires special handling to accurately handle transparency effects (i.e. stained glass and ice).
#
# Solid: no alpha, mipmaps, no blending
# Cutout: alpha, no mipmaps, no blending
# Cutout Mipped: alpha, mipmaps, no blending
# Translucent: alpha, mipmaps, blending
#
# We can override the default render layer a block uses by defining them down below:
# Use the exclusive define only available with the Euphoria Patcher mod as layers can break on oculus
#if defined EUPHORIA_PATCHES_IRIS || defined IS_ANGELICA && ANGELICA_VERSION >= 200000010
layer.solid = improved_damage:enchanter improved_damage:chipped_enchanter improved_damage:damaged_enchanter improved_damage:broken_enchanter
# Cutout Mipped is gone on 1.21.11, cutout instead always has mipmaps
#if MC_VERSION < 12111
layer.cutout =
layer.cutout_mipped = createdeco:andesite_catwalk createdeco:andesite_catwalk_railing createdeco:andesite_catwalk_stairs createdeco:andesite_mesh_fence createdeco:andesite_support createdeco:andesite_support_wedge createdeco:brass_catwalk createdeco:brass_catwalk_railing createdeco:brass_catwalk_stairs createdeco:brass_mesh_fence createdeco:brass_support createdeco:brass_support_wedge createdeco:copper_catwalk createdeco:copper_catwalk_railing createdeco:copper_catwalk_stairs createdeco:copper_mesh_fence createdeco:copper_support createdeco:copper_support_wedge createdeco:industrial_iron_catwalk createdeco:industrial_iron_catwalk_railing createdeco:industrial_iron_catwalk_stairs createdeco:industrial_iron_mesh_fence createdeco:industrial_iron_support createdeco:industrial_iron_support_wedge createdeco:iron_catwalk createdeco:iron_catwalk_railing createdeco:iron_catwalk_stairs createdeco:iron_mesh_fence createdeco:iron_support createdeco:iron_support_wedge createdeco:zinc_catwalk createdeco:zinc_catwalk_railing createdeco:zinc_catwalk_stairs createdeco:zinc_mesh_fence createdeco:zinc_support createdeco:zinc_support_wedge
#else
layer.cutout = createdeco:andesite_catwalk createdeco:andesite_catwalk_railing createdeco:andesite_catwalk_stairs createdeco:andesite_mesh_fence createdeco:andesite_support createdeco:andesite_support_wedge createdeco:brass_catwalk createdeco:brass_catwalk_railing createdeco:brass_catwalk_stairs createdeco:brass_mesh_fence createdeco:brass_support createdeco:brass_support_wedge createdeco:copper_catwalk createdeco:copper_catwalk_railing createdeco:copper_catwalk_stairs createdeco:copper_mesh_fence createdeco:copper_support createdeco:copper_support_wedge createdeco:industrial_iron_catwalk createdeco:industrial_iron_catwalk_railing createdeco:industrial_iron_catwalk_stairs createdeco:industrial_iron_mesh_fence createdeco:industrial_iron_support createdeco:industrial_iron_support_wedge createdeco:iron_catwalk createdeco:iron_catwalk_railing createdeco:iron_catwalk_stairs createdeco:iron_mesh_fence createdeco:iron_support createdeco:iron_support_wedge createdeco:zinc_catwalk createdeco:zinc_catwalk_railing createdeco:zinc_catwalk_stairs createdeco:zinc_mesh_fence createdeco:zinc_support createdeco:zinc_support_wedge
#endif
#endif
#if defined EUPHORIA_PATCHES_IRIS || defined EUPHORIA_PATCHES_OCULUS && EUPHORIA_PATCHES_OCULUS_VERSION > 10700 || defined IS_ANGELICA && ANGELICA_VERSION >= 200000010
# It breaks on oculus before 1.8.0
layer.translucent = glass glass_pane beacon \
\
betternether:cincinnasite_frame \
\
create:framed_glass_door create:framed_glass_pane create:framed_glass_trapdoor create:horizontal_framed_glass_pane create:tiled_glass_pane create:vertical_framed_glass_pane create:tiled_glass create:horizontal_framed_glass create:framed_glass create:vertical_framed_glass create:acacia_window create:acacia_window_pane create:bamboo_window create:bamboo_window_pane create:cherry_window create:cherry_window_pane create:crimson_window create:crimson_window_pane create:dark_oak_window create:dark_oak_window_pane create:industrial_iron_window create:industrial_iron_window_pane create:jungle_window create:jungle_window_pane create:mangrove_window create:mangrove_window_pane create:oak_window create:oak_window_pane create:ornate_iron_window create:ornate_iron_window_pane create:spruce_window create:spruce_window_pane create:warped_window create:warped_window_pane \
\
createframed:andesite_alloy_window createframed:andesite_alloy_window_pane createframed:brass_window createframed:brass_window_pane createframed:cardboard_window createframed:cardboard_window_pane createframed:copper_window createframed:copper_window_pane createframed:zinc_window createframed:zinc_window_pane \
\
missingwilds:jar \
\
diagonalwindows:blockus/beveled_glass_pane diagonalwindows:createframed/andesite_alloy_window_pane diagonalwindows:createframed/andesite_alloy_window_panew diagonalwindows:createframed/black_cardboard_window_pane diagonalwindows:createframed/cardboard_window_pane diagonalwindows:minecraft/glass_pane \
\
lotr:tile.glass lotr:tile.glassPane lotr:tile.glassBottle lotr:tile.wineGlass lotr:tile.butterflyJar \
\
tfc:poured_glass
#else
# No Modded blocks can be defined here.
layer.translucent = glass glass_pane beacon
#endif
### Last updated: February 10, 2026, 11:54 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# ██████╗ ███████╗███╗ ██╗██████╗ ███████╗██████╗ ██╗ █████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ██╔══██╗██╔════╝████╗ ██║██╔══██╗██╔════╝██╔══██╗ ██║ ██╔══██╗╚██╗ ██╔╝██╔════╝██╔══██╗██╔════╝
# ██████╔╝█████╗ ██╔██╗ ██║██║ ██║█████╗ ██████╔╝ ██║ ███████║ ╚████╔╝ █████╗ ██████╔╝███████╗
# ██╔══██╗██╔══╝ ██║╚██╗██║██║ ██║██╔══╝ ██╔══██╗ ██║ ██╔══██║ ╚██╔╝ ██╔══╝ ██╔══██╗╚════██║
# ██║ ██║███████╗██║ ╚████║██████╔╝███████╗██║ ██║ ███████╗██║ ██║ ██║ ███████╗██║ ██║███████║
# ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝
# Blocks use what's called render layers. This tells the game how exactly to render a block, for example:
#
# Solid is best used for blocks with no alpha channel in its texture (i.e. stone and oak planks).
# Cutout is best used for blocks with an alpha channel in its texture (i.e. saplings and foliage).
# Cutout Mipped is best used for blocks with has an alpha channel and requires mipmaps. (i.e. leaves).
# Translucent is best used for blocks that requires special handling to accurately handle transparency effects (i.e. stained glass and ice).
#
# Solid: no alpha, mipmaps, no blending
# Cutout: alpha, no mipmaps, no blending
# Cutout Mipped: alpha, mipmaps, no blending
# Translucent: alpha, mipmaps, blending
#
# We can override the default render layer a block uses by defining them down below:
# Use the exclusive define only available with the Euphoria Patcher mod as layers can break on oculus
#if defined EUPHORIA_PATCHES_IRIS || defined IS_ANGELICA && ANGELICA_VERSION >= 200000010
layer.solid = improved_damage:enchanter improved_damage:chipped_enchanter improved_damage:damaged_enchanter improved_damage:broken_enchanter
# Cutout Mipped is gone on 1.21.11, cutout instead always has mipmaps
#if MC_VERSION < 12111
layer.cutout =
layer.cutout_mipped = createdeco:andesite_catwalk createdeco:andesite_catwalk_railing createdeco:andesite_catwalk_stairs createdeco:andesite_mesh_fence createdeco:andesite_support createdeco:andesite_support_wedge createdeco:brass_catwalk createdeco:brass_catwalk_railing createdeco:brass_catwalk_stairs createdeco:brass_mesh_fence createdeco:brass_support createdeco:brass_support_wedge createdeco:copper_catwalk createdeco:copper_catwalk_railing createdeco:copper_catwalk_stairs createdeco:copper_mesh_fence createdeco:copper_support createdeco:copper_support_wedge createdeco:industrial_iron_catwalk createdeco:industrial_iron_catwalk_railing createdeco:industrial_iron_catwalk_stairs createdeco:industrial_iron_mesh_fence createdeco:industrial_iron_support createdeco:industrial_iron_support_wedge createdeco:iron_catwalk createdeco:iron_catwalk_railing createdeco:iron_catwalk_stairs createdeco:iron_mesh_fence createdeco:iron_support createdeco:iron_support_wedge createdeco:zinc_catwalk createdeco:zinc_catwalk_railing createdeco:zinc_catwalk_stairs createdeco:zinc_mesh_fence createdeco:zinc_support createdeco:zinc_support_wedge
#else
layer.cutout = createdeco:andesite_catwalk createdeco:andesite_catwalk_railing createdeco:andesite_catwalk_stairs createdeco:andesite_mesh_fence createdeco:andesite_support createdeco:andesite_support_wedge createdeco:brass_catwalk createdeco:brass_catwalk_railing createdeco:brass_catwalk_stairs createdeco:brass_mesh_fence createdeco:brass_support createdeco:brass_support_wedge createdeco:copper_catwalk createdeco:copper_catwalk_railing createdeco:copper_catwalk_stairs createdeco:copper_mesh_fence createdeco:copper_support createdeco:copper_support_wedge createdeco:industrial_iron_catwalk createdeco:industrial_iron_catwalk_railing createdeco:industrial_iron_catwalk_stairs createdeco:industrial_iron_mesh_fence createdeco:industrial_iron_support createdeco:industrial_iron_support_wedge createdeco:iron_catwalk createdeco:iron_catwalk_railing createdeco:iron_catwalk_stairs createdeco:iron_mesh_fence createdeco:iron_support createdeco:iron_support_wedge createdeco:zinc_catwalk createdeco:zinc_catwalk_railing createdeco:zinc_catwalk_stairs createdeco:zinc_mesh_fence createdeco:zinc_support createdeco:zinc_support_wedge
#endif
#endif
#if defined EUPHORIA_PATCHES_IRIS || defined EUPHORIA_PATCHES_OCULUS && EUPHORIA_PATCHES_OCULUS_VERSION > 10700 || defined IS_ANGELICA && ANGELICA_VERSION >= 200000010
# It breaks on oculus before 1.8.0
layer.translucent = glass glass_pane beacon \
\
betternether:cincinnasite_frame \
\
create:framed_glass_door create:framed_glass_pane create:framed_glass_trapdoor create:horizontal_framed_glass_pane create:tiled_glass_pane create:vertical_framed_glass_pane create:tiled_glass create:horizontal_framed_glass create:framed_glass create:vertical_framed_glass create:acacia_window create:acacia_window_pane create:bamboo_window create:bamboo_window_pane create:cherry_window create:cherry_window_pane create:crimson_window create:crimson_window_pane create:dark_oak_window create:dark_oak_window_pane create:industrial_iron_window create:industrial_iron_window_pane create:jungle_window create:jungle_window_pane create:mangrove_window create:mangrove_window_pane create:oak_window create:oak_window_pane create:ornate_iron_window create:ornate_iron_window_pane create:spruce_window create:spruce_window_pane create:warped_window create:warped_window_pane \
\
createframed:andesite_alloy_window createframed:andesite_alloy_window_pane createframed:brass_window createframed:brass_window_pane createframed:cardboard_window createframed:cardboard_window_pane createframed:copper_window createframed:copper_window_pane createframed:zinc_window createframed:zinc_window_pane \
\
missingwilds:jar \
\
diagonalwindows:blockus/beveled_glass_pane diagonalwindows:createframed/andesite_alloy_window_pane diagonalwindows:createframed/andesite_alloy_window_panew diagonalwindows:createframed/black_cardboard_window_pane diagonalwindows:createframed/cardboard_window_pane diagonalwindows:minecraft/glass_pane \
\
lotr:tile.glass lotr:tile.glassPane lotr:tile.glassBottle lotr:tile.wineGlass lotr:tile.butterflyJar \
\
tfc:poured_glass
#else
# No Modded blocks can be defined here.
layer.translucent = glass glass_pane beacon
#endif
@@ -1,130 +1,130 @@
### Last updated: February 10, 2026, 11:54 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# ████████╗ █████╗ ██████╗ ███████╗
# ╚══██╔══╝██╔══██╗██╔════╝ ██╔════╝
# ██║ ███████║██║ ███╗███████╗
# ██║ ██╔══██║██║ ██║╚════██║
# ██║ ██║ ██║╚██████╔╝███████║
# ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
# These are tags working on Iris 1.8+
# Please don't change anything in here or related to tags if you don't know what you are doing. Thank you :)
#if IRIS_TAG_SUPPORT > 1
#define tags_small_flowers %small_flowers
#define tags_small_plants %crops %saplings
#define tags_leaves %leaves
#define tags_stone_bricks %stone_bricks
#define tags_anvil %anvil
#define tags_rails %rails
#define tags_cauldrons %cauldrons
#define tags_fire %fire
#define tags_stone %coal_ores %base_stone_overworld
#define tags_redstone_stone_blocks %stone_buttons %stone_pressure_plates
#define tags_mycelium %mooshrooms_spawnable_on
#define tags_dirt %dirt
#define tags_nylium %nylium
#define tags_wart_blocks %wart_blocks
#define tags_moss_block %sniffer_egg_hatch_boost
#define tags_bookshelf %enchantment_power_provider
#define tags_wood_non_full_blocks %fence_gates %wooden_fences %wooden_buttons %wooden_pressure_plates %wooden_slabs %wooden_stairs %wooden_trapdoors
#define tags_oak_logs %oak_logs
#define tags_spruce_logs %spruce_logs
#define tags_birch_logs %birch_logs
#define tags_jungle_logs %jungle_logs
#define tags_acacia_logs %acacia_logs
#define tags_dark_oak_logs %dark_oak_logs
#define tags_mangrove_logs %mangrove_logs
#define tags_crimson_stems %crimson_stems
#define tags_warped_stems %warped_stems
#define tags_sand %sand
#define tags_iron_ores %iron_ores
#define tags_copper_ores %copper_ores
#define tags_gold_ores %gold_ores
#define tags_diamond_ores %diamond_ores
#define tags_amethyst_blocks %crystal_sound_blocks
#define tags_emerald_ores %emerald_ores
#define tags_lapis_ores %lapis_ores
#define tags_snow %snow
#define tags_ice %ice
#define tags_transparent_ice %polar_bears_spawnable_on_alternate
#define tags_terracotta %terracotta
#define tags_concrete_powder %concrete_powder
#define tags_coral_blocks %coral_blocks
#define tags_coral_fans %corals %coral_plants %wall_corals
#define tags_candles %candles %candle_cakes
#define tags_redstone_ores %redstone_ores
#define tags_campfires %campfires
#define tags_wool %wool
#define tags_wool_carpets %wool_carpets
#define tags_beehives %beehives
#define tags_flower_pots %flower_pots
#define tags_soul_sand_blocks %soul_fire_base_blocks
#define tags_bamboo_blocks %bamboo_blocks
#define tags_cherry_logs %cherry_logs
#define tags_wooden_doors %wooden_doors
#define tags_signs %all_signs
#define tags_block_entities %shulker_boxes %banners
#define tags_end_portal_blocks %invalid_spawn_inside
##### MODDED TAGS #####
# Add tags from mods where appropriate here.
# Please keeps tags from specific mods in their own sections
# Chisels And Bits
#define tags_chiselsandbits_chisel %chiselsandbits:chiseled/block
# Dimensional Doors
#define tags_dimdoors_ag_door %dimdoors:ag_door
# Every Compat
#define tags_everycomp_tfc_acacia %tfc:wood_type/acacia
#define tags_everycomp_tfc_ash %tfc:wood_type/ash
#define tags_everycomp_tfc_aspen %tfc:wood_type/aspen
#define tags_everycomp_tfc_birch %tfc:wood_type/birch
#define tags_everycomp_tfc_blackwood %tfc:wood_type/blackwood
#define tags_everycomp_tfc_chestnut %tfc:wood_type/chestnut
#define tags_everycomp_tfc_douglas_fir %tfc:wood_type/douglas_fir
#define tags_everycomp_tfc_hickory %tfc:wood_type/hickory
#define tags_everycomp_tfc_kapok %tfc:wood_type/kapok
#define tags_everycomp_tfc_mangrove %tfc:wood_type/mangrove
#define tags_everycomp_tfc_maple %tfc:wood_type/maple
#define tags_everycomp_tfc_oak %tfc:wood_type/oak
#define tags_everycomp_tfc_palm %tfc:wood_type/palm
#define tags_everycomp_tfc_pine %tfc:wood_type/pine
#define tags_everycomp_tfc_rosewood %tfc:wood_type/rosewood
#define tags_everycomp_tfc_sequoia %tfc:wood_type/sequoia
#define tags_everycomp_tfc_spruce %tfc:wood_type/spruce
#define tags_everycomp_tfc_sycamore %tfc:wood_type/sycamore
#define tags_everycomp_tfc_white_cedar %tfc:wood_type/white_cedar
#define tags_everycomp_tfc_willow %tfc:wood_type/willow
#define tags_everycomp_ch_tfc_acacia_planks %everycomp:ch/tfc/acacia_planks
#define tags_everycomp_ch_tfc_ash_planks %everycomp:ch/tfc/ash_planks
#define tags_everycomp_ch_tfc_aspen_planks %everycomp:ch/tfc/aspen_planks
#define tags_everycomp_ch_tfc_birch_planks %everycomp:ch/tfc/birch_planks
#define tags_everycomp_ch_tfc_blackwood_planks %everycomp:ch/tfc/blackwood_planks
#define tags_everycomp_ch_tfc_chestnut_planks %everycomp:ch/tfc/chestnut_planks
#define tags_everycomp_ch_tfc_douglas_fir_planks %everycomp:ch/tfc/douglas_fir_planks
#define tags_everycomp_ch_tfc_hickory_planks %everycomp:ch/tfc/hickory_planks
#define tags_everycomp_ch_tfc_kapok_planks %everycomp:ch/tfc/kapok_planks
#define tags_everycomp_ch_tfc_mangrove_planks %everycomp:ch/tfc/mangrove_planks
#define tags_everycomp_ch_tfc_maple_planks %everycomp:ch/tfc/maple_planks
#define tags_everycomp_ch_tfc_oak_planks %everycomp:ch/tfc/oak_planks
#define tags_everycomp_ch_tfc_palm_planks %everycomp:ch/tfc/palm_planks
#define tags_everycomp_ch_tfc_pine_planks %everycomp:ch/tfc/pine_planks
#define tags_everycomp_ch_tfc_rosewood_planks %everycomp:ch/tfc/rosewood_planks
#define tags_everycomp_ch_tfc_sequoia_planks %everycomp:ch/tfc/sequoia_planks
#define tags_everycomp_ch_tfc_spruce_planks %everycomp:ch/tfc/spruce_planks
#define tags_everycomp_ch_tfc_sycamore_planks %everycomp:ch/tfc/sycamore_planks
#define tags_everycomp_ch_tfc_white_cedar_planks %everycomp:ch/tfc/white_cedar_planks
#define tags_everycomp_ch_tfc_willow_planks %everycomp:ch/tfc/willow_planks
# Immersive Weathering
#define tags_immersive_weathering_leaf_piles %immersive_weathering:leaf_piles
# NeoForge
# tags_neoforge_glass %neoforge:glass
# tags_neoforge_glass_panes %neoforge:glass_pane
#endif
### Last updated: February 10, 2026, 11:54 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
# ████████╗ █████╗ ██████╗ ███████╗
# ╚══██╔══╝██╔══██╗██╔════╝ ██╔════╝
# ██║ ███████║██║ ███╗███████╗
# ██║ ██╔══██║██║ ██║╚════██║
# ██║ ██║ ██║╚██████╔╝███████║
# ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
# These are tags working on Iris 1.8+
# Please don't change anything in here or related to tags if you don't know what you are doing. Thank you :)
#if IRIS_TAG_SUPPORT > 1
#define tags_small_flowers %small_flowers
#define tags_small_plants %crops %saplings
#define tags_leaves %leaves
#define tags_stone_bricks %stone_bricks
#define tags_anvil %anvil
#define tags_rails %rails
#define tags_cauldrons %cauldrons
#define tags_fire %fire
#define tags_stone %coal_ores %base_stone_overworld
#define tags_redstone_stone_blocks %stone_buttons %stone_pressure_plates
#define tags_mycelium %mooshrooms_spawnable_on
#define tags_dirt %dirt
#define tags_nylium %nylium
#define tags_wart_blocks %wart_blocks
#define tags_moss_block %sniffer_egg_hatch_boost
#define tags_bookshelf %enchantment_power_provider
#define tags_wood_non_full_blocks %fence_gates %wooden_fences %wooden_buttons %wooden_pressure_plates %wooden_slabs %wooden_stairs %wooden_trapdoors
#define tags_oak_logs %oak_logs
#define tags_spruce_logs %spruce_logs
#define tags_birch_logs %birch_logs
#define tags_jungle_logs %jungle_logs
#define tags_acacia_logs %acacia_logs
#define tags_dark_oak_logs %dark_oak_logs
#define tags_mangrove_logs %mangrove_logs
#define tags_crimson_stems %crimson_stems
#define tags_warped_stems %warped_stems
#define tags_sand %sand
#define tags_iron_ores %iron_ores
#define tags_copper_ores %copper_ores
#define tags_gold_ores %gold_ores
#define tags_diamond_ores %diamond_ores
#define tags_amethyst_blocks %crystal_sound_blocks
#define tags_emerald_ores %emerald_ores
#define tags_lapis_ores %lapis_ores
#define tags_snow %snow
#define tags_ice %ice
#define tags_transparent_ice %polar_bears_spawnable_on_alternate
#define tags_terracotta %terracotta
#define tags_concrete_powder %concrete_powder
#define tags_coral_blocks %coral_blocks
#define tags_coral_fans %corals %coral_plants %wall_corals
#define tags_candles %candles %candle_cakes
#define tags_redstone_ores %redstone_ores
#define tags_campfires %campfires
#define tags_wool %wool
#define tags_wool_carpets %wool_carpets
#define tags_beehives %beehives
#define tags_flower_pots %flower_pots
#define tags_soul_sand_blocks %soul_fire_base_blocks
#define tags_bamboo_blocks %bamboo_blocks
#define tags_cherry_logs %cherry_logs
#define tags_wooden_doors %wooden_doors
#define tags_signs %all_signs
#define tags_block_entities %shulker_boxes %banners
#define tags_end_portal_blocks %invalid_spawn_inside
##### MODDED TAGS #####
# Add tags from mods where appropriate here.
# Please keeps tags from specific mods in their own sections
# Chisels And Bits
#define tags_chiselsandbits_chisel %chiselsandbits:chiseled/block
# Dimensional Doors
#define tags_dimdoors_ag_door %dimdoors:ag_door
# Every Compat
#define tags_everycomp_tfc_acacia %tfc:wood_type/acacia
#define tags_everycomp_tfc_ash %tfc:wood_type/ash
#define tags_everycomp_tfc_aspen %tfc:wood_type/aspen
#define tags_everycomp_tfc_birch %tfc:wood_type/birch
#define tags_everycomp_tfc_blackwood %tfc:wood_type/blackwood
#define tags_everycomp_tfc_chestnut %tfc:wood_type/chestnut
#define tags_everycomp_tfc_douglas_fir %tfc:wood_type/douglas_fir
#define tags_everycomp_tfc_hickory %tfc:wood_type/hickory
#define tags_everycomp_tfc_kapok %tfc:wood_type/kapok
#define tags_everycomp_tfc_mangrove %tfc:wood_type/mangrove
#define tags_everycomp_tfc_maple %tfc:wood_type/maple
#define tags_everycomp_tfc_oak %tfc:wood_type/oak
#define tags_everycomp_tfc_palm %tfc:wood_type/palm
#define tags_everycomp_tfc_pine %tfc:wood_type/pine
#define tags_everycomp_tfc_rosewood %tfc:wood_type/rosewood
#define tags_everycomp_tfc_sequoia %tfc:wood_type/sequoia
#define tags_everycomp_tfc_spruce %tfc:wood_type/spruce
#define tags_everycomp_tfc_sycamore %tfc:wood_type/sycamore
#define tags_everycomp_tfc_white_cedar %tfc:wood_type/white_cedar
#define tags_everycomp_tfc_willow %tfc:wood_type/willow
#define tags_everycomp_ch_tfc_acacia_planks %everycomp:ch/tfc/acacia_planks
#define tags_everycomp_ch_tfc_ash_planks %everycomp:ch/tfc/ash_planks
#define tags_everycomp_ch_tfc_aspen_planks %everycomp:ch/tfc/aspen_planks
#define tags_everycomp_ch_tfc_birch_planks %everycomp:ch/tfc/birch_planks
#define tags_everycomp_ch_tfc_blackwood_planks %everycomp:ch/tfc/blackwood_planks
#define tags_everycomp_ch_tfc_chestnut_planks %everycomp:ch/tfc/chestnut_planks
#define tags_everycomp_ch_tfc_douglas_fir_planks %everycomp:ch/tfc/douglas_fir_planks
#define tags_everycomp_ch_tfc_hickory_planks %everycomp:ch/tfc/hickory_planks
#define tags_everycomp_ch_tfc_kapok_planks %everycomp:ch/tfc/kapok_planks
#define tags_everycomp_ch_tfc_mangrove_planks %everycomp:ch/tfc/mangrove_planks
#define tags_everycomp_ch_tfc_maple_planks %everycomp:ch/tfc/maple_planks
#define tags_everycomp_ch_tfc_oak_planks %everycomp:ch/tfc/oak_planks
#define tags_everycomp_ch_tfc_palm_planks %everycomp:ch/tfc/palm_planks
#define tags_everycomp_ch_tfc_pine_planks %everycomp:ch/tfc/pine_planks
#define tags_everycomp_ch_tfc_rosewood_planks %everycomp:ch/tfc/rosewood_planks
#define tags_everycomp_ch_tfc_sequoia_planks %everycomp:ch/tfc/sequoia_planks
#define tags_everycomp_ch_tfc_spruce_planks %everycomp:ch/tfc/spruce_planks
#define tags_everycomp_ch_tfc_sycamore_planks %everycomp:ch/tfc/sycamore_planks
#define tags_everycomp_ch_tfc_white_cedar_planks %everycomp:ch/tfc/white_cedar_planks
#define tags_everycomp_ch_tfc_willow_planks %everycomp:ch/tfc/willow_planks
# Immersive Weathering
#define tags_immersive_weathering_leaf_piles %immersive_weathering:leaf_piles
# NeoForge
# tags_neoforge_glass %neoforge:glass
# tags_neoforge_glass_panes %neoforge:glass_pane
#endif
@@ -1,30 +1,30 @@
blend.clrwl_gbuffers.colortex6=off
blend.clrwl_gbuffers_translucent.colortex6=off
blend.clrwl_gbuffers_translucent.colortex4=off
blend.clrwl_gbuffers_translucent.colortex8=off
#if ENTITY_SHADOW == -1
shadow.enabled = false
#endif
oit = true
oit.gbuffers.coefficientRanks = 3,3
oit.gbuffers.colortex0 = 0
oit.gbuffers.colortex3 = 1
oit.gbuffers.colortex6 = frontmost
oit.gbuffers.colortex6.format = RGBA8
oit.gbuffers.colortex4 = frontmost
oit.gbuffers.colortex4.format = RGBA8_SNORM
oit.gbuffers.colortex8 = frontmost
oit.gbuffers.colortex8.format = RGBA16F
oit.gbuffers.colortex9 = frontmost
oit.gbuffers.colortex9.format = RGBA16F
oit.shadow.shadowcolor0 = frontmost
oit.shadow.shadowcolor0.format = RGBA8
oit.shadow.shadowcolor1 = frontmost
oit.shadow.shadowcolor1.format = RGBA8
blend.clrwl_gbuffers.colortex6=off
blend.clrwl_gbuffers_translucent.colortex6=off
blend.clrwl_gbuffers_translucent.colortex4=off
blend.clrwl_gbuffers_translucent.colortex8=off
#if ENTITY_SHADOW == -1
shadow.enabled = false
#endif
oit = true
oit.gbuffers.coefficientRanks = 3,3
oit.gbuffers.colortex0 = 0
oit.gbuffers.colortex3 = 1
oit.gbuffers.colortex6 = frontmost
oit.gbuffers.colortex6.format = RGBA8
oit.gbuffers.colortex4 = frontmost
oit.gbuffers.colortex4.format = RGBA8_SNORM
oit.gbuffers.colortex8 = frontmost
oit.gbuffers.colortex8.format = RGBA16F
oit.gbuffers.colortex9 = frontmost
oit.gbuffers.colortex9.format = RGBA16F
oit.shadow.shadowcolor0 = frontmost
oit.shadow.shadowcolor0.format = RGBA8
oit.shadow.shadowcolor1 = frontmost
oit.shadow.shadowcolor1.format = RGBA8
@@ -1,82 +1,82 @@
### Last updated: February 05, 2026, 11:02 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
#---------------------------------------------------------------------------------------------------------------------
##### IMPORTANT! WHERE TO CONTRIBUTE: #####
# If you want to contribute to the Euphoria Patches modded support library, please only edit the files from GitHub. https://euphoriapatches.com/properties
#
#---------------------------------------------------------------------------------------------------------------------
#### Template for Dimensions: ####
#
# dimension.world-1 = vanillaId1 vanillaId2 \
# \
# modName1:modId1 modName1:modId2 modName1:modId3 ... \
# \
# modName2:modId1 modName2:modId2 modName2:modId3 ... \
#
# dimension.world1 = ...
# ...
#
# IDs should be grouped by mods, for every new mod it should be added in a new line using "\"
#---------------------------------------------------------------------------------------------------------------------
# ██╗███████╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║╚════██║███║██╔═████╗ ██╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ██╔╝╚██║██║██╔██║██████╗ ███████║█████╗ ██████╔╝█████╗
# ██║ ██╔╝ ██║████╔╝██║╚═██╔═╝ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║██╗██║╚██████╔╝ ╚═╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
# 1.8.0 And Above Mapping:
#if MC_VERSION > 10710
# Overworld - All unknown dimensions are considered as Overworld because of the * wildcard
dimension.world0=*
# Nether
dimension.world-1=minecraft:the_nether minecraft:nether minecraft:world-1_the_nether \
\
ad_astra:venus ad_astra:mercury \
\
prominent:vaaz_volcano prominent:cinderstone_depths prominent:vaaz_past prominent:vaaz_present prominent:vaaz_assault
# End
dimension.world1=minecraft:the_end minecraft:end minecraft:world1_the_end minecraft:world_the_end \
\
ad_astra:venus_orbit ad_astra:mercury_orbit ad_astra:mars_orbit ad_astra:moon_orbit ad_astra:glacio_orbit ad_astra:earth_orbit ad_astra:moon \
\
minecraft:thermalpoint \
\
minecraft:tw_end minecraft:fw_end minecraft:za_the_end \
\
the_deeper_void:void_dimension \
\
bestest:hyperspace_lumiose bestest:hyperspace_sewers
# ██╗███████╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║╚════██║███║██╔═████╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ██╔╝╚██║██║██╔██║ ███████║█████╗ ██████╔╝█████╗
# ██║ ██╔╝ ██║████╔╝██║ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║██╗██║╚██████╔╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
# 1.7.10 And Below Mapping (Cap Sensitive!):
#else
# Overworld - All unknown dimensions are considered as Overworld because of the * wildcard
dimension.world0=*
# Nether
dimension.world-1=Nether minecraft:Nether minecraft:the_nether minecraft:nether minecraft:world-1_the_nether
# End
dimension.world1="The End" minecraft:the_end minecraft:end minecraft:world1_the_end minecraft:world_the_end \
\
Utumno
#endif
### Last updated: February 05, 2026, 11:02 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
#---------------------------------------------------------------------------------------------------------------------
##### IMPORTANT! WHERE TO CONTRIBUTE: #####
# If you want to contribute to the Euphoria Patches modded support library, please only edit the files from GitHub. https://euphoriapatches.com/properties
#
#---------------------------------------------------------------------------------------------------------------------
#### Template for Dimensions: ####
#
# dimension.world-1 = vanillaId1 vanillaId2 \
# \
# modName1:modId1 modName1:modId2 modName1:modId3 ... \
# \
# modName2:modId1 modName2:modId2 modName2:modId3 ... \
#
# dimension.world1 = ...
# ...
#
# IDs should be grouped by mods, for every new mod it should be added in a new line using "\"
#---------------------------------------------------------------------------------------------------------------------
# ██╗███████╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║╚════██║███║██╔═████╗ ██╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ██╔╝╚██║██║██╔██║██████╗ ███████║█████╗ ██████╔╝█████╗
# ██║ ██╔╝ ██║████╔╝██║╚═██╔═╝ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║██╗██║╚██████╔╝ ╚═╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
# 1.8.0 And Above Mapping:
#if MC_VERSION > 10710
# Overworld - All unknown dimensions are considered as Overworld because of the * wildcard
dimension.world0=*
# Nether
dimension.world-1=minecraft:the_nether minecraft:nether minecraft:world-1_the_nether \
\
ad_astra:venus ad_astra:mercury \
\
prominent:vaaz_volcano prominent:cinderstone_depths prominent:vaaz_past prominent:vaaz_present prominent:vaaz_assault
# End
dimension.world1=minecraft:the_end minecraft:end minecraft:world1_the_end minecraft:world_the_end \
\
ad_astra:venus_orbit ad_astra:mercury_orbit ad_astra:mars_orbit ad_astra:moon_orbit ad_astra:glacio_orbit ad_astra:earth_orbit ad_astra:moon \
\
minecraft:thermalpoint \
\
minecraft:tw_end minecraft:fw_end minecraft:za_the_end \
\
the_deeper_void:void_dimension \
\
bestest:hyperspace_lumiose bestest:hyperspace_sewers
# ██╗███████╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║╚════██║███║██╔═████╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ██╔╝╚██║██║██╔██║ ███████║█████╗ ██████╔╝█████╗
# ██║ ██╔╝ ██║████╔╝██║ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║██╗██║╚██████╔╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
# 1.7.10 And Below Mapping (Cap Sensitive!):
#else
# Overworld - All unknown dimensions are considered as Overworld because of the * wildcard
dimension.world0=*
# Nether
dimension.world-1=Nether minecraft:Nether minecraft:the_nether minecraft:nether minecraft:world-1_the_nether
# End
dimension.world1="The End" minecraft:the_end minecraft:end minecraft:world1_the_end minecraft:world_the_end \
\
Utumno
#endif
@@ -1,413 +1,413 @@
### Last updated: January 31, 2026, 19:36 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
#---------------------------------------------------------------------------------------------------------------------
# Version 2 - Every time a vanilla block changes this number will go up, modded blocks don't affect the version number
# Last Change: 1.21.9 stuff
#---------------------------------------------------------------------------------------------------------------------
#
##### IMPORTANT! WHERE TO CONTRIBUTE: #####
# If you want to contribute to the Euphoria Patches modded support library, please only edit the files from GitHub. https://euphoriapatches.com/properties
#
#---------------------------------------------------------------------------------------------------------------------
#### Template for Modded Entities: ####
#
# # Description of the Entity ID
# entity.XXXXX = vanillaId1 vanillaId2 vanillaId3 ... \
# \
# modName1:modId1 modName1:modId2 modName1:modId3 ... \
# \
# modName2:modId1 modName2:modId2 modName2:modId3 ... \
# ...
# lastModInThisIDName:modId1 lastModInThisIDName:modId2 lastModInThisIDName:modId3
# # Description of the Next Entity ID
# entity.YYYYY = ...
# ...
# - The last line of a entity.XXXX does not have a "\"
# --- IDs should be grouped by mods, for every new mod it should be added in a new line using "\" ---
#---------------------------------------------------------------------------------------------------------------------
# ██╗ ██╗ ██╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║ ███║███║ ██╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ╚██║╚██║██████╗ ███████║█████╗ ██████╔╝█████╗
# ██║ ██║ ██║╚═██╔═╝ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║ ██║ ╚═╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
# 1.11 And Above Mapping:
#if MC_VERSION >= 11100
# End Crystal
entity.50000 = end_crystal
# Lightning Bolt
entity.50004 = lightning_bolt \
\
ars_nouveau:an_lightning
# Item Frames
entity.50008 = item_frame glow_item_frame \
\
tconstruct:fancy_item_frame
# Iron Golem
entity.50012 = iron_golem \
\
ad_astra:lander ad_astra:tier_1_rocket ad_astra:tier_2_rocket ad_astra:tier_3_rocket ad_astra:tier_4_rocket \
\
ars_nouveau:amethyst_golem ars_nouveau:familiar_amethyst_golem \
\
born_in_chaos_v1:door_knight born_in_chaos_v1:door_knight_not_despawn born_in_chaos_v1:fallen_chaos_knight \
\
createbigcannons:ap_autocannon createbigcannons:ap_shell createbigcannons:ap_shot createbigcannons:cannon_carriage createbigcannons:flak_autocannon createbigcannons:fluid_shell createbigcannons:he_shell createbigcannons:shot createbigcannons:shrapnel_shell createbigcannons:smoke_shell \
\
grapplemod:grapplehook \
\
iceandfire:chain_tie iceandfire:hippocampus iceandfire:ice_dragon_charge iceandfire:sea_serpent \
\
illagerinvasion:hatchet \
\
man_of_many_planes:scarlet_biplane \
\
securitycraft:bouncingbetty securitycraft:bullet securitycraft:security_sea_boat securitycraft:securitycamera securitycraft:sentry \
\
yungscavebiomes:ice_cube
# Armor Stand
entity.50015 = armor_stand
# Other Players
entity.50016 = player mannequin
# Current Player
entity.50017 = current_player
# Blaze
entity.50020 = blaze \
\
adventurez:blaze_guardian adventurez:blaze_guardian_shield \
\
aquamirae:golden_moth \
\
betternether:hydrogen_jellyfish \
\
burnt:fire_devil
# Creeper
entity.50024 = creeper \
\
ad_astra:sulfur_creeper \
\
enderzoology:concussion_creeper
# Drowned
entity.50028 = drowned
# Gaurdian
entity.50032 = guardian
# Elder Guardian
entity.50036 = elder_guardian
# Endermite
entity.50040 = endermite
# Ghast
entity.50044 = ghast \
\
enderzoology:dire_wolf enderzoology:wither_witch
# Glow Squid
entity.50048 = glow_squid \
\
betterend:cubozoa \
\
betternether:firefly \
\
bosses_of_mass_destruction:comet bosses_of_mass_destruction:lich
# Magma Cube
entity.50052 = magma_cube \
\
iceandfire:fire_dragon_charge \
\
illagerinvasion:flying_magma \
\
wilderwild:scorched
# Stray
entity.50056 = stray
# Vex
entity.50060 = vex \
\
ad_astra:ice_spit \
\
adventurez:amethyst_shard adventurez:void_shade adventurez:void_shard \
\
ars_nouveau:ally_vex \
\
born_in_chaos_v1:phantom_creeper born_in_chaos_v1:phantom_creeper_copy born_in_chaos_v1:restless_spirit born_in_chaos_v1:scarlet_persecutor \
\
bosses_of_mass_destruction:blue_fireball bosses_of_mass_destruction:gauntlet \
\
iceandfire:lightning_dragon_charge \
\
illagerinvasion:skull_bolt \
\
tconstruct:crystalshot tconstruct:glow_ball
# Witch
entity.50064 = witch
# Withers
entity.50068 = wither wither_skull \
\
betternether:naga \
\
born_in_chaos_v1:lifestealer born_in_chaos_v1:lifestealer_true_form
# Experience Orbs
entity.50072 = experience_orb \
\
adventurez:void_bullet \
\
create_enchantment_industry:hyper_experience_orb \
\
dimdoors:monolith \
\
drg_flares:drg_flare \
\
levelz:level_experience_orb
# Boats
entity.50076 = boat oak_boat spruce_boat birch_boat jungle_boat acacia_boat dark_oak_boat mangrove_boat cherry_boat pale_oak_boat chest_boat oak_chest_boat spruce_chest_boat birch_chest_boat jungle_chest_boat acacia_chest_boat dark_oak_chest_boat mangrove_chest_boat cherry_chest_boat pale_oak_chest_boat \
\
ecologics:boat ecologics:chest_boat \
\
fixedminecraft:azalea_boat fixedminecraft:azalea_chest_boat \
\
nekomasfixed:big_acacia_boat nekomasfixed:big_bamboo_boat nekomasfixed:big_birch_boat nekomasfixed:big_cherry_boat nekomasfixed:big_dark_oak_boat nekomasfixed:big_jungle_boat nekomasfixed:big_mangrove_boat nekomasfixed:big_oak_boat nekomasfixed:big_pale_oak_boat nekomasfixed:big_spruce_boat nekomasfixed:fake_boat nekomasfixed:huge_acacia_boat nekomasfixed:huge_bamboo_boat nekomasfixed:huge_birch_boat nekomasfixed:huge_cherry_boat nekomasfixed:huge_dark_oak_boat nekomasfixed:huge_jungle_boat nekomasfixed:huge_mangrove_boat nekomasfixed:huge_oak_boat nekomasfixed:huge_pale_oak_boat nekomasfixed:huge_spruce_boat \
\
terraform:boat terraform:chest_boat \
\
tfc:wood/boat/acacia tfc:wood/boat/ash tfc:wood/boat/aspen tfc:wood/boat/birch tfc:wood/boat/blackwood tfc:wood/boat/chestnut tfc:wood/boat/douglas_fir tfc:wood/boat/hickory tfc:wood/boat/kapok tfc:wood/boat/mangrove tfc:wood/boat/maple tfc:wood/boat/oak tfc:wood/boat/palm tfc:wood/boat/pine tfc:wood/boat/rosewood tfc:wood/boat/sequoia tfc:wood/boat/spruce tfc:wood/boat/sycamore tfc:wood/boat/white_cedar tfc:wood/boat/willow tfc:wood/chest_boat/acacia tfc:wood/chest_boat/ash tfc:wood/chest_boat/aspen tfc:wood/chest_boat/birch tfc:wood/chest_boat/blackwood tfc:wood/chest_boat/chestnut tfc:wood/chest_boat/douglas_fir tfc:wood/chest_boat/hickory tfc:wood/chest_boat/kapok tfc:wood/chest_boat/mangrove tfc:wood/chest_boat/maple tfc:wood/chest_boat/oak tfc:wood/chest_boat/palm tfc:wood/chest_boat/pine tfc:wood/chest_boat/rosewood tfc:wood/chest_boat/sequoia tfc:wood/chest_boat/spruce tfc:wood/chest_boat/sycamore tfc:wood/chest_boat/white_cedar tfc:wood/chest_boat/willow \
\
wilderwild:baobab_boat wilderwild:baobab_chest_boat wilderwild:boat wilderwild:chest_boat wilderwild:cypress_boat wilderwild:cypress_chest_boat wilderwild:maple_boat wilderwild:maple_chest_boat wilderwild:palm_boat wilderwild:palm_chest_boat
# Allay
entity.50080 = allay \
\
adventurez:amethyst_golem adventurez:blackstone_golem adventurez:nightmare adventurez:soul_reaper adventurez:the_eye adventurez:tiny_eye \
\
betterend:dragonfly betterend:end_fish \
\
born_in_chaos_v1:felsteed born_in_chaos_v1:intoxicatind_bomb_projectile born_in_chaos_v1:lord_pumpkinhead born_in_chaos_v1:lord_pumpkinhead_head born_in_chaos_v1:lord_pumpkinhead_withouta_horse born_in_chaos_v1:lord_the_headless born_in_chaos_v1:lords_felsteed born_in_chaos_v1:missionary_charge born_in_chaos_v1:mr_pumpkin born_in_chaos_v1:mr_pumpkin_controlled born_in_chaos_v1:nightmare_stalker born_in_chaos_v1:phantom_bomb_entity born_in_chaos_v1:phantom_bomb_projectile born_in_chaos_v1:pumpkin_bomb born_in_chaos_v1:pumpkin_pistol_2_projectile born_in_chaos_v1:pumpkin_pistol_projectile born_in_chaos_v1:pumpkin_staff_2_projectile born_in_chaos_v1:pumpkin_staff_projectile born_in_chaos_v1:pumpkinhead born_in_chaos_v1:riding_felsteed born_in_chaos_v1:riding_lords_felsteed born_in_chaos_v1:seared_spirit born_in_chaos_v1:seared_spirit_not_despawn born_in_chaos_v1:senor_pumpkin born_in_chaos_v1:sir_pumpkinhead born_in_chaos_v1:sir_pumpkinhead_without_horse born_in_chaos_v1:sir_the_headless born_in_chaos_v1:staffof_blindness_projectile born_in_chaos_v1:stimulating_bombprojectile \
\
create_enchantment_industry:hyper_experience_bottle \
\
iceandfire:pixie \
\
immersive_aircraft:bullet \
\
ore_creeper:coal_creeper ore_creeper:copper_creeper ore_creeper:diamond_creeper ore_creeper:emerald_creeper ore_creeper:gold_creeper ore_creeper:iron_creeper ore_creeper:lapis_lazuli_creeper ore_creeper:nether_gold_creeper ore_creeper:nether_quartz_creeper ore_creeper:redstone_creeper \
\
supplementaries:bomb \
\
tfc:glow_arrow
# Slimes and Chickens
entity.50084 = slime chicken \
\
betterend:end_slime \
\
tconstruct:earth_slime tconstruct:ender_slime tconstruct:sky_slime tconstruct:terracube
# Entity Fire
entity.50088 = entity_flame
# Fire Balls
entity.50089 = fireball dragon_fireball small_fireball \
\
securitycraft:imsbomb
# Trident
entity.50092 = trident \
\
iceandfire:tide_trident
# Minecarts
entity.50096 = minecart chest_minecart command_block_minecart furnace_minecart hopper_minecart spawner_minecart tnt_minecart \
\
fixedminecraft:dispenser_minecart \
\
lootr:lootr_minecart \
\
railways:benchcart railways:conductor railways:jukeboxcart \
\
supplementaries:dispenser_minecart \
\
tfc:chest_minecart tfc:holding_minecart
# Bogged
entity.50100 = bogged
# Piglins and Hoglins
entity.50104 = piglin piglin_brute zombified_piglin hoglin zoglin
entity.50108 = creaking \
\
enderzoology:wither_cat \
\
vanillabackport:creaking
# Name Tag - Iris Exclusive
entity.50112 = name_tag
# Copper Golems
entity.50116 = copper_golem
# Parched
entity.50120 = parched
# Zombie Nautilus
entity.50124 = zombie_nautilus
# End Crystal Beams
entity.50200 = end_crystal_beam
# Ender Dragon
entity.50204 = ender_dragon \
\
adventurez:dragon adventurez:ender_whale adventurez:enderwarthog adventurez:void_shadow
# ██╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║ ███║██╔═████╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ╚██║██║██╔██║█████╗ ███████║█████╗ ██████╔╝█████╗
# ██║ ██║████╔╝██║╚════╝ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║╚██████╔╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
#1.10 And Below Mapping (Cap Sensitive!):
#else
# End Crystal
entity.50000 = EnderCrystal
# Lightning Bolt
entity.50004 = lightning_bolt
# Item Frames
entity.50008 = ItemFrame
# Iron Golem
entity.50012 = VillagerGolem
# Other Players
entity.50016 =
# Current Player
entity.50017 = current_player
# Blaze
entity.50020 = Blaze \
\
BiomesOPlenty.Pixie
# Creeper
entity.50024 = Creeper
# Drowned
entity.50028 =
# Gaurdian
entity.50032 =
# Elder Guardian
entity.50036 =
# Endermite
entity.50040 =
# Ghast
entity.50044 = Ghast
# Glow Squid
entity.50048 =
# Magma Cube
entity.50052 = LavaSlime
# Stray
entity.50056 =
# Vex
entity.50060 =
# Witch
entity.50064 = Witch
# Withers
entity.50068 = WitherBoss WitherSkull
# Experience Orbs
entity.50072 = XPOrb
# Boats
entity.50076 = Boat
# Allay
entity.50080 =
# Slimes and Chickens
entity.50084 = Slime Chicken \
\
BiomesOPlenty.Rosester BiomesOPlenty.Glob
# Entity Fire
entity.50088 = entity_flame
# Fire Balls
entity.50089 = Fireball
# Trident
entity.50092 =
# Minecarts
entity.50096 = MinecartChest MinecartCommandBlock MinecartFurnace MinecartHopper MinecartRideable MinecartSpawner MinecartTNT
# Bogged
entity.50100 =
# Piglins and Hoglins
entity.50104 =
# Creaking
entity.50108 =
# Name Tag - Iris Exclusive
entity.50112 = name_tag
# Copper Golems
entity.50116 =
# Parched
entity.50120 =
# Zombie Nautilus
entity.50124 =
# End Crystal Beams
entity.50200 = end_crystal_beam
# Ender Dragon
entity.50204 = EnderDragon
#endif
### Last updated: January 31, 2026, 19:36 UTC
# Copyright (c) 2026 SpacEagle17 Licensed under the MIT License: https://opensource.org/licenses/MIT
#---------------------------------------------------------------------------------------------------------------------
# Version 2 - Every time a vanilla block changes this number will go up, modded blocks don't affect the version number
# Last Change: 1.21.9 stuff
#---------------------------------------------------------------------------------------------------------------------
#
##### IMPORTANT! WHERE TO CONTRIBUTE: #####
# If you want to contribute to the Euphoria Patches modded support library, please only edit the files from GitHub. https://euphoriapatches.com/properties
#
#---------------------------------------------------------------------------------------------------------------------
#### Template for Modded Entities: ####
#
# # Description of the Entity ID
# entity.XXXXX = vanillaId1 vanillaId2 vanillaId3 ... \
# \
# modName1:modId1 modName1:modId2 modName1:modId3 ... \
# \
# modName2:modId1 modName2:modId2 modName2:modId3 ... \
# ...
# lastModInThisIDName:modId1 lastModInThisIDName:modId2 lastModInThisIDName:modId3
# # Description of the Next Entity ID
# entity.YYYYY = ...
# ...
# - The last line of a entity.XXXX does not have a "\"
# --- IDs should be grouped by mods, for every new mod it should be added in a new line using "\" ---
#---------------------------------------------------------------------------------------------------------------------
# ██╗ ██╗ ██╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║ ███║███║ ██╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ╚██║╚██║██████╗ ███████║█████╗ ██████╔╝█████╗
# ██║ ██║ ██║╚═██╔═╝ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║ ██║ ╚═╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
# 1.11 And Above Mapping:
#if MC_VERSION >= 11100
# End Crystal
entity.50000 = end_crystal
# Lightning Bolt
entity.50004 = lightning_bolt \
\
ars_nouveau:an_lightning
# Item Frames
entity.50008 = item_frame glow_item_frame \
\
tconstruct:fancy_item_frame
# Iron Golem
entity.50012 = iron_golem \
\
ad_astra:lander ad_astra:tier_1_rocket ad_astra:tier_2_rocket ad_astra:tier_3_rocket ad_astra:tier_4_rocket \
\
ars_nouveau:amethyst_golem ars_nouveau:familiar_amethyst_golem \
\
born_in_chaos_v1:door_knight born_in_chaos_v1:door_knight_not_despawn born_in_chaos_v1:fallen_chaos_knight \
\
createbigcannons:ap_autocannon createbigcannons:ap_shell createbigcannons:ap_shot createbigcannons:cannon_carriage createbigcannons:flak_autocannon createbigcannons:fluid_shell createbigcannons:he_shell createbigcannons:shot createbigcannons:shrapnel_shell createbigcannons:smoke_shell \
\
grapplemod:grapplehook \
\
iceandfire:chain_tie iceandfire:hippocampus iceandfire:ice_dragon_charge iceandfire:sea_serpent \
\
illagerinvasion:hatchet \
\
man_of_many_planes:scarlet_biplane \
\
securitycraft:bouncingbetty securitycraft:bullet securitycraft:security_sea_boat securitycraft:securitycamera securitycraft:sentry \
\
yungscavebiomes:ice_cube
# Armor Stand
entity.50015 = armor_stand
# Other Players
entity.50016 = player mannequin
# Current Player
entity.50017 = current_player
# Blaze
entity.50020 = blaze \
\
adventurez:blaze_guardian adventurez:blaze_guardian_shield \
\
aquamirae:golden_moth \
\
betternether:hydrogen_jellyfish \
\
burnt:fire_devil
# Creeper
entity.50024 = creeper \
\
ad_astra:sulfur_creeper \
\
enderzoology:concussion_creeper
# Drowned
entity.50028 = drowned
# Gaurdian
entity.50032 = guardian
# Elder Guardian
entity.50036 = elder_guardian
# Endermite
entity.50040 = endermite
# Ghast
entity.50044 = ghast \
\
enderzoology:dire_wolf enderzoology:wither_witch
# Glow Squid
entity.50048 = glow_squid \
\
betterend:cubozoa \
\
betternether:firefly \
\
bosses_of_mass_destruction:comet bosses_of_mass_destruction:lich
# Magma Cube
entity.50052 = magma_cube \
\
iceandfire:fire_dragon_charge \
\
illagerinvasion:flying_magma \
\
wilderwild:scorched
# Stray
entity.50056 = stray
# Vex
entity.50060 = vex \
\
ad_astra:ice_spit \
\
adventurez:amethyst_shard adventurez:void_shade adventurez:void_shard \
\
ars_nouveau:ally_vex \
\
born_in_chaos_v1:phantom_creeper born_in_chaos_v1:phantom_creeper_copy born_in_chaos_v1:restless_spirit born_in_chaos_v1:scarlet_persecutor \
\
bosses_of_mass_destruction:blue_fireball bosses_of_mass_destruction:gauntlet \
\
iceandfire:lightning_dragon_charge \
\
illagerinvasion:skull_bolt \
\
tconstruct:crystalshot tconstruct:glow_ball
# Witch
entity.50064 = witch
# Withers
entity.50068 = wither wither_skull \
\
betternether:naga \
\
born_in_chaos_v1:lifestealer born_in_chaos_v1:lifestealer_true_form
# Experience Orbs
entity.50072 = experience_orb \
\
adventurez:void_bullet \
\
create_enchantment_industry:hyper_experience_orb \
\
dimdoors:monolith \
\
drg_flares:drg_flare \
\
levelz:level_experience_orb
# Boats
entity.50076 = boat oak_boat spruce_boat birch_boat jungle_boat acacia_boat dark_oak_boat mangrove_boat cherry_boat pale_oak_boat chest_boat oak_chest_boat spruce_chest_boat birch_chest_boat jungle_chest_boat acacia_chest_boat dark_oak_chest_boat mangrove_chest_boat cherry_chest_boat pale_oak_chest_boat \
\
ecologics:boat ecologics:chest_boat \
\
fixedminecraft:azalea_boat fixedminecraft:azalea_chest_boat \
\
nekomasfixed:big_acacia_boat nekomasfixed:big_bamboo_boat nekomasfixed:big_birch_boat nekomasfixed:big_cherry_boat nekomasfixed:big_dark_oak_boat nekomasfixed:big_jungle_boat nekomasfixed:big_mangrove_boat nekomasfixed:big_oak_boat nekomasfixed:big_pale_oak_boat nekomasfixed:big_spruce_boat nekomasfixed:fake_boat nekomasfixed:huge_acacia_boat nekomasfixed:huge_bamboo_boat nekomasfixed:huge_birch_boat nekomasfixed:huge_cherry_boat nekomasfixed:huge_dark_oak_boat nekomasfixed:huge_jungle_boat nekomasfixed:huge_mangrove_boat nekomasfixed:huge_oak_boat nekomasfixed:huge_pale_oak_boat nekomasfixed:huge_spruce_boat \
\
terraform:boat terraform:chest_boat \
\
tfc:wood/boat/acacia tfc:wood/boat/ash tfc:wood/boat/aspen tfc:wood/boat/birch tfc:wood/boat/blackwood tfc:wood/boat/chestnut tfc:wood/boat/douglas_fir tfc:wood/boat/hickory tfc:wood/boat/kapok tfc:wood/boat/mangrove tfc:wood/boat/maple tfc:wood/boat/oak tfc:wood/boat/palm tfc:wood/boat/pine tfc:wood/boat/rosewood tfc:wood/boat/sequoia tfc:wood/boat/spruce tfc:wood/boat/sycamore tfc:wood/boat/white_cedar tfc:wood/boat/willow tfc:wood/chest_boat/acacia tfc:wood/chest_boat/ash tfc:wood/chest_boat/aspen tfc:wood/chest_boat/birch tfc:wood/chest_boat/blackwood tfc:wood/chest_boat/chestnut tfc:wood/chest_boat/douglas_fir tfc:wood/chest_boat/hickory tfc:wood/chest_boat/kapok tfc:wood/chest_boat/mangrove tfc:wood/chest_boat/maple tfc:wood/chest_boat/oak tfc:wood/chest_boat/palm tfc:wood/chest_boat/pine tfc:wood/chest_boat/rosewood tfc:wood/chest_boat/sequoia tfc:wood/chest_boat/spruce tfc:wood/chest_boat/sycamore tfc:wood/chest_boat/white_cedar tfc:wood/chest_boat/willow \
\
wilderwild:baobab_boat wilderwild:baobab_chest_boat wilderwild:boat wilderwild:chest_boat wilderwild:cypress_boat wilderwild:cypress_chest_boat wilderwild:maple_boat wilderwild:maple_chest_boat wilderwild:palm_boat wilderwild:palm_chest_boat
# Allay
entity.50080 = allay \
\
adventurez:amethyst_golem adventurez:blackstone_golem adventurez:nightmare adventurez:soul_reaper adventurez:the_eye adventurez:tiny_eye \
\
betterend:dragonfly betterend:end_fish \
\
born_in_chaos_v1:felsteed born_in_chaos_v1:intoxicatind_bomb_projectile born_in_chaos_v1:lord_pumpkinhead born_in_chaos_v1:lord_pumpkinhead_head born_in_chaos_v1:lord_pumpkinhead_withouta_horse born_in_chaos_v1:lord_the_headless born_in_chaos_v1:lords_felsteed born_in_chaos_v1:missionary_charge born_in_chaos_v1:mr_pumpkin born_in_chaos_v1:mr_pumpkin_controlled born_in_chaos_v1:nightmare_stalker born_in_chaos_v1:phantom_bomb_entity born_in_chaos_v1:phantom_bomb_projectile born_in_chaos_v1:pumpkin_bomb born_in_chaos_v1:pumpkin_pistol_2_projectile born_in_chaos_v1:pumpkin_pistol_projectile born_in_chaos_v1:pumpkin_staff_2_projectile born_in_chaos_v1:pumpkin_staff_projectile born_in_chaos_v1:pumpkinhead born_in_chaos_v1:riding_felsteed born_in_chaos_v1:riding_lords_felsteed born_in_chaos_v1:seared_spirit born_in_chaos_v1:seared_spirit_not_despawn born_in_chaos_v1:senor_pumpkin born_in_chaos_v1:sir_pumpkinhead born_in_chaos_v1:sir_pumpkinhead_without_horse born_in_chaos_v1:sir_the_headless born_in_chaos_v1:staffof_blindness_projectile born_in_chaos_v1:stimulating_bombprojectile \
\
create_enchantment_industry:hyper_experience_bottle \
\
iceandfire:pixie \
\
immersive_aircraft:bullet \
\
ore_creeper:coal_creeper ore_creeper:copper_creeper ore_creeper:diamond_creeper ore_creeper:emerald_creeper ore_creeper:gold_creeper ore_creeper:iron_creeper ore_creeper:lapis_lazuli_creeper ore_creeper:nether_gold_creeper ore_creeper:nether_quartz_creeper ore_creeper:redstone_creeper \
\
supplementaries:bomb \
\
tfc:glow_arrow
# Slimes and Chickens
entity.50084 = slime chicken \
\
betterend:end_slime \
\
tconstruct:earth_slime tconstruct:ender_slime tconstruct:sky_slime tconstruct:terracube
# Entity Fire
entity.50088 = entity_flame
# Fire Balls
entity.50089 = fireball dragon_fireball small_fireball \
\
securitycraft:imsbomb
# Trident
entity.50092 = trident \
\
iceandfire:tide_trident
# Minecarts
entity.50096 = minecart chest_minecart command_block_minecart furnace_minecart hopper_minecart spawner_minecart tnt_minecart \
\
fixedminecraft:dispenser_minecart \
\
lootr:lootr_minecart \
\
railways:benchcart railways:conductor railways:jukeboxcart \
\
supplementaries:dispenser_minecart \
\
tfc:chest_minecart tfc:holding_minecart
# Bogged
entity.50100 = bogged
# Piglins and Hoglins
entity.50104 = piglin piglin_brute zombified_piglin hoglin zoglin
entity.50108 = creaking \
\
enderzoology:wither_cat \
\
vanillabackport:creaking
# Name Tag - Iris Exclusive
entity.50112 = name_tag
# Copper Golems
entity.50116 = copper_golem
# Parched
entity.50120 = parched
# Zombie Nautilus
entity.50124 = zombie_nautilus
# End Crystal Beams
entity.50200 = end_crystal_beam
# Ender Dragon
entity.50204 = ender_dragon \
\
adventurez:dragon adventurez:ender_whale adventurez:enderwarthog adventurez:void_shadow
# ██╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗
# ███║ ███║██╔═████╗ ██║ ██║██╔════╝██╔══██╗██╔════╝
# ╚██║ ╚██║██║██╔██║█████╗ ███████║█████╗ ██████╔╝█████╗
# ██║ ██║████╔╝██║╚════╝ ██╔══██║██╔══╝ ██╔══██╗██╔══╝
# ██║██╗██║╚██████╔╝ ██║ ██║███████╗██║ ██║███████╗
# ╚═╝╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝
#1.10 And Below Mapping (Cap Sensitive!):
#else
# End Crystal
entity.50000 = EnderCrystal
# Lightning Bolt
entity.50004 = lightning_bolt
# Item Frames
entity.50008 = ItemFrame
# Iron Golem
entity.50012 = VillagerGolem
# Other Players
entity.50016 =
# Current Player
entity.50017 = current_player
# Blaze
entity.50020 = Blaze \
\
BiomesOPlenty.Pixie
# Creeper
entity.50024 = Creeper
# Drowned
entity.50028 =
# Gaurdian
entity.50032 =
# Elder Guardian
entity.50036 =
# Endermite
entity.50040 =
# Ghast
entity.50044 = Ghast
# Glow Squid
entity.50048 =
# Magma Cube
entity.50052 = LavaSlime
# Stray
entity.50056 =
# Vex
entity.50060 =
# Witch
entity.50064 = Witch
# Withers
entity.50068 = WitherBoss WitherSkull
# Experience Orbs
entity.50072 = XPOrb
# Boats
entity.50076 = Boat
# Allay
entity.50080 =
# Slimes and Chickens
entity.50084 = Slime Chicken \
\
BiomesOPlenty.Rosester BiomesOPlenty.Glob
# Entity Fire
entity.50088 = entity_flame
# Fire Balls
entity.50089 = Fireball
# Trident
entity.50092 =
# Minecarts
entity.50096 = MinecartChest MinecartCommandBlock MinecartFurnace MinecartHopper MinecartRideable MinecartSpawner MinecartTNT
# Bogged
entity.50100 =
# Piglins and Hoglins
entity.50104 =
# Creaking
entity.50108 =
# Name Tag - Iris Exclusive
entity.50112 = name_tag
# Copper Golems
entity.50116 =
# Parched
entity.50120 =
# Zombie Nautilus
entity.50124 =
# End Crystal Beams
entity.50200 = end_crystal_beam
# Ender Dragon
entity.50204 = EnderDragon
#endif
File diff suppressed because one or more lines are too long
@@ -1,200 +1,200 @@
#if FXAA_TAA_INTERACTION > 0
ivec2 neighbourhoodOffsets[8] = ivec2[8](
ivec2( 1, 1),
ivec2( 1,-1),
ivec2(-1, 1),
ivec2(-1,-1),
ivec2( 1, 0),
ivec2( 0, 1),
ivec2(-1, 0),
ivec2( 0,-1)
);
#endif
//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);
void FXAA311(inout vec3 color) {
float edgeThresholdMin = 0.03125;
float edgeThresholdMax = 0.0625;
float subpixelQuality = 0.75;
int iterations = 12;
vec2 view = 1.0 / vec2(viewWidth, viewHeight);
float lumaCenter = GetLuminance(color);
float lumaDown = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 0, -1), 0).rgb);
float lumaUp = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 0, 1), 0).rgb);
float lumaLeft = GetLuminance(texelFetch(colortex3, texelCoord + ivec2(-1, 0), 0).rgb);
float lumaRight = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 1, 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 * edgeThresholdMax)) {
float lumaDownLeft = GetLuminance(texelFetch(colortex3, texelCoord + ivec2(-1, -1), 0).rgb);
float lumaUpRight = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 1, 1), 0).rgb);
float lumaUpLeft = GetLuminance(texelFetch(colortex3, texelCoord + ivec2(-1, 1), 0).rgb);
float lumaDownRight = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 1, -1), 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(texture2D(colortex3, uv1).rgb);
float lumaEnd2 = GetLuminance(texture2D(colortex3, uv2).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(texture2D(colortex3, uv1).rgb);
lumaEnd1 = lumaEnd1 - lumaLocalAverage;
}
if (!reached2) {
lumaEnd2 = GetLuminance(texture2D(colortex3, uv2).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 * subpixelQuality;
finalOffset = max(finalOffset, subPixelOffsetFinal);
// Compute the final UV coordinates.
vec2 finalUv = texCoord;
if (isHorizontal) {
finalUv.y += finalOffset * stepLength;
} else {
finalUv.x += finalOffset * stepLength;
}
vec3 newColor = texture2D(colortex3, finalUv).rgb;
#define FXAA_STRENGTH_SKIP 1.0 - FXAA_STRENGTH * 0.01
#if FXAA_TAA_INTERACTION > 0
// Less FXAA when moving
float skipFXAA = min(
20.0 * length(cameraPosition - previousCameraPosition),
FXAA_TAA_INTERACTION * 0.1
);
float z0 = texelFetch(depthtex0, texelCoord, 0).r;
float z1 = texelFetch(depthtex1, texelCoord, 0).r;
bool edge = false;
for (int i = 0; i < 8; i++) {
ivec2 texelCoordM = texelCoord + neighbourhoodOffsets[i];
float z0Check = texelFetch(depthtex0, texelCoordM, 0).r;
float z1Check = texelFetch(depthtex1, texelCoordM, 0).r;
if (max(abs(GetLinearDepth(z0Check) - GetLinearDepth(z0)), abs(GetLinearDepth(z1Check) - GetLinearDepth(z1))) > 0.09) {
edge = true;
break;
}
}
if (edge) skipFXAA = 0.0;
if (dot(texelFetch(colortex2, texelCoord, 0).rgb, vec3(1.0)) < 0.01) skipFXAA = 0.0;
skipFXAA = mix(skipFXAA, 1.0, FXAA_STRENGTH_SKIP);
#else
float skipFXAA = FXAA_STRENGTH_SKIP;
#endif
color = mix(newColor, color, skipFXAA);
// debug
//if (skipFXAA > texCoord.y && texCoord.x < 0.02) color.rgb = vec3(1,0,1);
}
}
#if FXAA_TAA_INTERACTION > 0
ivec2 neighbourhoodOffsets[8] = ivec2[8](
ivec2( 1, 1),
ivec2( 1,-1),
ivec2(-1, 1),
ivec2(-1,-1),
ivec2( 1, 0),
ivec2( 0, 1),
ivec2(-1, 0),
ivec2( 0,-1)
);
#endif
//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);
void FXAA311(inout vec3 color) {
float edgeThresholdMin = 0.03125;
float edgeThresholdMax = 0.0625;
float subpixelQuality = 0.75;
int iterations = 12;
vec2 view = 1.0 / vec2(viewWidth, viewHeight);
float lumaCenter = GetLuminance(color);
float lumaDown = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 0, -1), 0).rgb);
float lumaUp = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 0, 1), 0).rgb);
float lumaLeft = GetLuminance(texelFetch(colortex3, texelCoord + ivec2(-1, 0), 0).rgb);
float lumaRight = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 1, 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 * edgeThresholdMax)) {
float lumaDownLeft = GetLuminance(texelFetch(colortex3, texelCoord + ivec2(-1, -1), 0).rgb);
float lumaUpRight = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 1, 1), 0).rgb);
float lumaUpLeft = GetLuminance(texelFetch(colortex3, texelCoord + ivec2(-1, 1), 0).rgb);
float lumaDownRight = GetLuminance(texelFetch(colortex3, texelCoord + ivec2( 1, -1), 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(texture2D(colortex3, uv1).rgb);
float lumaEnd2 = GetLuminance(texture2D(colortex3, uv2).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(texture2D(colortex3, uv1).rgb);
lumaEnd1 = lumaEnd1 - lumaLocalAverage;
}
if (!reached2) {
lumaEnd2 = GetLuminance(texture2D(colortex3, uv2).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 * subpixelQuality;
finalOffset = max(finalOffset, subPixelOffsetFinal);
// Compute the final UV coordinates.
vec2 finalUv = texCoord;
if (isHorizontal) {
finalUv.y += finalOffset * stepLength;
} else {
finalUv.x += finalOffset * stepLength;
}
vec3 newColor = texture2D(colortex3, finalUv).rgb;
#define FXAA_STRENGTH_SKIP 1.0 - FXAA_STRENGTH * 0.01
#if FXAA_TAA_INTERACTION > 0
// Less FXAA when moving
float skipFXAA = min(
20.0 * length(cameraPosition - previousCameraPosition),
FXAA_TAA_INTERACTION * 0.1
);
float z0 = texelFetch(depthtex0, texelCoord, 0).r;
float z1 = texelFetch(depthtex1, texelCoord, 0).r;
bool edge = false;
for (int i = 0; i < 8; i++) {
ivec2 texelCoordM = texelCoord + neighbourhoodOffsets[i];
float z0Check = texelFetch(depthtex0, texelCoordM, 0).r;
float z1Check = texelFetch(depthtex1, texelCoordM, 0).r;
if (max(abs(GetLinearDepth(z0Check) - GetLinearDepth(z0)), abs(GetLinearDepth(z1Check) - GetLinearDepth(z1))) > 0.09) {
edge = true;
break;
}
}
if (edge) skipFXAA = 0.0;
if (dot(texelFetch(colortex2, texelCoord, 0).rgb, vec3(1.0)) < 0.01) skipFXAA = 0.0;
skipFXAA = mix(skipFXAA, 1.0, FXAA_STRENGTH_SKIP);
#else
float skipFXAA = FXAA_STRENGTH_SKIP;
#endif
color = mix(newColor, color, skipFXAA);
// debug
//if (skipFXAA > texCoord.y && texCoord.x < 0.02) color.rgb = vec3(1,0,1);
}
}
@@ -1,25 +1,25 @@
// Jitter offset from Chocapic13
vec2 jitterOffsets[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 TAAJitter(vec2 coord, float w) {
#if TAA_JITTER > 0
vec2 offset = jitterOffsets[int(framemod8)] * (w / vec2(viewWidth, viewHeight));
#if TAA_JITTER == 1
offset *= 0.125;
#elif TAA_JITTER == 2
offset *= 0.33;
#endif
return coord + offset;
#else
return coord;
#endif
}
// Jitter offset from Chocapic13
vec2 jitterOffsets[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 TAAJitter(vec2 coord, float w) {
#if TAA_JITTER > 0
vec2 offset = jitterOffsets[int(framemod8)] * (w / vec2(viewWidth, viewHeight));
#if TAA_JITTER == 1
offset *= 0.125;
#elif TAA_JITTER == 2
offset *= 0.33;
#endif
return coord + offset;
#else
return coord;
#endif
}
@@ -1,208 +1,208 @@
#if TAA_SMOOTHING == 2
float blendMinimum = 0.3;
float blendVariable = 0.3;
float blendConstant = 0.6;
float regularEdge = 10.0;
float extraEdgeMult = 2.0;
float farEdgeDist = 128.0;
#elif TAA_SMOOTHING == 3
float blendMinimum = 0.35;
float blendVariable = 0.2;
float blendConstant = 0.7;
float regularEdge = 6.0;
float extraEdgeMult = 3.0;
float farEdgeDist = 112.0;
#elif TAA_SMOOTHING == 4
float blendMinimum = 0.5;
float blendVariable = 0.15;
float blendConstant = 0.75;
float regularEdge = 4.0;
float extraEdgeMult = 3.5;
float farEdgeDist = 96.0;
#endif
#if TAA_MOVEMENT_IMPROVEMENT_FILTER == 1
//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).rgb, 1.0) * (w12.x * w0.y ) +
vec4(texture2DLod(colortex, vec2(tc0.x, tc12.y), 0).rgb, 1.0) * (w0.x * w12.y) +
vec4(texture2DLod(colortex, vec2(tc12.x, tc12.y), 0).rgb, 1.0) * (w12.x * w12.y) +
vec4(texture2DLod(colortex, vec2(tc3.x, tc12.y), 0).rgb, 1.0) * (w3.x * w12.y) +
vec4(texture2DLod(colortex, vec2(tc12.x, tc3.y ), 0).rgb, 1.0) * (w12.x * w3.y );
return color.rgb / color.a;
}
#endif
// Previous frame reprojection from Chocapic13
vec2 Reprojection(vec4 viewPos1) {
vec4 pos = gbufferModelViewInverse * viewPos1;
vec4 previousPosition = pos + vec4(cameraPosition - previousCameraPosition, 0.0);
previousPosition = gbufferPreviousModelView * previousPosition;
previousPosition = gbufferPreviousProjection * previousPosition;
return previousPosition.xy / previousPosition.w * 0.5 + 0.5;
}
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;
}
ivec2 neighbourhoodOffsets[8] = ivec2[8](
ivec2( 1, 1),
ivec2( 1,-1),
ivec2(-1, 1),
ivec2(-1,-1),
ivec2( 1, 0),
ivec2( 0, 1),
ivec2(-1, 0),
ivec2( 0,-1)
);
void NeighbourhoodClamping(vec3 color, inout vec3 tempColor, float z0, float z1, inout float edge) {
vec3 minclr = color; vec3 maxclr = minclr;
int cc = 2;
ivec2 texelCoordM1 = clamp(texelCoord, ivec2(cc), ivec2(view) - cc); // Fixes screen edges
for (int i = 0; i < 8; i++) {
ivec2 texelCoordM2 = texelCoordM1 + neighbourhoodOffsets[i];
float z0CheckLinear = GetLinearDepth(texelFetch(depthtex0, texelCoordM2, 0).r);
float z1CheckLinear = GetLinearDepth(texelFetch(depthtex1, texelCoordM2, 0).r);
float z0Linear = GetLinearDepth(z0);
float z1Linear = GetLinearDepth(z1);
if (max(abs(z0CheckLinear - z0Linear), abs(z1CheckLinear - z1Linear)) > 0.09) {
edge = regularEdge;
float approxClosestDist = min(z0CheckLinear, z0Linear) * far;
if (approxClosestDist < farEdgeDist)
if (int(texelFetch(colortex6, texelCoordM2, 0).g * 255.1) == 253) // Reduced Edge TAA
edge *= extraEdgeMult;
}
vec3 clr = texelFetch(colortex3, texelCoordM2, 0).rgb;
minclr = min(minclr, clr); maxclr = max(maxclr, clr);
}
tempColor = ClipAABB(tempColor, minclr, maxclr);
}
void DoTAA(inout vec3 color, inout vec3 temp, float z1) {
int materialMask = int(texelFetch(colortex6, texelCoord, 0).g * 255.1);
vec4 screenPos1 = vec4(texCoord, z1, 1.0);
vec4 viewPos1 = gbufferProjectionInverse * (screenPos1 * 2.0 - 1.0);
viewPos1 /= viewPos1.w;
float lViewPos1 = length(viewPos1);
#ifdef ENTITY_TAA_NOISY_CLOUD_FIX
float cloudLinearDepth = texture2D(colortex5, texCoord).a;
if (pow2(cloudLinearDepth) * renderDistance < min(lViewPos1, renderDistance)) {
// Material in question is obstructed by the cloud volume
materialMask = 0;
}
#endif
if (
abs(materialMask - 149.5) < 50.0 // Entity Reflection Handling (see common.glsl for details)
|| materialMask == 254 // No SSAO, No TAA, Reduce Reflection
) {
return;
}
/*if (materialMask == 254) { // No SSAO, No TAA, Reduce Reflection
#ifndef CUSTOM_PBR
if (z1 <= 0.56) return; // The edge pixel trick doesn't look nice on hand
#endif
int i = 0;
while (i < 4) {
int mms = int(texelFetch(colortex6, texelCoord + neighbourhoodOffsets[i], 0).g * 255.1);
if (mms != materialMask) break;
i++;
} // Checking edge-pixels prevents flickering
if (i == 4) return;
}*/
float z0 = texelFetch(depthtex0, texelCoord, 0).r;
vec2 prvCoord = texCoord;
if (z1 > 0.56) prvCoord = Reprojection(viewPos1);
#if TAA_MOVEMENT_IMPROVEMENT_FILTER == 1
vec3 tempColor = textureCatmullRom(colortex2, prvCoord, view);
#else
vec3 tempColor = texture2D(colortex2, prvCoord).rgb;
#endif
if (tempColor == vec3(0.0) || any(isnan(tempColor))) { // Fixes the first frame and nans
temp = color;
return;
}
float edge = 0.0;
NeighbourhoodClamping(color, tempColor, z0, z1, edge);
if (materialMask == 253) // Reduced Edge TAA
edge *= extraEdgeMult;
#ifdef DISTANT_HORIZONS
if (z0 == 1.0) {
blendMinimum = 0.75;
blendVariable = 0.05;
blendConstant = 0.9;
edge = 1.0;
}
#endif
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);
float velocityFactor = dot(velocity, velocity) * 10.0;
blendFactor *= max(exp(-velocityFactor) * blendVariable + blendConstant - min(length(cameraPosition - previousCameraPosition), 0.05) * edge, blendMinimum);
#ifdef RAIN_ATMOSPHERE
blendFactor *= 1.0 - isLightningActive();
#endif
#ifdef MIRROR_DIMENSION
blendFactor = 0.0;
#endif
color = mix(color, tempColor, blendFactor);
temp = color;
//if (edge > 0.05) color.rgb = vec3(1.0, 0.0, 1.0);
}
#if TAA_SMOOTHING == 2
float blendMinimum = 0.3;
float blendVariable = 0.3;
float blendConstant = 0.6;
float regularEdge = 10.0;
float extraEdgeMult = 2.0;
float farEdgeDist = 128.0;
#elif TAA_SMOOTHING == 3
float blendMinimum = 0.35;
float blendVariable = 0.2;
float blendConstant = 0.7;
float regularEdge = 6.0;
float extraEdgeMult = 3.0;
float farEdgeDist = 112.0;
#elif TAA_SMOOTHING == 4
float blendMinimum = 0.5;
float blendVariable = 0.15;
float blendConstant = 0.75;
float regularEdge = 4.0;
float extraEdgeMult = 3.5;
float farEdgeDist = 96.0;
#endif
#if TAA_MOVEMENT_IMPROVEMENT_FILTER == 1
//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).rgb, 1.0) * (w12.x * w0.y ) +
vec4(texture2DLod(colortex, vec2(tc0.x, tc12.y), 0).rgb, 1.0) * (w0.x * w12.y) +
vec4(texture2DLod(colortex, vec2(tc12.x, tc12.y), 0).rgb, 1.0) * (w12.x * w12.y) +
vec4(texture2DLod(colortex, vec2(tc3.x, tc12.y), 0).rgb, 1.0) * (w3.x * w12.y) +
vec4(texture2DLod(colortex, vec2(tc12.x, tc3.y ), 0).rgb, 1.0) * (w12.x * w3.y );
return color.rgb / color.a;
}
#endif
// Previous frame reprojection from Chocapic13
vec2 Reprojection(vec4 viewPos1) {
vec4 pos = gbufferModelViewInverse * viewPos1;
vec4 previousPosition = pos + vec4(cameraPosition - previousCameraPosition, 0.0);
previousPosition = gbufferPreviousModelView * previousPosition;
previousPosition = gbufferPreviousProjection * previousPosition;
return previousPosition.xy / previousPosition.w * 0.5 + 0.5;
}
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;
}
ivec2 neighbourhoodOffsets[8] = ivec2[8](
ivec2( 1, 1),
ivec2( 1,-1),
ivec2(-1, 1),
ivec2(-1,-1),
ivec2( 1, 0),
ivec2( 0, 1),
ivec2(-1, 0),
ivec2( 0,-1)
);
void NeighbourhoodClamping(vec3 color, inout vec3 tempColor, float z0, float z1, inout float edge) {
vec3 minclr = color; vec3 maxclr = minclr;
int cc = 2;
ivec2 texelCoordM1 = clamp(texelCoord, ivec2(cc), ivec2(view) - cc); // Fixes screen edges
for (int i = 0; i < 8; i++) {
ivec2 texelCoordM2 = texelCoordM1 + neighbourhoodOffsets[i];
float z0CheckLinear = GetLinearDepth(texelFetch(depthtex0, texelCoordM2, 0).r);
float z1CheckLinear = GetLinearDepth(texelFetch(depthtex1, texelCoordM2, 0).r);
float z0Linear = GetLinearDepth(z0);
float z1Linear = GetLinearDepth(z1);
if (max(abs(z0CheckLinear - z0Linear), abs(z1CheckLinear - z1Linear)) > 0.09) {
edge = regularEdge;
float approxClosestDist = min(z0CheckLinear, z0Linear) * far;
if (approxClosestDist < farEdgeDist)
if (int(texelFetch(colortex6, texelCoordM2, 0).g * 255.1) == 253) // Reduced Edge TAA
edge *= extraEdgeMult;
}
vec3 clr = texelFetch(colortex3, texelCoordM2, 0).rgb;
minclr = min(minclr, clr); maxclr = max(maxclr, clr);
}
tempColor = ClipAABB(tempColor, minclr, maxclr);
}
void DoTAA(inout vec3 color, inout vec3 temp, float z1) {
int materialMask = int(texelFetch(colortex6, texelCoord, 0).g * 255.1);
vec4 screenPos1 = vec4(texCoord, z1, 1.0);
vec4 viewPos1 = gbufferProjectionInverse * (screenPos1 * 2.0 - 1.0);
viewPos1 /= viewPos1.w;
float lViewPos1 = length(viewPos1);
#ifdef ENTITY_TAA_NOISY_CLOUD_FIX
float cloudLinearDepth = texture2D(colortex5, texCoord).a;
if (pow2(cloudLinearDepth) * renderDistance < min(lViewPos1, renderDistance)) {
// Material in question is obstructed by the cloud volume
materialMask = 0;
}
#endif
if (
abs(materialMask - 149.5) < 50.0 // Entity Reflection Handling (see common.glsl for details)
|| materialMask == 254 // No SSAO, No TAA, Reduce Reflection
) {
return;
}
/*if (materialMask == 254) { // No SSAO, No TAA, Reduce Reflection
#ifndef CUSTOM_PBR
if (z1 <= 0.56) return; // The edge pixel trick doesn't look nice on hand
#endif
int i = 0;
while (i < 4) {
int mms = int(texelFetch(colortex6, texelCoord + neighbourhoodOffsets[i], 0).g * 255.1);
if (mms != materialMask) break;
i++;
} // Checking edge-pixels prevents flickering
if (i == 4) return;
}*/
float z0 = texelFetch(depthtex0, texelCoord, 0).r;
vec2 prvCoord = texCoord;
if (z1 > 0.56) prvCoord = Reprojection(viewPos1);
#if TAA_MOVEMENT_IMPROVEMENT_FILTER == 1
vec3 tempColor = textureCatmullRom(colortex2, prvCoord, view);
#else
vec3 tempColor = texture2D(colortex2, prvCoord).rgb;
#endif
if (tempColor == vec3(0.0) || any(isnan(tempColor))) { // Fixes the first frame and nans
temp = color;
return;
}
float edge = 0.0;
NeighbourhoodClamping(color, tempColor, z0, z1, edge);
if (materialMask == 253) // Reduced Edge TAA
edge *= extraEdgeMult;
#ifdef DISTANT_HORIZONS
if (z0 == 1.0) {
blendMinimum = 0.75;
blendVariable = 0.05;
blendConstant = 0.9;
edge = 1.0;
}
#endif
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);
float velocityFactor = dot(velocity, velocity) * 10.0;
blendFactor *= max(exp(-velocityFactor) * blendVariable + blendConstant - min(length(cameraPosition - previousCameraPosition), 0.05) * edge, blendMinimum);
#ifdef RAIN_ATMOSPHERE
blendFactor *= 1.0 - isLightningActive();
#endif
#ifdef MIRROR_DIMENSION
blendFactor = 0.0;
#endif
color = mix(color, tempColor, blendFactor);
temp = color;
//if (edge > 0.05) color.rgb = vec3(1.0, 0.0, 1.0);
}
@@ -1,267 +1,267 @@
#if !defined AURORA_BOREALIS_GLSL
#define AURORA_BOREALIS_GLSL
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#include "/lib/util/colorConversion.glsl"
#define AURORA_CONDITION 3 //[-1 0 1 2 3 4]
#define AURORA_COLOR_PRESET 0 //[-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] // 0 is manual and default, 1 is daily, 2 is monthly and 3 is one color preset same with all numbers after
#define AURORA_UP_R 112 //[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_UP_G 36 //[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_UP_B 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 AURORA_UP_I 33 //[0 3 5 8 10 13 15 18 20 23 25 28 30 33 35 38 40 43 45 48 50 53 55 58 60 63 65 68 70 73 75 78 80 83 85 88 90 93 95 98 100]
#define AURORA_DOWN_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 AURORA_DOWN_G 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_DOWN_B 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 AURORA_DOWN_I 33 //[0 3 5 8 10 13 15 18 20 23 25 28 30 33 35 38 40 43 45 48 50 53 55 58 60 63 65 68 70 73 75 78 80 83 85 88 90 93 95 98 100]
#define AURORA_SIZE 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 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]
#define AURORA_DRAW_DISTANCE 0.65 //[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 RANDOM_AURORA 0 //[0 1 2 3 4 5 6 7 8 9]
//#define RGB_AURORA
#define AURORA_CLOUD_INFLUENCE_INTENSITY 1.00 //[0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.50 3.00]
#define AURORA_TERRAIN_INFLUENCE_INTENSITY 1.00 //[0.00 0.25 0.50 0.75 1.00 1.25 1.50]
#define AURORA_NOISE_SCALE 1.00 //[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 4.05 4.10 4.15 4.20 4.25 4.30 4.35 4.40 4.45 4.50 4.55 4.60 4.65 4.70 4.75 4.80 4.85 4.90 4.95 5.00]
#define AURORA_PATTERN_WARP 0 //[0 1 2 3 4 5 6 7 8 9 10]
#define AURORA_SATURATION 10 //[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
#define AURORA_COLOR_MIX_POWER 2.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0]
float GetAuroraVisibility(in float VdotU, float VdotUAmount) {
float visibility = sqrt1(clamp01(mix(1.0, VdotU, VdotUAmount) * (AURORA_DRAW_DISTANCE * 1.125 + 0.75) - 0.225)) - sunVisibility - maxBlindnessDarkness;
#ifdef CLEAR_SKY_WHEN_RAINING
visibility -= rainFactor * 0.5;
#else
visibility -= rainFactor;
#endif
visibility *= 1.0 - VdotU * 0.9 * VdotUAmount;
#if AURORA_CONDITION == 1 || AURORA_CONDITION == 3
visibility -= moonPhase;
#endif
#if AURORA_CONDITION == 2 || AURORA_CONDITION == 3
visibility *= inSnowy;
#endif
#if AURORA_CONDITION == 4
visibility = max(visibility * inSnowy, visibility - moonPhase);
#endif
#if AURORA_CONDITION == -1 // Always except new moon
visibility *= clamp01(max(moonPhase, 1) % 4);
#endif
#if RANDOM_AURORA > 0
float randomValue = hash11(float(worldDay));
if (randomValue > RANDOM_AURORA * 0.1) {
visibility = -1.0; // Disable aurora this day
}
#endif
return visibility;
}
vec3 auroraUpA[] = vec3[](
vec3(112.0, 36.0, 192.0), // [1] [2] Complementary
vec3(112.0, 80.0, 255.0), // [3] Legacy Complementary (v4)
vec3(168.0, 36.0, 88.0), // [4] permafrost
vec3(255.0, 68.0, 124.0), // [5] Blossoming Lights (Pink)
vec3(72.0, 96.0, 192.0), // [6] Nebula
vec3(24.0, 255.0, 140.0), // [7] Celestial Dance
vec3(255.0, 220.0, 255.0), // [8] Green Flash
vec3(64.0, 255.0, 255.0), // [9] Ethereal Lights
vec3(0.0, 20.0, 60.0), // [10] Glacial Blessing
vec3(132.0, 0.0, 200.0), // [11] Mythical Lights
vec3(120.0, 212.0, 56.0), // [12] watermelon
vec3(0.0, 255.0, 255.0), // [13] blood bath
vec3(255.0, 80.0, 112.0) // [14] Ghost
);
vec3 auroraDownA[] = vec3[](
vec3(96.0, 255.0, 192.0), // [1] [2] Complementary
vec3(80.0, 255.0, 180.0), // [3] Legacy Complementary (v4)
vec3(60.0, 184.0, 152.0), // [4] permafrost
vec3(160.0, 96.0, 255.0), // [5] Blossoming Lights (Pink)
vec3(172.0, 44.0, 88.0), // [6] Nebula
vec3(108.0, 72.0, 255.0), // [7] Celestial Dance
vec3(68.0, 255.0, 72.0), // [8] Green Flash
vec3(128.0, 64.0, 128.0), // [9] Ethereal Lights
vec3(0.0, 24.0, 36.0), // [10] Glacial Blessing
vec3(56.0, 168.0, 255.0), // [11] Mythical Lights
vec3(176.0, 88.0, 72.0), // [12] watermelon
vec3(180.0, 0.0, 0.0), // [13] blood bath
vec3(80.0, 255.0, 180.0) // [14] Ghost
);
vec2 warpAuroraCoords(vec2 coord, float warpAmount) {
float angle = texture2D(noisetex, coord * 0.5).r * 6.28318 * warpAmount;
float strength = texture2D(noisetex, coord * 0.7 + 0.5).r * warpAmount;
vec2 offset = vec2(cos(angle), sin(angle)) * strength;
return coord + offset;
}
void GetAuroraColor(in vec2 wpos, out vec3 auroraUp, out vec3 auroraDown) {
#ifdef RGB_AURORA
auroraUp = getRainbowColor(wpos, 0.06);
auroraDown = getRainbowColor(wpos, 0.05);
#elif AURORA_COLOR_PRESET == 0
auroraUp = vec3(AURORA_UP_R, AURORA_UP_G, AURORA_UP_B);
auroraDown = vec3(AURORA_DOWN_R, AURORA_DOWN_G, AURORA_DOWN_B);
#elif AURORA_COLOR_PRESET == -1
float randomValue = hash11(float(worldDay));
randomValue = pow(randomValue, 0.7); // Bias towards higher values (more transitions)
float transitionsPerNight = min(randomValue * 2.0, 1.75);
float idx, frac = modf(nightFactor * transitionsPerNight, idx);
int dayOffset = worldDay % auroraUpA.length();
int colorsCount = auroraUpA.length();
int i0 = (int(idx) + dayOffset) % colorsCount;
int i1 = (i0 + 1) % colorsCount;
// Interpolate in OKLab color space for perceptually uniform transitions
vec3 oklabUp0 = rgb2oklab(auroraUpA[i0] / 255.0);
vec3 oklabUp1 = rgb2oklab(auroraUpA[i1] / 255.0);
vec3 oklabDown0 = rgb2oklab(auroraDownA[i0] / 255.0);
vec3 oklabDown1 = rgb2oklab(auroraDownA[i1] / 255.0);
auroraUp = oklab2rgb(mix(oklabUp0, oklabUp1, frac)) * 255.0;
auroraDown = oklab2rgb(mix(oklabDown0, oklabDown1, frac)) * 255.0;
#else
#if AURORA_COLOR_PRESET == 1
int p = worldDay % auroraUpA.length();
#elif AURORA_COLOR_PRESET == 2
int p = worldDay % (auroraUpA.length() * 8) / 8;
#else
const int p = AURORA_COLOR_PRESET - 2;
#endif
auroraUp = auroraUpA[p];
auroraDown = auroraDownA[p];
#endif
auroraUp = max(auroraUp, vec3(0.001));
auroraDown = max(auroraDown, vec3(0.001));
auroraUp *= (AURORA_UP_I * 0.093 + 3.1) / GetLuminance(auroraUp);
auroraDown *= (AURORA_DOWN_I * 0.245 + 8.15) / GetLuminance(auroraDown);
#if AURORA_SATURATION != 10
auroraUp = rgb2hsv(auroraUp);
auroraUp.g *= AURORA_SATURATION * 0.1;
auroraUp = hsv2rgb(auroraUp);
auroraDown = rgb2hsv(auroraDown);
auroraDown.g *= AURORA_SATURATION * 0.1;
auroraDown = hsv2rgb(auroraDown);
#endif
}
vec3 getAuroraAmbientColor(vec3 color, vec3 viewPos, float multiplier, float influence, float VdotUAmount) {
float visibility = GetAuroraVisibility(0.5, VdotUAmount);
if (visibility > 0) {
vec3 wpos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
wpos.xz /= (abs(wpos.y) + length(wpos.xz));
vec3 auroraUp, auroraDown;
GetAuroraColor(wpos.xz, auroraUp, auroraDown);
vec3 auroraColor = mix(auroraUp, auroraDown, 0.8);
#ifdef COMPOSITE1
visibility *= influence;
return mix(color, auroraColor, visibility);
#endif
auroraColor *= multiplier;
visibility *= influence;
#ifdef DEFERRED1
return mix(color, saturateColors(auroraColor, 0.8) * visibility * 0.45, visibility);
#endif
float luminanceColor = GetLuminance(color);
vec3 newColor = mix(color, mix(color, vec3(luminanceColor), 0.88), visibility);
newColor *= mix(vec3(1.0), auroraColor * luminanceColor * 10.0, visibility);
return clamp01(newColor);
// return mix(color, color * auroraColor, visibility); // old, keep it for now
}
return color;
}
vec3 GetAuroraBorealis(vec3 viewPos, float VdotU, float dither) {
float visibility = GetAuroraVisibility(VdotU, 1.0);
if (visibility > 0.0) {
vec3 aurora = vec3(0.0);
vec3 wpos = mat3(gbufferModelViewInverse) * viewPos;
wpos.xz /= wpos.y;
vec2 cameraPositionM = cameraPosition.xz * 0.0075;
cameraPositionM.x += syncedTime * 0.04;
#ifdef DEFERRED1
int sampleCount = 25;
int sampleCountP = sampleCount + 5;
#else
int sampleCount = 10;
int sampleCountP = sampleCount + 10;
#endif
float ditherM = dither + 5.0;
float auroraAnimate = frameTimeCounter * 0.001;
vec3 auroraUp, auroraDown;
GetAuroraColor(wpos.xz, auroraUp, auroraDown);
for (int i = 0; i < sampleCount; i++) {
float current = pow2((i + ditherM) / sampleCountP);
vec2 planePos = wpos.xz * (AURORA_SIZE * 0.8 + current) * 11.0 * AURORA_NOISE_SCALE + cameraPositionM;
#if AURORA_STYLE == 1
planePos = floor(planePos) * 0.0007;
#if AURORA_PATTERN_WARP > 0
planePos = warpAuroraCoords(planePos, AURORA_PATTERN_WARP * 0.0057);
#endif
float noise = texture2DLod(noisetex, planePos, 0.0).b;
noise = pow2(pow2(pow2(pow2(1.0 - 2.0 * abs(noise - 0.5)))));
noise *= pow1_5(texture2DLod(noisetex, planePos * 100.0 + auroraAnimate, 0.0).b);
#else
planePos *= 0.0007;
#if AURORA_PATTERN_WARP > 0
planePos = warpAuroraCoords(planePos, AURORA_PATTERN_WARP * 0.0082);
#endif
float noise = texture2DLod(noisetex, planePos, 0.0).r;
noise = pow2(pow2(pow2(pow2(1.0 - 2.0 * abs(noise - 0.5)))));
noise *= texture2DLod(noisetex, planePos * 3.0 + auroraAnimate, 0.0).b;
noise *= texture2DLod(noisetex, planePos * 5.0 - auroraAnimate, 0.0).b;
#endif
float currentM = 1.0 - current;
aurora += noise * currentM * mix(auroraUp, auroraDown, pow(pow2(currentM), AURORA_COLOR_MIX_POWER));
}
#if AURORA_STYLE == 1
aurora *= 1.3;
#else
aurora *= 1.8;
#endif
#ifdef ATM_COLOR_MULTS
aurora *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
return aurora * visibility / sampleCount;
}
return vec3(0.0);
}
#endif
#if !defined AURORA_BOREALIS_GLSL
#define AURORA_BOREALIS_GLSL
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#include "/lib/util/colorConversion.glsl"
#define AURORA_CONDITION 3 //[-1 0 1 2 3 4]
#define AURORA_COLOR_PRESET 0 //[-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] // 0 is manual and default, 1 is daily, 2 is monthly and 3 is one color preset same with all numbers after
#define AURORA_UP_R 112 //[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_UP_G 36 //[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_UP_B 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 AURORA_UP_I 33 //[0 3 5 8 10 13 15 18 20 23 25 28 30 33 35 38 40 43 45 48 50 53 55 58 60 63 65 68 70 73 75 78 80 83 85 88 90 93 95 98 100]
#define AURORA_DOWN_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 AURORA_DOWN_G 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_DOWN_B 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 AURORA_DOWN_I 33 //[0 3 5 8 10 13 15 18 20 23 25 28 30 33 35 38 40 43 45 48 50 53 55 58 60 63 65 68 70 73 75 78 80 83 85 88 90 93 95 98 100]
#define AURORA_SIZE 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 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]
#define AURORA_DRAW_DISTANCE 0.65 //[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 RANDOM_AURORA 0 //[0 1 2 3 4 5 6 7 8 9]
//#define RGB_AURORA
#define AURORA_CLOUD_INFLUENCE_INTENSITY 1.00 //[0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.50 3.00]
#define AURORA_TERRAIN_INFLUENCE_INTENSITY 1.00 //[0.00 0.25 0.50 0.75 1.00 1.25 1.50]
#define AURORA_NOISE_SCALE 1.00 //[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 4.05 4.10 4.15 4.20 4.25 4.30 4.35 4.40 4.45 4.50 4.55 4.60 4.65 4.70 4.75 4.80 4.85 4.90 4.95 5.00]
#define AURORA_PATTERN_WARP 0 //[0 1 2 3 4 5 6 7 8 9 10]
#define AURORA_SATURATION 10 //[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
#define AURORA_COLOR_MIX_POWER 2.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0]
float GetAuroraVisibility(in float VdotU, float VdotUAmount) {
float visibility = sqrt1(clamp01(mix(1.0, VdotU, VdotUAmount) * (AURORA_DRAW_DISTANCE * 1.125 + 0.75) - 0.225)) - sunVisibility - maxBlindnessDarkness;
#ifdef CLEAR_SKY_WHEN_RAINING
visibility -= rainFactor * 0.5;
#else
visibility -= rainFactor;
#endif
visibility *= 1.0 - VdotU * 0.9 * VdotUAmount;
#if AURORA_CONDITION == 1 || AURORA_CONDITION == 3
visibility -= moonPhase;
#endif
#if AURORA_CONDITION == 2 || AURORA_CONDITION == 3
visibility *= inSnowy;
#endif
#if AURORA_CONDITION == 4
visibility = max(visibility * inSnowy, visibility - moonPhase);
#endif
#if AURORA_CONDITION == -1 // Always except new moon
visibility *= clamp01(max(moonPhase, 1) % 4);
#endif
#if RANDOM_AURORA > 0
float randomValue = hash11(float(worldDay));
if (randomValue > RANDOM_AURORA * 0.1) {
visibility = -1.0; // Disable aurora this day
}
#endif
return visibility;
}
vec3 auroraUpA[] = vec3[](
vec3(112.0, 36.0, 192.0), // [1] [2] Complementary
vec3(112.0, 80.0, 255.0), // [3] Legacy Complementary (v4)
vec3(168.0, 36.0, 88.0), // [4] permafrost
vec3(255.0, 68.0, 124.0), // [5] Blossoming Lights (Pink)
vec3(72.0, 96.0, 192.0), // [6] Nebula
vec3(24.0, 255.0, 140.0), // [7] Celestial Dance
vec3(255.0, 220.0, 255.0), // [8] Green Flash
vec3(64.0, 255.0, 255.0), // [9] Ethereal Lights
vec3(0.0, 20.0, 60.0), // [10] Glacial Blessing
vec3(132.0, 0.0, 200.0), // [11] Mythical Lights
vec3(120.0, 212.0, 56.0), // [12] watermelon
vec3(0.0, 255.0, 255.0), // [13] blood bath
vec3(255.0, 80.0, 112.0) // [14] Ghost
);
vec3 auroraDownA[] = vec3[](
vec3(96.0, 255.0, 192.0), // [1] [2] Complementary
vec3(80.0, 255.0, 180.0), // [3] Legacy Complementary (v4)
vec3(60.0, 184.0, 152.0), // [4] permafrost
vec3(160.0, 96.0, 255.0), // [5] Blossoming Lights (Pink)
vec3(172.0, 44.0, 88.0), // [6] Nebula
vec3(108.0, 72.0, 255.0), // [7] Celestial Dance
vec3(68.0, 255.0, 72.0), // [8] Green Flash
vec3(128.0, 64.0, 128.0), // [9] Ethereal Lights
vec3(0.0, 24.0, 36.0), // [10] Glacial Blessing
vec3(56.0, 168.0, 255.0), // [11] Mythical Lights
vec3(176.0, 88.0, 72.0), // [12] watermelon
vec3(180.0, 0.0, 0.0), // [13] blood bath
vec3(80.0, 255.0, 180.0) // [14] Ghost
);
vec2 warpAuroraCoords(vec2 coord, float warpAmount) {
float angle = texture2D(noisetex, coord * 0.5).r * 6.28318 * warpAmount;
float strength = texture2D(noisetex, coord * 0.7 + 0.5).r * warpAmount;
vec2 offset = vec2(cos(angle), sin(angle)) * strength;
return coord + offset;
}
void GetAuroraColor(in vec2 wpos, out vec3 auroraUp, out vec3 auroraDown) {
#ifdef RGB_AURORA
auroraUp = getRainbowColor(wpos, 0.06);
auroraDown = getRainbowColor(wpos, 0.05);
#elif AURORA_COLOR_PRESET == 0
auroraUp = vec3(AURORA_UP_R, AURORA_UP_G, AURORA_UP_B);
auroraDown = vec3(AURORA_DOWN_R, AURORA_DOWN_G, AURORA_DOWN_B);
#elif AURORA_COLOR_PRESET == -1
float randomValue = hash11(float(worldDay));
randomValue = pow(randomValue, 0.7); // Bias towards higher values (more transitions)
float transitionsPerNight = min(randomValue * 2.0, 1.75);
float idx, frac = modf(nightFactor * transitionsPerNight, idx);
int dayOffset = worldDay % auroraUpA.length();
int colorsCount = auroraUpA.length();
int i0 = (int(idx) + dayOffset) % colorsCount;
int i1 = (i0 + 1) % colorsCount;
// Interpolate in OKLab color space for perceptually uniform transitions
vec3 oklabUp0 = rgb2oklab(auroraUpA[i0] / 255.0);
vec3 oklabUp1 = rgb2oklab(auroraUpA[i1] / 255.0);
vec3 oklabDown0 = rgb2oklab(auroraDownA[i0] / 255.0);
vec3 oklabDown1 = rgb2oklab(auroraDownA[i1] / 255.0);
auroraUp = oklab2rgb(mix(oklabUp0, oklabUp1, frac)) * 255.0;
auroraDown = oklab2rgb(mix(oklabDown0, oklabDown1, frac)) * 255.0;
#else
#if AURORA_COLOR_PRESET == 1
int p = worldDay % auroraUpA.length();
#elif AURORA_COLOR_PRESET == 2
int p = worldDay % (auroraUpA.length() * 8) / 8;
#else
const int p = AURORA_COLOR_PRESET - 2;
#endif
auroraUp = auroraUpA[p];
auroraDown = auroraDownA[p];
#endif
auroraUp = max(auroraUp, vec3(0.001));
auroraDown = max(auroraDown, vec3(0.001));
auroraUp *= (AURORA_UP_I * 0.093 + 3.1) / GetLuminance(auroraUp);
auroraDown *= (AURORA_DOWN_I * 0.245 + 8.15) / GetLuminance(auroraDown);
#if AURORA_SATURATION != 10
auroraUp = rgb2hsv(auroraUp);
auroraUp.g *= AURORA_SATURATION * 0.1;
auroraUp = hsv2rgb(auroraUp);
auroraDown = rgb2hsv(auroraDown);
auroraDown.g *= AURORA_SATURATION * 0.1;
auroraDown = hsv2rgb(auroraDown);
#endif
}
vec3 getAuroraAmbientColor(vec3 color, vec3 viewPos, float multiplier, float influence, float VdotUAmount) {
float visibility = GetAuroraVisibility(0.5, VdotUAmount);
if (visibility > 0) {
vec3 wpos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
wpos.xz /= (abs(wpos.y) + length(wpos.xz));
vec3 auroraUp, auroraDown;
GetAuroraColor(wpos.xz, auroraUp, auroraDown);
vec3 auroraColor = mix(auroraUp, auroraDown, 0.8);
#ifdef COMPOSITE1
visibility *= influence;
return mix(color, auroraColor, visibility);
#endif
auroraColor *= multiplier;
visibility *= influence;
#ifdef DEFERRED1
return mix(color, saturateColors(auroraColor, 0.8) * visibility * 0.45, visibility);
#endif
float luminanceColor = GetLuminance(color);
vec3 newColor = mix(color, mix(color, vec3(luminanceColor), 0.88), visibility);
newColor *= mix(vec3(1.0), auroraColor * luminanceColor * 10.0, visibility);
return clamp01(newColor);
// return mix(color, color * auroraColor, visibility); // old, keep it for now
}
return color;
}
vec3 GetAuroraBorealis(vec3 viewPos, float VdotU, float dither) {
float visibility = GetAuroraVisibility(VdotU, 1.0);
if (visibility > 0.0) {
vec3 aurora = vec3(0.0);
vec3 wpos = mat3(gbufferModelViewInverse) * viewPos;
wpos.xz /= wpos.y;
vec2 cameraPositionM = cameraPosition.xz * 0.0075;
cameraPositionM.x += syncedTime * 0.04;
#ifdef DEFERRED1
int sampleCount = 25;
int sampleCountP = sampleCount + 5;
#else
int sampleCount = 10;
int sampleCountP = sampleCount + 10;
#endif
float ditherM = dither + 5.0;
float auroraAnimate = frameTimeCounter * 0.001;
vec3 auroraUp, auroraDown;
GetAuroraColor(wpos.xz, auroraUp, auroraDown);
for (int i = 0; i < sampleCount; i++) {
float current = pow2((i + ditherM) / sampleCountP);
vec2 planePos = wpos.xz * (AURORA_SIZE * 0.8 + current) * 11.0 * AURORA_NOISE_SCALE + cameraPositionM;
#if AURORA_STYLE == 1
planePos = floor(planePos) * 0.0007;
#if AURORA_PATTERN_WARP > 0
planePos = warpAuroraCoords(planePos, AURORA_PATTERN_WARP * 0.0057);
#endif
float noise = texture2DLod(noisetex, planePos, 0.0).b;
noise = pow2(pow2(pow2(pow2(1.0 - 2.0 * abs(noise - 0.5)))));
noise *= pow1_5(texture2DLod(noisetex, planePos * 100.0 + auroraAnimate, 0.0).b);
#else
planePos *= 0.0007;
#if AURORA_PATTERN_WARP > 0
planePos = warpAuroraCoords(planePos, AURORA_PATTERN_WARP * 0.0082);
#endif
float noise = texture2DLod(noisetex, planePos, 0.0).r;
noise = pow2(pow2(pow2(pow2(1.0 - 2.0 * abs(noise - 0.5)))));
noise *= texture2DLod(noisetex, planePos * 3.0 + auroraAnimate, 0.0).b;
noise *= texture2DLod(noisetex, planePos * 5.0 - auroraAnimate, 0.0).b;
#endif
float currentM = 1.0 - current;
aurora += noise * currentM * mix(auroraUp, auroraDown, pow(pow2(currentM), AURORA_COLOR_MIX_POWER));
}
#if AURORA_STYLE == 1
aurora *= 1.3;
#else
aurora *= 1.8;
#endif
#ifdef ATM_COLOR_MULTS
aurora *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
return aurora * visibility / sampleCount;
}
return vec3(0.0);
}
#endif
@@ -1,68 +1,68 @@
vec3 GetBedrockNoise(vec3 viewPos, float VdotU, float dither) {
float eyeAltitude1 = eyeAltitude * 0.005;
float visibility = clamp01(-VdotU * 1.875 - 0.225) * (1.0 - maxBlindnessDarkness);
visibility *= 1.0 + VdotU * 0.75;
float distanceAboveBedrock = bedrockLevel - eyeAltitude;
float fadeStart = 180.0;
float fadeWidth = 50.0;
float noiseHeight = 2.0 / (1.0 + exp(-(fadeStart - distanceAboveBedrock) / fadeWidth));
visibility *= -eyeAltitude1 * 3.0 + (bedrockLevel / 66.6) + 2.0;
if (visibility >= 0.0) {
vec3 wpos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
wpos /= (abs(wpos.y) + length(wpos.xz) * 0.5);
vec2 cameraPositionM = cameraPosition.xz * 0.0075;
cameraPositionM.x += frameTimeCounter * 0.004;
float VdotUM = 1.0 - VdotU * VdotU;
// Star calculation
vec2 starCoord = noiseHeight * wpos.xz * 0.2 + cameraPositionM * 0.1;
starCoord = floor(starCoord * 1024.0) / 1024.0;
float star = GetStarNoise(starCoord.xy) *
GetStarNoise(starCoord.xy+0.1) *
GetStarNoise(starCoord.xy+0.23);
star = max0((star - 0.4) * 6.0);
star *= star;
vec3 stars = star * vec3(0.1765, 0.1569, 0.1804) * (VdotUM + 0.3);
float wind = fract(frameTimeCounter * 0.0125);
const int sampleCount = 1;
const int sampleCountP = sampleCount + 5;
float ditherM = dither + 5.0;
vec3 spots = vec3(0.0);
for (int i = 0; i < sampleCount; i++) {
float current = pow2((i + ditherM) / sampleCountP);
float currentM = 1.0 - current;
vec2 planePos = wpos.xz * (0.5 + current) * noiseHeight;
planePos = (planePos * 0.5 + cameraPositionM * 0.5) * 20.0;
float noiseSpots = texture2DLod(noisetex, floor(planePos) * 0.1, 0.0).g;
vec3 noise = texture2DLod(noisetex, vec2(noiseSpots) + wind * 0.3, 0.0).b * vec3(0.3);
spots += noise * currentM * 6.0;
}
#ifdef OVERWORLD
spots = (spots - 0.5) * 1.5 + 0.5; // contrast
#else
spots = (spots - 0.5) * 3.5 + 0.5; // contrast
#endif
spots += stars;
float clampedNoiseHeight = clamp01(noiseHeight);
return spots * visibility / sampleCount * clampedNoiseHeight + clampedNoiseHeight - 1.0;
}
return vec3(0.0);
}
vec3 GetBedrockNoise(vec3 viewPos, float VdotU, float dither) {
float eyeAltitude1 = eyeAltitude * 0.005;
float visibility = clamp01(-VdotU * 1.875 - 0.225) * (1.0 - maxBlindnessDarkness);
visibility *= 1.0 + VdotU * 0.75;
float distanceAboveBedrock = bedrockLevel - eyeAltitude;
float fadeStart = 180.0;
float fadeWidth = 50.0;
float noiseHeight = 2.0 / (1.0 + exp(-(fadeStart - distanceAboveBedrock) / fadeWidth));
visibility *= -eyeAltitude1 * 3.0 + (bedrockLevel / 66.6) + 2.0;
if (visibility >= 0.0) {
vec3 wpos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
wpos /= (abs(wpos.y) + length(wpos.xz) * 0.5);
vec2 cameraPositionM = cameraPosition.xz * 0.0075;
cameraPositionM.x += frameTimeCounter * 0.004;
float VdotUM = 1.0 - VdotU * VdotU;
// Star calculation
vec2 starCoord = noiseHeight * wpos.xz * 0.2 + cameraPositionM * 0.1;
starCoord = floor(starCoord * 1024.0) / 1024.0;
float star = GetStarNoise(starCoord.xy) *
GetStarNoise(starCoord.xy+0.1) *
GetStarNoise(starCoord.xy+0.23);
star = max0((star - 0.4) * 6.0);
star *= star;
vec3 stars = star * vec3(0.1765, 0.1569, 0.1804) * (VdotUM + 0.3);
float wind = fract(frameTimeCounter * 0.0125);
const int sampleCount = 1;
const int sampleCountP = sampleCount + 5;
float ditherM = dither + 5.0;
vec3 spots = vec3(0.0);
for (int i = 0; i < sampleCount; i++) {
float current = pow2((i + ditherM) / sampleCountP);
float currentM = 1.0 - current;
vec2 planePos = wpos.xz * (0.5 + current) * noiseHeight;
planePos = (planePos * 0.5 + cameraPositionM * 0.5) * 20.0;
float noiseSpots = texture2DLod(noisetex, floor(planePos) * 0.1, 0.0).g;
vec3 noise = texture2DLod(noisetex, vec2(noiseSpots) + wind * 0.3, 0.0).b * vec3(0.3);
spots += noise * currentM * 6.0;
}
#ifdef OVERWORLD
spots = (spots - 0.5) * 1.5 + 0.5; // contrast
#else
spots = (spots - 0.5) * 3.5 + 0.5; // contrast
#endif
spots += stars;
float clampedNoiseHeight = clamp01(noiseHeight);
return spots * visibility / sampleCount * clampedNoiseHeight + clampedNoiseHeight - 1.0;
}
return vec3(0.0);
}
@@ -1,46 +1,46 @@
#ifndef INCLUDE_CLOUD_COORD
#define INCLUDE_CLOUD_COORD
#include "/lib/shaderSettings/clouds.glsl"
const float cloudNarrowness = CLOUD_NARROWNESS;
// Thanks to SixthSurge
vec2 GetRoundedCloudCoord(vec2 pos, float cloudRoundness) { // cloudRoundness is meant to be 0.125 for clouds and 0.35 for cloud shadows
vec2 coord = pos.yx + 0.5;
#ifdef ROTATE_REIMAGINED_CLOUDS_90_NEW
coord = coord.yx;
#endif
vec2 signCoord = sign(coord);
coord = abs(coord) + 1.0;
vec2 i, f = modf(coord, i);
f = smoothstep(0.5 - cloudRoundness, 0.5 + cloudRoundness, f);
coord = i + f;
return (coord - 0.5) * signCoord / 256.0;
}
vec3 ModifyTracePos(vec3 tracePos, int cloudAltitude) {
#if CLOUD_SPEED_MULT == 100
float wind = syncedTime;
#else
#define CLOUD_SPEED_MULT_M CLOUD_SPEED_MULT * 0.01
float wind = frameTimeCounter * CLOUD_SPEED_MULT_M;
#endif
if (cloudAltitude != cloudAlt1i) {
wind *= CLOUD_LAYER2_SPEED_MULT;
}
#if CLOUD_DIRECTION == 1
tracePos.x -= wind;
tracePos.z += cloudAltitude * 64.0;
#else
tracePos.z -= wind;
tracePos.x += cloudAltitude * 64.0;
#endif
tracePos.xz *= cloudNarrowness;
return tracePos.xyz;
}
#endif
#ifndef INCLUDE_CLOUD_COORD
#define INCLUDE_CLOUD_COORD
#include "/lib/shaderSettings/clouds.glsl"
const float cloudNarrowness = CLOUD_NARROWNESS;
// Thanks to SixthSurge
vec2 GetRoundedCloudCoord(vec2 pos, float cloudRoundness) { // cloudRoundness is meant to be 0.125 for clouds and 0.35 for cloud shadows
vec2 coord = pos.yx + 0.5;
#ifdef ROTATE_REIMAGINED_CLOUDS_90_NEW
coord = coord.yx;
#endif
vec2 signCoord = sign(coord);
coord = abs(coord) + 1.0;
vec2 i, f = modf(coord, i);
f = smoothstep(0.5 - cloudRoundness, 0.5 + cloudRoundness, f);
coord = i + f;
return (coord - 0.5) * signCoord / 256.0;
}
vec3 ModifyTracePos(vec3 tracePos, int cloudAltitude) {
#if CLOUD_SPEED_MULT == 100
float wind = syncedTime;
#else
#define CLOUD_SPEED_MULT_M CLOUD_SPEED_MULT * 0.01
float wind = frameTimeCounter * CLOUD_SPEED_MULT_M;
#endif
if (cloudAltitude != cloudAlt1i) {
wind *= CLOUD_LAYER2_SPEED_MULT;
}
#if CLOUD_DIRECTION == 1
tracePos.x -= wind;
tracePos.z += cloudAltitude * 64.0;
#else
tracePos.z -= wind;
tracePos.x += cloudAltitude * 64.0;
#endif
tracePos.xz *= cloudNarrowness;
return tracePos.xyz;
}
#endif
@@ -1,198 +1,198 @@
#include "/lib/shaderSettings/clouds.glsl"
#if CLOUD_UNBOUND_SIZE_MULT != 100
#define CLOUD_UNBOUND_SIZE_MULT_M CLOUD_UNBOUND_SIZE_MULT * 0.01
#endif
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/colors/cloudColors.glsl"
#include "/lib/atmospherics/sky.glsl"
float InterleavedGradientNoiseForClouds() {
float n = 52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y);
#ifdef TAA
return fract(n + goldenRatio * mod(float(frameCounter), 3600.0));
#else
return fract(n);
#endif
}
#if SHADOW_QUALITY > -1
vec3 GetShadowOnCloudPosition(vec3 tracePos, vec3 cameraPos) {
vec3 wpos = PlayerToShadow(tracePos - cameraPos);
float distb = sqrt(wpos.x * wpos.x + wpos.y * wpos.y);
float distortFactor = 1.0 - shadowMapBias + distb * shadowMapBias;
vec3 shadowPosition = vec3(vec2(wpos.xy / distortFactor), wpos.z * 0.2);
return shadowPosition * 0.5 + 0.5;
}
bool GetShadowOnCloud(vec3 tracePos, vec3 cameraPos, int cloudAltitude, float lowerPlaneAltitude, float higherPlaneAltitude) {
const float cloudShadowOffset = 0.5;
vec3 shadowPosition0 = GetShadowOnCloudPosition(tracePos, cameraPos);
if (length(shadowPosition0.xy * 2.0 - 1.0) < 1.0) {
float shadowsample0 = shadow2D(shadowtex0, shadowPosition0).z;
if (shadowsample0 == 0.0) return true;
}
return false;
}
#endif
#ifdef CLOUDS_REIMAGINED
#include "/lib/atmospherics/clouds/reimaginedClouds.glsl"
#endif
#ifdef CLOUDS_UNBOUND
#include "/lib/atmospherics/clouds/unboundClouds.glsl"
#endif
vec4 GetClouds(inout float cloudLinearDepth, float skyFade, vec3 cameraPosOffset, vec3 playerPos, vec3 viewPos,
float lViewPos, float VdotS, float VdotU, float dither, vec3 auroraBorealis, vec3 nightNebula, vec3 sunVec) {
vec4 clouds = vec4(0.0);
vec3 nPlayerPos = normalize(playerPos);
float lViewPosM = lViewPos < renderDistance * 1.5 ? lViewPos - 1.0 : 1000000000.0;
float skyMult0 = pow2(skyFade * 3.333333 - 2.333333);
#if IRIS_VERSION >= 10800
#ifdef CLOUDS_REIMAGINED
float modFactor = 1.0 / cloudNarrowness * 256.0;
#else
#if CLOUD_UNBOUND_SIZE_MULT == 100
float modFactor = 1.0 / cloudNarrowness;
#else
float modFactor = 1.0 / (cloudNarrowness * CLOUD_UNBOUND_SIZE_MULT_M);
#endif
#endif
int modFactorM = int(modFactor);
vec2 cameraPositionBIM = cameraPositionInt.xz - modFactorM * (cameraPositionInt.xz / modFactorM);
vec3 cameraPos = vec3(
cameraPositionBIM.x + cameraPositionBestFract.x,
cameraPosition.y,
cameraPositionBIM.y + cameraPositionBestFract.z
);
#if defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
float layer2ScaleFactor = CLOUD_UNBOUND_LAYER2_SIZE * 10.0 / CLOUD_UNBOUND_SIZE_MULT;
#if CLOUD_UNBOUND_SIZE_MULT == 100
float modFactor2 = 1.0 / (cloudNarrowness * layer2ScaleFactor);
#else
float modFactor2 = 1.0 / (cloudNarrowness * CLOUD_UNBOUND_SIZE_MULT_M * layer2ScaleFactor);
#endif
int modFactorM2 = int(modFactor2);
vec2 cameraPositionBIM2 = cameraPositionInt.xz - modFactorM2 * (cameraPositionInt.xz / modFactorM2);
vec3 cameraPos2 = vec3(
cameraPositionBIM2.x + cameraPositionBestFract.x,
cameraPosition.y,
cameraPositionBIM2.y + cameraPositionBestFract.z
);
#endif
#else
vec3 cameraPos = cameraPosition;
#if defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
vec3 cameraPos2 = cameraPosition;
#endif
#endif
cameraPos += cameraPosOffset;
#if defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
cameraPos2 += cameraPosOffset;
#endif
#ifdef CLOUDS_REIMAGINED
float thresholdF = 4000.0;
#else
float thresholdF = 4000.0;
#endif
//float thresholdMix = pow2(clamp01(VdotU * 15.0));
//thresholdF = mix(far, thresholdF, thresholdMix * 0.5 + 0.5);
thresholdF *= CLOUD_RENDER_DISTANCE;
#if RAINBOW_CLOUD != 0
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz);
wpos /= (abs(wpos.y) + length(wpos.xz));
vec3 rainbowColor = getRainbowColor(wpos.xz * rainbowCloudDistribution * 0.35, 0.05);
cloudRainColor *= rainbowColor;
cloudAmbientColor *= rainbowColor;
cloudLightColor *= rainbowColor;
#endif
#ifdef CLOUDS_REIMAGINED
cloudAmbientColor *= 1.0 - 0.25 * rainFactor;
#endif
vec3 cloudColorMult = vec3(1.0);
#if CLOUD_R != 100 || CLOUD_G != 100 || CLOUD_B != 100
cloudColorMult *= vec3(CLOUD_R, CLOUD_G, CLOUD_B) * 0.01;
#endif
cloudAmbientColor *= cloudColorMult;
cloudLightColor *= cloudColorMult;
#if defined CLOUDS_REIMAGINED && defined DOUBLE_REIM_CLOUDS
int maxCloudAlt = max(cloudAlt1i, cloudAlt2i);
int minCloudAlt = min(cloudAlt1i, cloudAlt2i);
if (abs(cameraPos.y - minCloudAlt) < abs(cameraPos.y - maxCloudAlt)) {
clouds = GetVolumetricClouds(minCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
if (clouds.a == 0.0) {
clouds = GetVolumetricClouds(maxCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
}
} else {
clouds = GetVolumetricClouds(maxCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
if (clouds.a == 0.0) {
clouds = GetVolumetricClouds(minCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
}
}
#elif defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
float cloudLinearDepth1 = 1.0;
float cloudLinearDepth2 = 1.0;
//The order of calculating the clouds actually matters here
vec4 clouds1 = GetVolumetricClouds(cloudAlt1i, thresholdF, cloudLinearDepth1, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
vec4 clouds2 = GetVolumetricClouds(cloudAlt2i, thresholdF, cloudLinearDepth2, skyFade, skyMult0,
cameraPos2, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
if (clouds1.a * clouds2.a < 1e-36)
clouds = clouds1 * sign(max(0.0, clouds1.a - 1e-36)) + clouds2 * sign(max(0.0, clouds2.a - 1e-36));
else {
if (cloudLinearDepth1 < cloudLinearDepth2)
clouds = vec4(mix(clouds2.rgb, clouds1.rgb, clouds1.w), mix(clouds2.w, 1.0, clouds1.w));
else
clouds = vec4(mix(clouds1.rgb, clouds2.rgb, clouds2.w), mix(clouds1.w, 1.0, clouds2.w));
}
cloudLinearDepth = min(clouds1.a > 0.5 ? cloudLinearDepth1 : 1.0, clouds2.a > 0.5 ? cloudLinearDepth2 : 1.0);
#else
clouds = GetVolumetricClouds(cloudAlt1i, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos) ;
#endif
#ifdef ATM_COLOR_MULTS
clouds.rgb *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
clouds.rgb *= moonPhaseInfluence;
#endif
#if AURORA_STYLE > 0
clouds.rgb += auroraBorealis * 0.1;
#endif
#if NIGHT_NEBULAE == 1
clouds.rgb += nightNebula * 0.2;
#endif
return clouds;
}
#include "/lib/shaderSettings/clouds.glsl"
#if CLOUD_UNBOUND_SIZE_MULT != 100
#define CLOUD_UNBOUND_SIZE_MULT_M CLOUD_UNBOUND_SIZE_MULT * 0.01
#endif
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/colors/cloudColors.glsl"
#include "/lib/atmospherics/sky.glsl"
float InterleavedGradientNoiseForClouds() {
float n = 52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y);
#ifdef TAA
return fract(n + goldenRatio * mod(float(frameCounter), 3600.0));
#else
return fract(n);
#endif
}
#if SHADOW_QUALITY > -1
vec3 GetShadowOnCloudPosition(vec3 tracePos, vec3 cameraPos) {
vec3 wpos = PlayerToShadow(tracePos - cameraPos);
float distb = sqrt(wpos.x * wpos.x + wpos.y * wpos.y);
float distortFactor = 1.0 - shadowMapBias + distb * shadowMapBias;
vec3 shadowPosition = vec3(vec2(wpos.xy / distortFactor), wpos.z * 0.2);
return shadowPosition * 0.5 + 0.5;
}
bool GetShadowOnCloud(vec3 tracePos, vec3 cameraPos, int cloudAltitude, float lowerPlaneAltitude, float higherPlaneAltitude) {
const float cloudShadowOffset = 0.5;
vec3 shadowPosition0 = GetShadowOnCloudPosition(tracePos, cameraPos);
if (length(shadowPosition0.xy * 2.0 - 1.0) < 1.0) {
float shadowsample0 = shadow2D(shadowtex0, shadowPosition0).z;
if (shadowsample0 == 0.0) return true;
}
return false;
}
#endif
#ifdef CLOUDS_REIMAGINED
#include "/lib/atmospherics/clouds/reimaginedClouds.glsl"
#endif
#ifdef CLOUDS_UNBOUND
#include "/lib/atmospherics/clouds/unboundClouds.glsl"
#endif
vec4 GetClouds(inout float cloudLinearDepth, float skyFade, vec3 cameraPosOffset, vec3 playerPos, vec3 viewPos,
float lViewPos, float VdotS, float VdotU, float dither, vec3 auroraBorealis, vec3 nightNebula, vec3 sunVec) {
vec4 clouds = vec4(0.0);
vec3 nPlayerPos = normalize(playerPos);
float lViewPosM = lViewPos < renderDistance * 1.5 ? lViewPos - 1.0 : 1000000000.0;
float skyMult0 = pow2(skyFade * 3.333333 - 2.333333);
#if IRIS_VERSION >= 10800
#ifdef CLOUDS_REIMAGINED
float modFactor = 1.0 / cloudNarrowness * 256.0;
#else
#if CLOUD_UNBOUND_SIZE_MULT == 100
float modFactor = 1.0 / cloudNarrowness;
#else
float modFactor = 1.0 / (cloudNarrowness * CLOUD_UNBOUND_SIZE_MULT_M);
#endif
#endif
int modFactorM = int(modFactor);
vec2 cameraPositionBIM = cameraPositionInt.xz - modFactorM * (cameraPositionInt.xz / modFactorM);
vec3 cameraPos = vec3(
cameraPositionBIM.x + cameraPositionBestFract.x,
cameraPosition.y,
cameraPositionBIM.y + cameraPositionBestFract.z
);
#if defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
float layer2ScaleFactor = CLOUD_UNBOUND_LAYER2_SIZE * 10.0 / CLOUD_UNBOUND_SIZE_MULT;
#if CLOUD_UNBOUND_SIZE_MULT == 100
float modFactor2 = 1.0 / (cloudNarrowness * layer2ScaleFactor);
#else
float modFactor2 = 1.0 / (cloudNarrowness * CLOUD_UNBOUND_SIZE_MULT_M * layer2ScaleFactor);
#endif
int modFactorM2 = int(modFactor2);
vec2 cameraPositionBIM2 = cameraPositionInt.xz - modFactorM2 * (cameraPositionInt.xz / modFactorM2);
vec3 cameraPos2 = vec3(
cameraPositionBIM2.x + cameraPositionBestFract.x,
cameraPosition.y,
cameraPositionBIM2.y + cameraPositionBestFract.z
);
#endif
#else
vec3 cameraPos = cameraPosition;
#if defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
vec3 cameraPos2 = cameraPosition;
#endif
#endif
cameraPos += cameraPosOffset;
#if defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
cameraPos2 += cameraPosOffset;
#endif
#ifdef CLOUDS_REIMAGINED
float thresholdF = 4000.0;
#else
float thresholdF = 4000.0;
#endif
//float thresholdMix = pow2(clamp01(VdotU * 15.0));
//thresholdF = mix(far, thresholdF, thresholdMix * 0.5 + 0.5);
thresholdF *= CLOUD_RENDER_DISTANCE;
#if RAINBOW_CLOUD != 0
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz);
wpos /= (abs(wpos.y) + length(wpos.xz));
vec3 rainbowColor = getRainbowColor(wpos.xz * rainbowCloudDistribution * 0.35, 0.05);
cloudRainColor *= rainbowColor;
cloudAmbientColor *= rainbowColor;
cloudLightColor *= rainbowColor;
#endif
#ifdef CLOUDS_REIMAGINED
cloudAmbientColor *= 1.0 - 0.25 * rainFactor;
#endif
vec3 cloudColorMult = vec3(1.0);
#if CLOUD_R != 100 || CLOUD_G != 100 || CLOUD_B != 100
cloudColorMult *= vec3(CLOUD_R, CLOUD_G, CLOUD_B) * 0.01;
#endif
cloudAmbientColor *= cloudColorMult;
cloudLightColor *= cloudColorMult;
#if defined CLOUDS_REIMAGINED && defined DOUBLE_REIM_CLOUDS
int maxCloudAlt = max(cloudAlt1i, cloudAlt2i);
int minCloudAlt = min(cloudAlt1i, cloudAlt2i);
if (abs(cameraPos.y - minCloudAlt) < abs(cameraPos.y - maxCloudAlt)) {
clouds = GetVolumetricClouds(minCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
if (clouds.a == 0.0) {
clouds = GetVolumetricClouds(maxCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
}
} else {
clouds = GetVolumetricClouds(maxCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
if (clouds.a == 0.0) {
clouds = GetVolumetricClouds(minCloudAlt, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
}
}
#elif defined CLOUDS_UNBOUND && defined DOUBLE_UNBOUND_CLOUDS
float cloudLinearDepth1 = 1.0;
float cloudLinearDepth2 = 1.0;
//The order of calculating the clouds actually matters here
vec4 clouds1 = GetVolumetricClouds(cloudAlt1i, thresholdF, cloudLinearDepth1, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
vec4 clouds2 = GetVolumetricClouds(cloudAlt2i, thresholdF, cloudLinearDepth2, skyFade, skyMult0,
cameraPos2, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos);
if (clouds1.a * clouds2.a < 1e-36)
clouds = clouds1 * sign(max(0.0, clouds1.a - 1e-36)) + clouds2 * sign(max(0.0, clouds2.a - 1e-36));
else {
if (cloudLinearDepth1 < cloudLinearDepth2)
clouds = vec4(mix(clouds2.rgb, clouds1.rgb, clouds1.w), mix(clouds2.w, 1.0, clouds1.w));
else
clouds = vec4(mix(clouds1.rgb, clouds2.rgb, clouds2.w), mix(clouds1.w, 1.0, clouds2.w));
}
cloudLinearDepth = min(clouds1.a > 0.5 ? cloudLinearDepth1 : 1.0, clouds2.a > 0.5 ? cloudLinearDepth2 : 1.0);
#else
clouds = GetVolumetricClouds(cloudAlt1i, thresholdF, cloudLinearDepth, skyFade, skyMult0,
cameraPos, nPlayerPos, lViewPosM, VdotS, VdotU, dither, sunVec, viewPos) ;
#endif
#ifdef ATM_COLOR_MULTS
clouds.rgb *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
clouds.rgb *= moonPhaseInfluence;
#endif
#if AURORA_STYLE > 0
clouds.rgb += auroraBorealis * 0.1;
#endif
#if NIGHT_NEBULAE == 1
clouds.rgb += nightNebula * 0.2;
#endif
return clouds;
}
@@ -1,236 +1,236 @@
#include "/lib/shaderSettings/cloudsAndLighting.glsl"
#include "/lib/atmospherics/clouds/cloudCoord.glsl"
#ifdef DOUBLE_REIM_CLOUDS
const float cloudStretch = CLOUD_STRETCH * 4.2;
const float L2cloudStretch = cloudStretch * CLOUD_REIMAGINED_LAYER2_HEIGHT;
const float cloudTallness = cloudStretch * 2.0;
#else
const float cloudStretch = CLOUD_STRETCH * 4.2;
const float cloudTallness = cloudStretch * 2.0;
#endif
const float cloudRoundness = CLOUD_ROUNDNESS;
bool GetCloudNoise(vec3 tracePos, inout vec3 tracePosM, int cloudAltitude) {
tracePosM = ModifyTracePos(tracePos, cloudAltitude);
vec2 coord = GetRoundedCloudCoord(tracePosM.xz, cloudRoundness);
#ifdef DEFERRED1
float noise = texture2D(colortex3, coord).b;
#else
float noise = texture2D(gaux4, coord).b;
#endif
float threshold = clamp(abs(cloudAltitude - tracePos.y) / cloudStretch, 0.001, 0.999);
threshold = pow2(pow2(pow2(threshold)));
return noise > threshold * 0.5 + 0.25;
}
float Get2DCloudSample(vec2 pos) {
#ifdef DEFERRED1
return texture2D(colortex3, GetRoundedCloudCoord(pos, cloudRoundness)).b;
#else
return texture2D(gaux4, GetRoundedCloudCoord(pos, cloudRoundness)).b;
#endif
}
vec4 GetVolumetricClouds(int cloudAltitude, float distanceThreshold, inout float cloudLinearDepth, float skyFade, float skyMult0, vec3 cameraPos, vec3 nPlayerPos, float lViewPosM, float VdotS, float VdotU, float dither, vec3 sunVec, vec3 viewPos) {
vec4 volumetricClouds = vec4(0.0);
// Use local variables to avoid modifying globals
float localCloudStretch = cloudStretch;
float localCloudTallness = cloudTallness;
#ifdef DOUBLE_REIM_CLOUDS
if (cloudAltitude != cloudAlt1i) { // second layer
localCloudStretch = L2cloudStretch;
localCloudTallness = 2.0 * localCloudStretch;
}
#endif
float higherPlaneAltitude = cloudAltitude + localCloudStretch;
float lowerPlaneAltitude = cloudAltitude - localCloudStretch;
float lowerPlaneDistance = (lowerPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float higherPlaneDistance = (higherPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float minPlaneDistance = min(lowerPlaneDistance, higherPlaneDistance);
minPlaneDistance = max(minPlaneDistance, 0.0);
float maxPlaneDistance = max(lowerPlaneDistance, higherPlaneDistance);
if (maxPlaneDistance < 0.0) return vec4(0.0);
float planeDistanceDif = maxPlaneDistance - minPlaneDistance;
#if CLOUD_QUALITY_INTERNAL == 1 || !defined DEFERRED1
int sampleCount = max(int(planeDistanceDif) / 16, 6);
#elif CLOUD_QUALITY_INTERNAL == 2
int sampleCount = max(int(planeDistanceDif) / 8, 12);
#elif CLOUD_QUALITY_INTERNAL == 3 || CLOUD_QUALITY_INTERNAL == 4
int sampleCount = max(int(planeDistanceDif), 12);
#endif
float stepMult = planeDistanceDif / sampleCount;
vec3 traceAdd = nPlayerPos * stepMult;
vec3 tracePos = cameraPos + minPlaneDistance * nPlayerPos;
tracePos += traceAdd * dither;
tracePos.y -= traceAdd.y;
#ifdef FIX_AMD_REFLECTION_CRASH
sampleCount = min(sampleCount, 30); //BFARC
#endif
#ifdef AURORA_INFLUENCE
cloudAmbientColor = getAuroraAmbientColor(cloudAmbientColor, viewPos, 0.032, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
vec3 cloudPlayerPos = tracePos - cameraPos;
float lTracePos = length(cloudPlayerPos);
float lTracePosXZ = length(cloudPlayerPos.xz);
float cloudMult = 1.0;
if (lTracePosXZ > distanceThreshold) break;
if (lTracePos > lViewPosM) {
if (skyFade < 0.7) continue;
else cloudMult = skyMult0;
}
vec3 tracePosM;
if (GetCloudNoise(tracePos, tracePosM, cloudAltitude)) {
float lightMult = 1.0;
#if SHADOW_QUALITY > -1
float shadowLength = shadowDistance * 0.9166667; //consistent08JJ622
if (shadowLength > lTracePos)
if (GetShadowOnCloud(tracePos, cameraPos, cloudAltitude, lowerPlaneAltitude, higherPlaneAltitude)) {
#ifdef CLOUD_CLOSED_AREA_CHECK
if (eyeBrightness.y != 240) continue;
else
#endif
lightMult = 0.25;
}
#endif
#ifdef INVERTED_CLOUD_SHADING
float cloudShading = (higherPlaneAltitude - tracePos.y) / localCloudTallness;
#else
float cloudShading = 1.0 - (higherPlaneAltitude - tracePos.y) / localCloudTallness;
#endif
cloudShading = pow(max0(cloudShading), max0(CLOUD_SHADING_AMOUNT * 0.1 - 0.2));
float VdotSM1 = max0(sunVisibility > 0.5 ? VdotS : - VdotS);
#if CLOUD_QUALITY_INTERNAL >= 2
#ifdef DEFERRED1
float cloudShadingM = 1.0 - pow2(cloudShading);
#else
float cloudShadingM = 1.0 - cloudShading;
#endif
float gradientNoise = InterleavedGradientNoiseForClouds();
vec3 cLightPos = tracePosM;
vec3 cLightPosAdd = normalize(ViewToPlayer(lightVec * 1000000000.0)) * vec3(0.08);
cLightPosAdd *= shadowTime;
float light = 2.0;
cLightPos += (1.0 + gradientNoise) * cLightPosAdd;
light -= Get2DCloudSample(cLightPos.xz) * cloudShadingM;
cLightPos += gradientNoise * cLightPosAdd;
light -= Get2DCloudSample(cLightPos.xz) * cloudShadingM;
float VdotSM2 = VdotSM1 * shadowTime * 0.25;
VdotSM2 += 0.5 * cloudShading + 0.08;
cloudShading = VdotSM2 * light * lightMult;
#endif
#if CLOUD_SUN_MOON_SHADING > 0
float visibilityFactor = 1.0;
#if CLOUD_SUN_MOON_SHADING == 1
visibilityFactor = 1.0 - sunVisibility;
#elif CLOUD_SUN_MOON_SHADING == 2
visibilityFactor = sunVisibility;
#endif
if (visibilityFactor > 0.0) {
vec3 worldLightVec = mat3(gbufferModelViewInverse) * sunVec;
float cloudLightRadius = 375.0;
float aboveFade = 1.0 - smoothstep(-20.0, 0.0, cameraPos.y - cloudAltitude);
float sunPlaneIntersect = (cloudAltitude - cameraPos.y) / worldLightVec.y;
vec2 posVector = cameraPos.xz + worldLightVec.xz * sunPlaneIntersect - tracePos.xz;
float moonVisibility = abs(1.0 - moonPhase / 4.0);
float sunMult = mix(moonVisibility, 0.75, sunVisibility);
float falloff = exp((1.0 - max0(1.0 - length(posVector) / cloudLightRadius)) * -6.0) * aboveFade * sunMult;
float sunCloudMult = clamp01(falloff * 2.5 * mix(1.0, (lTracePos - minPlaneDistance) / (maxPlaneDistance - minPlaneDistance), 0.6));
vec3 bloodMoonCloudColor = vec3(1.0);
#if BLOOD_MOON > 0
bloodMoonCloudColor = mix(bloodMoonCloudColor, vec3(0.302, 0.0078, 0.0078) * 5, getBloodMoon(sunVisibility));
#endif
cloudLightColor += bloodMoonCloudColor * sunCloudMult * 0.11 * visibilityFactor;
cloudShading += sunCloudMult * 1.5 * visibilityFactor;
}
#endif
#if BLOOD_MOON > 0
vec3 hsvCloudLightColor = rgb2hsv(cloudLightColor);
cloudLightColor = mix(cloudLightColor, hsv2rgb(vec3(0, max(0.66, hsvCloudLightColor.y), hsvCloudLightColor.z)), getBloodMoon(sunVisibility));
#endif
#ifdef AURORA_INFLUENCE
cloudLightColor = getAuroraAmbientColor(cloudLightColor, viewPos, 0.1, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
vec3 colorSample = cloudAmbientColor * 0.95 * (1.0 - 0.35 * cloudShading) + cloudLightColor * (0.1 + cloudShading);
#ifdef RAIN_ATMOSPHERE
// Lightning flashes around lightning bolt position
vec3 lightningPos = getLightningPos(tracePos - cameraPos, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(1.0), 450.0, 0.0, 0) * isLightningActive() * 10.0;
colorSample += lightningAdd.y;
// Thunderstorm cloud highlights (randomly appear in stormy weather)
float highlightBoost = getThunderstormCloudHighlights(tracePos, cameraPos.xz, lTracePos, minPlaneDistance, maxPlaneDistance, 0.005);
colorSample += highlightBoost;
#endif
vec3 cloudSkyColor = GetSky(VdotU, VdotS, dither, isEyeInWater == 0, false);
#ifdef ATM_COLOR_MULTS
cloudSkyColor *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
float distanceRatio = (distanceThreshold - lTracePosXZ) / distanceThreshold;
float cloudFogFactor = pow2(clamp(distanceRatio, 0.0, 1.0)) * 0.75;
float nightCloudRemove = NIGHT_CLOUD_UNBOUND_REMOVE * (1.0 - sunVisibility) * -1 + 1.0; // mapped to 1 to 0 range
#if defined DOUBLE_REIM_CLOUDS && CLOUD_REIMAGINED_LAYER2_TRANSPARENCY != 20
if (cloudAltitude != cloudAlt1i) { // second layer uses custom transparency
cloudMult *= (CLOUD_REIMAGINED_LAYER2_TRANSPARENCY * 0.05) * nightCloudRemove;
} else {
cloudMult *= CLOUD_TRANSPARENCY * nightCloudRemove;
}
#else
cloudMult *= CLOUD_TRANSPARENCY * nightCloudRemove;
#endif
float skyMult1 = 1.0 - 0.2 * (1.0 - skyFade) * max(sunVisibility2, nightFactor);
float skyMult2 = 1.0 - 0.33333 * skyFade;
colorSample = mix(cloudSkyColor, colorSample * skyMult1, cloudFogFactor * skyMult2);
colorSample *= pow2(1.0 - maxBlindnessDarkness);
float cloudDistanceFactor = clamp(distanceRatio, 0.0, 0.75);
//float distanceRatioNew = (2000 - lTracePosXZ) / 2000;
//float cloudDistanceFactorNew = clamp(distanceRatioNew, 0.5, 0.75);
//volumetricClouds.a = pow(cloudDistanceFactor * 1.33333, 0.5 + 10.0 * pow(abs(VdotSM1), 90.0)) * cloudMult;
volumetricClouds.a = sqrt(cloudDistanceFactor * 1.33333) * cloudMult;
volumetricClouds.rgb = colorSample;
cloudLinearDepth = sqrt(lTracePos / renderDistance);
break;
}
}
return volumetricClouds;
}
#include "/lib/shaderSettings/cloudsAndLighting.glsl"
#include "/lib/atmospherics/clouds/cloudCoord.glsl"
#ifdef DOUBLE_REIM_CLOUDS
const float cloudStretch = CLOUD_STRETCH * 4.2;
const float L2cloudStretch = cloudStretch * CLOUD_REIMAGINED_LAYER2_HEIGHT;
const float cloudTallness = cloudStretch * 2.0;
#else
const float cloudStretch = CLOUD_STRETCH * 4.2;
const float cloudTallness = cloudStretch * 2.0;
#endif
const float cloudRoundness = CLOUD_ROUNDNESS;
bool GetCloudNoise(vec3 tracePos, inout vec3 tracePosM, int cloudAltitude) {
tracePosM = ModifyTracePos(tracePos, cloudAltitude);
vec2 coord = GetRoundedCloudCoord(tracePosM.xz, cloudRoundness);
#ifdef DEFERRED1
float noise = texture2D(colortex3, coord).b;
#else
float noise = texture2D(gaux4, coord).b;
#endif
float threshold = clamp(abs(cloudAltitude - tracePos.y) / cloudStretch, 0.001, 0.999);
threshold = pow2(pow2(pow2(threshold)));
return noise > threshold * 0.5 + 0.25;
}
float Get2DCloudSample(vec2 pos) {
#ifdef DEFERRED1
return texture2D(colortex3, GetRoundedCloudCoord(pos, cloudRoundness)).b;
#else
return texture2D(gaux4, GetRoundedCloudCoord(pos, cloudRoundness)).b;
#endif
}
vec4 GetVolumetricClouds(int cloudAltitude, float distanceThreshold, inout float cloudLinearDepth, float skyFade, float skyMult0, vec3 cameraPos, vec3 nPlayerPos, float lViewPosM, float VdotS, float VdotU, float dither, vec3 sunVec, vec3 viewPos) {
vec4 volumetricClouds = vec4(0.0);
// Use local variables to avoid modifying globals
float localCloudStretch = cloudStretch;
float localCloudTallness = cloudTallness;
#ifdef DOUBLE_REIM_CLOUDS
if (cloudAltitude != cloudAlt1i) { // second layer
localCloudStretch = L2cloudStretch;
localCloudTallness = 2.0 * localCloudStretch;
}
#endif
float higherPlaneAltitude = cloudAltitude + localCloudStretch;
float lowerPlaneAltitude = cloudAltitude - localCloudStretch;
float lowerPlaneDistance = (lowerPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float higherPlaneDistance = (higherPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float minPlaneDistance = min(lowerPlaneDistance, higherPlaneDistance);
minPlaneDistance = max(minPlaneDistance, 0.0);
float maxPlaneDistance = max(lowerPlaneDistance, higherPlaneDistance);
if (maxPlaneDistance < 0.0) return vec4(0.0);
float planeDistanceDif = maxPlaneDistance - minPlaneDistance;
#if CLOUD_QUALITY_INTERNAL == 1 || !defined DEFERRED1
int sampleCount = max(int(planeDistanceDif) / 16, 6);
#elif CLOUD_QUALITY_INTERNAL == 2
int sampleCount = max(int(planeDistanceDif) / 8, 12);
#elif CLOUD_QUALITY_INTERNAL == 3 || CLOUD_QUALITY_INTERNAL == 4
int sampleCount = max(int(planeDistanceDif), 12);
#endif
float stepMult = planeDistanceDif / sampleCount;
vec3 traceAdd = nPlayerPos * stepMult;
vec3 tracePos = cameraPos + minPlaneDistance * nPlayerPos;
tracePos += traceAdd * dither;
tracePos.y -= traceAdd.y;
#ifdef FIX_AMD_REFLECTION_CRASH
sampleCount = min(sampleCount, 30); //BFARC
#endif
#ifdef AURORA_INFLUENCE
cloudAmbientColor = getAuroraAmbientColor(cloudAmbientColor, viewPos, 0.032, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
vec3 cloudPlayerPos = tracePos - cameraPos;
float lTracePos = length(cloudPlayerPos);
float lTracePosXZ = length(cloudPlayerPos.xz);
float cloudMult = 1.0;
if (lTracePosXZ > distanceThreshold) break;
if (lTracePos > lViewPosM) {
if (skyFade < 0.7) continue;
else cloudMult = skyMult0;
}
vec3 tracePosM;
if (GetCloudNoise(tracePos, tracePosM, cloudAltitude)) {
float lightMult = 1.0;
#if SHADOW_QUALITY > -1
float shadowLength = shadowDistance * 0.9166667; //consistent08JJ622
if (shadowLength > lTracePos)
if (GetShadowOnCloud(tracePos, cameraPos, cloudAltitude, lowerPlaneAltitude, higherPlaneAltitude)) {
#ifdef CLOUD_CLOSED_AREA_CHECK
if (eyeBrightness.y != 240) continue;
else
#endif
lightMult = 0.25;
}
#endif
#ifdef INVERTED_CLOUD_SHADING
float cloudShading = (higherPlaneAltitude - tracePos.y) / localCloudTallness;
#else
float cloudShading = 1.0 - (higherPlaneAltitude - tracePos.y) / localCloudTallness;
#endif
cloudShading = pow(max0(cloudShading), max0(CLOUD_SHADING_AMOUNT * 0.1 - 0.2));
float VdotSM1 = max0(sunVisibility > 0.5 ? VdotS : - VdotS);
#if CLOUD_QUALITY_INTERNAL >= 2
#ifdef DEFERRED1
float cloudShadingM = 1.0 - pow2(cloudShading);
#else
float cloudShadingM = 1.0 - cloudShading;
#endif
float gradientNoise = InterleavedGradientNoiseForClouds();
vec3 cLightPos = tracePosM;
vec3 cLightPosAdd = normalize(ViewToPlayer(lightVec * 1000000000.0)) * vec3(0.08);
cLightPosAdd *= shadowTime;
float light = 2.0;
cLightPos += (1.0 + gradientNoise) * cLightPosAdd;
light -= Get2DCloudSample(cLightPos.xz) * cloudShadingM;
cLightPos += gradientNoise * cLightPosAdd;
light -= Get2DCloudSample(cLightPos.xz) * cloudShadingM;
float VdotSM2 = VdotSM1 * shadowTime * 0.25;
VdotSM2 += 0.5 * cloudShading + 0.08;
cloudShading = VdotSM2 * light * lightMult;
#endif
#if CLOUD_SUN_MOON_SHADING > 0
float visibilityFactor = 1.0;
#if CLOUD_SUN_MOON_SHADING == 1
visibilityFactor = 1.0 - sunVisibility;
#elif CLOUD_SUN_MOON_SHADING == 2
visibilityFactor = sunVisibility;
#endif
if (visibilityFactor > 0.0) {
vec3 worldLightVec = mat3(gbufferModelViewInverse) * sunVec;
float cloudLightRadius = 375.0;
float aboveFade = 1.0 - smoothstep(-20.0, 0.0, cameraPos.y - cloudAltitude);
float sunPlaneIntersect = (cloudAltitude - cameraPos.y) / worldLightVec.y;
vec2 posVector = cameraPos.xz + worldLightVec.xz * sunPlaneIntersect - tracePos.xz;
float moonVisibility = abs(1.0 - moonPhase / 4.0);
float sunMult = mix(moonVisibility, 0.75, sunVisibility);
float falloff = exp((1.0 - max0(1.0 - length(posVector) / cloudLightRadius)) * -6.0) * aboveFade * sunMult;
float sunCloudMult = clamp01(falloff * 2.5 * mix(1.0, (lTracePos - minPlaneDistance) / (maxPlaneDistance - minPlaneDistance), 0.6));
vec3 bloodMoonCloudColor = vec3(1.0);
#if BLOOD_MOON > 0
bloodMoonCloudColor = mix(bloodMoonCloudColor, vec3(0.302, 0.0078, 0.0078) * 5, getBloodMoon(sunVisibility));
#endif
cloudLightColor += bloodMoonCloudColor * sunCloudMult * 0.11 * visibilityFactor;
cloudShading += sunCloudMult * 1.5 * visibilityFactor;
}
#endif
#if BLOOD_MOON > 0
vec3 hsvCloudLightColor = rgb2hsv(cloudLightColor);
cloudLightColor = mix(cloudLightColor, hsv2rgb(vec3(0, max(0.66, hsvCloudLightColor.y), hsvCloudLightColor.z)), getBloodMoon(sunVisibility));
#endif
#ifdef AURORA_INFLUENCE
cloudLightColor = getAuroraAmbientColor(cloudLightColor, viewPos, 0.1, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
vec3 colorSample = cloudAmbientColor * 0.95 * (1.0 - 0.35 * cloudShading) + cloudLightColor * (0.1 + cloudShading);
#ifdef RAIN_ATMOSPHERE
// Lightning flashes around lightning bolt position
vec3 lightningPos = getLightningPos(tracePos - cameraPos, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(1.0), 450.0, 0.0, 0) * isLightningActive() * 10.0;
colorSample += lightningAdd.y;
// Thunderstorm cloud highlights (randomly appear in stormy weather)
float highlightBoost = getThunderstormCloudHighlights(tracePos, cameraPos.xz, lTracePos, minPlaneDistance, maxPlaneDistance, 0.005);
colorSample += highlightBoost;
#endif
vec3 cloudSkyColor = GetSky(VdotU, VdotS, dither, isEyeInWater == 0, false);
#ifdef ATM_COLOR_MULTS
cloudSkyColor *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
float distanceRatio = (distanceThreshold - lTracePosXZ) / distanceThreshold;
float cloudFogFactor = pow2(clamp(distanceRatio, 0.0, 1.0)) * 0.75;
float nightCloudRemove = NIGHT_CLOUD_UNBOUND_REMOVE * (1.0 - sunVisibility) * -1 + 1.0; // mapped to 1 to 0 range
#if defined DOUBLE_REIM_CLOUDS && CLOUD_REIMAGINED_LAYER2_TRANSPARENCY != 20
if (cloudAltitude != cloudAlt1i) { // second layer uses custom transparency
cloudMult *= (CLOUD_REIMAGINED_LAYER2_TRANSPARENCY * 0.05) * nightCloudRemove;
} else {
cloudMult *= CLOUD_TRANSPARENCY * nightCloudRemove;
}
#else
cloudMult *= CLOUD_TRANSPARENCY * nightCloudRemove;
#endif
float skyMult1 = 1.0 - 0.2 * (1.0 - skyFade) * max(sunVisibility2, nightFactor);
float skyMult2 = 1.0 - 0.33333 * skyFade;
colorSample = mix(cloudSkyColor, colorSample * skyMult1, cloudFogFactor * skyMult2);
colorSample *= pow2(1.0 - maxBlindnessDarkness);
float cloudDistanceFactor = clamp(distanceRatio, 0.0, 0.75);
//float distanceRatioNew = (2000 - lTracePosXZ) / 2000;
//float cloudDistanceFactorNew = clamp(distanceRatioNew, 0.5, 0.75);
//volumetricClouds.a = pow(cloudDistanceFactor * 1.33333, 0.5 + 10.0 * pow(abs(VdotSM1), 90.0)) * cloudMult;
volumetricClouds.a = sqrt(cloudDistanceFactor * 1.33333) * cloudMult;
volumetricClouds.rgb = colorSample;
cloudLinearDepth = sqrt(lTracePos / renderDistance);
break;
}
}
return volumetricClouds;
}
@@ -1,376 +1,376 @@
#include "/lib/shaderSettings/cloudsAndLighting.glsl"
const float cloudStretchModified = max(0.25, float(CLOUD_STRETCH) * 1.9 - 0.9);
#if CLOUD_QUALITY_INTERNAL == 1 || !defined DEFERRED1
const float cloudStretchRaw = 11.0 * cloudStretchModified;
#elif CLOUD_QUALITY_INTERNAL == 2
const float cloudStretchRaw = 16.0 * cloudStretchModified;
#elif CLOUD_QUALITY_INTERNAL == 3
const float cloudStretchRaw = 18.0 * cloudStretchModified;
#elif CLOUD_QUALITY_INTERNAL == 4
const float cloudStretchRaw = 20.0 * cloudStretchModified;
#endif
#ifdef DOUBLE_UNBOUND_CLOUDS
const float L2cloudStretch = cloudStretchRaw * CLOUD_UNBOUND_LAYER2_HEIGHT / CLOUD_STRETCH;
#if CLOUD_UNBOUND_SIZE_MULT <= 100
float cloudStretch = cloudStretchRaw;
#else
float cloudStretch = cloudStretchRaw / float(CLOUD_UNBOUND_SIZE_MULT_M);
#endif
float cloudTallness = cloudStretch * 2.0;
#else
#if CLOUD_UNBOUND_SIZE_MULT <= 100
const float cloudStretch = cloudStretchRaw;
#else
const float cloudStretch = cloudStretchRaw / float(CLOUD_UNBOUND_SIZE_MULT_M);
#endif
const float cloudTallness = cloudStretch * 2.0;
#endif
#if CLOUD_QUALITY > 1
const float cloudNarrowness = 0.00012;
#else
const float cloudNarrowness = 0.00006;
#endif
float GetCloudNoise(vec3 tracePos, int cloudAltitude, float lTracePosXZ, float cloudPlayerPosY) {
vec3 tracePosM = tracePos.xyz * cloudNarrowness;
float wind = 0.0006;
float noise = 0.0;
float currentPersist = 1.0;
float total = 0.0;
#if CLOUD_SPEED_MULT == 100
#define CLOUD_SPEED_MULT_M CLOUD_SPEED_MULT * 0.01
wind *= syncedTime;
#else
#define CLOUD_SPEED_MULT_M CLOUD_SPEED_MULT * 0.01
wind *= frameTimeCounter * CLOUD_SPEED_MULT_M;
#endif
#if CLOUD_UNBOUND_SIZE_MULT != 100
tracePosM *= CLOUD_UNBOUND_SIZE_MULT_M;
wind *= CLOUD_UNBOUND_SIZE_MULT_M;
#endif
#ifdef DOUBLE_UNBOUND_CLOUDS
if (cloudAltitude != cloudAlt1i) {
tracePosM *= CLOUD_UNBOUND_LAYER2_SIZE * 10.0 / CLOUD_UNBOUND_SIZE_MULT;
wind *= CLOUD_UNBOUND_LAYER2_SIZE * 30.0 * CLOUD_LAYER2_SPEED_MULT / CLOUD_UNBOUND_SIZE_MULT;
}
#endif
#if CLOUD_QUALITY_INTERNAL == 1
int sampleCount = 2;
float persistance = 0.6;
float noiseMult = 0.95;
wind *= 0.5;
#elif CLOUD_QUALITY_INTERNAL == 2 || !defined DEFERRED1
int sampleCount = 4;
float persistance = 0.5;
float noiseMult = 1.14;
#elif CLOUD_QUALITY_INTERNAL == 3
int sampleCount = 4;
float persistance = 0.5;
float noiseMult = 1.0;
#elif CLOUD_QUALITY_INTERNAL == 4
int sampleCount = 5;
float persistance = 0.5;
float noiseMult = 1.05;
#endif
#ifndef DEFERRED1
noiseMult *= 1.2;
#endif
#if CLOUD_DIRECTION == 1
tracePosM.xz = tracePosM.zx;
#endif
for (int i = 0; i < sampleCount; i++) {
#if CLOUD_QUALITY_INTERNAL >= 2
noise += Noise3D(tracePosM - vec3(0.0, 0.0, wind)) * currentPersist;
#else
noise += texture2DLod(noisetex, tracePosM.xz - vec2(0.0, wind), 0.0).b * currentPersist;
#endif
total += currentPersist;
tracePosM *= 3.0;
wind *= 0.5;
currentPersist *= persistance;
}
noise = pow2(noise / total);
#define CLOUD_BASE_ADD 0.8
//#define CLOUD_FAR_ADD -0.005
#define CLOUD_ABOVE_ADD 0.1
float nightCloudRemove = NIGHT_CLOUD_UNBOUND_REMOVE * (1.0 - sunVisibility) * -0.65 + 1.0; // mapped to 1 to 0.65 range
float seasonCloudAdd = 0.0;
#if SEASONS > 0
float autumnOnlyForests = 1.0;
#ifdef AUTUMN_CONDITION
autumnOnlyForests = inForest;
#endif
float autumnWinterTime = autumnTime + winterTime;
#if SNOW_CONDITION != 2
autumnWinterTime *= mix(inSnowy + autumnOnlyForests, inSnowy, winterTime); // make only appear in cold biomes during winter
#endif
#if SNOW_CONDITION == 0
autumnWinterTime *= mix(rainFactor + autumnOnlyForests, rainFactor, winterTime); // make only appear in rain during winter
#endif
seasonCloudAdd += mix(0.0, 0.35, autumnWinterTime);
seasonCloudAdd += mix(0.0, -0.2, summerTime);
#endif
noiseMult *= CLOUD_BASE_ADD
//+ CLOUD_FAR_ADD * sqrt(lTracePosXZ + 10.0) // more/less clouds far away
+ CLOUD_ABOVE_ADD * clamp01(-cloudPlayerPosY / cloudTallness) // more clouds when camera is above them
+ CLOUD_UNBOUND_RAIN_ADD * rainFactor + seasonCloudAdd; // more clouds during rain and seasons
#ifdef DOUBLE_UNBOUND_CLOUDS
if (cloudAltitude != cloudAlt1i)
noise *= noiseMult * CLOUD_UNBOUND_LAYER2_AMOUNT * nightCloudRemove;
else
#endif
noise *= noiseMult * CLOUD_UNBOUND_AMOUNT * nightCloudRemove;
float threshold = clamp(abs(cloudAltitude - tracePos.y) / cloudStretch, 0.001, 0.999);
threshold = pow2(pow2(pow2(threshold)));
return noise - (threshold * 0.2 + 0.25);
}
vec4 GetVolumetricClouds(int cloudAltitude, float distanceThreshold, inout float cloudLinearDepth, float skyFade, float skyMult0, vec3 cameraPos, vec3 nPlayerPos, float lViewPosM, float VdotS, float VdotU, float dither, vec3 sunVec, vec3 viewPos) {
vec4 volumetricClouds = vec4(0.0);
#ifdef DOUBLE_UNBOUND_CLOUDS
float L1cloudStretch = cloudStretch;
if (cloudAltitude != cloudAlt1i) { // second layer
cloudStretch = L2cloudStretch;
cloudTallness = 2.0 * cloudStretch;
}
#endif
float higherPlaneAltitude = cloudAltitude + cloudStretch;
float lowerPlaneAltitude = cloudAltitude - cloudStretch;
float lowerPlaneDistance = (lowerPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float higherPlaneDistance = (higherPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float minPlaneDistance = min(lowerPlaneDistance, higherPlaneDistance);
minPlaneDistance = max(minPlaneDistance, 0.0);
float maxPlaneDistance = max(lowerPlaneDistance, higherPlaneDistance);
if (maxPlaneDistance < 0.0) return vec4(0.0);
float planeDistanceDif = maxPlaneDistance - minPlaneDistance;
#ifndef DEFERRED1
float stepMult = 64.0;
#elif CLOUD_QUALITY_INTERNAL == 1
float stepMult = 16.0;
#elif CLOUD_QUALITY_INTERNAL == 2
float stepMult = 32.0;
#elif CLOUD_QUALITY_INTERNAL == 3
float stepMult = 16.0;
#elif CLOUD_QUALITY_INTERNAL == 4
float stepMult = 24.0;
#endif
#if defined DOUBLE_UNBOUND_CLOUDS && (CLOUD_UNBOUND_LAYER2_SIZE > 10 || CLOUD_UNBOUND_SIZE_MULT > 100)
if (cloudAltitude != cloudAlt1i) {
#if CLOUD_UNBOUND_LAYER2_SIZE > 10
stepMult = stepMult / sqrt(CLOUD_UNBOUND_LAYER2_SIZE * 0.1);
#endif
} else {
#if CLOUD_UNBOUND_SIZE_MULT > 100
stepMult = stepMult / sqrt(float(CLOUD_UNBOUND_SIZE_MULT_M));
#endif
}
#else
#if CLOUD_UNBOUND_SIZE_MULT > 100
stepMult = stepMult / sqrt(float(CLOUD_UNBOUND_SIZE_MULT_M));
#endif
#endif
int sampleCount = int(planeDistanceDif / stepMult + dither + 1);
vec3 traceAdd = nPlayerPos * stepMult;
vec3 tracePos = cameraPos + minPlaneDistance * nPlayerPos;
tracePos += traceAdd * dither;
tracePos.y -= traceAdd.y;
float firstHitPos = 0.0;
float VdotSM1 = max0(sunVisibility > 0.5 ? VdotS : - VdotS);
float VdotSM1M = VdotSM1 * invRainFactor;
float VdotSM2 = pow2(VdotSM1) * abs(sunVisibility - 0.5) * 2.0;
float VdotSM3 = VdotSM2 * (2.5 + rainFactor) + 1.5 * rainFactor;
float VdotSM4 = pow(VdotSM1M, 100.0) * sunVisibility;
#ifdef FIX_AMD_REFLECTION_CRASH
sampleCount = min(sampleCount, 30); //BFARC
#endif
#ifdef AURORA_INFLUENCE
cloudLightColor = getAuroraAmbientColor(cloudLightColor, viewPos, 0.06, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
cloudAmbientColor = getAuroraAmbientColor(cloudAmbientColor, viewPos, 0.03, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
if (abs(tracePos.y - cloudAltitude) > cloudStretch) break;
vec3 cloudPlayerPos = tracePos - cameraPos;
float lTracePos = length(cloudPlayerPos);
float lTracePosXZ = length(cloudPlayerPos.xz);
float cloudMult = 1.0;
if (lTracePosXZ > distanceThreshold) break;
if (lTracePos > lViewPosM) {
if (skyFade < 0.7) continue;
else cloudMult = skyMult0;
}
float cloudNoise = GetCloudNoise(tracePos, cloudAltitude, lTracePosXZ, cloudPlayerPos.y);
if (cloudNoise > 0.00001) {
#if defined DOUBLE_UNBOUND_CLOUDS
//Fixes overlapping clouds
if (CLOUD_UNBOUND_LAYER2_HEIGHT > CLOUD_STRETCH){
if (cloudAltitude == cloudAlt1i) {
if (abs(tracePos.y - cloudAlt2i) < L2cloudStretch)
continue;
}
} else {
if (cloudAltitude != cloudAlt1i) {
if (abs(tracePos.y - cloudAlt1i) < L1cloudStretch)
continue;
}
}
#endif
#if defined CLOUD_CLOSED_AREA_CHECK && SHADOW_QUALITY > -1
float shadowLength = shadowDistance * 0.9166667; //consistent08JJ622
if (shadowLength < lTracePos)
if (GetShadowOnCloud(tracePos, cameraPos, cloudAltitude, lowerPlaneAltitude, higherPlaneAltitude)) {
if (eyeBrightness.y != 240) continue;
}
#endif
if (firstHitPos < 1.0) {
firstHitPos = lTracePos;
#if CLOUD_QUALITY_INTERNAL == 1 && defined DEFERRED1
tracePos.y += 4.0 * (texture2DLod(noisetex, tracePos.xz * cloudNarrowness * 16.0, 0.0).r - 0.5);
#endif
}
#if defined DOUBLE_UNBOUND_CLOUDS && CLOUD_UNBOUND_LAYER2_TRANSPARENCY != 20
float opacityFactor = cloudAltitude != cloudAlt1i
? min1(cloudNoise * 8.0) * (CLOUD_UNBOUND_LAYER2_TRANSPARENCY * 0.05)
: min1(cloudNoise * 8.0) * CLOUD_TRANSPARENCY;
#else
float opacityFactor = min1(cloudNoise * 8.0) * CLOUD_TRANSPARENCY;
#endif
#ifdef INVERTED_CLOUD_SHADING
float cloudShading = (higherPlaneAltitude - tracePos.y) / cloudTallness;
#else
float cloudShading = 1.0 - (higherPlaneAltitude - tracePos.y) / cloudTallness;
#endif
cloudShading *= 1.0 + 0.2 * VdotSM3 * (1.0 - opacityFactor) + VdotSM4;
#if CLOUD_SHADING_AMOUNT != 10
cloudShading = pow(max0(cloudShading), CLOUD_SHADING_AMOUNT * 0.1);
#endif
#ifdef AURORA_INFLUENCE
cloudLightColor = getAuroraAmbientColor(cloudLightColor, viewPos, 0.1, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
#if CLOUD_SUN_MOON_SHADING > 0
float visibilityFactor = 1.0;
#if CLOUD_SUN_MOON_SHADING == 1
visibilityFactor = 1.0 - sunVisibility;
#elif CLOUD_SUN_MOON_SHADING == 2
visibilityFactor = sunVisibility;
#endif
if (visibilityFactor > 0.0) {
vec3 worldLightVec = mat3(gbufferModelViewInverse) * sunVec;
float cloudLightRadius = 375.0;
float aboveFade = clamp01(1.0 - (cameraPos.y - cloudAltitude) / (cloudTallness * 3.0));
float radiusFactor = mix(cloudLightRadius * 8.0, cloudLightRadius, aboveFade);
float moonVisibility = abs(1.0 - moonPhase / 4.0);
float sunMult = mix(moonVisibility, 0.85, sunVisibility);
float sunPlaneIntersect = (cloudAltitude - cameraPos.y) / worldLightVec.y;
vec2 posVector = cameraPos.xz + worldLightVec.xz * sunPlaneIntersect - tracePos.xz;
float falloff = exp((1.0 - max0(1.0 - length(posVector) / radiusFactor)) * -6.0) * aboveFade * sunMult;
float sunShadingFactor = clamp01(falloff * mix(1.0, 2.0, aboveFade) * mix(1.0, (lTracePos - minPlaneDistance) / (maxPlaneDistance - minPlaneDistance), 0.75));
vec3 bloodMoonCloudColor = vec3(1.0);
#if BLOOD_MOON > 0
bloodMoonCloudColor = mix(bloodMoonCloudColor, vec3(0.302, 0.0078, 0.0078) * 5, getBloodMoon(sunVisibility));
#endif
cloudLightColor += bloodMoonCloudColor * sunShadingFactor * 0.3 * visibilityFactor;
cloudShading += sunShadingFactor * 0.45 * visibilityFactor;
}
#endif
#if BLOOD_MOON > 0
vec3 hsvCloudLightColor = rgb2hsv(cloudLightColor);
cloudLightColor = mix(cloudLightColor, hsv2rgb(vec3(0, max(0.66, hsvCloudLightColor.y), hsvCloudLightColor.z)), getBloodMoon(sunVisibility));
#endif
vec3 colorSample = cloudAmbientColor * (0.4 + 0.6 * cloudShading) + cloudLightColor * cloudShading;
//vec3 colorSample = 2.5 * cloudLightColor * pow2(cloudShading); // <-- Used this to take the Unbound logo
#ifdef RAIN_ATMOSPHERE
// Lightning flashes around lightning bolt position
vec3 lightningPos = getLightningPos(tracePos - cameraPos, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(1.0), 550.0, 0.0, 0) * isLightningActive() * 10.0;
colorSample += lightningAdd.y;
// Thunderstorm cloud highlights (randomly appear in stormy weather)
float highlightBoost = getThunderstormCloudHighlights(tracePos, cameraPos.xz, lTracePos, minPlaneDistance, maxPlaneDistance, 0.004);
colorSample += highlightBoost;
#endif
vec3 cloudSkyColor = GetSky(VdotU, VdotS, dither, isEyeInWater == 0, false);
#ifdef ATM_COLOR_MULTS
cloudSkyColor *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
float distanceRatio = (distanceThreshold - lTracePosXZ) / distanceThreshold;
float cloudDistanceFactor = clamp(distanceRatio, 0.0, 0.8) * 1.25;
float cloudFogFactor = pow2(pow1_5(clamp(distanceRatio, 0.0, 1.0)));
float skyMult1 = 1.0 - 0.2 * (1.0 - skyFade) * max(sunVisibility2, nightFactor);
float skyMult2 = 1.0 - 0.33333 * skyFade;
colorSample = mix(cloudSkyColor, colorSample * skyMult1, cloudFogFactor * skyMult2 * 0.72);
colorSample *= pow2(1.0 - maxBlindnessDarkness);
volumetricClouds.rgb = mix(volumetricClouds.rgb, colorSample, 1.0 - min1(volumetricClouds.a));
volumetricClouds.a += opacityFactor * pow(cloudDistanceFactor, 0.5 + 10.0 * pow(abs(VdotSM1M), 90.0)) * cloudMult;
if (volumetricClouds.a > 0.9) {
volumetricClouds.a = 1.0;
break;
}
}
}
#ifndef DOUBLE_UNBOUND_CLOUDS
if (volumetricClouds.a > 0.5)
#endif
{ cloudLinearDepth = sqrt(firstHitPos / renderDistance); }
return volumetricClouds;
}
#include "/lib/shaderSettings/cloudsAndLighting.glsl"
const float cloudStretchModified = max(0.25, float(CLOUD_STRETCH) * 1.9 - 0.9);
#if CLOUD_QUALITY_INTERNAL == 1 || !defined DEFERRED1
const float cloudStretchRaw = 11.0 * cloudStretchModified;
#elif CLOUD_QUALITY_INTERNAL == 2
const float cloudStretchRaw = 16.0 * cloudStretchModified;
#elif CLOUD_QUALITY_INTERNAL == 3
const float cloudStretchRaw = 18.0 * cloudStretchModified;
#elif CLOUD_QUALITY_INTERNAL == 4
const float cloudStretchRaw = 20.0 * cloudStretchModified;
#endif
#ifdef DOUBLE_UNBOUND_CLOUDS
const float L2cloudStretch = cloudStretchRaw * CLOUD_UNBOUND_LAYER2_HEIGHT / CLOUD_STRETCH;
#if CLOUD_UNBOUND_SIZE_MULT <= 100
float cloudStretch = cloudStretchRaw;
#else
float cloudStretch = cloudStretchRaw / float(CLOUD_UNBOUND_SIZE_MULT_M);
#endif
float cloudTallness = cloudStretch * 2.0;
#else
#if CLOUD_UNBOUND_SIZE_MULT <= 100
const float cloudStretch = cloudStretchRaw;
#else
const float cloudStretch = cloudStretchRaw / float(CLOUD_UNBOUND_SIZE_MULT_M);
#endif
const float cloudTallness = cloudStretch * 2.0;
#endif
#if CLOUD_QUALITY > 1
const float cloudNarrowness = 0.00012;
#else
const float cloudNarrowness = 0.00006;
#endif
float GetCloudNoise(vec3 tracePos, int cloudAltitude, float lTracePosXZ, float cloudPlayerPosY) {
vec3 tracePosM = tracePos.xyz * cloudNarrowness;
float wind = 0.0006;
float noise = 0.0;
float currentPersist = 1.0;
float total = 0.0;
#if CLOUD_SPEED_MULT == 100
#define CLOUD_SPEED_MULT_M CLOUD_SPEED_MULT * 0.01
wind *= syncedTime;
#else
#define CLOUD_SPEED_MULT_M CLOUD_SPEED_MULT * 0.01
wind *= frameTimeCounter * CLOUD_SPEED_MULT_M;
#endif
#if CLOUD_UNBOUND_SIZE_MULT != 100
tracePosM *= CLOUD_UNBOUND_SIZE_MULT_M;
wind *= CLOUD_UNBOUND_SIZE_MULT_M;
#endif
#ifdef DOUBLE_UNBOUND_CLOUDS
if (cloudAltitude != cloudAlt1i) {
tracePosM *= CLOUD_UNBOUND_LAYER2_SIZE * 10.0 / CLOUD_UNBOUND_SIZE_MULT;
wind *= CLOUD_UNBOUND_LAYER2_SIZE * 30.0 * CLOUD_LAYER2_SPEED_MULT / CLOUD_UNBOUND_SIZE_MULT;
}
#endif
#if CLOUD_QUALITY_INTERNAL == 1
int sampleCount = 2;
float persistance = 0.6;
float noiseMult = 0.95;
wind *= 0.5;
#elif CLOUD_QUALITY_INTERNAL == 2 || !defined DEFERRED1
int sampleCount = 4;
float persistance = 0.5;
float noiseMult = 1.14;
#elif CLOUD_QUALITY_INTERNAL == 3
int sampleCount = 4;
float persistance = 0.5;
float noiseMult = 1.0;
#elif CLOUD_QUALITY_INTERNAL == 4
int sampleCount = 5;
float persistance = 0.5;
float noiseMult = 1.05;
#endif
#ifndef DEFERRED1
noiseMult *= 1.2;
#endif
#if CLOUD_DIRECTION == 1
tracePosM.xz = tracePosM.zx;
#endif
for (int i = 0; i < sampleCount; i++) {
#if CLOUD_QUALITY_INTERNAL >= 2
noise += Noise3D(tracePosM - vec3(0.0, 0.0, wind)) * currentPersist;
#else
noise += texture2DLod(noisetex, tracePosM.xz - vec2(0.0, wind), 0.0).b * currentPersist;
#endif
total += currentPersist;
tracePosM *= 3.0;
wind *= 0.5;
currentPersist *= persistance;
}
noise = pow2(noise / total);
#define CLOUD_BASE_ADD 0.8
//#define CLOUD_FAR_ADD -0.005
#define CLOUD_ABOVE_ADD 0.1
float nightCloudRemove = NIGHT_CLOUD_UNBOUND_REMOVE * (1.0 - sunVisibility) * -0.65 + 1.0; // mapped to 1 to 0.65 range
float seasonCloudAdd = 0.0;
#if SEASONS > 0
float autumnOnlyForests = 1.0;
#ifdef AUTUMN_CONDITION
autumnOnlyForests = inForest;
#endif
float autumnWinterTime = autumnTime + winterTime;
#if SNOW_CONDITION != 2
autumnWinterTime *= mix(inSnowy + autumnOnlyForests, inSnowy, winterTime); // make only appear in cold biomes during winter
#endif
#if SNOW_CONDITION == 0
autumnWinterTime *= mix(rainFactor + autumnOnlyForests, rainFactor, winterTime); // make only appear in rain during winter
#endif
seasonCloudAdd += mix(0.0, 0.35, autumnWinterTime);
seasonCloudAdd += mix(0.0, -0.2, summerTime);
#endif
noiseMult *= CLOUD_BASE_ADD
//+ CLOUD_FAR_ADD * sqrt(lTracePosXZ + 10.0) // more/less clouds far away
+ CLOUD_ABOVE_ADD * clamp01(-cloudPlayerPosY / cloudTallness) // more clouds when camera is above them
+ CLOUD_UNBOUND_RAIN_ADD * rainFactor + seasonCloudAdd; // more clouds during rain and seasons
#ifdef DOUBLE_UNBOUND_CLOUDS
if (cloudAltitude != cloudAlt1i)
noise *= noiseMult * CLOUD_UNBOUND_LAYER2_AMOUNT * nightCloudRemove;
else
#endif
noise *= noiseMult * CLOUD_UNBOUND_AMOUNT * nightCloudRemove;
float threshold = clamp(abs(cloudAltitude - tracePos.y) / cloudStretch, 0.001, 0.999);
threshold = pow2(pow2(pow2(threshold)));
return noise - (threshold * 0.2 + 0.25);
}
vec4 GetVolumetricClouds(int cloudAltitude, float distanceThreshold, inout float cloudLinearDepth, float skyFade, float skyMult0, vec3 cameraPos, vec3 nPlayerPos, float lViewPosM, float VdotS, float VdotU, float dither, vec3 sunVec, vec3 viewPos) {
vec4 volumetricClouds = vec4(0.0);
#ifdef DOUBLE_UNBOUND_CLOUDS
float L1cloudStretch = cloudStretch;
if (cloudAltitude != cloudAlt1i) { // second layer
cloudStretch = L2cloudStretch;
cloudTallness = 2.0 * cloudStretch;
}
#endif
float higherPlaneAltitude = cloudAltitude + cloudStretch;
float lowerPlaneAltitude = cloudAltitude - cloudStretch;
float lowerPlaneDistance = (lowerPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float higherPlaneDistance = (higherPlaneAltitude - cameraPos.y) / nPlayerPos.y;
float minPlaneDistance = min(lowerPlaneDistance, higherPlaneDistance);
minPlaneDistance = max(minPlaneDistance, 0.0);
float maxPlaneDistance = max(lowerPlaneDistance, higherPlaneDistance);
if (maxPlaneDistance < 0.0) return vec4(0.0);
float planeDistanceDif = maxPlaneDistance - minPlaneDistance;
#ifndef DEFERRED1
float stepMult = 64.0;
#elif CLOUD_QUALITY_INTERNAL == 1
float stepMult = 16.0;
#elif CLOUD_QUALITY_INTERNAL == 2
float stepMult = 32.0;
#elif CLOUD_QUALITY_INTERNAL == 3
float stepMult = 16.0;
#elif CLOUD_QUALITY_INTERNAL == 4
float stepMult = 24.0;
#endif
#if defined DOUBLE_UNBOUND_CLOUDS && (CLOUD_UNBOUND_LAYER2_SIZE > 10 || CLOUD_UNBOUND_SIZE_MULT > 100)
if (cloudAltitude != cloudAlt1i) {
#if CLOUD_UNBOUND_LAYER2_SIZE > 10
stepMult = stepMult / sqrt(CLOUD_UNBOUND_LAYER2_SIZE * 0.1);
#endif
} else {
#if CLOUD_UNBOUND_SIZE_MULT > 100
stepMult = stepMult / sqrt(float(CLOUD_UNBOUND_SIZE_MULT_M));
#endif
}
#else
#if CLOUD_UNBOUND_SIZE_MULT > 100
stepMult = stepMult / sqrt(float(CLOUD_UNBOUND_SIZE_MULT_M));
#endif
#endif
int sampleCount = int(planeDistanceDif / stepMult + dither + 1);
vec3 traceAdd = nPlayerPos * stepMult;
vec3 tracePos = cameraPos + minPlaneDistance * nPlayerPos;
tracePos += traceAdd * dither;
tracePos.y -= traceAdd.y;
float firstHitPos = 0.0;
float VdotSM1 = max0(sunVisibility > 0.5 ? VdotS : - VdotS);
float VdotSM1M = VdotSM1 * invRainFactor;
float VdotSM2 = pow2(VdotSM1) * abs(sunVisibility - 0.5) * 2.0;
float VdotSM3 = VdotSM2 * (2.5 + rainFactor) + 1.5 * rainFactor;
float VdotSM4 = pow(VdotSM1M, 100.0) * sunVisibility;
#ifdef FIX_AMD_REFLECTION_CRASH
sampleCount = min(sampleCount, 30); //BFARC
#endif
#ifdef AURORA_INFLUENCE
cloudLightColor = getAuroraAmbientColor(cloudLightColor, viewPos, 0.06, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
cloudAmbientColor = getAuroraAmbientColor(cloudAmbientColor, viewPos, 0.03, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
if (abs(tracePos.y - cloudAltitude) > cloudStretch) break;
vec3 cloudPlayerPos = tracePos - cameraPos;
float lTracePos = length(cloudPlayerPos);
float lTracePosXZ = length(cloudPlayerPos.xz);
float cloudMult = 1.0;
if (lTracePosXZ > distanceThreshold) break;
if (lTracePos > lViewPosM) {
if (skyFade < 0.7) continue;
else cloudMult = skyMult0;
}
float cloudNoise = GetCloudNoise(tracePos, cloudAltitude, lTracePosXZ, cloudPlayerPos.y);
if (cloudNoise > 0.00001) {
#if defined DOUBLE_UNBOUND_CLOUDS
//Fixes overlapping clouds
if (CLOUD_UNBOUND_LAYER2_HEIGHT > CLOUD_STRETCH){
if (cloudAltitude == cloudAlt1i) {
if (abs(tracePos.y - cloudAlt2i) < L2cloudStretch)
continue;
}
} else {
if (cloudAltitude != cloudAlt1i) {
if (abs(tracePos.y - cloudAlt1i) < L1cloudStretch)
continue;
}
}
#endif
#if defined CLOUD_CLOSED_AREA_CHECK && SHADOW_QUALITY > -1
float shadowLength = shadowDistance * 0.9166667; //consistent08JJ622
if (shadowLength < lTracePos)
if (GetShadowOnCloud(tracePos, cameraPos, cloudAltitude, lowerPlaneAltitude, higherPlaneAltitude)) {
if (eyeBrightness.y != 240) continue;
}
#endif
if (firstHitPos < 1.0) {
firstHitPos = lTracePos;
#if CLOUD_QUALITY_INTERNAL == 1 && defined DEFERRED1
tracePos.y += 4.0 * (texture2DLod(noisetex, tracePos.xz * cloudNarrowness * 16.0, 0.0).r - 0.5);
#endif
}
#if defined DOUBLE_UNBOUND_CLOUDS && CLOUD_UNBOUND_LAYER2_TRANSPARENCY != 20
float opacityFactor = cloudAltitude != cloudAlt1i
? min1(cloudNoise * 8.0) * (CLOUD_UNBOUND_LAYER2_TRANSPARENCY * 0.05)
: min1(cloudNoise * 8.0) * CLOUD_TRANSPARENCY;
#else
float opacityFactor = min1(cloudNoise * 8.0) * CLOUD_TRANSPARENCY;
#endif
#ifdef INVERTED_CLOUD_SHADING
float cloudShading = (higherPlaneAltitude - tracePos.y) / cloudTallness;
#else
float cloudShading = 1.0 - (higherPlaneAltitude - tracePos.y) / cloudTallness;
#endif
cloudShading *= 1.0 + 0.2 * VdotSM3 * (1.0 - opacityFactor) + VdotSM4;
#if CLOUD_SHADING_AMOUNT != 10
cloudShading = pow(max0(cloudShading), CLOUD_SHADING_AMOUNT * 0.1);
#endif
#ifdef AURORA_INFLUENCE
cloudLightColor = getAuroraAmbientColor(cloudLightColor, viewPos, 0.1, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.75);
#endif
#if CLOUD_SUN_MOON_SHADING > 0
float visibilityFactor = 1.0;
#if CLOUD_SUN_MOON_SHADING == 1
visibilityFactor = 1.0 - sunVisibility;
#elif CLOUD_SUN_MOON_SHADING == 2
visibilityFactor = sunVisibility;
#endif
if (visibilityFactor > 0.0) {
vec3 worldLightVec = mat3(gbufferModelViewInverse) * sunVec;
float cloudLightRadius = 375.0;
float aboveFade = clamp01(1.0 - (cameraPos.y - cloudAltitude) / (cloudTallness * 3.0));
float radiusFactor = mix(cloudLightRadius * 8.0, cloudLightRadius, aboveFade);
float moonVisibility = abs(1.0 - moonPhase / 4.0);
float sunMult = mix(moonVisibility, 0.85, sunVisibility);
float sunPlaneIntersect = (cloudAltitude - cameraPos.y) / worldLightVec.y;
vec2 posVector = cameraPos.xz + worldLightVec.xz * sunPlaneIntersect - tracePos.xz;
float falloff = exp((1.0 - max0(1.0 - length(posVector) / radiusFactor)) * -6.0) * aboveFade * sunMult;
float sunShadingFactor = clamp01(falloff * mix(1.0, 2.0, aboveFade) * mix(1.0, (lTracePos - minPlaneDistance) / (maxPlaneDistance - minPlaneDistance), 0.75));
vec3 bloodMoonCloudColor = vec3(1.0);
#if BLOOD_MOON > 0
bloodMoonCloudColor = mix(bloodMoonCloudColor, vec3(0.302, 0.0078, 0.0078) * 5, getBloodMoon(sunVisibility));
#endif
cloudLightColor += bloodMoonCloudColor * sunShadingFactor * 0.3 * visibilityFactor;
cloudShading += sunShadingFactor * 0.45 * visibilityFactor;
}
#endif
#if BLOOD_MOON > 0
vec3 hsvCloudLightColor = rgb2hsv(cloudLightColor);
cloudLightColor = mix(cloudLightColor, hsv2rgb(vec3(0, max(0.66, hsvCloudLightColor.y), hsvCloudLightColor.z)), getBloodMoon(sunVisibility));
#endif
vec3 colorSample = cloudAmbientColor * (0.4 + 0.6 * cloudShading) + cloudLightColor * cloudShading;
//vec3 colorSample = 2.5 * cloudLightColor * pow2(cloudShading); // <-- Used this to take the Unbound logo
#ifdef RAIN_ATMOSPHERE
// Lightning flashes around lightning bolt position
vec3 lightningPos = getLightningPos(tracePos - cameraPos, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(1.0), 550.0, 0.0, 0) * isLightningActive() * 10.0;
colorSample += lightningAdd.y;
// Thunderstorm cloud highlights (randomly appear in stormy weather)
float highlightBoost = getThunderstormCloudHighlights(tracePos, cameraPos.xz, lTracePos, minPlaneDistance, maxPlaneDistance, 0.004);
colorSample += highlightBoost;
#endif
vec3 cloudSkyColor = GetSky(VdotU, VdotS, dither, isEyeInWater == 0, false);
#ifdef ATM_COLOR_MULTS
cloudSkyColor *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
float distanceRatio = (distanceThreshold - lTracePosXZ) / distanceThreshold;
float cloudDistanceFactor = clamp(distanceRatio, 0.0, 0.8) * 1.25;
float cloudFogFactor = pow2(pow1_5(clamp(distanceRatio, 0.0, 1.0)));
float skyMult1 = 1.0 - 0.2 * (1.0 - skyFade) * max(sunVisibility2, nightFactor);
float skyMult2 = 1.0 - 0.33333 * skyFade;
colorSample = mix(cloudSkyColor, colorSample * skyMult1, cloudFogFactor * skyMult2 * 0.72);
colorSample *= pow2(1.0 - maxBlindnessDarkness);
volumetricClouds.rgb = mix(volumetricClouds.rgb, colorSample, 1.0 - min1(volumetricClouds.a));
volumetricClouds.a += opacityFactor * pow(cloudDistanceFactor, 0.5 + 10.0 * pow(abs(VdotSM1M), 90.0)) * cloudMult;
if (volumetricClouds.a > 0.9) {
volumetricClouds.a = 1.0;
break;
}
}
}
#ifndef DOUBLE_UNBOUND_CLOUDS
if (volumetricClouds.a > 0.5)
#endif
{ cloudLinearDepth = sqrt(firstHitPos / renderDistance); }
return volumetricClouds;
}
@@ -1,296 +1,296 @@
#ifndef ENDCRYSTAL_SAMPLER_DEFINE
uniform isampler2D endcrystal_sampler;
#endif
const float healing_boundRadius = 6.0;
const float healing_ballRadius = 3.5;
const float healing_beamRadius = 0.6;
const float vortex_cylinderRadius = 3.0;
const float vortex_ballRadius = 5.0;
const float death_radius = 70.0;
#ifndef INCLUDE_ENDER_BEAMS
#ifdef GBUFFERS_WATER
float vlFactor = 0.5;
#endif
#endif
vec3 beamPurple = normalize(endColorBeam * endColorBeam * endColorBeam) * (2.5 - 1.0 * vlFactor) * E_BEAM_I;
vec3 endDragonColM = sqrt(endOrangeCol);
vec3 beamColM = sqrt(beamPurple);
float GetBallRadius(float state) {
return vortex_ballRadius * (1.0 + 4.0 * sqrt(1.0 - state));
}
float VortexWidth(float x, float ballRadius) {
if (x > 0.5 * ballRadius) {
float expScale = sqrt(0.75) * ballRadius - vortex_cylinderRadius;
return vortex_cylinderRadius + expScale * exp( -sqrt(1.0/3.0) / expScale * (x - 0.5 * ballRadius));
} else if (x > -ballRadius) {
return sqrt(pow2(ballRadius) - pow2(x));
}
return 0.0;
}
vec4 SampleEndCrystalVortex(vec3 relPos, vec2 state, vec2 noiseOffset) {
float thisBallRadius = GetBallRadius(state.x);
float beamFactor = smoothstep(-thisBallRadius, thisBallRadius, relPos.y);
float featureWidth = VortexWidth(relPos.y, thisBallRadius);
vec2 horizontalScaledPos = featureWidth > 0.0 ? relPos.xz / featureWidth : vec2(2.0);
float featureDist = length(horizontalScaledPos);
if (length(relPos.xz) > featureWidth) {
return vec4(0);
}
float beamStrength = 2.5 * beamFactor * (cos(featureDist * 3.1416) * 0.5 + 0.5) * pow2(max(0.0, 1 - pow2(0.005 / (0.9 * state.x + 0.1) / pow2(pow2(state.y)) * relPos.y))) * state.x;
float spiralStrength = 200 * beamFactor * pow(featureDist, 7) * pow2(1.0 - featureDist) * pow2(max(0.0, 1 - pow2(0.02 / (0.6 * state.x * state.x + 0.4) / state.y * relPos.y)));
float spiralAngle = (0.4 / vortex_cylinderRadius * relPos.y - 0.2 * pow2(min(0.0, -2.5 + relPos.y / thisBallRadius))) / (state.x + 0.2);
vec2 spiralPos = mat2(cos(spiralAngle), -sin(spiralAngle), sin(spiralAngle), cos(spiralAngle)) * horizontalScaledPos;
vec4 beamNoise = texture2DLod(noisetex, noiseOffset + 5.0 / noiseTextureResolution * horizontalScaledPos, 0.0);
vec4 beamNoise2 = texture2DLod(noisetex, noiseOffset + 5.0 / noiseTextureResolution * vec2(relPos.y * 0.02 + 2.7 * beamNoise.gb - 3.6 * frameTimeCounter * 0.5), 0.0);
vec4 spiralNoise = texture2DLod(noisetex, noiseOffset + 5.0 / noiseTextureResolution * spiralPos, 0.0);
vec4 spiralNoise2 = texture2DLod(noisetex, noiseOffset + 20.0 / noiseTextureResolution * spiralPos, 0.0);
return vec4(beamStrength * beamNoise.r * beamNoise2.r * endDragonColM + spiralStrength * pow2(spiralNoise.r) * (0.5 + spiralNoise2.r) * beamColM, beamStrength + spiralStrength) * 0.3;
}
vec4 SingleEndCrystalVortex(vec3 start, vec3 direction, vec3 center, vec2 state, float dither) {
const float stepSize = 0.5;
float invHorizontalDirLen = 1.0 / length(direction.xz);
float thisBallRadius = GetBallRadius(state.x);
float closestProgress = clamp(
dot(center.xz - start.xz, direction.xz) * pow2(invHorizontalDirLen),
-thisBallRadius * invHorizontalDirLen,
1.0 + thisBallRadius * invHorizontalDirLen);
vec3 closestPos = start + closestProgress * direction;
float closestDist = length(closestPos.xz - center.xz);
if (closestDist > thisBallRadius) {
return vec4(0);
}
float startProgress = closestProgress - sqrt((thisBallRadius * thisBallRadius - closestDist * closestDist)) * invHorizontalDirLen;
float endProgress = min(1.0, 2 * closestProgress - startProgress);
startProgress = max(0.0, startProgress);
vec2 noiseOffset = (center.xz + cameraPosition.xz + vec2(3.0, 1.6) * frameTimeCounter) * 0.005;
vec4 colour = vec4(0);
float dist = startProgress + dither * invHorizontalDirLen * stepSize;
for (int k = 0; k < 100; k++) {
if (dist > endProgress) break;
colour += SampleEndCrystalVortex(start + dist * direction - center, state, noiseOffset);
dist += invHorizontalDirLen * stepSize;
}
return colour * stepSize * smoothstep(0.0, 1.0, state.x);
}
float EndCrystalBeamWidth(float x, float len) {
x = 0.5 * len - abs(x - 0.5 * len);
if (x <= -healing_ballRadius) return 0.0;
if (x < 0.5 * healing_ballRadius) return sqrt(pow2(healing_ballRadius) - pow2(x));
float expScale = sqrt(0.75) * healing_ballRadius - healing_beamRadius;
return healing_beamRadius + expScale * exp( -sqrt(1.0/3.0) / expScale * (x - 0.5 * healing_ballRadius));
}
vec4 SampleEndCrystalBeam(vec3 relPos, float len) {
float beamWidth = EndCrystalBeamWidth(relPos.x, len);
if (beamWidth > 0.0001) {
float beamFactor = smoothstep(0.0, 2.0 * healing_ballRadius, 0.5 * len - abs(relPos.x - 0.5 * len));
float noisyTime = frameTimeCounter + 0.4 * texture2DLod(noisetex, vec2(3.0 / noiseTextureResolution, frameTimeCounter / (0.45 * noiseTextureResolution)), 0.0).r;
relPos.yz /= beamWidth;
float strength = 0.0;
vec3 healBeamColor = vec3(0);
for (int k = 0; k < 3; k++) {
vec2 noiseCoords = vec2(0.2 / noiseTextureResolution * relPos.x, 0 + vec2(k, 6 * k) / noiseTextureResolution);
vec4 zapNoise0 = texture2DLod(noisetex, noiseCoords + floor(8.0 * noisyTime) / noiseTextureResolution, 0.0);
vec4 zapNoise1 = texture2DLod(noisetex, 3.3 * noiseCoords + floor(8.0 * noisyTime) / noiseTextureResolution, 0.0);
vec4 zapNoise2 = texture2DLod(noisetex, 6.8 * noiseCoords + (15.0 * frameTimeCounter) / noiseTextureResolution, 0.0);
vec2 thisRelPos = relPos.yz + beamFactor / beamWidth * (6.0 * zapNoise0.rb + 1.6 * zapNoise1.rb + 1.2 * zapNoise2.rb - (3.0 + 0.8 + 0.6));
vec4 sideNoise = texture2DLod(noisetex, (7.0 * thisRelPos.xy) / noiseTextureResolution, 0.0);
vec3 colorNoise = texture2DLod(noisetex, 4.0 * noiseCoords + floor(12.0 * noisyTime) / noiseTextureResolution, 0.0).rgb;
float centerDist0 = length(thisRelPos.xy);
float centerDist = centerDist0 - 1.2;
strength = max(strength, clamp( -centerDist, 0.0, 0.2) * pow2(max(0.0, 1.0 - pow2((centerDist0 - 1.0) * beamWidth * 0.5))) * mix(1.0, sideNoise.b, beamWidth / healing_ballRadius));
healBeamColor = mix(clamp01(saturateColors(beamColM, 0.8) - sideNoise.rgb * 0.08), saturateColors(beamColM, 1.3) * 1.3, colorNoise);
}
return strength / beamWidth * vec4(healBeamColor * 0.5, 1.0) + 0.2 * beamFactor * exp(-6.0 * dot(relPos.yz, relPos.yz)) * vec4(endDragonColM * 2.2, 1.0);
}
return vec4(0.0);
}
vec4 EndCrystalBeam(vec3 start, vec3 direction, vec3 startPos, vec3 endPos, float dither) {
vec3 startDiff = start - startPos;
vec3 beamDirection = endPos - startPos;
mat3 rotMat;
rotMat[0] = normalize(beamDirection);
rotMat[1] = normalize(cross(beamDirection, vec3(-2e-4, 1, 1e-5)));
rotMat[2] = cross(rotMat[0], rotMat[1]);
start *= rotMat;
startPos *= rotMat;
beamDirection *= rotMat;
direction *= rotMat;
const float stepSize = 0.5;
float invHorizontalDirLen = 1.0 / length(direction.yz);
float closestProgress = clamp(
dot(startPos.yz - start.yz, direction.yz) * pow2(invHorizontalDirLen),
-healing_boundRadius * invHorizontalDirLen,
1.0 + healing_boundRadius * invHorizontalDirLen);
vec3 closestPos = start + closestProgress * direction;
float closestDist = length(closestPos.yz - startPos.yz);
if (closestDist > healing_boundRadius) {
return vec4(0);
}
float startProgress = closestProgress - sqrt((healing_boundRadius * healing_boundRadius - closestDist * closestDist)) * invHorizontalDirLen;
float endProgress = min(1.0, 2 * closestProgress - startProgress);
startProgress = max(0.0, startProgress);
vec4 colour = vec4(0);
float dist = startProgress + dither * invHorizontalDirLen * stepSize;
for (int k = 0; k < 100; k++) {
if (dist > endProgress) break;
colour += SampleEndCrystalBeam(start + dist * direction - startPos, beamDirection.x);
dist += invHorizontalDirLen * stepSize;
}
return 3.0 * log(length(colour) * stepSize + 1.0) * normalize(colour + 0.0000001);
}
float GetDragonDeathFactor(float dragonDeathTime) {
return 0.02 * dragonDeathTime * exp(0.1 * dragonDeathTime);
}
vec4 SampleDeathBuildup(vec3 relPos, float dragonDeathTime) {
float effectFactor = GetDragonDeathFactor(dragonDeathTime);
float effectRadius = death_radius * effectFactor;
float sizeNoiseFactor = 1.0 + 0.3 * texture2DLod(noisetex, vec2(0.2, dragonDeathTime * 5.0 / noiseTextureResolution), 0.0).r;
float centerDist = length(relPos) / effectRadius;
relPos *= sizeNoiseFactor;
float angle = centerDist * 5.0 / log(dragonDeathTime * 0.6 + 1.0);
mat2 rotMat = mat2(
cos(angle), sin(angle),
-sin(angle), cos(angle)
);
relPos.xz = rotMat * relPos.xz;
vec2 val = pow(fract(hash23(floor(0.8 * relPos + 2.7 * sign(relPos) * exp(0.3 * dragonDeathTime)))), vec2(40.0 * pow2(centerDist))) * (1.0 - centerDist);
return 0.1 * (vec4(beamColM, 1.0) * (val.x + 0.4 * exp(-8.0 * pow2(centerDist))) + vec4(endDragonColM, 1.0) * (val.y + 0.1 * exp(-3.0 * pow2(centerDist))));
}
vec4 DragonDeathAnimation(vec3 start, vec3 direction, vec3 dragonPos, float dragonDeathTime, float dragonDeathFactor, float dither) {
float dirLen = length(direction);
float closestProgress = dot(dragonPos - start, direction) / pow2(dirLen);
vec4 colour = vec4(0);
if (dragonDeathFactor >= 0.99) {
float effectRadius = death_radius * GetDragonDeathFactor(dragonDeathTime);
vec3 closestPos = start + closestProgress * direction;
float closestDist = length(closestPos - dragonPos);
if (closestDist >= effectRadius) return vec4(0.0);
float stepSize = 0.5 / dirLen;
float startProgress = closestProgress - sqrt(pow2(effectRadius) - pow2(closestDist)) / dirLen;
float endProgress = min(1.0, 2.0 * closestProgress - startProgress);
startProgress = max(0.0, startProgress);
float dist = startProgress + stepSize * dither;
for (int k = 0; k < 150; k++) {
if (dist > endProgress) break;
colour += SampleDeathBuildup(start + dist * direction - dragonPos, dragonDeathTime);
dist += stepSize;
}
colour *= stepSize * dirLen;
} else {
vec3 closestPos = start + clamp(closestProgress, 0.0, 1.0) * direction;
float closestDist = length(dragonPos - closestPos);
colour = vec4(endDragonColM + 0.5 * beamColM, 1.0) * (0.4 * death_radius * (1.0 - exp(-dirLen/(4.0 * death_radius))) * exp(-10.0 * (1.0 - dragonDeathFactor) - closestDist * closestDist / (death_radius * death_radius)) * dragonDeathFactor);
}
return colour;
}
vec4 EndCrystalVortices(vec3 start, vec3 direction, float dither) {
vec4 color = vec4(0);
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1 || DRAGON_DEATH_EFFECT_INTERNAL > 0
ivec4 rawDragonPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(35, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 8), 0).r
);
vec3 dragonPos = rawDragonPos.xyz != ivec3(0) ? 0.0001 * rawDragonPos.xyz : vec3(0.5, 80.5, 0.5) - cameraPosition;
#endif
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1
vec3[15] healBeamEndPositions;
int isTarget = 0;
int healBeamCount = 15;
for (int k = 0; k < 15; k++) {
ivec4 rawPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(20 + k, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(20 + k, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(20 + k, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(20 + k, 8), 0).r
);
if (rawPos.w == 0) {
healBeamCount = k;
break;
}
healBeamEndPositions[k] = vec3(rawPos.xyz) / rawPos.w;
isTarget |= (length(healBeamEndPositions[k].xz + cameraPosition.xz - 0.5) < 4.5 || length(dragonPos - healBeamEndPositions[k]) < 5.0) ? 1 << k : 0;
}
#endif
#if END_CRYSTAL_VORTEX_INTERNAL % 2 == 1
for (int k = 0; k < 20; k++) {
if (texelFetch(endcrystal_sampler, ivec2(k, 8), 0).r <= 0) continue;
ivec4 rawPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(k, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(k, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(k, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(k, 8), 0).r
);
if (rawPos.w <= 0) {
continue;
}
int age = texelFetch(endcrystal_sampler, ivec2(k, 9), 0).r;
vec3 pos = rawPos.xyz * 0.0001;
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1
for (int i = 0; i < healBeamCount; i++) {
isTarget |= length(pos - healBeamEndPositions[i]) < 4.5 ? 1<<(i+15) : 0;
}
#endif
vec2 state = vec2(clamp(rawPos.w / 15000.0, 0.0, 1.0), 1.00001 - exp(-0.0001 * age));
if (length(pos) > min(shadowDistance, far) * 0.9 && state.x < 0.999) {
state.y = state.x;
state.x = 1.0;
}
vec4 thisVortexCol = pow2(SingleEndCrystalVortex(start, direction, pos, state, dither));
color += thisVortexCol;
}
#endif
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1
for (int k = 0; k < healBeamCount; k++) {
for (int l = k+1; l < healBeamCount; l++) {
if (
((isTarget >> k & 1) == 0 ^^ (isTarget >> l & 1) == 0)
#if END_CRYSTAL_VORTEX_INTERNAL % 2 == 1
&& ((isTarget >> k + 15 & 1) == 0 ^^ (isTarget >> l + 15 & 1) == 0)
#endif
) {
vec3 pos0 = healBeamEndPositions[k];
vec3 pos1 = healBeamEndPositions[l];
if (pos0.y > pos1.y) {
vec3 tmp = pos0;
pos0 = pos1;
pos1 = tmp;
}
color += pow2(EndCrystalBeam(start, direction, pos0, pos1, dither));
}
}
}
#endif
#if DRAGON_DEATH_EFFECT_INTERNAL > 0
int isDying = texelFetch(endcrystal_sampler, ivec2(35, 0), 0).r;
float dragonDeathTime = 0.0001 * rawDragonPos.w;
float dragonDeathFactor = 0.0001 * isDying;
// dragonDeathTime = mod(frameTimeCounter, 22.0);
// dragonDeathFactor = 2.2 - 0.1 * dragonDeathTime;
// dragonPos = vec3(0, 80, 0) - cameraPosition;
if (dragonDeathFactor > 0.001) {
color += pow2(DragonDeathAnimation(start, direction, dragonPos, dragonDeathTime, dragonDeathFactor, dither));
}
#endif
return sqrt(color) * (1.0 - maxBlindnessDarkness);
}
#ifndef ENDCRYSTAL_SAMPLER_DEFINE
uniform isampler2D endcrystal_sampler;
#endif
const float healing_boundRadius = 6.0;
const float healing_ballRadius = 3.5;
const float healing_beamRadius = 0.6;
const float vortex_cylinderRadius = 3.0;
const float vortex_ballRadius = 5.0;
const float death_radius = 70.0;
#ifndef INCLUDE_ENDER_BEAMS
#ifdef GBUFFERS_WATER
float vlFactor = 0.5;
#endif
#endif
vec3 beamPurple = normalize(endColorBeam * endColorBeam * endColorBeam) * (2.5 - 1.0 * vlFactor) * E_BEAM_I;
vec3 endDragonColM = sqrt(endOrangeCol);
vec3 beamColM = sqrt(beamPurple);
float GetBallRadius(float state) {
return vortex_ballRadius * (1.0 + 4.0 * sqrt(1.0 - state));
}
float VortexWidth(float x, float ballRadius) {
if (x > 0.5 * ballRadius) {
float expScale = sqrt(0.75) * ballRadius - vortex_cylinderRadius;
return vortex_cylinderRadius + expScale * exp( -sqrt(1.0/3.0) / expScale * (x - 0.5 * ballRadius));
} else if (x > -ballRadius) {
return sqrt(pow2(ballRadius) - pow2(x));
}
return 0.0;
}
vec4 SampleEndCrystalVortex(vec3 relPos, vec2 state, vec2 noiseOffset) {
float thisBallRadius = GetBallRadius(state.x);
float beamFactor = smoothstep(-thisBallRadius, thisBallRadius, relPos.y);
float featureWidth = VortexWidth(relPos.y, thisBallRadius);
vec2 horizontalScaledPos = featureWidth > 0.0 ? relPos.xz / featureWidth : vec2(2.0);
float featureDist = length(horizontalScaledPos);
if (length(relPos.xz) > featureWidth) {
return vec4(0);
}
float beamStrength = 2.5 * beamFactor * (cos(featureDist * 3.1416) * 0.5 + 0.5) * pow2(max(0.0, 1 - pow2(0.005 / (0.9 * state.x + 0.1) / pow2(pow2(state.y)) * relPos.y))) * state.x;
float spiralStrength = 200 * beamFactor * pow(featureDist, 7) * pow2(1.0 - featureDist) * pow2(max(0.0, 1 - pow2(0.02 / (0.6 * state.x * state.x + 0.4) / state.y * relPos.y)));
float spiralAngle = (0.4 / vortex_cylinderRadius * relPos.y - 0.2 * pow2(min(0.0, -2.5 + relPos.y / thisBallRadius))) / (state.x + 0.2);
vec2 spiralPos = mat2(cos(spiralAngle), -sin(spiralAngle), sin(spiralAngle), cos(spiralAngle)) * horizontalScaledPos;
vec4 beamNoise = texture2DLod(noisetex, noiseOffset + 5.0 / noiseTextureResolution * horizontalScaledPos, 0.0);
vec4 beamNoise2 = texture2DLod(noisetex, noiseOffset + 5.0 / noiseTextureResolution * vec2(relPos.y * 0.02 + 2.7 * beamNoise.gb - 3.6 * frameTimeCounter * 0.5), 0.0);
vec4 spiralNoise = texture2DLod(noisetex, noiseOffset + 5.0 / noiseTextureResolution * spiralPos, 0.0);
vec4 spiralNoise2 = texture2DLod(noisetex, noiseOffset + 20.0 / noiseTextureResolution * spiralPos, 0.0);
return vec4(beamStrength * beamNoise.r * beamNoise2.r * endDragonColM + spiralStrength * pow2(spiralNoise.r) * (0.5 + spiralNoise2.r) * beamColM, beamStrength + spiralStrength) * 0.3;
}
vec4 SingleEndCrystalVortex(vec3 start, vec3 direction, vec3 center, vec2 state, float dither) {
const float stepSize = 0.5;
float invHorizontalDirLen = 1.0 / length(direction.xz);
float thisBallRadius = GetBallRadius(state.x);
float closestProgress = clamp(
dot(center.xz - start.xz, direction.xz) * pow2(invHorizontalDirLen),
-thisBallRadius * invHorizontalDirLen,
1.0 + thisBallRadius * invHorizontalDirLen);
vec3 closestPos = start + closestProgress * direction;
float closestDist = length(closestPos.xz - center.xz);
if (closestDist > thisBallRadius) {
return vec4(0);
}
float startProgress = closestProgress - sqrt((thisBallRadius * thisBallRadius - closestDist * closestDist)) * invHorizontalDirLen;
float endProgress = min(1.0, 2 * closestProgress - startProgress);
startProgress = max(0.0, startProgress);
vec2 noiseOffset = (center.xz + cameraPosition.xz + vec2(3.0, 1.6) * frameTimeCounter) * 0.005;
vec4 colour = vec4(0);
float dist = startProgress + dither * invHorizontalDirLen * stepSize;
for (int k = 0; k < 100; k++) {
if (dist > endProgress) break;
colour += SampleEndCrystalVortex(start + dist * direction - center, state, noiseOffset);
dist += invHorizontalDirLen * stepSize;
}
return colour * stepSize * smoothstep(0.0, 1.0, state.x);
}
float EndCrystalBeamWidth(float x, float len) {
x = 0.5 * len - abs(x - 0.5 * len);
if (x <= -healing_ballRadius) return 0.0;
if (x < 0.5 * healing_ballRadius) return sqrt(pow2(healing_ballRadius) - pow2(x));
float expScale = sqrt(0.75) * healing_ballRadius - healing_beamRadius;
return healing_beamRadius + expScale * exp( -sqrt(1.0/3.0) / expScale * (x - 0.5 * healing_ballRadius));
}
vec4 SampleEndCrystalBeam(vec3 relPos, float len) {
float beamWidth = EndCrystalBeamWidth(relPos.x, len);
if (beamWidth > 0.0001) {
float beamFactor = smoothstep(0.0, 2.0 * healing_ballRadius, 0.5 * len - abs(relPos.x - 0.5 * len));
float noisyTime = frameTimeCounter + 0.4 * texture2DLod(noisetex, vec2(3.0 / noiseTextureResolution, frameTimeCounter / (0.45 * noiseTextureResolution)), 0.0).r;
relPos.yz /= beamWidth;
float strength = 0.0;
vec3 healBeamColor = vec3(0);
for (int k = 0; k < 3; k++) {
vec2 noiseCoords = vec2(0.2 / noiseTextureResolution * relPos.x, 0 + vec2(k, 6 * k) / noiseTextureResolution);
vec4 zapNoise0 = texture2DLod(noisetex, noiseCoords + floor(8.0 * noisyTime) / noiseTextureResolution, 0.0);
vec4 zapNoise1 = texture2DLod(noisetex, 3.3 * noiseCoords + floor(8.0 * noisyTime) / noiseTextureResolution, 0.0);
vec4 zapNoise2 = texture2DLod(noisetex, 6.8 * noiseCoords + (15.0 * frameTimeCounter) / noiseTextureResolution, 0.0);
vec2 thisRelPos = relPos.yz + beamFactor / beamWidth * (6.0 * zapNoise0.rb + 1.6 * zapNoise1.rb + 1.2 * zapNoise2.rb - (3.0 + 0.8 + 0.6));
vec4 sideNoise = texture2DLod(noisetex, (7.0 * thisRelPos.xy) / noiseTextureResolution, 0.0);
vec3 colorNoise = texture2DLod(noisetex, 4.0 * noiseCoords + floor(12.0 * noisyTime) / noiseTextureResolution, 0.0).rgb;
float centerDist0 = length(thisRelPos.xy);
float centerDist = centerDist0 - 1.2;
strength = max(strength, clamp( -centerDist, 0.0, 0.2) * pow2(max(0.0, 1.0 - pow2((centerDist0 - 1.0) * beamWidth * 0.5))) * mix(1.0, sideNoise.b, beamWidth / healing_ballRadius));
healBeamColor = mix(clamp01(saturateColors(beamColM, 0.8) - sideNoise.rgb * 0.08), saturateColors(beamColM, 1.3) * 1.3, colorNoise);
}
return strength / beamWidth * vec4(healBeamColor * 0.5, 1.0) + 0.2 * beamFactor * exp(-6.0 * dot(relPos.yz, relPos.yz)) * vec4(endDragonColM * 2.2, 1.0);
}
return vec4(0.0);
}
vec4 EndCrystalBeam(vec3 start, vec3 direction, vec3 startPos, vec3 endPos, float dither) {
vec3 startDiff = start - startPos;
vec3 beamDirection = endPos - startPos;
mat3 rotMat;
rotMat[0] = normalize(beamDirection);
rotMat[1] = normalize(cross(beamDirection, vec3(-2e-4, 1, 1e-5)));
rotMat[2] = cross(rotMat[0], rotMat[1]);
start *= rotMat;
startPos *= rotMat;
beamDirection *= rotMat;
direction *= rotMat;
const float stepSize = 0.5;
float invHorizontalDirLen = 1.0 / length(direction.yz);
float closestProgress = clamp(
dot(startPos.yz - start.yz, direction.yz) * pow2(invHorizontalDirLen),
-healing_boundRadius * invHorizontalDirLen,
1.0 + healing_boundRadius * invHorizontalDirLen);
vec3 closestPos = start + closestProgress * direction;
float closestDist = length(closestPos.yz - startPos.yz);
if (closestDist > healing_boundRadius) {
return vec4(0);
}
float startProgress = closestProgress - sqrt((healing_boundRadius * healing_boundRadius - closestDist * closestDist)) * invHorizontalDirLen;
float endProgress = min(1.0, 2 * closestProgress - startProgress);
startProgress = max(0.0, startProgress);
vec4 colour = vec4(0);
float dist = startProgress + dither * invHorizontalDirLen * stepSize;
for (int k = 0; k < 100; k++) {
if (dist > endProgress) break;
colour += SampleEndCrystalBeam(start + dist * direction - startPos, beamDirection.x);
dist += invHorizontalDirLen * stepSize;
}
return 3.0 * log(length(colour) * stepSize + 1.0) * normalize(colour + 0.0000001);
}
float GetDragonDeathFactor(float dragonDeathTime) {
return 0.02 * dragonDeathTime * exp(0.1 * dragonDeathTime);
}
vec4 SampleDeathBuildup(vec3 relPos, float dragonDeathTime) {
float effectFactor = GetDragonDeathFactor(dragonDeathTime);
float effectRadius = death_radius * effectFactor;
float sizeNoiseFactor = 1.0 + 0.3 * texture2DLod(noisetex, vec2(0.2, dragonDeathTime * 5.0 / noiseTextureResolution), 0.0).r;
float centerDist = length(relPos) / effectRadius;
relPos *= sizeNoiseFactor;
float angle = centerDist * 5.0 / log(dragonDeathTime * 0.6 + 1.0);
mat2 rotMat = mat2(
cos(angle), sin(angle),
-sin(angle), cos(angle)
);
relPos.xz = rotMat * relPos.xz;
vec2 val = pow(fract(hash23(floor(0.8 * relPos + 2.7 * sign(relPos) * exp(0.3 * dragonDeathTime)))), vec2(40.0 * pow2(centerDist))) * (1.0 - centerDist);
return 0.1 * (vec4(beamColM, 1.0) * (val.x + 0.4 * exp(-8.0 * pow2(centerDist))) + vec4(endDragonColM, 1.0) * (val.y + 0.1 * exp(-3.0 * pow2(centerDist))));
}
vec4 DragonDeathAnimation(vec3 start, vec3 direction, vec3 dragonPos, float dragonDeathTime, float dragonDeathFactor, float dither) {
float dirLen = length(direction);
float closestProgress = dot(dragonPos - start, direction) / pow2(dirLen);
vec4 colour = vec4(0);
if (dragonDeathFactor >= 0.99) {
float effectRadius = death_radius * GetDragonDeathFactor(dragonDeathTime);
vec3 closestPos = start + closestProgress * direction;
float closestDist = length(closestPos - dragonPos);
if (closestDist >= effectRadius) return vec4(0.0);
float stepSize = 0.5 / dirLen;
float startProgress = closestProgress - sqrt(pow2(effectRadius) - pow2(closestDist)) / dirLen;
float endProgress = min(1.0, 2.0 * closestProgress - startProgress);
startProgress = max(0.0, startProgress);
float dist = startProgress + stepSize * dither;
for (int k = 0; k < 150; k++) {
if (dist > endProgress) break;
colour += SampleDeathBuildup(start + dist * direction - dragonPos, dragonDeathTime);
dist += stepSize;
}
colour *= stepSize * dirLen;
} else {
vec3 closestPos = start + clamp(closestProgress, 0.0, 1.0) * direction;
float closestDist = length(dragonPos - closestPos);
colour = vec4(endDragonColM + 0.5 * beamColM, 1.0) * (0.4 * death_radius * (1.0 - exp(-dirLen/(4.0 * death_radius))) * exp(-10.0 * (1.0 - dragonDeathFactor) - closestDist * closestDist / (death_radius * death_radius)) * dragonDeathFactor);
}
return colour;
}
vec4 EndCrystalVortices(vec3 start, vec3 direction, float dither) {
vec4 color = vec4(0);
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1 || DRAGON_DEATH_EFFECT_INTERNAL > 0
ivec4 rawDragonPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(35, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 8), 0).r
);
vec3 dragonPos = rawDragonPos.xyz != ivec3(0) ? 0.0001 * rawDragonPos.xyz : vec3(0.5, 80.5, 0.5) - cameraPosition;
#endif
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1
vec3[15] healBeamEndPositions;
int isTarget = 0;
int healBeamCount = 15;
for (int k = 0; k < 15; k++) {
ivec4 rawPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(20 + k, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(20 + k, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(20 + k, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(20 + k, 8), 0).r
);
if (rawPos.w == 0) {
healBeamCount = k;
break;
}
healBeamEndPositions[k] = vec3(rawPos.xyz) / rawPos.w;
isTarget |= (length(healBeamEndPositions[k].xz + cameraPosition.xz - 0.5) < 4.5 || length(dragonPos - healBeamEndPositions[k]) < 5.0) ? 1 << k : 0;
}
#endif
#if END_CRYSTAL_VORTEX_INTERNAL % 2 == 1
for (int k = 0; k < 20; k++) {
if (texelFetch(endcrystal_sampler, ivec2(k, 8), 0).r <= 0) continue;
ivec4 rawPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(k, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(k, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(k, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(k, 8), 0).r
);
if (rawPos.w <= 0) {
continue;
}
int age = texelFetch(endcrystal_sampler, ivec2(k, 9), 0).r;
vec3 pos = rawPos.xyz * 0.0001;
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1
for (int i = 0; i < healBeamCount; i++) {
isTarget |= length(pos - healBeamEndPositions[i]) < 4.5 ? 1<<(i+15) : 0;
}
#endif
vec2 state = vec2(clamp(rawPos.w / 15000.0, 0.0, 1.0), 1.00001 - exp(-0.0001 * age));
if (length(pos) > min(shadowDistance, far) * 0.9 && state.x < 0.999) {
state.y = state.x;
state.x = 1.0;
}
vec4 thisVortexCol = pow2(SingleEndCrystalVortex(start, direction, pos, state, dither));
color += thisVortexCol;
}
#endif
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1
for (int k = 0; k < healBeamCount; k++) {
for (int l = k+1; l < healBeamCount; l++) {
if (
((isTarget >> k & 1) == 0 ^^ (isTarget >> l & 1) == 0)
#if END_CRYSTAL_VORTEX_INTERNAL % 2 == 1
&& ((isTarget >> k + 15 & 1) == 0 ^^ (isTarget >> l + 15 & 1) == 0)
#endif
) {
vec3 pos0 = healBeamEndPositions[k];
vec3 pos1 = healBeamEndPositions[l];
if (pos0.y > pos1.y) {
vec3 tmp = pos0;
pos0 = pos1;
pos1 = tmp;
}
color += pow2(EndCrystalBeam(start, direction, pos0, pos1, dither));
}
}
}
#endif
#if DRAGON_DEATH_EFFECT_INTERNAL > 0
int isDying = texelFetch(endcrystal_sampler, ivec2(35, 0), 0).r;
float dragonDeathTime = 0.0001 * rawDragonPos.w;
float dragonDeathFactor = 0.0001 * isDying;
// dragonDeathTime = mod(frameTimeCounter, 22.0);
// dragonDeathFactor = 2.2 - 0.1 * dragonDeathTime;
// dragonPos = vec3(0, 80, 0) - cameraPosition;
if (dragonDeathFactor > 0.001) {
color += pow2(DragonDeathAnimation(start, direction, dragonPos, dragonDeathTime, dragonDeathFactor, dither));
}
#endif
return sqrt(color) * (1.0 - maxBlindnessDarkness);
}
@@ -1,46 +1,46 @@
vec3 DrawEndFlash(vec3 nViewPos, float VdotU, float dither) {
vec3 worldEndFlashPosition = mat3(gbufferModelViewInverse) * endFlashPosition;
worldEndFlashPosition = normalize(worldEndFlashPosition);
vec3 nViewPosWorld = mat3(gbufferModelViewInverse) * nViewPos;
nViewPosWorld = normalize(nViewPosWorld);
vec3 horizontalEndPos = normalize(vec3(worldEndFlashPosition.x, 0.0, worldEndFlashPosition.z));
vec3 horizontalViewPos = normalize(vec3(nViewPosWorld.x, 0.0, nViewPosWorld.z));
float horizDirFactor = pow(max0(dot(horizontalEndPos, horizontalViewPos)), 0.2);
float dirFactor = pow(max0(dot(worldEndFlashPosition, nViewPosWorld)), 10.0);
float verticalDist = abs(nViewPosWorld.y - worldEndFlashPosition.y);
float verticalFalloff = exp(-pow2(verticalDist * 5.5));
float endFlashFactor = endFlashIntensity * dirFactor * verticalFalloff;
if (endFlashFactor < 0.001) return vec3(0.0);
float time = frameTimeCounter * 0.05;
float pulse = sin(time * 3.0) * 0.5 + 0.5;
vec2 noiseCoord = horizontalViewPos.xz * 0.5 + time * 0.05;
float noise1 = texture2DLod(noisetex, noiseCoord, 0).r;
float noise2 = texture2DLod(noisetex, noiseCoord * 2.7 - time * 0.17, 0).g;
float noise3 = texture2DLod(noisetex, noiseCoord * 0.5 + time * 0.05, 0).b;
float rayFactor = pow(noise1 * noise2, 1.5) * 2.0;
float stripeFactor = pow(horizDirFactor, 2.0 + 4.0 * pulse);
// Inner core and wave animations
float radius = 1.0 + sin(time * 2.0) * 0.1;
float distFromCenter = length(dot(horizontalEndPos, horizontalViewPos));
float waveFront = smoothstep(0.0, 0.2, 1.0 - abs(distFromCenter - radius) * (4.0 + pulse * 4.0));
float core = pow(horizDirFactor, 1.0 + pulse * 2.0) * (1.0 + noise3 * 0.5);
float flashIntensity = mix(core, waveFront, 0.5) * endFlashFactor * (0.6 + rayFactor * 0.8);
flashIntensity *= stripeFactor;
vec3 orangeColor = mix(endOrangeCol, vec3(1.0), 0.3) * (1.2 + noise2 * 1.3);
vec3 finalColor = saturateColors(orangeColor, 0.8) * flashIntensity * 0.7;
return finalColor;
}
vec3 DrawEndFlash(vec3 nViewPos, float VdotU, float dither) {
vec3 worldEndFlashPosition = mat3(gbufferModelViewInverse) * endFlashPosition;
worldEndFlashPosition = normalize(worldEndFlashPosition);
vec3 nViewPosWorld = mat3(gbufferModelViewInverse) * nViewPos;
nViewPosWorld = normalize(nViewPosWorld);
vec3 horizontalEndPos = normalize(vec3(worldEndFlashPosition.x, 0.0, worldEndFlashPosition.z));
vec3 horizontalViewPos = normalize(vec3(nViewPosWorld.x, 0.0, nViewPosWorld.z));
float horizDirFactor = pow(max0(dot(horizontalEndPos, horizontalViewPos)), 0.2);
float dirFactor = pow(max0(dot(worldEndFlashPosition, nViewPosWorld)), 10.0);
float verticalDist = abs(nViewPosWorld.y - worldEndFlashPosition.y);
float verticalFalloff = exp(-pow2(verticalDist * 5.5));
float endFlashFactor = endFlashIntensity * dirFactor * verticalFalloff;
if (endFlashFactor < 0.001) return vec3(0.0);
float time = frameTimeCounter * 0.05;
float pulse = sin(time * 3.0) * 0.5 + 0.5;
vec2 noiseCoord = horizontalViewPos.xz * 0.5 + time * 0.05;
float noise1 = texture2DLod(noisetex, noiseCoord, 0).r;
float noise2 = texture2DLod(noisetex, noiseCoord * 2.7 - time * 0.17, 0).g;
float noise3 = texture2DLod(noisetex, noiseCoord * 0.5 + time * 0.05, 0).b;
float rayFactor = pow(noise1 * noise2, 1.5) * 2.0;
float stripeFactor = pow(horizDirFactor, 2.0 + 4.0 * pulse);
// Inner core and wave animations
float radius = 1.0 + sin(time * 2.0) * 0.1;
float distFromCenter = length(dot(horizontalEndPos, horizontalViewPos));
float waveFront = smoothstep(0.0, 0.2, 1.0 - abs(distFromCenter - radius) * (4.0 + pulse * 4.0));
float core = pow(horizDirFactor, 1.0 + pulse * 2.0) * (1.0 + noise3 * 0.5);
float flashIntensity = mix(core, waveFront, 0.5) * endFlashFactor * (0.6 + rayFactor * 0.8);
flashIntensity *= stripeFactor;
vec3 orangeColor = mix(endOrangeCol, vec3(1.0), 0.3) * (1.2 + noise2 * 1.3);
vec3 finalColor = saturateColors(orangeColor, 0.8) * flashIntensity * 0.7;
return finalColor;
}
@@ -1,63 +1,63 @@
#ifndef ENDCRYSTAL_SAMPLER_DEFINE
uniform isampler2D endcrystal_sampler;
#endif
vec2 RayAABoxIntersection(vec2 start, vec2 dir, vec2 lower, vec2 upper) {
dir += 0.000001 * vec2(equal(dir, vec2(0)));
vec2 front = mix(upper, lower, 0.5 * sign(dir) + 0.5);
vec2 back = mix(lower, upper, 0.5 * sign(dir) + 0.5);
vec2 front_iscts = (front - start) / dir;
vec2 back_iscts = (back - start) / dir;
float front_isct = max(front_iscts.x, front_iscts.y);
float back_isct = min(back_iscts.x , back_iscts.y );
return front_isct < back_isct ? vec2(front_isct, back_isct) : vec2(-1);
}
vec4 GetEndPortalBeamNoise(vec3 relPos) {
float colMixFactor = texture2DLod(noisetex, (relPos.xz + 0.1 * frameTimeCounter * vec2(-0.5, 1.5)) * 10.0 / noiseTextureResolution, 0.0).r;
float strengthMul = texture2DLod(noisetex, (relPos.xz + 0.1 * frameTimeCounter * vec2(1.5, -1.0)) * 5.0 / noiseTextureResolution + 0.2, 0.0).r;
colMixFactor = pow2(pow2(colMixFactor));
strengthMul = pow2(strengthMul);
vec3 col = mix(vec3(0.1137, 0.5569, 0.5255), vec3(0.3725, 0.8863, 0.749), colMixFactor);
float strength
= float(relPos.y > 0 && relPos.y < 2)
* (2 - relPos.y)
/ (3 * relPos.y*relPos.y*relPos.y + 1)
* (strengthMul + 0.5);
return pow2(vec4(col, 1) * strength);
}
vec4 GetEndPortalBeam(vec3 start, vec3 dir) {
if (texelFetch(endcrystal_sampler, ivec2(35, 4), 0).r == 1) {
ivec4 rawPortalPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(35, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 8), 0).r
);
if (rawPortalPos.w > 0) {
vec3 portalPos = floor(vec3(rawPortalPos.xyz) / max(1, rawPortalPos.w) + 0.5) + 0.5 - cameraPositionFract;
vec2 iscts = RayAABoxIntersection(start.xz, dir.xz, portalPos.xz - 1.49, portalPos.xz + 1.49);
int validIsctCount = 0;
vec3[2] isctPositions;
for (int k = 0; k < 2; k++) {
if (iscts[k] > 0.0 && iscts[k] < 1.0) {
isctPositions[validIsctCount++] = start + iscts[k] * dir;
}
}
vec4 col = vec4(0.0);
for (int k = 0; k < validIsctCount; k++) {
col += GetEndPortalBeamNoise(isctPositions[k] - portalPos);
}
vec3 absDir = abs(dir);
float maxDir = max(absDir.x, max(absDir.y, absDir.z));
float transition = 1.0 - pow3(min1(maxDir / mix(40, 10, maxBlindnessDarkness) * 2.0)); // fade to 0 when close to the range limit (32 blocks)
col *= transition;
return col;
}
}
return vec4(0.0);
}
#ifndef ENDCRYSTAL_SAMPLER_DEFINE
uniform isampler2D endcrystal_sampler;
#endif
vec2 RayAABoxIntersection(vec2 start, vec2 dir, vec2 lower, vec2 upper) {
dir += 0.000001 * vec2(equal(dir, vec2(0)));
vec2 front = mix(upper, lower, 0.5 * sign(dir) + 0.5);
vec2 back = mix(lower, upper, 0.5 * sign(dir) + 0.5);
vec2 front_iscts = (front - start) / dir;
vec2 back_iscts = (back - start) / dir;
float front_isct = max(front_iscts.x, front_iscts.y);
float back_isct = min(back_iscts.x , back_iscts.y );
return front_isct < back_isct ? vec2(front_isct, back_isct) : vec2(-1);
}
vec4 GetEndPortalBeamNoise(vec3 relPos) {
float colMixFactor = texture2DLod(noisetex, (relPos.xz + 0.1 * frameTimeCounter * vec2(-0.5, 1.5)) * 10.0 / noiseTextureResolution, 0.0).r;
float strengthMul = texture2DLod(noisetex, (relPos.xz + 0.1 * frameTimeCounter * vec2(1.5, -1.0)) * 5.0 / noiseTextureResolution + 0.2, 0.0).r;
colMixFactor = pow2(pow2(colMixFactor));
strengthMul = pow2(strengthMul);
vec3 col = mix(vec3(0.1137, 0.5569, 0.5255), vec3(0.3725, 0.8863, 0.749), colMixFactor);
float strength
= float(relPos.y > 0 && relPos.y < 2)
* (2 - relPos.y)
/ (3 * relPos.y*relPos.y*relPos.y + 1)
* (strengthMul + 0.5);
return pow2(vec4(col, 1) * strength);
}
vec4 GetEndPortalBeam(vec3 start, vec3 dir) {
if (texelFetch(endcrystal_sampler, ivec2(35, 4), 0).r == 1) {
ivec4 rawPortalPos = ivec4(
texelFetch(endcrystal_sampler, ivec2(35, 5), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 6), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 7), 0).r,
texelFetch(endcrystal_sampler, ivec2(35, 8), 0).r
);
if (rawPortalPos.w > 0) {
vec3 portalPos = floor(vec3(rawPortalPos.xyz) / max(1, rawPortalPos.w) + 0.5) + 0.5 - cameraPositionFract;
vec2 iscts = RayAABoxIntersection(start.xz, dir.xz, portalPos.xz - 1.49, portalPos.xz + 1.49);
int validIsctCount = 0;
vec3[2] isctPositions;
for (int k = 0; k < 2; k++) {
if (iscts[k] > 0.0 && iscts[k] < 1.0) {
isctPositions[validIsctCount++] = start + iscts[k] * dir;
}
}
vec4 col = vec4(0.0);
for (int k = 0; k < validIsctCount; k++) {
col += GetEndPortalBeamNoise(isctPositions[k] - portalPos);
}
vec3 absDir = abs(dir);
float maxDir = max(absDir.x, max(absDir.y, absDir.z));
float transition = 1.0 - pow3(min1(maxDir / mix(40, 10, maxBlindnessDarkness) * 2.0)); // fade to 0 when close to the range limit (32 blocks)
col *= transition;
return col;
}
}
return vec4(0.0);
}
@@ -1,88 +1,88 @@
#ifndef INCLUDE_ENDER_BEAMS
#define INCLUDE_ENDER_BEAMS
#include "/lib/colors/lightAndAmbientColors.glsl"
vec2 wind = vec2(syncedTime * 0.00);
float BeamNoise(vec2 planeCoord, vec2 wind) {
float noise = texture2DLod(noisetex, planeCoord * 0.175 - wind * 0.0625, 0.0).b;
noise+= texture2DLod(noisetex, planeCoord * 0.04375 + wind * 0.0375, 0.0).b * 5.0;
return noise;
}
vec3 DrawEnderBeams(float VdotU, vec3 playerPos, vec3 nViewPos) {
int sampleCount = 8;
float beamMult = 1.0;
float beamPow = 3.0;
float beamPurpleReducer = vlFactor;
float beamOrangeIncreaser = vlFactor;
float VdotUM = 1.0 - pow2(VdotU);
float VdotUM2 = sqrt(VdotUM) + 0.15 * smoothstep1(pow2(pow2(1.0 - abs(VdotU))));
#if defined IS_IRIS && MC_VERSION >= 12109 && EP_END_FLASH % 2 == 0
vec3 worldEndFlashPosition = mat3(gbufferModelViewInverse) * endFlashPosition;
worldEndFlashPosition = normalize(vec3(worldEndFlashPosition.x, 0.0, worldEndFlashPosition.z));
vec3 nViewPosWorld = mat3(gbufferModelViewInverse) * nViewPos;
vec3 nViewPosWorldM = normalize(vec3(nViewPosWorld.x, 0.0, nViewPosWorld.z));
float endFlashDirectionFactor = pow(max0(dot(worldEndFlashPosition, nViewPosWorldM)), 12.0);
float endFlashFactor = endFlashIntensity * endFlashDirectionFactor;
beamOrangeIncreaser = mix(beamOrangeIncreaser, 1.0, endFlashFactor);
beamPurpleReducer = mix(beamPurpleReducer, 1.6, endFlashFactor);
beamPow = mix(beamPow, 0.7, endFlashFactor * (pow(VdotUM, 8.0) * 0.75 + 0.25 * pow(1.0 - abs(VdotU) * 0.1 - 0.9 * pow2(VdotU), 30.0)));
//beamPow = max(beamPow, 0.0001); // fix NaNs
VdotUM = mix(VdotUM, sqrt2(VdotUM), endFlashFactor);
#endif
vec3 beamPurple = normalize(endColorBeam * endColorBeam * endColorBeam) * (2.5 - beamPurpleReducer) * E_BEAM_I;
vec3 beamOrange = endOrangeCol * (300.0 + 700.0 * beamOrangeIncreaser);
vec4 beams = vec4(0.0);
float gradientMix = 1.0;
for (int i = 0; i < sampleCount; i++) {
vec2 planeCoord = playerPos.xz + cameraPosition.xz;
planeCoord *= (1.0 + i * 6.0 / sampleCount) * 0.0014;
float noise = BeamNoise(planeCoord, wind);
#ifndef BEAMS_NEAR_PLAYER
noise = max(0.75 - 1.0 / abs(noise - (4.0 + VdotUM * 2.0)), 0.0) * 3.0;
#else
noise = max(0.75 - 1.0 / abs(noise - (4.0 + dot(upVec, upVec) * 2.0)), 0.0) * 3.0;
#endif
if (noise > 0.0) {
noise *= 0.65;
float fireNoise = texture2DLod(noisetex, abs(planeCoord * 0.2) - wind, 0.0).b;
noise *= 0.5 * fireNoise + 0.75;
//noise = max0(noise); // fix NaNs
noise = pow(noise, 1.75) * 2.9 / sampleCount;
#ifndef BEAMS_NEAR_PLAYER
noise *= VdotUM2;
#endif
vec3 beamColor = beamPurple;
beamColor += beamOrange * pow2(pow2(fireNoise - 0.5));
beamColor *= gradientMix / sampleCount;
noise *= exp2(-6.0 * i / float(sampleCount));
beams += vec4(noise * beamColor, noise);
}
gradientMix += 1.0;
}
#ifdef RAIN_ATMOSPHERE
beams.rgb += 0.2 * isLightningActive();
#endif
beamMult *= pow(beams.a, beamPow) * 3.5;
beams.rgb = sqrt(beams.rgb) * beamMult;
if(any(isnan(beams.rgb))) beams.rgb = vec3(0.0);
return beams.rgb;
}
#endif //INCLUDE_ENDER_BEAMS
#ifndef INCLUDE_ENDER_BEAMS
#define INCLUDE_ENDER_BEAMS
#include "/lib/colors/lightAndAmbientColors.glsl"
vec2 wind = vec2(syncedTime * 0.00);
float BeamNoise(vec2 planeCoord, vec2 wind) {
float noise = texture2DLod(noisetex, planeCoord * 0.175 - wind * 0.0625, 0.0).b;
noise+= texture2DLod(noisetex, planeCoord * 0.04375 + wind * 0.0375, 0.0).b * 5.0;
return noise;
}
vec3 DrawEnderBeams(float VdotU, vec3 playerPos, vec3 nViewPos) {
int sampleCount = 8;
float beamMult = 1.0;
float beamPow = 3.0;
float beamPurpleReducer = vlFactor;
float beamOrangeIncreaser = vlFactor;
float VdotUM = 1.0 - pow2(VdotU);
float VdotUM2 = sqrt(VdotUM) + 0.15 * smoothstep1(pow2(pow2(1.0 - abs(VdotU))));
#if defined IS_IRIS && MC_VERSION >= 12109 && EP_END_FLASH % 2 == 0
vec3 worldEndFlashPosition = mat3(gbufferModelViewInverse) * endFlashPosition;
worldEndFlashPosition = normalize(vec3(worldEndFlashPosition.x, 0.0, worldEndFlashPosition.z));
vec3 nViewPosWorld = mat3(gbufferModelViewInverse) * nViewPos;
vec3 nViewPosWorldM = normalize(vec3(nViewPosWorld.x, 0.0, nViewPosWorld.z));
float endFlashDirectionFactor = pow(max0(dot(worldEndFlashPosition, nViewPosWorldM)), 12.0);
float endFlashFactor = endFlashIntensity * endFlashDirectionFactor;
beamOrangeIncreaser = mix(beamOrangeIncreaser, 1.0, endFlashFactor);
beamPurpleReducer = mix(beamPurpleReducer, 1.6, endFlashFactor);
beamPow = mix(beamPow, 0.7, endFlashFactor * (pow(VdotUM, 8.0) * 0.75 + 0.25 * pow(1.0 - abs(VdotU) * 0.1 - 0.9 * pow2(VdotU), 30.0)));
//beamPow = max(beamPow, 0.0001); // fix NaNs
VdotUM = mix(VdotUM, sqrt2(VdotUM), endFlashFactor);
#endif
vec3 beamPurple = normalize(endColorBeam * endColorBeam * endColorBeam) * (2.5 - beamPurpleReducer) * E_BEAM_I;
vec3 beamOrange = endOrangeCol * (300.0 + 700.0 * beamOrangeIncreaser);
vec4 beams = vec4(0.0);
float gradientMix = 1.0;
for (int i = 0; i < sampleCount; i++) {
vec2 planeCoord = playerPos.xz + cameraPosition.xz;
planeCoord *= (1.0 + i * 6.0 / sampleCount) * 0.0014;
float noise = BeamNoise(planeCoord, wind);
#ifndef BEAMS_NEAR_PLAYER
noise = max(0.75 - 1.0 / abs(noise - (4.0 + VdotUM * 2.0)), 0.0) * 3.0;
#else
noise = max(0.75 - 1.0 / abs(noise - (4.0 + dot(upVec, upVec) * 2.0)), 0.0) * 3.0;
#endif
if (noise > 0.0) {
noise *= 0.65;
float fireNoise = texture2DLod(noisetex, abs(planeCoord * 0.2) - wind, 0.0).b;
noise *= 0.5 * fireNoise + 0.75;
//noise = max0(noise); // fix NaNs
noise = pow(noise, 1.75) * 2.9 / sampleCount;
#ifndef BEAMS_NEAR_PLAYER
noise *= VdotUM2;
#endif
vec3 beamColor = beamPurple;
beamColor += beamOrange * pow2(pow2(fireNoise - 0.5));
beamColor *= gradientMix / sampleCount;
noise *= exp2(-6.0 * i / float(sampleCount));
beams += vec4(noise * beamColor, noise);
}
gradientMix += 1.0;
}
#ifdef RAIN_ATMOSPHERE
beams.rgb += 0.2 * isLightningActive();
#endif
beamMult *= pow(beams.a, beamPow) * 3.5;
beams.rgb = sqrt(beams.rgb) * beamMult;
if(any(isnan(beams.rgb))) beams.rgb = vec3(0.0);
return beams.rgb;
}
#endif //INCLUDE_ENDER_BEAMS
@@ -1,48 +1,48 @@
#include "/lib/shaderSettings/enderStars.glsl"
vec3 GetEnderStars(vec3 viewPos, float VdotU, float sizeMult, float starAmount) {
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos * 1000.0, 1.0)).xyz);
vec3 starCoord = 0.65 * wpos / (abs(wpos.y) + length(wpos.xz));
vec2 starCoord2 = starCoord.xz * 0.5 / (END_STAR_SIZE * sizeMult);
starCoord2 += VdotU < 0.0 ? 100.0 : 0.0;
const float starFactor = 1024.0;
vec2 fractPart = fract(starCoord2 * starFactor);
starCoord2 = floor(starCoord2 * starFactor) / starFactor;
float star = GetStarNoise(starCoord2.xy) * GetStarNoise(starCoord2.xy+0.1) * GetStarNoise(starCoord2.xy+0.23);
#if END_STAR_AMOUNT == 0
star = max0(star - 0.77);
#elif END_STAR_AMOUNT == 2
star = max0((star + 0.15) * 0.9 - 0.7);
#elif END_STAR_AMOUNT == 3
star = max0((star + 0.4) * 0.8 - 0.7);
#elif END_STAR_AMOUNT == 4
star = max0((star + 0.5) * 0.8 - 0.7);
#else
star = max0(star - 0.7);
#endif
star *= getStarEdgeFactor(fractPart, STAR_ROUNDNESS_END / 10.0, STAR_SOFTNESS_END);
star = max0(star - starAmount * 0.1);
star *= star;
vec3 starColor = GetStarColor(starCoord2,
endSkyColor,
vec3(STAR_COLOR_1_END_R, STAR_COLOR_1_END_G, STAR_COLOR_1_END_B),
vec3(STAR_COLOR_2_END_R, STAR_COLOR_2_END_G, STAR_COLOR_2_END_B),
vec3(STAR_COLOR_3_END_R, STAR_COLOR_3_END_G, STAR_COLOR_3_END_B),
float(STAR_COLOR_VARIATION_END));
vec3 enderStars = star * starColor * 3000.0 * END_STAR_BRIGHTNESS;
float VdotUM1 = abs(VdotU);
float VdotUM2 = pow2(1.0 - VdotUM1);
enderStars *= VdotUM1 * VdotUM1 * (VdotUM2 + 0.015) + 0.015;
#if END_TWINKLING_STARS > 0
enderStars *= getTwinklingStars(starCoord2, float(END_TWINKLING_STARS));
#endif
return enderStars;
}
#include "/lib/shaderSettings/enderStars.glsl"
vec3 GetEnderStars(vec3 viewPos, float VdotU, float sizeMult, float starAmount) {
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos * 1000.0, 1.0)).xyz);
vec3 starCoord = 0.65 * wpos / (abs(wpos.y) + length(wpos.xz));
vec2 starCoord2 = starCoord.xz * 0.5 / (END_STAR_SIZE * sizeMult);
starCoord2 += VdotU < 0.0 ? 100.0 : 0.0;
const float starFactor = 1024.0;
vec2 fractPart = fract(starCoord2 * starFactor);
starCoord2 = floor(starCoord2 * starFactor) / starFactor;
float star = GetStarNoise(starCoord2.xy) * GetStarNoise(starCoord2.xy+0.1) * GetStarNoise(starCoord2.xy+0.23);
#if END_STAR_AMOUNT == 0
star = max0(star - 0.77);
#elif END_STAR_AMOUNT == 2
star = max0((star + 0.15) * 0.9 - 0.7);
#elif END_STAR_AMOUNT == 3
star = max0((star + 0.4) * 0.8 - 0.7);
#elif END_STAR_AMOUNT == 4
star = max0((star + 0.5) * 0.8 - 0.7);
#else
star = max0(star - 0.7);
#endif
star *= getStarEdgeFactor(fractPart, STAR_ROUNDNESS_END / 10.0, STAR_SOFTNESS_END);
star = max0(star - starAmount * 0.1);
star *= star;
vec3 starColor = GetStarColor(starCoord2,
endSkyColor,
vec3(STAR_COLOR_1_END_R, STAR_COLOR_1_END_G, STAR_COLOR_1_END_B),
vec3(STAR_COLOR_2_END_R, STAR_COLOR_2_END_G, STAR_COLOR_2_END_B),
vec3(STAR_COLOR_3_END_R, STAR_COLOR_3_END_G, STAR_COLOR_3_END_B),
float(STAR_COLOR_VARIATION_END));
vec3 enderStars = star * starColor * 3000.0 * END_STAR_BRIGHTNESS;
float VdotUM1 = abs(VdotU);
float VdotUM2 = pow2(1.0 - VdotUM1);
enderStars *= VdotUM1 * VdotUM1 * (VdotUM2 + 0.015) + 0.015;
#if END_TWINKLING_STARS > 0
enderStars *= getTwinklingStars(starCoord2, float(END_TWINKLING_STARS));
#endif
return enderStars;
}
@@ -1,46 +1,46 @@
#include "/lib/shaderSettings/bloom.glsl"
#ifdef CAVE_FOG
#include "/lib/atmospherics/fog/caveFactor.glsl"
#endif
const float rainBloomAdd = 8.0;
const float nightBloomAdd = 3.0;
const float caveBloomAdd = 14.0;
const float waterBloomAdd = 14.0;
#ifdef BORDER_FOG
const float netherBloomAdd = 14.0;
#else
const float netherBloomAdd = 3.0;
#endif
float GetBloomFog(float lViewPos) {
#ifdef OVERWORLD
float bloomFog = pow2(pow2(1.0 - exp(-lViewPos * (0.02 + 0.04 * float(isEyeInWater == 1)))));
float bloomFogMult;
if (isEyeInWater != 1) {
bloomFogMult = (rainFactor2 * rainBloomAdd + nightBloomAdd * (1.0 - sunFactor)) * eyeBrightnessM;
#ifdef CAVE_FOG
bloomFogMult += GetCaveFactor() * caveBloomAdd;
#endif
} else {
bloomFogMult = waterBloomAdd;
}
#elif defined NETHER
float farM = min(renderDistance, NETHER_VIEW_LIMIT); // consistency9023HFUE85JG
float bloomFog = lViewPos / clamp(farM, 96.0, 256.0);
bloomFog *= bloomFog * bloomFog;
bloomFog = 1.0 - exp(-8.0 * bloomFog);
bloomFog *= float(isEyeInWater == 0);
float bloomFogMult = netherBloomAdd;
#else
float bloomFog = 0.0;
float bloomFogMult = 0.0;
#endif
bloomFogMult *= BLOOM_STRENGTH * 8.33333;
return 1.0 + bloomFog * bloomFogMult;
}
#include "/lib/shaderSettings/bloom.glsl"
#ifdef CAVE_FOG
#include "/lib/atmospherics/fog/caveFactor.glsl"
#endif
const float rainBloomAdd = 8.0;
const float nightBloomAdd = 3.0;
const float caveBloomAdd = 14.0;
const float waterBloomAdd = 14.0;
#ifdef BORDER_FOG
const float netherBloomAdd = 14.0;
#else
const float netherBloomAdd = 3.0;
#endif
float GetBloomFog(float lViewPos) {
#ifdef OVERWORLD
float bloomFog = pow2(pow2(1.0 - exp(-lViewPos * (0.02 + 0.04 * float(isEyeInWater == 1)))));
float bloomFogMult;
if (isEyeInWater != 1) {
bloomFogMult = (rainFactor2 * rainBloomAdd + nightBloomAdd * (1.0 - sunFactor)) * eyeBrightnessM;
#ifdef CAVE_FOG
bloomFogMult += GetCaveFactor() * caveBloomAdd;
#endif
} else {
bloomFogMult = waterBloomAdd;
}
#elif defined NETHER
float farM = min(renderDistance, NETHER_VIEW_LIMIT); // consistency9023HFUE85JG
float bloomFog = lViewPos / clamp(farM, 96.0, 256.0);
bloomFog *= bloomFog * bloomFog;
bloomFog = 1.0 - exp(-8.0 * bloomFog);
bloomFog *= float(isEyeInWater == 0);
float bloomFogMult = netherBloomAdd;
#else
float bloomFog = 0.0;
float bloomFogMult = 0.0;
#endif
bloomFogMult *= BLOOM_STRENGTH * 8.33333;
return 1.0 + bloomFog * bloomFogMult;
}
@@ -1,21 +1,21 @@
#ifndef INCLUDE_CAVE_FACTOR
#define INCLUDE_CAVE_FACTOR
#define CAVE_FOG_R_NEW 0.13 // [0.00 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 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00]
#define CAVE_FOG_G_NEW 0.13 // [0.00 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 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00]
#define CAVE_FOG_B_NEW 0.15 // [0.00 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 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00]
#define CAVE_FOG_I 1.00 //[0.20 0.25 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.0]
float GetCaveFactor() {
return clamp(1.0 - cameraPosition.y / oceanAltitude, 0.0, 1.0 - eyeBrightnessM);
}
vec3 caveFogColorRaw = vec3(CAVE_FOG_R_NEW, CAVE_FOG_G_NEW, CAVE_FOG_B_NEW) * CAVE_FOG_I;
#if CAVE_LIGHTING < 100
vec3 caveFogColor = caveFogColorRaw * 0.7;
#elif CAVE_LIGHTING == 100
vec3 caveFogColor = caveFogColorRaw * (0.7 + 0.3 * vsBrightness); // Default
#elif CAVE_LIGHTING > 100
vec3 caveFogColor = caveFogColorRaw;
#endif
#endif
#ifndef INCLUDE_CAVE_FACTOR
#define INCLUDE_CAVE_FACTOR
#define CAVE_FOG_R_NEW 0.13 // [0.00 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 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00]
#define CAVE_FOG_G_NEW 0.13 // [0.00 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 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00]
#define CAVE_FOG_B_NEW 0.15 // [0.00 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 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00]
#define CAVE_FOG_I 1.00 //[0.20 0.25 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.0]
float GetCaveFactor() {
return clamp(1.0 - cameraPosition.y / oceanAltitude, 0.0, 1.0 - eyeBrightnessM);
}
vec3 caveFogColorRaw = vec3(CAVE_FOG_R_NEW, CAVE_FOG_G_NEW, CAVE_FOG_B_NEW) * CAVE_FOG_I;
#if CAVE_LIGHTING < 100
vec3 caveFogColor = caveFogColorRaw * 0.7;
#elif CAVE_LIGHTING == 100
vec3 caveFogColor = caveFogColorRaw * (0.7 + 0.3 * vsBrightness); // Default
#elif CAVE_LIGHTING > 100
vec3 caveFogColor = caveFogColorRaw;
#endif
#endif
@@ -1,78 +1,78 @@
vec3 GetColoredLightFog(vec3 nPlayerPos, vec3 translucentMult, float lViewPos, float lViewPos1, float dither, float vlFactor) {
vec3 lightFog = vec3(0.0);
float stepMult = 8.0;
#ifdef CAVE_SMOKE
float caveFactor = GetCaveFactor() * (1.0 - clamp01(isEyeInWater));
#endif
float maxDist = min(effectiveACTdistance * 0.5, far);
int sampleCount = int(maxDist / stepMult + 0.001);
vec3 traceAdd = nPlayerPos * stepMult;
vec3 tracePos = traceAdd * dither;
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
float lTracePos = length(tracePos);
if (lTracePos > lViewPos1) break;
if (any(greaterThan(abs(tracePos * 2.0), vec3(voxelVolumeSize)))) break;
vec3 voxelPos = SceneToVoxel(tracePos);
voxelPos = clamp01(voxelPos / vec3(voxelVolumeSize));
vec4 lightVolume = GetLightVolume(voxelPos);
vec3 lightSample = lightVolume.rgb;
#if defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900 && defined END_CENTER_LIGHTING_AFFECT_BLOCKLIGHT
vec3 endCenterCol = saturateColors(vec3(END_CENTER_LIGHTING_R, END_CENTER_LIGHTING_G, END_CENTER_LIGHTING_B), 1.1);
vec3 endCenterPos = vec3(0.5, 60.5, 0.5) - (tracePos + cameraPositionBest);
endCenterPos.y *= 0.66; // Make it a pill-shaped point light
float rawDistance = length(endCenterPos);
float endCenterLightDist = exp(-rawDistance * 0.62) * 100;
lightSample = mix(lightSample, clamp01(saturateColors(endCenterCol, 1.3)), clamp01(endCenterLightDist) * (1.0 - vlFactor));
#endif
float lTracePosM = length(
vec3(
tracePos.x,
#if COLORED_LIGHTING_INTERNAL <= 512
tracePos.y * 2.0,
#elif COLORED_LIGHTING_INTERNAL == 768
tracePos.y * 3.0,
#elif COLORED_LIGHTING_INTERNAL == 1024
tracePos.y * 4.0,
#endif
tracePos.z
)
);
lightSample *= max0(1.0 - lTracePosM / maxDist);
lightSample *= pow2(min1(lTracePos * 0.03125));
#ifdef CAVE_SMOKE
if (caveFactor > 0.00001) {
vec3 smokePos = 0.0025 * (tracePos + cameraPosition);
vec3 smokeWind = frameTimeCounter * vec3(0.006, 0.003, 0.0);
float smoke = Noise3D(smokePos + smokeWind)
* Noise3D(smokePos * 3.0 - smokeWind)
* Noise3D(smokePos * 9.0 + smokeWind);
smoke = smoothstep1(smoke);
lightSample *= mix(1.0, smoke * 16.0, caveFactor);
lightSample += caveFogColor * pow2(smoke) * 0.05 * caveFactor;
}
#endif
if (lTracePos > lViewPos) lightSample *= translucentMult;
lightFog += lightSample;
}
#ifdef NETHER
lightFog *= netherColor * 5.0;
#endif
lightFog *= 1.0 - maxBlindnessDarkness;
lightFog = pow(lightFog / sampleCount, vec3(0.25));
return lightFog;
}
vec3 GetColoredLightFog(vec3 nPlayerPos, vec3 translucentMult, float lViewPos, float lViewPos1, float dither, float vlFactor) {
vec3 lightFog = vec3(0.0);
float stepMult = 8.0;
#ifdef CAVE_SMOKE
float caveFactor = GetCaveFactor() * (1.0 - clamp01(isEyeInWater));
#endif
float maxDist = min(effectiveACTdistance * 0.5, far);
int sampleCount = int(maxDist / stepMult + 0.001);
vec3 traceAdd = nPlayerPos * stepMult;
vec3 tracePos = traceAdd * dither;
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
float lTracePos = length(tracePos);
if (lTracePos > lViewPos1) break;
if (any(greaterThan(abs(tracePos * 2.0), vec3(voxelVolumeSize)))) break;
vec3 voxelPos = SceneToVoxel(tracePos);
voxelPos = clamp01(voxelPos / vec3(voxelVolumeSize));
vec4 lightVolume = GetLightVolume(voxelPos);
vec3 lightSample = lightVolume.rgb;
#if defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900 && defined END_CENTER_LIGHTING_AFFECT_BLOCKLIGHT
vec3 endCenterCol = saturateColors(vec3(END_CENTER_LIGHTING_R, END_CENTER_LIGHTING_G, END_CENTER_LIGHTING_B), 1.1);
vec3 endCenterPos = vec3(0.5, 60.5, 0.5) - (tracePos + cameraPositionBest);
endCenterPos.y *= 0.66; // Make it a pill-shaped point light
float rawDistance = length(endCenterPos);
float endCenterLightDist = exp(-rawDistance * 0.62) * 100;
lightSample = mix(lightSample, clamp01(saturateColors(endCenterCol, 1.3)), clamp01(endCenterLightDist) * (1.0 - vlFactor));
#endif
float lTracePosM = length(
vec3(
tracePos.x,
#if COLORED_LIGHTING_INTERNAL <= 512
tracePos.y * 2.0,
#elif COLORED_LIGHTING_INTERNAL == 768
tracePos.y * 3.0,
#elif COLORED_LIGHTING_INTERNAL == 1024
tracePos.y * 4.0,
#endif
tracePos.z
)
);
lightSample *= max0(1.0 - lTracePosM / maxDist);
lightSample *= pow2(min1(lTracePos * 0.03125));
#ifdef CAVE_SMOKE
if (caveFactor > 0.00001) {
vec3 smokePos = 0.0025 * (tracePos + cameraPosition);
vec3 smokeWind = frameTimeCounter * vec3(0.006, 0.003, 0.0);
float smoke = Noise3D(smokePos + smokeWind)
* Noise3D(smokePos * 3.0 - smokeWind)
* Noise3D(smokePos * 9.0 + smokeWind);
smoke = smoothstep1(smoke);
lightSample *= mix(1.0, smoke * 16.0, caveFactor);
lightSample += caveFogColor * pow2(smoke) * 0.05 * caveFactor;
}
#endif
if (lTracePos > lViewPos) lightSample *= translucentMult;
lightFog += lightSample;
}
#ifdef NETHER
lightFog *= netherColor * 5.0;
#endif
lightFog *= 1.0 - maxBlindnessDarkness;
lightFog = pow(lightFog / sampleCount, vec3(0.25));
return lightFog;
}
@@ -1,18 +1,18 @@
#if !defined END_CENTER_FOG
#define END_CENTER_FOG
float doEndCenterFog(vec3 ro, vec3 rayDir, float wsdist, float falloff) { // Thanks to FoZy STYLE
vec3 d = ro - vec3(0.5, 60.5, 0.5); // Light source vector
d.y *= 0.7;
rayDir.y *= 0.7;
float a = falloff * dot(rayDir, rayDir);
float b = 2.0 * falloff * dot(rayDir, d);
float c = 1.0 + falloff * dot(d, d);
float sqrtDiscr = max(0.001, sqrt(4.0 * a * c - b * b));
float upper = (2.0 * a * wsdist + b) / sqrtDiscr;
float lower = b / sqrtDiscr;
return 2.0 * (atan(upper) - atan(lower)) / sqrtDiscr;
}
#endif
#if !defined END_CENTER_FOG
#define END_CENTER_FOG
float doEndCenterFog(vec3 ro, vec3 rayDir, float wsdist, float falloff) { // Thanks to FoZy STYLE
vec3 d = ro - vec3(0.5, 60.5, 0.5); // Light source vector
d.y *= 0.7;
rayDir.y *= 0.7;
float a = falloff * dot(rayDir, rayDir);
float b = 2.0 * falloff * dot(rayDir, d);
float c = 1.0 + falloff * dot(d, d);
float sqrtDiscr = max(0.001, sqrt(4.0 * a * c - b * b));
float upper = (2.0 * a * wsdist + b) / sqrtDiscr;
float lower = b / sqrtDiscr;
return 2.0 * (atan(upper) - atan(lower)) / sqrtDiscr;
}
#endif
@@ -1,277 +1,277 @@
#include "/lib/shaderSettings/mainFog.glsl"
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
#ifdef BORDER_FOG
#ifdef OVERWORLD
#include "/lib/atmospherics/sky.glsl"
#elif defined NETHER || defined END
#include "/lib/colors/skyColors.glsl"
#endif
void DoBorderFog(inout vec4 color, inout float skyFade, float lPos, float VdotU, float VdotS, float dither) {
#ifdef OVERWORLD
float fog = lPos / renderDistance;
fog = pow2(pow2(fog));
#ifndef DISTANT_HORIZONS
fog = pow2(pow2(fog));
#endif
fog = 1.0 - exp(-BORDER_FOG_DISTANCE_OVERWORLD * fog);
#endif
#ifdef NETHER
float farM = min(renderDistance, NETHER_VIEW_LIMIT); // consistency9023HFUE85JG
float fog = lPos / farM;
fog = fog * 0.3 + 0.7 * pow(fog * BORDER_FOG_DISTANCE_NETHER / 3, 256.0 / max(farM, 256.0));
#endif
#ifdef END
float fog = lPos / renderDistance;
fog = pow2(pow2(fog));
fog = 1.0 - exp(-BORDER_FOG_DISTANCE_END * fog);
#endif
#ifdef IRIS_FEATURE_FADE_VARIABLE
#if defined GBUFFERS_WATER || defined DEFERRED1
float chunkFadeM = mix(1.0, chunkFade, pow2(clamp01(lPos * 0.015))); // don't do fade very close to the player
fog = mix(1.0, fog, chunkFadeM);
#endif
#endif
if (fog > 0.0) {
fog = clamp(fog, 0.0, 1.0);
#ifdef OVERWORLD
vec3 fogColorM = GetSky(VdotU, VdotS, dither, true, false);
#define BORDER_FOG_DENSITY BORDER_FOG_DENSITY_OVERWORLD
#elif defined NETHER
vec3 fogColorM = netherColor;
#define BORDER_FOG_DENSITY BORDER_FOG_DENSITY_NETHER
#else
vec3 fogColorM = endSkyColor;
#define BORDER_FOG_DENSITY BORDER_FOG_DENSITY_END
#endif
#ifdef ATM_COLOR_MULTS
fogColorM *= atmColorMult;
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
fogColorM *= moonPhaseInfluence;
#endif
fog *= BORDER_FOG_DENSITY;
color = mix(color, vec4(fogColorM, 0.0), fog);
#ifndef GBUFFERS_WATER
skyFade = fog;
#else
skyFade = fog * (1.0 - isEyeInWater);
#endif
}
}
#endif
#ifdef CAVE_FOG
#include "/lib/atmospherics/fog/caveFactor.glsl"
void DoCaveFog(inout vec4 color, float lViewPos) {
float fog = GetCaveFactor() * (0.9 - 0.9 * exp(- lViewPos * 0.015 * CAVE_FOG_DENSITY));
color = mix(color, vec4(caveFogColor, 0.0), fog);
}
#endif
#ifdef ATMOSPHERIC_FOG
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/colors/skyColors.glsl"
// SRATA: Atm. fog starts reducing above this altitude
// CRFTM: Atm. fog continues reducing for this meters
#ifdef OVERWORLD
#define atmFogSRATA ATM_FOG_ALTITUDE + 0.1
#ifndef DISTANT_HORIZONS
float atmFogCRFTM = 60.0;
#else
float atmFogCRFTM = 90.0;
#endif
vec3 GetAtmFogColor(float altitudeFactorRaw, float VdotS) {
vec3 atmFogColor = vec3(ATMOSPHERIC_FOG_R_NEW, ATMOSPHERIC_FOG_G_NEW, ATMOSPHERIC_FOG_B_NEW) * ATMOSPHERIC_FOG_I;
#ifdef RADIOACTIVE_ATMOSPHERIC_FOG
atmFogColor *= GetLuminance(atmFogColor) * 10;
#endif
float nightFogMult = 2.5 - 0.625 * max(pow2(pow2(altitudeFactorRaw)), rainFactor);
float dayNightFogBlend = pow(invNightFactor, 4.0 - VdotS - 2.5 * sunVisibility2);
return atmFogColor * mix(
nightUpSkyColor * (nightFogMult - dayNightFogBlend * nightFogMult),
dayDownSkyColor * (0.9 + 0.3 * noonFactor),
dayNightFogBlend
);
}
#else
float atmFogSRATA = 55.1;
float atmFogCRFTM = 30.0;
#endif
float GetAtmFogAltitudeFactor(float altitude) {
float altitudeFactor = pow2(1.0 - clamp(altitude - atmFogSRATA, 0.0, atmFogCRFTM) / atmFogCRFTM);
#ifndef LIGHTSHAFTS_ACTIVE
altitudeFactor = mix(altitudeFactor, 1.0, rainFactor * 0.2);
#endif
return altitudeFactor;
}
void DoAtmosphericFog(inout vec4 color, vec3 playerPos, float lViewPos, float VdotS) {
#ifndef DISTANT_HORIZONS
float renDisFactor = min1(192.0 / renderDistance);
#if ATM_FOG_DISTANCE != 100
#define ATM_FOG_DISTANCE_M 100.0 / ATM_FOG_DISTANCE;
renDisFactor *= ATM_FOG_DISTANCE_M;
#endif
float fog = 1.0 - exp(-pow(lViewPos * (0.001 - 0.0007 * rainFactor), 2.0 - rainFactor2) * lViewPos * renDisFactor);
#else
float fog = pow2(1.0 - exp(-max0(lViewPos - 40.0) * (0.7 + 0.7 * rainFactor) / ATM_FOG_DISTANCE));
#endif
float atmFogA = 1.0;
atmFogA *= ATMOSPHERIC_FOG_DENSITY * ATM_FOG_MULT;
fog *= atmFogA - 0.1 - 0.15 * invRainFactor;
float altitudeFactorRaw = GetAtmFogAltitudeFactor(playerPos.y + cameraPosition.y);
#ifndef DISTANT_HORIZONS
float altitudeFactor = altitudeFactorRaw * 0.9 + 0.1;
#else
float altitudeFactor = altitudeFactorRaw * 0.8 + 0.2;
#endif
#ifdef OVERWORLD
altitudeFactor *= 1.0 - 0.75 * GetAtmFogAltitudeFactor(cameraPosition.y) * invRainFactor;
#if defined SPECIAL_BIOME_WEATHER || RAIN_STYLE == 2
if (isEyeInWater == 0) {
#if RAIN_STYLE == 2
float factor = 1.0;
#else
float factor = max(inSnowy, inDry);
#endif
float fogFactor = 4.0;
#ifdef SPECIAL_BIOME_WEATHER
fogFactor += 2.0 * inDry;
#endif
fogFactor *= 0.5 + 0.5 * sunVisibility;
float fogIntense = pow2(1.0 - exp(-lViewPos * fogFactor / ATM_FOG_DISTANCE));
fog = mix(fog, fogIntense / altitudeFactor, 0.8 * rainFactor * factor);
}
#endif
#ifdef CAVE_FOG
fog *= 0.2 + 0.8 * sqrt2(eyeBrightnessM);
fog *= 1.0 - GetCaveFactor();
#else
fog *= eyeBrightnessM;
#endif
#else
fog *= 0.5;
#endif
fog *= altitudeFactor;
if (fog > 0.0) {
fog = clamp(fog, 0.0, 1.0);
#ifdef OVERWORLD
vec3 fogColorM = GetAtmFogColor(altitudeFactorRaw, VdotS);
#else
vec3 fogColorM = endSkyColor * 1.5;
#endif
#ifdef ATM_COLOR_MULTS
fogColorM *= atmColorMult;
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
fogColorM *= moonPhaseInfluence;
#endif
color = mix(color, vec4(fogColorM, 0.0), fog);
}
}
#endif
#include "/lib/atmospherics/fog/waterFog.glsl"
void DoWaterFog(inout vec4 color, float lViewPos) {
float fog = GetWaterFog(lViewPos);
color = mix(color, vec4(waterFogColor, 0), fog);
}
void DoLavaFog(inout vec4 color, float lViewPos) {
float fog = (lViewPos * 3.0 - gl_Fog.start) * gl_Fog.scale;
#ifdef LESS_LAVA_FOG
fog = sqrt(fog) * 0.4;
#endif
fog = 1.0 - exp(-fog);
fog = clamp(fog, 0.0, 1.0);
color = mix(color, vec4(fogColor * 5.0, 0.0), fog);
}
void DoPowderSnowFog(inout vec4 color, float lViewPos) {
float fog = lViewPos;
#ifdef LESS_LAVA_FOG
fog = sqrt(fog) * 0.4;
#endif
fog *= fog;
fog = 1.0 - exp(-fog);
fog = clamp(fog, 0.0, 1.0);
color = mix(color, vec4(fogColor, 0.0), fog);
}
void DoBlindnessFog(inout vec4 color, float lViewPos) {
float fog = lViewPos * 0.3 * blindness;
fog *= fog;
fog = 1.0 - exp(-fog);
fog = clamp(fog, 0.0, 1.0);
color *= 1.0 - fog;
}
void DoDarknessFog(inout vec4 color, float lViewPos) {
float fog = lViewPos * 0.075 * darknessFactor;
fog *= fog;
fog *= fog;
color *= exp(-fog);
}
void DoFog(inout vec4 color, inout float skyFade, float lViewPos, vec3 playerPos, float VdotU, float VdotS, float dither, bool isReflection, float lBlockPos) {
#ifdef CAVE_FOG
DoCaveFog(color, lViewPos);
#endif
#ifdef ATMOSPHERIC_FOG
float lViewPosAtm = lViewPos;
// Reduce fog if the reflecting block is already behind fog, and fogging the reflection would result in too much fog
if (isReflection) lViewPosAtm *= 0.2 + 0.8 * sqrt1(max0(1.0 - lBlockPos / lViewPos));
DoAtmosphericFog(color, playerPos, lViewPosAtm, VdotS);
#endif
#ifdef BORDER_FOG
DoBorderFog(color, skyFade, max(length(playerPos.xz), abs(playerPos.y)), VdotU, VdotS, dither);
#endif
if (isEyeInWater == 1) DoWaterFog(color, lViewPos);
else if (isEyeInWater == 2) DoLavaFog(color, lViewPos);
else if (isEyeInWater == 3) DoPowderSnowFog(color, lViewPos);
if (blindness > 0.00001) DoBlindnessFog(color, lViewPos);
if (darknessFactor > 0.00001) DoDarknessFog(color, lViewPos);
}
#include "/lib/shaderSettings/mainFog.glsl"
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
#ifdef BORDER_FOG
#ifdef OVERWORLD
#include "/lib/atmospherics/sky.glsl"
#elif defined NETHER || defined END
#include "/lib/colors/skyColors.glsl"
#endif
void DoBorderFog(inout vec4 color, inout float skyFade, float lPos, float VdotU, float VdotS, float dither) {
#ifdef OVERWORLD
float fog = lPos / renderDistance;
fog = pow2(pow2(fog));
#ifndef DISTANT_HORIZONS
fog = pow2(pow2(fog));
#endif
fog = 1.0 - exp(-BORDER_FOG_DISTANCE_OVERWORLD * fog);
#endif
#ifdef NETHER
float farM = min(renderDistance, NETHER_VIEW_LIMIT); // consistency9023HFUE85JG
float fog = lPos / farM;
fog = fog * 0.3 + 0.7 * pow(fog * BORDER_FOG_DISTANCE_NETHER / 3, 256.0 / max(farM, 256.0));
#endif
#ifdef END
float fog = lPos / renderDistance;
fog = pow2(pow2(fog));
fog = 1.0 - exp(-BORDER_FOG_DISTANCE_END * fog);
#endif
#ifdef IRIS_FEATURE_FADE_VARIABLE
#if defined GBUFFERS_WATER || defined DEFERRED1
float chunkFadeM = mix(1.0, chunkFade, pow2(clamp01(lPos * 0.015))); // don't do fade very close to the player
fog = mix(1.0, fog, chunkFadeM);
#endif
#endif
if (fog > 0.0) {
fog = clamp(fog, 0.0, 1.0);
#ifdef OVERWORLD
vec3 fogColorM = GetSky(VdotU, VdotS, dither, true, false);
#define BORDER_FOG_DENSITY BORDER_FOG_DENSITY_OVERWORLD
#elif defined NETHER
vec3 fogColorM = netherColor;
#define BORDER_FOG_DENSITY BORDER_FOG_DENSITY_NETHER
#else
vec3 fogColorM = endSkyColor;
#define BORDER_FOG_DENSITY BORDER_FOG_DENSITY_END
#endif
#ifdef ATM_COLOR_MULTS
fogColorM *= atmColorMult;
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
fogColorM *= moonPhaseInfluence;
#endif
fog *= BORDER_FOG_DENSITY;
color = mix(color, vec4(fogColorM, 0.0), fog);
#ifndef GBUFFERS_WATER
skyFade = fog;
#else
skyFade = fog * (1.0 - isEyeInWater);
#endif
}
}
#endif
#ifdef CAVE_FOG
#include "/lib/atmospherics/fog/caveFactor.glsl"
void DoCaveFog(inout vec4 color, float lViewPos) {
float fog = GetCaveFactor() * (0.9 - 0.9 * exp(- lViewPos * 0.015 * CAVE_FOG_DENSITY));
color = mix(color, vec4(caveFogColor, 0.0), fog);
}
#endif
#ifdef ATMOSPHERIC_FOG
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/colors/skyColors.glsl"
// SRATA: Atm. fog starts reducing above this altitude
// CRFTM: Atm. fog continues reducing for this meters
#ifdef OVERWORLD
#define atmFogSRATA ATM_FOG_ALTITUDE + 0.1
#ifndef DISTANT_HORIZONS
float atmFogCRFTM = 60.0;
#else
float atmFogCRFTM = 90.0;
#endif
vec3 GetAtmFogColor(float altitudeFactorRaw, float VdotS) {
vec3 atmFogColor = vec3(ATMOSPHERIC_FOG_R_NEW, ATMOSPHERIC_FOG_G_NEW, ATMOSPHERIC_FOG_B_NEW) * ATMOSPHERIC_FOG_I;
#ifdef RADIOACTIVE_ATMOSPHERIC_FOG
atmFogColor *= GetLuminance(atmFogColor) * 10;
#endif
float nightFogMult = 2.5 - 0.625 * max(pow2(pow2(altitudeFactorRaw)), rainFactor);
float dayNightFogBlend = pow(invNightFactor, 4.0 - VdotS - 2.5 * sunVisibility2);
return atmFogColor * mix(
nightUpSkyColor * (nightFogMult - dayNightFogBlend * nightFogMult),
dayDownSkyColor * (0.9 + 0.3 * noonFactor),
dayNightFogBlend
);
}
#else
float atmFogSRATA = 55.1;
float atmFogCRFTM = 30.0;
#endif
float GetAtmFogAltitudeFactor(float altitude) {
float altitudeFactor = pow2(1.0 - clamp(altitude - atmFogSRATA, 0.0, atmFogCRFTM) / atmFogCRFTM);
#ifndef LIGHTSHAFTS_ACTIVE
altitudeFactor = mix(altitudeFactor, 1.0, rainFactor * 0.2);
#endif
return altitudeFactor;
}
void DoAtmosphericFog(inout vec4 color, vec3 playerPos, float lViewPos, float VdotS) {
#ifndef DISTANT_HORIZONS
float renDisFactor = min1(192.0 / renderDistance);
#if ATM_FOG_DISTANCE != 100
#define ATM_FOG_DISTANCE_M 100.0 / ATM_FOG_DISTANCE;
renDisFactor *= ATM_FOG_DISTANCE_M;
#endif
float fog = 1.0 - exp(-pow(lViewPos * (0.001 - 0.0007 * rainFactor), 2.0 - rainFactor2) * lViewPos * renDisFactor);
#else
float fog = pow2(1.0 - exp(-max0(lViewPos - 40.0) * (0.7 + 0.7 * rainFactor) / ATM_FOG_DISTANCE));
#endif
float atmFogA = 1.0;
atmFogA *= ATMOSPHERIC_FOG_DENSITY * ATM_FOG_MULT;
fog *= atmFogA - 0.1 - 0.15 * invRainFactor;
float altitudeFactorRaw = GetAtmFogAltitudeFactor(playerPos.y + cameraPosition.y);
#ifndef DISTANT_HORIZONS
float altitudeFactor = altitudeFactorRaw * 0.9 + 0.1;
#else
float altitudeFactor = altitudeFactorRaw * 0.8 + 0.2;
#endif
#ifdef OVERWORLD
altitudeFactor *= 1.0 - 0.75 * GetAtmFogAltitudeFactor(cameraPosition.y) * invRainFactor;
#if defined SPECIAL_BIOME_WEATHER || RAIN_STYLE == 2
if (isEyeInWater == 0) {
#if RAIN_STYLE == 2
float factor = 1.0;
#else
float factor = max(inSnowy, inDry);
#endif
float fogFactor = 4.0;
#ifdef SPECIAL_BIOME_WEATHER
fogFactor += 2.0 * inDry;
#endif
fogFactor *= 0.5 + 0.5 * sunVisibility;
float fogIntense = pow2(1.0 - exp(-lViewPos * fogFactor / ATM_FOG_DISTANCE));
fog = mix(fog, fogIntense / altitudeFactor, 0.8 * rainFactor * factor);
}
#endif
#ifdef CAVE_FOG
fog *= 0.2 + 0.8 * sqrt2(eyeBrightnessM);
fog *= 1.0 - GetCaveFactor();
#else
fog *= eyeBrightnessM;
#endif
#else
fog *= 0.5;
#endif
fog *= altitudeFactor;
if (fog > 0.0) {
fog = clamp(fog, 0.0, 1.0);
#ifdef OVERWORLD
vec3 fogColorM = GetAtmFogColor(altitudeFactorRaw, VdotS);
#else
vec3 fogColorM = endSkyColor * 1.5;
#endif
#ifdef ATM_COLOR_MULTS
fogColorM *= atmColorMult;
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
fogColorM *= moonPhaseInfluence;
#endif
color = mix(color, vec4(fogColorM, 0.0), fog);
}
}
#endif
#include "/lib/atmospherics/fog/waterFog.glsl"
void DoWaterFog(inout vec4 color, float lViewPos) {
float fog = GetWaterFog(lViewPos);
color = mix(color, vec4(waterFogColor, 0), fog);
}
void DoLavaFog(inout vec4 color, float lViewPos) {
float fog = (lViewPos * 3.0 - gl_Fog.start) * gl_Fog.scale;
#ifdef LESS_LAVA_FOG
fog = sqrt(fog) * 0.4;
#endif
fog = 1.0 - exp(-fog);
fog = clamp(fog, 0.0, 1.0);
color = mix(color, vec4(fogColor * 5.0, 0.0), fog);
}
void DoPowderSnowFog(inout vec4 color, float lViewPos) {
float fog = lViewPos;
#ifdef LESS_LAVA_FOG
fog = sqrt(fog) * 0.4;
#endif
fog *= fog;
fog = 1.0 - exp(-fog);
fog = clamp(fog, 0.0, 1.0);
color = mix(color, vec4(fogColor, 0.0), fog);
}
void DoBlindnessFog(inout vec4 color, float lViewPos) {
float fog = lViewPos * 0.3 * blindness;
fog *= fog;
fog = 1.0 - exp(-fog);
fog = clamp(fog, 0.0, 1.0);
color *= 1.0 - fog;
}
void DoDarknessFog(inout vec4 color, float lViewPos) {
float fog = lViewPos * 0.075 * darknessFactor;
fog *= fog;
fog *= fog;
color *= exp(-fog);
}
void DoFog(inout vec4 color, inout float skyFade, float lViewPos, vec3 playerPos, float VdotU, float VdotS, float dither, bool isReflection, float lBlockPos) {
#ifdef CAVE_FOG
DoCaveFog(color, lViewPos);
#endif
#ifdef ATMOSPHERIC_FOG
float lViewPosAtm = lViewPos;
// Reduce fog if the reflecting block is already behind fog, and fogging the reflection would result in too much fog
if (isReflection) lViewPosAtm *= 0.2 + 0.8 * sqrt1(max0(1.0 - lBlockPos / lViewPos));
DoAtmosphericFog(color, playerPos, lViewPosAtm, VdotS);
#endif
#ifdef BORDER_FOG
DoBorderFog(color, skyFade, max(length(playerPos.xz), abs(playerPos.y)), VdotU, VdotS, dither);
#endif
if (isEyeInWater == 1) DoWaterFog(color, lViewPos);
else if (isEyeInWater == 2) DoLavaFog(color, lViewPos);
else if (isEyeInWater == 3) DoPowderSnowFog(color, lViewPos);
if (blindness > 0.00001) DoBlindnessFog(color, lViewPos);
if (darknessFactor > 0.00001) DoDarknessFog(color, lViewPos);
}
@@ -1,19 +1,19 @@
#ifndef INCLUDE_WATER_FOG
#define INCLUDE_WATER_FOG
float GetWaterFog(float lViewPos) {
#if WATER_FOG_MULT != 100
#define WATER_FOG_MULT_M WATER_FOG_MULT * 0.01;
lViewPos *= WATER_FOG_MULT_M;
#endif
#if LIGHTSHAFT_QUALI > 0 && SHADOW_QUALITY > -1
float fog = lViewPos / 48.0;
fog *= fog;
#else
float fog = lViewPos / 32.0;
#endif
return 1.0 - exp(-fog);
}
#endif
#ifndef INCLUDE_WATER_FOG
#define INCLUDE_WATER_FOG
float GetWaterFog(float lViewPos) {
#if WATER_FOG_MULT != 100
#define WATER_FOG_MULT_M WATER_FOG_MULT * 0.01;
lViewPos *= WATER_FOG_MULT_M;
#endif
#if LIGHTSHAFT_QUALI > 0 && SHADOW_QUALITY > -1
float fog = lViewPos / 48.0;
fog *= fog;
#else
float fog = lViewPos / 32.0;
#endif
return 1.0 - exp(-fog);
}
#endif
@@ -1,43 +1,43 @@
vec3 GetNetherNoise(vec3 viewPos, float VdotU, float dither) {
float visibility = clamp01(VdotU * 1.875 - 0.225);
visibility *= 1.0 - VdotU * 0.75 - maxBlindnessDarkness;
if (visibility > 0.0) {
vec3 spots = vec3(0.0);
float eyeAltitude1 = eyeAltitude * 0.005;
float noiseHeightFactor = max(0.0, 1.5 - eyeAltitude1 / (eyeAltitude1 + 1.0));
noiseHeightFactor *= noiseHeightFactor;
float noiseHeight = noiseHeightFactor * 0.5;
vec3 wpos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
wpos.xz /= wpos.y;
vec2 cameraPositionM = cameraPosition.xz * 0.0075;
cameraPositionM.x += frameTimeCounter * 0.004;
int sampleCount = 10;
int sampleCountP = sampleCount + 5;
float ditherM = dither + 5.0;
float wind = fract(frameTimeCounter * 0.0125);
for (int i = 0; i < sampleCount; i++) {
float current = pow2((i + ditherM) / sampleCountP);
vec2 planePos = wpos.xz * (0.8 + current) * noiseHeight;
planePos = (planePos * 0.5 + cameraPositionM * 0.5) * 1.5;
float noiseSpots = texture2DLod(noisetex, planePos * 0.5, 0.0).g;
vec3 noise = texture2DLod(noisetex, vec2(noiseSpots) + wind, 0.0).g * netherColor * 2.5 - netherColor * 1.3;
float currentM = 1.0 - current;
spots += noise * currentM * 6.0;
}
#ifdef RAIN_ATMOSPHERE
spots += 2.0 * isLightningActive();
#endif
return spots * visibility / sampleCount;
}
return vec3(0.0);
}
vec3 GetNetherNoise(vec3 viewPos, float VdotU, float dither) {
float visibility = clamp01(VdotU * 1.875 - 0.225);
visibility *= 1.0 - VdotU * 0.75 - maxBlindnessDarkness;
if (visibility > 0.0) {
vec3 spots = vec3(0.0);
float eyeAltitude1 = eyeAltitude * 0.005;
float noiseHeightFactor = max(0.0, 1.5 - eyeAltitude1 / (eyeAltitude1 + 1.0));
noiseHeightFactor *= noiseHeightFactor;
float noiseHeight = noiseHeightFactor * 0.5;
vec3 wpos = (gbufferModelViewInverse * vec4(viewPos, 1.0)).xyz;
wpos.xz /= wpos.y;
vec2 cameraPositionM = cameraPosition.xz * 0.0075;
cameraPositionM.x += frameTimeCounter * 0.004;
int sampleCount = 10;
int sampleCountP = sampleCount + 5;
float ditherM = dither + 5.0;
float wind = fract(frameTimeCounter * 0.0125);
for (int i = 0; i < sampleCount; i++) {
float current = pow2((i + ditherM) / sampleCountP);
vec2 planePos = wpos.xz * (0.8 + current) * noiseHeight;
planePos = (planePos * 0.5 + cameraPositionM * 0.5) * 1.5;
float noiseSpots = texture2DLod(noisetex, planePos * 0.5, 0.0).g;
vec3 noise = texture2DLod(noisetex, vec2(noiseSpots) + wind, 0.0).g * netherColor * 2.5 - netherColor * 1.3;
float currentM = 1.0 - current;
spots += noise * currentM * 6.0;
}
#ifdef RAIN_ATMOSPHERE
spots += 2.0 * isLightningActive();
#endif
return spots * visibility / sampleCount;
}
return vec3(0.0);
}
@@ -1,78 +1,78 @@
vec4 GetNetherStorm(vec3 color, vec3 translucentMult, vec3 nPlayerPos, vec3 playerPos, float lViewPos, float lViewPos1, float dither) {
if (isEyeInWater != 0) return vec4(0.0);
vec4 netherStorm = vec4(1.0, 1.0, 1.0, 0.0);
#ifdef BORDER_FOG
float maxDist = min(renderDistance, NETHER_VIEW_LIMIT); // consistency9023HFUE85JG
#else
float maxDist = renderDistance;
#endif
#ifndef LOW_QUALITY_NETHER_STORM
int sampleCount = int(maxDist / 8.0 + 0.001);
vec3 traceAdd = nPlayerPos * maxDist / sampleCount;
vec3 tracePos = cameraPosition;
tracePos += traceAdd * dither;
#else
int sampleCount = int(maxDist / 16.0 + 0.001);
vec3 traceAdd = 0.75 * nPlayerPos * maxDist / sampleCount;
vec3 tracePos = cameraPosition;
tracePos += traceAdd * dither;
tracePos += traceAdd * sampleCount * 0.25;
#endif
vec3 translucentMultM = pow(translucentMult, vec3(1.0 / sampleCount));
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
vec3 tracedPlayerPos = tracePos - cameraPosition;
float lTracePos = length(tracedPlayerPos);
if (lTracePos > lViewPos1) break;
vec3 wind = vec3(frameTimeCounter * 0.002);
vec3 tracePosM = tracePos * 0.001;
tracePosM.y += tracePosM.x;
tracePosM += Noise3D(tracePosM - wind) * 0.01;
tracePosM = tracePosM * vec3(2.0, 0.5, 2.0);
float traceAltitudeM = abs(tracePos.y - NETHER_STORM_LOWER_ALT);
if (tracePos.y < NETHER_STORM_LOWER_ALT) traceAltitudeM *= 10.0;
traceAltitudeM = 1.0 - min1(abs(traceAltitudeM) / NETHER_STORM_HEIGHT);
for (int h = 0; h < 4; h++) {
float stormSample = pow2(Noise3D(tracePosM + wind));
stormSample *= traceAltitudeM;
stormSample = pow2(pow2(stormSample));
stormSample *= sqrt1(max0(1.0 - lTracePos / maxDist));
netherStorm.a += stormSample;
tracePosM *= 2.0;
wind *= -2.0;
}
#ifdef RAIN_ATMOSPHERE
vec3 lightningPos = getLightningPos(tracePos - cameraPosition, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(1.0), 150.0, 0.0, 0) * isLightningActive() * 8.0;
netherStorm.rgb += lightningAdd.y;
#endif
if (lTracePos > lViewPos) netherStorm.rgb *= translucentMultM;
}
#ifdef LOW_QUALITY_NETHER_STORM
netherStorm.a *= 1.8;
#endif
netherStorm.a = min1(netherStorm.a * NETHER_STORM_I);
netherStorm.rgb *= netherColor * 3.0 * (1.0 - maxBlindnessDarkness);
//if (netherStorm.a > 0.98) netherStorm.rgb = vec3(1,0,1);
//netherStorm.a *= 1.0 - max0(netherStorm.a - 0.98) * 50.0;
return netherStorm;
}
vec4 GetNetherStorm(vec3 color, vec3 translucentMult, vec3 nPlayerPos, vec3 playerPos, float lViewPos, float lViewPos1, float dither) {
if (isEyeInWater != 0) return vec4(0.0);
vec4 netherStorm = vec4(1.0, 1.0, 1.0, 0.0);
#ifdef BORDER_FOG
float maxDist = min(renderDistance, NETHER_VIEW_LIMIT); // consistency9023HFUE85JG
#else
float maxDist = renderDistance;
#endif
#ifndef LOW_QUALITY_NETHER_STORM
int sampleCount = int(maxDist / 8.0 + 0.001);
vec3 traceAdd = nPlayerPos * maxDist / sampleCount;
vec3 tracePos = cameraPosition;
tracePos += traceAdd * dither;
#else
int sampleCount = int(maxDist / 16.0 + 0.001);
vec3 traceAdd = 0.75 * nPlayerPos * maxDist / sampleCount;
vec3 tracePos = cameraPosition;
tracePos += traceAdd * dither;
tracePos += traceAdd * sampleCount * 0.25;
#endif
vec3 translucentMultM = pow(translucentMult, vec3(1.0 / sampleCount));
for (int i = 0; i < sampleCount; i++) {
tracePos += traceAdd;
vec3 tracedPlayerPos = tracePos - cameraPosition;
float lTracePos = length(tracedPlayerPos);
if (lTracePos > lViewPos1) break;
vec3 wind = vec3(frameTimeCounter * 0.002);
vec3 tracePosM = tracePos * 0.001;
tracePosM.y += tracePosM.x;
tracePosM += Noise3D(tracePosM - wind) * 0.01;
tracePosM = tracePosM * vec3(2.0, 0.5, 2.0);
float traceAltitudeM = abs(tracePos.y - NETHER_STORM_LOWER_ALT);
if (tracePos.y < NETHER_STORM_LOWER_ALT) traceAltitudeM *= 10.0;
traceAltitudeM = 1.0 - min1(abs(traceAltitudeM) / NETHER_STORM_HEIGHT);
for (int h = 0; h < 4; h++) {
float stormSample = pow2(Noise3D(tracePosM + wind));
stormSample *= traceAltitudeM;
stormSample = pow2(pow2(stormSample));
stormSample *= sqrt1(max0(1.0 - lTracePos / maxDist));
netherStorm.a += stormSample;
tracePosM *= 2.0;
wind *= -2.0;
}
#ifdef RAIN_ATMOSPHERE
vec3 lightningPos = getLightningPos(tracePos - cameraPosition, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(1.0), 150.0, 0.0, 0) * isLightningActive() * 8.0;
netherStorm.rgb += lightningAdd.y;
#endif
if (lTracePos > lViewPos) netherStorm.rgb *= translucentMultM;
}
#ifdef LOW_QUALITY_NETHER_STORM
netherStorm.a *= 1.8;
#endif
netherStorm.a = min1(netherStorm.a * NETHER_STORM_I);
netherStorm.rgb *= netherColor * 3.0 * (1.0 - maxBlindnessDarkness);
//if (netherStorm.a > 0.98) netherStorm.rgb = vec3(1,0,1);
//netherStorm.a *= 1.0 - max0(netherStorm.a - 0.98) * 50.0;
return netherStorm;
}
@@ -1,199 +1,199 @@
#include "/lib/atmospherics/stars.glsl"
// Nebula implementation by flytrap https://godotshaders.com/shader/2d-nebula-shader/
#include "/lib/shaderSettings/stars.glsl"
#include "/lib/shaderSettings/nightNebula.glsl"
#ifndef HQ_NIGHT_NEBULA
const int OCTAVE = 5;
#else
const int OCTAVE = 8;
#endif
const float timescale = 5.0;
const float zoomScale = NEBULA_ZOOM_LEVEL;
const vec4 CLOUD1_COL = vec4(NEBULA_R_1, NEBULA_G_1, NEBULA_B_1, 0.4);
const vec4 CLOUD2_COL = vec4(NEBULA_R_2, NEBULA_G_2, NEBULA_B_2, 0.2);
const vec4 CLOUD3_COL = vec4(NEBULA_R_3, NEBULA_G_3, NEBULA_B_3, 1.0);
float sinM(float x) {
return sin(mod(x, 2.0 * pi));
}
float cosM(float x) {
return cos(mod(x, 2.0 * pi));
}
float rand(vec2 inCoord){
return fract(sinM(dot(inCoord, vec2(23.53, 44.0))) * 42350.45);
}
float perlin(vec2 inCoord){
vec2 i = floor(inCoord);
vec2 j = fract(inCoord);
vec2 coord = smoothstep(0.0, 1.0, j);
float a = rand(i);
float b = rand(i + vec2(1.0, 0.0));
float c = rand(i + vec2(0.0, 1.0));
float d = rand(i + vec2(1.0, 1.0));
return mix(mix(a, b, coord.x), mix(c, d, coord.x), coord.y);
}
float fbmCloud(vec2 inCoord, float minimum){
float value = 0.0;
float scale = NEBULA_AMOUNT * 0.1 + 0.45;
for (int i = 0; i < OCTAVE; i++){
value += perlin(inCoord) * scale;
inCoord *= 2.0;
scale *= 0.5;
}
return smoothstep(0.0, 1.0, (smoothstep(minimum, 1.0, value) - minimum) / (1.0 - minimum));
}
float fbmCloud2(vec2 inCoord, float minimum){
float value = 0.0;
float scale = (NEBULA_AMOUNT + 0.1) * 0.25 + 0.35;
for (int i = 0; i < OCTAVE; i++){
value += perlin(inCoord) * scale;
inCoord *= 2.0;
scale *= 0.5;
}
return (smoothstep(minimum, 1.0, value) - minimum) / (1.0 - minimum);
}
vec2 warpCoords(vec2 coord, float warpAmount) {
float angle = perlin(coord * 0.5) * 6.28318 * warpAmount;
float strength = perlin(coord * 0.7 + 0.5) * warpAmount;
vec2 offset = vec2(cos(angle), sin(angle)) * strength;
return coord + offset;
}
vec3 GetNightNebula(vec3 viewPos, float VdotU, float VdotS) {
float VdotUFactor = max0(VdotU);
float starsAroundSun = 1.0;
#ifdef CELESTIAL_BOTH_HEMISPHERES
VdotUFactor = VdotU;
#ifdef SUN_MOON_HORIZON
starsAroundSun = max0(sign(VdotU));
#endif
#endif
float originalVdotUFactor = VdotUFactor;
float horizonPower = NEBULA_HORIZON_STRENGTH * 0.05 + 0.5;
#if NEBULA_HORIZON_STRENGTH < 10
VdotUFactor = pow(VdotUFactor, horizonPower);
#endif
float nebulaFactor = pow2(VdotUFactor * min1(nightFactor * 2.0));
#if NEBULA_HORIZON_STRENGTH < 10
float brightnessCompensation = 1.0 - (1.0 - horizonPower) * 0.5 * max0(originalVdotUFactor);
nebulaFactor *= brightnessCompensation;
#endif
#ifdef CLEAR_SKY_WHEN_RAINING
nebulaFactor *= min1(invRainFactor + 0.4);
#else
nebulaFactor *= invRainFactor;
#endif
nebulaFactor -= maxBlindnessDarkness;
#if NEBULA_MOON_CONDITION == 1
if (moonPhase != 4) return vec3(0.0);
#elif NEBULA_MOON_CONDITION == 2
if (moonPhase != 0) return vec3(0.0);
#elif NEBULA_MOON_CONDITION == 3
if (moonPhase == 0 || moonPhase == 4) return vec3(0.0);
#elif NEBULA_MOON_CONDITION == 4
nebulaFactor *= step(0.5, hash11(float(worldDay) + float(moonPhase) * 37.0));
#elif NEBULA_MOON_CONDITION == 5
nebulaFactor *= clamp01(max(moonPhase, 1) % 4);
#endif
if (nebulaFactor < 0.001) return vec3(0.0);
vec2 UV = GetStarCoord(viewPos, 0.75);
float TIME = syncedTime * 0.003 + 15.0;
float timescaled = TIME * timescale;
float sinTime = sinM(0.07 * timescaled);
float cosTime06 = cosM(0.06 * timescaled);
float cosTime07 = cosM(0.07 * timescaled);
float tide = 0.05 * sinM(TIME);
float tide2 = 0.06 * cosM(0.3 * TIME);
vec4 nebulaTexture = vec4(vec3(0.0), 0.5 + 0.2 * sinM(0.23 * TIME + UV.x - UV.y));
#if PIXELATED_NEBULA > 0
float pixelFactor = PIXELATED_NEBULA * 2.0;
vec2 baseUV = floor(UV * pixelFactor) / pixelFactor;
#else
vec2 baseUV = UV;
#endif
vec2 scaledUV = baseUV * zoomScale;
vec2 cloudUV2 = vec2(scaledUV.x + 0.03 * timescaled * sinTime, scaledUV.y + 0.03 * timescaled * cosTime06);
vec2 cloudUV3 = vec2(scaledUV.x + 0.027 * timescaled * sinTime, scaledUV.y + 0.025 * timescaled * cosTime06);
vec2 cloudUV4 = vec2(scaledUV.x + 0.021 * timescaled * sinTime, scaledUV.y + 0.021 * timescaled * cosTime07);
#if NEBULA_PATTERN_WARP > 0
cloudUV2 = warpCoords(cloudUV2, NEBULA_PATTERN_WARP * 0.1);
cloudUV3 = warpCoords(cloudUV3, NEBULA_PATTERN_WARP * 0.1);
cloudUV4 = warpCoords(cloudUV4, NEBULA_PATTERN_WARP * 0.1);
#endif
nebulaTexture += fbmCloud2(cloudUV3, 0.24 + tide) * CLOUD1_COL;
nebulaTexture += fbmCloud(cloudUV2 * 0.9, 0.33 - tide) * CLOUD2_COL;
nebulaTexture = mix(nebulaTexture, CLOUD3_COL, fbmCloud(vec2(0.9 * cloudUV4.x, 0.9 * cloudUV4.y), 0.25 + tide2));
nebulaFactor *= 1.0 - pow2(pow2(pow2(abs(VdotS)))) * starsAroundSun;
nebulaTexture.a *= min1(pow2(pow2(nebulaTexture.a))) * nebulaFactor;
float starFactor = 1024.0;
UV /= STAR_SIZE * (0.75 + 0.25 * NEBULA_STAR_SIZE);
vec2 starCoord = floor(UV * 0.25 * starFactor) / starFactor;
vec2 fractPart = fract(UV * 0.25 * starFactor);
float starAmount = (2.0 - NEBULA_STAR_AMOUNT) * 0.1;
float starIntensity = GetStarNoise(starCoord) * GetStarNoise(starCoord + 0.1) - (starAmount + 0.5);
starIntensity *= getStarEdgeFactor(fractPart, STAR_ROUNDNESS_OW / 10.0, STAR_SOFTNESS_OW);
#if TWINKLING_STARS > 0
starIntensity *= getTwinklingStars(starCoord * 4, float(TWINKLING_STARS));
#endif
float starGlow = pow2(clamp(starIntensity, 0.0, 0.3 + starAmount)) * starBrightness * NEBULA_STAR_BRIGHTNESS;
#ifdef NEBULA_ONLY_STARS
nebulaTexture.a = step(0.15, nebulaTexture.a);
nebulaTexture.rgb = vec3(3.0 * starGlow);
#else
nebulaTexture.rgb *= 1.5 + 10.0 * starGlow;
#endif
#if NIGHT_NEBULA_I != 100
#define NIGHT_NEBULA_IM NIGHT_NEBULA_I * 0.01
nebulaTexture.a *= NIGHT_NEBULA_IM;
#endif
#if NEBULA_SATURATION != 10
nebulaTexture.rgb = rgb2hsv(nebulaTexture.rgb);
nebulaTexture.g *= NEBULA_SATURATION * 0.1;
nebulaTexture.rgb = hsv2rgb(nebulaTexture.rgb);
#endif
#ifdef ATM_COLOR_MULTS
nebulaTexture.rgb *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
return max(nebulaTexture.rgb * nebulaTexture.a, vec3(0.0));
}
#include "/lib/atmospherics/stars.glsl"
// Nebula implementation by flytrap https://godotshaders.com/shader/2d-nebula-shader/
#include "/lib/shaderSettings/stars.glsl"
#include "/lib/shaderSettings/nightNebula.glsl"
#ifndef HQ_NIGHT_NEBULA
const int OCTAVE = 5;
#else
const int OCTAVE = 8;
#endif
const float timescale = 5.0;
const float zoomScale = NEBULA_ZOOM_LEVEL;
const vec4 CLOUD1_COL = vec4(NEBULA_R_1, NEBULA_G_1, NEBULA_B_1, 0.4);
const vec4 CLOUD2_COL = vec4(NEBULA_R_2, NEBULA_G_2, NEBULA_B_2, 0.2);
const vec4 CLOUD3_COL = vec4(NEBULA_R_3, NEBULA_G_3, NEBULA_B_3, 1.0);
float sinM(float x) {
return sin(mod(x, 2.0 * pi));
}
float cosM(float x) {
return cos(mod(x, 2.0 * pi));
}
float rand(vec2 inCoord){
return fract(sinM(dot(inCoord, vec2(23.53, 44.0))) * 42350.45);
}
float perlin(vec2 inCoord){
vec2 i = floor(inCoord);
vec2 j = fract(inCoord);
vec2 coord = smoothstep(0.0, 1.0, j);
float a = rand(i);
float b = rand(i + vec2(1.0, 0.0));
float c = rand(i + vec2(0.0, 1.0));
float d = rand(i + vec2(1.0, 1.0));
return mix(mix(a, b, coord.x), mix(c, d, coord.x), coord.y);
}
float fbmCloud(vec2 inCoord, float minimum){
float value = 0.0;
float scale = NEBULA_AMOUNT * 0.1 + 0.45;
for (int i = 0; i < OCTAVE; i++){
value += perlin(inCoord) * scale;
inCoord *= 2.0;
scale *= 0.5;
}
return smoothstep(0.0, 1.0, (smoothstep(minimum, 1.0, value) - minimum) / (1.0 - minimum));
}
float fbmCloud2(vec2 inCoord, float minimum){
float value = 0.0;
float scale = (NEBULA_AMOUNT + 0.1) * 0.25 + 0.35;
for (int i = 0; i < OCTAVE; i++){
value += perlin(inCoord) * scale;
inCoord *= 2.0;
scale *= 0.5;
}
return (smoothstep(minimum, 1.0, value) - minimum) / (1.0 - minimum);
}
vec2 warpCoords(vec2 coord, float warpAmount) {
float angle = perlin(coord * 0.5) * 6.28318 * warpAmount;
float strength = perlin(coord * 0.7 + 0.5) * warpAmount;
vec2 offset = vec2(cos(angle), sin(angle)) * strength;
return coord + offset;
}
vec3 GetNightNebula(vec3 viewPos, float VdotU, float VdotS) {
float VdotUFactor = max0(VdotU);
float starsAroundSun = 1.0;
#ifdef CELESTIAL_BOTH_HEMISPHERES
VdotUFactor = VdotU;
#ifdef SUN_MOON_HORIZON
starsAroundSun = max0(sign(VdotU));
#endif
#endif
float originalVdotUFactor = VdotUFactor;
float horizonPower = NEBULA_HORIZON_STRENGTH * 0.05 + 0.5;
#if NEBULA_HORIZON_STRENGTH < 10
VdotUFactor = pow(VdotUFactor, horizonPower);
#endif
float nebulaFactor = pow2(VdotUFactor * min1(nightFactor * 2.0));
#if NEBULA_HORIZON_STRENGTH < 10
float brightnessCompensation = 1.0 - (1.0 - horizonPower) * 0.5 * max0(originalVdotUFactor);
nebulaFactor *= brightnessCompensation;
#endif
#ifdef CLEAR_SKY_WHEN_RAINING
nebulaFactor *= min1(invRainFactor + 0.4);
#else
nebulaFactor *= invRainFactor;
#endif
nebulaFactor -= maxBlindnessDarkness;
#if NEBULA_MOON_CONDITION == 1
if (moonPhase != 4) return vec3(0.0);
#elif NEBULA_MOON_CONDITION == 2
if (moonPhase != 0) return vec3(0.0);
#elif NEBULA_MOON_CONDITION == 3
if (moonPhase == 0 || moonPhase == 4) return vec3(0.0);
#elif NEBULA_MOON_CONDITION == 4
nebulaFactor *= step(0.5, hash11(float(worldDay) + float(moonPhase) * 37.0));
#elif NEBULA_MOON_CONDITION == 5
nebulaFactor *= clamp01(max(moonPhase, 1) % 4);
#endif
if (nebulaFactor < 0.001) return vec3(0.0);
vec2 UV = GetStarCoord(viewPos, 0.75);
float TIME = syncedTime * 0.003 + 15.0;
float timescaled = TIME * timescale;
float sinTime = sinM(0.07 * timescaled);
float cosTime06 = cosM(0.06 * timescaled);
float cosTime07 = cosM(0.07 * timescaled);
float tide = 0.05 * sinM(TIME);
float tide2 = 0.06 * cosM(0.3 * TIME);
vec4 nebulaTexture = vec4(vec3(0.0), 0.5 + 0.2 * sinM(0.23 * TIME + UV.x - UV.y));
#if PIXELATED_NEBULA > 0
float pixelFactor = PIXELATED_NEBULA * 2.0;
vec2 baseUV = floor(UV * pixelFactor) / pixelFactor;
#else
vec2 baseUV = UV;
#endif
vec2 scaledUV = baseUV * zoomScale;
vec2 cloudUV2 = vec2(scaledUV.x + 0.03 * timescaled * sinTime, scaledUV.y + 0.03 * timescaled * cosTime06);
vec2 cloudUV3 = vec2(scaledUV.x + 0.027 * timescaled * sinTime, scaledUV.y + 0.025 * timescaled * cosTime06);
vec2 cloudUV4 = vec2(scaledUV.x + 0.021 * timescaled * sinTime, scaledUV.y + 0.021 * timescaled * cosTime07);
#if NEBULA_PATTERN_WARP > 0
cloudUV2 = warpCoords(cloudUV2, NEBULA_PATTERN_WARP * 0.1);
cloudUV3 = warpCoords(cloudUV3, NEBULA_PATTERN_WARP * 0.1);
cloudUV4 = warpCoords(cloudUV4, NEBULA_PATTERN_WARP * 0.1);
#endif
nebulaTexture += fbmCloud2(cloudUV3, 0.24 + tide) * CLOUD1_COL;
nebulaTexture += fbmCloud(cloudUV2 * 0.9, 0.33 - tide) * CLOUD2_COL;
nebulaTexture = mix(nebulaTexture, CLOUD3_COL, fbmCloud(vec2(0.9 * cloudUV4.x, 0.9 * cloudUV4.y), 0.25 + tide2));
nebulaFactor *= 1.0 - pow2(pow2(pow2(abs(VdotS)))) * starsAroundSun;
nebulaTexture.a *= min1(pow2(pow2(nebulaTexture.a))) * nebulaFactor;
float starFactor = 1024.0;
UV /= STAR_SIZE * (0.75 + 0.25 * NEBULA_STAR_SIZE);
vec2 starCoord = floor(UV * 0.25 * starFactor) / starFactor;
vec2 fractPart = fract(UV * 0.25 * starFactor);
float starAmount = (2.0 - NEBULA_STAR_AMOUNT) * 0.1;
float starIntensity = GetStarNoise(starCoord) * GetStarNoise(starCoord + 0.1) - (starAmount + 0.5);
starIntensity *= getStarEdgeFactor(fractPart, STAR_ROUNDNESS_OW / 10.0, STAR_SOFTNESS_OW);
#if TWINKLING_STARS > 0
starIntensity *= getTwinklingStars(starCoord * 4, float(TWINKLING_STARS));
#endif
float starGlow = pow2(clamp(starIntensity, 0.0, 0.3 + starAmount)) * starBrightness * NEBULA_STAR_BRIGHTNESS;
#ifdef NEBULA_ONLY_STARS
nebulaTexture.a = step(0.15, nebulaTexture.a);
nebulaTexture.rgb = vec3(3.0 * starGlow);
#else
nebulaTexture.rgb *= 1.5 + 10.0 * starGlow;
#endif
#if NIGHT_NEBULA_I != 100
#define NIGHT_NEBULA_IM NIGHT_NEBULA_I * 0.01
nebulaTexture.a *= NIGHT_NEBULA_IM;
#endif
#if NEBULA_SATURATION != 10
nebulaTexture.rgb = rgb2hsv(nebulaTexture.rgb);
nebulaTexture.g *= NEBULA_SATURATION * 0.1;
nebulaTexture.rgb = hsv2rgb(nebulaTexture.rgb);
#endif
#ifdef ATM_COLOR_MULTS
nebulaTexture.rgb *= sqrtAtmColorMult; // C72380KD - Reduced atmColorMult impact on some things
#endif
return max(nebulaTexture.rgb * nebulaTexture.a, vec3(0.0));
}
@@ -1,64 +1,64 @@
#include "/lib/colors/lightAndAmbientColors.glsl"
vec3 beamCol = normalize(ColorBeam) * 3.0 * (2.5 - 1.0 * vlFactor) * OVERWORLD_BEAMS_INTENSITY;
vec2 wind = vec2(syncedTime * 0.0056);
float BeamNoise(vec2 planeCoord, vec2 wind) {
float noise = texture2DLod(noisetex, planeCoord * 0.275 - wind * 0.0625, 0.0).b;
noise+= texture2DLod(noisetex, planeCoord * 0.34375 + wind * 0.0575, 0.0).b * 10.0;
return noise;
}
vec4 DrawOverworldBeams(float VdotU, vec3 playerPos, vec3 viewPos) {
float visibility = 1.0 - sunVisibility - maxBlindnessDarkness;
#if OVERWORLD_BEAMS_CONDITION == 0
visibility -= moonPhase;
#endif
if (visibility > 0.0) {
vec3 result = vec3(0.0);
int sampleCount = 8;
float VdotUM = 1.0 - VdotU * VdotU;
float VdotUM2 = VdotUM + smoothstep1(pow2(pow2(1.0 - abs(VdotU)))) * 0.2;
vec4 beams = vec4(0.0);
float gradientMix = 1.0;
#ifdef AURORA_INFLUENCE
beamCol = getAuroraAmbientColor(beamCol, viewPos, 1.0, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.85) * OVERWORLD_BEAMS_INTENSITY;
#endif
for(int i = 0; i < sampleCount; i++) {
vec2 planeCoord = (playerPos.xz + cameraPosition.xz) * (1.0 + i * 6.0 / sampleCount) * 0.0014;
float noise = BeamNoise(planeCoord, wind);
noise = max(0.92 - 1.0 / abs(noise - (2.5 + VdotUM * 2.0)), 0.0) * 2.5;
if (noise > 0.0) {
noise *= 0.55;
float fireNoise = texture2DLod(noisetex, abs(planeCoord * 0.2) - wind, 0.0).b;
noise *= 0.5 * fireNoise + 0.75;
noise = noise * noise * 3.0 / sampleCount;
noise *= mix(1.0, sqrt3(VdotUM2), 0.25);
vec3 beamColor = beamCol;
beamColor *= gradientMix / sampleCount;
noise *= exp2(-6.0 * i / float(sampleCount));
beams += vec4(noise * beamColor, noise);
}
gradientMix += 1.0;
}
beams.rgb *= beams.a * beams.a * beams.a * 5000.0;
beams.rgb *= sqrt(beams.rgb);
result = sqrt(beams.rgb);
if(any(isnan(result.rgb))) result.rgb = vec3(0.0);
return vec4(result * visibility / sampleCount, beams.a);
}
return vec4(1.0);
}
#include "/lib/colors/lightAndAmbientColors.glsl"
vec3 beamCol = normalize(ColorBeam) * 3.0 * (2.5 - 1.0 * vlFactor) * OVERWORLD_BEAMS_INTENSITY;
vec2 wind = vec2(syncedTime * 0.0056);
float BeamNoise(vec2 planeCoord, vec2 wind) {
float noise = texture2DLod(noisetex, planeCoord * 0.275 - wind * 0.0625, 0.0).b;
noise+= texture2DLod(noisetex, planeCoord * 0.34375 + wind * 0.0575, 0.0).b * 10.0;
return noise;
}
vec4 DrawOverworldBeams(float VdotU, vec3 playerPos, vec3 viewPos) {
float visibility = 1.0 - sunVisibility - maxBlindnessDarkness;
#if OVERWORLD_BEAMS_CONDITION == 0
visibility -= moonPhase;
#endif
if (visibility > 0.0) {
vec3 result = vec3(0.0);
int sampleCount = 8;
float VdotUM = 1.0 - VdotU * VdotU;
float VdotUM2 = VdotUM + smoothstep1(pow2(pow2(1.0 - abs(VdotU)))) * 0.2;
vec4 beams = vec4(0.0);
float gradientMix = 1.0;
#ifdef AURORA_INFLUENCE
beamCol = getAuroraAmbientColor(beamCol, viewPos, 1.0, AURORA_CLOUD_INFLUENCE_INTENSITY, 0.85) * OVERWORLD_BEAMS_INTENSITY;
#endif
for(int i = 0; i < sampleCount; i++) {
vec2 planeCoord = (playerPos.xz + cameraPosition.xz) * (1.0 + i * 6.0 / sampleCount) * 0.0014;
float noise = BeamNoise(planeCoord, wind);
noise = max(0.92 - 1.0 / abs(noise - (2.5 + VdotUM * 2.0)), 0.0) * 2.5;
if (noise > 0.0) {
noise *= 0.55;
float fireNoise = texture2DLod(noisetex, abs(planeCoord * 0.2) - wind, 0.0).b;
noise *= 0.5 * fireNoise + 0.75;
noise = noise * noise * 3.0 / sampleCount;
noise *= mix(1.0, sqrt3(VdotUM2), 0.25);
vec3 beamColor = beamCol;
beamColor *= gradientMix / sampleCount;
noise *= exp2(-6.0 * i / float(sampleCount));
beams += vec4(noise * beamColor, noise);
}
gradientMix += 1.0;
}
beams.rgb *= beams.a * beams.a * beams.a * 5000.0;
beams.rgb *= sqrt(beams.rgb);
result = sqrt(beams.rgb);
if(any(isnan(result.rgb))) result.rgb = vec3(0.0);
return vec4(result * visibility / sampleCount, beams.a);
}
return vec4(1.0);
}
@@ -1,64 +1,64 @@
#define RAINBOW_DIAMETER 1.00 //[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 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.50 8.00]
vec3 GetRainbow(vec3 translucentMult, vec3 nViewPos, float z0, float z1, float lViewPos, float lViewPos1, float VdotL, float VdotU, float dither) {
vec3 rainbow = vec3(0.0);
float rainbowTime = min1(max0(SdotU - 0.1) / 0.15);
rainbowTime = clamp(rainbowTime - pow2(pow2(pow2(noonFactor))) * 8.0, 0.0, 0.85);
#if RAINBOWS == 1 // After Rain
rainbowTime *= sqrt2(max0(wetness - 0.333) * 1.5) * invRainFactor * inRainy;
#endif
if (rainbowTime > 0.001) {
float rainbowLength = far * 0.9;
if (z1 == 1.0) lViewPos1 = rainbowLength;
float cloudLinearDepth = texelFetch(colortex5, texelCoord, 0).a;
float cloudDisMult = pow2(cloudLinearDepth + OSIEBCA * dither);
lViewPos1 *= cloudDisMult;
#if RAINBOW_STYLE == 1
float pixelScale = 45.0;
vec3 shadowDir = mat3(shadowModelView) * mat3(gbufferModelViewInverse) * nViewPos;
shadowDir.z += 0.0065 * (dither - 0.5); // Blurs the pixelation
shadowDir /= abs(shadowDir.z); // Corrects distortion
shadowDir.xy = floor(shadowDir.xy * pixelScale) / pixelScale;
VdotL = shadowDir.z * inversesqrt(dot(shadowDir, shadowDir));
#endif
float rainbowCoord = clamp01(1.0 - (VdotL + 0.75) / (0.0625 * RAINBOW_DIAMETER));
float rainbowFactor = rainbowCoord * (1.0 - rainbowCoord);
rainbowFactor = pow2(pow2(rainbowFactor * 3.7));
rainbowFactor *= pow2(min1(lViewPos1 / rainbowLength));
rainbowFactor *= rainbowTime;
rainbowFactor *= 1.0 - GetCaveFactor();
if (rainbowFactor > 0.0) {
float rainbowCoordM = pow(rainbowCoord, 1.4 + max(rainbowCoord - 0.5, 0.0) * 1.6);
rainbowCoordM = smoothstep(0.0, 1.0, rainbowCoordM) * 0.85;
rainbowCoordM += (dither - 0.5) * 0.1;
rainbow += clamp(abs(mod(rainbowCoordM * 6.0 + vec3(-0.55,4.3,2.2) ,6.0)-3.0)-1.0, 0.0, 1.0);
rainbowCoordM += 0.1;
rainbow += clamp(abs(mod(rainbowCoordM * 6.0 + vec3(-0.55,4.3,2.2) ,6.0)-3.0)-1.0, 0.0, 1.0);
rainbowCoordM -= 0.2;
rainbow += clamp(abs(mod(rainbowCoordM * 6.0 + vec3(-0.55,4.3,2.2) ,6.0)-3.0)-1.0, 0.0, 1.0);
rainbow /= 3.0;
rainbow.r += pow2(max(rainbowCoord - 0.5, 0.0)) * (max(1.0 - rainbowCoord, 0.0)) * 26.0;
rainbow = pow(rainbow, vec3(2.2)) * vec3(0.25, 0.075, 0.25) * 3.0;
if (z1 > z0 && lViewPos < rainbowLength)
rainbow *= mix(translucentMult, vec3(1.0), lViewPos / rainbowLength);
if (isEyeInWater != 0) rainbow *= sqrt1(VdotU);
rainbow *= rainbowFactor;
}
}
return rainbow;
}
#define RAINBOW_DIAMETER 1.00 //[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 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.50 8.00]
vec3 GetRainbow(vec3 translucentMult, vec3 nViewPos, float z0, float z1, float lViewPos, float lViewPos1, float VdotL, float VdotU, float dither) {
vec3 rainbow = vec3(0.0);
float rainbowTime = min1(max0(SdotU - 0.1) / 0.15);
rainbowTime = clamp(rainbowTime - pow2(pow2(pow2(noonFactor))) * 8.0, 0.0, 0.85);
#if RAINBOWS == 1 // After Rain
rainbowTime *= sqrt2(max0(wetness - 0.333) * 1.5) * invRainFactor * inRainy;
#endif
if (rainbowTime > 0.001) {
float rainbowLength = far * 0.9;
if (z1 == 1.0) lViewPos1 = rainbowLength;
float cloudLinearDepth = texelFetch(colortex5, texelCoord, 0).a;
float cloudDisMult = pow2(cloudLinearDepth + OSIEBCA * dither);
lViewPos1 *= cloudDisMult;
#if RAINBOW_STYLE == 1
float pixelScale = 45.0;
vec3 shadowDir = mat3(shadowModelView) * mat3(gbufferModelViewInverse) * nViewPos;
shadowDir.z += 0.0065 * (dither - 0.5); // Blurs the pixelation
shadowDir /= abs(shadowDir.z); // Corrects distortion
shadowDir.xy = floor(shadowDir.xy * pixelScale) / pixelScale;
VdotL = shadowDir.z * inversesqrt(dot(shadowDir, shadowDir));
#endif
float rainbowCoord = clamp01(1.0 - (VdotL + 0.75) / (0.0625 * RAINBOW_DIAMETER));
float rainbowFactor = rainbowCoord * (1.0 - rainbowCoord);
rainbowFactor = pow2(pow2(rainbowFactor * 3.7));
rainbowFactor *= pow2(min1(lViewPos1 / rainbowLength));
rainbowFactor *= rainbowTime;
rainbowFactor *= 1.0 - GetCaveFactor();
if (rainbowFactor > 0.0) {
float rainbowCoordM = pow(rainbowCoord, 1.4 + max(rainbowCoord - 0.5, 0.0) * 1.6);
rainbowCoordM = smoothstep(0.0, 1.0, rainbowCoordM) * 0.85;
rainbowCoordM += (dither - 0.5) * 0.1;
rainbow += clamp(abs(mod(rainbowCoordM * 6.0 + vec3(-0.55,4.3,2.2) ,6.0)-3.0)-1.0, 0.0, 1.0);
rainbowCoordM += 0.1;
rainbow += clamp(abs(mod(rainbowCoordM * 6.0 + vec3(-0.55,4.3,2.2) ,6.0)-3.0)-1.0, 0.0, 1.0);
rainbowCoordM -= 0.2;
rainbow += clamp(abs(mod(rainbowCoordM * 6.0 + vec3(-0.55,4.3,2.2) ,6.0)-3.0)-1.0, 0.0, 1.0);
rainbow /= 3.0;
rainbow.r += pow2(max(rainbowCoord - 0.5, 0.0)) * (max(1.0 - rainbowCoord, 0.0)) * 26.0;
rainbow = pow(rainbow, vec3(2.2)) * vec3(0.25, 0.075, 0.25) * 3.0;
if (z1 > z0 && lViewPos < rainbowLength)
rainbow *= mix(translucentMult, vec3(1.0), lViewPos / rainbowLength);
if (isEyeInWater != 0) rainbow *= sqrt1(VdotU);
rainbow *= rainbowFactor;
}
}
return rainbow;
}
@@ -1,121 +1,121 @@
// Shooting stars implementation based on https://www.shadertoy.com/view/ttVXDy and also based on https://github.com/OUdefie17/Photon-GAMS
#define SHOOTING_STARS_SIZE 0.50 //[0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75]
#define SHOOTING_STARS_SPEED 8.0 //[4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0]
#define SHOOTING_STARS_CHANCE 0.5 //[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0]
#define SHOOTING_STARS_COUNT 4 //[1 2 3 4 5 6 7 8 9 10]
#define SHOOTING_STARS_LINE_THICKNESS 0.60 //[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 SHOOTING_STARS_TRAIL_LENGTH 0.60 //[0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85]
// Calculate distance from point p to line segment from a to b
float DistLine(vec2 p, vec2 a, vec2 b) {
vec2 pa = p - a;
vec2 ba = b - a;
float t = clamp01(dot(pa, ba) / dot(ba, ba));
return length(pa - ba * t);
}
// Draw a line with smooth edges
float DrawLine(vec2 p, vec2 a, vec2 b) {
float d = DistLine(p, a, b);
float m = smoothstep(SHOOTING_STARS_LINE_THICKNESS * 0.01, 0.00001, d);
float d2 = length(a - b);
m *= smoothstep(1.0, 0.5, d2) + smoothstep(0.04, 0.03, abs(d2 - 0.75));
return m;
}
// Generate a single shooting star
float ShootingStar(vec2 uv, vec2 startPos, vec2 direction) {
vec2 id = floor(uv * 0.5);
float h = hash12(id);
float newMoonVisibility = 1.0 - abs(moonPhase - 4) / 4.0;
float moonPhaseFactor = mix(0.8, 1.5, newMoonVisibility);
if (h >= pow1_5(SHOOTING_STARS_CHANCE * 0.065) * moonPhaseFactor) return 0.0;
vec2 gv = fract(uv * 0.5) * 2.0 - 1.0;
float line = DrawLine(gv, startPos, startPos + direction * 0.9);
vec2 toStart = gv - startPos;
float alongTrail = dot(toStart, direction);
float trail = smoothstep(SHOOTING_STARS_TRAIL_LENGTH, -0.1, alongTrail);
float headBrightness = 1.0 + 3.0 / (1.0 + pow2((alongTrail - 1.0) * 8.0));
return line * trail * headBrightness;
}
vec3 GetShootingStars(vec2 starCoord, float VdotU, float VdotS) {
float starsAroundSun = 1.0;
#ifdef CELESTIAL_BOTH_HEMISPHERES
float starBelowHorizonBrightness = 1.0;
float horizonFactor = exp(-pow(VdotU / 0.1, 2.0));
#ifdef SUN_MOON_HORIZON
starsAroundSun = max0(sign(VdotU));
#endif
#else
if (VdotU < 0.0) return vec3(0.0);
float starBelowHorizonBrightness = min1(VdotU * 3.0);
float horizonFactor = 0.0;
#endif
float visibility = max0(1.0 - 1.0 / (1.0 + abs(VdotS) * 1000.0) * starsAroundSun) * starBelowHorizonBrightness - horizonFactor * 0.5;
#ifndef DAYLIGHT_STARS
visibility *= pow2(pow2(invNoonFactor2)) * (1.0 - 0.5 * sunVisibility);
#endif
#ifdef CLEAR_SKY_WHEN_RAINING
visibility *= min1(invRainFactor + 0.4);
#else
visibility *= invRainFactor;
#endif
if (visibility <= 0.01) return vec3(0.0);
vec2 uv = starCoord * 6.0 * (1.0 - SHOOTING_STARS_SIZE);
float speed = frameTimeCounter * SHOOTING_STARS_SPEED;
vec2 startPositions[10] = vec2[](
vec2(-0.4, 0.3),
vec2(0.2, 0.4),
vec2(-0.1, -0.3),
vec2(0.3, -0.2),
vec2(-0.3, 0.1),
vec2(0.5, 0.2),
vec2(-0.5, -0.1),
vec2(0.1, 0.5),
vec2(-0.2, -0.4),
vec2(0.4, -0.3)
);
vec2 directions[10] = vec2[](
vec2(0.7071, 0.7071),
vec2(0.7071, -0.7071),
vec2(-1.0, 0.0),
vec2(1.0, 0.0),
vec2(0.5299, 0.8480),
vec2(-0.6000, 0.8000),
vec2(0.9134, -0.4067),
vec2(-0.8000, -0.6000),
vec2(0.3015, 0.9535),
vec2(-0.2000, -0.9798)
);
float stars = 0.0;
int dayIndex = int(worldDay) % 10;
vec2 todayDirection = directions[dayIndex];
for (int i = 0; i < SHOOTING_STARS_COUNT; i++) {
float offsetAngle = (hash12(vec2(i, worldDay)) - 0.5) * 0.66;
vec2 starDirection = rotate(offsetAngle) * todayDirection;
vec2 offsetUV = uv + starDirection * speed * (0.8 + 0.04 * float(i));
stars += ShootingStar(offsetUV, startPositions[i], starDirection);
}
vec3 shootingStarColor = vec3(0.38, 0.4, 0.5) * 2.0 * starBrightness;
float intensity = min(stars * visibility * 10.0, 1.0);
return shootingStarColor * intensity;
}
// Shooting stars implementation based on https://www.shadertoy.com/view/ttVXDy and also based on https://github.com/OUdefie17/Photon-GAMS
#define SHOOTING_STARS_SIZE 0.50 //[0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75]
#define SHOOTING_STARS_SPEED 8.0 //[4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0]
#define SHOOTING_STARS_CHANCE 0.5 //[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0]
#define SHOOTING_STARS_COUNT 4 //[1 2 3 4 5 6 7 8 9 10]
#define SHOOTING_STARS_LINE_THICKNESS 0.60 //[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 SHOOTING_STARS_TRAIL_LENGTH 0.60 //[0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85]
// Calculate distance from point p to line segment from a to b
float DistLine(vec2 p, vec2 a, vec2 b) {
vec2 pa = p - a;
vec2 ba = b - a;
float t = clamp01(dot(pa, ba) / dot(ba, ba));
return length(pa - ba * t);
}
// Draw a line with smooth edges
float DrawLine(vec2 p, vec2 a, vec2 b) {
float d = DistLine(p, a, b);
float m = smoothstep(SHOOTING_STARS_LINE_THICKNESS * 0.01, 0.00001, d);
float d2 = length(a - b);
m *= smoothstep(1.0, 0.5, d2) + smoothstep(0.04, 0.03, abs(d2 - 0.75));
return m;
}
// Generate a single shooting star
float ShootingStar(vec2 uv, vec2 startPos, vec2 direction) {
vec2 id = floor(uv * 0.5);
float h = hash12(id);
float newMoonVisibility = 1.0 - abs(moonPhase - 4) / 4.0;
float moonPhaseFactor = mix(0.8, 1.5, newMoonVisibility);
if (h >= pow1_5(SHOOTING_STARS_CHANCE * 0.065) * moonPhaseFactor) return 0.0;
vec2 gv = fract(uv * 0.5) * 2.0 - 1.0;
float line = DrawLine(gv, startPos, startPos + direction * 0.9);
vec2 toStart = gv - startPos;
float alongTrail = dot(toStart, direction);
float trail = smoothstep(SHOOTING_STARS_TRAIL_LENGTH, -0.1, alongTrail);
float headBrightness = 1.0 + 3.0 / (1.0 + pow2((alongTrail - 1.0) * 8.0));
return line * trail * headBrightness;
}
vec3 GetShootingStars(vec2 starCoord, float VdotU, float VdotS) {
float starsAroundSun = 1.0;
#ifdef CELESTIAL_BOTH_HEMISPHERES
float starBelowHorizonBrightness = 1.0;
float horizonFactor = exp(-pow(VdotU / 0.1, 2.0));
#ifdef SUN_MOON_HORIZON
starsAroundSun = max0(sign(VdotU));
#endif
#else
if (VdotU < 0.0) return vec3(0.0);
float starBelowHorizonBrightness = min1(VdotU * 3.0);
float horizonFactor = 0.0;
#endif
float visibility = max0(1.0 - 1.0 / (1.0 + abs(VdotS) * 1000.0) * starsAroundSun) * starBelowHorizonBrightness - horizonFactor * 0.5;
#ifndef DAYLIGHT_STARS
visibility *= pow2(pow2(invNoonFactor2)) * (1.0 - 0.5 * sunVisibility);
#endif
#ifdef CLEAR_SKY_WHEN_RAINING
visibility *= min1(invRainFactor + 0.4);
#else
visibility *= invRainFactor;
#endif
if (visibility <= 0.01) return vec3(0.0);
vec2 uv = starCoord * 6.0 * (1.0 - SHOOTING_STARS_SIZE);
float speed = frameTimeCounter * SHOOTING_STARS_SPEED;
vec2 startPositions[10] = vec2[](
vec2(-0.4, 0.3),
vec2(0.2, 0.4),
vec2(-0.1, -0.3),
vec2(0.3, -0.2),
vec2(-0.3, 0.1),
vec2(0.5, 0.2),
vec2(-0.5, -0.1),
vec2(0.1, 0.5),
vec2(-0.2, -0.4),
vec2(0.4, -0.3)
);
vec2 directions[10] = vec2[](
vec2(0.7071, 0.7071),
vec2(0.7071, -0.7071),
vec2(-1.0, 0.0),
vec2(1.0, 0.0),
vec2(0.5299, 0.8480),
vec2(-0.6000, 0.8000),
vec2(0.9134, -0.4067),
vec2(-0.8000, -0.6000),
vec2(0.3015, 0.9535),
vec2(-0.2000, -0.9798)
);
float stars = 0.0;
int dayIndex = int(worldDay) % 10;
vec2 todayDirection = directions[dayIndex];
for (int i = 0; i < SHOOTING_STARS_COUNT; i++) {
float offsetAngle = (hash12(vec2(i, worldDay)) - 0.5) * 0.66;
vec2 starDirection = rotate(offsetAngle) * todayDirection;
vec2 offsetUV = uv + starDirection * speed * (0.8 + 0.04 * float(i));
stars += ShootingStar(offsetUV, startPositions[i], starDirection);
}
vec3 shootingStarColor = vec3(0.38, 0.4, 0.5) * 2.0 * starBrightness;
float intensity = min(stars * visibility * 10.0, 1.0);
return shootingStarColor * intensity;
}
@@ -1,161 +1,161 @@
#ifndef INCLUDE_SKY
#define INCLUDE_SKY
#define SUN_GLARE_AMOUNT 10 // [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]
#define MOON_GLARE_AMOUNT 10 // [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/colors/skyColors.glsl"
#ifdef CAVE_FOG
#include "/lib/atmospherics/fog/caveFactor.glsl"
#endif
vec3 GetSky(float VdotU, float VdotS, float dither, bool doGlare, bool doGround) {
// Prepare variables
float nightFactorSqrt2 = sqrt2(nightFactor);
float nightFactorM = sqrt2(nightFactorSqrt2) * 0.4;
float VdotSM1 = pow2(max(VdotS, 0.0));
float VdotSM2 = pow2(VdotSM1);
float VdotSM3 = pow2(pow2(max(-VdotS, 0.0)));
float VdotSML = sunVisibility > 0.5 ? VdotS : -VdotS;
float VdotUmax0 = max(VdotU, 0.0);
float VdotUmax0M = 1.0 - pow2(VdotUmax0);
// Prepare colors
vec3 upColor = mix(nightUpSkyColor * (1.5 - 0.5 * nightFactorSqrt2 + nightFactorM * VdotSM3 * 1.5), dayUpSkyColor, sunFactor);
vec3 middleColor = mix(nightMiddleSkyColor * (3.0 - 2.0 * nightFactorSqrt2), dayMiddleSkyColor * (1.0 + VdotSM2 * 0.3), sunFactor);
vec3 downColor = mix(nightDownSkyColor, dayDownSkyColor, (sunFactor + sunVisibility) * 0.5);
// Mix the colors
// Set sky gradient
float scatteredGroundMixerMult = 1.0;
float VdotUM1 = pow2(1.0 - VdotUmax0);
VdotUM1 = pow(VdotUM1, 1.0 - VdotSM2 * 0.4);
VdotUM1 = mix(VdotUM1, 1.0, rainFactor2 * 0.15);
vec3 finalSky = mix(upColor, middleColor, VdotUM1);
// Add sunset color
float VdotUM2 = pow2(1.0 - abs(VdotU));
VdotUM2 = VdotUM2 * VdotUM2 * (3.0 - 2.0 * VdotUM2);
VdotUM2 *= (0.7 - nightFactorM + VdotSM1 * (0.3 + nightFactorM)) * invNoonFactor * sunFactor;
finalSky = mix(finalSky, sunsetDownSkyColorP * (1.0 + VdotSM1 * 0.3), VdotUM2 * invRainFactor);
// Add sky ground with fake light scattering
float VdotUM3 = min(max0(-VdotU + 0.08) / 0.35, 1.0);
VdotUM3 = smoothstep1(VdotUM3);
vec3 scatteredGroundMixer = vec3(VdotUM3 * VdotUM3, sqrt1(VdotUM3), sqrt3(VdotUM3));
scatteredGroundMixer = mix(vec3(VdotUM3), scatteredGroundMixer, 0.75 - 0.5 * rainFactor);
finalSky = mix(finalSky, downColor, scatteredGroundMixer * scatteredGroundMixerMult);
//
// Sky Ground
if (doGround)
finalSky *= smoothstep1(pow2(1.0 + min(VdotU, 0.0)));
// Apply Underwater Fog
if (isEyeInWater == 1)
finalSky = mix(finalSky * 3.0, waterFogColor, VdotUmax0M);
// Sun/Moon Glare
#if SUN_GLARE_AMOUNT > 0 || MOON_GLARE_AMOUNT > 0
if (doGlare) {
if (0.0 < VdotSML) {
float glareScatter = 3.0 * (2.0 - clamp01(VdotS * 1000.0));
#ifndef SUN_MOON_DURING_RAIN
glareScatter *= 1.0 - 0.75 * rainFactor2;
#endif
float VdotSM4 = pow(abs(VdotS), glareScatter);
float visfactor = 0.075;
float glare = visfactor / (1.0 - (1.0 - visfactor) * VdotSM4) - visfactor;
glare *= 0.7;
float glareWaterFactor = isEyeInWater * sunVisibility;
vec3 glareColor = mix(vec3(0.38, 0.4, 0.5) * 0.3, vec3(1.5, 0.7, 0.3) + vec3(0.0, 0.5, 0.5) * noonFactor, sunVisibility);
#if BLOOD_MOON > 0
glareColor = mix(glareColor, vec3(0.6314, 0.0431, 0.0431), getBloodMoon(sunVisibility));
#endif
glareColor = glareColor + glareWaterFactor * vec3(7.0);
#ifdef SUN_MOON_DURING_RAIN
glare *= 1.0 - 0.6 * rainFactor;
#else
glare *= 1.0 - 0.8 * rainFactor;
#endif
#if RAIN_STYLE == 1
float glareDesaturateFactor = 0.5 * rainFactor;
#elif RAIN_STYLE == 2
float glareDesaturateFactor = rainFactor;
#endif
glareColor = mix(glareColor, vec3(GetLuminance(glareColor)), glareDesaturateFactor);
glare *= mix(MOON_GLARE_AMOUNT * 0.1, SUN_GLARE_AMOUNT * 0.1, sunVisibility);
finalSky += glare * shadowTime * glareColor;
}
}
#endif
#ifdef CAVE_FOG
// Apply Cave Fog
finalSky = mix(finalSky, caveFogColor, GetCaveFactor() * VdotUmax0M);
#endif
// Dither to fix banding
finalSky += (dither - 0.5) / 128.0;
#if RETRO_LOOK == 1
finalSky = vec3(0.0);
#elif RETRO_LOOK ==2
finalSky = mix(finalSky, vec3(0.0), nightVision);
#endif
return finalSky;
}
vec3 GetLowQualitySky(float VdotU, float VdotS, float dither, bool doGlare, bool doGround) {
// Prepare variables
float VdotUmax0 = max(VdotU, 0.0);
float VdotUmax0M = 1.0 - pow2(VdotUmax0);
// Prepare colors
vec3 upColor = mix(nightUpSkyColor, dayUpSkyColor, sunFactor);
vec3 middleColor = mix(nightMiddleSkyColor, dayMiddleSkyColor, sunFactor);
// Mix the colors
// Set sky gradient
float VdotUM1 = pow2(1.0 - VdotUmax0);
VdotUM1 = mix(VdotUM1, 1.0, rainFactor2 * 0.2);
vec3 finalSky = mix(upColor, middleColor, VdotUM1);
// Add sunset color
float VdotUM2 = pow2(1.0 - abs(VdotU));
VdotUM2 *= invNoonFactor * sunFactor * (0.8 + 0.2 * VdotS);
finalSky = mix(finalSky, sunsetDownSkyColorP * (shadowTime * 0.6 + 0.2), VdotUM2 * invRainFactor);
//
// Sky Ground
finalSky *= pow2(pow2(1.0 + min(VdotU, 0.0)));
// Apply Underwater Fog
if (isEyeInWater == 1)
finalSky = mix(finalSky, waterFogColor, VdotUmax0M);
// Sun/Moon Glare
finalSky *= 1.0 + mix(nightFactor, 0.5 + 0.7 * noonFactor, VdotS * 0.5 + 0.5) * pow2(pow2(pow2(VdotS)));
#ifdef CAVE_FOG
// Apply Cave Fog
finalSky = mix(finalSky, caveFogColor, GetCaveFactor() * VdotUmax0M);
#endif
#if RETRO_LOOK == 1 || RETRO_LOOK == 2
finalSky = vec3(0.0);
#endif
return finalSky;
}
#endif //INCLUDE_SKY
#ifndef INCLUDE_SKY
#define INCLUDE_SKY
#define SUN_GLARE_AMOUNT 10 // [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]
#define MOON_GLARE_AMOUNT 10 // [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/colors/skyColors.glsl"
#ifdef CAVE_FOG
#include "/lib/atmospherics/fog/caveFactor.glsl"
#endif
vec3 GetSky(float VdotU, float VdotS, float dither, bool doGlare, bool doGround) {
// Prepare variables
float nightFactorSqrt2 = sqrt2(nightFactor);
float nightFactorM = sqrt2(nightFactorSqrt2) * 0.4;
float VdotSM1 = pow2(max(VdotS, 0.0));
float VdotSM2 = pow2(VdotSM1);
float VdotSM3 = pow2(pow2(max(-VdotS, 0.0)));
float VdotSML = sunVisibility > 0.5 ? VdotS : -VdotS;
float VdotUmax0 = max(VdotU, 0.0);
float VdotUmax0M = 1.0 - pow2(VdotUmax0);
// Prepare colors
vec3 upColor = mix(nightUpSkyColor * (1.5 - 0.5 * nightFactorSqrt2 + nightFactorM * VdotSM3 * 1.5), dayUpSkyColor, sunFactor);
vec3 middleColor = mix(nightMiddleSkyColor * (3.0 - 2.0 * nightFactorSqrt2), dayMiddleSkyColor * (1.0 + VdotSM2 * 0.3), sunFactor);
vec3 downColor = mix(nightDownSkyColor, dayDownSkyColor, (sunFactor + sunVisibility) * 0.5);
// Mix the colors
// Set sky gradient
float scatteredGroundMixerMult = 1.0;
float VdotUM1 = pow2(1.0 - VdotUmax0);
VdotUM1 = pow(VdotUM1, 1.0 - VdotSM2 * 0.4);
VdotUM1 = mix(VdotUM1, 1.0, rainFactor2 * 0.15);
vec3 finalSky = mix(upColor, middleColor, VdotUM1);
// Add sunset color
float VdotUM2 = pow2(1.0 - abs(VdotU));
VdotUM2 = VdotUM2 * VdotUM2 * (3.0 - 2.0 * VdotUM2);
VdotUM2 *= (0.7 - nightFactorM + VdotSM1 * (0.3 + nightFactorM)) * invNoonFactor * sunFactor;
finalSky = mix(finalSky, sunsetDownSkyColorP * (1.0 + VdotSM1 * 0.3), VdotUM2 * invRainFactor);
// Add sky ground with fake light scattering
float VdotUM3 = min(max0(-VdotU + 0.08) / 0.35, 1.0);
VdotUM3 = smoothstep1(VdotUM3);
vec3 scatteredGroundMixer = vec3(VdotUM3 * VdotUM3, sqrt1(VdotUM3), sqrt3(VdotUM3));
scatteredGroundMixer = mix(vec3(VdotUM3), scatteredGroundMixer, 0.75 - 0.5 * rainFactor);
finalSky = mix(finalSky, downColor, scatteredGroundMixer * scatteredGroundMixerMult);
//
// Sky Ground
if (doGround)
finalSky *= smoothstep1(pow2(1.0 + min(VdotU, 0.0)));
// Apply Underwater Fog
if (isEyeInWater == 1)
finalSky = mix(finalSky * 3.0, waterFogColor, VdotUmax0M);
// Sun/Moon Glare
#if SUN_GLARE_AMOUNT > 0 || MOON_GLARE_AMOUNT > 0
if (doGlare) {
if (0.0 < VdotSML) {
float glareScatter = 3.0 * (2.0 - clamp01(VdotS * 1000.0));
#ifndef SUN_MOON_DURING_RAIN
glareScatter *= 1.0 - 0.75 * rainFactor2;
#endif
float VdotSM4 = pow(abs(VdotS), glareScatter);
float visfactor = 0.075;
float glare = visfactor / (1.0 - (1.0 - visfactor) * VdotSM4) - visfactor;
glare *= 0.7;
float glareWaterFactor = isEyeInWater * sunVisibility;
vec3 glareColor = mix(vec3(0.38, 0.4, 0.5) * 0.3, vec3(1.5, 0.7, 0.3) + vec3(0.0, 0.5, 0.5) * noonFactor, sunVisibility);
#if BLOOD_MOON > 0
glareColor = mix(glareColor, vec3(0.6314, 0.0431, 0.0431), getBloodMoon(sunVisibility));
#endif
glareColor = glareColor + glareWaterFactor * vec3(7.0);
#ifdef SUN_MOON_DURING_RAIN
glare *= 1.0 - 0.6 * rainFactor;
#else
glare *= 1.0 - 0.8 * rainFactor;
#endif
#if RAIN_STYLE == 1
float glareDesaturateFactor = 0.5 * rainFactor;
#elif RAIN_STYLE == 2
float glareDesaturateFactor = rainFactor;
#endif
glareColor = mix(glareColor, vec3(GetLuminance(glareColor)), glareDesaturateFactor);
glare *= mix(MOON_GLARE_AMOUNT * 0.1, SUN_GLARE_AMOUNT * 0.1, sunVisibility);
finalSky += glare * shadowTime * glareColor;
}
}
#endif
#ifdef CAVE_FOG
// Apply Cave Fog
finalSky = mix(finalSky, caveFogColor, GetCaveFactor() * VdotUmax0M);
#endif
// Dither to fix banding
finalSky += (dither - 0.5) / 128.0;
#if RETRO_LOOK == 1
finalSky = vec3(0.0);
#elif RETRO_LOOK ==2
finalSky = mix(finalSky, vec3(0.0), nightVision);
#endif
return finalSky;
}
vec3 GetLowQualitySky(float VdotU, float VdotS, float dither, bool doGlare, bool doGround) {
// Prepare variables
float VdotUmax0 = max(VdotU, 0.0);
float VdotUmax0M = 1.0 - pow2(VdotUmax0);
// Prepare colors
vec3 upColor = mix(nightUpSkyColor, dayUpSkyColor, sunFactor);
vec3 middleColor = mix(nightMiddleSkyColor, dayMiddleSkyColor, sunFactor);
// Mix the colors
// Set sky gradient
float VdotUM1 = pow2(1.0 - VdotUmax0);
VdotUM1 = mix(VdotUM1, 1.0, rainFactor2 * 0.2);
vec3 finalSky = mix(upColor, middleColor, VdotUM1);
// Add sunset color
float VdotUM2 = pow2(1.0 - abs(VdotU));
VdotUM2 *= invNoonFactor * sunFactor * (0.8 + 0.2 * VdotS);
finalSky = mix(finalSky, sunsetDownSkyColorP * (shadowTime * 0.6 + 0.2), VdotUM2 * invRainFactor);
//
// Sky Ground
finalSky *= pow2(pow2(1.0 + min(VdotU, 0.0)));
// Apply Underwater Fog
if (isEyeInWater == 1)
finalSky = mix(finalSky, waterFogColor, VdotUmax0M);
// Sun/Moon Glare
finalSky *= 1.0 + mix(nightFactor, 0.5 + 0.7 * noonFactor, VdotS * 0.5 + 0.5) * pow2(pow2(pow2(VdotS)));
#ifdef CAVE_FOG
// Apply Cave Fog
finalSky = mix(finalSky, caveFogColor, GetCaveFactor() * VdotUmax0M);
#endif
#if RETRO_LOOK == 1 || RETRO_LOOK == 2
finalSky = vec3(0.0);
#endif
return finalSky;
}
#endif //INCLUDE_SKY
@@ -1,94 +1,94 @@
#if !defined STARS_FILE_INCLUDED
#define STARS_FILE_INCLUDED
#include "/lib/colors/skyColors.glsl"
#include "/lib/shaderSettings/stars.glsl"
vec2 GetStarCoord(vec3 viewPos, float sphereness) {
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos * 1000.0, 1.0)).xyz);
float ySign = sign(wpos.y);
float yMagnitude = abs(wpos.y);
vec3 adjustedWpos = vec3(wpos.x, yMagnitude, wpos.z);
vec3 starCoord = adjustedWpos / (adjustedWpos.y + length(adjustedWpos.xz) * sphereness);
if (ySign >= 0.0) {
starCoord.x += 0.006 * syncedTime; // Top hemisphere (original direction)
} else {
starCoord.x = starCoord.x - 0.006 * syncedTime + 0.37; // Bottom hemisphere with offset
starCoord.z += 0.21;
}
return starCoord.xz;
}
vec3 GetStars(vec2 starCoord, float VdotU, float VdotS, float sizeMult, float starAmount) {
#if NIGHT_STAR_AMOUNT == 0
return vec3(0.0, 0.0, 0.0);
#endif
float starsAroundSun = 1.0;
#ifdef CELESTIAL_BOTH_HEMISPHERES
float starBelowHorizonBrightness = 1.0;
float horizonFactor = exp(-pow(VdotU / 0.1, 2.0));
#ifdef SUN_MOON_HORIZON
starsAroundSun = max0(sign(VdotU));
#endif
#else
if (VdotU < 0.0) return vec3(0.0);
float starBelowHorizonBrightness = min1(VdotU * 3.0);
float horizonFactor = 0.0;
#endif
starCoord *= 0.2 / (STAR_SIZE * sizeMult);
const float starFactor = 1024.0;
vec2 fractPart = fract(starCoord * starFactor);
starCoord = floor(starCoord * starFactor) / starFactor;
float star = GetStarNoise(starCoord.xy) * GetStarNoise(starCoord.xy+0.1) * GetStarNoise(starCoord.xy+0.23);
#if NIGHT_STAR_AMOUNT == 1
star -= 0.82;
star *= 2.0;
#elif NIGHT_STAR_AMOUNT == 2
star -= 0.7;
#elif NIGHT_STAR_AMOUNT == 3
star -= 0.62;
star *= 0.75;
#elif NIGHT_STAR_AMOUNT == 4
star -= 0.52;
star *= 0.55;
#endif
star = max0(star - starAmount * 0.1);
star *= getStarEdgeFactor(fractPart, STAR_ROUNDNESS_OW / 10.0, STAR_SOFTNESS_OW);
star *= star;
star *= max0(1.0 - pow(abs(VdotS) * 1.002, 100.0) * starsAroundSun) * starBelowHorizonBrightness - horizonFactor * 0.5;
#ifndef DAYLIGHT_STARS
star *= pow2(pow2(invNoonFactor2)) * (1.0 - 0.5 * sunVisibility);
#endif
#ifdef CLEAR_SKY_WHEN_RAINING
star *= min1(invRainFactor + 0.4);
#else
star *= invRainFactor;
#endif
vec3 starColor = GetStarColor(starCoord,
vec3(0.38, 0.4, 0.5),
vec3(STAR_COLOR_1_OW_R, STAR_COLOR_1_OW_G, STAR_COLOR_1_OW_B),
vec3(STAR_COLOR_2_OW_R, STAR_COLOR_2_OW_G, STAR_COLOR_2_OW_B),
vec3(STAR_COLOR_3_OW_R, STAR_COLOR_3_OW_G, STAR_COLOR_3_OW_B),
float(STAR_COLOR_VARIATION_OW));
vec3 stars = 40.0 * star * starColor * starBrightness;
#if TWINKLING_STARS > 0
stars *= getTwinklingStars(starCoord, float(TWINKLING_STARS));
#endif
return stars;
}
#endif
#if !defined STARS_FILE_INCLUDED
#define STARS_FILE_INCLUDED
#include "/lib/colors/skyColors.glsl"
#include "/lib/shaderSettings/stars.glsl"
vec2 GetStarCoord(vec3 viewPos, float sphereness) {
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos * 1000.0, 1.0)).xyz);
float ySign = sign(wpos.y);
float yMagnitude = abs(wpos.y);
vec3 adjustedWpos = vec3(wpos.x, yMagnitude, wpos.z);
vec3 starCoord = adjustedWpos / (adjustedWpos.y + length(adjustedWpos.xz) * sphereness);
if (ySign >= 0.0) {
starCoord.x += 0.006 * syncedTime; // Top hemisphere (original direction)
} else {
starCoord.x = starCoord.x - 0.006 * syncedTime + 0.37; // Bottom hemisphere with offset
starCoord.z += 0.21;
}
return starCoord.xz;
}
vec3 GetStars(vec2 starCoord, float VdotU, float VdotS, float sizeMult, float starAmount) {
#if NIGHT_STAR_AMOUNT == 0
return vec3(0.0, 0.0, 0.0);
#endif
float starsAroundSun = 1.0;
#ifdef CELESTIAL_BOTH_HEMISPHERES
float starBelowHorizonBrightness = 1.0;
float horizonFactor = exp(-pow(VdotU / 0.1, 2.0));
#ifdef SUN_MOON_HORIZON
starsAroundSun = max0(sign(VdotU));
#endif
#else
if (VdotU < 0.0) return vec3(0.0);
float starBelowHorizonBrightness = min1(VdotU * 3.0);
float horizonFactor = 0.0;
#endif
starCoord *= 0.2 / (STAR_SIZE * sizeMult);
const float starFactor = 1024.0;
vec2 fractPart = fract(starCoord * starFactor);
starCoord = floor(starCoord * starFactor) / starFactor;
float star = GetStarNoise(starCoord.xy) * GetStarNoise(starCoord.xy+0.1) * GetStarNoise(starCoord.xy+0.23);
#if NIGHT_STAR_AMOUNT == 1
star -= 0.82;
star *= 2.0;
#elif NIGHT_STAR_AMOUNT == 2
star -= 0.7;
#elif NIGHT_STAR_AMOUNT == 3
star -= 0.62;
star *= 0.75;
#elif NIGHT_STAR_AMOUNT == 4
star -= 0.52;
star *= 0.55;
#endif
star = max0(star - starAmount * 0.1);
star *= getStarEdgeFactor(fractPart, STAR_ROUNDNESS_OW / 10.0, STAR_SOFTNESS_OW);
star *= star;
star *= max0(1.0 - pow(abs(VdotS) * 1.002, 100.0) * starsAroundSun) * starBelowHorizonBrightness - horizonFactor * 0.5;
#ifndef DAYLIGHT_STARS
star *= pow2(pow2(invNoonFactor2)) * (1.0 - 0.5 * sunVisibility);
#endif
#ifdef CLEAR_SKY_WHEN_RAINING
star *= min1(invRainFactor + 0.4);
#else
star *= invRainFactor;
#endif
vec3 starColor = GetStarColor(starCoord,
vec3(0.38, 0.4, 0.5),
vec3(STAR_COLOR_1_OW_R, STAR_COLOR_1_OW_G, STAR_COLOR_1_OW_B),
vec3(STAR_COLOR_2_OW_R, STAR_COLOR_2_OW_G, STAR_COLOR_2_OW_B),
vec3(STAR_COLOR_3_OW_R, STAR_COLOR_3_OW_G, STAR_COLOR_3_OW_B),
float(STAR_COLOR_VARIATION_OW));
vec3 stars = 40.0 * star * starColor * starBrightness;
#if TWINKLING_STARS > 0
stars *= getTwinklingStars(starCoord, float(TWINKLING_STARS));
#endif
return stars;
}
#endif
@@ -1,375 +1,375 @@
// Volumetric tracing from Robobo1221, highly modified
#include "/lib/shaderSettings/volumetricLight.glsl"
#include "/lib/shaderSettings/endBeams.glsl"
#include "/lib/shaderSettings/endFlash.glsl"
#include "/lib/colors/lightAndAmbientColors.glsl"
//#define BEDROCK_NOISE
float GetDepth(float depth) {
return 2.0 * near * far / (far + near - (2.0 * depth - 1.0) * (far - near));
}
float GetDistX(float dist) {
return (far * (dist - near)) / (dist * (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 GetVolumetricLight(inout vec3 color, inout float vlFactor, vec3 translucentMult, float lViewPos0, float lViewPos1, vec3 nViewPos, float VdotL, float VdotU, vec2 texCoord, float z0, float z1, float dither) {
vec4 volumetricLight = vec4(0.0);
#if defined BEDROCK_NOISE && defined OVERWORLD
if ((cameraPosition.y < bedrockLevel) && (eyeBrightnessM < 0.4)) return vec4(0.0);
#endif
float vlMult = 1.0 - maxBlindnessDarkness;
#if SHADOW_QUALITY > -1
// Optifine for some reason doesn't provide correct shadowMapResolution if Shadow Quality isn't 1x
vec2 shadowMapResolutionM = textureSize(shadowtex0, 0);
#endif
#ifdef IRIS_FEATURE_FADE_VARIABLE
vec3 texture6 = texelFetch(colortex6, texelCoord, 0).rgb;
float chunkFade = texture6.b > 0.50001 ? (1.0 - texture6.b) * 2.0 : 1.0;
float chunkFadeM = mix(1.0, chunkFade, pow2(clamp01(lViewPos0 * 0.015))); // don't do fade very close to the player
lViewPos1 = mix(far, lViewPos1, chunkFadeM);
#endif
#ifdef OVERWORLD
vec3 vlColor = lightColor;
vec3 vlColorReducer = vec3(1.0);
float vlSceneIntensity = isEyeInWater != 1 ? vlFactor : 1.0;
#ifdef SPECIAL_BIOME_WEATHER
vlSceneIntensity = mix(vlSceneIntensity, 1.0, inDry * rainFactor);
vlColor *= 1.0 + 0.6 * inDry * rainFactor;
#endif
if (sunVisibility < 0.5) {
vlSceneIntensity = 0.0;
float vlMultNightModifier = (0.3 + 0.4 * rainFactor2 + 0.5 * max0(far - lViewPos1) / far);
#ifdef SPECIAL_PALE_GARDEN_LIGHTSHAFTS
vlMultNightModifier = mix(vlMultNightModifier, 1.0, inPaleGarden);
#endif
vlMult *= vlMultNightModifier;
vlColor = normalize(pow(vlColor, vec3(1.0 - max0(1.0 - 1.5 * nightFactor) + rainFactor)));
vlColor *= 0.0766 + 0.0766 * vsBrightness;
} else {
vlColorReducer = 1.0 / sqrt(vlColor);
}
#if BLOOD_MOON > 0
vec3 hsvVlColor = rgb2hsv(vlColor);
vlColor = mix(vlColor, hsv2rgb(vec3(0, max(0.8, hsvVlColor.y), hsvVlColor.z * 1.7)), getBloodMoon(sunVisibility));
#endif
#ifdef SPECIAL_PALE_GARDEN_LIGHTSHAFTS
vlSceneIntensity = mix(vlSceneIntensity, 1.0, inPaleGarden);
vlMult *= 1.0 + (3.0 * inPaleGarden) * (1.0 - sunVisibility);
#endif
float rainyNight = (1.0 - sunVisibility) * rainFactor;
float VdotLM = max((VdotL + 1.0) / 2.0, 0.0);
float VdotUmax0 = max(VdotU, 0.0);
float VdotUM = mix(pow2(1.0 - VdotUmax0), 1.0, 0.5 * vlSceneIntensity);
VdotUM = smoothstep1(VdotUM);
VdotUM = pow(VdotUM, min(lViewPos1 / far, 1.0) * (3.0 - 2.0 * vlSceneIntensity));
vlMult *= mix(VdotUM * VdotLM, 1.0, 0.4 * rainyNight) * vlTime;
vlMult *= mix(invNoonFactor2 * 0.875 + 0.125, 1.0, max(vlSceneIntensity, rainFactor2));
#if LIGHTSHAFT_QUALI == 4
int sampleCount = vlSceneIntensity < 0.5 ? 30 : 50;
#elif LIGHTSHAFT_QUALI == 3
int sampleCount = vlSceneIntensity < 0.5 ? 15 : 30;
#elif LIGHTSHAFT_QUALI == 2
int sampleCount = vlSceneIntensity < 0.5 ? 10 : 20;
#elif LIGHTSHAFT_QUALI == 1
int sampleCount = vlSceneIntensity < 0.5 ? 6 : 12;
#endif
#ifndef TAA
sampleCount *= 2;
#endif
#ifdef LIGHTSHAFT_SMOKE
float totalSmoke = 0.0;
#endif
#else
translucentMult = sqrt(translucentMult); // Because we pow2() the vl result in composite for the End dimension
float vlSceneIntensity = 0.0;
#ifndef LOW_QUALITY_ENDER_NEBULA
int sampleCount = 16;
#else
int sampleCount = 10;
#endif
#endif
float addition = 1.0;
float maxDist = mix(max(far, 96.0) * 0.55, 80.0, vlSceneIntensity);
#if WATER_FOG_MULT != 100
if (isEyeInWater == 1) {
#define WATER_FOG_MULT_M WATER_FOG_MULT * 0.01;
maxDist /= WATER_FOG_MULT_M;
}
#endif
float distMult = maxDist / (sampleCount + addition);
float sampleMultIntense = isEyeInWater != 1 ? 1.0 : 0.85;
float viewFactor = 1.0 - 0.7 * pow2(dot(nViewPos.xy, nViewPos.xy));
float depth0 = GetDepth(z0);
float depth1 = GetDepth(z1);
#ifdef END
if (z0 == 1.0) depth0 = 1000.0;
if (z1 == 1.0) depth1 = 1000.0;
#endif
// Fast but inaccurate perspective distortion approximation
maxDist *= viewFactor;
distMult *= viewFactor;
#ifdef IRIS_FEATURE_FADE_VARIABLE
depth1 = mix(depth1, far, pow2(pow2(1.0 - chunkFadeM)));
#endif
#ifdef OVERWORLD
float maxCurrentDist = min(depth1, maxDist);
#else
float maxCurrentDist = min(depth1, far);
#endif
for (int i = 0; i < sampleCount; i++) {
float currentDist = (i + dither) * distMult + addition;
if (currentDist > maxCurrentDist) break;
vec4 viewPos = gbufferProjectionInverse * (vec4(texCoord, GetDistX(currentDist), 1.0) * 2.0 - 1.0);
viewPos /= viewPos.w;
vec4 wpos = gbufferModelViewInverse * viewPos;
vec3 playerPos = wpos.xyz / wpos.w;
#if defined END && defined END_BEAMS
playerPos *= 512.0 / far;
vec4 enderBeamSample = vec4(DrawEnderBeams(VdotU, playerPos, nViewPos), 1.0);
enderBeamSample /= sampleCount;
#endif
#if defined OVERWORLD && defined OVERWORLD_BEAMS
vec4 overworldBeamSample = DrawOverworldBeams(VdotU, playerPos, viewPos.xyz);
#endif
float shadowSample = 1.0;
vec3 vlSample = vec3(1.0);
#if SHADOW_QUALITY > -1
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;
vec4 shadowPosition = DistortShadow(wpos,distortFactor);
//shadowPosition.z += 0.0001;
#ifdef OVERWORLD
float percentComplete = currentDist / maxDist;
float sampleMult = mix(percentComplete * 3.0, sampleMultIntense, max(rainFactor, vlSceneIntensity));
if (currentDist < 5.0) sampleMult *= smoothstep1(clamp(currentDist / 5.0, 0.0, 1.0));
sampleMult /= sampleCount;
#endif
if (length(shadowPosition.xy * 2.0 - 1.0) < 1.0) {
// 28A3DK6 We need to use texelFetch here or a lot of Nvidia GPUs can't get a valid value
shadowSample = texelFetch(shadowtex0, ivec2(shadowPosition.xy * shadowMapResolutionM), 0).x;
shadowSample = clamp((shadowSample-shadowPosition.z)*65536.0,0.0,1.0);
vlSample = vec3(shadowSample);
#ifdef END_FLASH_SHADOW_INTERNAL
vlSample = mix(vec3(1.0), vlSample, endFlashIntensity);
#endif
#if SHADOW_QUALITY >= 1
if (shadowSample == 0.0) {
float testsample = shadow2D(shadowtex1, shadowPosition.xyz).z;
if (testsample == 1.0) {
vec3 colsample = texture2D(shadowcolor1, shadowPosition.xy).rgb * 4.0;
colsample *= colsample;
vlSample = colsample;
shadowSample = 1.0;
#ifdef OVERWORLD
vlSample *= vlColorReducer;
#endif
}
} else {
#ifdef OVERWORLD
// For water-tinting the water surface when observed from below the surface
if (translucentMult != vec3(1.0) && currentDist > depth0) {
vec3 tinter = vec3(1.0);
if (isEyeInWater == 1) {
vec3 translucentMultM = translucentMult * 2.8;
tinter = pow(translucentMultM, vec3(sunVisibility * 3.0 * clamp01(playerPos.y * 0.03)));
} else {
tinter = 0.1 + 0.9 * pow2(pow2(translucentMult * 1.7));
}
vlSample *= mix(vec3(1.0), tinter, clamp01(oceanAltitude - cameraPosition.y));
}
#endif
if (isEyeInWater == 1 && translucentMult == vec3(1.0)) vlSample = vec3(0.0);
}
#endif
}
#endif
if (currentDist > depth0) vlSample *= translucentMult;
#ifdef OVERWORLD
#ifdef LIGHTSHAFT_SMOKE
vec3 smokePos = 0.0015 * (playerPos + cameraPosition);
vec3 smokeWind = frameTimeCounter * vec3(0.0, 0.001, -0.002);
float smoke = 0.65 * Noise3D(smokePos + smokeWind)
+ 0.25 * Noise3D((smokePos - smokeWind) * 3.0)
+ 0.10 * Noise3D((smokePos + smokeWind) * 9.0);
smoke = smoothstep1(smoothstep1(smoothstep1(smoke)));
totalSmoke += smoke * shadowSample * sampleMult;
#endif
vec4 volumetricLightAdd = vec4(vlSample, shadowSample) * sampleMult;
#ifdef OVERWORLD_BEAMS
volumetricLight += volumetricLightAdd * mix(vec4(1.0), overworldBeamSample, overworldBeamSample.a);
#else
volumetricLight += volumetricLightAdd;
#endif
#else
#ifdef END_BEAMS
volumetricLight += vec4(vlSample, shadowSample) * enderBeamSample;
#endif
#endif
}
#ifdef LIGHTSHAFT_SMOKE
volumetricLight *= pow(totalSmoke / volumetricLight.a, min(1.0 - volumetricLight.a, 0.5));
volumetricLight.rgb /= pow(0.5, 1.0 - volumetricLight.a);
#endif
// Decision of Intensity for Scene Aware Light Shafts //
#if defined OVERWORLD && LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1
if (viewWidth + viewHeight - gl_FragCoord.x - gl_FragCoord.y < 1.5) {
if (frameCounter % int(0.06666 / frameTimeSmooth + 0.5) == 0) { // Change speed is not too different above 10 fps
int salsX = 5;
int salsY = 5;
float heightThreshold = 6.0;
vec2 viewM = 1.0 / vec2(salsX, salsY);
float salsSampleSum = 0.0;
int salsSampleCount = 0;
for (float i = 0.25; i < salsX; i++) {
for (float h = 0.45; h < salsY; h++) {
vec2 coord = 0.3 + 0.4 * viewM * vec2(i, h);
ivec2 icoord = ivec2(coord * shadowMapResolutionM);
float salsSample = texelFetch(shadowtex0, icoord, 0).x; // read 28A3DK6
if (salsSample < 0.55) {
float sampledHeight = texture2D(shadowcolor1, coord).a;
if (sampledHeight > 0.0) {
sampledHeight = max0(sampledHeight - 0.25) / 0.05; // consistencyMEJHRI7DG
salsSampleSum += sampledHeight;
salsSampleCount++;
}
}
}
}
float salsCheck = salsSampleSum / salsSampleCount;
int reduceAmount = 2;
int skyCheck = 0;
for (float i = 0.1; i < 1.0; i += 0.2) {
skyCheck += int(texelFetch(depthtex0, ivec2(view.x * i, view.y * 0.9), 0).x == 1.0);
}
if (skyCheck >= 4) {
salsCheck = 0.0;
reduceAmount = 3;
}
if (salsCheck > heightThreshold) {
vlFactor = min(vlFactor + OSIEBCA, 1.0);
} else {
vlFactor = max(vlFactor - OSIEBCA * reduceAmount, 0.0);
}
}
} else vlFactor = 0.0;
//if (gl_FragCoord.y < 50) color.rgb = vec3(1,0,1) * float(salsCheck / heightThreshold > gl_FragCoord.x / 1920.0);
/*for (float i = 0.25; i < salsX; i++) {
for (float h = 0.45; h < salsY; h++) {
if (length(texCoord - (0.3 + 0.4 * viewM * vec2(i, h))) < 0.01) return vec4(1,0,1,1);
}
}*/
#endif
#ifdef OVERWORLD
vlColor = pow(vlColor, vec3(0.5 + (0.5 + LIGHTSHAFT_SUNSET_SATURATION * sunVisibility) * invNoonFactor * invRainFactor + 0.3 * rainFactor));
vlColor *= 1.0 - (0.3 + 0.3 * noonFactor) * rainFactor - 0.5 * rainyNight + sunVisibility * pow2(invNoonFactor) * invRainFactor;
#if LIGHTSHAFT_DAY_I != 100 || LIGHTSHAFT_NIGHT_I != 100 || LIGHTSHAFT_RAIN_I != 100
#define LIGHTSHAFT_DAY_IM LIGHTSHAFT_DAY_I * 0.01
#define LIGHTSHAFT_NIGHT_IM LIGHTSHAFT_NIGHT_I * 0.01
#define LIGHTSHAFT_RAIN_IM LIGHTSHAFT_RAIN_I * 0.01
if (isEyeInWater == 0) {
#if LIGHTSHAFT_DAY_I != 100 || LIGHTSHAFT_NIGHT_I != 100
vlColor.rgb *= mix(LIGHTSHAFT_NIGHT_IM, LIGHTSHAFT_DAY_IM, sunVisibility);
#endif
#if LIGHTSHAFT_RAIN_I != 100
vlColor.rgb *= mix(1.0, LIGHTSHAFT_RAIN_IM, rainFactor);
#endif
}
#endif
volumetricLight.rgb *= vlColor;
#endif
volumetricLight.rgb *= vlMult;
volumetricLight = max(volumetricLight, vec4(0.0));
#if defined DISTANT_HORIZONS && defined OVERWORLD
if (isEyeInWater == 0) {
float lViewPosM = lViewPos0;
if (z0 >= 1.0) {
float z0DH = texelFetch(dhDepthTex, texelCoord, 0).r;
vec4 screenPosDH = vec4(texCoord, z0DH, 1.0);
vec4 viewPosDH = dhProjectionInverse * (screenPosDH * 2.0 - 1.0);
viewPosDH /= viewPosDH.w;
lViewPosM = length(viewPosDH.xyz);
}
lViewPosM = min(lViewPosM, renderDistance * 0.6);
float dhVlStillIntense = max(max(vlSceneIntensity, rainFactor), nightFactor * 0.5);
volumetricLight *= mix(0.0003 * lViewPosM, 1.0, dhVlStillIntense);
}
#endif
#ifdef END
#ifndef DISTANT_HORIZONS
volumetricLight *= sqrt1(min1(lViewPos1 * 2.0 / 512.0));
#else
volumetricLight *= min1(lViewPos1 * 3.0 / renderDistance);
#endif
#endif
#if RETRO_LOOK == 1
volumetricLight *= vec4(0.0);
#elif RETRO_LOOK == 2
volumetricLight *= mix(vec4(1.0), vec4(0.0), nightVision);
#endif
return volumetricLight;
}
// Volumetric tracing from Robobo1221, highly modified
#include "/lib/shaderSettings/volumetricLight.glsl"
#include "/lib/shaderSettings/endBeams.glsl"
#include "/lib/shaderSettings/endFlash.glsl"
#include "/lib/colors/lightAndAmbientColors.glsl"
//#define BEDROCK_NOISE
float GetDepth(float depth) {
return 2.0 * near * far / (far + near - (2.0 * depth - 1.0) * (far - near));
}
float GetDistX(float dist) {
return (far * (dist - near)) / (dist * (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 GetVolumetricLight(inout vec3 color, inout float vlFactor, vec3 translucentMult, float lViewPos0, float lViewPos1, vec3 nViewPos, float VdotL, float VdotU, vec2 texCoord, float z0, float z1, float dither) {
vec4 volumetricLight = vec4(0.0);
#if defined BEDROCK_NOISE && defined OVERWORLD
if ((cameraPosition.y < bedrockLevel) && (eyeBrightnessM < 0.4)) return vec4(0.0);
#endif
float vlMult = 1.0 - maxBlindnessDarkness;
#if SHADOW_QUALITY > -1
// Optifine for some reason doesn't provide correct shadowMapResolution if Shadow Quality isn't 1x
vec2 shadowMapResolutionM = textureSize(shadowtex0, 0);
#endif
#ifdef IRIS_FEATURE_FADE_VARIABLE
vec3 texture6 = texelFetch(colortex6, texelCoord, 0).rgb;
float chunkFade = texture6.b > 0.50001 ? (1.0 - texture6.b) * 2.0 : 1.0;
float chunkFadeM = mix(1.0, chunkFade, pow2(clamp01(lViewPos0 * 0.015))); // don't do fade very close to the player
lViewPos1 = mix(far, lViewPos1, chunkFadeM);
#endif
#ifdef OVERWORLD
vec3 vlColor = lightColor;
vec3 vlColorReducer = vec3(1.0);
float vlSceneIntensity = isEyeInWater != 1 ? vlFactor : 1.0;
#ifdef SPECIAL_BIOME_WEATHER
vlSceneIntensity = mix(vlSceneIntensity, 1.0, inDry * rainFactor);
vlColor *= 1.0 + 0.6 * inDry * rainFactor;
#endif
if (sunVisibility < 0.5) {
vlSceneIntensity = 0.0;
float vlMultNightModifier = (0.3 + 0.4 * rainFactor2 + 0.5 * max0(far - lViewPos1) / far);
#ifdef SPECIAL_PALE_GARDEN_LIGHTSHAFTS
vlMultNightModifier = mix(vlMultNightModifier, 1.0, inPaleGarden);
#endif
vlMult *= vlMultNightModifier;
vlColor = normalize(pow(vlColor, vec3(1.0 - max0(1.0 - 1.5 * nightFactor) + rainFactor)));
vlColor *= 0.0766 + 0.0766 * vsBrightness;
} else {
vlColorReducer = 1.0 / sqrt(vlColor);
}
#if BLOOD_MOON > 0
vec3 hsvVlColor = rgb2hsv(vlColor);
vlColor = mix(vlColor, hsv2rgb(vec3(0, max(0.8, hsvVlColor.y), hsvVlColor.z * 1.7)), getBloodMoon(sunVisibility));
#endif
#ifdef SPECIAL_PALE_GARDEN_LIGHTSHAFTS
vlSceneIntensity = mix(vlSceneIntensity, 1.0, inPaleGarden);
vlMult *= 1.0 + (3.0 * inPaleGarden) * (1.0 - sunVisibility);
#endif
float rainyNight = (1.0 - sunVisibility) * rainFactor;
float VdotLM = max((VdotL + 1.0) / 2.0, 0.0);
float VdotUmax0 = max(VdotU, 0.0);
float VdotUM = mix(pow2(1.0 - VdotUmax0), 1.0, 0.5 * vlSceneIntensity);
VdotUM = smoothstep1(VdotUM);
VdotUM = pow(VdotUM, min(lViewPos1 / far, 1.0) * (3.0 - 2.0 * vlSceneIntensity));
vlMult *= mix(VdotUM * VdotLM, 1.0, 0.4 * rainyNight) * vlTime;
vlMult *= mix(invNoonFactor2 * 0.875 + 0.125, 1.0, max(vlSceneIntensity, rainFactor2));
#if LIGHTSHAFT_QUALI == 4
int sampleCount = vlSceneIntensity < 0.5 ? 30 : 50;
#elif LIGHTSHAFT_QUALI == 3
int sampleCount = vlSceneIntensity < 0.5 ? 15 : 30;
#elif LIGHTSHAFT_QUALI == 2
int sampleCount = vlSceneIntensity < 0.5 ? 10 : 20;
#elif LIGHTSHAFT_QUALI == 1
int sampleCount = vlSceneIntensity < 0.5 ? 6 : 12;
#endif
#ifndef TAA
sampleCount *= 2;
#endif
#ifdef LIGHTSHAFT_SMOKE
float totalSmoke = 0.0;
#endif
#else
translucentMult = sqrt(translucentMult); // Because we pow2() the vl result in composite for the End dimension
float vlSceneIntensity = 0.0;
#ifndef LOW_QUALITY_ENDER_NEBULA
int sampleCount = 16;
#else
int sampleCount = 10;
#endif
#endif
float addition = 1.0;
float maxDist = mix(max(far, 96.0) * 0.55, 80.0, vlSceneIntensity);
#if WATER_FOG_MULT != 100
if (isEyeInWater == 1) {
#define WATER_FOG_MULT_M WATER_FOG_MULT * 0.01;
maxDist /= WATER_FOG_MULT_M;
}
#endif
float distMult = maxDist / (sampleCount + addition);
float sampleMultIntense = isEyeInWater != 1 ? 1.0 : 0.85;
float viewFactor = 1.0 - 0.7 * pow2(dot(nViewPos.xy, nViewPos.xy));
float depth0 = GetDepth(z0);
float depth1 = GetDepth(z1);
#ifdef END
if (z0 == 1.0) depth0 = 1000.0;
if (z1 == 1.0) depth1 = 1000.0;
#endif
// Fast but inaccurate perspective distortion approximation
maxDist *= viewFactor;
distMult *= viewFactor;
#ifdef IRIS_FEATURE_FADE_VARIABLE
depth1 = mix(depth1, far, pow2(pow2(1.0 - chunkFadeM)));
#endif
#ifdef OVERWORLD
float maxCurrentDist = min(depth1, maxDist);
#else
float maxCurrentDist = min(depth1, far);
#endif
for (int i = 0; i < sampleCount; i++) {
float currentDist = (i + dither) * distMult + addition;
if (currentDist > maxCurrentDist) break;
vec4 viewPos = gbufferProjectionInverse * (vec4(texCoord, GetDistX(currentDist), 1.0) * 2.0 - 1.0);
viewPos /= viewPos.w;
vec4 wpos = gbufferModelViewInverse * viewPos;
vec3 playerPos = wpos.xyz / wpos.w;
#if defined END && defined END_BEAMS
playerPos *= 512.0 / far;
vec4 enderBeamSample = vec4(DrawEnderBeams(VdotU, playerPos, nViewPos), 1.0);
enderBeamSample /= sampleCount;
#endif
#if defined OVERWORLD && defined OVERWORLD_BEAMS
vec4 overworldBeamSample = DrawOverworldBeams(VdotU, playerPos, viewPos.xyz);
#endif
float shadowSample = 1.0;
vec3 vlSample = vec3(1.0);
#if SHADOW_QUALITY > -1
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;
vec4 shadowPosition = DistortShadow(wpos,distortFactor);
//shadowPosition.z += 0.0001;
#ifdef OVERWORLD
float percentComplete = currentDist / maxDist;
float sampleMult = mix(percentComplete * 3.0, sampleMultIntense, max(rainFactor, vlSceneIntensity));
if (currentDist < 5.0) sampleMult *= smoothstep1(clamp(currentDist / 5.0, 0.0, 1.0));
sampleMult /= sampleCount;
#endif
if (length(shadowPosition.xy * 2.0 - 1.0) < 1.0) {
// 28A3DK6 We need to use texelFetch here or a lot of Nvidia GPUs can't get a valid value
shadowSample = texelFetch(shadowtex0, ivec2(shadowPosition.xy * shadowMapResolutionM), 0).x;
shadowSample = clamp((shadowSample-shadowPosition.z)*65536.0,0.0,1.0);
vlSample = vec3(shadowSample);
#ifdef END_FLASH_SHADOW_INTERNAL
vlSample = mix(vec3(1.0), vlSample, endFlashIntensity);
#endif
#if SHADOW_QUALITY >= 1
if (shadowSample == 0.0) {
float testsample = shadow2D(shadowtex1, shadowPosition.xyz).z;
if (testsample == 1.0) {
vec3 colsample = texture2D(shadowcolor1, shadowPosition.xy).rgb * 4.0;
colsample *= colsample;
vlSample = colsample;
shadowSample = 1.0;
#ifdef OVERWORLD
vlSample *= vlColorReducer;
#endif
}
} else {
#ifdef OVERWORLD
// For water-tinting the water surface when observed from below the surface
if (translucentMult != vec3(1.0) && currentDist > depth0) {
vec3 tinter = vec3(1.0);
if (isEyeInWater == 1) {
vec3 translucentMultM = translucentMult * 2.8;
tinter = pow(translucentMultM, vec3(sunVisibility * 3.0 * clamp01(playerPos.y * 0.03)));
} else {
tinter = 0.1 + 0.9 * pow2(pow2(translucentMult * 1.7));
}
vlSample *= mix(vec3(1.0), tinter, clamp01(oceanAltitude - cameraPosition.y));
}
#endif
if (isEyeInWater == 1 && translucentMult == vec3(1.0)) vlSample = vec3(0.0);
}
#endif
}
#endif
if (currentDist > depth0) vlSample *= translucentMult;
#ifdef OVERWORLD
#ifdef LIGHTSHAFT_SMOKE
vec3 smokePos = 0.0015 * (playerPos + cameraPosition);
vec3 smokeWind = frameTimeCounter * vec3(0.0, 0.001, -0.002);
float smoke = 0.65 * Noise3D(smokePos + smokeWind)
+ 0.25 * Noise3D((smokePos - smokeWind) * 3.0)
+ 0.10 * Noise3D((smokePos + smokeWind) * 9.0);
smoke = smoothstep1(smoothstep1(smoothstep1(smoke)));
totalSmoke += smoke * shadowSample * sampleMult;
#endif
vec4 volumetricLightAdd = vec4(vlSample, shadowSample) * sampleMult;
#ifdef OVERWORLD_BEAMS
volumetricLight += volumetricLightAdd * mix(vec4(1.0), overworldBeamSample, overworldBeamSample.a);
#else
volumetricLight += volumetricLightAdd;
#endif
#else
#ifdef END_BEAMS
volumetricLight += vec4(vlSample, shadowSample) * enderBeamSample;
#endif
#endif
}
#ifdef LIGHTSHAFT_SMOKE
volumetricLight *= pow(totalSmoke / volumetricLight.a, min(1.0 - volumetricLight.a, 0.5));
volumetricLight.rgb /= pow(0.5, 1.0 - volumetricLight.a);
#endif
// Decision of Intensity for Scene Aware Light Shafts //
#if defined OVERWORLD && LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1
if (viewWidth + viewHeight - gl_FragCoord.x - gl_FragCoord.y < 1.5) {
if (frameCounter % int(0.06666 / frameTimeSmooth + 0.5) == 0) { // Change speed is not too different above 10 fps
int salsX = 5;
int salsY = 5;
float heightThreshold = 6.0;
vec2 viewM = 1.0 / vec2(salsX, salsY);
float salsSampleSum = 0.0;
int salsSampleCount = 0;
for (float i = 0.25; i < salsX; i++) {
for (float h = 0.45; h < salsY; h++) {
vec2 coord = 0.3 + 0.4 * viewM * vec2(i, h);
ivec2 icoord = ivec2(coord * shadowMapResolutionM);
float salsSample = texelFetch(shadowtex0, icoord, 0).x; // read 28A3DK6
if (salsSample < 0.55) {
float sampledHeight = texture2D(shadowcolor1, coord).a;
if (sampledHeight > 0.0) {
sampledHeight = max0(sampledHeight - 0.25) / 0.05; // consistencyMEJHRI7DG
salsSampleSum += sampledHeight;
salsSampleCount++;
}
}
}
}
float salsCheck = salsSampleSum / salsSampleCount;
int reduceAmount = 2;
int skyCheck = 0;
for (float i = 0.1; i < 1.0; i += 0.2) {
skyCheck += int(texelFetch(depthtex0, ivec2(view.x * i, view.y * 0.9), 0).x == 1.0);
}
if (skyCheck >= 4) {
salsCheck = 0.0;
reduceAmount = 3;
}
if (salsCheck > heightThreshold) {
vlFactor = min(vlFactor + OSIEBCA, 1.0);
} else {
vlFactor = max(vlFactor - OSIEBCA * reduceAmount, 0.0);
}
}
} else vlFactor = 0.0;
//if (gl_FragCoord.y < 50) color.rgb = vec3(1,0,1) * float(salsCheck / heightThreshold > gl_FragCoord.x / 1920.0);
/*for (float i = 0.25; i < salsX; i++) {
for (float h = 0.45; h < salsY; h++) {
if (length(texCoord - (0.3 + 0.4 * viewM * vec2(i, h))) < 0.01) return vec4(1,0,1,1);
}
}*/
#endif
#ifdef OVERWORLD
vlColor = pow(vlColor, vec3(0.5 + (0.5 + LIGHTSHAFT_SUNSET_SATURATION * sunVisibility) * invNoonFactor * invRainFactor + 0.3 * rainFactor));
vlColor *= 1.0 - (0.3 + 0.3 * noonFactor) * rainFactor - 0.5 * rainyNight + sunVisibility * pow2(invNoonFactor) * invRainFactor;
#if LIGHTSHAFT_DAY_I != 100 || LIGHTSHAFT_NIGHT_I != 100 || LIGHTSHAFT_RAIN_I != 100
#define LIGHTSHAFT_DAY_IM LIGHTSHAFT_DAY_I * 0.01
#define LIGHTSHAFT_NIGHT_IM LIGHTSHAFT_NIGHT_I * 0.01
#define LIGHTSHAFT_RAIN_IM LIGHTSHAFT_RAIN_I * 0.01
if (isEyeInWater == 0) {
#if LIGHTSHAFT_DAY_I != 100 || LIGHTSHAFT_NIGHT_I != 100
vlColor.rgb *= mix(LIGHTSHAFT_NIGHT_IM, LIGHTSHAFT_DAY_IM, sunVisibility);
#endif
#if LIGHTSHAFT_RAIN_I != 100
vlColor.rgb *= mix(1.0, LIGHTSHAFT_RAIN_IM, rainFactor);
#endif
}
#endif
volumetricLight.rgb *= vlColor;
#endif
volumetricLight.rgb *= vlMult;
volumetricLight = max(volumetricLight, vec4(0.0));
#if defined DISTANT_HORIZONS && defined OVERWORLD
if (isEyeInWater == 0) {
float lViewPosM = lViewPos0;
if (z0 >= 1.0) {
float z0DH = texelFetch(dhDepthTex, texelCoord, 0).r;
vec4 screenPosDH = vec4(texCoord, z0DH, 1.0);
vec4 viewPosDH = dhProjectionInverse * (screenPosDH * 2.0 - 1.0);
viewPosDH /= viewPosDH.w;
lViewPosM = length(viewPosDH.xyz);
}
lViewPosM = min(lViewPosM, renderDistance * 0.6);
float dhVlStillIntense = max(max(vlSceneIntensity, rainFactor), nightFactor * 0.5);
volumetricLight *= mix(0.0003 * lViewPosM, 1.0, dhVlStillIntense);
}
#endif
#ifdef END
#ifndef DISTANT_HORIZONS
volumetricLight *= sqrt1(min1(lViewPos1 * 2.0 / 512.0));
#else
volumetricLight *= min1(lViewPos1 * 3.0 / renderDistance);
#endif
#endif
#if RETRO_LOOK == 1
volumetricLight *= vec4(0.0);
#elif RETRO_LOOK == 2
volumetricLight *= mix(vec4(1.0), vec4(0.0), nightVision);
#endif
return volumetricLight;
}
@@ -1,14 +1,14 @@
#include "/lib/shaderSettings/materials.glsl"
#define BASE_BLOCKLIGHT (vec3(0.1775, 0.104, 0.077) * vec3(XLIGHT_R, XLIGHT_G, XLIGHT_B))
#define SOUL_VALLEY_COLOR vec3(0.05, 0.22, 0.25)
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
vec3 blocklightCol = mix(BASE_BLOCKLIGHT, SOUL_VALLEY_COLOR, inSoulValley);
#else
vec3 blocklightCol = BASE_BLOCKLIGHT;
#endif
#if COLORED_LIGHTING_INTERNAL > 0
#include "/lib/colors/blocklightColorsACT.glsl"
#endif
#include "/lib/shaderSettings/materials.glsl"
#define BASE_BLOCKLIGHT (vec3(0.1775, 0.104, 0.077) * vec3(XLIGHT_R, XLIGHT_G, XLIGHT_B))
#define SOUL_VALLEY_COLOR vec3(0.05, 0.22, 0.25)
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
vec3 blocklightCol = mix(BASE_BLOCKLIGHT, SOUL_VALLEY_COLOR, inSoulValley);
#else
vec3 blocklightCol = BASE_BLOCKLIGHT;
#endif
#if COLORED_LIGHTING_INTERNAL > 0
#include "/lib/colors/blocklightColorsACT.glsl"
#endif
@@ -1,305 +1,305 @@
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
vec3 fireSpecialLightColorGradient = mix(vec3(2.0, 0.87, 0.27) * 3.8, mix(vec3(2.5, 0.87, 0.27), vec3(0.5, 1.9, 2.1) * 3.8, 0.3), inSoulValley);
vec3 torchBlockSpecialLightColor = mix(vec3(2.0, 0.87, 0.27) * 3.8, mix(vec3(2.5, 0.87, 0.27), vec3(0.5, 1.9, 2.1) * 3.8, 0.5), inSoulValley);
vec3 lanternBlockSpecialLightColor = mix(vec3(2.0, 0.87, 0.27) * 3.8, mix(vec3(2.5, 0.87, 0.27), vec3(0.5, 1.9, 2.1) * 3.8, 0.4), inSoulValley);
vec3 fireSpecialLightColor = mix(vec3(2.25, 0.83, 0.27) * 3.7, vec3(0.5, 1.9, 2.1) * 3.8, inSoulValley);
vec4 lavaSpecialLightColor = vec4(mix(vec3(3.25, 0.9, 0.2) * 3.9, vec3(0.5, 1.9, 2.1) * 4.0, inSoulValley), 0.8);
vec4 brewingStandSpecialLightColor = vec4(mix(vec3(2.5, 1.2, 0.4) * 0.1, vec3(0.5, 1.9, 2.1) * 0.1, inSoulValley), 0.1);
#elif defined PURPLE_END_FIRE_INTERNAL
vec3 fireSpecialLightColor = vec3(0.6, 0.3, 2.4) * 3.8;
vec3 fireSpecialLightColorGradient = mix(vec3(2.0, 0.77, 0.17) * 3.8, fireSpecialLightColor, clamp01(0.7 + max(0.0, clamp01(sin(pow2(texture2DLod(noisetex, vec2(frameTimeCounter * 0.01), 0.0).r))))));
vec3 torchBlockSpecialLightColor = mix(vec3(2.0, 0.87, 0.27), fireSpecialLightColor, clamp01(0.75)); // Super odd intel nan fix
vec3 lanternBlockSpecialLightColor = fireSpecialLightColor;
vec4 lavaSpecialLightColor = vec4(vec3(1.0, 0.5, 4.0) * 4.0, 0.8);
vec4 brewingStandSpecialLightColor = vec4(vec3(0.10, 0.05, 0.4) * 0.4, 0.1);
#else
vec3 fireSpecialLightColor = vec3(2.25, 0.83, 0.27) * 3.7;
vec3 fireSpecialLightColorGradient = fireSpecialLightColor;
vec3 torchBlockSpecialLightColor = fireSpecialLightColor;
vec3 lanternBlockSpecialLightColor = fireSpecialLightColor;
vec4 lavaSpecialLightColor = vec4(vec3(3.25, 0.9, 0.2) * 3.9, 0.8);
vec4 brewingStandSpecialLightColor = vec4(vec3(2.5, 1.2, 0.4) * 0.1, 0.1);
#endif
#if defined NETHER && defined BIOME_COLORED_NETHER_PORTALS
vec3 netherPortalSpecialLightColor = normalize(netherColor) * 2.0;
vec3 respawnAnchorSpecialLightColor = normalize(netherColor) * 2.0;
#else
vec3 netherPortalSpecialLightColor = vec3(1.8, 0.4, 2.2) * 0.8;
vec3 respawnAnchorSpecialLightColor = vec3(1.7, 0.9, 0.4) * 2.0;
#endif
vec3 redstoneSpecialLightColor = vec3(4.0, 0.1, 0.1);
vec4 soulFireSpecialColor = vec4(vec3(0.3, 2.0, 2.2) * 1.0, 0.3);
float candleColorMult = 2.0;
float candleExtraLight = 0.004;
#if END_ROD_COLOR_PROFILE == 1
vec3 endRodSpacialColor = vec3(END_ROD_R, END_ROD_G, END_ROD_B) / 255 * END_ROD_I;
#elif (END_ROD_COLOR_PROFILE == 2 || (END_ROD_COLOR_PROFILE == 3 && defined OVERWORLD)) && COLORED_LIGHTING_INTERNAL > 0
vec3 endRodSpacialColor = vec3(pow2(getRainbowColor(vec2(0.0), float(END_ROD_RAINBOW_ANIMATE))));
#else
#ifdef END
vec3 endRodSpacialColor = vec3(1.25, 0.5, 1.25); // End Rod in the End dimension
#else
vec3 endRodSpacialColor = vec3(1.0, 1.0, 1.0);
#endif
#endif
#ifdef EMISSIVE_ENCHANTING_TABLE
vec3 enchantingTableSpecialLightColor = vec3(0.5, 2.0, 2.0) * 0.4;
#else
vec3 enchantingTableSpecialLightColor = vec3(1.4, 1.1, 0.5);
#endif
void AddSpecialLightDetail(inout vec3 light, vec3 albedo, float emission) {
vec3 lightM = max(light, vec3(0.0));
lightM /= (0.2 + 0.8 * GetLuminance(lightM));
lightM *= (1.0 / (1.0 + emission)) * 0.22;
light *= 0.9;
light += pow2(lightM / (albedo + 0.1));
}
vec4 GetSpecialBlocklightColor(int mat) {
/* Please note that these colors do not determine the intensity of the
final light. Instead; higher values of color change how long the color
will travel, and also how dominant it will be next to other colors.*/
/* Additional feature: An alpha value bigger than 0 will make that
block cast extra light regardless of the vanilla lightmap. Use this
with caution though because our floodfill isn't as accurate as vanilla.*/
if (mat < 50) {
if (mat < 26) {
if (mat < 14) {
if (mat < 8) {
if (mat < 5) {
if (mat == 2) return vec4(torchBlockSpecialLightColor, 0.0); // Torch
if (mat == 3) return vec4(endRodSpacialColor * 4.0, 0.0); // End Rod - This is the base for all lights. Total value 12. vec3(1.0, 1.0, 1.0) * 4.0
if (mat == 4) return vec4(vec3(0.7, 1.5, 2.0) * 3.0, 0.0); // Beacon
} else {
if (mat == 5) return vec4(fireSpecialLightColorGradient, 0.0); // Fire
if (mat == 6) return vec4(vec3(0.7, 1.5, 1.5) * 1.7, 0.0); // Sea Pickle:Waterlogged
if (mat == 7) return vec4(pow(vec3(1.1, 0.85, 0.35), vec3(FROGLIGHT_SATURATION * 0.5 + 0.5)) * 5.0, 0.0); // Ochre Froglight
}
} else {
if (mat < 11) {
if (mat == 8) return vec4(pow(vec3(0.6, 1.3, 0.6), vec3(FROGLIGHT_SATURATION * 0.5 + 0.5)) * 4.5, 0.0); // Verdant Froglight
if (mat == 9) return vec4(pow(vec3(1.1, 0.5, 0.9), vec3(FROGLIGHT_SATURATION * 0.5 + 0.5)) * 4.5, 0.0); // Pearlescent Froglight
if (mat == 10) return vec4(vec3(1.7, 0.9, 0.4) * 4.0, 0.0); // Glowstone
} else {
if (mat == 11) return vec4(fireSpecialLightColor, 0.0); // Jack o'Lantern
if (mat == 12) return vec4(lanternBlockSpecialLightColor, 0.0); // Lantern
if (mat == 13) return lavaSpecialLightColor; // Lava
}
}
} else {
if (mat < 20) {
if (mat < 17) {
if (mat == 14) return vec4(lavaSpecialLightColor.rgb, 0.0); // Lava Cauldron
if (mat == 15) return vec4(fireSpecialLightColorGradient, 0.0); // Campfire:Lit
if (mat == 16) return vec4(vec3(1.7, 0.9, 0.4) * 4.0, 0.0); // Redstone Lamp:Lit
} else {
if (mat == 17) return vec4(respawnAnchorSpecialLightColor, 0.0); // Respawn Anchor:Lit
if (mat == 18) return vec4(vec3(1.0, 1.25, 1.5) * 3.4, 0.0); // Sea Lantern
if (mat == 19) return vec4(vec3(3.0, 0.9, 0.2) * 3.0, 0.0); // Shroomlight
}
} else {
if (mat < 23) {
if (mat == 20) return vec4(vec3(2.3, 0.9, 0.2) * 3.4, 0.0); // Cave Vines:With Glow Berries
if (mat == 21) return vec4(fireSpecialLightColor * 0.7, 0.0); // Furnace:Lit
if (mat == 22) return vec4(fireSpecialLightColor * 0.7, 0.0); // Smoker:Lit
} else {
if (mat == 23) return vec4(fireSpecialLightColor * 0.7, 0.0); // Blast Furnace:Lit
if (mat == 24) return vec4(fireSpecialLightColor * 0.25 * candleColorMult, candleExtraLight); // Standard Candles:Lit
if (mat == 25) return vec4(netherPortalSpecialLightColor * 2.0, 0.4); // Nether Portal
}
}
}
} else {
if (mat < 38) {
if (mat < 32) {
if (mat < 29) {
if (mat == 26) return vec4(netherPortalSpecialLightColor, 0.0); // Crying Obsidian
if (mat == 27) return soulFireSpecialColor; // Soul Fire
if (mat == 28) return soulFireSpecialColor; // Soul Torch
} else {
if (mat == 29) return soulFireSpecialColor; // Soul Lantern
if (mat == 30) return soulFireSpecialColor; // Soul Campfire:Lit
if (mat == 31) return vec4(redstoneSpecialLightColor * 0.5, 0.1 * ACT_ORE_INTENSITY); // Redstone Ores:Lit
}
} else {
if (mat < 35) {
if (mat == 32) return vec4(redstoneSpecialLightColor * 0.3, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Redstone Ores:Unlit
if (mat == 33) return vec4(enchantingTableSpecialLightColor, 0.05); // Enchanting Table
#if GLOWING_LICHEN > 0
if (mat == 34) return vec4(vec3(0.8, 1.1, 1.1), 0.05); // Glow Lichen with IntegratedPBR
#else
if (mat == 34) return vec4(vec3(0.4, 0.55, 0.55), 0.0); // Glow Lichen vanilla
#endif
} else {
if (mat == 35) return vec4(redstoneSpecialLightColor * 0.25, 0.0); // Redstone Torch
if (mat == 36) return vec4(vec3(0.325, 0.15, 0.425) * 2.0, 0.05); // Amethyst Cluster, Amethyst Buds, Calibrated Sculk Sensor
if (mat == 37) return vec4(lavaSpecialLightColor.rgb * 0.1, 0.1); // Magma Block
}
}
} else {
if (mat < 44) {
if (mat < 41) {
#ifdef EMISSIVE_DRAGON_EGG
if (mat == 38) return vec4(vec3(2.0, 0.5, 1.5) * 0.3, 0.1); // Dragon Egg
#endif
if (mat == 39) return vec4(vec3(2.0, 1.0, 1.5) * 0.25, 0.1); // Chorus Flower
if (mat == 40) return brewingStandSpecialLightColor; // Brewing Stand
} else {
if (mat == 41) return vec4(redstoneSpecialLightColor * 0.4, 0.15); // Redstone Block
if (mat == 42) return vec4(vec3(0.75, 0.75, 3.0) * 0.277, 0.15); // Lapis Block
if (mat == 43) return vec4(vec3(1.7, 0.9, 0.4) * 0.45, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Iron Ores
}
} else {
if (mat < 47) {
if (mat == 44) return vec4(vec3(1.7, 1.1, 0.2) * 0.45, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Gold Ores
if (mat == 45) return vec4(vec3(1.7, 0.8, 0.4) * 0.45, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Copper Ores
if (mat == 46) return vec4(vec3(0.75, 0.75, 3.0) * 0.2, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Lapis Ores
} else {
if (mat == 47) return vec4(vec3(0.5, 3.5, 0.5) * 0.3, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Emerald Ores
if (mat == 48) return vec4(vec3(0.5, 2.0, 2.0) * 0.4, 0.15 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Diamond Ores
if (mat == 49) return vec4(vec3(1.5, 1.5, 1.5) * 0.3, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Nether Quartz Ore
}
}
}
}
} else {
if (mat < 74) {
if (mat < 62) {
if (mat < 56) {
if (mat < 53) {
if (mat == 50) return vec4(vec3(1.7, 1.1, 0.2) * 0.45, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Nether Gold Ore
if (mat == 51) return vec4(vec3(1.7, 1.1, 0.2) * 0.45, 0.05); // Gilded Blackstone
if (mat == 52) return vec4(vec3(1.8, 0.8, 0.4) * 0.6, 0.15); // Ancient Debris
} else {
if (mat == 53) return vec4(vec3(1.4, 0.2, 1.4) * 0.3, 0.05); // Spawner
if (mat == 54) return vec4(vec3(3.1, 1.1, 0.3) * 1.0, 0.1); // Trial Spawner:NotOminous:Active, Vault:NotOminous:Active
if (mat == 55) return vec4(vec3(1.7, 0.9, 0.4) * 4.0, 0.0); // Copper Bulb:BrighterOnes:Lit
}
} else {
if (mat < 59) {
if (mat == 56) return vec4(vec3(1.7, 0.9, 0.4) * 2.0, 0.0); // Copper Bulb:DimmerOnes:Lit
if (mat == 57) return vec4(vec3(0.1, 0.3, 0.4) * 0.5, 0.0005); // Sculk++
if (mat == 58) return vec4(vec3(0.0, 1.4, 1.4) * 4.0, 0.15); // End Portal Frame:Active
} else {
if (mat == 59) return vec4(0.0); // Bedrock
if (mat == 60) return vec4(vec3(3.1, 1.1, 0.3) * 0.125, 0.0125); // Command Block
if (mat == 61) return vec4(vec3(3.0, 0.9, 0.2) * 0.125, 0.0125); // Warped Fungus, Crimson Fungus
}
}
} else {
if (mat < 68) {
if (mat < 65) {
if (mat == 62) return vec4(vec3(3.5, 0.6, 0.4) * 0.3, 0.05); // Crimson Stem, Crimson Hyphae
if (mat == 63) return vec4(vec3(0.3, 1.9, 1.5) * 0.3, 0.05); // Warped Stem, Warped Hyphae
if (mat == 64) return vec4(vec3(1.0, 1.0, 1.0) * 0.45, 0.1); // Structure Block, Jigsaw Block, Test Block, Test Instance Block
} else {
if (mat == 65) return vec4(vec3(3.0, 0.9, 0.2) * 0.125, 0.0125); // Weeping Vines Plant
if (mat == 66) return vec4(redstoneSpecialLightColor * 0.05, 0.002); // Redstone Wire:Lit, Comparator:Unlit:Subtract
if (mat == 67) return vec4(redstoneSpecialLightColor * 0.125, 0.0125); // Repeater:Lit, Comparator:Lit
}
} else {
if (mat < 71) {
if (mat == 68) return vec4(vec3(0.75), 0.0); // Vault:Inactive
if (mat == 69) return vec4(vec3(1.3, 1.6, 1.6) * 1.0, 0.1); // Trial Spawner:Ominous:Active, Vault:Ominous:Active
if (mat == 70) return vec4(vec3(1.0, 0.1, 0.1) * candleColorMult, candleExtraLight); // Red Candles:Lit
} else {
if (mat == 71) return vec4(vec3(1.0, 0.4, 0.1) * candleColorMult, candleExtraLight); // Orange Candles:Lit
if (mat == 72) return vec4(vec3(1.0, 1.0, 0.1) * candleColorMult, candleExtraLight); // Yellow Candles:Lit
if (mat == 73) return vec4(vec3(0.1, 1.0, 0.1) * candleColorMult, candleExtraLight); // Lime Candles:Lit
}
}
}
} else {
if (mat < 86) {
if (mat < 80) {
if (mat < 77) {
if (mat == 74) return vec4(vec3(0.3, 1.0, 0.3) * candleColorMult, candleExtraLight); // Green Candles:Lit
if (mat == 75) return vec4(vec3(0.3, 0.8, 1.0) * candleColorMult, candleExtraLight); // Cyan Candles:Lit
if (mat == 76) return vec4(vec3(0.5, 0.65, 1.0) * candleColorMult, candleExtraLight); // Light Blue Candles:Lit
} else {
if (mat == 77) return vec4(vec3(0.1, 0.15, 1.0) * candleColorMult, candleExtraLight); // Blue Candles:Lit
if (mat == 78) return vec4(vec3(0.7, 0.3, 1.0) * candleColorMult, candleExtraLight); // Purple Candles:Lit
if (mat == 79) return vec4(vec3(1.0, 0.1, 1.0) * candleColorMult, candleExtraLight); // Magenta Candles:Lit
}
} else {
if (mat < 83) {
if (mat == 80) return vec4(vec3(1.0, 0.4, 1.0) * candleColorMult, candleExtraLight); // Pink Candles:Lit
if (mat == 81) return vec4(vec3(2.8, 1.1, 0.2) * 0.125, 0.0125); // Open Eyeblossom
if (mat == 82) return vec4(vec3(2.8, 1.1, 0.2) * 0.3, 0.05); // Creaking Heart: Active
} else {
if (mat == 83) return vec4(vec3(1.6, 1.6, 0.7) * 0.3, 0.05); // Firefly Bush
if (mat == 84) return vec4(vec3(0.85, 1.3, 1.0) * 3.9, 0.0); // Copper Torch, Copper Lantern
if (mat == 85) return vec4(0.0);
}
}
} else {
if (mat < 92) {
if (mat < 89) {
if (mat == 86) return vec4(0.0);
if (mat == 87) return vec4(0.0);
if (mat == 88) return vec4(0.0);
} else {
if (mat == 89) return vec4(0.0);
if (mat == 90) return vec4(0.0);
if (mat == 91) return vec4(0.0);
}
} else {
if (mat < 95) {
if (mat == 92) return vec4(0.0);
if (mat == 93) return vec4(0.0);
if (mat == 94) return vec4(0.0);
} else {
if (mat == 95) return vec4(0.0);
if (mat == 96) return vec4(0.0);
if (mat == 97) return vec4(vec3(1.0, 1.0, 1.0) * 4.0, candleExtraLight); // Modded White Light Source
}
}
}
}
}
return vec4(blocklightCol * 20.0, 0.0);
}
vec3[] specialTintColor = vec3[](
// 200: White
vec3(1.0),
// 201: Orange
vec3(1.0, 0.3, 0.1),
// 202: Magenta
vec3(1.0, 0.1, 1.0),
// 203: Light Blue
vec3(0.5, 0.65, 1.0),
// 204: Yellow
vec3(1.0, 1.0, 0.1),
// 205: Lime
vec3(0.1, 1.0, 0.1),
// 206: Pink
vec3(1.0, 0.4, 1.0),
// 207: Gray
vec3(1.0),
// 208: Light Gray
vec3(1.0),
// 209: Cyan
vec3(0.3, 0.8, 1.0),
// 210: Purple
vec3(0.7, 0.3, 1.0),
// 211: Blue
vec3(0.1, 0.15, 1.0),
// 212: Brown
vec3(1.0, 0.75, 0.5),
// 213: Green
vec3(0.3, 1.0, 0.3),
// 214: Red
vec3(1.0, 0.1, 0.1),
// 215: Black
vec3(1.0),
// 216: Ice
vec3(0.5, 0.65, 1.0),
// 217: Glass
vec3(1.0),
// 218: Glass Pane
vec3(1.0),
// 219++
vec3(0.0)
);
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
vec3 fireSpecialLightColorGradient = mix(vec3(2.0, 0.87, 0.27) * 3.8, mix(vec3(2.5, 0.87, 0.27), vec3(0.5, 1.9, 2.1) * 3.8, 0.3), inSoulValley);
vec3 torchBlockSpecialLightColor = mix(vec3(2.0, 0.87, 0.27) * 3.8, mix(vec3(2.5, 0.87, 0.27), vec3(0.5, 1.9, 2.1) * 3.8, 0.5), inSoulValley);
vec3 lanternBlockSpecialLightColor = mix(vec3(2.0, 0.87, 0.27) * 3.8, mix(vec3(2.5, 0.87, 0.27), vec3(0.5, 1.9, 2.1) * 3.8, 0.4), inSoulValley);
vec3 fireSpecialLightColor = mix(vec3(2.25, 0.83, 0.27) * 3.7, vec3(0.5, 1.9, 2.1) * 3.8, inSoulValley);
vec4 lavaSpecialLightColor = vec4(mix(vec3(3.25, 0.9, 0.2) * 3.9, vec3(0.5, 1.9, 2.1) * 4.0, inSoulValley), 0.8);
vec4 brewingStandSpecialLightColor = vec4(mix(vec3(2.5, 1.2, 0.4) * 0.1, vec3(0.5, 1.9, 2.1) * 0.1, inSoulValley), 0.1);
#elif defined PURPLE_END_FIRE_INTERNAL
vec3 fireSpecialLightColor = vec3(0.6, 0.3, 2.4) * 3.8;
vec3 fireSpecialLightColorGradient = mix(vec3(2.0, 0.77, 0.17) * 3.8, fireSpecialLightColor, clamp01(0.7 + max(0.0, clamp01(sin(pow2(texture2DLod(noisetex, vec2(frameTimeCounter * 0.01), 0.0).r))))));
vec3 torchBlockSpecialLightColor = mix(vec3(2.0, 0.87, 0.27), fireSpecialLightColor, clamp01(0.75)); // Super odd intel nan fix
vec3 lanternBlockSpecialLightColor = fireSpecialLightColor;
vec4 lavaSpecialLightColor = vec4(vec3(1.0, 0.5, 4.0) * 4.0, 0.8);
vec4 brewingStandSpecialLightColor = vec4(vec3(0.10, 0.05, 0.4) * 0.4, 0.1);
#else
vec3 fireSpecialLightColor = vec3(2.25, 0.83, 0.27) * 3.7;
vec3 fireSpecialLightColorGradient = fireSpecialLightColor;
vec3 torchBlockSpecialLightColor = fireSpecialLightColor;
vec3 lanternBlockSpecialLightColor = fireSpecialLightColor;
vec4 lavaSpecialLightColor = vec4(vec3(3.25, 0.9, 0.2) * 3.9, 0.8);
vec4 brewingStandSpecialLightColor = vec4(vec3(2.5, 1.2, 0.4) * 0.1, 0.1);
#endif
#if defined NETHER && defined BIOME_COLORED_NETHER_PORTALS
vec3 netherPortalSpecialLightColor = normalize(netherColor) * 2.0;
vec3 respawnAnchorSpecialLightColor = normalize(netherColor) * 2.0;
#else
vec3 netherPortalSpecialLightColor = vec3(1.8, 0.4, 2.2) * 0.8;
vec3 respawnAnchorSpecialLightColor = vec3(1.7, 0.9, 0.4) * 2.0;
#endif
vec3 redstoneSpecialLightColor = vec3(4.0, 0.1, 0.1);
vec4 soulFireSpecialColor = vec4(vec3(0.3, 2.0, 2.2) * 1.0, 0.3);
float candleColorMult = 2.0;
float candleExtraLight = 0.004;
#if END_ROD_COLOR_PROFILE == 1
vec3 endRodSpacialColor = vec3(END_ROD_R, END_ROD_G, END_ROD_B) / 255 * END_ROD_I;
#elif (END_ROD_COLOR_PROFILE == 2 || (END_ROD_COLOR_PROFILE == 3 && defined OVERWORLD)) && COLORED_LIGHTING_INTERNAL > 0
vec3 endRodSpacialColor = vec3(pow2(getRainbowColor(vec2(0.0), float(END_ROD_RAINBOW_ANIMATE))));
#else
#ifdef END
vec3 endRodSpacialColor = vec3(1.25, 0.5, 1.25); // End Rod in the End dimension
#else
vec3 endRodSpacialColor = vec3(1.0, 1.0, 1.0);
#endif
#endif
#ifdef EMISSIVE_ENCHANTING_TABLE
vec3 enchantingTableSpecialLightColor = vec3(0.5, 2.0, 2.0) * 0.4;
#else
vec3 enchantingTableSpecialLightColor = vec3(1.4, 1.1, 0.5);
#endif
void AddSpecialLightDetail(inout vec3 light, vec3 albedo, float emission) {
vec3 lightM = max(light, vec3(0.0));
lightM /= (0.2 + 0.8 * GetLuminance(lightM));
lightM *= (1.0 / (1.0 + emission)) * 0.22;
light *= 0.9;
light += pow2(lightM / (albedo + 0.1));
}
vec4 GetSpecialBlocklightColor(int mat) {
/* Please note that these colors do not determine the intensity of the
final light. Instead; higher values of color change how long the color
will travel, and also how dominant it will be next to other colors.*/
/* Additional feature: An alpha value bigger than 0 will make that
block cast extra light regardless of the vanilla lightmap. Use this
with caution though because our floodfill isn't as accurate as vanilla.*/
if (mat < 50) {
if (mat < 26) {
if (mat < 14) {
if (mat < 8) {
if (mat < 5) {
if (mat == 2) return vec4(torchBlockSpecialLightColor, 0.0); // Torch
if (mat == 3) return vec4(endRodSpacialColor * 4.0, 0.0); // End Rod - This is the base for all lights. Total value 12. vec3(1.0, 1.0, 1.0) * 4.0
if (mat == 4) return vec4(vec3(0.7, 1.5, 2.0) * 3.0, 0.0); // Beacon
} else {
if (mat == 5) return vec4(fireSpecialLightColorGradient, 0.0); // Fire
if (mat == 6) return vec4(vec3(0.7, 1.5, 1.5) * 1.7, 0.0); // Sea Pickle:Waterlogged
if (mat == 7) return vec4(pow(vec3(1.1, 0.85, 0.35), vec3(FROGLIGHT_SATURATION * 0.5 + 0.5)) * 5.0, 0.0); // Ochre Froglight
}
} else {
if (mat < 11) {
if (mat == 8) return vec4(pow(vec3(0.6, 1.3, 0.6), vec3(FROGLIGHT_SATURATION * 0.5 + 0.5)) * 4.5, 0.0); // Verdant Froglight
if (mat == 9) return vec4(pow(vec3(1.1, 0.5, 0.9), vec3(FROGLIGHT_SATURATION * 0.5 + 0.5)) * 4.5, 0.0); // Pearlescent Froglight
if (mat == 10) return vec4(vec3(1.7, 0.9, 0.4) * 4.0, 0.0); // Glowstone
} else {
if (mat == 11) return vec4(fireSpecialLightColor, 0.0); // Jack o'Lantern
if (mat == 12) return vec4(lanternBlockSpecialLightColor, 0.0); // Lantern
if (mat == 13) return lavaSpecialLightColor; // Lava
}
}
} else {
if (mat < 20) {
if (mat < 17) {
if (mat == 14) return vec4(lavaSpecialLightColor.rgb, 0.0); // Lava Cauldron
if (mat == 15) return vec4(fireSpecialLightColorGradient, 0.0); // Campfire:Lit
if (mat == 16) return vec4(vec3(1.7, 0.9, 0.4) * 4.0, 0.0); // Redstone Lamp:Lit
} else {
if (mat == 17) return vec4(respawnAnchorSpecialLightColor, 0.0); // Respawn Anchor:Lit
if (mat == 18) return vec4(vec3(1.0, 1.25, 1.5) * 3.4, 0.0); // Sea Lantern
if (mat == 19) return vec4(vec3(3.0, 0.9, 0.2) * 3.0, 0.0); // Shroomlight
}
} else {
if (mat < 23) {
if (mat == 20) return vec4(vec3(2.3, 0.9, 0.2) * 3.4, 0.0); // Cave Vines:With Glow Berries
if (mat == 21) return vec4(fireSpecialLightColor * 0.7, 0.0); // Furnace:Lit
if (mat == 22) return vec4(fireSpecialLightColor * 0.7, 0.0); // Smoker:Lit
} else {
if (mat == 23) return vec4(fireSpecialLightColor * 0.7, 0.0); // Blast Furnace:Lit
if (mat == 24) return vec4(fireSpecialLightColor * 0.25 * candleColorMult, candleExtraLight); // Standard Candles:Lit
if (mat == 25) return vec4(netherPortalSpecialLightColor * 2.0, 0.4); // Nether Portal
}
}
}
} else {
if (mat < 38) {
if (mat < 32) {
if (mat < 29) {
if (mat == 26) return vec4(netherPortalSpecialLightColor, 0.0); // Crying Obsidian
if (mat == 27) return soulFireSpecialColor; // Soul Fire
if (mat == 28) return soulFireSpecialColor; // Soul Torch
} else {
if (mat == 29) return soulFireSpecialColor; // Soul Lantern
if (mat == 30) return soulFireSpecialColor; // Soul Campfire:Lit
if (mat == 31) return vec4(redstoneSpecialLightColor * 0.5, 0.1 * ACT_ORE_INTENSITY); // Redstone Ores:Lit
}
} else {
if (mat < 35) {
if (mat == 32) return vec4(redstoneSpecialLightColor * 0.3, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Redstone Ores:Unlit
if (mat == 33) return vec4(enchantingTableSpecialLightColor, 0.05); // Enchanting Table
#if GLOWING_LICHEN > 0
if (mat == 34) return vec4(vec3(0.8, 1.1, 1.1), 0.05); // Glow Lichen with IntegratedPBR
#else
if (mat == 34) return vec4(vec3(0.4, 0.55, 0.55), 0.0); // Glow Lichen vanilla
#endif
} else {
if (mat == 35) return vec4(redstoneSpecialLightColor * 0.25, 0.0); // Redstone Torch
if (mat == 36) return vec4(vec3(0.325, 0.15, 0.425) * 2.0, 0.05); // Amethyst Cluster, Amethyst Buds, Calibrated Sculk Sensor
if (mat == 37) return vec4(lavaSpecialLightColor.rgb * 0.1, 0.1); // Magma Block
}
}
} else {
if (mat < 44) {
if (mat < 41) {
#ifdef EMISSIVE_DRAGON_EGG
if (mat == 38) return vec4(vec3(2.0, 0.5, 1.5) * 0.3, 0.1); // Dragon Egg
#endif
if (mat == 39) return vec4(vec3(2.0, 1.0, 1.5) * 0.25, 0.1); // Chorus Flower
if (mat == 40) return brewingStandSpecialLightColor; // Brewing Stand
} else {
if (mat == 41) return vec4(redstoneSpecialLightColor * 0.4, 0.15); // Redstone Block
if (mat == 42) return vec4(vec3(0.75, 0.75, 3.0) * 0.277, 0.15); // Lapis Block
if (mat == 43) return vec4(vec3(1.7, 0.9, 0.4) * 0.45, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Iron Ores
}
} else {
if (mat < 47) {
if (mat == 44) return vec4(vec3(1.7, 1.1, 0.2) * 0.45, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Gold Ores
if (mat == 45) return vec4(vec3(1.7, 0.8, 0.4) * 0.45, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Copper Ores
if (mat == 46) return vec4(vec3(0.75, 0.75, 3.0) * 0.2, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Lapis Ores
} else {
if (mat == 47) return vec4(vec3(0.5, 3.5, 0.5) * 0.3, 0.1 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Emerald Ores
if (mat == 48) return vec4(vec3(0.5, 2.0, 2.0) * 0.4, 0.15 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Diamond Ores
if (mat == 49) return vec4(vec3(1.5, 1.5, 1.5) * 0.3, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Nether Quartz Ore
}
}
}
}
} else {
if (mat < 74) {
if (mat < 62) {
if (mat < 56) {
if (mat < 53) {
if (mat == 50) return vec4(vec3(1.7, 1.1, 0.2) * 0.45, 0.05 * ACT_ORE_INTENSITY) * GLOWING_ORE_MULT; // Nether Gold Ore
if (mat == 51) return vec4(vec3(1.7, 1.1, 0.2) * 0.45, 0.05); // Gilded Blackstone
if (mat == 52) return vec4(vec3(1.8, 0.8, 0.4) * 0.6, 0.15); // Ancient Debris
} else {
if (mat == 53) return vec4(vec3(1.4, 0.2, 1.4) * 0.3, 0.05); // Spawner
if (mat == 54) return vec4(vec3(3.1, 1.1, 0.3) * 1.0, 0.1); // Trial Spawner:NotOminous:Active, Vault:NotOminous:Active
if (mat == 55) return vec4(vec3(1.7, 0.9, 0.4) * 4.0, 0.0); // Copper Bulb:BrighterOnes:Lit
}
} else {
if (mat < 59) {
if (mat == 56) return vec4(vec3(1.7, 0.9, 0.4) * 2.0, 0.0); // Copper Bulb:DimmerOnes:Lit
if (mat == 57) return vec4(vec3(0.1, 0.3, 0.4) * 0.5, 0.0005); // Sculk++
if (mat == 58) return vec4(vec3(0.0, 1.4, 1.4) * 4.0, 0.15); // End Portal Frame:Active
} else {
if (mat == 59) return vec4(0.0); // Bedrock
if (mat == 60) return vec4(vec3(3.1, 1.1, 0.3) * 0.125, 0.0125); // Command Block
if (mat == 61) return vec4(vec3(3.0, 0.9, 0.2) * 0.125, 0.0125); // Warped Fungus, Crimson Fungus
}
}
} else {
if (mat < 68) {
if (mat < 65) {
if (mat == 62) return vec4(vec3(3.5, 0.6, 0.4) * 0.3, 0.05); // Crimson Stem, Crimson Hyphae
if (mat == 63) return vec4(vec3(0.3, 1.9, 1.5) * 0.3, 0.05); // Warped Stem, Warped Hyphae
if (mat == 64) return vec4(vec3(1.0, 1.0, 1.0) * 0.45, 0.1); // Structure Block, Jigsaw Block, Test Block, Test Instance Block
} else {
if (mat == 65) return vec4(vec3(3.0, 0.9, 0.2) * 0.125, 0.0125); // Weeping Vines Plant
if (mat == 66) return vec4(redstoneSpecialLightColor * 0.05, 0.002); // Redstone Wire:Lit, Comparator:Unlit:Subtract
if (mat == 67) return vec4(redstoneSpecialLightColor * 0.125, 0.0125); // Repeater:Lit, Comparator:Lit
}
} else {
if (mat < 71) {
if (mat == 68) return vec4(vec3(0.75), 0.0); // Vault:Inactive
if (mat == 69) return vec4(vec3(1.3, 1.6, 1.6) * 1.0, 0.1); // Trial Spawner:Ominous:Active, Vault:Ominous:Active
if (mat == 70) return vec4(vec3(1.0, 0.1, 0.1) * candleColorMult, candleExtraLight); // Red Candles:Lit
} else {
if (mat == 71) return vec4(vec3(1.0, 0.4, 0.1) * candleColorMult, candleExtraLight); // Orange Candles:Lit
if (mat == 72) return vec4(vec3(1.0, 1.0, 0.1) * candleColorMult, candleExtraLight); // Yellow Candles:Lit
if (mat == 73) return vec4(vec3(0.1, 1.0, 0.1) * candleColorMult, candleExtraLight); // Lime Candles:Lit
}
}
}
} else {
if (mat < 86) {
if (mat < 80) {
if (mat < 77) {
if (mat == 74) return vec4(vec3(0.3, 1.0, 0.3) * candleColorMult, candleExtraLight); // Green Candles:Lit
if (mat == 75) return vec4(vec3(0.3, 0.8, 1.0) * candleColorMult, candleExtraLight); // Cyan Candles:Lit
if (mat == 76) return vec4(vec3(0.5, 0.65, 1.0) * candleColorMult, candleExtraLight); // Light Blue Candles:Lit
} else {
if (mat == 77) return vec4(vec3(0.1, 0.15, 1.0) * candleColorMult, candleExtraLight); // Blue Candles:Lit
if (mat == 78) return vec4(vec3(0.7, 0.3, 1.0) * candleColorMult, candleExtraLight); // Purple Candles:Lit
if (mat == 79) return vec4(vec3(1.0, 0.1, 1.0) * candleColorMult, candleExtraLight); // Magenta Candles:Lit
}
} else {
if (mat < 83) {
if (mat == 80) return vec4(vec3(1.0, 0.4, 1.0) * candleColorMult, candleExtraLight); // Pink Candles:Lit
if (mat == 81) return vec4(vec3(2.8, 1.1, 0.2) * 0.125, 0.0125); // Open Eyeblossom
if (mat == 82) return vec4(vec3(2.8, 1.1, 0.2) * 0.3, 0.05); // Creaking Heart: Active
} else {
if (mat == 83) return vec4(vec3(1.6, 1.6, 0.7) * 0.3, 0.05); // Firefly Bush
if (mat == 84) return vec4(vec3(0.85, 1.3, 1.0) * 3.9, 0.0); // Copper Torch, Copper Lantern
if (mat == 85) return vec4(0.0);
}
}
} else {
if (mat < 92) {
if (mat < 89) {
if (mat == 86) return vec4(0.0);
if (mat == 87) return vec4(0.0);
if (mat == 88) return vec4(0.0);
} else {
if (mat == 89) return vec4(0.0);
if (mat == 90) return vec4(0.0);
if (mat == 91) return vec4(0.0);
}
} else {
if (mat < 95) {
if (mat == 92) return vec4(0.0);
if (mat == 93) return vec4(0.0);
if (mat == 94) return vec4(0.0);
} else {
if (mat == 95) return vec4(0.0);
if (mat == 96) return vec4(0.0);
if (mat == 97) return vec4(vec3(1.0, 1.0, 1.0) * 4.0, candleExtraLight); // Modded White Light Source
}
}
}
}
}
return vec4(blocklightCol * 20.0, 0.0);
}
vec3[] specialTintColor = vec3[](
// 200: White
vec3(1.0),
// 201: Orange
vec3(1.0, 0.3, 0.1),
// 202: Magenta
vec3(1.0, 0.1, 1.0),
// 203: Light Blue
vec3(0.5, 0.65, 1.0),
// 204: Yellow
vec3(1.0, 1.0, 0.1),
// 205: Lime
vec3(0.1, 1.0, 0.1),
// 206: Pink
vec3(1.0, 0.4, 1.0),
// 207: Gray
vec3(1.0),
// 208: Light Gray
vec3(1.0),
// 209: Cyan
vec3(0.3, 0.8, 1.0),
// 210: Purple
vec3(0.7, 0.3, 1.0),
// 211: Blue
vec3(0.1, 0.15, 1.0),
// 212: Brown
vec3(1.0, 0.75, 0.5),
// 213: Green
vec3(0.3, 1.0, 0.3),
// 214: Red
vec3(1.0, 0.1, 0.1),
// 215: Black
vec3(1.0),
// 216: Ice
vec3(0.5, 0.65, 1.0),
// 217: Glass
vec3(1.0),
// 218: Glass Pane
vec3(1.0),
// 219++
vec3(0.0)
);
@@ -1,7 +1,7 @@
vec3 cloudRainColor = mix(nightMiddleSkyColor, dayMiddleSkyColor, sunFactor);
vec3 cloudAmbientColor = mix(ambientColor * (sunVisibility2 * (0.55 + 0.17 * noonFactor) + 0.35), cloudRainColor * 0.5, rainFactor) * CLOUD_AMBIENT_MULTIPLIER;
vec3 cloudLightColor = mix(
lightColor * 1.3,
cloudRainColor * 0.45,
noonFactor * rainFactor
) * CLOUD_LIGHT_MULTIPLIER;
vec3 cloudRainColor = mix(nightMiddleSkyColor, dayMiddleSkyColor, sunFactor);
vec3 cloudAmbientColor = mix(ambientColor * (sunVisibility2 * (0.55 + 0.17 * noonFactor) + 0.35), cloudRainColor * 0.5, rainFactor) * CLOUD_AMBIENT_MULTIPLIER;
vec3 cloudLightColor = mix(
lightColor * 1.3,
cloudRainColor * 0.45,
noonFactor * rainFactor
) * CLOUD_LIGHT_MULTIPLIER;
@@ -1,68 +1,68 @@
#ifndef INCLUDE_LIGHT_AND_AMBIENT_MULTIPLIERS
#define INCLUDE_LIGHT_AND_AMBIENT_MULTIPLIERS
#include "/lib/shaderSettings/colorMult.glsl"
vec3 GetLightColorMult() {
vec3 lightColorMult;
#ifdef OVERWORLD
vec3 morningLightMult = vec3(LIGHT_MORNING_R, LIGHT_MORNING_G, LIGHT_MORNING_B) * LIGHT_MORNING_I;
vec3 noonLightMult = vec3(LIGHT_NOON_R, LIGHT_NOON_G, LIGHT_NOON_B) * LIGHT_NOON_I;
vec3 nightLightMult = vec3(LIGHT_NIGHT_R, LIGHT_NIGHT_G, LIGHT_NIGHT_B) * LIGHT_NIGHT_I;
vec3 rainLightMult = vec3(LIGHT_RAIN_R, LIGHT_RAIN_G, LIGHT_RAIN_B) * LIGHT_RAIN_I;
lightColorMult = mix(noonLightMult, morningLightMult, invNoonFactor2);
lightColorMult = mix(nightLightMult, lightColorMult, sunVisibility2);
lightColorMult = mix(lightColorMult, dot(lightColorMult, vec3(0.33333)) * rainLightMult, rainFactor);
#elif defined NETHER
vec3 netherLightMult = vec3(LIGHT_NETHER_R, LIGHT_NETHER_G, LIGHT_NETHER_B) * LIGHT_NETHER_I;
lightColorMult = netherLightMult;
#elif defined END
vec3 endLightMult = vec3(LIGHT_END_R, LIGHT_END_G, LIGHT_END_B) * LIGHT_END_I;
lightColorMult = endLightMult;
#endif
#ifdef COLOR_MULTIPLIER_COMPARISON
return gl_FragCoord.x < mix(0.5, 0.0, isSneaking) * viewWidth ? vec3(1.0) : lightColorMult;
#else
return lightColorMult;
#endif
}
vec3 GetAtmColorMult() {
vec3 atmColorMult;
#ifdef OVERWORLD
vec3 morningAtmMult = vec3(ATM_MORNING_R, ATM_MORNING_G, ATM_MORNING_B) * ATM_MORNING_I;
vec3 noonAtmMult = vec3(ATM_NOON_R, ATM_NOON_G, ATM_NOON_B) * ATM_NOON_I;
vec3 nightAtmMult = vec3(ATM_NIGHT_R, ATM_NIGHT_G, ATM_NIGHT_B) * ATM_NIGHT_I;
vec3 rainAtmMult = vec3(ATM_RAIN_R, ATM_RAIN_G, ATM_RAIN_B) * ATM_RAIN_I;
atmColorMult = mix(noonAtmMult, morningAtmMult, invNoonFactor2);
atmColorMult = mix(nightAtmMult, atmColorMult, sunVisibility2);
atmColorMult = mix(atmColorMult, dot(atmColorMult, vec3(0.33333)) * rainAtmMult, rainFactor);
#elif defined NETHER
vec3 netherAtmMult = vec3(ATM_NETHER_R, ATM_NETHER_G, ATM_NETHER_B) * ATM_NETHER_I;
atmColorMult = netherAtmMult;
#elif defined END
vec3 endAtmMult = vec3(ATM_END_R, ATM_END_G, ATM_END_B) * ATM_END_I;
atmColorMult = endAtmMult;
#endif
#ifdef COLOR_MULTIPLIER_COMPARISON
return gl_FragCoord.x < mix(0.5, 0.0, isSneaking) * viewWidth ? vec3(1.0) : atmColorMult;
#else
return atmColorMult;
#endif
}
vec3 lightColorMult;
vec3 atmColorMult;
vec3 sqrtAtmColorMult;
#endif //INCLUDE_LIGHT_AND_AMBIENT_MULTIPLIERS
#ifndef INCLUDE_LIGHT_AND_AMBIENT_MULTIPLIERS
#define INCLUDE_LIGHT_AND_AMBIENT_MULTIPLIERS
#include "/lib/shaderSettings/colorMult.glsl"
vec3 GetLightColorMult() {
vec3 lightColorMult;
#ifdef OVERWORLD
vec3 morningLightMult = vec3(LIGHT_MORNING_R, LIGHT_MORNING_G, LIGHT_MORNING_B) * LIGHT_MORNING_I;
vec3 noonLightMult = vec3(LIGHT_NOON_R, LIGHT_NOON_G, LIGHT_NOON_B) * LIGHT_NOON_I;
vec3 nightLightMult = vec3(LIGHT_NIGHT_R, LIGHT_NIGHT_G, LIGHT_NIGHT_B) * LIGHT_NIGHT_I;
vec3 rainLightMult = vec3(LIGHT_RAIN_R, LIGHT_RAIN_G, LIGHT_RAIN_B) * LIGHT_RAIN_I;
lightColorMult = mix(noonLightMult, morningLightMult, invNoonFactor2);
lightColorMult = mix(nightLightMult, lightColorMult, sunVisibility2);
lightColorMult = mix(lightColorMult, dot(lightColorMult, vec3(0.33333)) * rainLightMult, rainFactor);
#elif defined NETHER
vec3 netherLightMult = vec3(LIGHT_NETHER_R, LIGHT_NETHER_G, LIGHT_NETHER_B) * LIGHT_NETHER_I;
lightColorMult = netherLightMult;
#elif defined END
vec3 endLightMult = vec3(LIGHT_END_R, LIGHT_END_G, LIGHT_END_B) * LIGHT_END_I;
lightColorMult = endLightMult;
#endif
#ifdef COLOR_MULTIPLIER_COMPARISON
return gl_FragCoord.x < mix(0.5, 0.0, isSneaking) * viewWidth ? vec3(1.0) : lightColorMult;
#else
return lightColorMult;
#endif
}
vec3 GetAtmColorMult() {
vec3 atmColorMult;
#ifdef OVERWORLD
vec3 morningAtmMult = vec3(ATM_MORNING_R, ATM_MORNING_G, ATM_MORNING_B) * ATM_MORNING_I;
vec3 noonAtmMult = vec3(ATM_NOON_R, ATM_NOON_G, ATM_NOON_B) * ATM_NOON_I;
vec3 nightAtmMult = vec3(ATM_NIGHT_R, ATM_NIGHT_G, ATM_NIGHT_B) * ATM_NIGHT_I;
vec3 rainAtmMult = vec3(ATM_RAIN_R, ATM_RAIN_G, ATM_RAIN_B) * ATM_RAIN_I;
atmColorMult = mix(noonAtmMult, morningAtmMult, invNoonFactor2);
atmColorMult = mix(nightAtmMult, atmColorMult, sunVisibility2);
atmColorMult = mix(atmColorMult, dot(atmColorMult, vec3(0.33333)) * rainAtmMult, rainFactor);
#elif defined NETHER
vec3 netherAtmMult = vec3(ATM_NETHER_R, ATM_NETHER_G, ATM_NETHER_B) * ATM_NETHER_I;
atmColorMult = netherAtmMult;
#elif defined END
vec3 endAtmMult = vec3(ATM_END_R, ATM_END_G, ATM_END_B) * ATM_END_I;
atmColorMult = endAtmMult;
#endif
#ifdef COLOR_MULTIPLIER_COMPARISON
return gl_FragCoord.x < mix(0.5, 0.0, isSneaking) * viewWidth ? vec3(1.0) : atmColorMult;
#else
return atmColorMult;
#endif
}
vec3 lightColorMult;
vec3 atmColorMult;
vec3 sqrtAtmColorMult;
#endif //INCLUDE_LIGHT_AND_AMBIENT_MULTIPLIERS
@@ -1,110 +1,110 @@
#ifndef INCLUDE_LIGHT_AND_AMBIENT_COLORS
#define INCLUDE_LIGHT_AND_AMBIENT_COLORS
#include "/lib/shaderSettings/endBeams.glsl"
#include "/lib/shaderSettings/lightAndAmbientColors.glsl"
#include "/lib/shaderSettings/overworldBeams.glsl"
#if defined OVERWORLD
#ifndef COMPOSITE1
vec3 noonClearLightColor = vec3(0.65, 0.55, 0.375) * 2.05; //ground and cloud color
#else
vec3 noonClearLightColor = vec3(0.4, 0.75, 1.3); //light shaft color
#endif
vec3 noonClearAmbientColor = pow(skyColor, vec3(0.75)) * 0.85;
#ifndef COMPOSITE1
vec3 sunsetClearLightColor = pow(vec3(0.64, 0.45, 0.3), vec3(1.5 + invNoonFactor)) * 5.0; //ground and cloud color
#else
vec3 sunsetClearLightColor = pow(vec3(0.62, 0.39, 0.24), vec3(1.5 + invNoonFactor)) * 6.8; //light shaft color
#endif
vec3 sunsetClearAmbientColor = noonClearAmbientColor * vec3(1.21, 0.92, 0.76) * 0.95;
#if !defined COMPOSITE1 && !defined DEFERRED1
vec3 nightClearLightColor = 0.9 * vec3(0.15, 0.14, 0.20) * (0.4 + vsBrightness * 0.4); //ground color
#elif defined DEFERRED1
vec3 nightClearLightColor = 0.9 * vec3(0.11, 0.14, 0.20); //cloud color
#else
vec3 nightClearLightColor = vec3(0.08, 0.12, 0.23); //light shaft color
#endif
vec3 nightClearAmbientColor = 0.9 * vec3(0.09, 0.12, 0.17) * (1.55 + vsBrightness * 0.77);
#ifdef SPECIAL_BIOME_WEATHER
vec3 drlcSnowM = inSnowy * vec3(-0.06, 0.0, 0.04);
vec3 drlcDryM = inDry * vec3(0.01, -0.035, -0.06);
#else
vec3 drlcSnowM = vec3(0.0), drlcDryM = vec3(0.0);
#endif
#if RAIN_STYLE == 2
vec3 drlcRainMP = vec3(-0.03, 0.0, 0.02);
#ifdef SPECIAL_BIOME_WEATHER
vec3 drlcRainM = inRainy * drlcRainMP;
#else
vec3 drlcRainM = drlcRainMP;
#endif
#else
vec3 drlcRainM = vec3(0.0);
#endif
vec3 dayRainLightColor = vec3(0.21, 0.16, 0.13) * 0.85 + noonFactor * vec3(0.0, 0.02, 0.06)
+ drlcRainM + drlcSnowM + drlcDryM;
vec3 dayRainAmbientColor = vec3(0.2, 0.2, 0.25) * (1.8 + 0.5 * vsBrightness);
vec3 nightRainLightColor = vec3(0.03, 0.035, 0.05) * (0.5 + 0.5 * vsBrightness);
vec3 nightRainAmbientColor = vec3(0.16, 0.20, 0.3) * (0.75 + 0.6 * vsBrightness);
#ifndef COMPOSITE1
float noonFactorDM = noonFactor; //ground and cloud factor
#else
float noonFactorDM = noonFactor * noonFactor; //light shaft factor
#endif
vec3 dayLightColor = mix(sunsetClearLightColor, noonClearLightColor, noonFactorDM);
vec3 dayAmbientColor = mix(sunsetClearAmbientColor, noonClearAmbientColor, noonFactorDM);
vec3 clearLightColor = mix(nightClearLightColor, dayLightColor, sunVisibility2);
vec3 clearAmbientColor = mix(nightClearAmbientColor, dayAmbientColor, sunVisibility2);
float rainShadowVisReduce = 0.0
#ifdef SUN_MOON_DURING_RAIN
#ifdef SPECIAL_BIOME_WEATHER
+ 0.2 * inSnowy + 0.2 * inDry
#elif RAIN_STYLE == 2
+ 0.2
#endif
#else
+ 0.4
#endif
;
vec3 rainLightColor = mix(nightRainLightColor, dayRainLightColor * (1.0 - rainShadowVisReduce), sunVisibility2) * 2.5;
vec3 rainAmbientColor = mix(nightRainAmbientColor, dayRainAmbientColor * (1.0 + rainShadowVisReduce), sunVisibility2);
vec3 lightColor = mix(clearLightColor, rainLightColor, rainFactor);
#if SILHOUETTE == 0
vec3 ambientColor = mix(clearAmbientColor, rainAmbientColor, rainFactor);
#elif SILHOUETTE == 1
vec3 ambientColor = mix(clearAmbientColor, rainAmbientColor, rainFactor) * mix(SILHOUETTE_BRIGHTNESS, 1.0, sunVisibility);
#else
vec3 ambientColor = mix(clearAmbientColor, rainAmbientColor, rainFactor) * SILHOUETTE_BRIGHTNESS;
#endif
#ifdef OVERWORLD_BEAMS
vec3 ambientColorBeam = mix(clearAmbientColor, rainAmbientColor, rainFactor);
vec3 ColorBeam = mix(vec3(OW_BEAM_R_NEW, OW_BEAM_G_NEW, OW_BEAM_B_NEW), ambientColorBeam, BEAMS_AMBIENT_INFLUENCE);
#else
vec3 ColorBeam = vec3(0.0);
#endif
#elif defined NETHER
vec3 lightColor = vec3(0.0);
vec3 ambientColor = (netherColor + 0.5 * lavaLightColor) * (0.9 + 0.45 * vsBrightness);
#elif defined END
float fogLuminance = dot(fogColor, vec3(0.299, 0.587, 0.114));
vec3 endLightColor = clamp(mix(fogColor * 0.6 + 0.3 * normalize(fogColor + 0.0001) + 0.25 * (1.0 - fogLuminance), vec3(0.68, 0.51, 1.07), inVanillaEnd * float(END_SKY_FOG_INFLUENCE)), 0.0, 1.0);
vec3 endOrangeCol = vec3(E_DRAGON_BEAM_R_NEW, E_DRAGON_BEAM_G_NEW, E_DRAGON_BEAM_B_NEW) * E_DRAGON_BEAM_I;
float endLightBalancer = 0.2 * vsBrightness;
vec3 lightColor = endLightColor * (0.35 - endLightBalancer);
vec3 ambientCol = endLightColor * (0.2 + endLightBalancer);
vec3 ambientColor = mix(ambientCol, vec3(END_AMBIENT_R_NEW, END_AMBIENT_G_NEW, END_AMBIENT_B_NEW), END_AMBIENT_INFLUENCE) * END_AMBIENT_I;
vec3 endColorBeam = mix(vec3(E_BEAM_R_NEW, E_BEAM_G_NEW, E_BEAM_B_NEW), ambientCol, E_BEAMS_AMBIENT_INFLUENCE);
#endif
#endif //INCLUDE_LIGHT_AND_AMBIENT_COLORS
#ifndef INCLUDE_LIGHT_AND_AMBIENT_COLORS
#define INCLUDE_LIGHT_AND_AMBIENT_COLORS
#include "/lib/shaderSettings/endBeams.glsl"
#include "/lib/shaderSettings/lightAndAmbientColors.glsl"
#include "/lib/shaderSettings/overworldBeams.glsl"
#if defined OVERWORLD
#ifndef COMPOSITE1
vec3 noonClearLightColor = vec3(0.65, 0.55, 0.375) * 2.05; //ground and cloud color
#else
vec3 noonClearLightColor = vec3(0.4, 0.75, 1.3); //light shaft color
#endif
vec3 noonClearAmbientColor = pow(skyColor, vec3(0.75)) * 0.85;
#ifndef COMPOSITE1
vec3 sunsetClearLightColor = pow(vec3(0.64, 0.45, 0.3), vec3(1.5 + invNoonFactor)) * 5.0; //ground and cloud color
#else
vec3 sunsetClearLightColor = pow(vec3(0.62, 0.39, 0.24), vec3(1.5 + invNoonFactor)) * 6.8; //light shaft color
#endif
vec3 sunsetClearAmbientColor = noonClearAmbientColor * vec3(1.21, 0.92, 0.76) * 0.95;
#if !defined COMPOSITE1 && !defined DEFERRED1
vec3 nightClearLightColor = 0.9 * vec3(0.15, 0.14, 0.20) * (0.4 + vsBrightness * 0.4); //ground color
#elif defined DEFERRED1
vec3 nightClearLightColor = 0.9 * vec3(0.11, 0.14, 0.20); //cloud color
#else
vec3 nightClearLightColor = vec3(0.08, 0.12, 0.23); //light shaft color
#endif
vec3 nightClearAmbientColor = 0.9 * vec3(0.09, 0.12, 0.17) * (1.55 + vsBrightness * 0.77);
#ifdef SPECIAL_BIOME_WEATHER
vec3 drlcSnowM = inSnowy * vec3(-0.06, 0.0, 0.04);
vec3 drlcDryM = inDry * vec3(0.01, -0.035, -0.06);
#else
vec3 drlcSnowM = vec3(0.0), drlcDryM = vec3(0.0);
#endif
#if RAIN_STYLE == 2
vec3 drlcRainMP = vec3(-0.03, 0.0, 0.02);
#ifdef SPECIAL_BIOME_WEATHER
vec3 drlcRainM = inRainy * drlcRainMP;
#else
vec3 drlcRainM = drlcRainMP;
#endif
#else
vec3 drlcRainM = vec3(0.0);
#endif
vec3 dayRainLightColor = vec3(0.21, 0.16, 0.13) * 0.85 + noonFactor * vec3(0.0, 0.02, 0.06)
+ drlcRainM + drlcSnowM + drlcDryM;
vec3 dayRainAmbientColor = vec3(0.2, 0.2, 0.25) * (1.8 + 0.5 * vsBrightness);
vec3 nightRainLightColor = vec3(0.03, 0.035, 0.05) * (0.5 + 0.5 * vsBrightness);
vec3 nightRainAmbientColor = vec3(0.16, 0.20, 0.3) * (0.75 + 0.6 * vsBrightness);
#ifndef COMPOSITE1
float noonFactorDM = noonFactor; //ground and cloud factor
#else
float noonFactorDM = noonFactor * noonFactor; //light shaft factor
#endif
vec3 dayLightColor = mix(sunsetClearLightColor, noonClearLightColor, noonFactorDM);
vec3 dayAmbientColor = mix(sunsetClearAmbientColor, noonClearAmbientColor, noonFactorDM);
vec3 clearLightColor = mix(nightClearLightColor, dayLightColor, sunVisibility2);
vec3 clearAmbientColor = mix(nightClearAmbientColor, dayAmbientColor, sunVisibility2);
float rainShadowVisReduce = 0.0
#ifdef SUN_MOON_DURING_RAIN
#ifdef SPECIAL_BIOME_WEATHER
+ 0.2 * inSnowy + 0.2 * inDry
#elif RAIN_STYLE == 2
+ 0.2
#endif
#else
+ 0.4
#endif
;
vec3 rainLightColor = mix(nightRainLightColor, dayRainLightColor * (1.0 - rainShadowVisReduce), sunVisibility2) * 2.5;
vec3 rainAmbientColor = mix(nightRainAmbientColor, dayRainAmbientColor * (1.0 + rainShadowVisReduce), sunVisibility2);
vec3 lightColor = mix(clearLightColor, rainLightColor, rainFactor);
#if SILHOUETTE == 0
vec3 ambientColor = mix(clearAmbientColor, rainAmbientColor, rainFactor);
#elif SILHOUETTE == 1
vec3 ambientColor = mix(clearAmbientColor, rainAmbientColor, rainFactor) * mix(SILHOUETTE_BRIGHTNESS, 1.0, sunVisibility);
#else
vec3 ambientColor = mix(clearAmbientColor, rainAmbientColor, rainFactor) * SILHOUETTE_BRIGHTNESS;
#endif
#ifdef OVERWORLD_BEAMS
vec3 ambientColorBeam = mix(clearAmbientColor, rainAmbientColor, rainFactor);
vec3 ColorBeam = mix(vec3(OW_BEAM_R_NEW, OW_BEAM_G_NEW, OW_BEAM_B_NEW), ambientColorBeam, BEAMS_AMBIENT_INFLUENCE);
#else
vec3 ColorBeam = vec3(0.0);
#endif
#elif defined NETHER
vec3 lightColor = vec3(0.0);
vec3 ambientColor = (netherColor + 0.5 * lavaLightColor) * (0.9 + 0.45 * vsBrightness);
#elif defined END
float fogLuminance = dot(fogColor, vec3(0.299, 0.587, 0.114));
vec3 endLightColor = clamp(mix(fogColor * 0.6 + 0.3 * normalize(fogColor + 0.0001) + 0.25 * (1.0 - fogLuminance), vec3(0.68, 0.51, 1.07), inVanillaEnd * float(END_SKY_FOG_INFLUENCE)), 0.0, 1.0);
vec3 endOrangeCol = vec3(E_DRAGON_BEAM_R_NEW, E_DRAGON_BEAM_G_NEW, E_DRAGON_BEAM_B_NEW) * E_DRAGON_BEAM_I;
float endLightBalancer = 0.2 * vsBrightness;
vec3 lightColor = endLightColor * (0.35 - endLightBalancer);
vec3 ambientCol = endLightColor * (0.2 + endLightBalancer);
vec3 ambientColor = mix(ambientCol, vec3(END_AMBIENT_R_NEW, END_AMBIENT_G_NEW, END_AMBIENT_B_NEW), END_AMBIENT_INFLUENCE) * END_AMBIENT_I;
vec3 endColorBeam = mix(vec3(E_BEAM_R_NEW, E_BEAM_G_NEW, E_BEAM_B_NEW), ambientCol, E_BEAMS_AMBIENT_INFLUENCE);
#endif
#endif //INCLUDE_LIGHT_AND_AMBIENT_COLORS
@@ -1,24 +1,24 @@
#ifndef INCLUDE_MOON_PHASE_INF
#define INCLUDE_MOON_PHASE_INF
#ifdef OVERWORLD
#if SUN_MOON_STYLE == 1
float moonPhaseFactor = abs(moonPhase - 4.0) * 0.25;
float halfCheck = step(0.5, moonPhaseFactor);
float firstHalf = mix(MOON_PHASE_DARK, MOON_PHASE_PARTIAL, smoothstep(0.0, 0.5, moonPhaseFactor));
float secondHalf = mix(MOON_PHASE_PARTIAL, MOON_PHASE_FULL, smoothstep(0.5, 1.0, moonPhaseFactor));
float moonPhaseFactor2 = mix(firstHalf, secondHalf, halfCheck);
float moonPhaseInfluence = mix(1.0, moonPhaseFactor2, 1.0 - sunVisibility2);
#else
float moonPhaseInfluence = mix(
1.0,
moonPhase == 0 ? MOON_PHASE_FULL : moonPhase != 4 ? MOON_PHASE_PARTIAL : MOON_PHASE_DARK,
1.0 - sunVisibility2
);
#endif
#else
float moonPhaseInfluence = 1.0;
#endif
#endif
#ifndef INCLUDE_MOON_PHASE_INF
#define INCLUDE_MOON_PHASE_INF
#ifdef OVERWORLD
#if SUN_MOON_STYLE == 1
float moonPhaseFactor = abs(moonPhase - 4.0) * 0.25;
float halfCheck = step(0.5, moonPhaseFactor);
float firstHalf = mix(MOON_PHASE_DARK, MOON_PHASE_PARTIAL, smoothstep(0.0, 0.5, moonPhaseFactor));
float secondHalf = mix(MOON_PHASE_PARTIAL, MOON_PHASE_FULL, smoothstep(0.5, 1.0, moonPhaseFactor));
float moonPhaseFactor2 = mix(firstHalf, secondHalf, halfCheck);
float moonPhaseInfluence = mix(1.0, moonPhaseFactor2, 1.0 - sunVisibility2);
#else
float moonPhaseInfluence = mix(
1.0,
moonPhase == 0 ? MOON_PHASE_FULL : moonPhase != 4 ? MOON_PHASE_PARTIAL : MOON_PHASE_DARK,
1.0 - sunVisibility2
);
#endif
#else
float moonPhaseInfluence = 1.0;
#endif
#endif
@@ -1,57 +1,57 @@
#ifndef INCLUDE_SKY_COLORS
#define INCLUDE_SKY_COLORS
#ifdef OVERWORLD
vec3 skyColorSqrt = sqrt(skyColor);
// Doing these things because vanilla skyColor gets to 0 during a thunderstorm
float invRainStrength2 = (1.0 - rainStrength) * (1.0 - rainStrength);
vec3 skyColorM = mix(max(skyColorSqrt, vec3(0.63, 0.67, 0.73)), skyColorSqrt, invRainStrength2);
vec3 skyColorM2 = mix(max(skyColor, sunFactor * vec3(0.265, 0.295, 0.35)), skyColor, invRainStrength2);
#ifdef SPECIAL_BIOME_WEATHER
vec3 nmscSnowM = inSnowy * vec3(-0.1, 0.3, 0.6);
vec3 nmscDryM = inDry * vec3(-0.1, -0.2, -0.3);
vec3 ndscSnowM = inSnowy * vec3(-0.25, -0.01, 0.25);
vec3 ndscDryM = inDry * vec3(-0.05, -0.09, -0.1);
#else
vec3 nmscSnowM = vec3(0.0), nmscDryM = vec3(0.0), ndscSnowM = vec3(0.0), ndscDryM = vec3(0.0);
#endif
#if RAIN_STYLE == 2
vec3 nmscRainMP = vec3(-0.15, 0.025, 0.1);
vec3 ndscRainMP = vec3(-0.125, -0.005, 0.125);
#ifdef SPECIAL_BIOME_WEATHER
vec3 nmscRainM = inRainy * ndscRainMP;
vec3 ndscRainM = inRainy * ndscRainMP;
#else
vec3 nmscRainM = ndscRainMP;
vec3 ndscRainM = ndscRainMP;
#endif
#else
vec3 nmscRainM = vec3(0.0), ndscRainM = vec3(0.0);
#endif
vec3 nuscWeatherM = vec3(0.1, 0.0, 0.1);
vec3 nmscWeatherM = vec3(-0.1, -0.4, -0.6) + vec3(0.0, 0.06, 0.12) * noonFactor;
vec3 ndscWeatherM = vec3(-0.15, -0.3, -0.42) + vec3(0.0, 0.02, 0.08) * noonFactor;
vec3 noonUpSkyColor = pow(skyColorM, vec3(2.9)) * (vec3(0.85, 0.92, 0.81) + rainFactor * nuscWeatherM);
vec3 noonMiddleSkyColor = pow(skyColorM, vec3(1.5)) * (vec3(1.3) + rainFactor * (nmscWeatherM + nmscRainM + nmscSnowM + nmscDryM))
+ noonUpSkyColor * 0.65;
vec3 noonDownSkyColor = skyColorM * (vec3(0.9) + rainFactor * (ndscWeatherM + ndscRainM + ndscSnowM + ndscDryM))
+ noonUpSkyColor * 0.25;
vec3 sunsetUpSkyColor = skyColorM2 * (vec3(0.72, 0.522, 0.47) + vec3(0.1, 0.2, 0.35) * rainFactor2);
vec3 sunsetMiddleSkyColor = skyColorM2 * (vec3(1.8, 1.3, 1.2) + vec3(0.15, 0.25, -0.05) * rainFactor2);
vec3 sunsetDownSkyColorP = vec3(1.45, 0.86, 0.5) - vec3(0.8, 0.3, 0.0) * rainFactor;
vec3 sunsetDownSkyColor = sunsetDownSkyColorP * 0.5 + 0.25 * sunsetMiddleSkyColor;
vec3 dayUpSkyColor = mix(noonUpSkyColor, sunsetUpSkyColor, invNoonFactor2);
vec3 dayMiddleSkyColor = mix(noonMiddleSkyColor, sunsetMiddleSkyColor, invNoonFactor2);
vec3 dayDownSkyColor = mix(noonDownSkyColor, sunsetDownSkyColor, invNoonFactor2);
vec3 nightColFactor = 0.9 * vec3(0.07, 0.14, 0.24) * (1.0 - 0.5 * rainFactor) + skyColor;
vec3 nightUpSkyColor = pow(nightColFactor, vec3(0.90)) * 0.45;
vec3 nightMiddleSkyColor = sqrt(nightUpSkyColor) * 0.65;
vec3 nightDownSkyColor = nightMiddleSkyColor * vec3(0.82, 0.82, 0.88);
#endif
#endif //INCLUDE_SKY_COLORS
#ifndef INCLUDE_SKY_COLORS
#define INCLUDE_SKY_COLORS
#ifdef OVERWORLD
vec3 skyColorSqrt = sqrt(skyColor);
// Doing these things because vanilla skyColor gets to 0 during a thunderstorm
float invRainStrength2 = (1.0 - rainStrength) * (1.0 - rainStrength);
vec3 skyColorM = mix(max(skyColorSqrt, vec3(0.63, 0.67, 0.73)), skyColorSqrt, invRainStrength2);
vec3 skyColorM2 = mix(max(skyColor, sunFactor * vec3(0.265, 0.295, 0.35)), skyColor, invRainStrength2);
#ifdef SPECIAL_BIOME_WEATHER
vec3 nmscSnowM = inSnowy * vec3(-0.1, 0.3, 0.6);
vec3 nmscDryM = inDry * vec3(-0.1, -0.2, -0.3);
vec3 ndscSnowM = inSnowy * vec3(-0.25, -0.01, 0.25);
vec3 ndscDryM = inDry * vec3(-0.05, -0.09, -0.1);
#else
vec3 nmscSnowM = vec3(0.0), nmscDryM = vec3(0.0), ndscSnowM = vec3(0.0), ndscDryM = vec3(0.0);
#endif
#if RAIN_STYLE == 2
vec3 nmscRainMP = vec3(-0.15, 0.025, 0.1);
vec3 ndscRainMP = vec3(-0.125, -0.005, 0.125);
#ifdef SPECIAL_BIOME_WEATHER
vec3 nmscRainM = inRainy * ndscRainMP;
vec3 ndscRainM = inRainy * ndscRainMP;
#else
vec3 nmscRainM = ndscRainMP;
vec3 ndscRainM = ndscRainMP;
#endif
#else
vec3 nmscRainM = vec3(0.0), ndscRainM = vec3(0.0);
#endif
vec3 nuscWeatherM = vec3(0.1, 0.0, 0.1);
vec3 nmscWeatherM = vec3(-0.1, -0.4, -0.6) + vec3(0.0, 0.06, 0.12) * noonFactor;
vec3 ndscWeatherM = vec3(-0.15, -0.3, -0.42) + vec3(0.0, 0.02, 0.08) * noonFactor;
vec3 noonUpSkyColor = pow(skyColorM, vec3(2.9)) * (vec3(0.85, 0.92, 0.81) + rainFactor * nuscWeatherM);
vec3 noonMiddleSkyColor = pow(skyColorM, vec3(1.5)) * (vec3(1.3) + rainFactor * (nmscWeatherM + nmscRainM + nmscSnowM + nmscDryM))
+ noonUpSkyColor * 0.65;
vec3 noonDownSkyColor = skyColorM * (vec3(0.9) + rainFactor * (ndscWeatherM + ndscRainM + ndscSnowM + ndscDryM))
+ noonUpSkyColor * 0.25;
vec3 sunsetUpSkyColor = skyColorM2 * (vec3(0.72, 0.522, 0.47) + vec3(0.1, 0.2, 0.35) * rainFactor2);
vec3 sunsetMiddleSkyColor = skyColorM2 * (vec3(1.8, 1.3, 1.2) + vec3(0.15, 0.25, -0.05) * rainFactor2);
vec3 sunsetDownSkyColorP = vec3(1.45, 0.86, 0.5) - vec3(0.8, 0.3, 0.0) * rainFactor;
vec3 sunsetDownSkyColor = sunsetDownSkyColorP * 0.5 + 0.25 * sunsetMiddleSkyColor;
vec3 dayUpSkyColor = mix(noonUpSkyColor, sunsetUpSkyColor, invNoonFactor2);
vec3 dayMiddleSkyColor = mix(noonMiddleSkyColor, sunsetMiddleSkyColor, invNoonFactor2);
vec3 dayDownSkyColor = mix(noonDownSkyColor, sunsetDownSkyColor, invNoonFactor2);
vec3 nightColFactor = 0.9 * vec3(0.07, 0.14, 0.24) * (1.0 - 0.5 * rainFactor) + skyColor;
vec3 nightUpSkyColor = pow(nightColFactor, vec3(0.90)) * 0.45;
vec3 nightMiddleSkyColor = sqrt(nightUpSkyColor) * 0.65;
vec3 nightDownSkyColor = nightMiddleSkyColor * vec3(0.82, 0.82, 0.88);
#endif
#endif //INCLUDE_SKY_COLORS
@@ -1,403 +1,403 @@
vec3 DoBSLTonemap(vec3 color) {
color = TM_EXPOSURE * color;
color = color / pow(pow(color, vec3(TM_WHITE_CURVE)) + 1.0, vec3(1.0 / TM_WHITE_CURVE));
color = pow(color, mix(vec3(T_LOWER_CURVE), vec3(T_UPPER_CURVE), sqrt(color)));
return pow(color, vec3(1.0 / 2.2));
}
void linearToRGB(inout vec3 color) {
const vec3 k = vec3(0.055);
color = mix((vec3(1.0) + k) * pow(color, vec3(1.0 / 2.4)) - k, 12.92 * color, lessThan(color, vec3(0.0031308)));
}
void doColorAdjustmentsWithoutExposure(inout vec3 color) {
color = pow(color, mix(vec3(T_LOWER_CURVE - 0.10), vec3(T_UPPER_CURVE - 0.30), sqrt(color)));
}
void doColorAdjustments(inout vec3 color) {
color = TM_EXPOSURE * color;
doColorAdjustmentsWithoutExposure(color);
}
vec3 DoCompTonemap(inout vec3 color) {
// Lottes tonemap modified for Complementary Shaders
// Lottes 2016, "Advanced Techniques and Optimization of HDR Color Pipelines"
// http://32ipi028l5q82yhj72224m8j.wpengine.netdna-cdn.com/wp-content/uploads/2016/03/GdcVdrLottes.pdf
color = TM_EXPOSURE * color;
float colorMax = max(color.r, max(color.g, color.b));
float initialLuminance = GetLuminance(color);
vec3 a = vec3(TM_CONTRAST); // General Contrast
vec3 d = vec3(1.0); // Roll-off control
vec3 hdrMax = vec3(8.0); // Maximum input brightness
vec3 midIn = vec3(0.25); // Input middle gray
vec3 midOut = vec3(0.25); // Output middle gray
vec3 a_d = a * d;
vec3 hdrMaxA = pow(hdrMax, a);
vec3 hdrMaxAD = pow(hdrMax, a_d);
vec3 midInA = pow(midIn, a);
vec3 midInAD = pow(midIn, a_d);
vec3 HM1 = hdrMaxA * midOut;
vec3 HM2 = hdrMaxAD - midInAD;
vec3 b = (-midInA + HM1) / (HM2 * midOut);
vec3 c = (hdrMaxAD * midInA - HM1 * midInAD) / (HM2 * midOut);
vec3 colorOut = pow(color, a) / (pow(color, a_d) * b + c);
linearToRGB(colorOut);
// Remove tonemapping from darker colors for better readability
const float darkLiftStart = 0.1;
const float darkLiftMix = 0.75;
float darkLift = smoothstep(darkLiftStart, 0.0, initialLuminance);
vec3 smoothColor = pow(color, vec3(1.0 / 2.2));
colorOut = mix(colorOut, smoothColor, darkLift * darkLiftMix * max0(0.55 - abs(1.05 - TM_CONTRAST)) / 0.55);
// Path to White
const float wpInputCurveStart = 0.0;
const float wpInputCurveMax = 16.0; // Increase this value to reduce the effect of white path
float modifiedLuminance = pow(initialLuminance / wpInputCurveMax, 2.0 - TM_WHITE_PATH) * wpInputCurveMax;
float whitePath = smoothstep(wpInputCurveStart, wpInputCurveMax, modifiedLuminance);
colorOut = mix(colorOut, vec3(1.0), whitePath);
// Desaturate dark colors
const float dpInputCurveStart = 0.1;
const float dpInputCurveMax = 0.0;
float desaturatePath = smoothstep(dpInputCurveStart, dpInputCurveMax, initialLuminance);
colorOut = mix(colorOut, vec3(GetLuminance(colorOut)), desaturatePath * TM_DARK_DESATURATION);
doColorAdjustmentsWithoutExposure(colorOut);
color = clamp01(colorOut);
return color;
}
float rollOffBrightValues(vec3 color, float intensity) {
float luminance = GetLuminance(color);
float rolled = luminance / (1.0 + luminance * intensity);
return rolled / max(luminance, 0.0001);
}
float saturationTM = T_SATURATION;
vec3 LottesTonemap(vec3 color) {
// Lottes 2016, "Advanced Techniques and Optimization of HDR Color Pipelines"
// http://32ipi028l5q82yhj72224m8j.wpengine.netdna-cdn.com/wp-content/uploads/2016/03/GdcVdrLottes.pdf
const vec3 a = vec3(1.3);
const vec3 d = vec3(0.95);
const vec3 hdrMax = vec3(8.0);
const vec3 midIn = vec3(0.25);
const vec3 midOut = vec3(0.25);
const vec3 a_d = a * d;
const vec3 hdrMaxA = pow(hdrMax, a);
const vec3 hdrMaxAD = pow(hdrMax, a_d);
const vec3 midInA = pow(midIn, a);
const vec3 midInAD = pow(midIn, a_d);
const vec3 HM1 = hdrMaxA * midOut;
const vec3 HM2 = hdrMaxAD - midInAD;
const vec3 b = (-midInA + HM1) / (HM2 * midOut);
const vec3 c = (hdrMaxAD * midInA - HM1 * midInAD) / (HM2 * midOut);
color = pow(color, a) / (pow(color, a_d) * b + c);
doColorAdjustments(color);
linearToRGB(color);
return color;
}
// From https://github.com/godotengine/godot/blob/master/servers/rendering/renderer_rd/shaders/effects/tonemap.glsl
// Adapted from https://github.com/TheRealMJP/BakingLab/blob/master/BakingLab/ACES.hlsl
// (MIT License).
vec3 ACESTonemap(vec3 color) {
float white = ACES_WHITE;
const float exposure_bias = ACES_EXPOSURE;
color *= rollOffBrightValues(color, ACES_BRIGHTNESS_ROLLOFF);
const float A = 0.0245786f;
const float B = 0.000090537f;
const float C = 0.983729f;
const float D = 0.432951f;
const float E = 0.238081f;
const mat3 rgb_to_rrt = mat3(
vec3(0.59719f * exposure_bias, 0.35458f * exposure_bias, 0.04823f * exposure_bias),
vec3(0.07600f * exposure_bias, 0.90834f * exposure_bias, 0.01566f * exposure_bias),
vec3(0.02840f * exposure_bias, 0.13383f * exposure_bias, 0.83777f * exposure_bias));
const mat3 odt_to_rgb = mat3(
vec3(1.60475f, -0.53108f, -0.07367f),
vec3(-0.10208f, 1.10813f, -0.00605f),
vec3(-0.00327f, -0.07276f, 1.07602f));
color *= rgb_to_rrt;
vec3 color_tonemapped = (color * (color + A) - B) / (color * (C * color + D) + E);
color_tonemapped *= odt_to_rgb;
white *= exposure_bias;
float white_tonemapped = (white * (white + A) - B) / (white * (C * white + D) + E);
color = color_tonemapped / white_tonemapped;
color = clamp(color, vec3(0.0), vec3(1.0));
doColorAdjustments(color);
linearToRGB(color);
return color;
}
vec3 ACESRedModified(vec3 color) {
float white = ACES_WHITE;
const float exposure_bias = ACES_EXPOSURE;
color *= rollOffBrightValues(color, ACES_BRIGHTNESS_ROLLOFF);
const float A = 0.0245786f;
const float B = 0.000090537f;
const float C = 0.983729f;
const float D = 0.432951f;
const float E = 0.238081f;
const mat3 rgb_to_rrt = mat3(
vec3(0.50719f * exposure_bias, 0.40458f * exposure_bias, 0.03823f * exposure_bias),
vec3(0.01300f * exposure_bias, 0.90834f * exposure_bias, 0.00966f * exposure_bias),
vec3(0.00200f * exposure_bias, 0.15383f * exposure_bias, 0.83777f * exposure_bias));
const mat3 odt_to_rgb = mat3(
vec3(1.60475f, -0.53108f, -0.07367f),
vec3(-0.10208f, 1.10813f, -0.00605f),
vec3(-0.00327f, -0.07276f, 1.07602f));
color *= rgb_to_rrt;
vec3 color_tonemapped = (color * (color + A) - B) / (color * (C * color + D) + E);
color_tonemapped *= odt_to_rgb;
white *= exposure_bias;
float white_tonemapped = (white * (white + A) - B) / (white * (C * white + D) + E);
color = color_tonemapped / white_tonemapped;
color = clamp(color, vec3(0.0), vec3(1.0));
doColorAdjustments(color);
linearToRGB(color);
return color;
}
// Filmic tonemapping operator made by Jim Hejl and Richard Burgess
// Modified by Tech to not lose color information below 0.004
vec3 BurgessTonemap(vec3 rgb) {
rgb = rgb * min(vec3(1.0), 1.0 - 0.8 * exp(1.0/-0.004 * rgb));
rgb = (rgb * (6.2 * rgb + 0.5)) / (rgb * (6.2 * rgb + 1.7) + 0.06);
doColorAdjustments(rgb);
return rgb;
}
// Hable 2010, "Filmic Tonemapping Operators"
vec3 Uncharted2(vec3 x) {
x *= 16.0;
const float A = 0.15;
const float B = 0.50;
const float C = 0.10;
const float D = 0.20;
const float E = 0.02;
const float F = 0.30;
return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
}
// Filmic tonemapping operator made by John Hable for Uncharted 2
vec3 uncharted2_tonemap_partial(vec3 color) {
const float a = 0.15;
const float b = 0.50;
const float c = 0.10;
const float d = 0.20;
const float e = 0.02;
const float f = 0.30;
color = ((color * (a * color + (c * b)) + (d * e)) / (color * (a * color + b) + d * f)) - e / f;
doColorAdjustments(color);
linearToRGB(color);
return color;
}
vec3 uncharted2_filmic(vec3 v) {
float exposure_bias = 1.0f;
vec3 curr = uncharted2_tonemap_partial(v * exposure_bias);
vec3 W = vec3(11.2f);
vec3 white_scale = vec3(1.0f) / uncharted2_tonemap_partial(W);
v = curr * white_scale;
doColorAdjustments(v);
linearToRGB(v);
return v;
}
vec3 reinhard2(vec3 x) {
const float L_white = 4.0;
linearToRGB(x);
x = (x * (1.1 + x / (L_white * L_white))) / (1.0 + x);
doColorAdjustments(x);
return x;
}
vec3 filmic(vec3 x) {
linearToRGB(x);
vec3 X = max(vec3(0.0), x - 0.004);
vec3 result = (X * (6.2 * X + 0.5)) / (X * (6.2 * X + 1.7) + 0.06);
x = pow(result, vec3(2.2));
doColorAdjustments(x);
return x;
}
float GTTonemap(float x) { // source https://gist.github.com/shakesoda/1dcb3e159f586995ca076c8b21f05a67
float m = 0.22; // linear section start
float a = 1.0; // contrast
float c = 1.33; // black brightness
float P = 1.0; // maximum brightness
float l = 0.4; // linear section length
float l0 = ((P-m)*l) / a; // 0.312
float S0 = m + l0; // 0.532
float S1 = m + a * l0; // 0.532
float C2 = (a*P) / (P - S1); // 2.13675213675
float L = m + a * (x - m);
float T = m * pow(x/m, c);
float S = P - (P - S1) * exp(-C2*(x - S0)/P);
float w0 = 1 - smoothstep(0.0, m, x);
float w2 = (x < m+l)?0:1;
float w1 = 1 - w0 - w2;
return float(T * w0 + L * w1 + S * w2);
}
// this costs about 0.2-0.3ms more than aces, as-is
vec3 GTTonemap(vec3 x) {
linearToRGB(x);
x = vec3(GTTonemap(x.r), GTTonemap(x.g), GTTonemap(x.b));
doColorAdjustments(x);
return x;
}
vec3 uchimura(vec3 x, float P, float a, float m, float l, float c, float b) { //Uchimura, H. (2017). HDR Theory and practice. https://www.slideshare.net/nikuque/hdr-theory-and-practicce-jp; https://github.com/dmnsgn/glsl-tone-map/blob/main/uchimura.glsl
float l0 = ((P - m) * l) / a;
float L0 = m - m / a;
float L1 = m + (1.0 - m) / a;
float S0 = m + l0;
float S1 = m + a * l0;
float C2 = (a * P) / (P - S1);
float CP = -C2 / P;
vec3 w0 = vec3(1.0 - smoothstep(0.0, m, x));
vec3 w2 = vec3(step(m + l0, x));
vec3 w1 = vec3(1.0 - w0 - w2);
vec3 T = vec3(m * pow(x / m, vec3(c)) + b);
vec3 S = vec3(P - (P - S1) * exp(CP * (x - S0)));
vec3 L = vec3(m + a * (x - m));
return T * w0 + L * w1 + S * w2;
}
vec3 uchimura(vec3 color) {
const float P = 1.0; // max display brightness
const float a = 1.0; // contrast
const float m = 0.22; // linear section start
const float l = 0.4; // linear section length
const float c = 1.33; // black
const float b = 0.0; // pedestal
linearToRGB(color);
color = uchimura(color, P, a, m, l, c, b);
doColorAdjustments(color);
return color;
}
vec3 agxDefaultContrastApprox(vec3 x) {
vec3 x2 = x * x;
vec3 x4 = x2 * x2;
return x*(+0.12410293f
+x*(+0.2078625f
+x*(-5.9293431f
+x*(+30.376821f
+x*(-38.901506f
+x*(+15.122061f))))));
}
vec3 agx(vec3 val) {
const mat3 agx_mat = mat3(
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
0.0784335999999992, 0.878468636469772, 0.0784336,
0.0792237451477643, 0.0791661274605434, 0.879142973793104);
const float minEv = -12.47393f;
const float maxEv = 4.026069f;
// Input transform
val = agx_mat * val;
// Log2 space encoding
val = clamp(log2(val), minEv, maxEv);
val = (val - minEv) / (maxEv - minEv);
// Apply sigmoid function approximation
val = agxDefaultContrastApprox(val);
return val;
}
vec3 inv_agx(vec3 val) {
const mat3 inv_agx_mat = mat3(
1.1968790051201738155, -0.052896851757456180321, -0.052971635514443794537,
-0.098020881140136776078, 1.1519031299041727435, -0.098043450117124120312,
-0.099029744079720471434, -0.098961176844843346553, 1.1510736726411610622);
// Input transform
val = inv_agx_mat * val;
return val;
}
vec3 agxLook(vec3 val) {
const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
float luma = dot(val, lw);
vec3 offset = vec3(0.0);
#if AGX_LOOK == 0
// Default
const vec3 slope = vec3(1.0);
const vec3 power = vec3(1.0);
const float sat = 1.0;
#elif AGX_LOOK == 1
// Golden
const vec3 slope = vec3(1.0, 0.9, 0.5);
const vec3 power = vec3(0.8);
const float sat = 0.8;
#elif AGX_LOOK == 2
// Punchy
const vec3 slope = vec3(1.0);
const vec3 power = vec3(1.35, 1.35, 1.35);
const float sat = 1.4;
#else
const vec3 slope = vec3(AGX_R, AGX_G, AGX_B) / 256;
const vec3 power = vec3(AGX_POWER);
const float sat = AGX_SATURATION;
#endif
// ASC CDL
val = pow(val * slope + offset, power);
return luma + sat * (val - luma);
}
vec3 agxTonemap(vec3 color) { // Minimal version of Troy Sobotka's AgX by bwrensch https://www.shadertoy.com/view/mdcSDH
color = agx(color);
color = agxLook(color);
color = inv_agx(color);
doColorAdjustments(color);
return color;
}
vec3 unreal(vec3 x) { // source: https://mini.gmshaders.com/p/tonemaps
// Unreal 3, Documentation: "Color Grading"
// Adapted to be close to Tonemap_ACES, with similar range
// Gamma 2.2 correction is baked in, don't use with sRGB conversion!
return x / (x + 0.155) * 1.019;
}
vec3 DoBSLTonemap(vec3 color) {
color = TM_EXPOSURE * color;
color = color / pow(pow(color, vec3(TM_WHITE_CURVE)) + 1.0, vec3(1.0 / TM_WHITE_CURVE));
color = pow(color, mix(vec3(T_LOWER_CURVE), vec3(T_UPPER_CURVE), sqrt(color)));
return pow(color, vec3(1.0 / 2.2));
}
void linearToRGB(inout vec3 color) {
const vec3 k = vec3(0.055);
color = mix((vec3(1.0) + k) * pow(color, vec3(1.0 / 2.4)) - k, 12.92 * color, lessThan(color, vec3(0.0031308)));
}
void doColorAdjustmentsWithoutExposure(inout vec3 color) {
color = pow(color, mix(vec3(T_LOWER_CURVE - 0.10), vec3(T_UPPER_CURVE - 0.30), sqrt(color)));
}
void doColorAdjustments(inout vec3 color) {
color = TM_EXPOSURE * color;
doColorAdjustmentsWithoutExposure(color);
}
vec3 DoCompTonemap(inout vec3 color) {
// Lottes tonemap modified for Complementary Shaders
// Lottes 2016, "Advanced Techniques and Optimization of HDR Color Pipelines"
// http://32ipi028l5q82yhj72224m8j.wpengine.netdna-cdn.com/wp-content/uploads/2016/03/GdcVdrLottes.pdf
color = TM_EXPOSURE * color;
float colorMax = max(color.r, max(color.g, color.b));
float initialLuminance = GetLuminance(color);
vec3 a = vec3(TM_CONTRAST); // General Contrast
vec3 d = vec3(1.0); // Roll-off control
vec3 hdrMax = vec3(8.0); // Maximum input brightness
vec3 midIn = vec3(0.25); // Input middle gray
vec3 midOut = vec3(0.25); // Output middle gray
vec3 a_d = a * d;
vec3 hdrMaxA = pow(hdrMax, a);
vec3 hdrMaxAD = pow(hdrMax, a_d);
vec3 midInA = pow(midIn, a);
vec3 midInAD = pow(midIn, a_d);
vec3 HM1 = hdrMaxA * midOut;
vec3 HM2 = hdrMaxAD - midInAD;
vec3 b = (-midInA + HM1) / (HM2 * midOut);
vec3 c = (hdrMaxAD * midInA - HM1 * midInAD) / (HM2 * midOut);
vec3 colorOut = pow(color, a) / (pow(color, a_d) * b + c);
linearToRGB(colorOut);
// Remove tonemapping from darker colors for better readability
const float darkLiftStart = 0.1;
const float darkLiftMix = 0.75;
float darkLift = smoothstep(darkLiftStart, 0.0, initialLuminance);
vec3 smoothColor = pow(color, vec3(1.0 / 2.2));
colorOut = mix(colorOut, smoothColor, darkLift * darkLiftMix * max0(0.55 - abs(1.05 - TM_CONTRAST)) / 0.55);
// Path to White
const float wpInputCurveStart = 0.0;
const float wpInputCurveMax = 16.0; // Increase this value to reduce the effect of white path
float modifiedLuminance = pow(initialLuminance / wpInputCurveMax, 2.0 - TM_WHITE_PATH) * wpInputCurveMax;
float whitePath = smoothstep(wpInputCurveStart, wpInputCurveMax, modifiedLuminance);
colorOut = mix(colorOut, vec3(1.0), whitePath);
// Desaturate dark colors
const float dpInputCurveStart = 0.1;
const float dpInputCurveMax = 0.0;
float desaturatePath = smoothstep(dpInputCurveStart, dpInputCurveMax, initialLuminance);
colorOut = mix(colorOut, vec3(GetLuminance(colorOut)), desaturatePath * TM_DARK_DESATURATION);
doColorAdjustmentsWithoutExposure(colorOut);
color = clamp01(colorOut);
return color;
}
float rollOffBrightValues(vec3 color, float intensity) {
float luminance = GetLuminance(color);
float rolled = luminance / (1.0 + luminance * intensity);
return rolled / max(luminance, 0.0001);
}
float saturationTM = T_SATURATION;
vec3 LottesTonemap(vec3 color) {
// Lottes 2016, "Advanced Techniques and Optimization of HDR Color Pipelines"
// http://32ipi028l5q82yhj72224m8j.wpengine.netdna-cdn.com/wp-content/uploads/2016/03/GdcVdrLottes.pdf
const vec3 a = vec3(1.3);
const vec3 d = vec3(0.95);
const vec3 hdrMax = vec3(8.0);
const vec3 midIn = vec3(0.25);
const vec3 midOut = vec3(0.25);
const vec3 a_d = a * d;
const vec3 hdrMaxA = pow(hdrMax, a);
const vec3 hdrMaxAD = pow(hdrMax, a_d);
const vec3 midInA = pow(midIn, a);
const vec3 midInAD = pow(midIn, a_d);
const vec3 HM1 = hdrMaxA * midOut;
const vec3 HM2 = hdrMaxAD - midInAD;
const vec3 b = (-midInA + HM1) / (HM2 * midOut);
const vec3 c = (hdrMaxAD * midInA - HM1 * midInAD) / (HM2 * midOut);
color = pow(color, a) / (pow(color, a_d) * b + c);
doColorAdjustments(color);
linearToRGB(color);
return color;
}
// From https://github.com/godotengine/godot/blob/master/servers/rendering/renderer_rd/shaders/effects/tonemap.glsl
// Adapted from https://github.com/TheRealMJP/BakingLab/blob/master/BakingLab/ACES.hlsl
// (MIT License).
vec3 ACESTonemap(vec3 color) {
float white = ACES_WHITE;
const float exposure_bias = ACES_EXPOSURE;
color *= rollOffBrightValues(color, ACES_BRIGHTNESS_ROLLOFF);
const float A = 0.0245786f;
const float B = 0.000090537f;
const float C = 0.983729f;
const float D = 0.432951f;
const float E = 0.238081f;
const mat3 rgb_to_rrt = mat3(
vec3(0.59719f * exposure_bias, 0.35458f * exposure_bias, 0.04823f * exposure_bias),
vec3(0.07600f * exposure_bias, 0.90834f * exposure_bias, 0.01566f * exposure_bias),
vec3(0.02840f * exposure_bias, 0.13383f * exposure_bias, 0.83777f * exposure_bias));
const mat3 odt_to_rgb = mat3(
vec3(1.60475f, -0.53108f, -0.07367f),
vec3(-0.10208f, 1.10813f, -0.00605f),
vec3(-0.00327f, -0.07276f, 1.07602f));
color *= rgb_to_rrt;
vec3 color_tonemapped = (color * (color + A) - B) / (color * (C * color + D) + E);
color_tonemapped *= odt_to_rgb;
white *= exposure_bias;
float white_tonemapped = (white * (white + A) - B) / (white * (C * white + D) + E);
color = color_tonemapped / white_tonemapped;
color = clamp(color, vec3(0.0), vec3(1.0));
doColorAdjustments(color);
linearToRGB(color);
return color;
}
vec3 ACESRedModified(vec3 color) {
float white = ACES_WHITE;
const float exposure_bias = ACES_EXPOSURE;
color *= rollOffBrightValues(color, ACES_BRIGHTNESS_ROLLOFF);
const float A = 0.0245786f;
const float B = 0.000090537f;
const float C = 0.983729f;
const float D = 0.432951f;
const float E = 0.238081f;
const mat3 rgb_to_rrt = mat3(
vec3(0.50719f * exposure_bias, 0.40458f * exposure_bias, 0.03823f * exposure_bias),
vec3(0.01300f * exposure_bias, 0.90834f * exposure_bias, 0.00966f * exposure_bias),
vec3(0.00200f * exposure_bias, 0.15383f * exposure_bias, 0.83777f * exposure_bias));
const mat3 odt_to_rgb = mat3(
vec3(1.60475f, -0.53108f, -0.07367f),
vec3(-0.10208f, 1.10813f, -0.00605f),
vec3(-0.00327f, -0.07276f, 1.07602f));
color *= rgb_to_rrt;
vec3 color_tonemapped = (color * (color + A) - B) / (color * (C * color + D) + E);
color_tonemapped *= odt_to_rgb;
white *= exposure_bias;
float white_tonemapped = (white * (white + A) - B) / (white * (C * white + D) + E);
color = color_tonemapped / white_tonemapped;
color = clamp(color, vec3(0.0), vec3(1.0));
doColorAdjustments(color);
linearToRGB(color);
return color;
}
// Filmic tonemapping operator made by Jim Hejl and Richard Burgess
// Modified by Tech to not lose color information below 0.004
vec3 BurgessTonemap(vec3 rgb) {
rgb = rgb * min(vec3(1.0), 1.0 - 0.8 * exp(1.0/-0.004 * rgb));
rgb = (rgb * (6.2 * rgb + 0.5)) / (rgb * (6.2 * rgb + 1.7) + 0.06);
doColorAdjustments(rgb);
return rgb;
}
// Hable 2010, "Filmic Tonemapping Operators"
vec3 Uncharted2(vec3 x) {
x *= 16.0;
const float A = 0.15;
const float B = 0.50;
const float C = 0.10;
const float D = 0.20;
const float E = 0.02;
const float F = 0.30;
return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
}
// Filmic tonemapping operator made by John Hable for Uncharted 2
vec3 uncharted2_tonemap_partial(vec3 color) {
const float a = 0.15;
const float b = 0.50;
const float c = 0.10;
const float d = 0.20;
const float e = 0.02;
const float f = 0.30;
color = ((color * (a * color + (c * b)) + (d * e)) / (color * (a * color + b) + d * f)) - e / f;
doColorAdjustments(color);
linearToRGB(color);
return color;
}
vec3 uncharted2_filmic(vec3 v) {
float exposure_bias = 1.0f;
vec3 curr = uncharted2_tonemap_partial(v * exposure_bias);
vec3 W = vec3(11.2f);
vec3 white_scale = vec3(1.0f) / uncharted2_tonemap_partial(W);
v = curr * white_scale;
doColorAdjustments(v);
linearToRGB(v);
return v;
}
vec3 reinhard2(vec3 x) {
const float L_white = 4.0;
linearToRGB(x);
x = (x * (1.1 + x / (L_white * L_white))) / (1.0 + x);
doColorAdjustments(x);
return x;
}
vec3 filmic(vec3 x) {
linearToRGB(x);
vec3 X = max(vec3(0.0), x - 0.004);
vec3 result = (X * (6.2 * X + 0.5)) / (X * (6.2 * X + 1.7) + 0.06);
x = pow(result, vec3(2.2));
doColorAdjustments(x);
return x;
}
float GTTonemap(float x) { // source https://gist.github.com/shakesoda/1dcb3e159f586995ca076c8b21f05a67
float m = 0.22; // linear section start
float a = 1.0; // contrast
float c = 1.33; // black brightness
float P = 1.0; // maximum brightness
float l = 0.4; // linear section length
float l0 = ((P-m)*l) / a; // 0.312
float S0 = m + l0; // 0.532
float S1 = m + a * l0; // 0.532
float C2 = (a*P) / (P - S1); // 2.13675213675
float L = m + a * (x - m);
float T = m * pow(x/m, c);
float S = P - (P - S1) * exp(-C2*(x - S0)/P);
float w0 = 1 - smoothstep(0.0, m, x);
float w2 = (x < m+l)?0:1;
float w1 = 1 - w0 - w2;
return float(T * w0 + L * w1 + S * w2);
}
// this costs about 0.2-0.3ms more than aces, as-is
vec3 GTTonemap(vec3 x) {
linearToRGB(x);
x = vec3(GTTonemap(x.r), GTTonemap(x.g), GTTonemap(x.b));
doColorAdjustments(x);
return x;
}
vec3 uchimura(vec3 x, float P, float a, float m, float l, float c, float b) { //Uchimura, H. (2017). HDR Theory and practice. https://www.slideshare.net/nikuque/hdr-theory-and-practicce-jp; https://github.com/dmnsgn/glsl-tone-map/blob/main/uchimura.glsl
float l0 = ((P - m) * l) / a;
float L0 = m - m / a;
float L1 = m + (1.0 - m) / a;
float S0 = m + l0;
float S1 = m + a * l0;
float C2 = (a * P) / (P - S1);
float CP = -C2 / P;
vec3 w0 = vec3(1.0 - smoothstep(0.0, m, x));
vec3 w2 = vec3(step(m + l0, x));
vec3 w1 = vec3(1.0 - w0 - w2);
vec3 T = vec3(m * pow(x / m, vec3(c)) + b);
vec3 S = vec3(P - (P - S1) * exp(CP * (x - S0)));
vec3 L = vec3(m + a * (x - m));
return T * w0 + L * w1 + S * w2;
}
vec3 uchimura(vec3 color) {
const float P = 1.0; // max display brightness
const float a = 1.0; // contrast
const float m = 0.22; // linear section start
const float l = 0.4; // linear section length
const float c = 1.33; // black
const float b = 0.0; // pedestal
linearToRGB(color);
color = uchimura(color, P, a, m, l, c, b);
doColorAdjustments(color);
return color;
}
vec3 agxDefaultContrastApprox(vec3 x) {
vec3 x2 = x * x;
vec3 x4 = x2 * x2;
return x*(+0.12410293f
+x*(+0.2078625f
+x*(-5.9293431f
+x*(+30.376821f
+x*(-38.901506f
+x*(+15.122061f))))));
}
vec3 agx(vec3 val) {
const mat3 agx_mat = mat3(
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
0.0784335999999992, 0.878468636469772, 0.0784336,
0.0792237451477643, 0.0791661274605434, 0.879142973793104);
const float minEv = -12.47393f;
const float maxEv = 4.026069f;
// Input transform
val = agx_mat * val;
// Log2 space encoding
val = clamp(log2(val), minEv, maxEv);
val = (val - minEv) / (maxEv - minEv);
// Apply sigmoid function approximation
val = agxDefaultContrastApprox(val);
return val;
}
vec3 inv_agx(vec3 val) {
const mat3 inv_agx_mat = mat3(
1.1968790051201738155, -0.052896851757456180321, -0.052971635514443794537,
-0.098020881140136776078, 1.1519031299041727435, -0.098043450117124120312,
-0.099029744079720471434, -0.098961176844843346553, 1.1510736726411610622);
// Input transform
val = inv_agx_mat * val;
return val;
}
vec3 agxLook(vec3 val) {
const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
float luma = dot(val, lw);
vec3 offset = vec3(0.0);
#if AGX_LOOK == 0
// Default
const vec3 slope = vec3(1.0);
const vec3 power = vec3(1.0);
const float sat = 1.0;
#elif AGX_LOOK == 1
// Golden
const vec3 slope = vec3(1.0, 0.9, 0.5);
const vec3 power = vec3(0.8);
const float sat = 0.8;
#elif AGX_LOOK == 2
// Punchy
const vec3 slope = vec3(1.0);
const vec3 power = vec3(1.35, 1.35, 1.35);
const float sat = 1.4;
#else
const vec3 slope = vec3(AGX_R, AGX_G, AGX_B) / 256;
const vec3 power = vec3(AGX_POWER);
const float sat = AGX_SATURATION;
#endif
// ASC CDL
val = pow(val * slope + offset, power);
return luma + sat * (val - luma);
}
vec3 agxTonemap(vec3 color) { // Minimal version of Troy Sobotka's AgX by bwrensch https://www.shadertoy.com/view/mdcSDH
color = agx(color);
color = agxLook(color);
color = inv_agx(color);
doColorAdjustments(color);
return color;
}
vec3 unreal(vec3 x) { // source: https://mini.gmshaders.com/p/tonemaps
// Unreal 3, Documentation: "Color Grading"
// Adapted to be close to Tonemap_ACES, with similar range
// Gamma 2.2 correction is baked in, don't use with sRGB conversion!
return x / (x + 0.155) * 1.019;
}
@@ -1,86 +1,86 @@
#ifndef INCLUDE_CLOUD_SHADOWS
#define INCLUDE_CLOUD_SHADOWS
#include "/lib/shaderSettings/cloudsAndLighting.glsl"
#ifdef CLOUDS_REIMAGINED
#include "/lib/atmospherics/clouds/cloudCoord.glsl"
#endif
float GetCloudShadow(vec3 playerPos) {
#ifndef OVERWORLD
return 1.0;
#endif
float cloudShadow = 1.0;
vec3 worldPos = playerPos + cameraPosition;
#if defined DO_PIXELATION_EFFECTS && defined PIXELATED_SHADOWS
//worldPos = playerPosPixelated + cameraPosition; // Disabled for now because cloud shadows are too soft to notice pixelation
#endif
#ifdef CLOUDS_REIMAGINED
float EdotL = dot(eastVec, lightVec);
float EdotLM = tan(acos(EdotL));
#if SUN_ANGLE != 0
float NVdotLM = tan(acos(dot(northVec, lightVec)));
#endif
float distToCloudLayer1 = cloudAlt1i - worldPos.y;
vec3 cloudOffset1 = vec3(distToCloudLayer1 / EdotLM, 0.0, 0.0);
#if SUN_ANGLE != 0
cloudOffset1.z += distToCloudLayer1 / NVdotLM;
#endif
vec2 cloudPos1 = GetRoundedCloudCoord(ModifyTracePos(worldPos + cloudOffset1, cloudAlt1i).xz, CLOUD_SHADOW_ROUNDNESS);
#ifndef COMPOSITE
float cloudSample = texture2D(gaux4, cloudPos1).b;
#else
float cloudSample = texture2D(cloudWaterTex, cloudPos1).b;
#endif
cloudSample *= clamp(distToCloudLayer1 * 0.1, 0.0, 1.0);
#ifdef DOUBLE_REIM_CLOUDS
float distToCloudLayer2 = cloudAlt2i - worldPos.y;
vec3 cloudOffset2 = vec3(distToCloudLayer2 / EdotLM, 0.0, 0.0);
#if SUN_ANGLE != 0
cloudOffset2.z += distToCloudLayer2 / NVdotLM;
#endif
vec2 cloudPos2 = GetRoundedCloudCoord(ModifyTracePos(worldPos + cloudOffset2, cloudAlt2i).xz, CLOUD_SHADOW_ROUNDNESS);
float cloudSample2 = texture2D(gaux4, cloudPos2).b;
cloudSample2 *= clamp(distToCloudLayer2 * 0.1, 0.0, 1.0);
cloudSample = 1.0 - (1.0 - cloudSample) * (1.0 - cloudSample2);
#endif
cloudSample *= sqrt3(1.0 - abs(EdotL));
cloudShadow = 1.0 - 0.85 * cloudSample;
#else
vec2 csPos = worldPos.xz + worldPos.y * 0.25;
csPos.x += syncedTime;
csPos *= 0.000002 * CLOUD_UNBOUND_SIZE_MULT * CLOUD_SHADOW_UNBOUND_SIZE;
vec2 shadowoffsets[8] = vec2[8](
vec2( 0.0 , 1.0 ),
vec2( 0.7071, 0.7071),
vec2( 1.0 , 0.0 ),
vec2( 0.7071,-0.7071),
vec2( 0.0 ,-1.0 ),
vec2(-0.7071,-0.7071),
vec2(-1.0 , 0.0 ),
vec2(-0.7071, 0.7071));
float cloudSample = 0.0;
for (int i = 0; i < 8; i++) {
cloudSample += texture2DLod(noisetex, csPos + 0.005 * shadowoffsets[i], 0.0).b;
}
cloudShadow = smoothstep1(pow2(min1(cloudSample * 0.2)));
#endif
cloudShadow = mix(1.0, mix(cloudShadow, 1.0, NIGHT_CLOUD_UNBOUND_REMOVE * (1.0 - sunVisibility)), CLOUD_TRANSPARENCY);
return cloudShadow;
}
#endif
#ifndef INCLUDE_CLOUD_SHADOWS
#define INCLUDE_CLOUD_SHADOWS
#include "/lib/shaderSettings/cloudsAndLighting.glsl"
#ifdef CLOUDS_REIMAGINED
#include "/lib/atmospherics/clouds/cloudCoord.glsl"
#endif
float GetCloudShadow(vec3 playerPos) {
#ifndef OVERWORLD
return 1.0;
#endif
float cloudShadow = 1.0;
vec3 worldPos = playerPos + cameraPosition;
#if defined DO_PIXELATION_EFFECTS && defined PIXELATED_SHADOWS
//worldPos = playerPosPixelated + cameraPosition; // Disabled for now because cloud shadows are too soft to notice pixelation
#endif
#ifdef CLOUDS_REIMAGINED
float EdotL = dot(eastVec, lightVec);
float EdotLM = tan(acos(EdotL));
#if SUN_ANGLE != 0
float NVdotLM = tan(acos(dot(northVec, lightVec)));
#endif
float distToCloudLayer1 = cloudAlt1i - worldPos.y;
vec3 cloudOffset1 = vec3(distToCloudLayer1 / EdotLM, 0.0, 0.0);
#if SUN_ANGLE != 0
cloudOffset1.z += distToCloudLayer1 / NVdotLM;
#endif
vec2 cloudPos1 = GetRoundedCloudCoord(ModifyTracePos(worldPos + cloudOffset1, cloudAlt1i).xz, CLOUD_SHADOW_ROUNDNESS);
#ifndef COMPOSITE
float cloudSample = texture2D(gaux4, cloudPos1).b;
#else
float cloudSample = texture2D(cloudWaterTex, cloudPos1).b;
#endif
cloudSample *= clamp(distToCloudLayer1 * 0.1, 0.0, 1.0);
#ifdef DOUBLE_REIM_CLOUDS
float distToCloudLayer2 = cloudAlt2i - worldPos.y;
vec3 cloudOffset2 = vec3(distToCloudLayer2 / EdotLM, 0.0, 0.0);
#if SUN_ANGLE != 0
cloudOffset2.z += distToCloudLayer2 / NVdotLM;
#endif
vec2 cloudPos2 = GetRoundedCloudCoord(ModifyTracePos(worldPos + cloudOffset2, cloudAlt2i).xz, CLOUD_SHADOW_ROUNDNESS);
float cloudSample2 = texture2D(gaux4, cloudPos2).b;
cloudSample2 *= clamp(distToCloudLayer2 * 0.1, 0.0, 1.0);
cloudSample = 1.0 - (1.0 - cloudSample) * (1.0 - cloudSample2);
#endif
cloudSample *= sqrt3(1.0 - abs(EdotL));
cloudShadow = 1.0 - 0.85 * cloudSample;
#else
vec2 csPos = worldPos.xz + worldPos.y * 0.25;
csPos.x += syncedTime;
csPos *= 0.000002 * CLOUD_UNBOUND_SIZE_MULT * CLOUD_SHADOW_UNBOUND_SIZE;
vec2 shadowoffsets[8] = vec2[8](
vec2( 0.0 , 1.0 ),
vec2( 0.7071, 0.7071),
vec2( 1.0 , 0.0 ),
vec2( 0.7071,-0.7071),
vec2( 0.0 ,-1.0 ),
vec2(-0.7071,-0.7071),
vec2(-1.0 , 0.0 ),
vec2(-0.7071, 0.7071));
float cloudSample = 0.0;
for (int i = 0; i < 8; i++) {
cloudSample += texture2DLod(noisetex, csPos + 0.005 * shadowoffsets[i], 0.0).b;
}
cloudShadow = smoothstep1(pow2(min1(cloudSample * 0.2)));
#endif
cloudShadow = mix(1.0, mix(cloudShadow, 1.0, NIGHT_CLOUD_UNBOUND_REMOVE * (1.0 - sunVisibility)), CLOUD_TRANSPARENCY);
return cloudShadow;
}
#endif
@@ -1,88 +1,88 @@
#include "/lib/misc/reprojection.glsl"
vec3 linearRGB_to_Oklab(vec3 c) {
// Linear RGB to XYZ
float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;
float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;
float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;
// XYZ to Oklab
float l_ = pow(l, 1.0/3.0);
float m_ = pow(m, 1.0/3.0);
float s_ = pow(s, 1.0/3.0);
return vec3(
0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,
1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,
0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_
);
}
vec3 Oklab_to_linearRGB(vec3 lab) {
// Oklab to XYZ
float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;
float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;
float s_ = lab.x - 0.0894841775 * lab.y - 1.2914855480 * lab.z;
float l = l_*l_*l_;
float m = m_*m_*m_;
float s = s_*s_*s_;
// XYZ to linear RGB
return vec3(
+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
-0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s
);
}
vec3 saturateMCBL(vec3 color) {
vec3 oklab = linearRGB_to_Oklab(color);
float L = oklab.x;
vec2 ab = oklab.yz;
float chroma = length(ab);
float maxChroma = 0.11;
float targetChroma = min(chroma * 1.7, maxChroma);
float chromaFactor = (chroma > 0.0001) ? min(targetChroma / chroma, 2.0) : 1.0;
ab *= chromaFactor;
return Oklab_to_linearRGB(vec3(L, ab.xy));
}
vec3 ApplyMultiColoredBlocklight(vec3 blocklightCol, vec3 screenPos, vec3 playerPos, float lmCoord) {
float ACTDecider = 1.0;
vec4 coloredLight = texture2D(colortex10, screenPos.xy);
float lmCoordStep = step(0.1, lmCoord);
float entityMask = 0.0;
#if MCBL_MAIN_DEFINE == 3
entityMask = step(0.5, sqrt3(coloredLight.a)) * lmCoordStep;
#endif
#if MCBL_MAIN_DEFINE == 2 && COLORED_LIGHTING_INTERNAL != 0
vec3 absPlayerPos = abs(playerPos);
float maxPlayerPos = max(absPlayerPos.x, max(absPlayerPos.y * 2.0, absPlayerPos.z));
ACTDecider = pow2(min1(maxPlayerPos / min(effectiveACTdistance, far) * 2.0)); // this is to make the effect fade at the edge of ACT range
if (entityMask < 0.5 && ACTDecider < 0.5) return blocklightCol;
#endif
vec3 cameraOffset = cameraPosition - previousCameraPosition;
cameraOffset *= float(screenPos.z * 2.0 - 1.0 > 0.56);
if (screenPos.z > 0.56) {
screenPos.xy = Reprojection(screenPos, cameraOffset);
}
coloredLight.rgb = saturateMCBL(coloredLight.rgb); // make colors pop!
vec3 coloredLightNormalized = normalize(coloredLight.rgb + 0.00001);
// do luminance correction for a seamless transition from the default blocklight color
coloredLightNormalized *= GetLuminance(blocklightCol) / GetLuminance(coloredLightNormalized);
float coloredLightMix = min1((coloredLight.r + coloredLight.g + coloredLight.b) * 2048);
coloredLightMix = mix(0, coloredLightMix, mix(ACTDecider, 1.0, entityMask));
// coloredLightNormalized = vec3(2,0,0);
return mix(blocklightCol, coloredLightNormalized, coloredLightMix * clamp01(MCBL_INFLUENCE) * (1.0 - float(isnan(coloredLightNormalized))) * max(sign(lmCoord), 0.0));
}
#include "/lib/misc/reprojection.glsl"
vec3 linearRGB_to_Oklab(vec3 c) {
// Linear RGB to XYZ
float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;
float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;
float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;
// XYZ to Oklab
float l_ = pow(l, 1.0/3.0);
float m_ = pow(m, 1.0/3.0);
float s_ = pow(s, 1.0/3.0);
return vec3(
0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,
1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,
0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_
);
}
vec3 Oklab_to_linearRGB(vec3 lab) {
// Oklab to XYZ
float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;
float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;
float s_ = lab.x - 0.0894841775 * lab.y - 1.2914855480 * lab.z;
float l = l_*l_*l_;
float m = m_*m_*m_;
float s = s_*s_*s_;
// XYZ to linear RGB
return vec3(
+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
-0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s
);
}
vec3 saturateMCBL(vec3 color) {
vec3 oklab = linearRGB_to_Oklab(color);
float L = oklab.x;
vec2 ab = oklab.yz;
float chroma = length(ab);
float maxChroma = 0.11;
float targetChroma = min(chroma * 1.7, maxChroma);
float chromaFactor = (chroma > 0.0001) ? min(targetChroma / chroma, 2.0) : 1.0;
ab *= chromaFactor;
return Oklab_to_linearRGB(vec3(L, ab.xy));
}
vec3 ApplyMultiColoredBlocklight(vec3 blocklightCol, vec3 screenPos, vec3 playerPos, float lmCoord) {
float ACTDecider = 1.0;
vec4 coloredLight = texture2D(colortex10, screenPos.xy);
float lmCoordStep = step(0.1, lmCoord);
float entityMask = 0.0;
#if MCBL_MAIN_DEFINE == 3
entityMask = step(0.5, sqrt3(coloredLight.a)) * lmCoordStep;
#endif
#if MCBL_MAIN_DEFINE == 2 && COLORED_LIGHTING_INTERNAL != 0
vec3 absPlayerPos = abs(playerPos);
float maxPlayerPos = max(absPlayerPos.x, max(absPlayerPos.y * 2.0, absPlayerPos.z));
ACTDecider = pow2(min1(maxPlayerPos / min(effectiveACTdistance, far) * 2.0)); // this is to make the effect fade at the edge of ACT range
if (entityMask < 0.5 && ACTDecider < 0.5) return blocklightCol;
#endif
vec3 cameraOffset = cameraPosition - previousCameraPosition;
cameraOffset *= float(screenPos.z * 2.0 - 1.0 > 0.56);
if (screenPos.z > 0.56) {
screenPos.xy = Reprojection(screenPos, cameraOffset);
}
coloredLight.rgb = saturateMCBL(coloredLight.rgb); // make colors pop!
vec3 coloredLightNormalized = normalize(coloredLight.rgb + 0.00001);
// do luminance correction for a seamless transition from the default blocklight color
coloredLightNormalized *= GetLuminance(blocklightCol) / GetLuminance(coloredLightNormalized);
float coloredLightMix = min1((coloredLight.r + coloredLight.g + coloredLight.b) * 2048);
coloredLightMix = mix(0, coloredLightMix, mix(ACTDecider, 1.0, entityMask));
// coloredLightNormalized = vec3(2,0,0);
return mix(blocklightCol, coloredLightNormalized, coloredLightMix * clamp01(MCBL_INFLUENCE) * (1.0 - float(isnan(coloredLightNormalized))) * max(sign(lmCoord), 0.0));
}
@@ -1,60 +1,60 @@
// GGX area light approximation from Horizon Zero Dawn
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 GGX(vec3 normalM, vec3 viewPos, vec3 lightVec, float NdotLmax0, float smoothnessG) {
smoothnessG = sqrt1(smoothnessG * 0.9 + 0.1);
float roughnessP = (1.35 - smoothnessG);
float roughness = pow2(pow2(roughnessP));
vec3 halfVec = normalize(lightVec - viewPos);
float dotLH = clamp(dot(halfVec, lightVec), 0.0, 1.0);
float dotNV = dot(normalM, -viewPos);
#if WATER_REFLECT_QUALITY >= 2
float dotNH = GetNoHSquared(0.01, NdotLmax0, dotNV, dot(-viewPos, lightVec));
#else
float dotNH = pow2(min1(2.0 * NdotLmax0 * dotNV * length(halfVec) - dot(-viewPos, lightVec)));
#endif
float denom = dotNH * roughness - dotNH + 1.0;
float D = roughness / (3.141592653589793 * pow2(denom));
float f0 = 0.05;
float F = exp2((-5.55473 * dotLH - 6.98316) * dotLH) * (1.0 - f0) + f0;
float NdotLmax0M = sqrt3(NdotLmax0 * max0(dot(normal, lightVec)));
float specular = max0(NdotLmax0M * D * F / pow2(dotLH));
specular = specular / (0.125 * specular + 1.0);
return specular;
}
// GGX area light approximation from Horizon Zero Dawn
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 GGX(vec3 normalM, vec3 viewPos, vec3 lightVec, float NdotLmax0, float smoothnessG) {
smoothnessG = sqrt1(smoothnessG * 0.9 + 0.1);
float roughnessP = (1.35 - smoothnessG);
float roughness = pow2(pow2(roughnessP));
vec3 halfVec = normalize(lightVec - viewPos);
float dotLH = clamp(dot(halfVec, lightVec), 0.0, 1.0);
float dotNV = dot(normalM, -viewPos);
#if WATER_REFLECT_QUALITY >= 2
float dotNH = GetNoHSquared(0.01, NdotLmax0, dotNV, dot(-viewPos, lightVec));
#else
float dotNH = pow2(min1(2.0 * NdotLmax0 * dotNV * length(halfVec) - dot(-viewPos, lightVec)));
#endif
float denom = dotNH * roughness - dotNH + 1.0;
float D = roughness / (3.141592653589793 * pow2(denom));
float f0 = 0.05;
float F = exp2((-5.55473 * dotLH - 6.98316) * dotLH) * (1.0 - f0) + f0;
float NdotLmax0M = sqrt3(NdotLmax0 * max0(dot(normal, lightVec)));
float specular = max0(NdotLmax0M * D * F / pow2(dotLH));
specular = specular / (0.125 * specular + 1.0);
return specular;
}
@@ -1,82 +1,82 @@
vec3 GetHeldLighting(vec3 playerPos, vec3 color, inout float emission, vec3 worldGeoNormal, vec3 normalM, vec3 viewPos) {
float heldLight = heldBlockLightValue; float heldLight2 = heldBlockLightValue2;
#ifndef IS_IRIS
if (heldLight > 15.1) heldLight = 0.0;
if (heldLight2 > 15.1) heldLight2 = 0.0;
#endif
#if COLORED_LIGHTING_INTERNAL == 0
vec3 heldLightCol = blocklightCol; vec3 heldLightCol2 = blocklightCol;
if (heldItemId == 45032) heldLight = 15; if (heldItemId2 == 45032) heldLight2 = 15; // Lava Bucket
#else
vec3 heldLightCol = GetSpecialBlocklightColor(heldItemId - 44000).rgb;
vec3 heldLightCol2 = GetSpecialBlocklightColor(heldItemId2 - 44000).rgb;
if (heldItemId == 45032) { heldLightCol = lavaSpecialLightColor.rgb; heldLight = 15; } // Lava Bucket
if (heldItemId2 == 45032) { heldLightCol2 = lavaSpecialLightColor.rgb; heldLight2 = 15; }
#if COLORED_LIGHT_SATURATION != 100
heldLightCol = mix(blocklightCol, heldLightCol, COLORED_LIGHT_SATURATION * 0.01);
heldLightCol2 = mix(blocklightCol, heldLightCol2, COLORED_LIGHT_SATURATION * 0.01);
#endif
#endif
vec3 playerPosLightM = playerPos + relativeEyePosition;
playerPosLightM.y += 0.7;
float lViewPosL = length(playerPosLightM) + 6.0;
#if HELD_LIGHTING_MODE == 1
lViewPosL *= 1.5;
#endif
#ifdef SPACEAGLE17
if (heldLight == 0 && heldLight2 == 0 && !firstPersonCamera && entityId != 50017 && !is_invisible && currentPlayerArmor < 0.4 && isOnGround) {
float powVal = 1.0 + 1.0 * (cos(frameTimeCounter * 1.5) * 0.5 + 0.5);
float anim = 2.8 * max(pow(0.8, powVal), 0.12);
heldLight = anim;
heldLight2 = anim;
heldLightCol = vec3(0.2392, 0.8235, 0.8667);
heldLightCol2 = vec3(0.2392, 0.8235, 0.8667);
playerPosLightM.y += 0.8;
lViewPosL = length(playerPosLightM) + 6.0;
lViewPosL = sqrt2(lViewPosL * 0.35) * 1.2;
}
#endif
#ifdef DIRECTIONAL_LIGHTMAP_NORMALS
vec3 cameraHeldLightPos = (gbufferModelView * vec4(-relativeEyePosition, 1.0)).xyz;
vec3 worldGeoNormalView = (gbufferModelView * vec4(worldGeoNormal, 1.0)).xyz;
cameraHeldLightPos.x += 0.66 * (float(heldLight > 0) - float(heldLight2 > 0)); // Held light position offset
float dirHandLightmap = clamp01(dot(normalize(cameraHeldLightPos - viewPos), normalM)) + 1.0;
float differenceDir = dirHandLightmap - (clamp01(dot(normalize(cameraHeldLightPos - viewPos), worldGeoNormalView)) + 1.0); // Difference between normal and geo normal
dirHandLightmap = mix(1.0, dirHandLightmap, differenceDir * DIRECTIONAL_LIGHTMAP_NORMALS_HANDHELD_STRENGTH);
heldLight *= dirHandLightmap;
heldLight2 *= dirHandLightmap;
#endif
heldLight = pow2(pow2(heldLight * 0.47 / lViewPosL));
heldLight2 = pow2(pow2(heldLight2 * 0.47 / lViewPosL));
vec3 heldLighting = pow2(heldLight * DoLuminanceCorrection(heldLightCol + 0.001))
+ pow2(heldLight2 * DoLuminanceCorrection(heldLightCol2 + 0.001));
#if COLORED_LIGHTING_INTERNAL > 0
AddSpecialLightDetail(heldLighting, color.rgb, emission);
#endif
#if HAND_BLOCKLIGHT_FLICKERING > 0
vec2 flickerNoiseHand = texture2DLod(noisetex, vec2(frameTimeCounter * 0.06), 0.0).rb;
float flickerMix = mix(1.0, min1(max(flickerNoiseHand.r, flickerNoiseHand.g) * 1.7), pow2(HAND_BLOCKLIGHT_FLICKERING * 0.1));
heldLighting *= flickerMix;
#ifdef GBUFFERS_HAND
emission *= mix(1.0, flickerMix, heldLight + heldLight2);
#endif
#endif
return heldLighting;
}
vec3 GetHeldLighting(vec3 playerPos, vec3 color, inout float emission, vec3 worldGeoNormal, vec3 normalM, vec3 viewPos) {
float heldLight = heldBlockLightValue; float heldLight2 = heldBlockLightValue2;
#ifndef IS_IRIS
if (heldLight > 15.1) heldLight = 0.0;
if (heldLight2 > 15.1) heldLight2 = 0.0;
#endif
#if COLORED_LIGHTING_INTERNAL == 0
vec3 heldLightCol = blocklightCol; vec3 heldLightCol2 = blocklightCol;
if (heldItemId == 45032) heldLight = 15; if (heldItemId2 == 45032) heldLight2 = 15; // Lava Bucket
#else
vec3 heldLightCol = GetSpecialBlocklightColor(heldItemId - 44000).rgb;
vec3 heldLightCol2 = GetSpecialBlocklightColor(heldItemId2 - 44000).rgb;
if (heldItemId == 45032) { heldLightCol = lavaSpecialLightColor.rgb; heldLight = 15; } // Lava Bucket
if (heldItemId2 == 45032) { heldLightCol2 = lavaSpecialLightColor.rgb; heldLight2 = 15; }
#if COLORED_LIGHT_SATURATION != 100
heldLightCol = mix(blocklightCol, heldLightCol, COLORED_LIGHT_SATURATION * 0.01);
heldLightCol2 = mix(blocklightCol, heldLightCol2, COLORED_LIGHT_SATURATION * 0.01);
#endif
#endif
vec3 playerPosLightM = playerPos + relativeEyePosition;
playerPosLightM.y += 0.7;
float lViewPosL = length(playerPosLightM) + 6.0;
#if HELD_LIGHTING_MODE == 1
lViewPosL *= 1.5;
#endif
#ifdef SPACEAGLE17
if (heldLight == 0 && heldLight2 == 0 && !firstPersonCamera && entityId != 50017 && !is_invisible && currentPlayerArmor < 0.4 && isOnGround) {
float powVal = 1.0 + 1.0 * (cos(frameTimeCounter * 1.5) * 0.5 + 0.5);
float anim = 2.8 * max(pow(0.8, powVal), 0.12);
heldLight = anim;
heldLight2 = anim;
heldLightCol = vec3(0.2392, 0.8235, 0.8667);
heldLightCol2 = vec3(0.2392, 0.8235, 0.8667);
playerPosLightM.y += 0.8;
lViewPosL = length(playerPosLightM) + 6.0;
lViewPosL = sqrt2(lViewPosL * 0.35) * 1.2;
}
#endif
#ifdef DIRECTIONAL_LIGHTMAP_NORMALS
vec3 cameraHeldLightPos = (gbufferModelView * vec4(-relativeEyePosition, 1.0)).xyz;
vec3 worldGeoNormalView = (gbufferModelView * vec4(worldGeoNormal, 1.0)).xyz;
cameraHeldLightPos.x += 0.66 * (float(heldLight > 0) - float(heldLight2 > 0)); // Held light position offset
float dirHandLightmap = clamp01(dot(normalize(cameraHeldLightPos - viewPos), normalM)) + 1.0;
float differenceDir = dirHandLightmap - (clamp01(dot(normalize(cameraHeldLightPos - viewPos), worldGeoNormalView)) + 1.0); // Difference between normal and geo normal
dirHandLightmap = mix(1.0, dirHandLightmap, differenceDir * DIRECTIONAL_LIGHTMAP_NORMALS_HANDHELD_STRENGTH);
heldLight *= dirHandLightmap;
heldLight2 *= dirHandLightmap;
#endif
heldLight = pow2(pow2(heldLight * 0.47 / lViewPosL));
heldLight2 = pow2(pow2(heldLight2 * 0.47 / lViewPosL));
vec3 heldLighting = pow2(heldLight * DoLuminanceCorrection(heldLightCol + 0.001))
+ pow2(heldLight2 * DoLuminanceCorrection(heldLightCol2 + 0.001));
#if COLORED_LIGHTING_INTERNAL > 0
AddSpecialLightDetail(heldLighting, color.rgb, emission);
#endif
#if HAND_BLOCKLIGHT_FLICKERING > 0
vec2 flickerNoiseHand = texture2DLod(noisetex, vec2(frameTimeCounter * 0.06), 0.0).rb;
float flickerMix = mix(1.0, min1(max(flickerNoiseHand.r, flickerNoiseHand.g) * 1.7), pow2(HAND_BLOCKLIGHT_FLICKERING * 0.1));
heldLighting *= flickerMix;
#ifdef GBUFFERS_HAND
emission *= mix(1.0, flickerMix, heldLight + heldLight2);
#endif
#endif
return heldLighting;
}
@@ -1,25 +1,25 @@
vec3 GetMinimumLighting(float lightmapYM, vec3 playerPos) {
float fadeMinLightDistance = 1.0;
#if DISTANCE_MIN_LIGHT > 0
float blockMinLightFadeDistance = 250;
float distMinLightIntensity = DISTANCE_MIN_LIGHT * 0.1;
fadeMinLightDistance = max(1.0 - length(playerPos) / blockMinLightFadeDistance, 0.0);
fadeMinLightDistance = exp((1.0 - fadeMinLightDistance) * -15.0 * distMinLightIntensity) * (1.0 - nightVision) + nightVision;
#endif
#if !defined END && CAVE_LIGHTING > 0
vec3 minLighting = vec3(0.005625 + vsBrightness * 0.043) * fadeMinLightDistance;
#if CAVE_LIGHTING != 100
#define CAVE_LIGHTING_M CAVE_LIGHTING * 0.01
minLighting *= CAVE_LIGHTING_M;
#endif
minLighting *= vec3(0.45, 0.475, 0.6);
minLighting *= 1.0 - lightmapYM;
#else
vec3 minLighting = vec3(0.0);
#endif
minLighting += nightVision * vec3(0.5, 0.5, 0.75);
return minLighting;
}
vec3 GetMinimumLighting(float lightmapYM, vec3 playerPos) {
float fadeMinLightDistance = 1.0;
#if DISTANCE_MIN_LIGHT > 0
float blockMinLightFadeDistance = 250;
float distMinLightIntensity = DISTANCE_MIN_LIGHT * 0.1;
fadeMinLightDistance = max(1.0 - length(playerPos) / blockMinLightFadeDistance, 0.0);
fadeMinLightDistance = exp((1.0 - fadeMinLightDistance) * -15.0 * distMinLightIntensity) * (1.0 - nightVision) + nightVision;
#endif
#if !defined END && CAVE_LIGHTING > 0
vec3 minLighting = vec3(0.005625 + vsBrightness * 0.043) * fadeMinLightDistance;
#if CAVE_LIGHTING != 100
#define CAVE_LIGHTING_M CAVE_LIGHTING * 0.01
minLighting *= CAVE_LIGHTING_M;
#endif
minLighting *= vec3(0.45, 0.475, 0.6);
minLighting *= 1.0 - lightmapYM;
#else
vec3 minLighting = vec3(0.0);
#endif
minLighting += nightVision * vec3(0.5, 0.5, 0.75);
return minLighting;
}
@@ -1,110 +1,110 @@
vec3 GetShadowPos(vec3 playerPos) {
vec3 shadowPos = PlayerToShadow(playerPos);
float distb = sqrt(shadowPos.x * shadowPos.x + shadowPos.y * shadowPos.y);
float distortFactor = distb * shadowMapBias + (1.0 - shadowMapBias);
shadowPos.xy /= distortFactor;
shadowPos.z *= 0.2;
return shadowPos * 0.5 + 0.5;
}
vec3 SampleShadow(vec3 shadowPos, float colorMult, float colorPow) {
float shadow0 = shadow2D(shadowtex0, vec3(shadowPos.st, shadowPos.z)).x;
vec3 shadowcol = vec3(0.0);
if (shadow0 < 1.0) {
float shadow1 = shadow2D(shadowtex1, vec3(shadowPos.st, shadowPos.z)).x;
if (shadow1 > 0.9999) {
shadowcol = texture2D(shadowcolor0, shadowPos.st).rgb * shadow1;
shadowcol *= colorMult;
shadowcol = pow(shadowcol, vec3(colorPow));
}
}
return shadowcol * (1.0 - shadow0) + shadow0;
}
float InterleavedGradientNoiseForShadows() {
float n = 52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y);
#if !defined GBUFFERS_ENTITIES && !defined GBUFFERS_HAND && !defined GBUFFERS_TEXTURED && defined TAA
return fract(n + goldenRatio * mod(float(frameCounter), 3600.0));
#else
return fract(n);
#endif
}
vec2 offsetDist(float x, int s) {
float n = fract(x * 2.427) * 3.1415;
return vec2(cos(n), sin(n)) * 1.4 * x / s;
}
vec3 SampleTAAFilteredShadow(vec3 shadowPos, float offset, int shadowSamples, bool leaves, float colorMult, float colorPow) {
vec3 shadow = vec3(0.0);
float gradientNoise = InterleavedGradientNoiseForShadows();
#if !defined GBUFFERS_ENTITIES && !defined GBUFFERS_HAND && !defined GBUFFERS_TEXTURED
offset *= 1.3875;
#else
shadowSamples *= 2;
offset *= 0.69375;
#endif
float shadowPosZM = shadowPos.z;
for (int i = 0; i < shadowSamples; i++) {
vec2 offset2 = offsetDist(gradientNoise + i, shadowSamples) * offset;
if (leaves) shadowPosZM = shadowPos.z - 0.12 * offset * (gradientNoise + i) / shadowSamples;
shadow += SampleShadow(vec3(shadowPos.st + offset2, shadowPosZM), colorMult, colorPow);
shadow += SampleShadow(vec3(shadowPos.st - offset2, shadowPosZM), colorMult, colorPow);
}
shadow /= shadowSamples * 2.0;
return shadow;
}
vec2 shadowOffsets[4] = vec2[4](
vec2( 1.0, 0.0),
vec2( 0.0, 1.0),
vec2(-1.0, 0.0),
vec2( 0.0,-1.0));
vec3 SampleBasicFilteredShadow(vec3 shadowPos, float offset) {
float shadow = 0.0;
for (int i = 0; i < 4; i++) {
shadow += shadow2D(shadowtex0, vec3(offset * shadowOffsets[i] + shadowPos.st, shadowPos.z)).x;
}
return vec3(shadow * 0.25);
}
vec3 GetShadow(vec3 shadowPos, float lightmapY, float offset, int shadowSamples, bool leaves) {
#if SHADOW_QUALITY > 0
#if ENTITY_SHADOW <= 1 && defined GBUFFERS_BLOCK
offset *= 4.0;
#else
#ifdef OVERWORLD
offset *= 1.0 + rainFactor2
#ifdef SUN_MOON_DURING_RAIN
* 2.0
#else
* 4.0
#endif
;
#else
offset *= 3.0;
#endif
#endif
#endif
float colorMult = 2.5 + 5.5 * pow1_5(lightmapY) + 2.0 * pow2(lightmapY); // 423HDSS: Shadow color strength is stored 10 times lower to allow for water shadows going above 1.0
float colorPow = mix(1.5 + 0.5 * float(isEyeInWater == 0), 0.5, pow2(pow2(lightmapY)));
#if SHADOW_QUALITY >= 1
vec3 shadow = SampleTAAFilteredShadow(shadowPos, offset, shadowSamples, leaves, colorMult, colorPow);
#else
vec3 shadow = SampleBasicFilteredShadow(shadowPos, offset);
#endif
return shadow;
}
vec3 GetShadowPos(vec3 playerPos) {
vec3 shadowPos = PlayerToShadow(playerPos);
float distb = sqrt(shadowPos.x * shadowPos.x + shadowPos.y * shadowPos.y);
float distortFactor = distb * shadowMapBias + (1.0 - shadowMapBias);
shadowPos.xy /= distortFactor;
shadowPos.z *= 0.2;
return shadowPos * 0.5 + 0.5;
}
vec3 SampleShadow(vec3 shadowPos, float colorMult, float colorPow) {
float shadow0 = shadow2D(shadowtex0, vec3(shadowPos.st, shadowPos.z)).x;
vec3 shadowcol = vec3(0.0);
if (shadow0 < 1.0) {
float shadow1 = shadow2D(shadowtex1, vec3(shadowPos.st, shadowPos.z)).x;
if (shadow1 > 0.9999) {
shadowcol = texture2D(shadowcolor0, shadowPos.st).rgb * shadow1;
shadowcol *= colorMult;
shadowcol = pow(shadowcol, vec3(colorPow));
}
}
return shadowcol * (1.0 - shadow0) + shadow0;
}
float InterleavedGradientNoiseForShadows() {
float n = 52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y);
#if !defined GBUFFERS_ENTITIES && !defined GBUFFERS_HAND && !defined GBUFFERS_TEXTURED && defined TAA
return fract(n + goldenRatio * mod(float(frameCounter), 3600.0));
#else
return fract(n);
#endif
}
vec2 offsetDist(float x, int s) {
float n = fract(x * 2.427) * 3.1415;
return vec2(cos(n), sin(n)) * 1.4 * x / s;
}
vec3 SampleTAAFilteredShadow(vec3 shadowPos, float offset, int shadowSamples, bool leaves, float colorMult, float colorPow) {
vec3 shadow = vec3(0.0);
float gradientNoise = InterleavedGradientNoiseForShadows();
#if !defined GBUFFERS_ENTITIES && !defined GBUFFERS_HAND && !defined GBUFFERS_TEXTURED
offset *= 1.3875;
#else
shadowSamples *= 2;
offset *= 0.69375;
#endif
float shadowPosZM = shadowPos.z;
for (int i = 0; i < shadowSamples; i++) {
vec2 offset2 = offsetDist(gradientNoise + i, shadowSamples) * offset;
if (leaves) shadowPosZM = shadowPos.z - 0.12 * offset * (gradientNoise + i) / shadowSamples;
shadow += SampleShadow(vec3(shadowPos.st + offset2, shadowPosZM), colorMult, colorPow);
shadow += SampleShadow(vec3(shadowPos.st - offset2, shadowPosZM), colorMult, colorPow);
}
shadow /= shadowSamples * 2.0;
return shadow;
}
vec2 shadowOffsets[4] = vec2[4](
vec2( 1.0, 0.0),
vec2( 0.0, 1.0),
vec2(-1.0, 0.0),
vec2( 0.0,-1.0));
vec3 SampleBasicFilteredShadow(vec3 shadowPos, float offset) {
float shadow = 0.0;
for (int i = 0; i < 4; i++) {
shadow += shadow2D(shadowtex0, vec3(offset * shadowOffsets[i] + shadowPos.st, shadowPos.z)).x;
}
return vec3(shadow * 0.25);
}
vec3 GetShadow(vec3 shadowPos, float lightmapY, float offset, int shadowSamples, bool leaves) {
#if SHADOW_QUALITY > 0
#if ENTITY_SHADOW <= 1 && defined GBUFFERS_BLOCK
offset *= 4.0;
#else
#ifdef OVERWORLD
offset *= 1.0 + rainFactor2
#ifdef SUN_MOON_DURING_RAIN
* 2.0
#else
* 4.0
#endif
;
#else
offset *= 3.0;
#endif
#endif
#endif
float colorMult = 2.5 + 5.5 * pow1_5(lightmapY) + 2.0 * pow2(lightmapY); // 423HDSS: Shadow color strength is stored 10 times lower to allow for water shadows going above 1.0
float colorPow = mix(1.5 + 0.5 * float(isEyeInWater == 0), 0.5, pow2(pow2(lightmapY)));
#if SHADOW_QUALITY >= 1
vec3 shadow = SampleTAAFilteredShadow(shadowPos, offset, shadowSamples, leaves, colorMult, colorPow);
#else
vec3 shadow = SampleBasicFilteredShadow(shadowPos, offset);
#endif
return shadow;
}
@@ -1,123 +1,123 @@
if (blockEntityId < 5028) {
if (blockEntityId < 5012) {
if (blockEntityId < 5004) {
if (blockEntityId == 5000) { //
} else { // blockEntityId < 5000
}
} else {
if (blockEntityId == 5004) { // 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 == 5008)*/ { // Chest
noSmoothLighting = true;
smoothnessG = pow2(color.g);
#ifdef COATED_TEXTURES
noiseFactor = 0.66;
#endif
redstoneIPBR(color.rgb, emission);
}
}
} else {
if (blockEntityId < 5020) {
if (blockEntityId == 5012) { // 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;
#if SEASONS == 1 || SEASONS == 4 || defined MOSS_NOISE_INTERNAL || defined SAND_NOISE_INTERNAL
overlayNoiseIntensity = 0.7;
if (dot(normal, upVec) > 0.99) {
#if SNOW_CONDITION < 2 && SNOW_CONDITION != 0
emission = mix(emission, emission * 0.8, inSnowy);
#elif SNOW_CONDITION == 0
emission = mix(emission, emission * 0.8, rainFactor * inSnowy);
#else
emission *= 0.8;
#endif
}
#endif
#ifdef COATED_TEXTURES
noiseFactor = 0.66;
#endif
} else /*if (blockEntityId == 5016)*/ { // Shulker Box+, Banner+, Head+, Bed+
noSmoothLighting = true;
#ifdef COATED_TEXTURES
noiseFactor = 0.2;
#endif
}
} else {
if (blockEntityId == 5020) { // 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);
}
overlayNoiseIntensity = 0.3;
} else /*if (blockEntityId == 5024)*/ { // End Portal, End Gateway
#ifdef SPECIAL_PORTAL_EFFECTS
#include "/lib/materials/specificMaterials/others/endPortalEffect.glsl"
#endif
overlayNoiseIntensity = 0.0;
}
}
}
} else {
if (blockEntityId < 5044) {
if (blockEntityId < 5036) {
if (blockEntityId == 5028) { // 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 == 5032)*/ { // Copper Chest+, Copper Golem+
#include "/lib/materials/specificMaterials/terrain/copperBlock.glsl"
}
} else {
if (blockEntityId == 5036) { //
} else /*if (blockEntityId == 5040)*/ { //
}
}
} else {
if (blockEntityId < 5052) {
if (blockEntityId == 5044) { //
} else /*if (blockEntityId == 5048)*/ { //
}
} else {
if (blockEntityId == 5052) { //
} else if (blockEntityId == 10548) { // Enchanting Table:Book
smoothnessG = pow2(color.g) * 0.35;
if (color.b < 0.0001 && color.r > color.g) {
emission = color.g * 3.5;
}
overlayNoiseIntensity = 0.3;
}
}
}
}
if (blockEntityId < 5028) {
if (blockEntityId < 5012) {
if (blockEntityId < 5004) {
if (blockEntityId == 5000) { //
} else { // blockEntityId < 5000
}
} else {
if (blockEntityId == 5004) { // 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 == 5008)*/ { // Chest
noSmoothLighting = true;
smoothnessG = pow2(color.g);
#ifdef COATED_TEXTURES
noiseFactor = 0.66;
#endif
redstoneIPBR(color.rgb, emission);
}
}
} else {
if (blockEntityId < 5020) {
if (blockEntityId == 5012) { // 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;
#if SEASONS == 1 || SEASONS == 4 || defined MOSS_NOISE_INTERNAL || defined SAND_NOISE_INTERNAL
overlayNoiseIntensity = 0.7;
if (dot(normal, upVec) > 0.99) {
#if SNOW_CONDITION < 2 && SNOW_CONDITION != 0
emission = mix(emission, emission * 0.8, inSnowy);
#elif SNOW_CONDITION == 0
emission = mix(emission, emission * 0.8, rainFactor * inSnowy);
#else
emission *= 0.8;
#endif
}
#endif
#ifdef COATED_TEXTURES
noiseFactor = 0.66;
#endif
} else /*if (blockEntityId == 5016)*/ { // Shulker Box+, Banner+, Head+, Bed+
noSmoothLighting = true;
#ifdef COATED_TEXTURES
noiseFactor = 0.2;
#endif
}
} else {
if (blockEntityId == 5020) { // 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);
}
overlayNoiseIntensity = 0.3;
} else /*if (blockEntityId == 5024)*/ { // End Portal, End Gateway
#ifdef SPECIAL_PORTAL_EFFECTS
#include "/lib/materials/specificMaterials/others/endPortalEffect.glsl"
#endif
overlayNoiseIntensity = 0.0;
}
}
}
} else {
if (blockEntityId < 5044) {
if (blockEntityId < 5036) {
if (blockEntityId == 5028) { // 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 == 5032)*/ { // Copper Chest+, Copper Golem+
#include "/lib/materials/specificMaterials/terrain/copperBlock.glsl"
}
} else {
if (blockEntityId == 5036) { //
} else /*if (blockEntityId == 5040)*/ { //
}
}
} else {
if (blockEntityId < 5052) {
if (blockEntityId == 5044) { //
} else /*if (blockEntityId == 5048)*/ { //
}
} else {
if (blockEntityId == 5052) { //
} else if (blockEntityId == 10548) { // Enchanting Table:Book
smoothnessG = pow2(color.g) * 0.35;
if (color.b < 0.0001 && color.r > color.g) {
emission = color.g * 3.5;
}
overlayNoiseIntensity = 0.3;
}
}
}
}
@@ -1,146 +1,146 @@
#ifdef POM
#include "/lib/materials/materialMethods/pomEffects.glsl"
#endif
#include "/lib/materials/materialMethods/customEmission.glsl"
void GetCustomMaterials(inout vec4 color, inout vec3 normalM, inout vec2 lmCoordM, inout float NdotU, inout vec3 shadowMult, inout float smoothnessG, inout float smoothnessD, inout float highlightMult, inout float emission, inout float materialMask, vec3 viewPos, float lViewPos) {
vec2 texCoordM = texCoord;
#ifdef POM
float parallaxFade, parallaxTexDepth;
vec2 parallaxLocalCoord;
vec3 parallaxTraceCoordDepth;
vec4 normalMap;
bool skipPom = false;
if (!skipPom) {
texCoordM = vTexCoord.xy * vTexCoordAM.zw + vTexCoordAM.xy;
parallaxFade = pow2(lViewPos / POM_DISTANCE);
#ifdef GBUFFERS_ENTITIES
if (entityId == 50008) parallaxFade = 1.1; // Item Frame, Glow Item Frame
#endif
#ifdef GBUFFERS_BLOCK
if (blockEntityId == 5004) parallaxFade = 1.1; // Signs
#endif
#ifdef GBUFFERS_HAND
if (heldItemId == 40004 || heldItemId2 == 40004) parallaxFade = 1.1; // Filled Map
#endif
parallaxTraceCoordDepth = vec3(texCoordM, 1.0);
parallaxLocalCoord = vTexCoord.st;
normalMap = ReadNormal(vTexCoord.st);
parallaxFade += pow(normalMap.a, 64.0);
if (parallaxFade < 1.0) {
float dither = Bayer64(gl_FragCoord.xy);
#ifdef TAA
dither = fract(dither + goldenRatio * mod(float(frameCounter), 3600.0));
#endif
parallaxLocalCoord = GetParallaxCoord(parallaxFade, dither, texCoordM, parallaxTexDepth, parallaxTraceCoordDepth);
normalMap = textureGrad(normals, texCoordM, dcdx, dcdy);
color = textureGrad(tex, texCoordM, dcdx, dcdy);
#if !defined GBUFFERS_ENTITIES && !defined GBUFFERS_BLOCK
color.rgb *= glColor.rgb;
#else
color *= glColor;
#endif
shadowMult *= GetParallaxShadow(parallaxFade, dither, normalMap.a, parallaxLocalCoord, lightVec, tbnMatrix);
}
}
#endif
// Normal Map
#if NORMAL_MAP_STRENGTH != 0
#ifdef POM
else normalMap = texture2D(normals, texCoordM);
#else
vec4 normalMap = texture2D(normals, texCoordM);
#endif
normalM = normalMap.xyz;
normalM += vec3(0.5, 0.5, 0.0);
normalM = pow(normalM, vec3(NORMAL_MAP_STRENGTH * 0.007)); // 70% strength by default
normalM -= vec3(0.5, 0.5, 0.0);
normalM = normalM * 2.0 - 1.0;
#if RP_MODE == 3 // labPBR
if (normalM.x + normalM.y > -1.999) {
if (length(normalM.xy) > 1.0) normalM.xy = normalize(normalM.xy);
normalM.z = sqrt(1.0 - dot(normalM.xy, normalM.xy));
normalM.xyz = normalize(clamp(normalM.xyz, vec3(-1.0), vec3(1.0)));
} else normalM = vec3(0.0, 0.0, 1.0);
#endif
#if defined POM && POM_QUALITY >= 128 && POM_LIGHTING_MODE == 2
if (!skipPom) {
float slopeThreshold = max(1.0 / POM_QUALITY, 1.0/255.0);
if (parallaxTexDepth - parallaxTraceCoordDepth.z > slopeThreshold) {
vec3 slopeNormal = GetParallaxSlopeNormal(parallaxLocalCoord, parallaxTraceCoordDepth.z, viewVector);
normalM = mix(normalM, slopeNormal, 0.5 * pow2(max0(1.0 - parallaxFade * 2.0)));
}
}
#endif
normalM = clamp(normalize(normalM * tbnMatrix), vec3(-1.0), vec3(1.0));
NdotU = dot(normalM, upVec);
NdotUmax0 = max0(NdotU);
#endif
#if DIRECTIONAL_BLOCKLIGHT > 0
mat3 lightmapTBN = mat3(normalize(dFdx(viewPos)), normalize(dFdy(viewPos)), vec3(0.0));
lightmapTBN[2] = cross(lightmapTBN[0], lightmapTBN[1]);
float lmCoordXDir = lmCoordM.x;
vec2 deriv = vec2(dFdx(lmCoordXDir), dFdy(lmCoordXDir)) * 256.0;
vec3 dir = normalize(vec3(deriv.x * lightmapTBN[0] +
0.0005 * lightmapTBN[2] +
deriv.y * lightmapTBN[1]));
float pwr = clamp(dot(normalM, dir), -1.0, 1.0);
float absPwr = abs(pwr);
if (absPwr > 0.0) pwr = pow(absPwr, 9.0 / DIRECTIONAL_BLOCKLIGHT) * sign(pwr) * lmCoordXDir;
if (length(deriv) > 0.001) lmCoordXDir = pow(max(lmCoordXDir, 0.00001), 1.0 - pwr);
lmCoordM.x = mix(lmCoordM.x, lmCoordXDir, 0.01 * max0(100.0 - pow2(lViewPos)));
#endif
// Specular Map
vec4 specularMap = texture2D(specular, texCoordM);
float smoothnessM = pow2(specularMap.r);
smoothnessG = smoothnessM;
smoothnessD = smoothnessM;
highlightMult = 1.0 + 2.5 * specularMap.r;
#if RP_MODE == 3 // labPBR
highlightMult *= 0.5 + 0.5 * specularMap.g;
#endif
emission = GetCustomEmission(specularMap, texCoordM);
#ifndef GBUFFERS_WATER
#if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND
if (
materialMask > OSIEBCA * 240.1
&& specularMap.g < 0.01
) return;
#endif
#if RP_MODE == 2 // seuspbr
materialMask = specularMap.g * OSIEBCA * 240.0;
#elif RP_MODE == 3 // labPBR
if (specularMap.g < OSIEBCA * 229.1) {
materialMask = specularMap.g * OSIEBCA * 214.0;
} else {
materialMask = specularMap.g - OSIEBCA * 15.0;
}
#endif
#endif
}
#ifdef POM
#include "/lib/materials/materialMethods/pomEffects.glsl"
#endif
#include "/lib/materials/materialMethods/customEmission.glsl"
void GetCustomMaterials(inout vec4 color, inout vec3 normalM, inout vec2 lmCoordM, inout float NdotU, inout vec3 shadowMult, inout float smoothnessG, inout float smoothnessD, inout float highlightMult, inout float emission, inout float materialMask, vec3 viewPos, float lViewPos) {
vec2 texCoordM = texCoord;
#ifdef POM
float parallaxFade, parallaxTexDepth;
vec2 parallaxLocalCoord;
vec3 parallaxTraceCoordDepth;
vec4 normalMap;
bool skipPom = false;
if (!skipPom) {
texCoordM = vTexCoord.xy * vTexCoordAM.zw + vTexCoordAM.xy;
parallaxFade = pow2(lViewPos / POM_DISTANCE);
#ifdef GBUFFERS_ENTITIES
if (entityId == 50008) parallaxFade = 1.1; // Item Frame, Glow Item Frame
#endif
#ifdef GBUFFERS_BLOCK
if (blockEntityId == 5004) parallaxFade = 1.1; // Signs
#endif
#ifdef GBUFFERS_HAND
if (heldItemId == 40004 || heldItemId2 == 40004) parallaxFade = 1.1; // Filled Map
#endif
parallaxTraceCoordDepth = vec3(texCoordM, 1.0);
parallaxLocalCoord = vTexCoord.st;
normalMap = ReadNormal(vTexCoord.st);
parallaxFade += pow(normalMap.a, 64.0);
if (parallaxFade < 1.0) {
float dither = Bayer64(gl_FragCoord.xy);
#ifdef TAA
dither = fract(dither + goldenRatio * mod(float(frameCounter), 3600.0));
#endif
parallaxLocalCoord = GetParallaxCoord(parallaxFade, dither, texCoordM, parallaxTexDepth, parallaxTraceCoordDepth);
normalMap = textureGrad(normals, texCoordM, dcdx, dcdy);
color = textureGrad(tex, texCoordM, dcdx, dcdy);
#if !defined GBUFFERS_ENTITIES && !defined GBUFFERS_BLOCK
color.rgb *= glColor.rgb;
#else
color *= glColor;
#endif
shadowMult *= GetParallaxShadow(parallaxFade, dither, normalMap.a, parallaxLocalCoord, lightVec, tbnMatrix);
}
}
#endif
// Normal Map
#if NORMAL_MAP_STRENGTH != 0
#ifdef POM
else normalMap = texture2D(normals, texCoordM);
#else
vec4 normalMap = texture2D(normals, texCoordM);
#endif
normalM = normalMap.xyz;
normalM += vec3(0.5, 0.5, 0.0);
normalM = pow(normalM, vec3(NORMAL_MAP_STRENGTH * 0.007)); // 70% strength by default
normalM -= vec3(0.5, 0.5, 0.0);
normalM = normalM * 2.0 - 1.0;
#if RP_MODE == 3 // labPBR
if (normalM.x + normalM.y > -1.999) {
if (length(normalM.xy) > 1.0) normalM.xy = normalize(normalM.xy);
normalM.z = sqrt(1.0 - dot(normalM.xy, normalM.xy));
normalM.xyz = normalize(clamp(normalM.xyz, vec3(-1.0), vec3(1.0)));
} else normalM = vec3(0.0, 0.0, 1.0);
#endif
#if defined POM && POM_QUALITY >= 128 && POM_LIGHTING_MODE == 2
if (!skipPom) {
float slopeThreshold = max(1.0 / POM_QUALITY, 1.0/255.0);
if (parallaxTexDepth - parallaxTraceCoordDepth.z > slopeThreshold) {
vec3 slopeNormal = GetParallaxSlopeNormal(parallaxLocalCoord, parallaxTraceCoordDepth.z, viewVector);
normalM = mix(normalM, slopeNormal, 0.5 * pow2(max0(1.0 - parallaxFade * 2.0)));
}
}
#endif
normalM = clamp(normalize(normalM * tbnMatrix), vec3(-1.0), vec3(1.0));
NdotU = dot(normalM, upVec);
NdotUmax0 = max0(NdotU);
#endif
#if DIRECTIONAL_BLOCKLIGHT > 0
mat3 lightmapTBN = mat3(normalize(dFdx(viewPos)), normalize(dFdy(viewPos)), vec3(0.0));
lightmapTBN[2] = cross(lightmapTBN[0], lightmapTBN[1]);
float lmCoordXDir = lmCoordM.x;
vec2 deriv = vec2(dFdx(lmCoordXDir), dFdy(lmCoordXDir)) * 256.0;
vec3 dir = normalize(vec3(deriv.x * lightmapTBN[0] +
0.0005 * lightmapTBN[2] +
deriv.y * lightmapTBN[1]));
float pwr = clamp(dot(normalM, dir), -1.0, 1.0);
float absPwr = abs(pwr);
if (absPwr > 0.0) pwr = pow(absPwr, 9.0 / DIRECTIONAL_BLOCKLIGHT) * sign(pwr) * lmCoordXDir;
if (length(deriv) > 0.001) lmCoordXDir = pow(max(lmCoordXDir, 0.00001), 1.0 - pwr);
lmCoordM.x = mix(lmCoordM.x, lmCoordXDir, 0.01 * max0(100.0 - pow2(lViewPos)));
#endif
// Specular Map
vec4 specularMap = texture2D(specular, texCoordM);
float smoothnessM = pow2(specularMap.r);
smoothnessG = smoothnessM;
smoothnessD = smoothnessM;
highlightMult = 1.0 + 2.5 * specularMap.r;
#if RP_MODE == 3 // labPBR
highlightMult *= 0.5 + 0.5 * specularMap.g;
#endif
emission = GetCustomEmission(specularMap, texCoordM);
#ifndef GBUFFERS_WATER
#if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND
if (
materialMask > OSIEBCA * 240.1
&& specularMap.g < 0.01
) return;
#endif
#if RP_MODE == 2 // seuspbr
materialMask = specularMap.g * OSIEBCA * 240.0;
#elif RP_MODE == 3 // labPBR
if (specularMap.g < OSIEBCA * 229.1) {
materialMask = specularMap.g * OSIEBCA * 214.0;
} else {
materialMask = specularMap.g - OSIEBCA * 15.0;
}
#endif
#endif
}
@@ -1,71 +1,71 @@
if (abs(materialMaskInt - 149.5) < 50.0) { // Entity Reflection Handling (see common.glsl for details)
materialMaskInt -= 100;
entityOrParticle = true;
}
if (materialMaskInt != 0) {
if (materialMaskInt < 9) {
if (materialMaskInt < 5) {
if (materialMaskInt < 3) {
if (materialMaskInt == 1) { // Intense Fresnel
intenseFresnel = 1.0;
} else /*if (materialMaskInt == 2)*/ { // Copper Fresnel
intenseFresnel = 1.0;
reflectColor = mix(vec3(0.5, 0.75, 0.5), vec3(1.0, 0.45, 0.3), sqrt1(smoothnessD));
}
} else {
if (materialMaskInt == 3) { // Gold Fresnel
intenseFresnel = 1.0;
reflectColor = vec3(1.0, 0.8, 0.5);
} else /*if (materialMaskInt == 4)*/ { //
}
}
} else {
if (materialMaskInt < 7) {
if (materialMaskInt == 5) { // Redstone Fresnel
intenseFresnel = 1.0;
reflectColor = vec3(1.0, 0.3, 0.2);
} else /*if (materialMaskInt == 6)*/ { //
}
} else {
if (materialMaskInt == 7) { //
} else /*if (materialMaskInt == 8)*/ { //
}
}
}
} else {
if (materialMaskInt < 13) {
if (materialMaskInt < 11) {
if (materialMaskInt == 9) { //
} else /*if (materialMaskInt == 10)*/ { //
}
} else {
if (materialMaskInt == 11) { //
} else /*if (materialMaskInt == 12)*/ { //
}
}
} else {
if (materialMaskInt < 15) {
if (materialMaskInt == 13) { //
} else /*if (materialMaskInt == 14)*/ { //
}
} else {
if (materialMaskInt == 15) { //
} else { // materialMaskInt >= 16 && <= 240
}
}
}
}
}
if (abs(materialMaskInt - 149.5) < 50.0) { // Entity Reflection Handling (see common.glsl for details)
materialMaskInt -= 100;
entityOrParticle = true;
}
if (materialMaskInt != 0) {
if (materialMaskInt < 9) {
if (materialMaskInt < 5) {
if (materialMaskInt < 3) {
if (materialMaskInt == 1) { // Intense Fresnel
intenseFresnel = 1.0;
} else /*if (materialMaskInt == 2)*/ { // Copper Fresnel
intenseFresnel = 1.0;
reflectColor = mix(vec3(0.5, 0.75, 0.5), vec3(1.0, 0.45, 0.3), sqrt1(smoothnessD));
}
} else {
if (materialMaskInt == 3) { // Gold Fresnel
intenseFresnel = 1.0;
reflectColor = vec3(1.0, 0.8, 0.5);
} else /*if (materialMaskInt == 4)*/ { //
}
}
} else {
if (materialMaskInt < 7) {
if (materialMaskInt == 5) { // Redstone Fresnel
intenseFresnel = 1.0;
reflectColor = vec3(1.0, 0.3, 0.2);
} else /*if (materialMaskInt == 6)*/ { //
}
} else {
if (materialMaskInt == 7) { //
} else /*if (materialMaskInt == 8)*/ { //
}
}
}
} else {
if (materialMaskInt < 13) {
if (materialMaskInt < 11) {
if (materialMaskInt == 9) { //
} else /*if (materialMaskInt == 10)*/ { //
}
} else {
if (materialMaskInt == 11) { //
} else /*if (materialMaskInt == 12)*/ { //
}
}
} else {
if (materialMaskInt < 15) {
if (materialMaskInt == 13) { //
} else /*if (materialMaskInt == 14)*/ { //
}
} else {
if (materialMaskInt == 15) { //
} else { // materialMaskInt >= 16 && <= 240
}
}
}
}
}
@@ -1,23 +1,23 @@
if (materialMaskInt <= 240) {
#ifdef IPBR
#include "/lib/materials/materialHandling/deferredIPBR.glsl"
#elif defined CUSTOM_PBR
#if RP_MODE == 2 // seuspbr
float metalness = materialMaskInt / 240.0;
intenseFresnel = metalness;
#elif RP_MODE == 3 // labPBR
float metalness = float(materialMaskInt >= 215);
intenseFresnel = materialMaskInt / 240.0;
#endif
reflectColor = mix(vec3(1.0), color.rgb / (max(color.r, max(color.g, color.b)) + 0.00001), metalness);
#endif
} else {
if (materialMaskInt == 251) { // No SSAO, Reduce Reflection
entityOrParticle = true;
} else if (materialMaskInt == 254) { // No SSAO, No TAA, Reduce Reflection
ssao = 1.0;
entityOrParticle = true;
}
}
if (materialMaskInt <= 240) {
#ifdef IPBR
#include "/lib/materials/materialHandling/deferredIPBR.glsl"
#elif defined CUSTOM_PBR
#if RP_MODE == 2 // seuspbr
float metalness = materialMaskInt / 240.0;
intenseFresnel = metalness;
#elif RP_MODE == 3 // labPBR
float metalness = float(materialMaskInt >= 215);
intenseFresnel = materialMaskInt / 240.0;
#endif
reflectColor = mix(vec3(1.0), color.rgb / (max(color.r, max(color.g, color.b)) + 0.00001), metalness);
#endif
} else {
if (materialMaskInt == 251) { // No SSAO, Reduce Reflection
entityOrParticle = true;
} else if (materialMaskInt == 254) { // No SSAO, No TAA, Reduce Reflection
ssao = 1.0;
entityOrParticle = true;
}
}
@@ -1,498 +1,498 @@
#include "/lib/shaderSettings/entityMaterials.glsl"
if (entityId < 50128) { // 50000 to 50128
if (entityId < 50064) { // 50000 to 50064
if (entityId < 50032) { // 50000 to 50032
if (entityId < 50016) { // 50000 to 50016
if (entityId < 50008) { // 50000 to 50008
if (entityId == 50000) { // End Crystal
lmCoordM.x *= 0.7;
if (color.g * 1.2 < color.r) {
emission = 12.0 * color.g;
color.r *= 1.1;
}
emission *= END_CRYSTAL_EMISSION;
} else if (entityId == 50004) { // Lightning Bolt
#include "/lib/materials/specificMaterials/others/lightningBolt.glsl"
}
} else { // 50008 to 50016
if (entityId == 50008) { // Item Frame, Glow Item Frame
noSmoothLighting = true;
} else if (entityId == 50012) { // Iron Golem
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
smoothnessD *= 0.4;
} else { // 50015 - Armor Stand
// Do nothing for now
}
}
} else { // 50016 to 50032
if (entityId < 50024) { // 50016 to 50024
if (entityId == 50016 || entityId == 50017) { // Player
if (entityColor.a < 0.001) {
#ifdef COATED_TEXTURES
noiseFactor = 0.5;
#endif
if (CheckForColor(texelFetch(tex, ivec2(0, 0), 0).rgb, vec3(23, 46, 92))) {
for (int i = 63; i >= 56; i--) {
vec3 dif = color.rgb - texelFetch(tex, ivec2(i, 0), 0).rgb;
if (dif == clamp(dif, vec3(-0.001), vec3(0.001))) {
emission = 2.0 * texelFetch(tex, ivec2(i, 1), 0).r;
}
}
}
bool selfCheck = false;
#if IRIS_VERSION >= 10800
if (entityId == 50017) {
selfCheck = true;
entitySSBLMask = 0.0;
}
#else
if (length(playerPos) < 4.0) {
selfCheck = true;
entitySSBLMask = 0.0;
}
#endif
}
} else /*if (entityId == 50020)*/ { // Blaze
lmCoordM = vec2(0.9, 0.0);
emission = min(color.r, 0.7) * 1.4;
float dotColor = dot(color.rgb, color.rgb);
if (abs(dotColor - 1.5) > 1.4) {
emission = 5.0;
} else {
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
}
}
} else { // 50024 to 50032
if (entityId == 50024) { // Creeper
emission = max0(color.b - color.g - color.r) * 10.0;
} else /*if (entityId == 50028)*/ { // Drowned
if (atlasSize.x < 900) {
if (CheckForColor(color.rgb, vec3(143, 241, 215)) ||
CheckForColor(color.rgb, vec3( 49, 173, 183)) ||
CheckForColor(color.rgb, vec3(101, 224, 221))) emission = 2.5;
}
}
}
}
} else { // 50032 to 50064
if (entityId < 50048) { // 50032 to 50048
if (entityId < 50040) { // 50032 to 50040
if (entityId == 50032) { // Guardian
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.1 && color.b > 0.5 && color.b < 0.88) {
emission = pow2(pow1_5(color.b)) * 5.0;
color.rgb *= color.rgb;
}
} else /*if (entityId == 50036)*/ { // Elder Guardian
if (CheckForColor(color.rgb, vec3(203, 177, 165)) ||
CheckForColor(color.rgb, vec3(214, 155, 126))) {
emission = pow2(pow1_5(color.b)) * 10.0;
color.r *= 1.2;
}
}
} else { // 50040 to 50048
if (entityId == 50040) { // Endermite
if (CheckForColor(color.rgb, vec3(87, 23, 50))) {
emission = 8.0;
color.rgb *= color.rgb;
}
} else /*if (entityId == 50044)*/ { // Ghast
if (entityColor.a < 0.001)
emission = max0(color.r - color.g - color.b) * 6.0;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
if (color.r > color.b * 2.0) color.rgb = changeColorFunction(color.rgb, 7.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
if (color.r > color.b * 2.0) color.rgb = changeColorFunction(color.rgb, 7.0, colorEndBreath, 1.0);
#endif
}
}
} else { // 50048 to 50064
if (entityId < 50056) { // 50048 to 50056
if (entityId == 50048) { // Glow Squid
lmCoordM.x = 0.0;
float dotColor = dot(color.rgb, color.rgb);
emission = pow2(pow2(min(dotColor * 0.65, 1.5))) + 0.45;
} else /*if (entityId == 50052)*/ { // Magma Cube
emission = color.g * 6.0;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
}
} else { // 50056 to 50064
if (entityId == 50056) { // Stray
if (CheckForColor(color.rgb, vec3(230, 242, 246)) && texCoord.y > 0.35)
emission = 1.75;
} else /*if (entityId == 50060)*/ { // Vex
lmCoordM = vec2(0.0);
emission = pow2(pow2(color.r)) * 3.5 + 0.5;
color.a *= color.a;
}
}
}
}
} else { // 50064 to 50128
if (entityId < 50096) { // 50064 to 50096
if (entityId < 50080) { // 50064 to 50080
if (entityId < 50072) { // 50064 to 50072
if (entityId == 50064) { // Witch
emission = 2.0 * color.g * float(color.g * 1.5 > color.b + color.r);
} else /*if (entityId == 50068)*/ { // Wither, Wither Skull
lmCoordM.x = 0.9;
emission = 3.0 * float(dot(color.rgb, color.rgb) > 1.0);
}
} else { // 50072 to 50080
if (entityId == 50072) { // Experience Orb
emission = 7.5;
color.rgb *= color.rgb;
} else /*if (entityId == 50076)*/ { // Boats
playerPos.y += 0.38; // consistentBOAT2176: to avoid water shadow and the black inner shadow bug
}
}
} else { // 50080 to 50096
if (entityId < 50088) { // 50080 to 50088
if (entityId == 50080) { // Allay
if (atlasSize.x < 900) {
lmCoordM = vec2(0.0);
emission = float(color.r > 0.9 && color.b > 0.9) * 5.0 + color.g;
} else {
lmCoordM.x = 0.8;
}
} else /*if (entityId == 50084)*/ { // Slime, Chicken
//only code is in Vertex Shader for now
}
} else { // 50088 to 50096
if (entityId == 50088) { // Entity Flame (Iris Feature)
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 3.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 3.0, colorEndBreath, 1.0);
#endif
emission = 1.3;
} else if (entityId == 50089) { // fireball, small fireball, dragon fireball
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 4.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 4.0, colorEndBreath, 1.0);
#endif
} else /*if (entityId == 50092)*/ { // Trident Entity
#if defined IS_IRIS || defined IS_ANGELICA && ANGELICA_VERSION >= 20000008
// Only on Iris, because otherwise it would be inconsistent with the Trident item
#include "/lib/materials/specificMaterials/others/trident.glsl"
#endif
}
}
}
} else { // 50096 to 50128
if (entityId < 50112) { // 50096 to 50112
if (entityId < 50104) { // 50096 to 50104
if (entityId == 50096) { // Minecart++
if (atlasSize.x < 900 && color.r * color.g * color.b + color.b > 0.3) {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
smoothnessD *= 0.6;
}
} else /*if (entityId == 50100)*/ { // Bogged
if (CheckForColor(color.rgb, vec3(239, 254, 194)))
emission = 2.5;
}
} else { // 50104 to 50112
if (entityId == 50104) { // Piglin++, Hoglin+
if (atlasSize.x < 900) {
if (CheckForColor(color.rgb, vec3(255)) || CheckForColor(color.rgb, vec3(255, 242, 246))) {
vec2 tSize = textureSize(tex, 0);
vec4 checkColorOneRight = texelFetch(tex, ivec2(texCoord * tSize) + ivec2(1, 0), 0);
if (
CheckForColor(checkColorOneRight.rgb, vec3(201, 130, 101)) ||
CheckForColor(checkColorOneRight.rgb, vec3(241, 158, 152)) ||
CheckForColor(checkColorOneRight.rgb, vec3(223, 127, 119)) ||
CheckForColor(checkColorOneRight.rgb, vec3(241, 158, 152)) ||
CheckForColor(checkColorOneRight.rgb, vec3(165, 99, 80)) ||
CheckForColor(checkColorOneRight.rgb, vec3(213, 149, 122)) ||
CheckForColor(checkColorOneRight.rgb, vec3(255))
) {
emission = 1.0;
}
}
}
} else /*if (entityId == 50108)*/ { // Creaking
if (color.r > 0.7 && color.r > color.g * 1.2 && color.g > color.b * 2.0) { // Eyes
lmCoordM.x = 0.5;
emission = 5.0 * color.g;
color.rgb *= color.rgb;
purkinjeOverwrite = 1.0;
}
}
}
} else { // 50112 to 50128
if (entityId < 50120) { // 50112 to 50120
if (entityId == 50112) { // Name Tag
noDirectionalShading = true;
color.rgb *= 1.5;
if (color.a < 0.5) {
color.a = 0.12;
color.rgb *= 5.0;
}
} else /*if (entityId == 50116)*/ { // Copper Golem
#include "/lib/materials/specificMaterials/terrain/copperBlock.glsl"
smoothnessD *= 0.5;
}
} else { // 50120 to 50128
if (entityId == 50120) { // Parched
if (CheckForColor(color.rgb, vec3(254, 235, 194))) {
vec2 tSize = textureSize(tex, 0);
vec4 checkColorOneDown = texelFetch(tex, ivec2(texCoord * tSize) + ivec2(0, 1), 0);
if (CheckForColor(checkColorOneDown.rgb, vec3(135, 126, 118)) ||
CheckForColor(checkColorOneDown.rgb, vec3(106, 103, 98))
) {
emission = 1.75;
}
}
} else /*if (entityId == 50124)*/ { // Zombie Nautilus
if (CheckForColor(color.rgb, vec3(143, 241, 215)) || CheckForColor(color.rgb, vec3(101, 224, 221)))
emission = 1.5;
}
}
}
}
}
} else { // 50128 to 50256
if (entityId < 50192) { // 50128 to 50192
if (entityId < 50160) { // 50128 to 50160
if (entityId < 50144) { // 50128 to 50144
if (entityId < 50136) { // 50128 to 50136
if (entityId < 50132) { // 50128 to 50132
// 50128
// 50129
// 50130
// 50131
} else { // 50132 to 50136
// 50132
// 50133
// 50134
// 50135
}
} else { // 50136 to 50144
if (entityId < 50140) { // 50136 to 50140
// 50136
// 50137
// 50138
// 50139
} else { // 50140 to 50144
// 50140
// 50141
// 50142
// 50143
}
}
} else { // 50144 to 50160
if (entityId < 50152) { // 50144 to 50152
if (entityId < 50148) { // 50144 to 50148
// 50144
// 50145
// 50146
// 50147
} else { // 50148 to 50152
// 50148
// 50149
// 50150
// 50151
}
} else { // 50152 to 50160
if (entityId < 50156) { // 50152 to 50156
// 50152
// 50153
// 50154
// 50155
} else { // 50156 to 50160
// 50156
// 50157
// 50158
// 50159
}
}
}
} else { // 50160 to 50192
if (entityId < 50176) { // 50160 to 50176
if (entityId < 50168) { // 50160 to 50168
if (entityId < 50164) { // 50160 to 50164
// 50160
// 50161
// 50162
// 50163
} else { // 50164 to 50168
// 50164
// 50165
// 50166
// 50167
}
} else { // 50168 to 50176
if (entityId < 50172) { // 50168 to 50172
// 50168
// 50169
// 50170
// 50171
} else { // 50172 to 50176
// 50172
// 50173
// 50174
// 50175
}
}
} else { // 50176 to 50192
if (entityId < 50184) { // 50176 to 50184
if (entityId < 50180) { // 50176 to 50180
// 50176
// 50177
// 50178
// 50179
} else { // 50180 to 50184
// 50180
// 50181
// 50182
// 50183
}
} else { // 50184 to 50192
if (entityId < 50188) { // 50184 to 50188
// 50184
// 50185
// 50186
// 50187
} else { // 50188 to 50192
// 50188
// 50189
// 50190
// 50191
}
}
}
}
} else { // 50192 to 50256
if (entityId < 50224) { // 50192 to 50224
if (entityId < 50208) { // 50192 to 50208
if (entityId < 50200) { // 50192 to 50200
if (entityId < 50196) { // 50192 to 50196
// 50192
// 50193
// 50194
// 50195
} else { // 50196 to 50200
// 50196
// 50197
// 50198
// 50199
}
} else { // 50200 to 50208
if (entityId < 50204) { // 50200 to 50204
// 50200
// 50201
// 50202
// 50203
} else { // 50204 to 50208
// 50204
// 50205
// 50206
// 50207
}
}
} else { // 50208 to 50224
if (entityId < 50216) { // 50208 to 50216
if (entityId < 50212) { // 50208 to 50212
// 50208
// 50209
// 50210
// 50211
} else { // 50212 to 50216
// 50212
// 50213
// 50214
// 50215
}
} else { // 50216 to 50224
if (entityId < 50220) { // 50216 to 50220
// 50216
// 50217
// 50218
// 50219
} else { // 50220 to 50224
// 50220
// 50221
// 50222
// 50223
}
}
}
} else { // 50224 to 50256
if (entityId < 50240) { // 50224 to 50240
if (entityId < 50232) { // 50224 to 50232
if (entityId < 50228) { // 50224 to 50228
// 50224
// 50225
// 50226
// 50227
} else { // 50228 to 50232
// 50228
// 50229
// 50230
// 50231
}
} else { // 50232 to 50240
if (entityId < 50236) { // 50232 to 50236
// 50232
// 50233
// 50234
// 50235
} else { // 50236 to 50240
// 50236
// 50237
// 50238
// 50239
}
}
} else { // 50240 to 50256
if (entityId < 50248) { // 50240 to 50248
if (entityId < 50244) { // 50240 to 50244
// 50240
// 50241
// 50242
// 50243
} else { // 50244 to 50248
// 50244
// 50245
// 50246
// 50247
}
} else { // 50248 to 50256
if (entityId < 50252) { // 50248 to 50252
// 50248
// 50249
// 50250
// 50251
} else { // 50252 to 50256
// 50252
// 50253
// 50254
// 50255
}
}
}
}
}
}
#include "/lib/shaderSettings/entityMaterials.glsl"
if (entityId < 50128) { // 50000 to 50128
if (entityId < 50064) { // 50000 to 50064
if (entityId < 50032) { // 50000 to 50032
if (entityId < 50016) { // 50000 to 50016
if (entityId < 50008) { // 50000 to 50008
if (entityId == 50000) { // End Crystal
lmCoordM.x *= 0.7;
if (color.g * 1.2 < color.r) {
emission = 12.0 * color.g;
color.r *= 1.1;
}
emission *= END_CRYSTAL_EMISSION;
} else if (entityId == 50004) { // Lightning Bolt
#include "/lib/materials/specificMaterials/others/lightningBolt.glsl"
}
} else { // 50008 to 50016
if (entityId == 50008) { // Item Frame, Glow Item Frame
noSmoothLighting = true;
} else if (entityId == 50012) { // Iron Golem
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
smoothnessD *= 0.4;
} else { // 50015 - Armor Stand
// Do nothing for now
}
}
} else { // 50016 to 50032
if (entityId < 50024) { // 50016 to 50024
if (entityId == 50016 || entityId == 50017) { // Player
if (entityColor.a < 0.001) {
#ifdef COATED_TEXTURES
noiseFactor = 0.5;
#endif
if (CheckForColor(texelFetch(tex, ivec2(0, 0), 0).rgb, vec3(23, 46, 92))) {
for (int i = 63; i >= 56; i--) {
vec3 dif = color.rgb - texelFetch(tex, ivec2(i, 0), 0).rgb;
if (dif == clamp(dif, vec3(-0.001), vec3(0.001))) {
emission = 2.0 * texelFetch(tex, ivec2(i, 1), 0).r;
}
}
}
bool selfCheck = false;
#if IRIS_VERSION >= 10800
if (entityId == 50017) {
selfCheck = true;
entitySSBLMask = 0.0;
}
#else
if (length(playerPos) < 4.0) {
selfCheck = true;
entitySSBLMask = 0.0;
}
#endif
}
} else /*if (entityId == 50020)*/ { // Blaze
lmCoordM = vec2(0.9, 0.0);
emission = min(color.r, 0.7) * 1.4;
float dotColor = dot(color.rgb, color.rgb);
if (abs(dotColor - 1.5) > 1.4) {
emission = 5.0;
} else {
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
}
}
} else { // 50024 to 50032
if (entityId == 50024) { // Creeper
emission = max0(color.b - color.g - color.r) * 10.0;
} else /*if (entityId == 50028)*/ { // Drowned
if (atlasSize.x < 900) {
if (CheckForColor(color.rgb, vec3(143, 241, 215)) ||
CheckForColor(color.rgb, vec3( 49, 173, 183)) ||
CheckForColor(color.rgb, vec3(101, 224, 221))) emission = 2.5;
}
}
}
}
} else { // 50032 to 50064
if (entityId < 50048) { // 50032 to 50048
if (entityId < 50040) { // 50032 to 50040
if (entityId == 50032) { // Guardian
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.1 && color.b > 0.5 && color.b < 0.88) {
emission = pow2(pow1_5(color.b)) * 5.0;
color.rgb *= color.rgb;
}
} else /*if (entityId == 50036)*/ { // Elder Guardian
if (CheckForColor(color.rgb, vec3(203, 177, 165)) ||
CheckForColor(color.rgb, vec3(214, 155, 126))) {
emission = pow2(pow1_5(color.b)) * 10.0;
color.r *= 1.2;
}
}
} else { // 50040 to 50048
if (entityId == 50040) { // Endermite
if (CheckForColor(color.rgb, vec3(87, 23, 50))) {
emission = 8.0;
color.rgb *= color.rgb;
}
} else /*if (entityId == 50044)*/ { // Ghast
if (entityColor.a < 0.001)
emission = max0(color.r - color.g - color.b) * 6.0;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
if (color.r > color.b * 2.0) color.rgb = changeColorFunction(color.rgb, 7.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
if (color.r > color.b * 2.0) color.rgb = changeColorFunction(color.rgb, 7.0, colorEndBreath, 1.0);
#endif
}
}
} else { // 50048 to 50064
if (entityId < 50056) { // 50048 to 50056
if (entityId == 50048) { // Glow Squid
lmCoordM.x = 0.0;
float dotColor = dot(color.rgb, color.rgb);
emission = pow2(pow2(min(dotColor * 0.65, 1.5))) + 0.45;
} else /*if (entityId == 50052)*/ { // Magma Cube
emission = color.g * 6.0;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
}
} else { // 50056 to 50064
if (entityId == 50056) { // Stray
if (CheckForColor(color.rgb, vec3(230, 242, 246)) && texCoord.y > 0.35)
emission = 1.75;
} else /*if (entityId == 50060)*/ { // Vex
lmCoordM = vec2(0.0);
emission = pow2(pow2(color.r)) * 3.5 + 0.5;
color.a *= color.a;
}
}
}
}
} else { // 50064 to 50128
if (entityId < 50096) { // 50064 to 50096
if (entityId < 50080) { // 50064 to 50080
if (entityId < 50072) { // 50064 to 50072
if (entityId == 50064) { // Witch
emission = 2.0 * color.g * float(color.g * 1.5 > color.b + color.r);
} else /*if (entityId == 50068)*/ { // Wither, Wither Skull
lmCoordM.x = 0.9;
emission = 3.0 * float(dot(color.rgb, color.rgb) > 1.0);
}
} else { // 50072 to 50080
if (entityId == 50072) { // Experience Orb
emission = 7.5;
color.rgb *= color.rgb;
} else /*if (entityId == 50076)*/ { // Boats
playerPos.y += 0.38; // consistentBOAT2176: to avoid water shadow and the black inner shadow bug
}
}
} else { // 50080 to 50096
if (entityId < 50088) { // 50080 to 50088
if (entityId == 50080) { // Allay
if (atlasSize.x < 900) {
lmCoordM = vec2(0.0);
emission = float(color.r > 0.9 && color.b > 0.9) * 5.0 + color.g;
} else {
lmCoordM.x = 0.8;
}
} else /*if (entityId == 50084)*/ { // Slime, Chicken
//only code is in Vertex Shader for now
}
} else { // 50088 to 50096
if (entityId == 50088) { // Entity Flame (Iris Feature)
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 3.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 3.0, colorEndBreath, 1.0);
#endif
emission = 1.3;
} else if (entityId == 50089) { // fireball, small fireball, dragon fireball
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 4.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 4.0, colorEndBreath, 1.0);
#endif
} else /*if (entityId == 50092)*/ { // Trident Entity
#if defined IS_IRIS || defined IS_ANGELICA && ANGELICA_VERSION >= 20000008
// Only on Iris, because otherwise it would be inconsistent with the Trident item
#include "/lib/materials/specificMaterials/others/trident.glsl"
#endif
}
}
}
} else { // 50096 to 50128
if (entityId < 50112) { // 50096 to 50112
if (entityId < 50104) { // 50096 to 50104
if (entityId == 50096) { // Minecart++
if (atlasSize.x < 900 && color.r * color.g * color.b + color.b > 0.3) {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
smoothnessD *= 0.6;
}
} else /*if (entityId == 50100)*/ { // Bogged
if (CheckForColor(color.rgb, vec3(239, 254, 194)))
emission = 2.5;
}
} else { // 50104 to 50112
if (entityId == 50104) { // Piglin++, Hoglin+
if (atlasSize.x < 900) {
if (CheckForColor(color.rgb, vec3(255)) || CheckForColor(color.rgb, vec3(255, 242, 246))) {
vec2 tSize = textureSize(tex, 0);
vec4 checkColorOneRight = texelFetch(tex, ivec2(texCoord * tSize) + ivec2(1, 0), 0);
if (
CheckForColor(checkColorOneRight.rgb, vec3(201, 130, 101)) ||
CheckForColor(checkColorOneRight.rgb, vec3(241, 158, 152)) ||
CheckForColor(checkColorOneRight.rgb, vec3(223, 127, 119)) ||
CheckForColor(checkColorOneRight.rgb, vec3(241, 158, 152)) ||
CheckForColor(checkColorOneRight.rgb, vec3(165, 99, 80)) ||
CheckForColor(checkColorOneRight.rgb, vec3(213, 149, 122)) ||
CheckForColor(checkColorOneRight.rgb, vec3(255))
) {
emission = 1.0;
}
}
}
} else /*if (entityId == 50108)*/ { // Creaking
if (color.r > 0.7 && color.r > color.g * 1.2 && color.g > color.b * 2.0) { // Eyes
lmCoordM.x = 0.5;
emission = 5.0 * color.g;
color.rgb *= color.rgb;
purkinjeOverwrite = 1.0;
}
}
}
} else { // 50112 to 50128
if (entityId < 50120) { // 50112 to 50120
if (entityId == 50112) { // Name Tag
noDirectionalShading = true;
color.rgb *= 1.5;
if (color.a < 0.5) {
color.a = 0.12;
color.rgb *= 5.0;
}
} else /*if (entityId == 50116)*/ { // Copper Golem
#include "/lib/materials/specificMaterials/terrain/copperBlock.glsl"
smoothnessD *= 0.5;
}
} else { // 50120 to 50128
if (entityId == 50120) { // Parched
if (CheckForColor(color.rgb, vec3(254, 235, 194))) {
vec2 tSize = textureSize(tex, 0);
vec4 checkColorOneDown = texelFetch(tex, ivec2(texCoord * tSize) + ivec2(0, 1), 0);
if (CheckForColor(checkColorOneDown.rgb, vec3(135, 126, 118)) ||
CheckForColor(checkColorOneDown.rgb, vec3(106, 103, 98))
) {
emission = 1.75;
}
}
} else /*if (entityId == 50124)*/ { // Zombie Nautilus
if (CheckForColor(color.rgb, vec3(143, 241, 215)) || CheckForColor(color.rgb, vec3(101, 224, 221)))
emission = 1.5;
}
}
}
}
}
} else { // 50128 to 50256
if (entityId < 50192) { // 50128 to 50192
if (entityId < 50160) { // 50128 to 50160
if (entityId < 50144) { // 50128 to 50144
if (entityId < 50136) { // 50128 to 50136
if (entityId < 50132) { // 50128 to 50132
// 50128
// 50129
// 50130
// 50131
} else { // 50132 to 50136
// 50132
// 50133
// 50134
// 50135
}
} else { // 50136 to 50144
if (entityId < 50140) { // 50136 to 50140
// 50136
// 50137
// 50138
// 50139
} else { // 50140 to 50144
// 50140
// 50141
// 50142
// 50143
}
}
} else { // 50144 to 50160
if (entityId < 50152) { // 50144 to 50152
if (entityId < 50148) { // 50144 to 50148
// 50144
// 50145
// 50146
// 50147
} else { // 50148 to 50152
// 50148
// 50149
// 50150
// 50151
}
} else { // 50152 to 50160
if (entityId < 50156) { // 50152 to 50156
// 50152
// 50153
// 50154
// 50155
} else { // 50156 to 50160
// 50156
// 50157
// 50158
// 50159
}
}
}
} else { // 50160 to 50192
if (entityId < 50176) { // 50160 to 50176
if (entityId < 50168) { // 50160 to 50168
if (entityId < 50164) { // 50160 to 50164
// 50160
// 50161
// 50162
// 50163
} else { // 50164 to 50168
// 50164
// 50165
// 50166
// 50167
}
} else { // 50168 to 50176
if (entityId < 50172) { // 50168 to 50172
// 50168
// 50169
// 50170
// 50171
} else { // 50172 to 50176
// 50172
// 50173
// 50174
// 50175
}
}
} else { // 50176 to 50192
if (entityId < 50184) { // 50176 to 50184
if (entityId < 50180) { // 50176 to 50180
// 50176
// 50177
// 50178
// 50179
} else { // 50180 to 50184
// 50180
// 50181
// 50182
// 50183
}
} else { // 50184 to 50192
if (entityId < 50188) { // 50184 to 50188
// 50184
// 50185
// 50186
// 50187
} else { // 50188 to 50192
// 50188
// 50189
// 50190
// 50191
}
}
}
}
} else { // 50192 to 50256
if (entityId < 50224) { // 50192 to 50224
if (entityId < 50208) { // 50192 to 50208
if (entityId < 50200) { // 50192 to 50200
if (entityId < 50196) { // 50192 to 50196
// 50192
// 50193
// 50194
// 50195
} else { // 50196 to 50200
// 50196
// 50197
// 50198
// 50199
}
} else { // 50200 to 50208
if (entityId < 50204) { // 50200 to 50204
// 50200
// 50201
// 50202
// 50203
} else { // 50204 to 50208
// 50204
// 50205
// 50206
// 50207
}
}
} else { // 50208 to 50224
if (entityId < 50216) { // 50208 to 50216
if (entityId < 50212) { // 50208 to 50212
// 50208
// 50209
// 50210
// 50211
} else { // 50212 to 50216
// 50212
// 50213
// 50214
// 50215
}
} else { // 50216 to 50224
if (entityId < 50220) { // 50216 to 50220
// 50216
// 50217
// 50218
// 50219
} else { // 50220 to 50224
// 50220
// 50221
// 50222
// 50223
}
}
}
} else { // 50224 to 50256
if (entityId < 50240) { // 50224 to 50240
if (entityId < 50232) { // 50224 to 50232
if (entityId < 50228) { // 50224 to 50228
// 50224
// 50225
// 50226
// 50227
} else { // 50228 to 50232
// 50228
// 50229
// 50230
// 50231
}
} else { // 50232 to 50240
if (entityId < 50236) { // 50232 to 50236
// 50232
// 50233
// 50234
// 50235
} else { // 50236 to 50240
// 50236
// 50237
// 50238
// 50239
}
}
} else { // 50240 to 50256
if (entityId < 50248) { // 50240 to 50248
if (entityId < 50244) { // 50240 to 50244
// 50240
// 50241
// 50242
// 50243
} else { // 50244 to 50248
// 50244
// 50245
// 50246
// 50247
}
} else { // 50248 to 50256
if (entityId < 50252) { // 50248 to 50252
// 50248
// 50249
// 50250
// 50251
} else { // 50252 to 50256
// 50252
// 50253
// 50254
// 50255
}
}
}
}
}
}
@@ -1,265 +1,265 @@
#include "/lib/shaderSettings/entityMaterials.glsl"
int mat = currentRenderedItemId;
#ifdef GBUFFERS_HAND
float lViewPos = 0.0;
#endif
int subsurfaceMode;
bool centerShadowBias;
float noPuddles;
if (currentRenderedItemId < 45000) {
#include "/lib/materials/materialHandling/terrainIPBR.glsl"
} else
if (currentRenderedItemId < 45064) {
if (currentRenderedItemId < 45032) {
if (currentRenderedItemId < 45016) {
if (currentRenderedItemId < 45008) {
if (currentRenderedItemId == 45000) { // Armor Trims
smoothnessG = 0.5;
highlightMult = 2.0;
smoothnessD = 0.5;
#ifdef GLOWING_ARMOR_TRIM
emission = 1.0;
#endif
#ifdef SITUATIONAL_GLOWING_TRIMS
emission *= skyLightCheck;
#endif
} else if (currentRenderedItemId == 45004) { // Wooden Tools, Bow, Fishing Rod
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
smoothnessG = min(smoothnessG, 0.4);
smoothnessD = smoothnessG;
}
} else {
if (currentRenderedItemId == 45008) { // Stone Tools
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/stone.glsl"
}
} else /*if (currentRenderedItemId == 45012)*/ { // Iron Tools, Iron Armor, Iron Ingot, Iron Nugget, Iron Horse Armor, Flint and Steel, Flint, Spyglass, Shears, Chainmail Armor
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
}
}
}
} else {
if (currentRenderedItemId < 45024) {
if (currentRenderedItemId == 45016) { // Golden Tools, Golden Armor, Gold Ingot, Gold Nugget, Golden Apple, Enchanted Golden Apple, Golden Carrot, Golden Horse Armor
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/goldBlock.glsl"
}
} else /*if (currentRenderedItemId == 45020)*/ { // Diamond Tools, Diamond Armor, Diamond, Diamond Horse Armor, Emerald
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/diamondBlock.glsl"
}
}
} else {
if (currentRenderedItemId == 45024) { // Netherite Tools, Netherite Armor, Netherite Ingot
materialMask = OSIEBCA; // Intense Fresnel
smoothnessG = color.b * 1.65;
smoothnessG = min1(smoothnessG);
highlightMult = smoothnessG * 2.0;
smoothnessD = smoothnessG * smoothnessG * 0.5;
#ifdef COATED_TEXTURES
noiseFactor = 0.33;
#endif
} else /*if (currentRenderedItemId == 45028)*/ { // Trident Item
#include "/lib/materials/specificMaterials/others/trident.glsl"
}
}
}
} else {
if (currentRenderedItemId < 45048) {
if (currentRenderedItemId < 45040) {
if (currentRenderedItemId == 45032) { // Lava Bucket
if (color.r + color.g > color.b * 2.0) {
emission = color.r + color.g - color.b * 1.5;
emission *= 1.8;
color.rg += color.b * vec2(0.4, 0.15);
color.b *= 0.8;
if (LAVA_TEMPERATURE != 0.0) maRecolor += LAVA_TEMPERATURE * 0.1;
emission *= LAVA_EMISSION;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
} else {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
}
} else /*if (currentRenderedItemId == 45036)*/ { // Bucket++
if (GetMaxColorDif(color.rgb) < 0.01) {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
} else {
float factor = color.b;
smoothnessG = factor;
highlightMult = factor * 2.0;
smoothnessD = factor;
}
}
} else {
if (currentRenderedItemId == 45040) { // Blaze Rod, Blaze Powder
noSmoothLighting = false;
lmCoordM.x = 0.85;
emission = color.g;
color.rgb = sqrt1(color.rgb);
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
} else /*if (currentRenderedItemId == 45044)*/ { // Bottle o' Enchanting, Glow Inc Sac
emission = color.b * 2.0;
}
}
} else {
if (currentRenderedItemId < 45056) {
if (currentRenderedItemId == 45048) { // Fire Charge
emission = max0(color.r + color.g - color.b * 0.5);
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 5.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 5.0, colorEndBreath, 1.0);
#endif
} else /*if (currentRenderedItemId == 45052)*/ { // Chorus Fruit
emission = max0(color.b * 2.0 - color.r) * 1.5;
}
} else {
if (currentRenderedItemId == 45056) { // Amethyst Shard
materialMask = OSIEBCA; // Intense Fresnel
float factor = pow2(color.r);
smoothnessG = 0.8 - factor * 0.3;
highlightMult = factor * 3.0;
smoothnessD = factor;
} else /*if (currentRenderedItemId == 45060)*/ { // Shield
float factor = min(color.r * color.g * color.b * 4.0, 0.7) * 0.7;
smoothnessG = factor;
highlightMult = factor * 3.0;
smoothnessD = factor;
}
}
}
}
} else {
if (currentRenderedItemId < 45096) {
if (currentRenderedItemId < 45080) {
if (currentRenderedItemId < 45072) {
if (currentRenderedItemId == 45064) { // Turtle Shell
float factor = color.g * 0.7;
smoothnessG = factor;
highlightMult = factor * 3.0;
smoothnessD = factor;
} else /*if (currentRenderedItemId == 45068)*/ { // Ender Pearl
smoothnessG = 1.0;
highlightMult = 2.0;
smoothnessD = 1.0;
}
} else {
if (currentRenderedItemId == 45072) { // Eye of Ender
smoothnessG = 1.0;
highlightMult = 2.0;
smoothnessD = 1.0;
emission = max0(color.g - color.b * 0.25);
color.rgb = pow(color.rgb, vec3(1.0 - 0.75 * emission));
} else /*if (currentRenderedItemId == 45076)*/ { // Clock
if (
CheckForColor(color.rgb, vec3(255, 255, 0)) ||
CheckForColor(color.rgb, vec3(204, 204, 0)) ||
CheckForColor(color.rgb, vec3(73, 104, 216)) ||
CheckForColor(color.rgb, vec3(58, 83, 172)) ||
CheckForColor(color.rgb, vec3(108, 108, 137)) ||
CheckForColor(color.rgb, vec3(86, 86, 109))
) {
emission = 1.0;
color.rgb += vec3(0.1);
}
#include "/lib/materials/specificMaterials/terrain/goldBlock.glsl"
}
}
} else {
if (currentRenderedItemId < 45088) {
if (currentRenderedItemId == 45080) { // Compass
if (color.r - 0.1 > color.b + color.g) {
emission = color.r * 1.5;
}
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
} else /*if (currentRenderedItemId == 45084)*/ { // Echo Shard, Recovery Compass, Music Disc 5
emission = max0(color.b + color.g - color.r * 2.0);
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
}
} else {
if (currentRenderedItemId == 45088) { // Nether Star
emission = pow2(color.r + color.g) * 0.5;
} else /*if (currentRenderedItemId == 45092)*/ { // End Crystal
if (color.g < color.r) {
emission = 3.0;
color.r *= 1.1;
}
emission *= END_CRYSTAL_EMISSION;
}
}
}
} else {
if (currentRenderedItemId < 45112) {
if (currentRenderedItemId < 45104) {
if (currentRenderedItemId == 45096) { // Glow Berries
// iris needs to add support
} else /*if (currentRenderedItemId == 45100)*/ { // Glowstone Dust
emission = dot(color.rgb, color.rgb) * 0.5 + 1.0;
}
} else {
if (currentRenderedItemId == 45104) { // Prismarine Crystals
emission = pow1_5(color.r) * 2.5 + 0.2;
} else /*if (currentRenderedItemId == 45108)*/ { // Totem of Undying
#include "/lib/materials/specificMaterials/terrain/goldBlock.glsl"
}
}
} else {
if (currentRenderedItemId < 45120) {
if (currentRenderedItemId == 45112) { // Trial Key, Ominous Trial Key
emission = abs(color.r - color.b) * 3.0;
color.rgb = pow(color.rgb, vec3(1.0 + 0.5 * sqrt(emission)));
} else /*if (currentRenderedItemId == 45116)*/ { // Copper Tools, Copper Armor, Copper Ingot, Copper Horse Armor
#include "/lib/materials/specificMaterials/terrain/copperBlock.glsl"
smoothnessD *= 0.5;
}
} else {
if (currentRenderedItemId == 45120) { // Ghast Harness+
vec2 tSize = textureSize(tex, 0);
vec4 checkColorOneDown = texelFetch(tex, ivec2(texCoord * tSize) + ivec2(0, 1), 0);
if (
CheckForColor(color.rgb, vec3(139, 193, 205)) ||
CheckForColor(color.rgb, vec3(208, 234, 233)) ||
CheckForColor(color.rgb, vec3(109, 152, 161)) ||
CheckForColor(color.rgb, vec3(255)) && CheckForColor(checkColorOneDown.rgb, vec3(109, 152, 161)) ||
CheckForColor(color.rgb, vec3(168, 208, 217))
) {
smoothnessG = 1.0;
highlightMult = 2.0 - dot(color.rgb, vec3(0.25));
smoothnessD = 1.0;
}
} else /*if (currentRenderedItemId == 45124)*/ { //
}
}
}
}
}
#include "/lib/shaderSettings/entityMaterials.glsl"
int mat = currentRenderedItemId;
#ifdef GBUFFERS_HAND
float lViewPos = 0.0;
#endif
int subsurfaceMode;
bool centerShadowBias;
float noPuddles;
if (currentRenderedItemId < 45000) {
#include "/lib/materials/materialHandling/terrainIPBR.glsl"
} else
if (currentRenderedItemId < 45064) {
if (currentRenderedItemId < 45032) {
if (currentRenderedItemId < 45016) {
if (currentRenderedItemId < 45008) {
if (currentRenderedItemId == 45000) { // Armor Trims
smoothnessG = 0.5;
highlightMult = 2.0;
smoothnessD = 0.5;
#ifdef GLOWING_ARMOR_TRIM
emission = 1.0;
#endif
#ifdef SITUATIONAL_GLOWING_TRIMS
emission *= skyLightCheck;
#endif
} else if (currentRenderedItemId == 45004) { // Wooden Tools, Bow, Fishing Rod
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
smoothnessG = min(smoothnessG, 0.4);
smoothnessD = smoothnessG;
}
} else {
if (currentRenderedItemId == 45008) { // Stone Tools
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/stone.glsl"
}
} else /*if (currentRenderedItemId == 45012)*/ { // Iron Tools, Iron Armor, Iron Ingot, Iron Nugget, Iron Horse Armor, Flint and Steel, Flint, Spyglass, Shears, Chainmail Armor
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
}
}
}
} else {
if (currentRenderedItemId < 45024) {
if (currentRenderedItemId == 45016) { // Golden Tools, Golden Armor, Gold Ingot, Gold Nugget, Golden Apple, Enchanted Golden Apple, Golden Carrot, Golden Horse Armor
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/goldBlock.glsl"
}
} else /*if (currentRenderedItemId == 45020)*/ { // Diamond Tools, Diamond Armor, Diamond, Diamond Horse Armor, Emerald
if (CheckForStick(color.rgb)) {
#include "/lib/materials/specificMaterials/planks/sprucePlanks.glsl"
} else {
#include "/lib/materials/specificMaterials/terrain/diamondBlock.glsl"
}
}
} else {
if (currentRenderedItemId == 45024) { // Netherite Tools, Netherite Armor, Netherite Ingot
materialMask = OSIEBCA; // Intense Fresnel
smoothnessG = color.b * 1.65;
smoothnessG = min1(smoothnessG);
highlightMult = smoothnessG * 2.0;
smoothnessD = smoothnessG * smoothnessG * 0.5;
#ifdef COATED_TEXTURES
noiseFactor = 0.33;
#endif
} else /*if (currentRenderedItemId == 45028)*/ { // Trident Item
#include "/lib/materials/specificMaterials/others/trident.glsl"
}
}
}
} else {
if (currentRenderedItemId < 45048) {
if (currentRenderedItemId < 45040) {
if (currentRenderedItemId == 45032) { // Lava Bucket
if (color.r + color.g > color.b * 2.0) {
emission = color.r + color.g - color.b * 1.5;
emission *= 1.8;
color.rg += color.b * vec2(0.4, 0.15);
color.b *= 0.8;
if (LAVA_TEMPERATURE != 0.0) maRecolor += LAVA_TEMPERATURE * 0.1;
emission *= LAVA_EMISSION;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
} else {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
}
} else /*if (currentRenderedItemId == 45036)*/ { // Bucket++
if (GetMaxColorDif(color.rgb) < 0.01) {
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
} else {
float factor = color.b;
smoothnessG = factor;
highlightMult = factor * 2.0;
smoothnessD = factor;
}
}
} else {
if (currentRenderedItemId == 45040) { // Blaze Rod, Blaze Powder
noSmoothLighting = false;
lmCoordM.x = 0.85;
emission = color.g;
color.rgb = sqrt1(color.rgb);
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 2.0, colorEndBreath, 1.0);
#endif
} else /*if (currentRenderedItemId == 45044)*/ { // Bottle o' Enchanting, Glow Inc Sac
emission = color.b * 2.0;
}
}
} else {
if (currentRenderedItemId < 45056) {
if (currentRenderedItemId == 45048) { // Fire Charge
emission = max0(color.r + color.g - color.b * 0.5);
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 5.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 5.0, colorEndBreath, 1.0);
#endif
} else /*if (currentRenderedItemId == 45052)*/ { // Chorus Fruit
emission = max0(color.b * 2.0 - color.r) * 1.5;
}
} else {
if (currentRenderedItemId == 45056) { // Amethyst Shard
materialMask = OSIEBCA; // Intense Fresnel
float factor = pow2(color.r);
smoothnessG = 0.8 - factor * 0.3;
highlightMult = factor * 3.0;
smoothnessD = factor;
} else /*if (currentRenderedItemId == 45060)*/ { // Shield
float factor = min(color.r * color.g * color.b * 4.0, 0.7) * 0.7;
smoothnessG = factor;
highlightMult = factor * 3.0;
smoothnessD = factor;
}
}
}
}
} else {
if (currentRenderedItemId < 45096) {
if (currentRenderedItemId < 45080) {
if (currentRenderedItemId < 45072) {
if (currentRenderedItemId == 45064) { // Turtle Shell
float factor = color.g * 0.7;
smoothnessG = factor;
highlightMult = factor * 3.0;
smoothnessD = factor;
} else /*if (currentRenderedItemId == 45068)*/ { // Ender Pearl
smoothnessG = 1.0;
highlightMult = 2.0;
smoothnessD = 1.0;
}
} else {
if (currentRenderedItemId == 45072) { // Eye of Ender
smoothnessG = 1.0;
highlightMult = 2.0;
smoothnessD = 1.0;
emission = max0(color.g - color.b * 0.25);
color.rgb = pow(color.rgb, vec3(1.0 - 0.75 * emission));
} else /*if (currentRenderedItemId == 45076)*/ { // Clock
if (
CheckForColor(color.rgb, vec3(255, 255, 0)) ||
CheckForColor(color.rgb, vec3(204, 204, 0)) ||
CheckForColor(color.rgb, vec3(73, 104, 216)) ||
CheckForColor(color.rgb, vec3(58, 83, 172)) ||
CheckForColor(color.rgb, vec3(108, 108, 137)) ||
CheckForColor(color.rgb, vec3(86, 86, 109))
) {
emission = 1.0;
color.rgb += vec3(0.1);
}
#include "/lib/materials/specificMaterials/terrain/goldBlock.glsl"
}
}
} else {
if (currentRenderedItemId < 45088) {
if (currentRenderedItemId == 45080) { // Compass
if (color.r - 0.1 > color.b + color.g) {
emission = color.r * 1.5;
}
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
} else /*if (currentRenderedItemId == 45084)*/ { // Echo Shard, Recovery Compass, Music Disc 5
emission = max0(color.b + color.g - color.r * 2.0);
#include "/lib/materials/specificMaterials/terrain/ironBlock.glsl"
}
} else {
if (currentRenderedItemId == 45088) { // Nether Star
emission = pow2(color.r + color.g) * 0.5;
} else /*if (currentRenderedItemId == 45092)*/ { // End Crystal
if (color.g < color.r) {
emission = 3.0;
color.r *= 1.1;
}
emission *= END_CRYSTAL_EMISSION;
}
}
}
} else {
if (currentRenderedItemId < 45112) {
if (currentRenderedItemId < 45104) {
if (currentRenderedItemId == 45096) { // Glow Berries
// iris needs to add support
} else /*if (currentRenderedItemId == 45100)*/ { // Glowstone Dust
emission = dot(color.rgb, color.rgb) * 0.5 + 1.0;
}
} else {
if (currentRenderedItemId == 45104) { // Prismarine Crystals
emission = pow1_5(color.r) * 2.5 + 0.2;
} else /*if (currentRenderedItemId == 45108)*/ { // Totem of Undying
#include "/lib/materials/specificMaterials/terrain/goldBlock.glsl"
}
}
} else {
if (currentRenderedItemId < 45120) {
if (currentRenderedItemId == 45112) { // Trial Key, Ominous Trial Key
emission = abs(color.r - color.b) * 3.0;
color.rgb = pow(color.rgb, vec3(1.0 + 0.5 * sqrt(emission)));
} else /*if (currentRenderedItemId == 45116)*/ { // Copper Tools, Copper Armor, Copper Ingot, Copper Horse Armor
#include "/lib/materials/specificMaterials/terrain/copperBlock.glsl"
smoothnessD *= 0.5;
}
} else {
if (currentRenderedItemId == 45120) { // Ghast Harness+
vec2 tSize = textureSize(tex, 0);
vec4 checkColorOneDown = texelFetch(tex, ivec2(texCoord * tSize) + ivec2(0, 1), 0);
if (
CheckForColor(color.rgb, vec3(139, 193, 205)) ||
CheckForColor(color.rgb, vec3(208, 234, 233)) ||
CheckForColor(color.rgb, vec3(109, 152, 161)) ||
CheckForColor(color.rgb, vec3(255)) && CheckForColor(checkColorOneDown.rgb, vec3(109, 152, 161)) ||
CheckForColor(color.rgb, vec3(168, 208, 217))
) {
smoothnessG = 1.0;
highlightMult = 2.0 - dot(color.rgb, vec3(0.25));
smoothnessD = 1.0;
}
} else /*if (currentRenderedItemId == 45124)*/ { //
}
}
}
}
}
@@ -1,9 +1,9 @@
#if !(defined DH_TERRAIN || defined DH_WATER)
#define BLOCK_LAVA_DEFINE mat == 10068 || mat == 10070
#define BLOCK_LAVA_STILL_DEFINE mat == 10068
#define BLOCK_LEAVES_SEASONS_DEFINE mat == 10009 || mat == 10011
#else
#define BLOCK_LAVA_DEFINE mat == DH_BLOCK_LAVA
#define BLOCK_LAVA_STILL_DEFINE mat == DH_BLOCK_LAVA
#define BLOCK_LEAVES_SEASONS_DEFINE mat == DH_BLOCK_LEAVES
#endif
#if !(defined DH_TERRAIN || defined DH_WATER)
#define BLOCK_LAVA_DEFINE mat == 10068 || mat == 10070
#define BLOCK_LAVA_STILL_DEFINE mat == 10068
#define BLOCK_LEAVES_SEASONS_DEFINE mat == 10009 || mat == 10011
#else
#define BLOCK_LAVA_DEFINE mat == DH_BLOCK_LAVA
#define BLOCK_LAVA_STILL_DEFINE mat == DH_BLOCK_LAVA
#define BLOCK_LEAVES_SEASONS_DEFINE mat == DH_BLOCK_LEAVES
#endif
@@ -1,190 +1,190 @@
#include "/lib/shaderSettings/water.glsl"
if (mat < 32008) {
if (mat < 30016) {
if (mat < 30008) {
if (mat == 30000) { //
} else if (mat == 30004) { //
}
} else {
if (mat == 30008) { // Tinted Glass
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(254);
bool isPane = false;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
color.a = pow(color.a, 1.0 - fresnelM);
reflectMult = 1.0;
#ifndef MIRROR_TINTED_GLASS
DoTranslucentTweaks(color, fresnelM, reflectMult, lViewPos);
#else
color.a = color.a * 0.3 + 0.7;
fresnelM = fresnelM * 0.5 + 0.5;
reflectMult /= color.a;
noGeneratedNormals = true;
#ifdef MIRROR_TINTED_GLASS_OPAQUE
color.a = 1.0;
#endif
#endif
overlayNoiseAlpha = 0.95;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
} else /*if (mat == 30012)*/ { // Slime Block
translucentMultCalculated = true;
reflectMult = 0.7;
translucentMult.rgb = pow2(color.rgb) * 0.2;
smoothnessG = color.g * 0.7;
highlightMult = 2.5;
overlayNoiseAlpha = 0.6;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
}
}
} else {
if (mat < 32000) {
if (mat < 31000) {
if (mat == 30016) { // Honey Block
translucentMultCalculated = true;
reflectMult = 1.0;
translucentMult.rgb = pow2(color.rgb) * 0.2;
smoothnessG = color.r * 0.7;
highlightMult = 2.5;
overlayNoiseAlpha = 0.4;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
} else /*if (mat == 30020)*/ { // Nether Portal
#ifdef SPECIAL_PORTAL_EFFECTS
#include "/lib/materials/specificMaterials/translucents/netherPortal.glsl"
#endif
overlayNoiseIntensity = 0.0;
}
} else { // (31XXX)
if (mat % 2 == 0) { // Stained Glass
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(200 + (mat - 31000) / 2);
bool isPane = false;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
#include "/lib/materials/specificMaterials/translucents/stainedGlass.glsl"
overlayNoiseAlpha = 1.05;
mossNoiseIntensity = 0.8;
} else /*if (mat % 2 == 1)*/ { // Stained Glass Pane
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(200 + (mat - 31000) / 2);
bool isPane = true;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
#include "/lib/materials/specificMaterials/translucents/stainedGlass.glsl"
noSmoothLighting = true;
overlayNoiseAlpha = 1.05;
sandNoiseIntensity = 0.8;
mossNoiseIntensity = 0.8;
}
}
} else {
if (mat == 32000) { // Water
#ifdef SHADER_WATER
#include "/lib/materials/specificMaterials/translucents/water.glsl"
#endif
overlayNoiseIntensity = 0.0;
overlayNoiseFresnelMult = 0.0;
IPBRMult = 0.0;
overlayNoiseAlpha = 0.0;
} else /*if (mat == 32004)*/ { // Ice
smoothnessG = pow2(color.g) * color.g;
highlightMult = pow2(min1(pow2(color.g) * 1.5)) * 3.5;
reflectMult = 0.7;
overlayNoiseAlpha = 0.6;
sandNoiseIntensity = 0.7;
mossNoiseIntensity = 0.7;
}
}
}
} else {
if (mat < 32024) {
if (mat < 32016) {
if (mat < 32012) { // Glass
if (mat == 32008){
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(217);
bool isPane = false;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
}
#include "/lib/materials/specificMaterials/translucents/glass.glsl"
overlayNoiseAlpha = 0.8;
sandNoiseIntensity = 0.8;
mossNoiseIntensity = 0.8;
} else /*if (mat == 32012)*/ { // Glass Pane
if (mat == 32012) {
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(218);
bool isPane = true;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
}
if (color.a < 0.001 && abs(NdotU) > 0.95) discard; // Fixing artifacts on CTM/Opti connected glass panes
#include "/lib/materials/specificMaterials/translucents/glass.glsl"
noSmoothLighting = true;
overlayNoiseAlpha = 0.8;
sandNoiseIntensity = 0.8;
mossNoiseIntensity = 0.8;
}
} else {
if (mat == 32016) { // Beacon
lmCoordM.x = 0.88;
translucentMultCalculated = true;
translucentMult = vec4(0.0, 0.0, 0.0, 1.0);
if (color.b > 0.5) {
if (color.g - color.b < 0.01 && color.g < 0.99) {
#include "/lib/materials/specificMaterials/translucents/glass.glsl"
} else { // Beacon:Center
lmCoordM = vec2(0.0);
noDirectionalShading = true;
float lColor = length(color.rgb);
vec3 baseColor = vec3(0.1, 1.0, 0.92);
if (lColor > 1.65) color.rgb = baseColor + 0.2;
else if (lColor > 1.5) color.rgb = baseColor + 0.15;
else if (lColor > 1.3) color.rgb = baseColor + 0.08;
else if (lColor > 1.15) color.rgb = baseColor + 0.035;
else color.rgb = baseColor;
emission = 3.5;
}
} else { // Beacon:Obsidian
float factor = color.r * 1.5;
smoothnessG = factor;
highlightMult = 2.0 + min1(smoothnessG * 2.0) * 1.5;
smoothnessG = min1(smoothnessG);
}
overlayNoiseAlpha = 0.8;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
} else /*if (mat == 32020)*/ { //
}
}
} else {
if (mat < 32032) {
if (mat == 32024) { //
} else /*if (mat == 32028)*/ { //
}
} else {
if (mat == 32032) { //
} else /*if (mat == 32036)*/ { //
}
}
}
}
#include "/lib/shaderSettings/water.glsl"
if (mat < 32008) {
if (mat < 30016) {
if (mat < 30008) {
if (mat == 30000) { //
} else if (mat == 30004) { //
}
} else {
if (mat == 30008) { // Tinted Glass
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(254);
bool isPane = false;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
color.a = pow(color.a, 1.0 - fresnelM);
reflectMult = 1.0;
#ifndef MIRROR_TINTED_GLASS
DoTranslucentTweaks(color, fresnelM, reflectMult, lViewPos);
#else
color.a = color.a * 0.3 + 0.7;
fresnelM = fresnelM * 0.5 + 0.5;
reflectMult /= color.a;
noGeneratedNormals = true;
#ifdef MIRROR_TINTED_GLASS_OPAQUE
color.a = 1.0;
#endif
#endif
overlayNoiseAlpha = 0.95;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
} else /*if (mat == 30012)*/ { // Slime Block
translucentMultCalculated = true;
reflectMult = 0.7;
translucentMult.rgb = pow2(color.rgb) * 0.2;
smoothnessG = color.g * 0.7;
highlightMult = 2.5;
overlayNoiseAlpha = 0.6;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
}
}
} else {
if (mat < 32000) {
if (mat < 31000) {
if (mat == 30016) { // Honey Block
translucentMultCalculated = true;
reflectMult = 1.0;
translucentMult.rgb = pow2(color.rgb) * 0.2;
smoothnessG = color.r * 0.7;
highlightMult = 2.5;
overlayNoiseAlpha = 0.4;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
} else /*if (mat == 30020)*/ { // Nether Portal
#ifdef SPECIAL_PORTAL_EFFECTS
#include "/lib/materials/specificMaterials/translucents/netherPortal.glsl"
#endif
overlayNoiseIntensity = 0.0;
}
} else { // (31XXX)
if (mat % 2 == 0) { // Stained Glass
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(200 + (mat - 31000) / 2);
bool isPane = false;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
#include "/lib/materials/specificMaterials/translucents/stainedGlass.glsl"
overlayNoiseAlpha = 1.05;
mossNoiseIntensity = 0.8;
} else /*if (mat % 2 == 1)*/ { // Stained Glass Pane
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(200 + (mat - 31000) / 2);
bool isPane = true;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
#include "/lib/materials/specificMaterials/translucents/stainedGlass.glsl"
noSmoothLighting = true;
overlayNoiseAlpha = 1.05;
sandNoiseIntensity = 0.8;
mossNoiseIntensity = 0.8;
}
}
} else {
if (mat == 32000) { // Water
#ifdef SHADER_WATER
#include "/lib/materials/specificMaterials/translucents/water.glsl"
#endif
overlayNoiseIntensity = 0.0;
overlayNoiseFresnelMult = 0.0;
IPBRMult = 0.0;
overlayNoiseAlpha = 0.0;
} else /*if (mat == 32004)*/ { // Ice
smoothnessG = pow2(color.g) * color.g;
highlightMult = pow2(min1(pow2(color.g) * 1.5)) * 3.5;
reflectMult = 0.7;
overlayNoiseAlpha = 0.6;
sandNoiseIntensity = 0.7;
mossNoiseIntensity = 0.7;
}
}
}
} else {
if (mat < 32024) {
if (mat < 32016) {
if (mat < 32012) { // Glass
if (mat == 32008){
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(217);
bool isPane = false;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
}
#include "/lib/materials/specificMaterials/translucents/glass.glsl"
overlayNoiseAlpha = 0.8;
sandNoiseIntensity = 0.8;
mossNoiseIntensity = 0.8;
} else /*if (mat == 32012)*/ { // Glass Pane
if (mat == 32012) {
#ifdef CONNECTED_GLASS_EFFECT
uint voxelID = uint(218);
bool isPane = true;
DoConnectedGlass(colorP, color, noGeneratedNormals, playerPos, worldGeoNormal, voxelID, isPane);
#endif
}
if (color.a < 0.001 && abs(NdotU) > 0.95) discard; // Fixing artifacts on CTM/Opti connected glass panes
#include "/lib/materials/specificMaterials/translucents/glass.glsl"
noSmoothLighting = true;
overlayNoiseAlpha = 0.8;
sandNoiseIntensity = 0.8;
mossNoiseIntensity = 0.8;
}
} else {
if (mat == 32016) { // Beacon
lmCoordM.x = 0.88;
translucentMultCalculated = true;
translucentMult = vec4(0.0, 0.0, 0.0, 1.0);
if (color.b > 0.5) {
if (color.g - color.b < 0.01 && color.g < 0.99) {
#include "/lib/materials/specificMaterials/translucents/glass.glsl"
} else { // Beacon:Center
lmCoordM = vec2(0.0);
noDirectionalShading = true;
float lColor = length(color.rgb);
vec3 baseColor = vec3(0.1, 1.0, 0.92);
if (lColor > 1.65) color.rgb = baseColor + 0.2;
else if (lColor > 1.5) color.rgb = baseColor + 0.15;
else if (lColor > 1.3) color.rgb = baseColor + 0.08;
else if (lColor > 1.15) color.rgb = baseColor + 0.035;
else color.rgb = baseColor;
emission = 3.5;
}
} else { // Beacon:Obsidian
float factor = color.r * 1.5;
smoothnessG = factor;
highlightMult = 2.0 + min1(smoothnessG * 2.0) * 1.5;
smoothnessG = min1(smoothnessG);
}
overlayNoiseAlpha = 0.8;
sandNoiseIntensity = 0.5;
mossNoiseIntensity = 0.5;
} else /*if (mat == 32020)*/ { //
}
}
} else {
if (mat < 32032) {
if (mat == 32024) { //
} else /*if (mat == 32028)*/ { //
}
} else {
if (mat == 32032) { //
} else /*if (mat == 32036)*/ { //
}
}
}
}
@@ -1,74 +1,74 @@
/*
This file is specifically licensed with Mozilla Public License Version 2.0.
You can get a copy from https://www.mozilla.org/MPL/2.0/
*/
float manualDeterminant(mat2 matrix) {
return matrix[0].x * matrix[1].y - matrix[0].y * matrix[1].x;
}
mat2 inverseM(mat2 m) {
#if MC_VERSION >= 11700
return inverse(m);
#else
mat2 adj;
adj[0][0] = m[1][1];
adj[0][1] = -m[0][1];
adj[1][0] = -m[1][0];
adj[1][1] = m[0][0];
return adj / manualDeterminant(m);
#endif
}
vec4 textureAF(sampler2D texSampler, vec2 uv) {
vec2 spriteDimensions = vec2(spriteBounds.z - spriteBounds.x, spriteBounds.w - spriteBounds.y);
mat2 J = inverseM(mat2(dFdx(uv), dFdy(uv)));
J = transpose(J)*J;
float d = manualDeterminant(J), t = J[0][0]+J[1][1],
D = sqrt(abs(t*t-4.001*d)), // using 4.001 instead of 4.0 fixes a rare texture glitch with square texture atlas
V = (t-D)/2.0, v = (t+D)/2.0,
M = 1.0/sqrt(V), m = 1./sqrt(v);
vec2 A = M * normalize(vec2(-J[0][1], J[0][0]-V));
float lod = 0.0;
#if ANISOTROPIC_FILTER >= 8 && defined GBUFFERS_TERRAIN
#if MC_VERSION < 12111
// Excluding cutout blocks because cutout mipmaps suck in older mc versions
if (texture2DLod(texSampler, uv, 10000.0).a == 1.0)
#endif
// Fix257062 - Checking if absMidCoordPos is fine or else miplevel will be broken. This can be an issue for flowing lava.
if (absMidCoordPos.x > 0.0001 && absMidCoordPos.y > 0.0001)
lod = miplevel * 0.4;
#endif
float samplesDiv2 = ANISOTROPIC_FILTER / 2.0;
vec2 ADivSamples = A / ANISOTROPIC_FILTER;
vec4 filteredColor = vec4(0.0);
float totalModifiedAlpha = 0.0;
vec4 spriteBoundsM = mix(spriteBounds, vec4(midCoord, midCoord), 0.0001); // Fixes some mods causing issues with cutout blocks
for (float i = -samplesDiv2 + 0.5; i < samplesDiv2; i++) {
vec2 sampleUV = uv + ADivSamples * i;
sampleUV = clamp(sampleUV, spriteBoundsM.xy, spriteBoundsM.zw);
vec4 colorSample = texture2DLod(texSampler, sampleUV, lod);
colorSample.a = sqrt(colorSample.a); // Tweak to make cutout blocks look fuller in the distance
#if !defined POM || !defined POM_ALLOW_CUTOUT
float modifiedAlpha = colorSample.a;
#else
// To avoid NaNs because we don't discard low alpha if POM_ALLOW_CUTOUT is enabled (see 6WIR4HT23)
float modifiedAlpha = max(colorSample.a, 0.00001);
#endif
totalModifiedAlpha += modifiedAlpha;
filteredColor.rgb += colorSample.rgb * modifiedAlpha;
filteredColor.a += colorSample.a;
}
filteredColor.rgb /= totalModifiedAlpha;
filteredColor.a /= ANISOTROPIC_FILTER;
return filteredColor;
}
/*
This file is specifically licensed with Mozilla Public License Version 2.0.
You can get a copy from https://www.mozilla.org/MPL/2.0/
*/
float manualDeterminant(mat2 matrix) {
return matrix[0].x * matrix[1].y - matrix[0].y * matrix[1].x;
}
mat2 inverseM(mat2 m) {
#if MC_VERSION >= 11700
return inverse(m);
#else
mat2 adj;
adj[0][0] = m[1][1];
adj[0][1] = -m[0][1];
adj[1][0] = -m[1][0];
adj[1][1] = m[0][0];
return adj / manualDeterminant(m);
#endif
}
vec4 textureAF(sampler2D texSampler, vec2 uv) {
vec2 spriteDimensions = vec2(spriteBounds.z - spriteBounds.x, spriteBounds.w - spriteBounds.y);
mat2 J = inverseM(mat2(dFdx(uv), dFdy(uv)));
J = transpose(J)*J;
float d = manualDeterminant(J), t = J[0][0]+J[1][1],
D = sqrt(abs(t*t-4.001*d)), // using 4.001 instead of 4.0 fixes a rare texture glitch with square texture atlas
V = (t-D)/2.0, v = (t+D)/2.0,
M = 1.0/sqrt(V), m = 1./sqrt(v);
vec2 A = M * normalize(vec2(-J[0][1], J[0][0]-V));
float lod = 0.0;
#if ANISOTROPIC_FILTER >= 8 && defined GBUFFERS_TERRAIN
#if MC_VERSION < 12111
// Excluding cutout blocks because cutout mipmaps suck in older mc versions
if (texture2DLod(texSampler, uv, 10000.0).a == 1.0)
#endif
// Fix257062 - Checking if absMidCoordPos is fine or else miplevel will be broken. This can be an issue for flowing lava.
if (absMidCoordPos.x > 0.0001 && absMidCoordPos.y > 0.0001)
lod = miplevel * 0.4;
#endif
float samplesDiv2 = ANISOTROPIC_FILTER / 2.0;
vec2 ADivSamples = A / ANISOTROPIC_FILTER;
vec4 filteredColor = vec4(0.0);
float totalModifiedAlpha = 0.0;
vec4 spriteBoundsM = mix(spriteBounds, vec4(midCoord, midCoord), 0.0001); // Fixes some mods causing issues with cutout blocks
for (float i = -samplesDiv2 + 0.5; i < samplesDiv2; i++) {
vec2 sampleUV = uv + ADivSamples * i;
sampleUV = clamp(sampleUV, spriteBoundsM.xy, spriteBoundsM.zw);
vec4 colorSample = texture2DLod(texSampler, sampleUV, lod);
colorSample.a = sqrt(colorSample.a); // Tweak to make cutout blocks look fuller in the distance
#if !defined POM || !defined POM_ALLOW_CUTOUT
float modifiedAlpha = colorSample.a;
#else
// To avoid NaNs because we don't discard low alpha if POM_ALLOW_CUTOUT is enabled (see 6WIR4HT23)
float modifiedAlpha = max(colorSample.a, 0.00001);
#endif
totalModifiedAlpha += modifiedAlpha;
filteredColor.rgb += colorSample.rgb * modifiedAlpha;
filteredColor.a += colorSample.a;
}
filteredColor.rgb /= totalModifiedAlpha;
filteredColor.a /= ANISOTROPIC_FILTER;
return filteredColor;
}
@@ -1,33 +1,33 @@
#define ENTITY_GN_AND_CT
#define COATED_TEXTURE_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]
#define COATED_TEXTURE_RES 64 //[16 32 64 80 96 112 128 144 160 176 192 208 224 240 256 320 384 448 512]
const float packSizeNT = COATED_TEXTURE_RES;
void CoatTextures(inout vec3 color, float noiseFactor, vec3 playerPos, bool doTileRandomisation) {
#ifndef ENTITY_GN_AND_CT
#if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND
return;
#endif
#endif
#ifndef SAFER_GENERATED_NORMALS
vec2 noiseCoord = floor(midCoordPos / 16.0 * packSizeNT * atlasSizeM) / packSizeNT / 3.0;
#else
vec2 offsetR = max(absMidCoordPos.x, absMidCoordPos.y) * vec2(float(atlasSizeM.y) / float(atlasSizeM.x), 1.0);
vec2 noiseCoord = floor(midCoordPos / 2.0 * packSizeNT / offsetR) / packSizeNT / 3.0;
#endif
if (doTileRandomisation) {
vec3 floorWorldPos = floor(playerPos + cameraPosition + 0.001);
noiseCoord += 0.84 * (floorWorldPos.xz + floorWorldPos.y);
}
float noiseTexture = texture2DLod(noisetex, noiseCoord, 0.0).r;
noiseTexture = noiseTexture + 0.6;
float colorBrightness = dot(color, color) * 0.3;
#define COATED_TEXTURE_MULT_M COATED_TEXTURE_MULT * 0.0027
noiseFactor *= COATED_TEXTURE_MULT_M * max0(1.0 - colorBrightness);
noiseFactor *= max(1.0 - miplevel * 0.25, 0.0);
noiseTexture = pow(noiseTexture, noiseFactor);
color *= noiseTexture;
}
#define ENTITY_GN_AND_CT
#define COATED_TEXTURE_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]
#define COATED_TEXTURE_RES 64 //[16 32 64 80 96 112 128 144 160 176 192 208 224 240 256 320 384 448 512]
const float packSizeNT = COATED_TEXTURE_RES;
void CoatTextures(inout vec3 color, float noiseFactor, vec3 playerPos, bool doTileRandomisation) {
#ifndef ENTITY_GN_AND_CT
#if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND
return;
#endif
#endif
#ifndef SAFER_GENERATED_NORMALS
vec2 noiseCoord = floor(midCoordPos / 16.0 * packSizeNT * atlasSizeM) / packSizeNT / 3.0;
#else
vec2 offsetR = max(absMidCoordPos.x, absMidCoordPos.y) * vec2(float(atlasSizeM.y) / float(atlasSizeM.x), 1.0);
vec2 noiseCoord = floor(midCoordPos / 2.0 * packSizeNT / offsetR) / packSizeNT / 3.0;
#endif
if (doTileRandomisation) {
vec3 floorWorldPos = floor(playerPos + cameraPosition + 0.001);
noiseCoord += 0.84 * (floorWorldPos.xz + floorWorldPos.y);
}
float noiseTexture = texture2DLod(noisetex, noiseCoord, 0.0).r;
noiseTexture = noiseTexture + 0.6;
float colorBrightness = dot(color, color) * 0.3;
#define COATED_TEXTURE_MULT_M COATED_TEXTURE_MULT * 0.0027
noiseFactor *= COATED_TEXTURE_MULT_M * max0(1.0 - colorBrightness);
noiseFactor *= max(1.0 - miplevel * 0.25, 0.0);
noiseTexture = pow(noiseTexture, noiseFactor);
color *= noiseTexture;
}
@@ -1,115 +1,115 @@
ivec3[6] glassOffsets = ivec3[](
ivec3( 1, 0, 0),
ivec3(-1, 0, 0),
ivec3( 0, 1, 0),
ivec3( 0,-1, 0),
ivec3( 0, 0, 1),
ivec3( 0, 0,-1)
);
ivec3[12] glassCornerOffsets = ivec3[](
ivec3( 1, 1, 0),
ivec3( 1,-1, 0),
ivec3(-1, 1, 0),
ivec3(-1,-1, 0),
ivec3( 0, 1, 1),
ivec3( 0, 1,-1),
ivec3( 0,-1, 1),
ivec3( 0,-1,-1),
ivec3( 1, 0, 1),
ivec3( 1, 0,-1),
ivec3(-1, 0, 1),
ivec3(-1, 0,-1)
);
vec2 GetModifiedMidCoord() {
float epsilon1 = 0.00001;
vec2 midCoord = texCoord - signMidCoordPos * absMidCoordPos;
return midCoord - epsilon1;
}
void DoSimpleConnectedGlass(inout vec4 color) {
color = texture2DLod(tex, GetModifiedMidCoord() - 0.125 * absMidCoordPos, 0);
}
#ifdef GBUFFERS_WATER
void DoConnectedGlass(inout vec4 colorP, inout vec4 color, inout bool noGeneratedNormals, vec3 playerPos, vec3 worldGeoNormal, uint voxelID, bool isPane) {
vec3 worldGeoNormalM = vec3( // Fixes Iris 1.8 normal precision issues causing the coordinates to be imperfect
round(worldGeoNormal.x),
round(worldGeoNormal.y),
round(worldGeoNormal.z)
);
vec3 playerPosM = playerPos - worldGeoNormalM * 0.25;
vec3 voxelPos = SceneToVoxel(playerPosM);
if (CheckInsideVoxelVolume(voxelPos)) {
#if IRIS_VERSION >= 10800
float epsilon2 = 0.0;
#else
float epsilon2 = 0.001;
#endif
float pixelOffset = 0.5 / (absMidCoordPos.y * atlasSize.y);
float pixelOffsetPlus = pixelOffset + epsilon2;
float pixelOffsetMinus = pixelOffset - epsilon2;
colorP = texture2DLod(tex, texCoord, 0);
vec4 colorPvanilla = colorP;
vec2 midCoordM = GetModifiedMidCoord();
vec3 worldPos = playerPosM + cameraPositionBestFract;
vec3 floorWorldPos = floor(worldPos);
// Remove edges
for (int i = 0; i < 6; i++) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + glassOffsets[i]);
if (voxel == voxelID) {
if (floor(worldPos + glassOffsets[i] * pixelOffsetPlus) != floorWorldPos) {
colorP = texture2DLod(tex, midCoordM, 0);
}
#ifdef GENERATED_NORMALS
if (floor(worldPos + glassOffsets[i] * pixelOffsetPlus * 1.25) != floorWorldPos) {
noGeneratedNormals = true;
}
#endif
}
}
// Fixes the connections by restoring the edges that aren't connected
for (int i = 0; i < 6; i++) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + glassOffsets[i]);
if (voxel != voxelID) {
//if (floor(worldPos + glassOffsets[i] * 0.0625) != floorWorldPos) {
if (floor(worldPos + glassOffsets[i] * pixelOffsetMinus) != floorWorldPos) {
colorP = colorPvanilla;
}
}
}
if (isPane) {
// Fixes lines between layers of glass panes
if (NdotU > 0.9) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + ivec3(0, 1, 0));
if (voxel == voxelID) discard;
}
if (NdotU < -0.9) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) - ivec3(0, 1, 0));
if (voxel == voxelID) discard;
}
}
#ifdef CONNECTED_GLASS_CORNER_FIX
// Restores corners
for (int i = 0; i < 12; i++) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + glassCornerOffsets[i]);
if ((voxel != voxelID) && (!isPane || voxel > 0u)) {
if (floor((worldPos - glassCornerOffsets[i] * (1.0 - pixelOffsetMinus))) == floorWorldPos) {
colorP = colorPvanilla;
}
}
}
#endif
color = colorP * vec4(glColor.rgb, 1.0);
}
}
#endif
ivec3[6] glassOffsets = ivec3[](
ivec3( 1, 0, 0),
ivec3(-1, 0, 0),
ivec3( 0, 1, 0),
ivec3( 0,-1, 0),
ivec3( 0, 0, 1),
ivec3( 0, 0,-1)
);
ivec3[12] glassCornerOffsets = ivec3[](
ivec3( 1, 1, 0),
ivec3( 1,-1, 0),
ivec3(-1, 1, 0),
ivec3(-1,-1, 0),
ivec3( 0, 1, 1),
ivec3( 0, 1,-1),
ivec3( 0,-1, 1),
ivec3( 0,-1,-1),
ivec3( 1, 0, 1),
ivec3( 1, 0,-1),
ivec3(-1, 0, 1),
ivec3(-1, 0,-1)
);
vec2 GetModifiedMidCoord() {
float epsilon1 = 0.00001;
vec2 midCoord = texCoord - signMidCoordPos * absMidCoordPos;
return midCoord - epsilon1;
}
void DoSimpleConnectedGlass(inout vec4 color) {
color = texture2DLod(tex, GetModifiedMidCoord() - 0.125 * absMidCoordPos, 0);
}
#ifdef GBUFFERS_WATER
void DoConnectedGlass(inout vec4 colorP, inout vec4 color, inout bool noGeneratedNormals, vec3 playerPos, vec3 worldGeoNormal, uint voxelID, bool isPane) {
vec3 worldGeoNormalM = vec3( // Fixes Iris 1.8 normal precision issues causing the coordinates to be imperfect
round(worldGeoNormal.x),
round(worldGeoNormal.y),
round(worldGeoNormal.z)
);
vec3 playerPosM = playerPos - worldGeoNormalM * 0.25;
vec3 voxelPos = SceneToVoxel(playerPosM);
if (CheckInsideVoxelVolume(voxelPos)) {
#if IRIS_VERSION >= 10800
float epsilon2 = 0.0;
#else
float epsilon2 = 0.001;
#endif
float pixelOffset = 0.5 / (absMidCoordPos.y * atlasSize.y);
float pixelOffsetPlus = pixelOffset + epsilon2;
float pixelOffsetMinus = pixelOffset - epsilon2;
colorP = texture2DLod(tex, texCoord, 0);
vec4 colorPvanilla = colorP;
vec2 midCoordM = GetModifiedMidCoord();
vec3 worldPos = playerPosM + cameraPositionBestFract;
vec3 floorWorldPos = floor(worldPos);
// Remove edges
for (int i = 0; i < 6; i++) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + glassOffsets[i]);
if (voxel == voxelID) {
if (floor(worldPos + glassOffsets[i] * pixelOffsetPlus) != floorWorldPos) {
colorP = texture2DLod(tex, midCoordM, 0);
}
#ifdef GENERATED_NORMALS
if (floor(worldPos + glassOffsets[i] * pixelOffsetPlus * 1.25) != floorWorldPos) {
noGeneratedNormals = true;
}
#endif
}
}
// Fixes the connections by restoring the edges that aren't connected
for (int i = 0; i < 6; i++) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + glassOffsets[i]);
if (voxel != voxelID) {
//if (floor(worldPos + glassOffsets[i] * 0.0625) != floorWorldPos) {
if (floor(worldPos + glassOffsets[i] * pixelOffsetMinus) != floorWorldPos) {
colorP = colorPvanilla;
}
}
}
if (isPane) {
// Fixes lines between layers of glass panes
if (NdotU > 0.9) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + ivec3(0, 1, 0));
if (voxel == voxelID) discard;
}
if (NdotU < -0.9) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) - ivec3(0, 1, 0));
if (voxel == voxelID) discard;
}
}
#ifdef CONNECTED_GLASS_CORNER_FIX
// Restores corners
for (int i = 0; i < 12; i++) {
uint voxel = GetVoxelVolume(ivec3(voxelPos) + glassCornerOffsets[i]);
if ((voxel != voxelID) && (!isPane || voxel > 0u)) {
if (floor((worldPos - glassCornerOffsets[i] * (1.0 - pixelOffsetMinus))) == floorWorldPos) {
colorP = colorPvanilla;
}
}
}
#endif
color = colorP * vec4(glColor.rgb, 1.0);
}
}
#endif
@@ -1,35 +1,35 @@
#ifndef INCLUDE_CUSTOM_EMISSION
#define INCLUDE_CUSTOM_EMISSION
float GetCustomEmission(vec4 specularMap, vec2 texCoordM) {
#if CUSTOM_EMISSION_INTENSITY > 0
#if RP_MODE == 2 || RP_MODE == 1 && IPBR_EMISSIVE_MODE == 2 // seuspbr
float emission = specularMap.b;
#elif RP_MODE == 3 || RP_MODE == 1 && IPBR_EMISSIVE_MODE == 3 // labPBR
float emission = specularMap.a < 1.0 ? specularMap.a : 0.0;
vec4 specularMapL0 = texture2DLod(specular, texCoordM, 0);
float emissionL0 = specularMapL0.a < 1.0 ? specularMapL0.a : 0.0;
emission = min(emission, emissionL0); // Fixes issues caused by mipmaps
#endif
return emission * 0.03 * CUSTOM_EMISSION_INTENSITY;
#else
return 0.0;
#endif
}
#ifdef IPBR
float GetCustomEmissionForIPBR(inout vec4 color, float emission) {
vec4 specularMapCheck = texture2DLod(specular, texCoord, 1000.0);
if (specularMapCheck.a == 0.0) return emission;
color = texture2D(tex, texCoord);
vec4 specularMap = texture2D(specular, texCoord);
float customEmission = GetCustomEmission(specularMap, texCoord);
return customEmission;
}
#endif
#endif //INCLUDE_CUSTOM_EMISSION
#ifndef INCLUDE_CUSTOM_EMISSION
#define INCLUDE_CUSTOM_EMISSION
float GetCustomEmission(vec4 specularMap, vec2 texCoordM) {
#if CUSTOM_EMISSION_INTENSITY > 0
#if RP_MODE == 2 || RP_MODE == 1 && IPBR_EMISSIVE_MODE == 2 // seuspbr
float emission = specularMap.b;
#elif RP_MODE == 3 || RP_MODE == 1 && IPBR_EMISSIVE_MODE == 3 // labPBR
float emission = specularMap.a < 1.0 ? specularMap.a : 0.0;
vec4 specularMapL0 = texture2DLod(specular, texCoordM, 0);
float emissionL0 = specularMapL0.a < 1.0 ? specularMapL0.a : 0.0;
emission = min(emission, emissionL0); // Fixes issues caused by mipmaps
#endif
return emission * 0.03 * CUSTOM_EMISSION_INTENSITY;
#else
return 0.0;
#endif
}
#ifdef IPBR
float GetCustomEmissionForIPBR(inout vec4 color, float emission) {
vec4 specularMapCheck = texture2DLod(specular, texCoord, 1000.0);
if (specularMapCheck.a == 0.0) return emission;
color = texture2D(tex, texCoord);
vec4 specularMap = texture2D(specular, texCoord);
float customEmission = GetCustomEmission(specularMap, texCoord);
return customEmission;
}
#endif
#endif //INCLUDE_CUSTOM_EMISSION
@@ -1,96 +1,96 @@
#define ENTITY_GN_AND_CT
#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_ENTITY_MULT 0 //[0 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 NORMAL_RES 128 //[16 32 64 80 96 112 128 144 160 176 192 208 224 240 256 320 384 448 512]
const float normalThreshold = 0.05;
const float normalClamp = 0.2;
const float packSizeGN = 128.0;
#ifdef GBUFFERS_ENTITIES
#if GENERATED_NORMAL_ENTITY_MULT > 0
const float normalMult = GENERATED_NORMAL_ENTITY_MULT * 0.025;
#else
const float normalMult = GENERATED_NORMAL_MULT * 0.025;
#endif
#elif !defined GBUFFERS_HAND
const float normalMult = GENERATED_NORMAL_MULT * 0.025;
#else
const float normalMult = GENERATED_NORMAL_MULT * 0.015;
#endif
float GetDif(float lOriginalAlbedo, vec2 offsetCoord) {
#ifndef GBUFFERS_WATER
float lNearbyAlbedo = length(texture2D(tex, offsetCoord).rgb);
#else
vec4 textureSample = texture2D(tex, offsetCoord);
float lNearbyAlbedo = length(textureSample.rgb * textureSample.a * 1.5);
#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 normalM, vec3 color) {
#ifndef ENTITY_GN_AND_CT
#if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND
return;
#endif
#endif
vec2 absMidCoordPos2 = absMidCoordPos * 2.0;
float lOriginalAlbedo = length(color.rgb);
float normalMult = max0(1.0 - 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.0);
#endif
offsetR /= NORMAL_RES;
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))
normalM = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0));
}
}
#define ENTITY_GN_AND_CT
#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_ENTITY_MULT 0 //[0 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 NORMAL_RES 128 //[16 32 64 80 96 112 128 144 160 176 192 208 224 240 256 320 384 448 512]
const float normalThreshold = 0.05;
const float normalClamp = 0.2;
const float packSizeGN = 128.0;
#ifdef GBUFFERS_ENTITIES
#if GENERATED_NORMAL_ENTITY_MULT > 0
const float normalMult = GENERATED_NORMAL_ENTITY_MULT * 0.025;
#else
const float normalMult = GENERATED_NORMAL_MULT * 0.025;
#endif
#elif !defined GBUFFERS_HAND
const float normalMult = GENERATED_NORMAL_MULT * 0.025;
#else
const float normalMult = GENERATED_NORMAL_MULT * 0.015;
#endif
float GetDif(float lOriginalAlbedo, vec2 offsetCoord) {
#ifndef GBUFFERS_WATER
float lNearbyAlbedo = length(texture2D(tex, offsetCoord).rgb);
#else
vec4 textureSample = texture2D(tex, offsetCoord);
float lNearbyAlbedo = length(textureSample.rgb * textureSample.a * 1.5);
#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 normalM, vec3 color) {
#ifndef ENTITY_GN_AND_CT
#if defined GBUFFERS_ENTITIES || defined GBUFFERS_HAND
return;
#endif
#endif
vec2 absMidCoordPos2 = absMidCoordPos * 2.0;
float lOriginalAlbedo = length(color.rgb);
float normalMult = max0(1.0 - 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.0);
#endif
offsetR /= NORMAL_RES;
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))
normalM = clamp(normalize(normalMap * tbnMatrix), vec3(-1.0), vec3(1.0));
}
}
@@ -1,104 +1,104 @@
bool intersectsAABB(vec3 ro, vec3 rd, vec3 aabbMin, vec3 aabbMax) {
vec3 t0 = (aabbMin - ro) / rd;
vec3 t1 = (aabbMax - ro) / rd;
vec3 tMin = min(t0, t1);
vec3 tMax = max(t0, t1);
float m0 = max(max(tMin.x, tMin.y), tMin.z);
float m1 = min(min(tMax.x, tMax.y), tMax.z);
return m1 > max0(m0);
}
bool intersectsParallelogram(vec3 ro, vec3 rd, vec3 v0, vec3 v1, vec3 v2, float tMin, out float t, out vec2 uv, inout vec3 normal) {
vec3 a = v1 - v0, n = cross(a, v2 - v0);
t = dot(v0 - ro, n) / dot(n, rd);
if (t < 0.0 || t > tMin) return false;
vec3 b = v2 - v1;
vec3 c = ro + rd * t - v0;
uv = vec2(dot(c, a) / dot(a, a), dot(c, b) / dot(b, b));
if (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) return false;
normal = normalize(n);
return true;
}
void CheckQuadAt(int i, vec3 playerPos, vec3 rayDir, inout vec3 albedo, inout float tMin, inout vec3 normal, inout float emissionOut) {
int i0 = 3 * i, i1 = 3 * i + 1, i2 = 3 * i + 2;
vec3 v0 = playerVerticesSSBO.vertexPositions[i0];
vec3 v1 = playerVerticesSSBO.vertexPositions[i1];
vec3 v2 = playerVerticesSSBO.vertexPositions[i2];
float t;
vec2 uv;
vec3 colorP;
vec3 color;
float emission = 0.0;
float smoothnessD, smoothnessG;
if (intersectsParallelogram(playerPos, rayDir, v0, v1, v2, tMin, t, uv, normal)) {
vec2 texCoord0 = playerVerticesSSBO.vertexData[i0];
vec2 texCoord1 = playerVerticesSSBO.vertexData[i1];
vec2 texCoord2 = playerVerticesSSBO.vertexData[i2];
vec2 quadTexCoord = mix(texCoord0, texCoord1, uv.x) + uv.y * (texCoord2 - texCoord1);
vec4 playerAtlasSample = texelFetch(playerAtlas_sampler, ivec2(64 * quadTexCoord), 0);
vec3 colorP = playerAtlasSample.rgb;
vec3 color = playerAtlasSample.rgb;
#ifdef SPACEAGLE17
#include "/lib/materials/specificMaterials/others/SpacEagle17.glsl"
#endif
if (playerAtlasSample.a > 0.2) {albedo = color * (emission * 0.2 + 1.0); tMin = t; emissionOut = emission;}
}
}
bool rayTracePlayer(vec3 playerPos, vec3 rayDir, float wsrTraceLength, out vec3 albedo, out vec3 normal, out float emission) {
float tMin = wsrTraceLength;
vec3 aabbPos = playerPos * 1000.0;
// Head
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.headMin, playerVerticesSSBO.bounds.headMax)) {
for (int i = 0; i < 12; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Right Hand
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.rightHandMin, playerVerticesSSBO.bounds.rightHandMax)) {
for (int i = 12; i < 24; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Left Leg
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.leftLegMin, playerVerticesSSBO.bounds.leftLegMax)) {
for (int i = 24; i < 36; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Left Hand
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.leftHandMin, playerVerticesSSBO.bounds.leftHandMax)) {
for (int i = 36; i < 48; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Right leg
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.rightLegMin, playerVerticesSSBO.bounds.rightLegMax)) {
for (int i = 48; i < 60; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Torso
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.torsoMin, playerVerticesSSBO.bounds.torsoMax)) {
for (int i = 60; i < 72; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
return tMin < wsrTraceLength;
}
bool intersectsAABB(vec3 ro, vec3 rd, vec3 aabbMin, vec3 aabbMax) {
vec3 t0 = (aabbMin - ro) / rd;
vec3 t1 = (aabbMax - ro) / rd;
vec3 tMin = min(t0, t1);
vec3 tMax = max(t0, t1);
float m0 = max(max(tMin.x, tMin.y), tMin.z);
float m1 = min(min(tMax.x, tMax.y), tMax.z);
return m1 > max0(m0);
}
bool intersectsParallelogram(vec3 ro, vec3 rd, vec3 v0, vec3 v1, vec3 v2, float tMin, out float t, out vec2 uv, inout vec3 normal) {
vec3 a = v1 - v0, n = cross(a, v2 - v0);
t = dot(v0 - ro, n) / dot(n, rd);
if (t < 0.0 || t > tMin) return false;
vec3 b = v2 - v1;
vec3 c = ro + rd * t - v0;
uv = vec2(dot(c, a) / dot(a, a), dot(c, b) / dot(b, b));
if (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) return false;
normal = normalize(n);
return true;
}
void CheckQuadAt(int i, vec3 playerPos, vec3 rayDir, inout vec3 albedo, inout float tMin, inout vec3 normal, inout float emissionOut) {
int i0 = 3 * i, i1 = 3 * i + 1, i2 = 3 * i + 2;
vec3 v0 = playerVerticesSSBO.vertexPositions[i0];
vec3 v1 = playerVerticesSSBO.vertexPositions[i1];
vec3 v2 = playerVerticesSSBO.vertexPositions[i2];
float t;
vec2 uv;
vec3 colorP;
vec3 color;
float emission = 0.0;
float smoothnessD, smoothnessG;
if (intersectsParallelogram(playerPos, rayDir, v0, v1, v2, tMin, t, uv, normal)) {
vec2 texCoord0 = playerVerticesSSBO.vertexData[i0];
vec2 texCoord1 = playerVerticesSSBO.vertexData[i1];
vec2 texCoord2 = playerVerticesSSBO.vertexData[i2];
vec2 quadTexCoord = mix(texCoord0, texCoord1, uv.x) + uv.y * (texCoord2 - texCoord1);
vec4 playerAtlasSample = texelFetch(playerAtlas_sampler, ivec2(64 * quadTexCoord), 0);
vec3 colorP = playerAtlasSample.rgb;
vec3 color = playerAtlasSample.rgb;
#ifdef SPACEAGLE17
#include "/lib/materials/specificMaterials/others/SpacEagle17.glsl"
#endif
if (playerAtlasSample.a > 0.2) {albedo = color * (emission * 0.2 + 1.0); tMin = t; emissionOut = emission;}
}
}
bool rayTracePlayer(vec3 playerPos, vec3 rayDir, float wsrTraceLength, out vec3 albedo, out vec3 normal, out float emission) {
float tMin = wsrTraceLength;
vec3 aabbPos = playerPos * 1000.0;
// Head
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.headMin, playerVerticesSSBO.bounds.headMax)) {
for (int i = 0; i < 12; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Right Hand
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.rightHandMin, playerVerticesSSBO.bounds.rightHandMax)) {
for (int i = 12; i < 24; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Left Leg
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.leftLegMin, playerVerticesSSBO.bounds.leftLegMax)) {
for (int i = 24; i < 36; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Left Hand
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.leftHandMin, playerVerticesSSBO.bounds.leftHandMax)) {
for (int i = 36; i < 48; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Right leg
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.rightLegMin, playerVerticesSSBO.bounds.rightLegMax)) {
for (int i = 48; i < 60; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
// Torso
if (intersectsAABB(aabbPos, rayDir, playerVerticesSSBO.bounds.torsoMin, playerVerticesSSBO.bounds.torsoMax)) {
for (int i = 60; i < 72; i++) {
CheckQuadAt(i, playerPos, rayDir, albedo, tMin, normal, emission);
}
}
return tMin < wsrTraceLength;
}
@@ -1,121 +1,121 @@
#include "/lib/util/dither.glsl"
vec2 vTexCoord = signMidCoordPos * 0.5 + 0.5;
#include "/lib/util/dFdxdFdy.glsl"
vec4 ReadNormal(vec2 coord) {
coord = fract(coord) * vTexCoordAM.pq + vTexCoordAM.st;
return textureGrad(normals, coord, dcdx, dcdy);
}
vec2 GetParallaxCoord(float parallaxFade, float dither, inout vec2 newCoord, inout float texDepth, inout vec3 traceCoordDepth) {
float invParallaxQuality = 1.0 / POM_QUALITY;
vec4 normalMap = ReadNormal(vTexCoord.st);
vec2 normalMapM = normalMap.xy * 2.0 - 1.0;
float normalCheck = normalMapM.x + normalMapM.y;
float minHeight = 1.0 - invParallaxQuality;
if (viewVector.z >= 0.0 || normalMap.a >= minHeight || normalCheck <= -1.999) return vTexCoord.st;
vec2 interval = viewVector.xy * 0.25 * (1.0 - parallaxFade) * POM_DEPTH / (-viewVector.z * POM_QUALITY);
float i = 0.0;
vec2 localCoord;
#if defined GBUFFERS_TERRAIN || defined GBUFFERS_BLOCK
if (texDepth <= 1.0 - i * invParallaxQuality) {
localCoord = vTexCoord.st + i * interval;
texDepth = ReadNormal(localCoord).a;
i = dither;
}
#endif
for (; i < POM_QUALITY && texDepth <= 1.0 - i * invParallaxQuality; i++) {
localCoord = vTexCoord.st + i * interval;
texDepth = ReadNormal(localCoord).a;
}
float pI = float(max(i - 1, 0));
traceCoordDepth.xy -= pI * interval;
traceCoordDepth.z -= pI * invParallaxQuality;
localCoord = fract(vTexCoord.st + pI * interval);
newCoord = localCoord * vTexCoordAM.pq + vTexCoordAM.st;
return localCoord;
}
float GetParallaxShadow(float parallaxFade, float dither, float height, vec2 coord, vec3 lightVec, mat3 tbn) {
float parallaxshadow = 1.0;
vec3 parallaxdir = tbn * lightVec;
parallaxdir.xy *= 1.0 * POM_DEPTH; // Angle
for (int i = 0; i < 4 && parallaxshadow >= 0.01; i++) {
float stepLC = 0.025 * (i + dither);
float currentHeight = height + parallaxdir.z * stepLC;
vec2 parallaxCoord = fract(coord + parallaxdir.xy * stepLC) * vTexCoordAM.pq + vTexCoordAM.st;
float offsetHeight = textureGrad(normals, parallaxCoord, dcdx, dcdy).a;
parallaxshadow *= clamp(1.0 - (offsetHeight - currentHeight) * 4.0, 0.0, 1.0);
}
return mix(parallaxshadow, 1.0, parallaxFade);
}
// Big thanks to null511 for slope normals
vec3 GetParallaxSlopeNormal(vec2 texCoord, float traceDepth, vec3 viewDir) {
vec2 atlasPixelSize = 1.0 / atlasSize;
float atlasAspect = atlasSize.x / atlasSize.y;
vec2 atlasCoord = fract(texCoord) * vTexCoordAM.pq + vTexCoordAM.st;
vec2 tileSize = atlasSize * vTexCoordAM.pq;
vec2 tilePixelSize = 1.0 / tileSize;
vec2 tex_snapped = floor(atlasCoord * atlasSize) * atlasPixelSize;
vec2 tex_offset = atlasCoord - (tex_snapped + 0.5 * atlasPixelSize);
vec2 stepSign = sign(tex_offset);
vec2 viewSign = sign(viewDir.xy);
bool dir = abs(tex_offset.x * atlasAspect) < abs(tex_offset.y);
vec2 tex_x, tex_y;
if (dir) {
tex_x = texCoord - vec2(tilePixelSize.x * viewSign.x, 0.0);
tex_y = texCoord + vec2(0.0, stepSign.y * tilePixelSize.y);
}
else {
tex_x = texCoord + vec2(tilePixelSize.x * stepSign.x, 0.0);
tex_y = texCoord - vec2(0.0, viewSign.y * tilePixelSize.y);
}
float height_x = ReadNormal(tex_x).a;
float height_y = ReadNormal(tex_y).a;
if (dir) {
if (!(traceDepth > height_y && viewSign.y != stepSign.y)) {
if (traceDepth > height_x) return vec3(-viewSign.x, 0.0, 0.0);
if (abs(viewDir.y) > abs(viewDir.x))
return vec3(0.0, -viewSign.y, 0.0);
else
return vec3(-viewSign.x, 0.0, 0.0);
}
return vec3(0.0, -viewSign.y, 0.0);
}
else {
if (!(traceDepth > height_x && viewSign.x != stepSign.x)) {
if (traceDepth > height_y) return vec3(0.0, -viewSign.y, 0.0);
if (abs(viewDir.y) > abs(viewDir.x))
return vec3(0.0, -viewSign.y, 0.0);
else
return vec3(-viewSign.x, 0.0, 0.0);
}
return vec3(-viewSign.x, 0.0, 0.0);
}
}
#include "/lib/util/dither.glsl"
vec2 vTexCoord = signMidCoordPos * 0.5 + 0.5;
#include "/lib/util/dFdxdFdy.glsl"
vec4 ReadNormal(vec2 coord) {
coord = fract(coord) * vTexCoordAM.pq + vTexCoordAM.st;
return textureGrad(normals, coord, dcdx, dcdy);
}
vec2 GetParallaxCoord(float parallaxFade, float dither, inout vec2 newCoord, inout float texDepth, inout vec3 traceCoordDepth) {
float invParallaxQuality = 1.0 / POM_QUALITY;
vec4 normalMap = ReadNormal(vTexCoord.st);
vec2 normalMapM = normalMap.xy * 2.0 - 1.0;
float normalCheck = normalMapM.x + normalMapM.y;
float minHeight = 1.0 - invParallaxQuality;
if (viewVector.z >= 0.0 || normalMap.a >= minHeight || normalCheck <= -1.999) return vTexCoord.st;
vec2 interval = viewVector.xy * 0.25 * (1.0 - parallaxFade) * POM_DEPTH / (-viewVector.z * POM_QUALITY);
float i = 0.0;
vec2 localCoord;
#if defined GBUFFERS_TERRAIN || defined GBUFFERS_BLOCK
if (texDepth <= 1.0 - i * invParallaxQuality) {
localCoord = vTexCoord.st + i * interval;
texDepth = ReadNormal(localCoord).a;
i = dither;
}
#endif
for (; i < POM_QUALITY && texDepth <= 1.0 - i * invParallaxQuality; i++) {
localCoord = vTexCoord.st + i * interval;
texDepth = ReadNormal(localCoord).a;
}
float pI = float(max(i - 1, 0));
traceCoordDepth.xy -= pI * interval;
traceCoordDepth.z -= pI * invParallaxQuality;
localCoord = fract(vTexCoord.st + pI * interval);
newCoord = localCoord * vTexCoordAM.pq + vTexCoordAM.st;
return localCoord;
}
float GetParallaxShadow(float parallaxFade, float dither, float height, vec2 coord, vec3 lightVec, mat3 tbn) {
float parallaxshadow = 1.0;
vec3 parallaxdir = tbn * lightVec;
parallaxdir.xy *= 1.0 * POM_DEPTH; // Angle
for (int i = 0; i < 4 && parallaxshadow >= 0.01; i++) {
float stepLC = 0.025 * (i + dither);
float currentHeight = height + parallaxdir.z * stepLC;
vec2 parallaxCoord = fract(coord + parallaxdir.xy * stepLC) * vTexCoordAM.pq + vTexCoordAM.st;
float offsetHeight = textureGrad(normals, parallaxCoord, dcdx, dcdy).a;
parallaxshadow *= clamp(1.0 - (offsetHeight - currentHeight) * 4.0, 0.0, 1.0);
}
return mix(parallaxshadow, 1.0, parallaxFade);
}
// Big thanks to null511 for slope normals
vec3 GetParallaxSlopeNormal(vec2 texCoord, float traceDepth, vec3 viewDir) {
vec2 atlasPixelSize = 1.0 / atlasSize;
float atlasAspect = atlasSize.x / atlasSize.y;
vec2 atlasCoord = fract(texCoord) * vTexCoordAM.pq + vTexCoordAM.st;
vec2 tileSize = atlasSize * vTexCoordAM.pq;
vec2 tilePixelSize = 1.0 / tileSize;
vec2 tex_snapped = floor(atlasCoord * atlasSize) * atlasPixelSize;
vec2 tex_offset = atlasCoord - (tex_snapped + 0.5 * atlasPixelSize);
vec2 stepSign = sign(tex_offset);
vec2 viewSign = sign(viewDir.xy);
bool dir = abs(tex_offset.x * atlasAspect) < abs(tex_offset.y);
vec2 tex_x, tex_y;
if (dir) {
tex_x = texCoord - vec2(tilePixelSize.x * viewSign.x, 0.0);
tex_y = texCoord + vec2(0.0, stepSign.y * tilePixelSize.y);
}
else {
tex_x = texCoord + vec2(tilePixelSize.x * stepSign.x, 0.0);
tex_y = texCoord - vec2(0.0, viewSign.y * tilePixelSize.y);
}
float height_x = ReadNormal(tex_x).a;
float height_y = ReadNormal(tex_y).a;
if (dir) {
if (!(traceDepth > height_y && viewSign.y != stepSign.y)) {
if (traceDepth > height_x) return vec3(-viewSign.x, 0.0, 0.0);
if (abs(viewDir.y) > abs(viewDir.x))
return vec3(0.0, -viewSign.y, 0.0);
else
return vec3(-viewSign.x, 0.0, 0.0);
}
return vec3(0.0, -viewSign.y, 0.0);
}
else {
if (!(traceDepth > height_x && viewSign.x != stepSign.x)) {
if (traceDepth > height_y) return vec3(0.0, -viewSign.y, 0.0);
if (abs(viewDir.y) > abs(viewDir.x))
return vec3(0.0, -viewSign.y, 0.0);
else
return vec3(-viewSign.x, 0.0, 0.0);
}
return vec3(-viewSign.x, 0.0, 0.0);
}
}
@@ -1,107 +1,107 @@
void AddBackgroundReflection(inout vec4 reflection, vec3 color, vec3 playerPos, vec3 normalM, vec3 normalMR, vec3 viewPos, vec3 nViewPos, vec3 nViewPosR,
vec3 shadowMult, float RVdotU, float RVdotS, float z0, float dither, float skyLightFactor, float smoothness, float highlightMult) {
#ifdef OVERWORLD
#if defined COMPOSITE || WATER_REFLECT_QUALITY >= 2
vec3 skyReflection = GetSky(RVdotU, RVdotS, dither, isEyeInWater == 0, true);
#else
vec3 skyReflection = GetLowQualitySky(RVdotU, RVdotS, dither, isEyeInWater == 0, true);
#endif
#ifdef ATM_COLOR_MULTS
skyReflection *= atmColorMult;
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
skyReflection *= moonPhaseInfluence;
#endif
#ifdef COMPOSITE
skyReflection *= skyLightFactor;
#else
float specularHighlight = GGX(normalM, nViewPos, lightVec, max(dot(normalM, lightVec), 0.0), smoothness);
skyReflection += specularHighlight * highlightColor * shadowMult * highlightMult * invRainFactor;
#if WATER_REFLECT_QUALITY >= 1
#ifdef SKY_EFFECT_REFLECTION
float cloudLinearDepth = 1.0;
float skyFade = 1.0;
vec3 auroraBorealis = vec3(0.0);
vec3 nightNebula = vec3(0.0);
#if AURORA_STYLE > 0
auroraBorealis = GetAuroraBorealis(nViewPosR, RVdotU, dither);
skyReflection += auroraBorealis;
#endif
#if NIGHT_NEBULAE == 1
nightNebula += GetNightNebula(nViewPosR, RVdotU, RVdotS);
skyReflection += nightNebula;
#endif
vec2 starCoord = GetStarCoord(nViewPos, 0.5);
#ifdef PIXELATED_WATER_REFLECTIONS
vec3 absPlayerPos = abs(playerPos);
float sizeDecider = -clamp01(pow2(min1(length(absPlayerPos) / 10))) + 1.0; // The effect will only be around the player
float starSize = mix(1.0, 2.0, step(0.2, sizeDecider));
#else
float starSize = 1.0;
#endif
#if STAR_BRIGHTNESS != 3
vec3 starColor = GetStars(starCoord, RVdotU, RVdotS, 1.0 * starSize, 0.0);
#define ADD_STAR_LAYER_OW1 (STAR_LAYER_OW == 1 || STAR_LAYER_OW == 3)
#define ADD_STAR_LAYER_OW2 (STAR_LAYER_OW == 2 || STAR_LAYER_OW == 3)
#if ADD_STAR_LAYER_OW1
starColor = max(starColor, GetStars(starCoord, RVdotU, RVdotS, 0.66 * starSize, 0.0));
#endif
#if ADD_STAR_LAYER_OW2
starColor = max(starColor, GetStars(starCoord, RVdotU, RVdotS, 2.2 * starSize, 0.45));
#endif
skyReflection += starColor;
#endif
#ifdef VL_CLOUDS_ACTIVE
vec3 worldNormalMR = normalize(mat3(gbufferModelViewInverse) * normalMR);
vec3 cameraPosOffset = 2.0 * worldNormalMR * dot(playerPos, worldNormalMR);
vec3 RPlayerPos = normalize(mat3(gbufferModelViewInverse) * nViewPosR);
float RlViewPos = 100000.0;
vec4 clouds = GetClouds(cloudLinearDepth, skyFade, cameraPosOffset, RPlayerPos,
viewPos, RlViewPos, RVdotS, RVdotU, dither, auroraBorealis, nightNebula, sunVec);
skyReflection = mix(skyReflection, clouds.rgb, clouds.a);
#endif
#endif
skyReflection = mix(color * 0.5, skyReflection, skyLightFactor);
#else
skyReflection = mix(color, skyReflection, skyLightFactor * 0.5);
#endif
#endif
#elif defined END
#ifdef COMPOSITE
#ifdef END_BEAMS
vec3 skyReflection = (endSkyColor + 0.4 * DrawEnderBeams(RVdotU, playerPos, nViewPosR)) * skyLightFactor;
#else
vec3 skyReflection = endSkyColor * skyLightFactor;
#endif
#else
vec3 skyReflection = endSkyColor * shadowMult;
#endif
#ifdef ATM_COLOR_MULTS
skyReflection *= atmColorMult;
#endif
#else
vec3 skyReflection = vec3(0.0);
#endif
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined COMPOSITE && (BLOCK_REFLECT_QUALITY >= 2 || WATER_REFLECT_QUALITY >= 2)
vec4 wsrReflection = getWSR(playerPos, normalMR, nViewPosR, RVdotU, RVdotS, z0, dither);
reflection = mix(wsrReflection, vec4(reflection.rgb, 1.0), reflection.a);
refDist = min(refDist, length(wsrHitPos - playerPos));
#endif
reflection.rgb = mix(skyReflection, reflection.rgb, reflection.a);
}
void AddBackgroundReflection(inout vec4 reflection, vec3 color, vec3 playerPos, vec3 normalM, vec3 normalMR, vec3 viewPos, vec3 nViewPos, vec3 nViewPosR,
vec3 shadowMult, float RVdotU, float RVdotS, float z0, float dither, float skyLightFactor, float smoothness, float highlightMult) {
#ifdef OVERWORLD
#if defined COMPOSITE || WATER_REFLECT_QUALITY >= 2
vec3 skyReflection = GetSky(RVdotU, RVdotS, dither, isEyeInWater == 0, true);
#else
vec3 skyReflection = GetLowQualitySky(RVdotU, RVdotS, dither, isEyeInWater == 0, true);
#endif
#ifdef ATM_COLOR_MULTS
skyReflection *= atmColorMult;
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
skyReflection *= moonPhaseInfluence;
#endif
#ifdef COMPOSITE
skyReflection *= skyLightFactor;
#else
float specularHighlight = GGX(normalM, nViewPos, lightVec, max(dot(normalM, lightVec), 0.0), smoothness);
skyReflection += specularHighlight * highlightColor * shadowMult * highlightMult * invRainFactor;
#if WATER_REFLECT_QUALITY >= 1
#ifdef SKY_EFFECT_REFLECTION
float cloudLinearDepth = 1.0;
float skyFade = 1.0;
vec3 auroraBorealis = vec3(0.0);
vec3 nightNebula = vec3(0.0);
#if AURORA_STYLE > 0
auroraBorealis = GetAuroraBorealis(nViewPosR, RVdotU, dither);
skyReflection += auroraBorealis;
#endif
#if NIGHT_NEBULAE == 1
nightNebula += GetNightNebula(nViewPosR, RVdotU, RVdotS);
skyReflection += nightNebula;
#endif
vec2 starCoord = GetStarCoord(nViewPos, 0.5);
#ifdef PIXELATED_WATER_REFLECTIONS
vec3 absPlayerPos = abs(playerPos);
float sizeDecider = -clamp01(pow2(min1(length(absPlayerPos) / 10))) + 1.0; // The effect will only be around the player
float starSize = mix(1.0, 2.0, step(0.2, sizeDecider));
#else
float starSize = 1.0;
#endif
#if STAR_BRIGHTNESS != 3
vec3 starColor = GetStars(starCoord, RVdotU, RVdotS, 1.0 * starSize, 0.0);
#define ADD_STAR_LAYER_OW1 (STAR_LAYER_OW == 1 || STAR_LAYER_OW == 3)
#define ADD_STAR_LAYER_OW2 (STAR_LAYER_OW == 2 || STAR_LAYER_OW == 3)
#if ADD_STAR_LAYER_OW1
starColor = max(starColor, GetStars(starCoord, RVdotU, RVdotS, 0.66 * starSize, 0.0));
#endif
#if ADD_STAR_LAYER_OW2
starColor = max(starColor, GetStars(starCoord, RVdotU, RVdotS, 2.2 * starSize, 0.45));
#endif
skyReflection += starColor;
#endif
#ifdef VL_CLOUDS_ACTIVE
vec3 worldNormalMR = normalize(mat3(gbufferModelViewInverse) * normalMR);
vec3 cameraPosOffset = 2.0 * worldNormalMR * dot(playerPos, worldNormalMR);
vec3 RPlayerPos = normalize(mat3(gbufferModelViewInverse) * nViewPosR);
float RlViewPos = 100000.0;
vec4 clouds = GetClouds(cloudLinearDepth, skyFade, cameraPosOffset, RPlayerPos,
viewPos, RlViewPos, RVdotS, RVdotU, dither, auroraBorealis, nightNebula, sunVec);
skyReflection = mix(skyReflection, clouds.rgb, clouds.a);
#endif
#endif
skyReflection = mix(color * 0.5, skyReflection, skyLightFactor);
#else
skyReflection = mix(color, skyReflection, skyLightFactor * 0.5);
#endif
#endif
#elif defined END
#ifdef COMPOSITE
#ifdef END_BEAMS
vec3 skyReflection = (endSkyColor + 0.4 * DrawEnderBeams(RVdotU, playerPos, nViewPosR)) * skyLightFactor;
#else
vec3 skyReflection = endSkyColor * skyLightFactor;
#endif
#else
vec3 skyReflection = endSkyColor * shadowMult;
#endif
#ifdef ATM_COLOR_MULTS
skyReflection *= atmColorMult;
#endif
#else
vec3 skyReflection = vec3(0.0);
#endif
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined COMPOSITE && (BLOCK_REFLECT_QUALITY >= 2 || WATER_REFLECT_QUALITY >= 2)
vec4 wsrReflection = getWSR(playerPos, normalMR, nViewPosR, RVdotU, RVdotS, z0, dither);
reflection = mix(wsrReflection, vec4(reflection.rgb, 1.0), reflection.a);
refDist = min(refDist, length(wsrHitPos - playerPos));
#endif
reflection.rgb = mix(skyReflection, reflection.rgb, reflection.a);
}
@@ -1,43 +1,43 @@
vec4 sampleBlurFilteredReflection(vec4 centerCol, float dither, float z0) {
vec4 texture4 = texture2D(colortex4, texCoord);
vec3 texture6 = texelFetch(colortex6, texelCoord, 0).rgb;
float smoothnessD = texture6.r;
//float linearZ0 = GetLinearDepth(z0);
const float spatialFactor = 2.5; // higher = smoother in space
const float spatialFactorM = 2.0 * spatialFactor * spatialFactor;
vec4 sum = vec4(0.0);
float wsum = 0.0;
vec2 texelSize = (3.0 + 6.0 * dither) / view; // 1 pixel range doesn't seem to be enough to smooth things out
texelSize *= 1.0 - 0.75 * pow2(pow2(pow2(smoothnessD)));
int k = 2;
for (int dy = -k; dy <= k; dy++) {
for (int dx = -k; dx <= k; dx++) {
vec2 offset = vec2(float(dx), float(dy)) * texelSize;
vec2 sampleCoord = texCoord + offset;
vec4 sampleCol = texture2D(colortex7, sampleCoord);
// Skip step if normals are too different
vec4 texture1Sample = texture2D(colortex1, sampleCoord);
if (length(texture4.rgb - texture1Sample.rgb) > 0.1) continue;
// Skip if depth is too different (costs performance for a tiny fix)
#ifdef REFLECTION_BLUR_DEPTH_CHECK
if (abs(GetLinearDepth(texture2D(depthtex0, sampleCoord).r) - linearZ0) * far > 2.0) continue;
#endif
// Spatial weight (gaussian)
float spatialDist2 = float(dx*dx + dy*dy);
float w_s = exp(-spatialDist2 / spatialFactorM);
float w = w_s;
sum += sampleCol * w;
wsum += w_s;
}
}
return sum / wsum;
}
vec4 sampleBlurFilteredReflection(vec4 centerCol, float dither, float z0) {
vec4 texture4 = texture2D(colortex4, texCoord);
vec3 texture6 = texelFetch(colortex6, texelCoord, 0).rgb;
float smoothnessD = texture6.r;
//float linearZ0 = GetLinearDepth(z0);
const float spatialFactor = 2.5; // higher = smoother in space
const float spatialFactorM = 2.0 * spatialFactor * spatialFactor;
vec4 sum = vec4(0.0);
float wsum = 0.0;
vec2 texelSize = (3.0 + 6.0 * dither) / view; // 1 pixel range doesn't seem to be enough to smooth things out
texelSize *= 1.0 - 0.75 * pow2(pow2(pow2(smoothnessD)));
int k = 2;
for (int dy = -k; dy <= k; dy++) {
for (int dx = -k; dx <= k; dx++) {
vec2 offset = vec2(float(dx), float(dy)) * texelSize;
vec2 sampleCoord = texCoord + offset;
vec4 sampleCol = texture2D(colortex7, sampleCoord);
// Skip step if normals are too different
vec4 texture1Sample = texture2D(colortex1, sampleCoord);
if (length(texture4.rgb - texture1Sample.rgb) > 0.1) continue;
// Skip if depth is too different (costs performance for a tiny fix)
#ifdef REFLECTION_BLUR_DEPTH_CHECK
if (abs(GetLinearDepth(texture2D(depthtex0, sampleCoord).r) - linearZ0) * far > 2.0) continue;
#endif
// Spatial weight (gaussian)
float spatialDist2 = float(dx*dx + dy*dy);
float w_s = exp(-spatialDist2 / spatialFactorM);
float w = w_s;
sum += sampleCol * w;
wsum += w_s;
}
}
return sum / wsum;
}
@@ -1,290 +1,290 @@
#include "/lib/misc/reprojection.glsl"
#ifdef OVERWORLD
#include "/lib/atmospherics/sky.glsl"
#include "/lib/shaderSettings/stars.glsl"
#ifdef END_PORTAL_BEAM_INTERNAL
#include "/lib/atmospherics/endPortalBeam.glsl"
#endif
#endif
#ifdef END
#include "/lib/shaderSettings/endBeams.glsl"
#ifdef COMPOSITE
#include "/lib/atmospherics/enderBeams.glsl"
#endif
#if END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0
#include "/lib/atmospherics/endCrystalVortex.glsl"
#endif
#include "/lib/atmospherics/fog/endCenterFog.glsl"
#endif
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined COMPOSITE
#include "/lib/voxelization/lightVoxelization.glsl"
#include "/lib/materials/materialMethods/worldSpaceRef.glsl"
#endif
float GetApproxDistance(float depth) {
return near * far / (far - depth * far);
}
vec3 nvec3(vec4 pos) {
return pos.xyz/pos.w;
}
float refDist = far;
#include "/lib/materials/materialMethods/reflectionBackground.glsl"
vec4 GetReflection(vec3 normalM, vec3 viewPos, vec3 nViewPos, vec3 playerPos, float lViewPos, float z0,
sampler2D depthtex, float dither, float skyLightFactor, float fresnel,
float smoothness, vec3 geoNormal, vec3 color, vec3 shadowMult, float highlightMult, float enderDragonDead, vec2 texelOffset) {
// ============================== Step 1: Prepare ============================== //
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
vec2 rEdge = vec2(0.6, 0.55);
#else
vec2 rEdge = vec2(0.525, 0.525);
#endif
vec3 normalMR = normalM;
#if defined PIXELATED_WATER_REFLECTIONS && defined GBUFFERS_WATER
playerPos = TexelSnap(playerPos, texelOffset);
viewPos = TexelSnap(viewPos, texelOffset);
nViewPos = TexelSnap(nViewPos, texelOffset);
lViewPos = TexelSnap(lViewPos, texelOffset);
fresnel = TexelSnap(fresnel, texelOffset);
#endif
#if defined GBUFFERS_WATER && WATER_STYLE == 1 && defined GENERATED_NORMALS
normalMR = normalize(mix(geoNormal, normalM, 0.05));
#endif
vec3 nViewPosR = normalize(reflect(nViewPos, normalMR));
float RVdotU = dot(nViewPosR, upVec);
float RVdotS = dot(nViewPosR, sunVec);
vec3 worldRefDir = 0.5 * far * (mat3(gbufferModelViewInverse) * nViewPosR);
#if defined GBUFFERS_WATER && WATER_STYLE >= 2
normalMR = normalize(mix(geoNormal, normalM, 0.8));
#endif
// ============================== End of Step 1 ============================== //
// ============================== Step 2: Calculate Terrain Reflection and Alpha ============================== //
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined COMPOSITE && WATER_REFLECT_QUALITY >= 1
// In COMPOSITE for translucents we just need to return WSR and that's it
if (z0 != z1) {
/*vec4 reflection;
AddBackgroundReflection(reflection, color, playerPos, normalM, normalMR, viewPos, nViewPos, nViewPosR,
shadowMult, RVdotU, RVdotS, z0, dither, skyLightFactor, smoothness, highlightMult);
return reflection;*/
vec4 reflection = getWSR(playerPos, normalMR, nViewPosR, RVdotU, RVdotS, z0, dither);
refDist = length(playerPos - wsrHitPos);
return reflection;
}
#endif
vec4 reflection = vec4(0.0);
vec3 refPos = vec3(0.0);
vec3 reflectionColor = vec3(0.0);
#if (defined COMPOSITE || WATER_REFLECT_QUALITY >= 1) && (WORLD_SPACE_REFLECTIONS_INTERNAL == -1 || WORLD_SPACE_REF_MODE == 2)
#if defined COMPOSITE || WATER_REFLECT_QUALITY >= 2 && !defined DH_WATER
// Method 1: Ray Marched Reflection //
// Ray Marching
vec3 start = viewPos + normalMR * (lViewPos * 0.025 * (1.0 - fresnel) + 0.05);
#if defined GBUFFERS_WATER && WATER_STYLE >= 2
vec3 vector = normalize(reflect(nViewPos, normalMR)); // Not using nViewPosR because normalMR changed
#else
vec3 vector = nViewPosR;
#endif
//vector = normalize(vector - 0.5 * (1.0 - smoothness) * (1.0 - fresnel) * normalMR); // reflection anisotropy test
//vector = normalize(vector - 0.075 * dither * (1.0 - pow2(pow2(fresnel))) * normalMR);
vector *= 0.5;
vec3 vectorBase = vector;
vec3 viewPosRT = viewPos + vector;
vec3 tvector = vector;
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
int sampleCount = 30;
int refinementCount = 6;
#else
int sampleCount = 38;
int refinementCount = 10;
#endif
int sr = 0;
float dist = 0.0;
vec3 rfragpos = vec3(0.0);
float err = 9999999.0;
for (int i = 0; i < sampleCount; i++) {
refPos = nvec3(gbufferProjection * vec4(viewPosRT, 1.0)) * 0.5 + 0.5;
if (abs(refPos.x - 0.5) > rEdge.x || abs(refPos.y - 0.5) > rEdge.y) break;
rfragpos = vec3(refPos.xy, texture2D(depthtex, refPos.xy).r);
rfragpos = nvec3(gbufferProjectionInverse * vec4(rfragpos * 2.0 - 1.0, 1.0));
dist = length(start - rfragpos);
err = length(viewPosRT - rfragpos);
if (err * 0.33333 < length(vector)) {
sr++;
if (sr >= refinementCount) break;
tvector -= vector;
vector *= 0.1;
}
vector *= 2.0;
tvector += vector * (0.95 + 0.1 * dither);
viewPosRT = start + tvector;
}
float lViewPosRT = length(rfragpos);
// Finalizing Terrain Reflection and Alpha
if (
refPos.z < 0.99997
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && COLORED_LIGHTING_INTERNAL >= 256
&& (err < 2.0 + pow2(lViewPosRT) * 0.001 || lViewPosRT > 0.25 * COLORED_LIGHTING_INTERNAL)
#endif
) {
vec2 absPos = abs(refPos.xy - 0.5);
vec2 cdist = absPos / rEdge;
float border = clamp(1.0 - pow(max(cdist.x, cdist.y), 50.0), 0.0, 1.0);
reflection.a = border;
if (reflection.a > 0.001) {
vec2 edgeFactor = pow2(pow2(pow2(cdist)));
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
refPos.y += (dither - 0.5) * (0.05 * (edgeFactor.x + edgeFactor.y));
#endif
#ifdef GBUFFERS_WATER
reflection = texture2D(gaux2, refPos.xy);
reflection.rgb = pow2(reflection.rgb * 2.0);
#else
float smoothnessDM = pow2(smoothness);
float lodFactor = 1.0 - exp(-0.125 * (1.0 - smoothnessDM) * dist);
float lod = log2(viewHeight / 8.0 * (1.0 - smoothnessDM) * lodFactor) * 0.45;
if (z0 <= 0.56) lod *= 2.22; // Using more lod to compensate for less roughness noise on held items
lod = max(lod - 1.0, 0.0);
reflection.rgb = texture2DLod(colortex0, refPos.xy, lod).rgb;
reflectionColor = reflection.rgb;
#endif
float skyFade = 0.0;
#ifdef GBUFFERS_WATER
float reflectionPrevAlpha = reflection.a;
DoFog(reflection, skyFade, lViewPosRT, ViewToPlayer(rfragpos.xyz), RVdotU, RVdotS, dither, true, lViewPos);
reflection.a = reflectionPrevAlpha;
//reflection.a *= 1.0 - skyFade;
#endif
edgeFactor.x = pow2(edgeFactor.x);
edgeFactor = 1.0 - edgeFactor;
float refFactor = pow(edgeFactor.x * edgeFactor.y, 2.0 + 3.0 * GetLuminance(reflection.rgb));
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined GBUFFERS_WATER
refFactor = min(refFactor, 0.1) * 10.0;
#endif
reflection.a *= refFactor;
refDist = dist;
}
float posDif = lViewPosRT - lViewPos;
reflection.a *= clamp(posDif + 3.0, 0.0, 1.0);
}
#if !defined COMPOSITE && defined DISTANT_HORIZONS
else
#endif
#endif
#if !defined COMPOSITE && (WATER_REFLECT_QUALITY < 2 || defined DISTANT_HORIZONS) || defined DH_WATER
{ // Method 2: Mirorred Image Reflection //
#if WATER_REFLECT_QUALITY < 2 && !defined DISTANT_HORIZONS
float verticalStretch = 0.013; // for potato quality reflections
#else
float verticalStretch = 0.0025; // for distant horizons reflections
#endif
vec4 clipPosR = gbufferProjection * vec4(nViewPosR + verticalStretch * viewPos, 1.0);
vec3 screenPosR = clipPosR.xyz / clipPosR.w * 0.5 + 0.5;
vec2 screenPosRM = abs(screenPosR.xy - 0.5);
if (screenPosRM.x < rEdge.x && screenPosRM.y < rEdge.y) {
vec2 edgeFactor = pow2(pow2(pow2(screenPosRM / rEdge)));
screenPosR.y += (dither - 0.5) * (0.03 * (edgeFactor.x + edgeFactor.y) + 0.004);
float z1R = texture2D(depthtex1, screenPosR.xy).x;
screenPosR.z = z1R;
vec3 viewPosR = ScreenToView(screenPosR);
float lViewPosR = length(viewPosR);
#ifdef DISTANT_HORIZONS
float z1RDH = texture2D(dhDepthTex, screenPosR.xy).x;
vec4 screenPos1DH = vec4(screenPosR.xy, z1RDH, 1.0);
vec4 viewPos1DH = dhProjectionInverse * (screenPos1DH * 2.0 - 1.0);
viewPos1DH /= viewPos1DH.w;
lViewPosR = min(lViewPosR, length(viewPos1DH.xyz));
z1R = min(z1R, z1RDH);
#endif
if (z1R < 0.9997 && lViewPos <= 2.0 + lViewPosR) {
reflection.rgb = texture2D(gaux2, screenPosR.xy).rgb;
reflection.rgb = pow2(reflection.rgb * 2.0);
edgeFactor = 1.0 - edgeFactor;
reflection.a = edgeFactor.x * pow2(edgeFactor.y);
reflection.a *= clamp01((dot(nViewPos, nViewPosR) - 0.45) * 10.0); // Fixes perpendicular ref bug
#ifdef BORDER_FOG
float fog = lViewPosR / renderDistance;
fog = pow2(pow2(fog));
#ifndef DISTANT_HORIZONS
fog = pow2(pow2(fog));
#endif
reflection.a *= exp(-3.0 * fog);
#endif
}
}
}
#endif
#endif
// ============================== End of Step 2 ============================== //
// ============================== Step 3: Add Sky or WSR Reflection ============================== //
#if defined COMPOSITE || WATER_REFLECT_QUALITY >= 1
if (reflection.a < 1.0)
#endif
{
AddBackgroundReflection(reflection, color, playerPos, normalM, normalMR, viewPos, nViewPos, nViewPosR,
shadowMult, RVdotU, RVdotS, z0, dither, skyLightFactor, smoothness, highlightMult);
}
// ============================== End of Step 3 ============================== //
#if (defined COMPOSITE || (WATER_REFLECT_QUALITY >= 2 && defined SKY_EFFECT_REFLECTION)) && (END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0)
reflection.rgb += EndCrystalVortices(playerPos, worldRefDir, dither).rgb;
#endif
#if (defined COMPOSITE || (WATER_REFLECT_QUALITY >= 2 && defined SKY_EFFECT_REFLECTION)) && defined END_PORTAL_BEAM_INTERNAL && !defined DH_WATER
vec4 refPosPlayer = gbufferModelViewInverse * (gbufferProjectionInverse * vec4(refPos * 2.0 - 1.0, 1.0));
refPosPlayer /= refPosPlayer.w;
reflection.rgb += sqrt(GetEndPortalBeam(playerPos, refPosPlayer.xyz * reflection.a - playerPos).rgb);
#endif
#if (defined COMPOSITE || WATER_REFLECT_QUALITY >= 2) && (WORLD_SPACE_REFLECTIONS_INTERNAL == -1 || WORLD_SPACE_REF_MODE == 2) && defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900 && !defined DH_WATER
if (reflection.a < 1.0) {
float attentuation = doEndCenterFog(playerPos + cameraPositionBest, worldRefDir.xyz, length(viewPosRT - start), 0.07);
vec3 pointLightFog = vec3(END_CENTER_LIGHTING_R, END_CENTER_LIGHTING_G + 0.05, END_CENTER_LIGHTING_B) * 0.355 * END_CENTER_LIGHTING * attentuation * enderDragonDead;
reflection.rgb += sqrt(clamp01(pointLightFog - reflectionColor));
}
#endif
return reflection;
}
#include "/lib/misc/reprojection.glsl"
#ifdef OVERWORLD
#include "/lib/atmospherics/sky.glsl"
#include "/lib/shaderSettings/stars.glsl"
#ifdef END_PORTAL_BEAM_INTERNAL
#include "/lib/atmospherics/endPortalBeam.glsl"
#endif
#endif
#ifdef END
#include "/lib/shaderSettings/endBeams.glsl"
#ifdef COMPOSITE
#include "/lib/atmospherics/enderBeams.glsl"
#endif
#if END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0
#include "/lib/atmospherics/endCrystalVortex.glsl"
#endif
#include "/lib/atmospherics/fog/endCenterFog.glsl"
#endif
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined COMPOSITE
#include "/lib/voxelization/lightVoxelization.glsl"
#include "/lib/materials/materialMethods/worldSpaceRef.glsl"
#endif
float GetApproxDistance(float depth) {
return near * far / (far - depth * far);
}
vec3 nvec3(vec4 pos) {
return pos.xyz/pos.w;
}
float refDist = far;
#include "/lib/materials/materialMethods/reflectionBackground.glsl"
vec4 GetReflection(vec3 normalM, vec3 viewPos, vec3 nViewPos, vec3 playerPos, float lViewPos, float z0,
sampler2D depthtex, float dither, float skyLightFactor, float fresnel,
float smoothness, vec3 geoNormal, vec3 color, vec3 shadowMult, float highlightMult, float enderDragonDead, vec2 texelOffset) {
// ============================== Step 1: Prepare ============================== //
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
vec2 rEdge = vec2(0.6, 0.55);
#else
vec2 rEdge = vec2(0.525, 0.525);
#endif
vec3 normalMR = normalM;
#if defined PIXELATED_WATER_REFLECTIONS && defined GBUFFERS_WATER
playerPos = TexelSnap(playerPos, texelOffset);
viewPos = TexelSnap(viewPos, texelOffset);
nViewPos = TexelSnap(nViewPos, texelOffset);
lViewPos = TexelSnap(lViewPos, texelOffset);
fresnel = TexelSnap(fresnel, texelOffset);
#endif
#if defined GBUFFERS_WATER && WATER_STYLE == 1 && defined GENERATED_NORMALS
normalMR = normalize(mix(geoNormal, normalM, 0.05));
#endif
vec3 nViewPosR = normalize(reflect(nViewPos, normalMR));
float RVdotU = dot(nViewPosR, upVec);
float RVdotS = dot(nViewPosR, sunVec);
vec3 worldRefDir = 0.5 * far * (mat3(gbufferModelViewInverse) * nViewPosR);
#if defined GBUFFERS_WATER && WATER_STYLE >= 2
normalMR = normalize(mix(geoNormal, normalM, 0.8));
#endif
// ============================== End of Step 1 ============================== //
// ============================== Step 2: Calculate Terrain Reflection and Alpha ============================== //
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined COMPOSITE && WATER_REFLECT_QUALITY >= 1
// In COMPOSITE for translucents we just need to return WSR and that's it
if (z0 != z1) {
/*vec4 reflection;
AddBackgroundReflection(reflection, color, playerPos, normalM, normalMR, viewPos, nViewPos, nViewPosR,
shadowMult, RVdotU, RVdotS, z0, dither, skyLightFactor, smoothness, highlightMult);
return reflection;*/
vec4 reflection = getWSR(playerPos, normalMR, nViewPosR, RVdotU, RVdotS, z0, dither);
refDist = length(playerPos - wsrHitPos);
return reflection;
}
#endif
vec4 reflection = vec4(0.0);
vec3 refPos = vec3(0.0);
vec3 reflectionColor = vec3(0.0);
#if (defined COMPOSITE || WATER_REFLECT_QUALITY >= 1) && (WORLD_SPACE_REFLECTIONS_INTERNAL == -1 || WORLD_SPACE_REF_MODE == 2)
#if defined COMPOSITE || WATER_REFLECT_QUALITY >= 2 && !defined DH_WATER
// Method 1: Ray Marched Reflection //
// Ray Marching
vec3 start = viewPos + normalMR * (lViewPos * 0.025 * (1.0 - fresnel) + 0.05);
#if defined GBUFFERS_WATER && WATER_STYLE >= 2
vec3 vector = normalize(reflect(nViewPos, normalMR)); // Not using nViewPosR because normalMR changed
#else
vec3 vector = nViewPosR;
#endif
//vector = normalize(vector - 0.5 * (1.0 - smoothness) * (1.0 - fresnel) * normalMR); // reflection anisotropy test
//vector = normalize(vector - 0.075 * dither * (1.0 - pow2(pow2(fresnel))) * normalMR);
vector *= 0.5;
vec3 vectorBase = vector;
vec3 viewPosRT = viewPos + vector;
vec3 tvector = vector;
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
int sampleCount = 30;
int refinementCount = 6;
#else
int sampleCount = 38;
int refinementCount = 10;
#endif
int sr = 0;
float dist = 0.0;
vec3 rfragpos = vec3(0.0);
float err = 9999999.0;
for (int i = 0; i < sampleCount; i++) {
refPos = nvec3(gbufferProjection * vec4(viewPosRT, 1.0)) * 0.5 + 0.5;
if (abs(refPos.x - 0.5) > rEdge.x || abs(refPos.y - 0.5) > rEdge.y) break;
rfragpos = vec3(refPos.xy, texture2D(depthtex, refPos.xy).r);
rfragpos = nvec3(gbufferProjectionInverse * vec4(rfragpos * 2.0 - 1.0, 1.0));
dist = length(start - rfragpos);
err = length(viewPosRT - rfragpos);
if (err * 0.33333 < length(vector)) {
sr++;
if (sr >= refinementCount) break;
tvector -= vector;
vector *= 0.1;
}
vector *= 2.0;
tvector += vector * (0.95 + 0.1 * dither);
viewPosRT = start + tvector;
}
float lViewPosRT = length(rfragpos);
// Finalizing Terrain Reflection and Alpha
if (
refPos.z < 0.99997
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && COLORED_LIGHTING_INTERNAL >= 256
&& (err < 2.0 + pow2(lViewPosRT) * 0.001 || lViewPosRT > 0.25 * COLORED_LIGHTING_INTERNAL)
#endif
) {
vec2 absPos = abs(refPos.xy - 0.5);
vec2 cdist = absPos / rEdge;
float border = clamp(1.0 - pow(max(cdist.x, cdist.y), 50.0), 0.0, 1.0);
reflection.a = border;
if (reflection.a > 0.001) {
vec2 edgeFactor = pow2(pow2(pow2(cdist)));
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
refPos.y += (dither - 0.5) * (0.05 * (edgeFactor.x + edgeFactor.y));
#endif
#ifdef GBUFFERS_WATER
reflection = texture2D(gaux2, refPos.xy);
reflection.rgb = pow2(reflection.rgb * 2.0);
#else
float smoothnessDM = pow2(smoothness);
float lodFactor = 1.0 - exp(-0.125 * (1.0 - smoothnessDM) * dist);
float lod = log2(viewHeight / 8.0 * (1.0 - smoothnessDM) * lodFactor) * 0.45;
if (z0 <= 0.56) lod *= 2.22; // Using more lod to compensate for less roughness noise on held items
lod = max(lod - 1.0, 0.0);
reflection.rgb = texture2DLod(colortex0, refPos.xy, lod).rgb;
reflectionColor = reflection.rgb;
#endif
float skyFade = 0.0;
#ifdef GBUFFERS_WATER
float reflectionPrevAlpha = reflection.a;
DoFog(reflection, skyFade, lViewPosRT, ViewToPlayer(rfragpos.xyz), RVdotU, RVdotS, dither, true, lViewPos);
reflection.a = reflectionPrevAlpha;
//reflection.a *= 1.0 - skyFade;
#endif
edgeFactor.x = pow2(edgeFactor.x);
edgeFactor = 1.0 - edgeFactor;
float refFactor = pow(edgeFactor.x * edgeFactor.y, 2.0 + 3.0 * GetLuminance(reflection.rgb));
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0 && defined GBUFFERS_WATER
refFactor = min(refFactor, 0.1) * 10.0;
#endif
reflection.a *= refFactor;
refDist = dist;
}
float posDif = lViewPosRT - lViewPos;
reflection.a *= clamp(posDif + 3.0, 0.0, 1.0);
}
#if !defined COMPOSITE && defined DISTANT_HORIZONS
else
#endif
#endif
#if !defined COMPOSITE && (WATER_REFLECT_QUALITY < 2 || defined DISTANT_HORIZONS) || defined DH_WATER
{ // Method 2: Mirorred Image Reflection //
#if WATER_REFLECT_QUALITY < 2 && !defined DISTANT_HORIZONS
float verticalStretch = 0.013; // for potato quality reflections
#else
float verticalStretch = 0.0025; // for distant horizons reflections
#endif
vec4 clipPosR = gbufferProjection * vec4(nViewPosR + verticalStretch * viewPos, 1.0);
vec3 screenPosR = clipPosR.xyz / clipPosR.w * 0.5 + 0.5;
vec2 screenPosRM = abs(screenPosR.xy - 0.5);
if (screenPosRM.x < rEdge.x && screenPosRM.y < rEdge.y) {
vec2 edgeFactor = pow2(pow2(pow2(screenPosRM / rEdge)));
screenPosR.y += (dither - 0.5) * (0.03 * (edgeFactor.x + edgeFactor.y) + 0.004);
float z1R = texture2D(depthtex1, screenPosR.xy).x;
screenPosR.z = z1R;
vec3 viewPosR = ScreenToView(screenPosR);
float lViewPosR = length(viewPosR);
#ifdef DISTANT_HORIZONS
float z1RDH = texture2D(dhDepthTex, screenPosR.xy).x;
vec4 screenPos1DH = vec4(screenPosR.xy, z1RDH, 1.0);
vec4 viewPos1DH = dhProjectionInverse * (screenPos1DH * 2.0 - 1.0);
viewPos1DH /= viewPos1DH.w;
lViewPosR = min(lViewPosR, length(viewPos1DH.xyz));
z1R = min(z1R, z1RDH);
#endif
if (z1R < 0.9997 && lViewPos <= 2.0 + lViewPosR) {
reflection.rgb = texture2D(gaux2, screenPosR.xy).rgb;
reflection.rgb = pow2(reflection.rgb * 2.0);
edgeFactor = 1.0 - edgeFactor;
reflection.a = edgeFactor.x * pow2(edgeFactor.y);
reflection.a *= clamp01((dot(nViewPos, nViewPosR) - 0.45) * 10.0); // Fixes perpendicular ref bug
#ifdef BORDER_FOG
float fog = lViewPosR / renderDistance;
fog = pow2(pow2(fog));
#ifndef DISTANT_HORIZONS
fog = pow2(pow2(fog));
#endif
reflection.a *= exp(-3.0 * fog);
#endif
}
}
}
#endif
#endif
// ============================== End of Step 2 ============================== //
// ============================== Step 3: Add Sky or WSR Reflection ============================== //
#if defined COMPOSITE || WATER_REFLECT_QUALITY >= 1
if (reflection.a < 1.0)
#endif
{
AddBackgroundReflection(reflection, color, playerPos, normalM, normalMR, viewPos, nViewPos, nViewPosR,
shadowMult, RVdotU, RVdotS, z0, dither, skyLightFactor, smoothness, highlightMult);
}
// ============================== End of Step 3 ============================== //
#if (defined COMPOSITE || (WATER_REFLECT_QUALITY >= 2 && defined SKY_EFFECT_REFLECTION)) && (END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0)
reflection.rgb += EndCrystalVortices(playerPos, worldRefDir, dither).rgb;
#endif
#if (defined COMPOSITE || (WATER_REFLECT_QUALITY >= 2 && defined SKY_EFFECT_REFLECTION)) && defined END_PORTAL_BEAM_INTERNAL && !defined DH_WATER
vec4 refPosPlayer = gbufferModelViewInverse * (gbufferProjectionInverse * vec4(refPos * 2.0 - 1.0, 1.0));
refPosPlayer /= refPosPlayer.w;
reflection.rgb += sqrt(GetEndPortalBeam(playerPos, refPosPlayer.xyz * reflection.a - playerPos).rgb);
#endif
#if (defined COMPOSITE || WATER_REFLECT_QUALITY >= 2) && (WORLD_SPACE_REFLECTIONS_INTERNAL == -1 || WORLD_SPACE_REF_MODE == 2) && defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900 && !defined DH_WATER
if (reflection.a < 1.0) {
float attentuation = doEndCenterFog(playerPos + cameraPositionBest, worldRefDir.xyz, length(viewPosRT - start), 0.07);
vec3 pointLightFog = vec3(END_CENTER_LIGHTING_R, END_CENTER_LIGHTING_G + 0.05, END_CENTER_LIGHTING_B) * 0.355 * END_CENTER_LIGHTING * attentuation * enderDragonDead;
reflection.rgb += sqrt(clamp01(pointLightFog - reflectionColor));
}
#endif
return reflection;
}
@@ -1,43 +1,43 @@
float GetApproxDistance(float depth) {
return near * far / (far - depth * far);
}
vec2 DoRefraction(inout vec3 color, inout float z0, inout float z1, vec3 viewPos, float lViewPos) {
// Prep
if (int(texelFetch(colortex6, texelCoord, 0).g * 255.1) != 241) return texCoord.xy;
float fovScale = gbufferProjection[1][1];
vec3 playerPos = ViewToPlayer(viewPos.xyz);
vec3 worldPos = playerPos.xyz + cameraPosition.xyz;
vec2 worldPosRM = worldPos.xz * 0.02 + worldPos.y * 0.01 + 0.01 * frameTimeCounter;
vec2 refractNoise = texture2DLod(noisetex, worldPosRM, 0.0).rb - vec2(0.5);
refractNoise *= WATER_REFRACTION_INTENSITY * fovScale / (3.0 + lViewPos);
#if WATER_STYLE < 3
refractNoise *= 0.015;
#else
refractNoise *= 0.02;
#endif
// Check
float approxDif = GetApproxDistance(z1) - GetApproxDistance(z0);
refractNoise *= clamp(approxDif, 0.0, 1.0);
vec2 refractCoord = texCoord.xy + refractNoise;
if (int(texture2D(colortex6, refractCoord).g * 255.1) != 241) return texCoord.xy;
float z0check = texture2D(depthtex0, refractCoord).r;
float z1check = texture2D(depthtex1, refractCoord).r;
float approxDifCheck = GetApproxDistance(z1check) - GetApproxDistance(z0check);
refractNoise *= clamp(approxDifCheck, 0.0, 1.0);
// Sample
refractCoord = texCoord.xy + refractNoise;
color = texture2D(colortex0, refractCoord).rgb;
z0 = texture2D(depthtex0, refractCoord).r;
z1 = texture2D(depthtex1, refractCoord).r;
return refractCoord;
}
float GetApproxDistance(float depth) {
return near * far / (far - depth * far);
}
vec2 DoRefraction(inout vec3 color, inout float z0, inout float z1, vec3 viewPos, float lViewPos) {
// Prep
if (int(texelFetch(colortex6, texelCoord, 0).g * 255.1) != 241) return texCoord.xy;
float fovScale = gbufferProjection[1][1];
vec3 playerPos = ViewToPlayer(viewPos.xyz);
vec3 worldPos = playerPos.xyz + cameraPosition.xyz;
vec2 worldPosRM = worldPos.xz * 0.02 + worldPos.y * 0.01 + 0.01 * frameTimeCounter;
vec2 refractNoise = texture2DLod(noisetex, worldPosRM, 0.0).rb - vec2(0.5);
refractNoise *= WATER_REFRACTION_INTENSITY * fovScale / (3.0 + lViewPos);
#if WATER_STYLE < 3
refractNoise *= 0.015;
#else
refractNoise *= 0.02;
#endif
// Check
float approxDif = GetApproxDistance(z1) - GetApproxDistance(z0);
refractNoise *= clamp(approxDif, 0.0, 1.0);
vec2 refractCoord = texCoord.xy + refractNoise;
if (int(texture2D(colortex6, refractCoord).g * 255.1) != 241) return texCoord.xy;
float z0check = texture2D(depthtex0, refractCoord).r;
float z1check = texture2D(depthtex1, refractCoord).r;
float approxDifCheck = GetApproxDistance(z1check) - GetApproxDistance(z0check);
refractNoise *= clamp(approxDifCheck, 0.0, 1.0);
// Sample
refractCoord = texCoord.xy + refractNoise;
color = texture2D(colortex0, refractCoord).rgb;
z0 = texture2D(depthtex0, refractCoord).r;
z1 = texture2D(depthtex1, refractCoord).r;
return refractCoord;
}
@@ -1,19 +1,19 @@
const float packSizeSW = 16.0;
void DoSnowyWorld(inout vec4 color, inout float smoothnessG, inout float highlightMult, inout float smoothnessD, inout float emission,
vec3 playerPos, vec2 lmCoord, float snowFactor, float snowMinNdotU, float NdotU, int subsurfaceMode) {
float snowFactorM = snowFactor * 1000.0 * max(NdotU - 0.9, snowMinNdotU) * max0(lmCoord.y - 0.9) * (0.9 - clamp(lmCoord.x, 0.8, 0.9));
if (snowFactorM <= 0.0001) return;
vec3 worldPos = playerPos + cameraPosition;
vec2 noiseCoord = floor(packSizeSW * worldPos.xz + 0.001) / packSizeSW;
noiseCoord += floor(packSizeSW * worldPos.y + 0.001) / packSizeSW;
float noiseTexture = dot(vec2(0.25, 0.75), texture2DLod(noisetex, noiseCoord * 0.45, 0.0).rg);
vec3 snowColor = mix(vec3(0.65, 0.8, 0.85), vec3(1.0, 1.0, 1.0), noiseTexture * 0.75 + 0.125);
color.rgb = mix(color.rgb, snowColor + color.rgb * emission * 0.2, snowFactorM);
smoothnessG = mix(smoothnessG, 0.25 + 0.25 * noiseTexture, snowFactorM);
highlightMult = mix(highlightMult, 2.0 - subsurfaceMode * 0.666, snowFactorM);
smoothnessD = mix(smoothnessD, 0.0, snowFactorM);
emission *= 1.0 - snowFactorM * 0.85;
}
const float packSizeSW = 16.0;
void DoSnowyWorld(inout vec4 color, inout float smoothnessG, inout float highlightMult, inout float smoothnessD, inout float emission,
vec3 playerPos, vec2 lmCoord, float snowFactor, float snowMinNdotU, float NdotU, int subsurfaceMode) {
float snowFactorM = snowFactor * 1000.0 * max(NdotU - 0.9, snowMinNdotU) * max0(lmCoord.y - 0.9) * (0.9 - clamp(lmCoord.x, 0.8, 0.9));
if (snowFactorM <= 0.0001) return;
vec3 worldPos = playerPos + cameraPosition;
vec2 noiseCoord = floor(packSizeSW * worldPos.xz + 0.001) / packSizeSW;
noiseCoord += floor(packSizeSW * worldPos.y + 0.001) / packSizeSW;
float noiseTexture = dot(vec2(0.25, 0.75), texture2DLod(noisetex, noiseCoord * 0.45, 0.0).rg);
vec3 snowColor = mix(vec3(0.65, 0.8, 0.85), vec3(1.0, 1.0, 1.0), noiseTexture * 0.75 + 0.125);
color.rgb = mix(color.rgb, snowColor + color.rgb * emission * 0.2, snowFactorM);
smoothnessG = mix(smoothnessG, 0.25 + 0.25 * noiseTexture, snowFactorM);
highlightMult = mix(highlightMult, 2.0 - subsurfaceMode * 0.666, snowFactorM);
smoothnessD = mix(smoothnessD, 0.0, snowFactorM);
emission *= 1.0 - snowFactorM * 0.85;
}
@@ -1,149 +1,149 @@
float random (in float x) { return fract(sin(x)*1e4);}
float random (in vec2 st) {return fract(sin(dot(st.xy, vec2(12.9898,78.233)))* 43758.5453123);}
vec2 random2( vec2 p ) {
return fract(sin(vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3))))*43758.5453);
}
vec4 hash4( vec2 p ) { return fract(sin(vec4( 1.0+dot(p,vec2(37.0,17.0)),
2.0+dot(p,vec2(11.0,47.0)),
3.0+dot(p,vec2(41.0,29.0)),
4.0+dot(p,vec2(23.0,31.0))))*103.0); }
vec4 textureNoTile( sampler2D samp, in vec2 uv )
{
vec2 iuv = floor( uv );
vec2 fuv = fract( uv );
// #ifdef USEHASH
// // generate per-tile transform (needs GL_NEAREST_MIPMAP_LINEARto work right)
// vec4 ofa = texture( samp, (iuv + vec2(0.5,0.5))/256.0 );
// vec4 ofb = texture( samp, (iuv + vec2(1.5,0.5))/256.0 );
// vec4 ofc = texture( samp, (iuv + vec2(0.5,1.5))/256.0 );
// vec4 ofd = texture( samp, (iuv + vec2(1.5,1.5))/256.0 );
// #else
// generate per-tile transform
vec4 ofa = hash4( iuv + vec2(0.0,0.0) );
vec4 ofb = hash4( iuv + vec2(1.0,0.0) );
vec4 ofc = hash4( iuv + vec2(0.0,1.0) );
vec4 ofd = hash4( iuv + vec2(1.0,1.0) );
//#endif
vec2 ddx = dFdx( uv );
vec2 ddy = dFdy( uv );
// transform per-tile uvs
ofa.zw = sign(ofa.zw-0.5);
ofb.zw = sign(ofb.zw-0.5);
ofc.zw = sign(ofc.zw-0.5);
ofd.zw = sign(ofd.zw-0.5);
// uv's, and derivarives (for correct mipmapping)
vec2 uva = uv*ofa.zw + ofa.xy; vec2 ddxa = ddx*ofa.zw; vec2 ddya = ddy*ofa.zw;
vec2 uvb = uv*ofb.zw + ofb.xy; vec2 ddxb = ddx*ofb.zw; vec2 ddyb = ddy*ofb.zw;
vec2 uvc = uv*ofc.zw + ofc.xy; vec2 ddxc = ddx*ofc.zw; vec2 ddyc = ddy*ofc.zw;
vec2 uvd = uv*ofd.zw + ofd.xy; vec2 ddxd = ddx*ofd.zw; vec2 ddyd = ddy*ofd.zw;
// fetch and blend
vec2 b = smoothstep(0.25,0.75,fuv);
return mix( mix( textureGrad( samp, uva, ddxa, ddya ),
textureGrad( samp, uvb, ddxb, ddyb ), b.x ),
mix( textureGrad( samp, uvc, ddxc, ddyc ),
textureGrad( samp, uvd, ddxd, ddyd ), b.x), b.y );
}
vec3 voronoi( in vec2 x, float rnd ) {
vec2 n = floor(x);
vec2 f = fract(x);
// first pass: regular voronoi
vec2 mg, mr;
float md = 8.0;
for (int j=-1; j<=1; j++ ) {
for (int i=-1; i<=1; i++ ) {
vec2 g = vec2(float(i),float(j));
vec2 o = random2( n + g )*rnd;
o = 0.5 + 0.5*sin( frameTimeCounter + 6.2831*o );
vec2 r = g + o - f;
float d = dot(r,r);
if( d<md ) {
md = d;
mr = r;
mg = g;
}
}
}
// second pass: distance to borders
md = 8.0;
for (int j=-2; j<=2; j++ ) {
for (int i=-2; i<=2; i++ ) {
vec2 g = mg + vec2(float(i),float(j));
vec2 o = random2(n + g)*rnd;
o = 0.5 + 0.5*sin( frameTimeCounter + 6.2831*o );
vec2 r = g + o - f;
if( dot(mr-r,mr-r)>0.00001 )
md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) );
}
}
return vec3( md, mr );
}
vec3 waterMaskFunc(vec3 worldPos, const float water_scroll_speed, vec3 waterColor, int mat, vec3 normal) {
const float foam_speed = 0.05;
const float water_warp = 0.005;
vec3 water_color = vec3(0);
if (mat == 10049) { // Water Cauldron
water_color = saturateColors(waterColor, 0.3) * 0.7;
} else {
water_color = mix(waterColor * 0.4, vec3(0.22, 0.22, 0.22), 0.5);
}
//pixelated coord to created pixelated visual
vec3 uv = worldPos;
uv = (uv-.5)*.25+.5;
float pixelWaterSize = 16;
uv = floor(uv * (pixelWaterSize * 4)) / (pixelWaterSize * 4);
float d = dot(uv.xz-0.5,uv.xz-0.5);
vec3 c = voronoi(5.0*uv.xz, pow(d,.6) );
vec2 water_pos = vec2(frameTimeCounter) * water_scroll_speed;
vec3 foamNoise = textureNoTile(noisetex, uv.xz + vec2(frameTimeCounter) * foam_speed).xyz;
vec3 result = vec3(0.0);
// borders
vec3 waterMask = mix(vec3(1.00), vec3(0.0), smoothstep( 0.04, 0.06, c.x ));
vec3 foam = waterMask * vec3(foamNoise.y - 0.55);
foam = clamp(foam, vec3(0.02), vec3(1.0));
foam *= 1.3;
//not regular structure water
float water_sample = floor(texture2DLod(noisetex, uv.xz * 0.25 + foamNoise.xz * water_warp + water_pos, 0.0).r * 16) / 16;
vec3 water = mix(water_color, vec3(0.001), water_sample * float(foam));
// small particles in water
// Grid
vec2 st = uv.xz;
st *= vec2(100.0,100.);
vec2 ipos = floor(st); // integer
vec2 vel = vec2(frameTimeCounter); // time
vel *= vec2(-1.,0.); // direction
vel *= (step(1.0, mod(ipos.y,5.024))-0.5)*2.; // Oposite directions
vel *= vec2(-1.,0.); // direction
vel *= random(ipos.y); // random speed
//Creating particles
vec3 pixelParticle = vec3(1.0);
pixelParticle *= random(floor(vec2(st.x*0.32, st.y)+vel));
float mixFactor = clamp((sin(frameTimeCounter*0.1) + 1.0)*0.5, 0.005, 0.15);
pixelParticle = smoothstep(0.0,mixFactor,pixelParticle);
pixelParticle = (1.0 - pixelParticle) * (foamNoise.y - 0.55);
pixelParticle = clamp(pixelParticle, vec3(0.02), vec3(1.0));
result = foam * 2.0 + pixelParticle * 2.0 + water;
//result = vec3(foamNoise.y - 0.55);
return result;
}
float random (in float x) { return fract(sin(x)*1e4);}
float random (in vec2 st) {return fract(sin(dot(st.xy, vec2(12.9898,78.233)))* 43758.5453123);}
vec2 random2( vec2 p ) {
return fract(sin(vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3))))*43758.5453);
}
vec4 hash4( vec2 p ) { return fract(sin(vec4( 1.0+dot(p,vec2(37.0,17.0)),
2.0+dot(p,vec2(11.0,47.0)),
3.0+dot(p,vec2(41.0,29.0)),
4.0+dot(p,vec2(23.0,31.0))))*103.0); }
vec4 textureNoTile( sampler2D samp, in vec2 uv )
{
vec2 iuv = floor( uv );
vec2 fuv = fract( uv );
// #ifdef USEHASH
// // generate per-tile transform (needs GL_NEAREST_MIPMAP_LINEARto work right)
// vec4 ofa = texture( samp, (iuv + vec2(0.5,0.5))/256.0 );
// vec4 ofb = texture( samp, (iuv + vec2(1.5,0.5))/256.0 );
// vec4 ofc = texture( samp, (iuv + vec2(0.5,1.5))/256.0 );
// vec4 ofd = texture( samp, (iuv + vec2(1.5,1.5))/256.0 );
// #else
// generate per-tile transform
vec4 ofa = hash4( iuv + vec2(0.0,0.0) );
vec4 ofb = hash4( iuv + vec2(1.0,0.0) );
vec4 ofc = hash4( iuv + vec2(0.0,1.0) );
vec4 ofd = hash4( iuv + vec2(1.0,1.0) );
//#endif
vec2 ddx = dFdx( uv );
vec2 ddy = dFdy( uv );
// transform per-tile uvs
ofa.zw = sign(ofa.zw-0.5);
ofb.zw = sign(ofb.zw-0.5);
ofc.zw = sign(ofc.zw-0.5);
ofd.zw = sign(ofd.zw-0.5);
// uv's, and derivarives (for correct mipmapping)
vec2 uva = uv*ofa.zw + ofa.xy; vec2 ddxa = ddx*ofa.zw; vec2 ddya = ddy*ofa.zw;
vec2 uvb = uv*ofb.zw + ofb.xy; vec2 ddxb = ddx*ofb.zw; vec2 ddyb = ddy*ofb.zw;
vec2 uvc = uv*ofc.zw + ofc.xy; vec2 ddxc = ddx*ofc.zw; vec2 ddyc = ddy*ofc.zw;
vec2 uvd = uv*ofd.zw + ofd.xy; vec2 ddxd = ddx*ofd.zw; vec2 ddyd = ddy*ofd.zw;
// fetch and blend
vec2 b = smoothstep(0.25,0.75,fuv);
return mix( mix( textureGrad( samp, uva, ddxa, ddya ),
textureGrad( samp, uvb, ddxb, ddyb ), b.x ),
mix( textureGrad( samp, uvc, ddxc, ddyc ),
textureGrad( samp, uvd, ddxd, ddyd ), b.x), b.y );
}
vec3 voronoi( in vec2 x, float rnd ) {
vec2 n = floor(x);
vec2 f = fract(x);
// first pass: regular voronoi
vec2 mg, mr;
float md = 8.0;
for (int j=-1; j<=1; j++ ) {
for (int i=-1; i<=1; i++ ) {
vec2 g = vec2(float(i),float(j));
vec2 o = random2( n + g )*rnd;
o = 0.5 + 0.5*sin( frameTimeCounter + 6.2831*o );
vec2 r = g + o - f;
float d = dot(r,r);
if( d<md ) {
md = d;
mr = r;
mg = g;
}
}
}
// second pass: distance to borders
md = 8.0;
for (int j=-2; j<=2; j++ ) {
for (int i=-2; i<=2; i++ ) {
vec2 g = mg + vec2(float(i),float(j));
vec2 o = random2(n + g)*rnd;
o = 0.5 + 0.5*sin( frameTimeCounter + 6.2831*o );
vec2 r = g + o - f;
if( dot(mr-r,mr-r)>0.00001 )
md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) );
}
}
return vec3( md, mr );
}
vec3 waterMaskFunc(vec3 worldPos, const float water_scroll_speed, vec3 waterColor, int mat, vec3 normal) {
const float foam_speed = 0.05;
const float water_warp = 0.005;
vec3 water_color = vec3(0);
if (mat == 10049) { // Water Cauldron
water_color = saturateColors(waterColor, 0.3) * 0.7;
} else {
water_color = mix(waterColor * 0.4, vec3(0.22, 0.22, 0.22), 0.5);
}
//pixelated coord to created pixelated visual
vec3 uv = worldPos;
uv = (uv-.5)*.25+.5;
float pixelWaterSize = 16;
uv = floor(uv * (pixelWaterSize * 4)) / (pixelWaterSize * 4);
float d = dot(uv.xz-0.5,uv.xz-0.5);
vec3 c = voronoi(5.0*uv.xz, pow(d,.6) );
vec2 water_pos = vec2(frameTimeCounter) * water_scroll_speed;
vec3 foamNoise = textureNoTile(noisetex, uv.xz + vec2(frameTimeCounter) * foam_speed).xyz;
vec3 result = vec3(0.0);
// borders
vec3 waterMask = mix(vec3(1.00), vec3(0.0), smoothstep( 0.04, 0.06, c.x ));
vec3 foam = waterMask * vec3(foamNoise.y - 0.55);
foam = clamp(foam, vec3(0.02), vec3(1.0));
foam *= 1.3;
//not regular structure water
float water_sample = floor(texture2DLod(noisetex, uv.xz * 0.25 + foamNoise.xz * water_warp + water_pos, 0.0).r * 16) / 16;
vec3 water = mix(water_color, vec3(0.001), water_sample * float(foam));
// small particles in water
// Grid
vec2 st = uv.xz;
st *= vec2(100.0,100.);
vec2 ipos = floor(st); // integer
vec2 vel = vec2(frameTimeCounter); // time
vel *= vec2(-1.,0.); // direction
vel *= (step(1.0, mod(ipos.y,5.024))-0.5)*2.; // Oposite directions
vel *= vec2(-1.,0.); // direction
vel *= random(ipos.y); // random speed
//Creating particles
vec3 pixelParticle = vec3(1.0);
pixelParticle *= random(floor(vec2(st.x*0.32, st.y)+vel));
float mixFactor = clamp((sin(frameTimeCounter*0.1) + 1.0)*0.5, 0.005, 0.15);
pixelParticle = smoothstep(0.0,mixFactor,pixelParticle);
pixelParticle = (1.0 - pixelParticle) * (foamNoise.y - 0.55);
pixelParticle = clamp(pixelParticle, vec3(0.02), vec3(1.0));
result = foam * 2.0 + pixelParticle * 2.0 + water;
//result = vec3(foamNoise.y - 0.55);
return result;
}
@@ -1,243 +1,243 @@
#include "/lib/shaderSettings/wavingBlocks.glsl"
#if COLORED_LIGHTING_INTERNAL > 0
#include "/lib/voxelization/lightVoxelization.glsl"
#endif
vec3 GetRawWave(in vec3 pos, float wind) {
float magnitude = sin(wind * 0.0027 + pos.x + pos.y) * 0.04 + 0.04;
float d0 = sin(wind * 0.0127);
float d1 = sin(wind * 0.0089);
float d2 = sin(wind * 0.0114);
vec3 wave;
wave.x = magnitude * sin(wind*0.0224 + d1 + d2 + pos.x - pos.z + pos.y);
wave.y = magnitude * sin(wind*0.0015 + d2 + d0 + pos.x);
wave.z = magnitude * sin(wind*0.0063 + d0 + d1 - pos.x + pos.z + pos.y);
return wave;
}
vec3 GetWave(in vec3 pos, float waveSpeed) {
float wind = frameTimeCounter * waveSpeed * WAVING_SPEED;
vec3 wave = GetRawWave(pos, wind);
#define WAVING_I_RAIN_MULT_M WAVING_I_RAIN_MULT * 0.01
#if WAVING_I_RAIN_MULT > 100
float windRain = frameTimeCounter * waveSpeed * WAVING_I_RAIN_MULT_M * WAVING_SPEED;
vec3 waveRain = GetRawWave(pos, windRain);
wave = mix(wave, waveRain, rainFactor);
#endif
float wavingIntensity = WAVING_I * mix(1.0, WAVING_I_RAIN_MULT_M, rainFactor);
return wave * wavingIntensity;
}
void DoWave_Foliage(inout vec3 playerPos, vec3 worldPos, float waveMult) {
worldPos.y *= 0.5;
vec3 wave = GetWave(worldPos, 170.0);
wave.x = wave.x * 3.0;
wave.y = 0.0;
wave.z = wave.z * 8.0 + wave.y * 4.0;
#ifdef NO_WAVING_INDOORS
#ifndef WAVE_EVERYTHING
wave *= clamp(lmCoord.y - 0.87, 0.0, 0.1);
#else
wave *= 0.1;
#endif
#else
wave *= 0.1;
#endif
playerPos.xyz += wave * waveMult;
}
void DoWave_Leaves(inout vec3 playerPos, vec3 worldPos, float waveMult) {
worldPos *= vec3(0.75, 0.375, 0.75);
vec3 wave = GetWave(worldPos, 170.0);
wave *= vec3(4.0, 3.0, 8.0);
wave *= 1.0 - inSnowy; // Leaves with snow on top look wrong
#if defined NO_WAVING_INDOORS && !defined WAVE_EVERYTHING
wave *= clamp(lmCoord.y - 0.87, 0.0, 0.1);
#else
wave *= 0.1;
#endif
playerPos.xyz += wave * waveMult;
}
void DoWave_Water(inout vec3 playerPos, vec3 worldPos) {
float waterWaveTime = frameTimeCounter * 6.0 * WAVING_SPEED;
worldPos.xz *= 14.0;
float wave = sin(waterWaveTime * 0.7 - worldPos.z * 0.14 + worldPos.x * 0.07);
wave += sin(waterWaveTime * 0.5 - worldPos.z * 0.10 + worldPos.x * 0.05);
#if defined NO_WAVING_INDOORS && !defined WAVE_EVERYTHING
wave *= clamp(lmCoord.y - 0.87, 0.0, 0.1);
#else
wave *= 0.1;
#endif
playerPos.y += wave * 0.125 - 0.05;
#if defined GBUFFERS_WATER && WATER_STYLE == 1
normal = mix(normal, tangent, wave * 0.01);
#endif
}
void DoWave_Lava(inout vec3 playerPos, vec3 worldPos) {
if (fract(worldPos.y + 0.005) > 0.06) {
float lavaWaveTime = frameTimeCounter * 3.0 * WAVING_SPEED;
worldPos.xz *= 14.0;
float wave = sin(lavaWaveTime * 0.7 - worldPos.z * 0.14 + worldPos.x * 0.07);
wave += sin(lavaWaveTime * 0.5 - worldPos.z * 0.05 + worldPos.x * 0.10);
#if defined NETHER && defined WAVIER_LAVA
if (worldPos.y > 30 && worldPos.y < 32) wave *= 4.5;
else wave *= 2.0;
#endif
playerPos.y += wave * 0.0125;
}
}
void DoWave(inout vec3 playerPos, int mat) {
vec3 worldPos = playerPos.xyz + cameraPosition.xyz;
#if defined GBUFFERS_TERRAIN || defined SHADOW
#ifdef WAVING_FOLIAGE
if (mat == 10003 || mat == 10005 || mat == 10029 || mat == 10025 // Grounded Foliage
#ifdef DO_MORE_FOLIAGE_WAVING
|| mat == 10769 // Torchflower
|| mat == 10976 // Open Eye Blossom
#endif
) {
if (gl_MultiTexCoord0.t < mc_midTexCoord.t || fract(worldPos.y + 0.21) > 0.26)
DoWave_Foliage(playerPos.xyz, worldPos, 1.0);
}
else if (mat == 10021 || mat == 10023 || mat == 10027) { // Upper Layer Foliage
DoWave_Foliage(playerPos.xyz, worldPos, 1.0);
}
#ifdef DO_MORE_FOLIAGE_WAVING
else if (mat == 10972) { // Firefly Bush
if (gl_MultiTexCoord0.t < mc_midTexCoord.t || fract(worldPos.y + 0.21) > 0.26) {
vec3 wave = GetWave(worldPos, 170.0);
wave.x = wave.x * 8.0 + wave.y * 4.0;
wave.y = 0.0;
wave.z = wave.z * 3.0;
playerPos.xyz += wave * 0.1 * eyeBrightnessM; // lmCoord.y is unreliable for firefly bushes
}
}
#endif
#if defined WAVING_LEAVES_ENABLED || defined WAVING_LAVA || defined WAVING_LILY_PAD
else
#endif
#endif
#ifdef WAVING_LEAVES_ENABLED
if (mat == 10007 || mat == 10009 || mat == 10011) { // Leaves
DoWave_Leaves(playerPos.xyz, worldPos, 1.0);
} else if (mat == 10013 || mat == 10923) { // Vine
// Reduced waving on vines to prevent clipping through blocks
DoWave_Leaves(playerPos.xyz, worldPos, 0.75);
}
#if defined NETHER || defined DO_NETHER_VINE_WAVING_OUTSIDE_NETHER
else if (mat == 10884 || mat == 10885) { // Weeping Vines, Twisting Vines
float waveMult = 1.0;
#if COLORED_LIGHTING_INTERNAL > 0
vec3 playerPosP = playerPos + vec3(0.0, 0.1, 0.0);
vec3 voxelPosP = SceneToVoxel(playerPosP);
vec3 playerPosN = playerPos - vec3(0.0, 0.1, 0.0);
vec3 voxelPosN = SceneToVoxel(playerPosN);
if (CheckInsideVoxelVolume(voxelPosP)) {
int voxelP = int(GetVoxelVolume(ivec3(voxelPosP)));
int voxelN = int(GetVoxelVolume(ivec3(voxelPosN)));
if (voxelP != 0 && voxelP != 65 || voxelN != 0 && voxelN != 65) // not air, not weeping vines
waveMult = 0.0;
}
#endif
DoWave_Foliage(playerPos.xyz, worldPos, waveMult);
}
#endif
#ifdef WAVING_SUGAR_CANE
if (mat == 10039) { // Sugar Cane
float waveMult = 0.75;
#if COLORED_LIGHTING_INTERNAL > 0
vec3 voxelPosP = SceneToVoxel(playerPos - vec3(0.0, 0.1, 0.0));
if (CheckInsideVoxelVolume(voxelPosP)) {
int voxelP = int(texelFetch(voxel_sampler, ivec3(voxelPosP), 0).r);
if (voxelP != 0) // not air
waveMult = 0.0;
}
#endif
DoWave_Foliage(playerPos.xyz, worldPos, waveMult);
}
#endif
#if defined WAVING_LAVA || defined WAVING_LILY_PAD
else
#endif
#endif
#ifdef WAVING_LAVA
if (mat == 10068 || mat == 10070) { // Lava
DoWave_Lava(playerPos.xyz, worldPos);
#ifdef GBUFFERS_TERRAIN
// G8FL735 Fixes Optifine-Iris parity. Optifine has 0.9 gl_Color.rgb on a lot of versions
glColorRaw.rgb = min(glColorRaw.rgb, vec3(0.9));
#endif
}
#ifdef WAVING_LILY_PAD
else
#endif
#endif
#ifdef WAVING_LILY_PAD
if (mat == 10489) { // Lily Pad
DoWave_Water(playerPos.xyz, worldPos);
}
#endif
#endif
#if defined GBUFFERS_WATER || defined SHADOW || defined GBUFFERS_TERRAIN
#ifdef WAVING_WATER_VERTEX
#if defined WAVING_ANYTHING_TERRAIN && defined SHADOW
else
#endif
if (mat == 32000) { // Water
if (fract(worldPos.y + 0.005) > 0.06)
DoWave_Water(playerPos.xyz, worldPos);
}
#endif
#endif
}
void DoInteractiveWave(inout vec3 playerPos, int mat) {
float strength = 2.0;
if (mat == 10003 || mat == 10023 || mat == 10015) { // Flowers
strength = 1.0;
}
if (length(playerPos) < 2.0) playerPos.xz += playerPos.xz * max(5.0 / max(length(playerPos * vec3(8.0, 2.0, 8.0) - vec3(0.0, 2.0, 0.0)), 2.0) -0.625, 0.0) * clamp(2.0 / length(playerPos) - 1.0, 0.0, 1.0) * strength; // Emin's code from v4 + smooth transition by me
}
void DoWaveEverything(inout vec3 playerPos) {
vec3 worldPos = playerPos.xyz + cameraPosition.xyz;
DoWave_Leaves(playerPos.xyz, worldPos, 1.0);
DoWave_Foliage(playerPos.xyz, worldPos, 1.0);
}
#include "/lib/shaderSettings/wavingBlocks.glsl"
#if COLORED_LIGHTING_INTERNAL > 0
#include "/lib/voxelization/lightVoxelization.glsl"
#endif
vec3 GetRawWave(in vec3 pos, float wind) {
float magnitude = sin(wind * 0.0027 + pos.x + pos.y) * 0.04 + 0.04;
float d0 = sin(wind * 0.0127);
float d1 = sin(wind * 0.0089);
float d2 = sin(wind * 0.0114);
vec3 wave;
wave.x = magnitude * sin(wind*0.0224 + d1 + d2 + pos.x - pos.z + pos.y);
wave.y = magnitude * sin(wind*0.0015 + d2 + d0 + pos.x);
wave.z = magnitude * sin(wind*0.0063 + d0 + d1 - pos.x + pos.z + pos.y);
return wave;
}
vec3 GetWave(in vec3 pos, float waveSpeed) {
float wind = frameTimeCounter * waveSpeed * WAVING_SPEED;
vec3 wave = GetRawWave(pos, wind);
#define WAVING_I_RAIN_MULT_M WAVING_I_RAIN_MULT * 0.01
#if WAVING_I_RAIN_MULT > 100
float windRain = frameTimeCounter * waveSpeed * WAVING_I_RAIN_MULT_M * WAVING_SPEED;
vec3 waveRain = GetRawWave(pos, windRain);
wave = mix(wave, waveRain, rainFactor);
#endif
float wavingIntensity = WAVING_I * mix(1.0, WAVING_I_RAIN_MULT_M, rainFactor);
return wave * wavingIntensity;
}
void DoWave_Foliage(inout vec3 playerPos, vec3 worldPos, float waveMult) {
worldPos.y *= 0.5;
vec3 wave = GetWave(worldPos, 170.0);
wave.x = wave.x * 3.0;
wave.y = 0.0;
wave.z = wave.z * 8.0 + wave.y * 4.0;
#ifdef NO_WAVING_INDOORS
#ifndef WAVE_EVERYTHING
wave *= clamp(lmCoord.y - 0.87, 0.0, 0.1);
#else
wave *= 0.1;
#endif
#else
wave *= 0.1;
#endif
playerPos.xyz += wave * waveMult;
}
void DoWave_Leaves(inout vec3 playerPos, vec3 worldPos, float waveMult) {
worldPos *= vec3(0.75, 0.375, 0.75);
vec3 wave = GetWave(worldPos, 170.0);
wave *= vec3(4.0, 3.0, 8.0);
wave *= 1.0 - inSnowy; // Leaves with snow on top look wrong
#if defined NO_WAVING_INDOORS && !defined WAVE_EVERYTHING
wave *= clamp(lmCoord.y - 0.87, 0.0, 0.1);
#else
wave *= 0.1;
#endif
playerPos.xyz += wave * waveMult;
}
void DoWave_Water(inout vec3 playerPos, vec3 worldPos) {
float waterWaveTime = frameTimeCounter * 6.0 * WAVING_SPEED;
worldPos.xz *= 14.0;
float wave = sin(waterWaveTime * 0.7 - worldPos.z * 0.14 + worldPos.x * 0.07);
wave += sin(waterWaveTime * 0.5 - worldPos.z * 0.10 + worldPos.x * 0.05);
#if defined NO_WAVING_INDOORS && !defined WAVE_EVERYTHING
wave *= clamp(lmCoord.y - 0.87, 0.0, 0.1);
#else
wave *= 0.1;
#endif
playerPos.y += wave * 0.125 - 0.05;
#if defined GBUFFERS_WATER && WATER_STYLE == 1
normal = mix(normal, tangent, wave * 0.01);
#endif
}
void DoWave_Lava(inout vec3 playerPos, vec3 worldPos) {
if (fract(worldPos.y + 0.005) > 0.06) {
float lavaWaveTime = frameTimeCounter * 3.0 * WAVING_SPEED;
worldPos.xz *= 14.0;
float wave = sin(lavaWaveTime * 0.7 - worldPos.z * 0.14 + worldPos.x * 0.07);
wave += sin(lavaWaveTime * 0.5 - worldPos.z * 0.05 + worldPos.x * 0.10);
#if defined NETHER && defined WAVIER_LAVA
if (worldPos.y > 30 && worldPos.y < 32) wave *= 4.5;
else wave *= 2.0;
#endif
playerPos.y += wave * 0.0125;
}
}
void DoWave(inout vec3 playerPos, int mat) {
vec3 worldPos = playerPos.xyz + cameraPosition.xyz;
#if defined GBUFFERS_TERRAIN || defined SHADOW
#ifdef WAVING_FOLIAGE
if (mat == 10003 || mat == 10005 || mat == 10029 || mat == 10025 // Grounded Foliage
#ifdef DO_MORE_FOLIAGE_WAVING
|| mat == 10769 // Torchflower
|| mat == 10976 // Open Eye Blossom
#endif
) {
if (gl_MultiTexCoord0.t < mc_midTexCoord.t || fract(worldPos.y + 0.21) > 0.26)
DoWave_Foliage(playerPos.xyz, worldPos, 1.0);
}
else if (mat == 10021 || mat == 10023 || mat == 10027) { // Upper Layer Foliage
DoWave_Foliage(playerPos.xyz, worldPos, 1.0);
}
#ifdef DO_MORE_FOLIAGE_WAVING
else if (mat == 10972) { // Firefly Bush
if (gl_MultiTexCoord0.t < mc_midTexCoord.t || fract(worldPos.y + 0.21) > 0.26) {
vec3 wave = GetWave(worldPos, 170.0);
wave.x = wave.x * 8.0 + wave.y * 4.0;
wave.y = 0.0;
wave.z = wave.z * 3.0;
playerPos.xyz += wave * 0.1 * eyeBrightnessM; // lmCoord.y is unreliable for firefly bushes
}
}
#endif
#if defined WAVING_LEAVES_ENABLED || defined WAVING_LAVA || defined WAVING_LILY_PAD
else
#endif
#endif
#ifdef WAVING_LEAVES_ENABLED
if (mat == 10007 || mat == 10009 || mat == 10011) { // Leaves
DoWave_Leaves(playerPos.xyz, worldPos, 1.0);
} else if (mat == 10013 || mat == 10923) { // Vine
// Reduced waving on vines to prevent clipping through blocks
DoWave_Leaves(playerPos.xyz, worldPos, 0.75);
}
#if defined NETHER || defined DO_NETHER_VINE_WAVING_OUTSIDE_NETHER
else if (mat == 10884 || mat == 10885) { // Weeping Vines, Twisting Vines
float waveMult = 1.0;
#if COLORED_LIGHTING_INTERNAL > 0
vec3 playerPosP = playerPos + vec3(0.0, 0.1, 0.0);
vec3 voxelPosP = SceneToVoxel(playerPosP);
vec3 playerPosN = playerPos - vec3(0.0, 0.1, 0.0);
vec3 voxelPosN = SceneToVoxel(playerPosN);
if (CheckInsideVoxelVolume(voxelPosP)) {
int voxelP = int(GetVoxelVolume(ivec3(voxelPosP)));
int voxelN = int(GetVoxelVolume(ivec3(voxelPosN)));
if (voxelP != 0 && voxelP != 65 || voxelN != 0 && voxelN != 65) // not air, not weeping vines
waveMult = 0.0;
}
#endif
DoWave_Foliage(playerPos.xyz, worldPos, waveMult);
}
#endif
#ifdef WAVING_SUGAR_CANE
if (mat == 10039) { // Sugar Cane
float waveMult = 0.75;
#if COLORED_LIGHTING_INTERNAL > 0
vec3 voxelPosP = SceneToVoxel(playerPos - vec3(0.0, 0.1, 0.0));
if (CheckInsideVoxelVolume(voxelPosP)) {
int voxelP = int(texelFetch(voxel_sampler, ivec3(voxelPosP), 0).r);
if (voxelP != 0) // not air
waveMult = 0.0;
}
#endif
DoWave_Foliage(playerPos.xyz, worldPos, waveMult);
}
#endif
#if defined WAVING_LAVA || defined WAVING_LILY_PAD
else
#endif
#endif
#ifdef WAVING_LAVA
if (mat == 10068 || mat == 10070) { // Lava
DoWave_Lava(playerPos.xyz, worldPos);
#ifdef GBUFFERS_TERRAIN
// G8FL735 Fixes Optifine-Iris parity. Optifine has 0.9 gl_Color.rgb on a lot of versions
glColorRaw.rgb = min(glColorRaw.rgb, vec3(0.9));
#endif
}
#ifdef WAVING_LILY_PAD
else
#endif
#endif
#ifdef WAVING_LILY_PAD
if (mat == 10489) { // Lily Pad
DoWave_Water(playerPos.xyz, worldPos);
}
#endif
#endif
#if defined GBUFFERS_WATER || defined SHADOW || defined GBUFFERS_TERRAIN
#ifdef WAVING_WATER_VERTEX
#if defined WAVING_ANYTHING_TERRAIN && defined SHADOW
else
#endif
if (mat == 32000) { // Water
if (fract(worldPos.y + 0.005) > 0.06)
DoWave_Water(playerPos.xyz, worldPos);
}
#endif
#endif
}
void DoInteractiveWave(inout vec3 playerPos, int mat) {
float strength = 2.0;
if (mat == 10003 || mat == 10023 || mat == 10015) { // Flowers
strength = 1.0;
}
if (length(playerPos) < 2.0) playerPos.xz += playerPos.xz * max(5.0 / max(length(playerPos * vec3(8.0, 2.0, 8.0) - vec3(0.0, 2.0, 0.0)), 2.0) -0.625, 0.0) * clamp(2.0 / length(playerPos) - 1.0, 0.0, 1.0) * strength; // Emin's code from v4 + smooth transition by me
}
void DoWaveEverything(inout vec3 playerPos) {
vec3 worldPos = playerPos.xyz + cameraPosition.xyz;
DoWave_Leaves(playerPos.xyz, worldPos, 1.0);
DoWave_Foliage(playerPos.xyz, worldPos, 1.0);
}
@@ -1,390 +1,390 @@
#extension GL_ARB_shader_image_load_store : enable
#include "/lib/voxelization/reflectionVoxelization.glsl"
#include "/lib/lighting/minimumLighting.glsl"
#include "/lib/shaderSettings/mainLighting.glsl"
#if WORLD_SPACE_PLAYER_REF == 1
#include "/lib/materials/materialMethods/playerRayTracer.glsl"
#endif
#ifdef AURORA_INFLUENCE
#include "/lib/atmospherics/auroraBorealis.glsl"
#endif
#if defined OVERWORLD || defined END
#ifndef GBUFFERS_WATER
#include "/lib/lighting/shadowSampling.glsl"
#if defined DO_PIXELATION_EFFECTS && defined PIXELATED_SHADOWS
#include "/lib/misc/pixelation.glsl"
#endif
#endif
#if SHADOW_SMOOTHING == 4 || SHADOW_QUALITY == 0
const float offset = 0.00098;
#elif SHADOW_SMOOTHING == 3
const float offset = 0.00075;
#elif SHADOW_SMOOTHING == 2
const float offset = 0.0005;
#elif SHADOW_SMOOTHING == 1
const float offset = 0.0003;
#endif
#endif
#if HELD_LIGHTING_MODE >= 1
#include "/lib/lighting/heldLighting.glsl"
#endif
#ifdef CLOUD_SHADOWS
#include "/lib/lighting/cloudShadows.glsl"
#endif
#ifdef LIGHT_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_LIGHT
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
vec2 getLocalTexCoord(vec3 local, vec3 normal) {
vec3 absNormal = abs(normal);
return 1.0 - local.zy * absNormal.x - local.xz * absNormal.y - local.xy * absNormal.z;
}
float getVoxelSpaceAO(vec3 playerPos, ivec3 normal, vec2 localTexCoord) {
ivec3 voxelPos = ivec3(playerToSceneVoxel(playerPos + normal * 0.5));
ivec3 absNormal = ivec3(abs(normal));
ivec3 right = ivec3(0, 0, 1) * absNormal.x + ivec3(1, 0, 0) * absNormal.y + ivec3(1, 0, 0) * absNormal.z;
ivec3 up = ivec3(0, 1, 0) * absNormal.x + ivec3(0, 0, 1) * absNormal.y + ivec3(0, 1, 0) * absNormal.z;
vec2 centerFactorPos = sqrt1(2.0 * clamp01(0.5 - localTexCoord));
vec2 centerFactorNeg = sqrt1(2.0 * clamp01(localTexCoord - 0.5));
ivec3 voxel0 = voxelPos + right;
ivec3 voxel1 = voxelPos - right;
ivec3 voxel2 = voxelPos + up;
ivec3 voxel3 = voxelPos - up;
float occlusion0 = mix(0.0, float(checkVoxelAt(voxel0)), centerFactorPos.x);
float occlusion1 = mix(0.0, float(checkVoxelAt(voxel1)), centerFactorNeg.x);
float occlusion2 = mix(0.0, float(checkVoxelAt(voxel2)), centerFactorPos.y);
float occlusion3 = mix(0.0, float(checkVoxelAt(voxel3)), centerFactorNeg.y);
return 1.0 - (occlusion0 + occlusion1 + occlusion2 + occlusion3) * 0.25;
}
vec4 getShadedReflection(ivec3 voxelPos, vec3 oldPlayerPos, vec3 playerPos, vec3 rayDir, vec3 normal, float dither) {
faceData faceData = getFaceData(voxelPos, normal);
if (faceData.textureBounds.z < 1e-6) return vec4(-1.0);
vec2 localTexCoord = getLocalTexCoord(fract(playerPos + cameraPositionBestFract), normal);
vec2 textureSizeAtlas = textureSize(textureAtlas, 0);
vec2 textureRadVec2 = faceData.textureBounds.z * vec2(1.0, textureSizeAtlas.x / textureSizeAtlas.y);
vec2 textureCoord = faceData.textureBounds.xy + 2.0 * textureRadVec2 * localTexCoord;
float virtualDist = length(playerPos - oldPlayerPos) + length(oldPlayerPos);
float textureFactor = length(textureRadVec2 * textureSizeAtlas) * 3.0;
float lod = 0.5 * log2(virtualDist * textureFactor / gbufferProjection[0][0] / abs(dot(normal, rayDir)) / viewHeight / REFLECTION_RES);
vec4 color = texture2DLod(textureAtlas, textureCoord, lod) * vec4(faceData.glColor, 1.0);
#if MC_VERSION >= 12111 && IRIS_VERSION < 11005
// stupid fake lods because custom texture lods broke with Iris in newer mc versions
vec2 lodCoordSpan = localTexCoord / pow(2.0, int(1.5 + pow2(max0(lod)) + 0.0 * dither));
vec2 lodCoord1 = faceData.textureBounds.xy + 2.0 * textureRadVec2 * (0.5 + lodCoordSpan);
vec2 lodCoord2 = faceData.textureBounds.xy + 2.0 * textureRadVec2 * (0.25 + lodCoordSpan);
vec2 lodCoord3 = faceData.textureBounds.xy + 2.0 * textureRadVec2 * lodCoordSpan;
vec4 lodColor1 = texture2DLod(textureAtlas, lodCoord1, lod) * vec4(faceData.glColor, 1.0);
vec4 lodColor2 = texture2DLod(textureAtlas, lodCoord2, lod) * vec4(faceData.glColor, 1.0);
vec4 lodColor3 = texture2DLod(textureAtlas, lodCoord3, lod) * vec4(faceData.glColor, 1.0);
float lodMix = clamp01(lod - 0.75 + 0.25 * dither);
color = mix(color, 0.333333 * (lodColor1 + lodColor2 + lodColor3), lodMix);
if (dot(color.rgb, vec3(0.333333)) - 0.5 < 0.49) color.a = mix(color.a, 1.0, lodMix);
//
#endif
if (color.a < 0.0041) return vec4(-1.0); // Note that the cutout parts of leaves have a color.a of about 0.004
int mat = int(texelFetch(wsr_sampler, voxelPos, 0).r);
bool noSmoothLighting = false, noDirectionalShading = false, isFoliage = false;
int subsurfaceMode = 0;
float emission = 0.0, NdotU = normal.y, NdotE = normal.x, snowMinNdotU = 0.0;
vec2 lmCoordM = vec2(1.0);
vec3 shadowMult = vec3(1.0), maRecolor = vec3(0.0);
float skyLightCheck = 0.0;
float overlayNoiseIntensity = 1.0, snowNoiseIntensity = 1.0, sandNoiseIntensity = 1.0, mossNoiseIntensity = 1.0, overlayNoiseTransparentOverwrite = 0.0, overlayNoiseEmission = 1.0, lavaNoiseIntensity = LAVA_NOISE_INTENSITY;
vec3 normalM = normal, geoNormal = normal;
#ifdef IPBR
float lViewPos = length(playerPos);
vec4 glColor = vec4(faceData.glColor, 1.0);
vec2 absMidCoordPos = vec2(textureRadVec2);
vec2 midCoord = faceData.textureBounds.xy + 2.0 * textureRadVec2 * vec2(0.5);
vec2 signMidCoordPos = localTexCoord * 2.0 - 1.0;
bool noVanillaAO = false, centerShadowBias = false, noGeneratedNormals = false, doTileRandomisation = true;
float smoothnessD = 0.0, materialMask = 0.0;
float smoothnessG = 0.0, highlightMult = 1.0, noiseFactor = 1.0, snowFactor = 1.0, noPuddles = 0.0;
vec2 lmCoord = faceData.lightmap;
float IPBRMult = 1.0;
#define DURING_WORLDSPACE_REF
#ifndef IPBR_COMPAT_MODE
#define IPBR_COMPAT_MODE
#endif
#undef DISTANT_LIGHT_BOKEH
#include "/lib/materials/materialHandling/terrainIPBR.glsl"
#undef DURING_WORLDSPACE_REF
#else
if (mat == 10007 || mat == 10009 || mat == 10011) { // Leaves
#include "/lib/materials/specificMaterials/terrain/leaves.glsl"
}
#endif
float NdotL = dot(normal, mat3(gbufferModelViewInverse) * lightVec);
#ifdef SIDE_SHADOWING
float lightingNdotL = max0(NdotL + 0.4) * 0.714;
#ifdef END
lightingNdotL = sqrt3(lightingNdotL);
#endif
#else
float lightingNdotL = max0(NdotL);
#endif
#ifndef NETHER
vec3 shadow = shadowMult;
if (lightingNdotL > 0.0001) {
float shadowLength = shadowDistance * 0.9166667 - length(playerPos); //consistent08JJ622
if (shadowLength > 0.000001) {
float distanceBias = 0.12 + 0.0008 * pow(dot(playerPos, playerPos), 0.75);
vec3 bias = normal * distanceBias * (2.0 - 0.95 * max0(NdotL));
#if SHADOW_QUALITY == 0
int shadowSamples = 0; // We don't use SampleTAAFilteredShadow on Shadow Quality 0
#elif SHADOW_QUALITY == 1
int shadowSamples = 1;
#else
int shadowSamples = 2;
#endif
shadow = GetShadow(GetShadowPos(playerPos + bias), faceData.lightmap.y, offset, shadowSamples, false);
}
}
shadow *= dot(shadow, vec3(0.33333));
#else
vec3 shadow = vec3(1.0);
#endif
#ifdef CLOUD_SHADOWS
shadow *= GetCloudShadow(playerPos);
#endif
faceData.lightmap = pow2(pow2(faceData.lightmap));
float AO = max(0.8, getVoxelSpaceAO(playerPos, ivec3(normal), localTexCoord));
float directionalShading = noDirectionalShading ? 1.0 : (NdotU + 1.0) * 0.25 + 0.5;
vec3 centerPlayerPos = floor(playerPos + cameraPosition + normal * 0.01) - cameraPosition + 0.5;
vec3 playerPosM = mix(centerPlayerPos, playerPos, (AO - 0.8) / 0.2);
vec3 voxelPosM = SceneToVoxel(playerPosM);
voxelPosM = clamp01(voxelPosM / vec3(voxelVolumeSize));
vec4 lightVolume = GetLightVolume(voxelPosM);
lightVolume = max(lightVolume, vec4(0.000001));
vec3 specialLighting = 0.8 * pow(GetLuminance(lightVolume.rgb), 0.25) * DoLuminanceCorrection(pow(lightVolume.rgb, vec3(0.3)));
if (noSmoothLighting == true) specialLighting *= 0.6;
vec3 minLighting = 0.8 * sqrt(GetMinimumLighting(faceData.lightmap.y, playerPos));
#if HELD_LIGHTING_MODE >= 1
vec3 heldLighting = GetHeldLighting(playerPos, color.rgb, emission, geoNormal, normalM, vec3(0));
specialLighting = sqrt(pow2(specialLighting) + sqrt(heldLighting));
#endif
#ifdef AURORA_INFLUENCE
ambientColor = getAuroraAmbientColor(ambientColor, rayDir, 0.035, AURORA_TERRAIN_INFLUENCE_INTENSITY, 0.9);
#endif
#ifdef OVERWORLD
float ambientMult = 0.9 * faceData.lightmap.y;
float lightMult = (1.1 + 0.25 * subsurfaceMode) * lightingNdotL * shadowTime;
lightMult *= 1.0 + abs(NdotE) * 0.25;
specialLighting *= 1.0 - faceData.lightmap.y * sunFactor;
#else
float ambientMult = 1.0;
float lightMult = 1.0 * lightingNdotL * shadowTime;
#endif
vec3 sceneLighting = ambientMult * ambientColor + lightMult * lightColor * shadow;
#ifdef LIGHT_COLOR_MULTS
lightColorMult = GetLightColorMult();
sceneLighting *= lightColorMult;
#endif
#ifdef MOON_PHASE_INF_LIGHT
sceneLighting *= moonPhaseInfluence;
#endif
vec3 lighting = sceneLighting + specialLighting * XLIGHT_I + minLighting;
lighting = lighting * AO * directionalShading + emission * 0.8;
vec3 fadeout = smoothstep(0.0, 32.0, 0.5 * sceneVoxelVolumeSize - abs(playerPos));
fadeout = sqrt3(fadeout) * 0.9 + 0.1;
float alphaFade = min(fadeout.x, min(fadeout.y, fadeout.z));
return vec4(color.rgb * lighting + maRecolor, alphaFade);
}
vec3 wsrHitPos = vec3(-100000);
vec4 traceHighLOD(vec3 rayDir, vec3 stepDir, vec3 stepSizes, vec3 oldPlayerPos, vec3 newPlayerPos, vec3 voxelPos, float RVdotU, float RVdotS, float dither) {
vec3 nextDist = (stepDir * 0.5 + 0.5 - fract(voxelPos)) / rayDir;
float closestDist = 0.0;
const float maxSteps = 14;
for (int i = 0; i < maxSteps; i++) {
closestDist = min(nextDist.x, min(nextDist.y, nextDist.z));
vec3 stepAxis = vec3(lessThanEqual(nextDist, vec3(closestDist)));
voxelPos += stepAxis * stepDir;
nextDist += stepAxis * stepSizes;
if (!CheckInsideSceneVoxelVolume(voxelPos)) return vec4(0.0);
if (checkVoxelAt(ivec3(voxelPos))) {
vec3 normal = -stepAxis * stepDir;
vec3 intersection = newPlayerPos + rayDir * closestDist;
vec4 reflection = getShadedReflection(ivec3(voxelPos), oldPlayerPos, intersection, rayDir, normal, dither);
if (reflection.a < -0.5) continue;
wsrHitPos = intersection;
vec3 fadeout = smoothstep(0.0, 32.0, 0.5 * sceneVoxelVolumeSize - abs(oldPlayerPos));
fadeout = sqrt3(fadeout) * 0.9 + 0.1;
reflection *= min(fadeout.x, min(fadeout.y, fadeout.z));
float skyFade = 0.0;
float reflectionPrevAlpha = reflection.a;
DoFog(reflection, skyFade, length(intersection), intersection, RVdotU, RVdotS, dither, true, length(oldPlayerPos));
reflection.a = reflectionPrevAlpha * (1.0 - skyFade);
return reflection;
}
}
return vec4(-1.0);
}
vec4 traceLowLOD(vec3 rayDir ,vec3 stepDir, vec3 stepSizes, vec3 playerPos, vec3 voxelPos, vec3 normalOffset, float RVdotU, float RVdotS, float dither) {
float lodScale = 4.0;
vec3 lodVoxelPos = voxelPos / lodScale;
vec3 nextDist = (stepDir * 0.5 + 0.5 - fract(lodVoxelPos)) / rayDir;
float closestDistPrevious = 0.0;
float closestDist = 0.0;
float maxSteps = length(vec3(sceneVoxelVolumeSize)) / lodScale;
for (int i = 0; i < maxSteps; i++) {
if (any(greaterThan(lodVoxelPos, vec3(sceneVoxelVolumeSize) / lodScale)) || any(lessThan(lodVoxelPos, vec3(0.0))))
return vec4(0.0);
if (checkLodVoxelAt(ivec3(lodVoxelPos))) {
vec3 newPlayerPos = playerPos + rayDir * closestDistPrevious * lodScale;
// Fixes surfaces reflecting themselves at a distance with lower resolutions, but it can cause some rare artifacts
if (i <= 2) newPlayerPos += normalOffset * 0.06;
vec3 newVoxelPos = playerToSceneVoxel(newPlayerPos);
vec4 try = traceHighLOD(rayDir, stepDir, stepSizes, playerPos, newPlayerPos, newVoxelPos, RVdotU, RVdotS, dither);
if (try.a > -0.5) return try;
}
closestDistPrevious = closestDist;
closestDist = min(nextDist.x, min(nextDist.y, nextDist.z));
vec3 stepAxis = vec3(lessThanEqual(nextDist, vec3(closestDist)));
lodVoxelPos += stepAxis * stepDir;
nextDist += stepAxis * stepSizes;
}
return vec4(0.0);
}
vec4 getWSR(vec3 playerPos, vec3 normalMR, vec3 nViewPosR, float RVdotU, float RVdotS, float z0, float dither) {
vec3 normalOffset = normalize(mat3(gbufferModelViewInverse) * normalMR);
vec3 voxelPos = playerToSceneVoxel(playerPos);
// Fixes slabs, stairs, dirt paths, and farmlands reflecting themselves
if (z0 == z1 && z0 > 0.56) {
vec3 playerPosFractAdded = playerPos + cameraPositionBestFract + 256.0;
vec3 normalOffsetM = normalOffset * (0.04 - 0.01 * dither);
ivec3 voxelPosCheck1 = ivec3(playerPosFractAdded - normalOffsetM);
ivec3 voxelPosCheck2 = ivec3(playerPosFractAdded + normalOffsetM);
if (voxelPosCheck1 == voxelPosCheck2) playerPos += normalOffset * 0.5;
}
vec3 rayDir = mat3(gbufferModelViewInverse) * nViewPosR;
if (CheckInsideSceneVoxelVolume(voxelPos)) {
vec3 stepDir = sign(rayDir);
vec3 stepSizes = 1.0 / abs(rayDir);
vec4 wsrResult = traceLowLOD(rayDir, stepDir, stepSizes, playerPos, voxelPos, normalOffset, RVdotU, RVdotS, dither);
#if WORLD_SPACE_PLAYER_REF == 1
if (!is_invisible && z0 > 0.56) {
float wsrTraceLength = length(wsrHitPos - playerPos);
vec3 albedo;
vec3 normal;
float emission;
#ifdef SPACEAGLE17
if (isSneaking < 0.5 || !(heldItemId == 45014 || heldItemId2 == 45014))
#endif
if (rayTracePlayer(playerPos - 0.01 * rayDir, rayDir, wsrTraceLength, albedo, normal, emission)) {
vec2 lmCoord = eyeBrightness / 240.0;
#ifdef OVERWORLD
float ambientMult = 1.5 * lmCoord.y;
float lightMult = 0.2 * pow2(pow2(lmCoord.y));
#else
float ambientMult = 1.5;
float lightMult = 0.0;
#endif
vec3 voxelPosM = SceneToVoxel(vec3(0.0));
voxelPosM = clamp01(voxelPosM / vec3(voxelVolumeSize));
vec4 lightVolume = GetLightVolume(voxelPosM);
lightVolume = max(lightVolume, vec4(0.000001));
vec3 specialLighting = pow(GetLuminance(lightVolume.rgb), 0.25) * DoLuminanceCorrection(pow(lightVolume.rgb, vec3(0.25)));
#if HELD_LIGHTING_MODE >= 1
float tempEmission;
vec3 heldLighting = GetHeldLighting(playerPos, vec3(999999.0), tempEmission, vec3(0), vec3(0), vec3(0));
specialLighting = sqrt(pow2(specialLighting) + sqrt(heldLighting));
#endif
vec3 minLighting = 0.8 * sqrt(GetMinimumLighting(lmCoord.y, playerPos));
vec3 sceneLighting = ambientMult * ambientColor + lightMult * lightColor;
#ifdef LIGHT_COLOR_MULTS
lightColorMult = GetLightColorMult();
sceneLighting *= lightColorMult;
#endif
#ifdef MOON_PHASE_INF_LIGHT
sceneLighting *= moonPhaseInfluence;
#endif
vec3 lighting = sceneLighting + specialLighting * (1.0 - lmCoord.y * sunFactor) * XLIGHT_I + minLighting + emission;
vec3 fadeout = smoothstep(0.0, 32.0, 0.5 * sceneVoxelVolumeSize - abs(playerPos));
fadeout = sqrt3(fadeout) * 0.9 + 0.1;
float alphaFade = min(fadeout.x, min(fadeout.y, fadeout.z));
return vec4(albedo * lighting, alphaFade);
}
}
#endif
return wsrResult;
}
return vec4(0.0);
}
#extension GL_ARB_shader_image_load_store : enable
#include "/lib/voxelization/reflectionVoxelization.glsl"
#include "/lib/lighting/minimumLighting.glsl"
#include "/lib/shaderSettings/mainLighting.glsl"
#if WORLD_SPACE_PLAYER_REF == 1
#include "/lib/materials/materialMethods/playerRayTracer.glsl"
#endif
#ifdef AURORA_INFLUENCE
#include "/lib/atmospherics/auroraBorealis.glsl"
#endif
#if defined OVERWORLD || defined END
#ifndef GBUFFERS_WATER
#include "/lib/lighting/shadowSampling.glsl"
#if defined DO_PIXELATION_EFFECTS && defined PIXELATED_SHADOWS
#include "/lib/misc/pixelation.glsl"
#endif
#endif
#if SHADOW_SMOOTHING == 4 || SHADOW_QUALITY == 0
const float offset = 0.00098;
#elif SHADOW_SMOOTHING == 3
const float offset = 0.00075;
#elif SHADOW_SMOOTHING == 2
const float offset = 0.0005;
#elif SHADOW_SMOOTHING == 1
const float offset = 0.0003;
#endif
#endif
#if HELD_LIGHTING_MODE >= 1
#include "/lib/lighting/heldLighting.glsl"
#endif
#ifdef CLOUD_SHADOWS
#include "/lib/lighting/cloudShadows.glsl"
#endif
#ifdef LIGHT_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_LIGHT
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
vec2 getLocalTexCoord(vec3 local, vec3 normal) {
vec3 absNormal = abs(normal);
return 1.0 - local.zy * absNormal.x - local.xz * absNormal.y - local.xy * absNormal.z;
}
float getVoxelSpaceAO(vec3 playerPos, ivec3 normal, vec2 localTexCoord) {
ivec3 voxelPos = ivec3(playerToSceneVoxel(playerPos + normal * 0.5));
ivec3 absNormal = ivec3(abs(normal));
ivec3 right = ivec3(0, 0, 1) * absNormal.x + ivec3(1, 0, 0) * absNormal.y + ivec3(1, 0, 0) * absNormal.z;
ivec3 up = ivec3(0, 1, 0) * absNormal.x + ivec3(0, 0, 1) * absNormal.y + ivec3(0, 1, 0) * absNormal.z;
vec2 centerFactorPos = sqrt1(2.0 * clamp01(0.5 - localTexCoord));
vec2 centerFactorNeg = sqrt1(2.0 * clamp01(localTexCoord - 0.5));
ivec3 voxel0 = voxelPos + right;
ivec3 voxel1 = voxelPos - right;
ivec3 voxel2 = voxelPos + up;
ivec3 voxel3 = voxelPos - up;
float occlusion0 = mix(0.0, float(checkVoxelAt(voxel0)), centerFactorPos.x);
float occlusion1 = mix(0.0, float(checkVoxelAt(voxel1)), centerFactorNeg.x);
float occlusion2 = mix(0.0, float(checkVoxelAt(voxel2)), centerFactorPos.y);
float occlusion3 = mix(0.0, float(checkVoxelAt(voxel3)), centerFactorNeg.y);
return 1.0 - (occlusion0 + occlusion1 + occlusion2 + occlusion3) * 0.25;
}
vec4 getShadedReflection(ivec3 voxelPos, vec3 oldPlayerPos, vec3 playerPos, vec3 rayDir, vec3 normal, float dither) {
faceData faceData = getFaceData(voxelPos, normal);
if (faceData.textureBounds.z < 1e-6) return vec4(-1.0);
vec2 localTexCoord = getLocalTexCoord(fract(playerPos + cameraPositionBestFract), normal);
vec2 textureSizeAtlas = textureSize(textureAtlas, 0);
vec2 textureRadVec2 = faceData.textureBounds.z * vec2(1.0, textureSizeAtlas.x / textureSizeAtlas.y);
vec2 textureCoord = faceData.textureBounds.xy + 2.0 * textureRadVec2 * localTexCoord;
float virtualDist = length(playerPos - oldPlayerPos) + length(oldPlayerPos);
float textureFactor = length(textureRadVec2 * textureSizeAtlas) * 3.0;
float lod = 0.5 * log2(virtualDist * textureFactor / gbufferProjection[0][0] / abs(dot(normal, rayDir)) / viewHeight / REFLECTION_RES);
vec4 color = texture2DLod(textureAtlas, textureCoord, lod) * vec4(faceData.glColor, 1.0);
#if MC_VERSION >= 12111 && IRIS_VERSION < 11005
// stupid fake lods because custom texture lods broke with Iris in newer mc versions
vec2 lodCoordSpan = localTexCoord / pow(2.0, int(1.5 + pow2(max0(lod)) + 0.0 * dither));
vec2 lodCoord1 = faceData.textureBounds.xy + 2.0 * textureRadVec2 * (0.5 + lodCoordSpan);
vec2 lodCoord2 = faceData.textureBounds.xy + 2.0 * textureRadVec2 * (0.25 + lodCoordSpan);
vec2 lodCoord3 = faceData.textureBounds.xy + 2.0 * textureRadVec2 * lodCoordSpan;
vec4 lodColor1 = texture2DLod(textureAtlas, lodCoord1, lod) * vec4(faceData.glColor, 1.0);
vec4 lodColor2 = texture2DLod(textureAtlas, lodCoord2, lod) * vec4(faceData.glColor, 1.0);
vec4 lodColor3 = texture2DLod(textureAtlas, lodCoord3, lod) * vec4(faceData.glColor, 1.0);
float lodMix = clamp01(lod - 0.75 + 0.25 * dither);
color = mix(color, 0.333333 * (lodColor1 + lodColor2 + lodColor3), lodMix);
if (dot(color.rgb, vec3(0.333333)) - 0.5 < 0.49) color.a = mix(color.a, 1.0, lodMix);
//
#endif
if (color.a < 0.0041) return vec4(-1.0); // Note that the cutout parts of leaves have a color.a of about 0.004
int mat = int(texelFetch(wsr_sampler, voxelPos, 0).r);
bool noSmoothLighting = false, noDirectionalShading = false, isFoliage = false;
int subsurfaceMode = 0;
float emission = 0.0, NdotU = normal.y, NdotE = normal.x, snowMinNdotU = 0.0;
vec2 lmCoordM = vec2(1.0);
vec3 shadowMult = vec3(1.0), maRecolor = vec3(0.0);
float skyLightCheck = 0.0;
float overlayNoiseIntensity = 1.0, snowNoiseIntensity = 1.0, sandNoiseIntensity = 1.0, mossNoiseIntensity = 1.0, overlayNoiseTransparentOverwrite = 0.0, overlayNoiseEmission = 1.0, lavaNoiseIntensity = LAVA_NOISE_INTENSITY;
vec3 normalM = normal, geoNormal = normal;
#ifdef IPBR
float lViewPos = length(playerPos);
vec4 glColor = vec4(faceData.glColor, 1.0);
vec2 absMidCoordPos = vec2(textureRadVec2);
vec2 midCoord = faceData.textureBounds.xy + 2.0 * textureRadVec2 * vec2(0.5);
vec2 signMidCoordPos = localTexCoord * 2.0 - 1.0;
bool noVanillaAO = false, centerShadowBias = false, noGeneratedNormals = false, doTileRandomisation = true;
float smoothnessD = 0.0, materialMask = 0.0;
float smoothnessG = 0.0, highlightMult = 1.0, noiseFactor = 1.0, snowFactor = 1.0, noPuddles = 0.0;
vec2 lmCoord = faceData.lightmap;
float IPBRMult = 1.0;
#define DURING_WORLDSPACE_REF
#ifndef IPBR_COMPAT_MODE
#define IPBR_COMPAT_MODE
#endif
#undef DISTANT_LIGHT_BOKEH
#include "/lib/materials/materialHandling/terrainIPBR.glsl"
#undef DURING_WORLDSPACE_REF
#else
if (mat == 10007 || mat == 10009 || mat == 10011) { // Leaves
#include "/lib/materials/specificMaterials/terrain/leaves.glsl"
}
#endif
float NdotL = dot(normal, mat3(gbufferModelViewInverse) * lightVec);
#ifdef SIDE_SHADOWING
float lightingNdotL = max0(NdotL + 0.4) * 0.714;
#ifdef END
lightingNdotL = sqrt3(lightingNdotL);
#endif
#else
float lightingNdotL = max0(NdotL);
#endif
#ifndef NETHER
vec3 shadow = shadowMult;
if (lightingNdotL > 0.0001) {
float shadowLength = shadowDistance * 0.9166667 - length(playerPos); //consistent08JJ622
if (shadowLength > 0.000001) {
float distanceBias = 0.12 + 0.0008 * pow(dot(playerPos, playerPos), 0.75);
vec3 bias = normal * distanceBias * (2.0 - 0.95 * max0(NdotL));
#if SHADOW_QUALITY == 0
int shadowSamples = 0; // We don't use SampleTAAFilteredShadow on Shadow Quality 0
#elif SHADOW_QUALITY == 1
int shadowSamples = 1;
#else
int shadowSamples = 2;
#endif
shadow = GetShadow(GetShadowPos(playerPos + bias), faceData.lightmap.y, offset, shadowSamples, false);
}
}
shadow *= dot(shadow, vec3(0.33333));
#else
vec3 shadow = vec3(1.0);
#endif
#ifdef CLOUD_SHADOWS
shadow *= GetCloudShadow(playerPos);
#endif
faceData.lightmap = pow2(pow2(faceData.lightmap));
float AO = max(0.8, getVoxelSpaceAO(playerPos, ivec3(normal), localTexCoord));
float directionalShading = noDirectionalShading ? 1.0 : (NdotU + 1.0) * 0.25 + 0.5;
vec3 centerPlayerPos = floor(playerPos + cameraPosition + normal * 0.01) - cameraPosition + 0.5;
vec3 playerPosM = mix(centerPlayerPos, playerPos, (AO - 0.8) / 0.2);
vec3 voxelPosM = SceneToVoxel(playerPosM);
voxelPosM = clamp01(voxelPosM / vec3(voxelVolumeSize));
vec4 lightVolume = GetLightVolume(voxelPosM);
lightVolume = max(lightVolume, vec4(0.000001));
vec3 specialLighting = 0.8 * pow(GetLuminance(lightVolume.rgb), 0.25) * DoLuminanceCorrection(pow(lightVolume.rgb, vec3(0.3)));
if (noSmoothLighting == true) specialLighting *= 0.6;
vec3 minLighting = 0.8 * sqrt(GetMinimumLighting(faceData.lightmap.y, playerPos));
#if HELD_LIGHTING_MODE >= 1
vec3 heldLighting = GetHeldLighting(playerPos, color.rgb, emission, geoNormal, normalM, vec3(0));
specialLighting = sqrt(pow2(specialLighting) + sqrt(heldLighting));
#endif
#ifdef AURORA_INFLUENCE
ambientColor = getAuroraAmbientColor(ambientColor, rayDir, 0.035, AURORA_TERRAIN_INFLUENCE_INTENSITY, 0.9);
#endif
#ifdef OVERWORLD
float ambientMult = 0.9 * faceData.lightmap.y;
float lightMult = (1.1 + 0.25 * subsurfaceMode) * lightingNdotL * shadowTime;
lightMult *= 1.0 + abs(NdotE) * 0.25;
specialLighting *= 1.0 - faceData.lightmap.y * sunFactor;
#else
float ambientMult = 1.0;
float lightMult = 1.0 * lightingNdotL * shadowTime;
#endif
vec3 sceneLighting = ambientMult * ambientColor + lightMult * lightColor * shadow;
#ifdef LIGHT_COLOR_MULTS
lightColorMult = GetLightColorMult();
sceneLighting *= lightColorMult;
#endif
#ifdef MOON_PHASE_INF_LIGHT
sceneLighting *= moonPhaseInfluence;
#endif
vec3 lighting = sceneLighting + specialLighting * XLIGHT_I + minLighting;
lighting = lighting * AO * directionalShading + emission * 0.8;
vec3 fadeout = smoothstep(0.0, 32.0, 0.5 * sceneVoxelVolumeSize - abs(playerPos));
fadeout = sqrt3(fadeout) * 0.9 + 0.1;
float alphaFade = min(fadeout.x, min(fadeout.y, fadeout.z));
return vec4(color.rgb * lighting + maRecolor, alphaFade);
}
vec3 wsrHitPos = vec3(-100000);
vec4 traceHighLOD(vec3 rayDir, vec3 stepDir, vec3 stepSizes, vec3 oldPlayerPos, vec3 newPlayerPos, vec3 voxelPos, float RVdotU, float RVdotS, float dither) {
vec3 nextDist = (stepDir * 0.5 + 0.5 - fract(voxelPos)) / rayDir;
float closestDist = 0.0;
const float maxSteps = 14;
for (int i = 0; i < maxSteps; i++) {
closestDist = min(nextDist.x, min(nextDist.y, nextDist.z));
vec3 stepAxis = vec3(lessThanEqual(nextDist, vec3(closestDist)));
voxelPos += stepAxis * stepDir;
nextDist += stepAxis * stepSizes;
if (!CheckInsideSceneVoxelVolume(voxelPos)) return vec4(0.0);
if (checkVoxelAt(ivec3(voxelPos))) {
vec3 normal = -stepAxis * stepDir;
vec3 intersection = newPlayerPos + rayDir * closestDist;
vec4 reflection = getShadedReflection(ivec3(voxelPos), oldPlayerPos, intersection, rayDir, normal, dither);
if (reflection.a < -0.5) continue;
wsrHitPos = intersection;
vec3 fadeout = smoothstep(0.0, 32.0, 0.5 * sceneVoxelVolumeSize - abs(oldPlayerPos));
fadeout = sqrt3(fadeout) * 0.9 + 0.1;
reflection *= min(fadeout.x, min(fadeout.y, fadeout.z));
float skyFade = 0.0;
float reflectionPrevAlpha = reflection.a;
DoFog(reflection, skyFade, length(intersection), intersection, RVdotU, RVdotS, dither, true, length(oldPlayerPos));
reflection.a = reflectionPrevAlpha * (1.0 - skyFade);
return reflection;
}
}
return vec4(-1.0);
}
vec4 traceLowLOD(vec3 rayDir ,vec3 stepDir, vec3 stepSizes, vec3 playerPos, vec3 voxelPos, vec3 normalOffset, float RVdotU, float RVdotS, float dither) {
float lodScale = 4.0;
vec3 lodVoxelPos = voxelPos / lodScale;
vec3 nextDist = (stepDir * 0.5 + 0.5 - fract(lodVoxelPos)) / rayDir;
float closestDistPrevious = 0.0;
float closestDist = 0.0;
float maxSteps = length(vec3(sceneVoxelVolumeSize)) / lodScale;
for (int i = 0; i < maxSteps; i++) {
if (any(greaterThan(lodVoxelPos, vec3(sceneVoxelVolumeSize) / lodScale)) || any(lessThan(lodVoxelPos, vec3(0.0))))
return vec4(0.0);
if (checkLodVoxelAt(ivec3(lodVoxelPos))) {
vec3 newPlayerPos = playerPos + rayDir * closestDistPrevious * lodScale;
// Fixes surfaces reflecting themselves at a distance with lower resolutions, but it can cause some rare artifacts
if (i <= 2) newPlayerPos += normalOffset * 0.06;
vec3 newVoxelPos = playerToSceneVoxel(newPlayerPos);
vec4 try = traceHighLOD(rayDir, stepDir, stepSizes, playerPos, newPlayerPos, newVoxelPos, RVdotU, RVdotS, dither);
if (try.a > -0.5) return try;
}
closestDistPrevious = closestDist;
closestDist = min(nextDist.x, min(nextDist.y, nextDist.z));
vec3 stepAxis = vec3(lessThanEqual(nextDist, vec3(closestDist)));
lodVoxelPos += stepAxis * stepDir;
nextDist += stepAxis * stepSizes;
}
return vec4(0.0);
}
vec4 getWSR(vec3 playerPos, vec3 normalMR, vec3 nViewPosR, float RVdotU, float RVdotS, float z0, float dither) {
vec3 normalOffset = normalize(mat3(gbufferModelViewInverse) * normalMR);
vec3 voxelPos = playerToSceneVoxel(playerPos);
// Fixes slabs, stairs, dirt paths, and farmlands reflecting themselves
if (z0 == z1 && z0 > 0.56) {
vec3 playerPosFractAdded = playerPos + cameraPositionBestFract + 256.0;
vec3 normalOffsetM = normalOffset * (0.04 - 0.01 * dither);
ivec3 voxelPosCheck1 = ivec3(playerPosFractAdded - normalOffsetM);
ivec3 voxelPosCheck2 = ivec3(playerPosFractAdded + normalOffsetM);
if (voxelPosCheck1 == voxelPosCheck2) playerPos += normalOffset * 0.5;
}
vec3 rayDir = mat3(gbufferModelViewInverse) * nViewPosR;
if (CheckInsideSceneVoxelVolume(voxelPos)) {
vec3 stepDir = sign(rayDir);
vec3 stepSizes = 1.0 / abs(rayDir);
vec4 wsrResult = traceLowLOD(rayDir, stepDir, stepSizes, playerPos, voxelPos, normalOffset, RVdotU, RVdotS, dither);
#if WORLD_SPACE_PLAYER_REF == 1
if (!is_invisible && z0 > 0.56) {
float wsrTraceLength = length(wsrHitPos - playerPos);
vec3 albedo;
vec3 normal;
float emission;
#ifdef SPACEAGLE17
if (isSneaking < 0.5 || !(heldItemId == 45014 || heldItemId2 == 45014))
#endif
if (rayTracePlayer(playerPos - 0.01 * rayDir, rayDir, wsrTraceLength, albedo, normal, emission)) {
vec2 lmCoord = eyeBrightness / 240.0;
#ifdef OVERWORLD
float ambientMult = 1.5 * lmCoord.y;
float lightMult = 0.2 * pow2(pow2(lmCoord.y));
#else
float ambientMult = 1.5;
float lightMult = 0.0;
#endif
vec3 voxelPosM = SceneToVoxel(vec3(0.0));
voxelPosM = clamp01(voxelPosM / vec3(voxelVolumeSize));
vec4 lightVolume = GetLightVolume(voxelPosM);
lightVolume = max(lightVolume, vec4(0.000001));
vec3 specialLighting = pow(GetLuminance(lightVolume.rgb), 0.25) * DoLuminanceCorrection(pow(lightVolume.rgb, vec3(0.25)));
#if HELD_LIGHTING_MODE >= 1
float tempEmission;
vec3 heldLighting = GetHeldLighting(playerPos, vec3(999999.0), tempEmission, vec3(0), vec3(0), vec3(0));
specialLighting = sqrt(pow2(specialLighting) + sqrt(heldLighting));
#endif
vec3 minLighting = 0.8 * sqrt(GetMinimumLighting(lmCoord.y, playerPos));
vec3 sceneLighting = ambientMult * ambientColor + lightMult * lightColor;
#ifdef LIGHT_COLOR_MULTS
lightColorMult = GetLightColorMult();
sceneLighting *= lightColorMult;
#endif
#ifdef MOON_PHASE_INF_LIGHT
sceneLighting *= moonPhaseInfluence;
#endif
vec3 lighting = sceneLighting + specialLighting * (1.0 - lmCoord.y * sunFactor) * XLIGHT_I + minLighting + emission;
vec3 fadeout = smoothstep(0.0, 32.0, 0.5 * sceneVoxelVolumeSize - abs(playerPos));
fadeout = sqrt3(fadeout) * 0.9 + 0.1;
float alphaFade = min(fadeout.x, min(fadeout.y, fadeout.z));
return vec4(albedo * lighting, alphaFade);
}
}
#endif
return wsrResult;
}
return vec4(0.0);
}
@@ -1,36 +1,36 @@
vec2 getOverlayNoise(float sideIntensity, bool noLightCheck, bool decreaseWithDepth, float meltingRadius, int pixelSize, vec3 worldPos, float noiseTransparency, float removeIntensity) {
float overlayNoiseVariable;
float topCheck = abs(clamp01(dot(normal, upVec))); // normal check for top surfaces
if (topCheck > 0.5) {
overlayNoiseVariable = 0.0;
overlayNoiseVariable += topCheck;
} else {
overlayNoiseVariable = sideIntensity;
}
//noise
int noiseSize = 0;
noiseSize = pixelSize;
float noise = float(hash33(floor(mod(worldPos, vec3(100.0)) * noiseSize + 0.03) * noiseSize)) * 0.25; // pixel-locked procedural noise
//make patches of terrain that don't have noise
float removeNoise1 = 1.0 - Noise3D(worldPos * 0.0005) * removeIntensity * 1.2;
float removeNoise2 = 1.0 - Noise3D(worldPos * 0.005) * removeIntensity;
float removeNoise3 = Noise3D(worldPos * 0.02) * removeIntensity;
float removeNoise = clamp01(2.0 * removeNoise1 + 0.70 * removeNoise2 + 0.2 * removeNoise3);
overlayNoiseVariable *= removeNoise;
// light check so noise is not in caves (near light sources)
overlayNoiseVariable = clamp01(overlayNoiseVariable); // to prevent stuff breaking, like the fucking bamboo sapling!!!!
if (!noLightCheck) {
overlayNoiseVariable *= (1.0 - pow(lmCoord.x, 1.0 / meltingRadius * 2.5) * 4.3) * pow(lmCoord.y, 14.0); // first part to turn off at light sources, second part to turn off if under blocks
}
float depthTransparency = 1.0;
if (decreaseWithDepth) {
depthTransparency = 10.0 / abs(min(worldPos.y, 0.001)) - 0.3 + clamp(removeNoise * 1.3, 0.0, 0.1); // increase transparency beginning at y=0 at increasing with decreasing y level
}
overlayNoiseVariable = clamp(overlayNoiseVariable, 0.0, depthTransparency); // to prevent artifacts near light sources
vec2 result = vec2(overlayNoiseVariable, noise);
return result;
}
vec2 getOverlayNoise(float sideIntensity, bool noLightCheck, bool decreaseWithDepth, float meltingRadius, int pixelSize, vec3 worldPos, float noiseTransparency, float removeIntensity) {
float overlayNoiseVariable;
float topCheck = abs(clamp01(dot(normal, upVec))); // normal check for top surfaces
if (topCheck > 0.5) {
overlayNoiseVariable = 0.0;
overlayNoiseVariable += topCheck;
} else {
overlayNoiseVariable = sideIntensity;
}
//noise
int noiseSize = 0;
noiseSize = pixelSize;
float noise = float(hash33(floor(mod(worldPos, vec3(100.0)) * noiseSize + 0.03) * noiseSize)) * 0.25; // pixel-locked procedural noise
//make patches of terrain that don't have noise
float removeNoise1 = 1.0 - Noise3D(worldPos * 0.0005) * removeIntensity * 1.2;
float removeNoise2 = 1.0 - Noise3D(worldPos * 0.005) * removeIntensity;
float removeNoise3 = Noise3D(worldPos * 0.02) * removeIntensity;
float removeNoise = clamp01(2.0 * removeNoise1 + 0.70 * removeNoise2 + 0.2 * removeNoise3);
overlayNoiseVariable *= removeNoise;
// light check so noise is not in caves (near light sources)
overlayNoiseVariable = clamp01(overlayNoiseVariable); // to prevent stuff breaking, like the fucking bamboo sapling!!!!
if (!noLightCheck) {
overlayNoiseVariable *= (1.0 - pow(lmCoord.x, 1.0 / meltingRadius * 2.5) * 4.3) * pow(lmCoord.y, 14.0); // first part to turn off at light sources, second part to turn off if under blocks
}
float depthTransparency = 1.0;
if (decreaseWithDepth) {
depthTransparency = 10.0 / abs(min(worldPos.y, 0.001)) - 0.3 + clamp(removeNoise * 1.3, 0.0, 0.1); // increase transparency beginning at y=0 at increasing with decreasing y level
}
overlayNoiseVariable = clamp(overlayNoiseVariable, 0.0, depthTransparency); // to prevent artifacts near light sources
vec2 result = vec2(overlayNoiseVariable, noise);
return result;
}
@@ -1,172 +1,172 @@
#define MOSS_NOISE_INTENSITY 1.0 //[0.5 0.75 1.0 1.25 1.5 2.0]
#define MOSS_NOISE_REMOVE_INTENSITY 1.00 //[0.00 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.60 1.70 1.80 1.90 2.00 2.25 2.50 2.75 3.00]
#define MOSS_TRANSPARENCY 0.85 // [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 1.00]
#define MOSS_IN_CAVES 0 //[0 1 2] //lush caves, true, false
#define MOSS_SIDE_INTENSITY 10 //[0 1 2 3 4 5 6 7 8 9 10]
#define MOSS_NOISE_DISTANCE 1.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0]
#define MOSS_SIZE 16 //[8 16 32 64 128]
#define SAND_CONDITION 0 //[0 1 2] 0 = dynamic 1 = only in hot biomes, 2 = everywhere
#define SAND_SIZE 16 //[8 16 32 64 128]
#define SAND_NOISE_INTENSITY 1.0 //[0.5 0.75 1.0 1.25 1.5 2.0]
#define SAND_NOISE_REMOVE_INTENSITY 1.00 //[0.00 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.60 1.70 1.80 1.90 2.00 2.25 2.50 2.75 3.00]
#define SAND_TRANSPARENCY 0.85 // [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 1.00]
#define SAND_IN_CAVES true //[true false]
#define SAND_SIDE_INTENSITY 7 //[0 1 2 3 4 5 6 7 8 9 10]
#define SAND_NOISE_DISTANCE 1.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0]
vec3 absPlayerPos = abs(playerPos);
float maxPlayerPosXZ = max(absPlayerPos.x, absPlayerPos.z);
#ifdef MOSS_NOISE_INTERNAL
#if MOSS_IN_CAVES == 0
float mossDecider = -clamp01(pow2(min1(maxPlayerPosXZ / (200 * MOSS_NOISE_DISTANCE)) * 2.0)) + 1.0; // The effect will only be around the player
#else
float mossDecider = 1.0;
#endif
if (mossDecider > 0.001){
vec3 mossColor = mix(vec3(0.2745, 0.3412, 0.1412), vec3(0.451, 0.5804, 0.1255), float(hash33(floor(mod(worldPos, vec3(100.0)) * MOSS_SIZE + 0.03) * MOSS_SIZE)) * 0.15);
#if MOSS_IN_CAVES < 2
bool disableLight = true;
#else
bool disableLight = false;
#endif
#if MOSS_SIDE_INTENSITY == 0
float mossSide = 0.0;
#else
float mossSide = MOSS_SIDE_INTENSITY * 0.1;
#endif
vec2 mossVec = getOverlayNoise(mossSide, disableLight, false, 0.1, MOSS_SIZE, worldPos, MOSS_TRANSPARENCY, MOSS_NOISE_REMOVE_INTENSITY * 1.5);
float mossNoise = mossVec.y;
float mossVariable = mossVec.x;
#if MOSS_IN_CAVES == 0
mossVariable *= inLushCave;
#endif
mossColor *= 1.1;
mossColor += 0.13 * mossNoise * MOSS_NOISE_INTENSITY; // make the noise less noticeable & configurable with option
#ifdef GBUFFERS_TERRAIN
#if MOSS_IN_CAVES == 0
emission *= mix(1.0, overlayNoiseEmission, inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
smoothnessG = mix(smoothnessG, 0.0, mossVariable * inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG, mossVariable * inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
#endif
#else
emission *= mix(1.0, overlayNoiseEmission, overlayNoiseIntensity * mossNoiseIntensity);
smoothnessG = mix(smoothnessG, 0.0, mossVariable * overlayNoiseIntensity * mossNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG, mossVariable * overlayNoiseIntensity * mossNoiseIntensity);
#endif
#endif
#endif
#if MOSS_IN_CAVES == 0
smoothnessG = mix(smoothnessG, max(smoothnessG, 0.3 * color.g * float(color.g > color.b * 1.5)), mossVariable * inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
#else
smoothnessG = mix(smoothnessG, max(smoothnessG, 0.3 * color.g * float(color.g > color.b * 1.5)), mossVariable * overlayNoiseIntensity * mossNoiseIntensity);
#endif
#ifdef GBUFFERS_WATER
#if MOSS_IN_CAVES == 0
overlayNoiseTransparentOverwrite = mix(overlayNoiseTransparentOverwrite, overlayNoiseAlpha, inLushCave);
fresnel = mix(fresnel, 0.01, mossVariable * overlayNoiseFresnelMult * inLushCave);
#else
overlayNoiseTransparentOverwrite = overlayNoiseAlpha;
fresnel = mix(fresnel, 0.01, mossVariable * overlayNoiseFresnelMult);
#endif
#endif
mossVariable *= mossDecider;
color.rgb = mix(color.rgb, mossColor, mossVariable * overlayNoiseIntensity * mossNoiseIntensity * MOSS_TRANSPARENCY);
color.a = mix(color.a, 1.0, clamp(overlayNoiseTransparentOverwrite * mossVariable * mossNoiseIntensity, 0.0, 1.0 * MOSS_TRANSPARENCY));
}
#endif
#ifdef SAND_NOISE_INTERNAL
#if SAND_CONDITION < 2
float sandDecider = -clamp01(pow2(min1(maxPlayerPosXZ / (200 * SAND_NOISE_DISTANCE)) * 2.0)) + 1.0; // The effect will only be around the player
#else
float sandDecider = 1.0;
#endif
if (sandDecider > 0.001){
#if SAND_CONDITION == 0
float desertSandColorMixer = inSand + inRedSand;
vec3 sandColor = mix(
vec3(0.9216, 0.8353, 0.6196), (inSand * vec3(0.9216, 0.8353, 0.6196) + inRedSand * vec3(0.5843, 0.3412, 0.1569)), desertSandColorMixer);
#else
vec3 sandColor = vec3(0.9216, 0.8353, 0.6196);
#endif
#if SAND_SIDE_INTENSITY == 0
float sandSide = 0.0;
#else
float sandSide = SAND_SIDE_INTENSITY * 0.1;
#endif
vec2 sandVec = getOverlayNoise(sandSide, SAND_IN_CAVES, true, 0.1, SAND_SIZE, worldPos, SAND_TRANSPARENCY, SAND_NOISE_REMOVE_INTENSITY * 2.0);
float sandNoise = sandVec.y;
float sandVariable = sandVec.x;
#if SAND_CONDITION == 0
sandVariable *= desertSandColorMixer;
#elif SAND_CONDITION == 1
sandVariable *= inDry;
#endif
sandColor *= 1.1;
sandColor += 0.13 * sandNoise * SAND_NOISE_INTENSITY; // make the noise less noticeable & configurable with option
#ifdef GBUFFERS_TERRAIN
#if SAND_CONDITION == 0
emission *= mix(1.0, overlayNoiseEmission, desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, pow(color.g, 16.0) * 2.0, sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, min1(smoothnessG), sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG * 0.7, sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
#endif
highlightMult = mix(highlightMult, 2.0, sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
#elif SAND_CONDITION == 1
emission *= mix(1.0, overlayNoiseEmission, inDry * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, pow(color.g, 16.0) * 2.0, sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, min1(smoothnessG), sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG * 0.7, sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
#endif
highlightMult = mix(highlightMult, 2.0, sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
#else
emission *= overlayNoiseEmission;
smoothnessG = mix(smoothnessG, pow(color.g, 16.0) * 2.0, sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, min1(smoothnessG), sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG * 0.7, sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
#endif
highlightMult = mix(highlightMult, 2.0, sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
#endif
#endif
#ifdef GBUFFERS_WATER
#if SAND_CONDITION == 0
overlayNoiseTransparentOverwrite = mix(0.0, overlayNoiseAlpha, desertSandColorMixer);
fresnel = mix(fresnel, 0.01, sandVariable * overlayNoiseFresnelMult * desertSandColorMixer);
#elif SAND_CONDITION == 1
overlayNoiseTransparentOverwrite = mix(0.0, overlayNoiseAlpha, inDry);
fresnel = mix(fresnel, 0.01, sandVariable * overlayNoiseFresnelMult * inDry);
#else
overlayNoiseTransparentOverwrite = overlayNoiseAlpha;
fresnel = mix(fresnel, 0.01, sandVariable * overlayNoiseFresnelMult);
#endif
#endif
sandVariable *= sandDecider;
color.rgb = mix(color.rgb, sandColor, sandVariable * overlayNoiseIntensity * sandNoiseIntensity * SAND_TRANSPARENCY);
color.a = mix(color.a, 1.0, clamp(overlayNoiseTransparentOverwrite * sandVariable * overlayNoiseIntensity * sandNoiseIntensity * SAND_TRANSPARENCY, 0.0, 1.0));
}
#endif
#define MOSS_NOISE_INTENSITY 1.0 //[0.5 0.75 1.0 1.25 1.5 2.0]
#define MOSS_NOISE_REMOVE_INTENSITY 1.00 //[0.00 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.60 1.70 1.80 1.90 2.00 2.25 2.50 2.75 3.00]
#define MOSS_TRANSPARENCY 0.85 // [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 1.00]
#define MOSS_IN_CAVES 0 //[0 1 2] //lush caves, true, false
#define MOSS_SIDE_INTENSITY 10 //[0 1 2 3 4 5 6 7 8 9 10]
#define MOSS_NOISE_DISTANCE 1.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0]
#define MOSS_SIZE 16 //[8 16 32 64 128]
#define SAND_CONDITION 0 //[0 1 2] 0 = dynamic 1 = only in hot biomes, 2 = everywhere
#define SAND_SIZE 16 //[8 16 32 64 128]
#define SAND_NOISE_INTENSITY 1.0 //[0.5 0.75 1.0 1.25 1.5 2.0]
#define SAND_NOISE_REMOVE_INTENSITY 1.00 //[0.00 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.60 1.70 1.80 1.90 2.00 2.25 2.50 2.75 3.00]
#define SAND_TRANSPARENCY 0.85 // [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 1.00]
#define SAND_IN_CAVES true //[true false]
#define SAND_SIDE_INTENSITY 7 //[0 1 2 3 4 5 6 7 8 9 10]
#define SAND_NOISE_DISTANCE 1.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0]
vec3 absPlayerPos = abs(playerPos);
float maxPlayerPosXZ = max(absPlayerPos.x, absPlayerPos.z);
#ifdef MOSS_NOISE_INTERNAL
#if MOSS_IN_CAVES == 0
float mossDecider = -clamp01(pow2(min1(maxPlayerPosXZ / (200 * MOSS_NOISE_DISTANCE)) * 2.0)) + 1.0; // The effect will only be around the player
#else
float mossDecider = 1.0;
#endif
if (mossDecider > 0.001){
vec3 mossColor = mix(vec3(0.2745, 0.3412, 0.1412), vec3(0.451, 0.5804, 0.1255), float(hash33(floor(mod(worldPos, vec3(100.0)) * MOSS_SIZE + 0.03) * MOSS_SIZE)) * 0.15);
#if MOSS_IN_CAVES < 2
bool disableLight = true;
#else
bool disableLight = false;
#endif
#if MOSS_SIDE_INTENSITY == 0
float mossSide = 0.0;
#else
float mossSide = MOSS_SIDE_INTENSITY * 0.1;
#endif
vec2 mossVec = getOverlayNoise(mossSide, disableLight, false, 0.1, MOSS_SIZE, worldPos, MOSS_TRANSPARENCY, MOSS_NOISE_REMOVE_INTENSITY * 1.5);
float mossNoise = mossVec.y;
float mossVariable = mossVec.x;
#if MOSS_IN_CAVES == 0
mossVariable *= inLushCave;
#endif
mossColor *= 1.1;
mossColor += 0.13 * mossNoise * MOSS_NOISE_INTENSITY; // make the noise less noticeable & configurable with option
#ifdef GBUFFERS_TERRAIN
#if MOSS_IN_CAVES == 0
emission *= mix(1.0, overlayNoiseEmission, inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
smoothnessG = mix(smoothnessG, 0.0, mossVariable * inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG, mossVariable * inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
#endif
#else
emission *= mix(1.0, overlayNoiseEmission, overlayNoiseIntensity * mossNoiseIntensity);
smoothnessG = mix(smoothnessG, 0.0, mossVariable * overlayNoiseIntensity * mossNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG, mossVariable * overlayNoiseIntensity * mossNoiseIntensity);
#endif
#endif
#endif
#if MOSS_IN_CAVES == 0
smoothnessG = mix(smoothnessG, max(smoothnessG, 0.3 * color.g * float(color.g > color.b * 1.5)), mossVariable * inLushCave * overlayNoiseIntensity * mossNoiseIntensity);
#else
smoothnessG = mix(smoothnessG, max(smoothnessG, 0.3 * color.g * float(color.g > color.b * 1.5)), mossVariable * overlayNoiseIntensity * mossNoiseIntensity);
#endif
#ifdef GBUFFERS_WATER
#if MOSS_IN_CAVES == 0
overlayNoiseTransparentOverwrite = mix(overlayNoiseTransparentOverwrite, overlayNoiseAlpha, inLushCave);
fresnel = mix(fresnel, 0.01, mossVariable * overlayNoiseFresnelMult * inLushCave);
#else
overlayNoiseTransparentOverwrite = overlayNoiseAlpha;
fresnel = mix(fresnel, 0.01, mossVariable * overlayNoiseFresnelMult);
#endif
#endif
mossVariable *= mossDecider;
color.rgb = mix(color.rgb, mossColor, mossVariable * overlayNoiseIntensity * mossNoiseIntensity * MOSS_TRANSPARENCY);
color.a = mix(color.a, 1.0, clamp(overlayNoiseTransparentOverwrite * mossVariable * mossNoiseIntensity, 0.0, 1.0 * MOSS_TRANSPARENCY));
}
#endif
#ifdef SAND_NOISE_INTERNAL
#if SAND_CONDITION < 2
float sandDecider = -clamp01(pow2(min1(maxPlayerPosXZ / (200 * SAND_NOISE_DISTANCE)) * 2.0)) + 1.0; // The effect will only be around the player
#else
float sandDecider = 1.0;
#endif
if (sandDecider > 0.001){
#if SAND_CONDITION == 0
float desertSandColorMixer = inSand + inRedSand;
vec3 sandColor = mix(
vec3(0.9216, 0.8353, 0.6196), (inSand * vec3(0.9216, 0.8353, 0.6196) + inRedSand * vec3(0.5843, 0.3412, 0.1569)), desertSandColorMixer);
#else
vec3 sandColor = vec3(0.9216, 0.8353, 0.6196);
#endif
#if SAND_SIDE_INTENSITY == 0
float sandSide = 0.0;
#else
float sandSide = SAND_SIDE_INTENSITY * 0.1;
#endif
vec2 sandVec = getOverlayNoise(sandSide, SAND_IN_CAVES, true, 0.1, SAND_SIZE, worldPos, SAND_TRANSPARENCY, SAND_NOISE_REMOVE_INTENSITY * 2.0);
float sandNoise = sandVec.y;
float sandVariable = sandVec.x;
#if SAND_CONDITION == 0
sandVariable *= desertSandColorMixer;
#elif SAND_CONDITION == 1
sandVariable *= inDry;
#endif
sandColor *= 1.1;
sandColor += 0.13 * sandNoise * SAND_NOISE_INTENSITY; // make the noise less noticeable & configurable with option
#ifdef GBUFFERS_TERRAIN
#if SAND_CONDITION == 0
emission *= mix(1.0, overlayNoiseEmission, desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, pow(color.g, 16.0) * 2.0, sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, min1(smoothnessG), sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG * 0.7, sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
#endif
highlightMult = mix(highlightMult, 2.0, sandVariable * desertSandColorMixer * overlayNoiseIntensity * sandNoiseIntensity);
#elif SAND_CONDITION == 1
emission *= mix(1.0, overlayNoiseEmission, inDry * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, pow(color.g, 16.0) * 2.0, sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, min1(smoothnessG), sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG * 0.7, sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
#endif
highlightMult = mix(highlightMult, 2.0, sandVariable * inDry * overlayNoiseIntensity * sandNoiseIntensity);
#else
emission *= overlayNoiseEmission;
smoothnessG = mix(smoothnessG, pow(color.g, 16.0) * 2.0, sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
smoothnessG = mix(smoothnessG, min1(smoothnessG), sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
#ifndef DH_TERRAIN
smoothnessD = mix(smoothnessD, smoothnessG * 0.7, sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
#endif
highlightMult = mix(highlightMult, 2.0, sandVariable * overlayNoiseIntensity * sandNoiseIntensity);
#endif
#endif
#ifdef GBUFFERS_WATER
#if SAND_CONDITION == 0
overlayNoiseTransparentOverwrite = mix(0.0, overlayNoiseAlpha, desertSandColorMixer);
fresnel = mix(fresnel, 0.01, sandVariable * overlayNoiseFresnelMult * desertSandColorMixer);
#elif SAND_CONDITION == 1
overlayNoiseTransparentOverwrite = mix(0.0, overlayNoiseAlpha, inDry);
fresnel = mix(fresnel, 0.01, sandVariable * overlayNoiseFresnelMult * inDry);
#else
overlayNoiseTransparentOverwrite = overlayNoiseAlpha;
fresnel = mix(fresnel, 0.01, sandVariable * overlayNoiseFresnelMult);
#endif
#endif
sandVariable *= sandDecider;
color.rgb = mix(color.rgb, sandColor, sandVariable * overlayNoiseIntensity * sandNoiseIntensity * SAND_TRANSPARENCY);
color.a = mix(color.a, 1.0, clamp(overlayNoiseTransparentOverwrite * sandVariable * overlayNoiseIntensity * sandNoiseIntensity * SAND_TRANSPARENCY, 0.0, 1.0));
}
#endif

Some files were not shown because too many files have changed in this diff Show More