/*---------------------------------------------------------------------
         ___ __  __ ____   ___  ____ _____  _    _   _ _____
        |_ _|  \/  |  _ \ / _ \|  _ \_   _|/ \  | \ | |_   _|
         | || |\/| | |_) | | | | |_) || | / _ \ |  \| | | |
         | || |  | |  __/| |_| |  _ < | |/ ___ \| |\  | | |
        |___|_|  |_|_|    \___/|_| \_\|_/_/   \_\_| \_| |_|
         .
  -> -> -> EDITING THIS FILE HAS A HIGH CHANCE TO BREAK THE SHADER PACK
  -> -> -> DO NOT CHANGE ANYTHING UNLESS YOU KNOW WHAT YOU ARE DOING
  -> -> -> DO NOT EXPECT SUPPORT AFTER MODIFYING SHADER FILES
---------------------------------------------------------------------*/

//User Settings//
    #define SHADER_STYLE 4 //[1 4]

    #define RP_MODE 1 //[1 0 3 2]

    #define SHADOW_QUALITY 2 //[-1 0 1 2 3 4 5]
    const float shadowDistance = 128.0; //[64.0 80.0 96.0 112.0 128.0 160.0 192.0 224.0 256.0 320.0 384.0 512.0 768.0 1024.0]
    #define SSAO_QUALI_DEFINE 2 //[0 2 3]
    #define FXAA_DEFINE 1 //[-1 1]
    #define DETAIL_QUALITY 0 //[0 2 3]
    #define CLOUD_QUALITY 1 //[0 1 2 3]
    #define LIGHTSHAFT_QUALI_DEFINE 2 //[0 1 2 3 4]
    #define WATER_REFLECT_QUALITY 1 //[-1 0 1 2]
    #define BLOCK_REFLECT_QUALITY 1 //[0 1 3]
    #define ANISOTROPIC_FILTER 0 //[0 4 8 16]
    #define ENTITY_SHADOW -1 //[-1 1 2]

    #define COLORED_LIGHTING 192 //[128 192 256 384 512 768 1024]
    #define WORLD_SPACE_REFLECTIONS 1 //[-1 1]
    #if defined IRIS_FEATURE_CUSTOM_IMAGES && SHADOW_QUALITY > -1 && !defined MC_OS_MAC && !(defined DH_TERRAIN || defined DH_WATER || defined VOXY_PATCH)
        #define COLORED_LIGHTING_INTERNAL COLORED_LIGHTING

        // ---------------------------------------------------------------
        // Standalone Voxel Flood-Fill Global Illumination (CUSTOM_GI_VOXEL)
        // ---------------------------------------------------------------
        // Independent of COLORED_LIGHTING: its own albedo/opacity voxel grid,
        // its own ping-pong radiance buffers, its own voxelization + injection
        // + propagation passes. Does not read from or write to voxel_img /
        // floodfill_img. See lib/voxelization/giFloodfill.glsl, program/begin.glsl,
        // program/prepare.glsl (injection) and program/giPropagateBody.glsl
        // (bounce passes, included by prepare_a..prepare_h).
        #define CUSTOM_GI_VOXEL 1 //[0 1]
        #if CUSTOM_GI_VOXEL == 1
            #define CUSTOM_GI_VOXEL_INTERNAL
            #define GI_VOXEL_RESOLUTION 256 //[64 128 192 256]
            // ("ukuran light bounce kegedean, bukan radius" fix): this is the
            // physical size of ONE voxel cell in world units - it's what
            // controls how big/blocky each bounce-light "chunk" looks, not
            // the blur radius (that's GI_BLUR_STRENGTH, left alone). A
            // smaller cell = finer, less blobby bounce detail, at the cost
            // of the grid covering less distance around the player for the
            // same GI_VOXEL_RESOLUTION - this has no extra performance cost
            // by itself (resolution is what's expensive), so it's a free
            // detail win, just with a shorter GI range. At 1.0, each voxel
            // covers 1 block, giving 256 blocks total coverage (128 blocks
            // in each direction from the player) with 48 blocks of soft
            // edge fade - matching typical render distances.
            // ("efek dobel / garis meleset keluar area" fix - REVERTED):
            // memperkecil GI_VOXEL_SIZE ke 0.5 untuk coba menghaluskan garis
            // kotak ternyata JUSTRU BIKIN LEBIH RUSAK - banyak angka offset
            // lain di kode ini (jarak "geser" sample surface supaya nggak
            // membaca cahaya dirinya sendiri, shadow-bias epsilon, dll,
            // lihat prepare.glsl & giFloodfill.glsl) di-tuning khusus untuk
            // asumsi 1 voxel = 1 blok penuh. Begitu ukuran voxel diperkecil
            // tanpa ikut menyesuaikan semua offset itu, titik sample jadi
            // numpuk/overlap dengan voxel tetangga - persis seperti "efek
            // dobel" dan garis yang meleset keluar area yang dilaporkan.
            // Dikembalikan ke 1.0 (nilai asli pack).
            #define GI_VOXEL_SIZE 1.0 //[0.25 0.375 0.5 0.75 1.0]
            #define GI_BOUNCE_PASSES 8 //[1 2 3 4 5 6 7 8]
            // ("bounce nggak nyebar penuh ke seluruh ruangan" fix): dinaikkan
            // dari 0.72 supaya energi cahaya nggak keburu habis sebelum
            // sempat menyebar ke seluruh volume ruangan lewat beberapa kali
            // lintasan flood-fill (GI_BOUNCE_PASSES).
            // Dinaikkan dari 0.85 -> 0.9 (nilai maksimum slider): energi
            // cahaya semakin lambat meluruh per lintasan bounce, jadi
            // jangkauannya lebih jauh sebelum habis - obor/lampu bisa
            // "nembak" sampai ke dinding yang lebih jauh, bukan cuma
            // menerangi sekitar terdekatnya saja.
            #define GI_DECAY 0.9 //[0.4 0.5 0.6 0.7 0.8 0.9]
            // ("bounce kurang terang" fix): dinaikkan dari 2.0 supaya cahaya
            // pantulan lebih terasa/terang secara keseluruhan.
            #define GI_INTENSITY 2.0 //[0.0 0.25 0.5 0.75 1.0 1.25 1.5 2.0 2.5 3.0]
            #define GI_LEAK_REDUCTION 1 //[0 1]

            // Injects light-emitting blocks (glowstone, lava, torches,
            // lanterns, sea lantern, lit redstone lamp, shroomlight, jack
            // o'lantern, copper torch/lantern, beacon) as actual light
            // sources into the voxel GI grid, instead of the grid only ever
            // knowing about sunlight/skylight. Without this, a glowing
            // block that isn't directly sunlit contributes zero bounce
            // light - this is what makes the emissive block's light bounce
            // off (and get tinted by) neighboring surfaces, including
            // colored glass placed in front of/around it, matching how the
            // existing solid-to-solid bounce already tints light by the
            // receiving surface's own albedo.
            // Dinyalakan (0 -> 1): tanpa ini, obor/lampu/lava dll TIDAK
            // dianggap sumber cahaya nyata di grid GI - cahayanya cuma
            // numpuk di sekitar block itu sendiri dan nggak benar-benar
            // "mantul" ke dinding/permukaan lain di sekitarnya. Inilah
            // yang bikin terasa "terperangkap"/nggak nyebar jauh.
            #define GI_EMISSIVE_BLOCKS 1 //[0 1]
            #define GI_EMISSIVE_INTENSITY 3.0 //[0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0 2.5 3.0 4.0]
            // Widens/softens the tangent-plane blur applied to the bounce
            // light sample below (see deferred1.glsl), pushing the coarse
            // voxel grid's blocky "steps" toward a smoother, more continuous
            // gradient - closer to the soft, denoised look of a real
            // path-traced GI shader (e.g. Noble RT, Soft Voxels, Nostalgia),
            // at the cost of losing some fine bounce-light detail/contact
            // shadowing the higher this goes.
            // ("bounce masih kelihatan kotak-kotak/blocky di sudut ruangan"
            // fix): was 20.0, way outside this define's own listed slider
            // range (max 4.0) - it only "worked" because GI_LEAK_REDUCTION
            // silently clamped the resulting blur radius down to 2.0 voxels
            // (see r = min(r, 2.0) in giFloodfill.glsl), which is too tight
            // to smooth out the coarse voxel grid's blocky steps in small
            // interior corners. Set to the slider's actual max (4.0) so the
            // define matches what's selectable, and raised the leak-reduction
            // clamp below from 2.0 to 3.0 voxels so tight corners get a
            // softer gradient instead of a visible step.
            // ("bounce bocor tembus dinding 1 block" fix): blur radius was
            // pushed to 3 voxels (= 3 blocks = GI_BLUR_STRENGTH 6.0), which on
            // a thin 1-block wall reaches THROUGH it and pulls radiance from
            // the adjacent room/outside. Brought back to 2.0 voxels so the
            // tangent taps stay on this side of the wall while still softening
            // the per-voxel grid.
            #define GI_BLUR_STRENGTH 4.0 //[0.5 0.75 1.0 1.5 2.0 2.5 3.0 4.0]

            // ---------------------------------------------------------------
            // Room-aware ray-traced bounce (see GiSampleRadianceRayTraced in
            // giFloodfill.glsl). Replaces the old single-point sample (one
            // blurred voxel fetch above the surface, which read as visible
            // "bulet-bulet" blobs near & far and had no idea what surrounded
            // the receiver) with a real hemispherical ray trace: every pixel
            // casts rays in ALL directions of the hemisphere above its surface,
            // each ray a DDA visibility trace through the voxel grid that STOPS
            // at the first solid voxel - so inside a room the rays hit the
            // floor/walls/ceiling on every side and pull their radiance back
            // ("nyebar semua arah"), light cannot leak through walls, and the
            // wide directionally-averaged footprint removes the blob pattern.
            // ("light bounce nggak nyebar ke seluruh ruangan" fix): dinaikkan
            // dari 6 supaya sampling hemisphere-nya lebih rapat/menyeluruh
            // ke segala arah, nggak cuma sebagian sisi ruangan yang kebagian.
            // ("noise di layar masih kelihatan" fix): dinaikkan lagi dari 8
            // ke 12 - jumlah ray per pixel per frame yang lebih banyak
            // langsung mengurangi varian per-pixel (noise berkurang kira-
            // kira sebanding dengan akar jumlah ray), tanpa perlu buffer
            // riwayat/reprojection baru yang berisiko munculin shimmer lagi
            // seperti percobaan SSRC sebelumnya. Trade-off: sedikit lebih
            // berat di GPU low-end.
            // Dinaikkan dari 12 -> 16: lebih banyak ray per pixel per frame
            // = hasil bounce lebih halus/akurat & noise makin berkurang,
            // makin dekat ke karakter "real ray-traced GI" (bukan cuma
            // menaikkan kecerahan, tapi kualitas/ketelitian sampling-nya).
            #define GI_RAYS_PER_PIXEL 16 //[2 3 4 5 6 8 10 12 16]
                // Rays cast per pixel per frame. More = smoother + more accurate
                // room bounce, slower.
            // ("ray nggak sampai ke dinding jauh, dikira lolos ke langit" fix):
            // 16 steps dulu sudah pas-pasan, tapi setelah GI_VOXEL_SIZE
            // diperkecil ke 0.5 (2 voxel/blok) jarak tempuh per langkah jadi
            // SETENGAHNYA - ray berhenti sebelum benar-benar sampai ke
            // dinding jauh di ruangan yang lumayan besar, lalu keliru
            // dianggap "lolos ke langit" (GI_SKY_AMBIENT rata) padahal masih
            // di dalam ruangan tertutup. Ini akar dari "pengukur volume dan
            // ruang dari rays tembak" jadi nggak akurat/nggak nyebar penuh.
            // Dinaikkan jauh di atas 16 (bahkan melebihi batas slider default
            // 32) supaya ray benar-benar menjangkau dinding ruangan besar.
            // ("ray nggak sampai dinding jauh, dikira lolos ke langit" fix):
            // 16 (default) pas-pasan buat ruangan besar. Sempat dinaikkan ke
            // 40 saat GI_VOXEL_SIZE diperkecil ke 0.5 (supaya jarak fisiknya
            // sama), tapi karena GI_VOXEL_SIZE sudah dikembalikan ke 1.0
            // (1 voxel = 1 blok lagi), tiap langkah menempuh jarak fisik 2x
            // lipat dari sebelumnya - jadi diturunkan supaya jangkauannya
            // tetap lebih jauh dari default (16) tanpa boros performa.
            // Dinaikkan ke nilai maksimum slider (24 -> 32): ray hemisphere
            // tiap pixel jalan lebih jauh sebelum berhenti, supaya di
            // ruangan besar sinar benar-benar sampai ke dinding jauh alih-
            // alih berhenti di tengah jalan dan dianggap "lolos ke langit".
            #define GI_TRACE_STEPS 32 //[8 12 16 20 24 32]
                // Max DDA steps per ray (voxels). Longer traces reach the far
                // side of bigger rooms before escaping to open space.
            // ("bounce ke segala arah, jangan ada batasan" fix): dinaikkan
            // dari 0.60 supaya hasil akhir didominasi teknik ray-trace
            // hemisphere (yang benar-benar nembak ke segala arah dan sadar
            // bentuk ruangan), bukan sampel titik-tunggal lama yang kurang
            // "nyebar".
            // ("noise di layar masih kelihatan" fix): diturunkan dari 0.90
            // ke 0.75 - giTraceSample (hasil ray trace) adalah SUMBER
            // noise-nya (cuma GI_RAYS_PER_PIXEL sampel, nggak ada blur/
            // temporal accumulation di atasnya), sedangkan wsrcSample
            // (sampel voxel yang di-blur, GI_BLUR_STRENGTH) sudah halus
            // total. Menurunkan blend ini berarti hasil akhir lebih banyak
            // "ditarik" ke arah sampel yang halus itu, jadi noise-nya
            // langsung berkurang kelihatan - trade-off: bounce sedikit
            // kurang "sadar bentuk ruangan" (room-aware) dibanding 0.90.
            // ("bounce bocor tembus dinding 1 block" fix): dinaikkan lagi ke
            // 0.85 - sampel WSRC yang di-blur (trilinear) tidak tahu keberadaan
            // dinding tipis dan bisa menarik radiance dari sisi luar/ruangan
            // sebelah, sedangkan ray-trace DDA selalu berhenti di voxel solid.
            // Dengan ray-trace yang dominan, kebocoran lewat dinding 1 block
            // berkurang signifikan.
            #define GI_RAY_BLEND 0.9 //[0.0 0.25 0.4 0.5 0.6 0.7 0.75 0.8 0.9 1.0]
                // Blend between the ray-traced bounce (accurate, all-direction,
                // blob-free) and the old smooth single-point voxel sample
                // (keeps a broad, soft base bounce). 1.0 = pure ray tracing.
            #define GI_SKY_AMBIENT 0.18 //[0.0 0.05 0.10 0.15 0.18 0.20 0.25 0.30]
                // Flat ambient term added per ray that escapes into open sky,
                // so open outdoor areas keep a broad bounce. Sun/sky DIRECT
                // light is applied separately and is unaffected.

            // Temporal accumulation: instead of throwing away every voxel's
            // bounced light at the start of each frame and rebuilding it
            // from scratch, a decayed copy of last frame's fully-propagated
            // result is fed back in as a head start before this frame's
            // bounce passes run (see prepare.glsl injection + the
            // GI_IS_LAST_PASS block in giPropagateBody.glsl). Over several
            // frames this lets light effectively keep bouncing far beyond
            // GI_BOUNCE_PASSES's single-frame budget, converging to a
            // richer, smoother result the way multi-bounce path-traced
            // shaders (SEUS PTGI, Kappa, Photon) look, instead of resetting
            // to a flatter result every single frame.
            #define GI_TEMPORAL_ACCUM 1 //[0 1]
            // How much of last frame's result survives into this frame.
            // Higher = more bounces accumulate over time (smoother, richer,
            // but reacts slower to fast light changes like a torch being
            // placed/removed or the sun's angle changing). Lower = closer to
            // the old single-frame-only behavior.
            #define GI_TEMPORAL_ACCUM_DECAY 0.93 //[0.0 0.10 0.20 0.30 0.40 0.50 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.93 0.95]

            // ---------------------------------------------------------------
            // Irradiance Cache System (Lumen-Style)
            // ---------------------------------------------------------------
            // Replaces stochastic path tracing with probe-based irradiance
            // caching for noise-free, faster GI. Uses the existing voxel
            // radiance grid as World Space Radiance Cache (WSRC) and adds
            // Screen Space Radiance Cache (SSRC) probes at reduced resolution.
            #define IC_SCREEN_SCALE 4 //[2 3 4 5 6 8]
                // SSRC probe resolution divisor. 4 = 1/4 per axis = 1/16 area.
            #define IC_WORLD_BLUR 8 //[2 3 4 5 6 8 10]
                // Tangent-plane blur radius on WSRC samples (voxel units).
            // Dinaikkan dari 4 -> 6: probe screen-space cache nembak lebih
            // banyak ray ke world-space radiance cache, jadi hasil color-
            // bleed (termasuk warna hijau rumput mantul ke batang pohon di
            // dekatnya) lebih presisi & noise-nya lebih rendah - karakter
            // makin mendekati path-traced probe system yang sebenarnya.
            #define IC_RAYS_PER_PROBE 6 //[1 2 3 4 5 6 8]
                // Rays cast per SSRC probe into the WSRC.
            #define IC_TRACE_STEPS 12 //[4 6 8 10 12 16]
                // DDA steps per SSRC probe ray.
            #define IC_FIREFLY_CLAMP 2.5 //[1.0 1.5 2.0 2.5 3.0 4.0]
                // Maximum radiance value from any cache sample.
            #define GI_EDGE_FADE 48
                // Voxel distance from the grid boundary over which the WSRC
                // radiance fades smoothly to zero. Prevents the hard "shadow
                // ring" that follows the player at the edge of the voxel
                // volume (outside it there is simply no data). Higher values
                // make the fade more gradual so the border is less visible.

            // Contact AO (screen-space ambient occlusion)
            #define CONTACT_AO_ENABLED 1 //[0 1]
            #define CONTACT_AO_RADIUS 1.5 //[0.5 1.0 1.5 2.0 2.5 3.0]
                // World-space radius for AO sampling.
            #define CONTACT_AO_SAMPLES 4 //[2 3 4 6 8]
                // Number of AO samples per pixel.
            #define CONTACT_AO_INTENSITY 0.7 //[0.3 0.5 0.7 0.9 1.0]
                // AO darkening strength (0 = no AO, 1 = full black).
        #endif

        #if COLORED_LIGHTING_INTERNAL > 0
            #define COLORED_LIGHT_SATURATION 105 //[50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125]
            #define ACT_BLOCKLIGHT_BRIGHTNESS 0.28 //[0.05 0.08 0.10 0.13 0.16 0.20 0.24 0.28 0.32 0.36 0.40]

            // Directional block/torch light shading (see DoLighting() in
            // mainLighting.glsl, "Directional block light shading" block).
            // Without this, block light only ever comes from the flat
            // per-vertex lightmap.x value, so a torch lights every face of a
            // nearby block equally regardless of which way it's facing -
            // it reads as a flat brightness wash rather than an actual point
            // light sitting in the world. This estimates the local light
            // gradient from the existing colored-light flood-fill volume
            // (the direction brightness increases fastest) and treats that
            // as the direction toward the light source, then shades each
            // surface by how much it faces that direction - so the block
            // side closest to the torch is brightest and the side facing
            // away falls off, like real point-light falloff.
            #define BLOCKLIGHT_NORMAL_SHADING 1 //[0 1]
            // How strongly the normal-based falloff darkens faces angled
            // away from the light. 0.0 = old flat behavior, 1.0 = full
            // point-light-style falloff (faces fully away get near-dark).
            #define BLOCKLIGHT_NORMAL_STRENGTH 0.65 //[0.0 0.15 0.3 0.45 0.6 0.65 0.8 1.0]
            // Blends the voxel light flood-fill from a smooth averaged spread (0)
            // towards a directional, blocky "light shaft" propagation (100) similar
            // to Rethinking Voxels, so light shot through an opening (e.g. a single
            // lamp block in a ceiling) keeps a straight, geometric column/box shape
            // instead of smoothing out sideways into a round blob. Lightweight: it
            // only changes how the existing flood-fill combines neighbors, no extra passes.
            // NOTE: this line lives inside the shared "COLORED_LIGHTING_INTERNAL > 0" block,
            // which is true on ALL FOUR profiles (Low=128, Standard=192, Ultra=256, Cinematic=384),
            // so this is active on every profile automatically, not just the higher tiers.
            #define VOXEL_LIGHT_SHAFT_STYLE 30 //[0 10 20 30 40 50 55 60 70 80 90 100]

            // Block-Light Point Shadows: complements the flood-fill above
            // with real per-source shadow rays (see blockLightPointShadows.glsl,
            // "Block-Light Point Shadows" in mainLighting.glsl). The
            // flood-fill spreads/averages every torch/lamp's light through
            // open voxels one diffusion step per frame, so two lamps in the
            // same room blend into a single soft blob with no hard shadow
            // between them. This instead searches the SAME voxel grid
            // directly around the shading point for actual light-emitting
            // voxels and fires a real DDA visibility ray at each one found,
            // so two lamps stay two distinct light pools (and a wall
            // between a lamp and the surface actually casts a shadow)
            // instead of averaging away. Off by default: it's an add-on on
            // top of an already-working system, and the extra shadow rays
            // cost more than the flood-fill alone.
            #define BLOCKLIGHT_POINT_SHADOWS 0 //[0 1]
            // Search radius (in blocks) around the shading point to look
            // for light-emitting voxels in.
            #define BLOCKLIGHT_POINT_SHADOWS_RADIUS 10 //[4 6 8 10 12 14 16 20 24]
            // Max distinct light sources shadow-rayed per shaded pixel.
            #define BLOCKLIGHT_POINT_SHADOWS_MAX 3 //[1 2 3 4 5 6]
            // Stochastic search taps per pixel per frame used to find those
            // sources - the search itself is temporally dithered (like this
            // pack's other stochastic rays), so a low tap count still finds
            // every real nearby light within a few frames once TAA converges.
            #define BLOCKLIGHT_POINT_SHADOWS_PROBES 8 //[4 6 8 10 12 16 20 24]
            // Overall brightness multiplier for this contribution.
            #define BLOCKLIGHT_POINT_SHADOWS_I 1.0 //[0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0]

            #define COLORED_LIGHT_FOG
            #define COLORED_LIGHT_FOG_I 0.35 //[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]

            #if WORLD_SPACE_REFLECTIONS > 0
                #define WORLD_SPACE_REFLECTIONS_INTERNAL 1
                #define WORLD_SPACE_PLAYER_REF 1 //[-1 1]
            #else
                #define WORLD_SPACE_REFLECTIONS_INTERNAL -1
            #endif
            #define WORLD_SPACE_REF_MODE 2 //[1 2]
            #define PORTAL_EDGE_EFFECT
            #ifndef IRIS_HAS_CONNECTED_TEXTURES
                #define CONNECTED_GLASS_EFFECT
            #endif
        #else
            #define WORLD_SPACE_REFLECTIONS_INTERNAL -1
        #endif
    #else
        #define COLORED_LIGHTING_INTERNAL 0
        #define WORLD_SPACE_REFLECTIONS_INTERNAL -1
    #endif

    #define WATER_STYLE_DEFINE 3 //[-1 1 2 3]
    #define WATER_CAUSTIC_STYLE_DEFINE 3 //[-1 1 3]
    #define WATER_CAUSTIC_INTENSITY 75 //[0 25 50 75 100 125 150 175 200 250 300]
    #define WATER_REFRACTION_INTENSITY 1.0 //[0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0]
    #define WATER_FOAM_I 100 //[0 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]
    #define WATER_ALPHA_MULT 60 //[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 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900]
    // Diturunkan dari 200 -> 130: fog underwater 2x lipat sebelumnya bikin
    // warna air (hijau/biru) terasa berat dan kurang jernih di jarak dekat.
    #define WATER_FOG_MULT 130 //[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 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900]
    #define WATERCOLOR_MODE 3 //[3 2 0]
    #define BRIGHT_CAVE_WATER
    // v4.1: Water/underwater tint retuned to match Noble Shaders' physically-based
    // water absorption+scattering look (R40/G17/B15 absorption, R13/G15/B13
    // scattering in Noble -> converted to an equivalent RGB tint multiplier here).
    // G/B diturunkan mendekati netral (100): sebelumnya G=120 B=105 bikin
    // air dangkal/permukaan condong hijau-kebiruan terus-menerus.
    #define WATERCOLOR_R 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 220 240 260 280 300]
    #define WATERCOLOR_G 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 220 240 260 280 300]
    #define WATERCOLOR_B 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 220 240 260 280 300]
    // ("underwater coklat banget" fix): underwaterColorM1 derives from the
    // game's own biome fog color (see WATERCOLOR_MODE>=2 in common.glsl
    // below), which already skews warm from the atmosphere/GI tuning above -
    // these multipliers are the one place left to pull that back toward a
    // clean, cozy blue instead of a murky brown. Lower red, higher blue than
    // before.
    // Dikurangi condong ke netral: R dinaikkan (85->95), G/B diturunkan
    // (130->110, 110->100) supaya pandangan bawah air tidak terlalu
    // hijau/biru pekat.
    #define UNDERWATERCOLOR_R 95 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]
    #define UNDERWATERCOLOR_G 110 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]
    #define UNDERWATERCOLOR_B 100 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]

    // Original Unbound feature: physically-inspired per-channel light
    // absorption through water (see materialMethods/realisticWaterColor.glsl)
    // instead of a single flat tint. Off by default so it's opt-in.
    #define REALISTIC_WATER_COLOR 0 //[0 1]
    // G/B diturunkan lagi dikit (45->40, 25->20) supaya transisi ke warna
    // air dalam makin lambat/jernih, konsisten dengan RW_CLARITY di atas.
    #define RW_ABSORB_R 100 //[10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 180 200 220 250 300 350 400]
    #define RW_ABSORB_G 40 //[10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 180 200 220 250 300 350 400]
    #define RW_ABSORB_B 20 //[10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 180 200 220 250 300 350 400]
    // Dinaikkan lagi dari 150 -> 175: air tetap jernih/warna asli untuk
    // jarak pandang lebih jauh lagi sebelum berangsur ke warna air dalam.
    #define RW_CLARITY 175 //[25 40 55 70 85 100 115 130 150 175 200 250 300 400 500]
    // ("air kelihatan flat", "animasi air tipis" fix): dinaikkan bertahap
    // dari 0.20 -> 0.38 -> 0.55, masih dirasa terlalu tipis oleh user -
    // dinaikkan lebih tegas kali ini.
    #define WATER_BUMPINESS 0.85 //[0.05 0.10 0.15 0.20 0.25 0.30 0.40 0.50 0.65 0.80 1.00 1.25 1.50 2.00 2.50]
    #define WATER_BUMP_SMALL 0.40 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define WATER_BUMP_MED 0.55 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define WATER_BUMP_BIG 0.45 //[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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define WATER_SPEED_MULT 0.75 //[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.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define WATER_SIZE_MULT 120 //[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 220 240 260 280 300]

    // v4.1: Gerstner wave water animation, ported from Noble Shaders
    // (include/fragment/water.glsl, GPLv3) - replaces the flat-map animated
    // normal with real per-pixel procedural waves for WATER_STYLE 2 and 3.
    #define GERSTNER_WAVES // Comment out to fall back to the original texture-based wave normal
    #define WATER_OCTAVES 16 //[2 4 6 8 12 16 24 32]

    // v4.3: MakeUp Ultra Fast water waves, ported from MakeUp Ultra Fast
    // (shaders/lib/water.glsl, LGPLv3) - a cheaper 3-sample texture-scroll
    // wave normal, for when GERSTNER_WAVES's real per-pixel wave math is
    // more than needed. Only takes effect if GERSTNER_WAVES above is
    // commented out (Gerstner takes priority when both are enabled).
    //#define MAKEUP_WATER_WAVES

    // v6.5: IterationVX-style water waves, ported from IterationVX 2.1
    // (Lib/IndividualFounctions/WaterWaves.glsl - base: IterationT 3.2.0 by
    // Tahnass, an edit of Chocapic13's shaders). Multi-octave domain-warped
    // FBM sampled from noisetex instead of analytic Gerstner math - reads
    // as broad, organic rolling-ocean swell rather than Gerstner's sharper
    // directional wave crests. Priority order when several are enabled:
    // GERSTNER_WAVES > MAKEUP_WATER_WAVES > IVX_WATER_WAVES. Comment out
    // GERSTNER_WAVES (and MAKEUP_WATER_WAVES if it's on) above to use this
    // one instead. See lib/materials/materialMethods/ivxWaterWaves.glsl and
    // NOTICE_IVX_WATER_PORT.txt.
    //#define IVX_WATER_WAVES
    #define IVX_WAVE_SCALE 0.05 //[0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.15 0.20 0.30 0.50 0.70 1.00]
    #define IVX_WAVE_HEIGHT 1.2 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 3.0 5.0 7.0 10.0]

    // ("air kelihatan flat", "animasi air tipis" fix): dinaikkan bertahap
    // dari 0.02 -> 0.045 -> 0.07, masih dirasa kurang terasa oleh user -
    // dinaikkan lebih tegas kali ini supaya wave normal Gerstner-nya jelas
    // kelihatan bergelombang di permukaan.
    // Dinaikkan sedikit dari 0.14 -> 0.18 seiring WAVE_AMPLITUDE/STEEPNESS
    // naik, supaya normal map wave-nya ikut lebih terasa/bergelombang.
    #define WATER_NORMALS_STRENGTH 0.18
    #define WATER_NORMALS_STRENGTH_MULTIPLIER 1.0 //[0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.5 3.0 3.5 4.0 4.5 5.0]
    #define WAVE_ANGLE 40.0
    #define WAVE_SPEED 0.1 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0]
    // ("riak air terlalu pekat" fix, v6.5): AMPLITUDE 1.0 + STEEPNESS 4.0
    // (dari skala maks 5.0) dulu bikin gelombang terlalu tinggi & runcing.
    // ("animasi air tipis, nggak kaya ombak" fix): tapi diturunkan terlalu
    // jauh ke 0.6/2.2, lalu 0.9/2.6, masih terasa tipis - dinaikkan lagi ke
    // titik yang lebih jelas berombak tanpa kembali ke steepness ekstrem
    // 4.0 yang bikin terlalu runcing/kontras.
    #define WAVE_AMPLITUDE 1.6 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.5 3.0 3.5 4.0 4.5 5.0]
    #define WAVE_STEEPNESS 3.4 //[1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0 4.2 4.4 4.6 4.8 5.0]
    #define WAVE_LENGTH 5.0 //[0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0]
    #define WAVE_STEEPNESS_MULTIPLIER 0.96
    #define WAVE_AMPLITUDE_MULTIPLIER 0.93
    #define WAVE_LENGTH_MULTIPLIER 0.91
    #define WAVE_TIME_MULTIPLIER 1.07

    #define SHADOW_SMOOTHING 4 //[1 2 3 4]
    // ("semua block jadi refleksi/becek mengkilap" fix): level 2 dulu
    // bikin genangan air melapisi rata SEMUA permukaan datar yang kena
    // hujan tanpa variasi (lihat pFormNoise di gbuffers_terrain.glsl -
    // level 2/4 skip pola noise-nya, jadi full coverage rata). Level 1
    // pakai pola noise byte 3-layer buat bikin genangan cuma muncul di
    // titik-titik/kubangan tertentu (patchy), lebih natural - sebagian
    // block tetap matte/kering, nggak semuanya mengkilap.
    #define RAIN_PUDDLES 1 //[0 1 2 3 4]
    #define SSAO_I 80 //[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 220 240 260 280 300]
    #define VANILLAAO_I 45 //[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 220 240 260 280 300]

    #define SSGI 0 //[0 1]
    #define SSGI_INTENSITY 140 //[0 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 90 100 120 140 160 180 200]
    // FIX (pasal "render lambat"): 21 samples/pixel/frame for a screen-space
    // effect that already gets a strong edge-aware temporal+spatial denoiser
    // downstream (see deferred1.glsl) was redundant work - modern SSGI
    // (the same approach used by real-time screen-space GI in current
    // engines) casts a handful of rays per frame and leans on temporal
    // accumulation to converge, instead of brute-forcing a clean result
    // out of a single frame. Lowered default to 8 samples; the denoiser
    // was strengthened specifically to cover this.
    #define SSGI_SAMPLES 8 //[4 6 8 12 16 21]

    #define AURORA_STYLE_DEFINE -1 //[-1 0 1 2]
    #define AURORA_CONDITION 0 //[0 1 2 3 4]
    #define NIGHT_NEBULAE -1 //[-1 1]
    #define NIGHT_NEBULA_I 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 220 240 260 280 300]
    #define WEATHER_TEX_OPACITY 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 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900]
    #define SPECIAL_BIOME_WEATHER
    #define RAIN_STYLE 1 //[1 2]
    // ("bulan/matahari kotak" fix): style 1 pakai tekstur vanilla
    // sun.png/moon_phases.png yang bentuknya kotak. Dipindah ke style 3 -
    // ini bikin matahari & bulan digambar ulang secara prosedural (bulat,
    // dengan fase bulan/kresen yang halus) alih-alih pakai tekstur kotak
    // bawaan game.
    #define SUN_MOON_STYLE_DEFINE 3 //[-1 1 2 3]
    #define SUN_MOON_HORIZON
    #define SUN_MOON_DURING_RAIN
    #define NIGHT_STAR_AMOUNT 2 //[0 1 2 3 4]
    #define RAINBOWS 1 //[0 1 3]
    #define RAINBOW_STYLE_DEFINE -1 //[-1 1 4]
    #define CLOUD_STYLE_DEFINE 3 //[-1 0 1 3 50]
    #define CLOUD_CLOSED_AREA_CHECK
    // ("posisi awan direndahkan biar naik gunung berasa di atas awan"
    // fix): diturunkan dari 192 -> 140. Puncak gunung di Minecraft modern
    // (1.18+) banyak yang tembus 150-220+, jadi di ketinggian 192 lama
    // susah "menembus" lapisan awan. 140 bikin gunung menengah-tinggi
    // sudah kelihatan berada di atas/sejajar awan - lebih imersif.
    #define CLOUD_ALT1 140 //[-96 -92 -88 -84 -80 -76 -72 -68 -64 -60 -56 -52 -48 -44 -40 -36 -32 -28 -24 -20 -16 -10 -8 -4 0 4 8 12 16 20 22 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 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 510 520 530 540 550 560 570 580 590 600 610 620 630 640 650 660 670 680 690 700 710 720 730 740 750 760 770 780 790 800]
    #define CLOUD_SPEED_MULT 150 //[0 5 7 10 15 20 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 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900]
    #define CLOUD_R 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 220 240 260 280 300]
    #define CLOUD_G 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 220 240 260 280 300]
    #define CLOUD_B 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 220 240 260 280 300]

    // ("awan realistic, ada yang pisah ada yang berkelompok" fix, sesuai
    // referensi foto): 1.10 (di atas baseline) bikin noise field terlalu
    // penuh/rata sehingga awan jadi satu hamparan menerus tanpa celah.
    // Dikembalikan ke 1.00 supaya ada variasi kontras: sebagian area
    // kosong/cerah (awan terpisah-pisah), sebagian menggumpal tebal.
    #define CLOUD_UNBOUND_AMOUNT 1.00 //[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 1.02 1.04 1.06 1.08 1.10 1.12 1.14 1.16 1.18 1.20 1.22 1.24 1.26 1.28 1.30 1.32 1.34 1.36 1.38 1.40 1.42 1.44 1.46 1.48 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 2.10 2.20 2.30 2.40 2.50 2.60 2.70 2.80 2.90 3.00]
    #define CLOUD_UNBOUND_SIZE_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 220 240 260 280 300]
    #define CLOUD_UNBOUND_RAIN_ADD 0.40 //[0.00 0.05 0.06 0.07 0.08 0.09 0.10 0.12 0.14 0.16 0.18 0.22 0.26 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]

    #define DOUBLE_REIM_CLOUDS
    // Ikut diturunkan (288 -> 220) supaya jarak antar 2 lapisan awan tetap
    // proporsional dengan CLOUD_ALT1 di atas.
    #define CLOUD_ALT2 220 //[-96 -92 -88 -84 -80 -76 -72 -68 -64 -60 -56 -52 -48 -44 -40 -36 -32 -28 -24 -20 -16 -10 -8 -4 0 4 8 12 16 20 22 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 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 510 520 530 540 550 560 570 580 590 600 610 620 630 640 650 660 670 680 690 700 710 720 730 740 750 760 770 780 790 800]

    #define NETHER_VIEW_LIMIT 256.0 //[96.0 112.0 128.0 160.0 192.0 224.0 256.0 320.0 384.0 512.0 768.0 1024.0 99999.0]
    #define NETHER_COLOR_MODE 3 //[3 2 0]
    #define NETHER_STORM_LOWER_ALT 28 //[-296 -292 -288 -284 -280 -276 -272 -268 -264 -260 -256 -252 -248 -244 -240 -236 -232 -228 -224 -220 -216 -212 -208 -204 -200 -196 -192 -188 -184 -180 -176 -172 -168 -164 -160 -156 -152 -148 -144 -140 -136 -132 -128 -124 -120 -116 -112 -108 -104 -100 -96 -92 -88 -84 -80 -76 -72 -68 -64 -60 -56 -52 -48 -44 -40 -36 -32 -28 -24 -20 -16 -12 -8 -4 0 4 8 12 16 20 22 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 256 260 264 268 272 276 280 284 288 292 296 300]
    #define NETHER_STORM_HEIGHT 200 //[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 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900]
    #define NETHER_STORM_I 0.40 //[0.05 0.06 0.07 0.08 0.09 0.10 0.12 0.14 0.16 0.18 0.22 0.26 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]

    #define END_BEAM_INTENSITY 1.00 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.80 2.00 2.20 2.40 2.60 2.80 3.00]
    #define END_STAR_INTENSITY 1.00 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.80 2.00 2.20 2.40 2.60 2.80 3.00]
    #define END_BEAM_CENTER_ALT 68 //[-240 -236 -232 -228 -224 -220 -216 -212 -208 -204 -200 -196 -192 -188 -184 -180 -176 -172 -168 -164 -160 -156 -152 -148 -144 -140 -136 -132 -128 -124 -120 -116 -112 -108 -104 -100 -96 -92 -88 -84 -80 -76 -72 -68 -64 -60 -56 -52 -48 -44 -40 -36 -32 -28 -24 -20 -16 -12 -8 -4 0 4 8 12 16 20 22 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 256 260 264 268 272 276 280 284 288 292 296 300]
    #define END_BEAM_HEIGHT 1.00 //[0.10 0.15 0.20 0.25 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.80 2.00]
    #define END_FLASHES

    #define BORDER_FOG
    #define ATM_FOG_MULT 0.05 //[0.50 0.65 0.80 0.95]
    #define ATM_FOG_DISTANCE 130 //[10 15 20 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 220 240 260 280 300]
    #define ATM_FOG_ALTITUDE 63 //[0 5 10 15 20 25 30 35 40 45 50 52 54 56 58 60 61 62 63 64 65 66 67 68 69 70 72 74 76 78 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150 155 160 165 170 175 180 185 190 195 200 210 220 230 240 250 260 270 280 290 300]
    #define LIGHTSHAFT_BEHAVIOUR 1 //[0 1 2 3]
    // ("dappled light lewat celah daun" fix, sesuai referensi foto 3):
    // dinaikkan dari 15 -> 25 supaya berkas cahaya matahari yang nembus
    // celah-celah kanopi/dedaunan lebih kelihatan jelas (efek God-ray /
    // sunbeam yang berbintik-bintik lewat daun), bukan cuma efek halus.
    #define LIGHTSHAFT_DAY_I 25 //[1 3 5 7 10 15 20 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 LIGHTSHAFT_NIGHT_I 10 //[1 3 5 7 10 15 20 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 LIGHTSHAFT_RAIN_I 12 //[1 3 5 7 10 15 20 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 LIGHTSHAFT_SMOKE
    #define SPECIAL_PALE_GARDEN_LIGHTSHAFTS
    #define LIGHTSHAFT_SUNSET_SATURATION 0.05 //[-0.25 -0.20 -0.15 -0.10 -0.05 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50]

    #define BLOOM_ENABLED -1 //[-1 1]
    #define BLOOM_STRENGTH 0.020 //[0.027 0.036 0.045 0.054 0.063 0.072 0.081 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.21 0.23 0.25 0.28 0.32 10.00]
    // How bright the soft halo/corona around the sun and moon is. Lowered
    // from this pack's previous fixed 0.7 multiplier by default so the sky
    // right around the sun stays readable instead of blowing out to a flat
    // white patch - the sun should still look bright, just not clipped.
    #define SKY_GLARE_STRENGTH 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.80 0.90 1.00]
    #define IMAGE_SHARPENING 4 //[0 1 2 3 4 5 6 7 8 9 10]
    #define MOTION_BLUR_EFFECT -1 //[-1 1]
    #define MOTION_BLURRING_STRENGTH 1.00 //[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 AUTO_EXPOSURE -1 //[-1 1]
    #define AUTO_EXPOSURE_STRENGTH 0.20 //[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]
    #define EYE_ADAPTATION -1 //[-1 1] // Simulates the eye/pupil gradually re-adjusting brightness when moving between dark and bright areas
    #define EYE_ADAPTATION_STRENGTH 0.20 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70]

    // Real scene-luminance auto exposure (see composite5.glsl, "Scene auto
    // exposure" block). Different from AUTO_EXPOSURE above (which only
    // reacts to staring straight at the sun) and EYE_ADAPTATION above
    // (which only reacts to Minecraft's own blocky light-level value at the
    // player's feet): this one actually measures how bright the rendered
    // frame is - so looking up at open sky/a bright window dims down, and
    // looking into a dark cave/shadowed corner brightens up, regardless of
    // what light level the player happens to be standing in.
    // Reads a persistent 1x1 image that remembers last frame's result, and
    // eases toward the new target instead of snapping to it, so the effect
    // is gradual rather than an instant, jarring jump.
    // ("ruangan gelap banyak lampu masih tetap gelap" fix): diaktifkan
    // (0 -> 1). Ini yang benar-benar mengukur seberapa terang frame yang
    // dirender, jadi ruangan gelap/sudut shadow ikut dikoreksi naik
    // walau lampu di sana sudah banyak tapi masih terbaca gelap secara
    // keseluruhan.
    #define SCENE_AUTO_EXPOSURE 1 //[0 1]
    // Dinaikkan dikit dari 0.15 -> 0.20 supaya efeknya kerasa, tapi masih
    // jauh dari 1.0 (koreksi penuh) jadi tetap halus/tidak agresif -
    // MIN/MAX clamp di bawah juga membatasi seberapa jauh koreksinya bisa
    // pergi.
    #define SCENE_AUTO_EXPOSURE_STRENGTH 0.20 //[0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.60 0.70 0.80 0.90 1.00]
    // Adaptation speed: how much of the way toward the new target the
    // exposure moves each frame. Lower = slower/smoother/less noticeable,
    // higher = snappier. Intentionally slow-ish by default (multi-second
    // fade) so it never reads as a sudden flash/dimming.
    #define SCENE_AUTO_EXPOSURE_SPEED 0.01 //[0.005 0.01 0.015 0.02 0.03 0.04 0.05 0.07 0.10 0.15]
    // Hard clamp on the final multiplier so it can never over-brighten a
    // pitch-black view or over-darken a blown-out one to an unnatural degree.
    #define SCENE_AUTO_EXPOSURE_MIN 0.60 //[0.40 0.50 0.60 0.65 0.70 0.75 0.80]
    #define SCENE_AUTO_EXPOSURE_MAX 1.35 //[1.20 1.30 1.35 1.40 1.45 1.60 1.80 2.00]
    #define CHROMA_ABERRATION 0 //[0 1 2 3 4 5 6 7 8]
    #define UNDERWATER_DISTORTION
    #define LENSFLARE_MODE 0 //[0 1 2]
    #define LENSFLARE_I 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00]
    #define DISTANT_LIGHT_BOKEH

    #define TAA_MODE 1 //[0 1]
    #define TAA_SMOOTHING 4 //[2 3 4]
    #define TAA_JITTER 1 //[0 1 2 3]
    #define TAA_MOVEMENT_IMPROVEMENT_FILTER 1 //[0 1]
    #define FXAA_TAA_INTERACTION 10 //[0 2 4 6 8 10]
    #define FXAA_STRENGTH 75 //[-1 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100]

    #define WORLD_BLUR 0 //[0 1 2]
    #define WB_DOF_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]
    #define WB_DOF_FOCUS 0 //[-1 0 1 2 3 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 65 67 69 72 74 76 79 81 83 86 88 91 94 96 99 102 104 107 110 113 115 118 121 124 127 130 133 136 140 143 146 149 153 156 160 163 167 170 174 178 182 185 189 193 197 201 206 210 214 219 223 227 232 237 242 246 251 256 261 267 272 277 283 288 294 300 306 312 318 324 330 337 344 350 357 364 371 379 386 394 402 410 418 427 435 444 453 462 472 481 491 501 512 530 550 575 600 625 650 675 700 725 750 800 850 900]
    #define WB_DB_DAY_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]
    #define WB_DB_NIGHT_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]
    #define WB_DB_RAIN_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]
    #define WB_DB_WATER_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]
    #define WB_DB_NETHER_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]
    #define WB_DB_END_I 64.0 //[1.0 1.5 2.0 3.0 4.5 6.0 9.0 12.0 18.0 24.0 32.0 48.0 64.0 96.0 128.0 192.0 256.0 384.0 512.0 768.0 1024.0 1536.0 2048.0 3072.0 4096.0]

    #define GENERATED_NORMAL_MULT 70 //[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 COATED_TEXTURE_MULT 70 //[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 GENERATED_NORMAL_RES 64 //[16 32 64 80 96 112 128 144 160 176 192 208 224 240 256 320 384 448 512]
    #define ENTITY_GN_AND_CT

    #define GLOWING_ORE_MASTER 0 //[0 1 2]
    // Diturunkan dari 0.80 -> 0.60: nilai ini men-"boost" tekstur block
    // bercahaya (termasuk obor/lampu, bukan cuma ore) lewat pow(color,
    // GLOWING_ORE_MULT) - karena eksponennya <1, makin kecil GLOWING_ORE_MULT
    // makin kuat efek pencerahannya, jadi diturunkan supaya block itu
    // sendiri nggak washed-out putih, sementara cahaya yang dipancarkan ke
    // sekitarnya (diatur lewat GI_EMISSIVE_INTENSITY/GI_EMISSIVE_BLOCKS di
    // atas) tetap penuh.
    #define GLOWING_ORE_MULT 0.60 //[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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #if GLOWING_ORE_MASTER == 2 || SHADER_STYLE == 4 && GLOWING_ORE_MASTER == 1
        #define GLOWING_ORE_IRON
        #define GLOWING_ORE_GOLD
        #define GLOWING_ORE_COPPER
        #define GLOWING_ORE_REDSTONE
        #define GLOWING_ORE_LAPIS
        #define GLOWING_ORE_EMERALD
        #define GLOWING_ORE_DIAMOND
        #define GLOWING_ORE_NETHERQUARTZ
        #define GLOWING_ORE_NETHERGOLD
        #define GLOWING_ORE_GILDEDBLACKSTONE
        #define GLOWING_ORE_ANCIENTDEBRIS
        #define GLOWING_ORE_MODDED
    #endif

    #define GLOWING_AMETHYST 1 //[0 1 2]
    #define GLOWING_LICHEN 2 //[0 1 2]

    #define IPBR_EMISSIVE_MODE 1 //[1 3 2]

    #define NORMAL_MAP_STRENGTH 100 //[0 10 15 20 30 40 60 80 100 120 140 160 180 200]
    #define CUSTOM_EMISSION_INTENSITY 120 //[0 5 7 10 15 20 25 30 35 40 45 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 225 250]
    #define POM_DEPTH 0.80 //[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 POM_QUALITY 64 //[16 32 64 128 256 512]
    #define POM_DISTANCE 24 //[16 24 32 48 64 128 256 512 1024]
    #define POM_LIGHTING_MODE 2 //[1 2]
    #define DIRECTIONAL_BLOCKLIGHT 0 //[0 3 7 11]

    // Dinaikkan lagi dari 55 -> 75: masih dirasa terlalu gelap total di
    // ruangan/area tanpa sumber cahaya langsung, terutama malam hari.
    #define CAVE_LIGHTING 75 //[0 5 7 10 15 20 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 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900 950 1000 1100 1200 1300 1400 1500 1600]
    #define HELD_LIGHTING_MODE 2 //[0 1 2]
    #define BLOCKLIGHT_FLICKERING 2 //[0 2 3 4 5 6 7 8 9 10]
    // ("ambient/atmosphere kecoklatan" fix): 130% was over-amplifying ambient
    // light on top of the (also warm-leaning) block/sky light colors below,
    // compounding into an overall brownish wash. 110% keeps ambient areas
    // readable without exaggerating that tint.
    #define AMBIENT_MULT 110 //[50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150 160 170 180 190 200 220 240 260 280 300]
    #define PLAYER_SHADOW 1 //[-1 1]

    #define WAVING_SPEED 1.15 //[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.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define WAVING_I 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 50.0]
    #define WAVING_I_RAIN_MULT 100 //[25 50 75 100 125 150 175 200]

    // ("animasi air masih tipis" fix, round 2): semua tuning sebelumnya
    // (WATER_NORMALS_STRENGTH, WATER_BUMPINESS, WAVE_AMPLITUDE dst. di atas)
    // hanya memengaruhi normal-map/shading air, BUKAN gerakan fisik
    // permukaannya. Gerakan naik-turun aktual air diatur oleh DoWave_Water()
    // di materialMethods/wavingBlocks.glsl, yang sebelumnya belum pernah
    // disesuaikan - amplitudonya sangat kecil (~0.1 blok). Dua define di
    // bawah ini mengontrol kekuatan (STRENGTH) dan kerapatan pola gelombang
    // (TIGHTNESS, makin tinggi = riak makin rapat/ketat) dari gerakan fisik
    // tersebut supaya wave-nya benar-benar terlihat bergerak, bukan cuma
    // berkilau.
    #define WATER_WAVE_STRENGTH 1.8 //[0.5 0.75 1.0 1.25 1.5 1.75 2.0 2.25 2.5 2.75 3.0 3.5 4.0]
    #define WATER_WAVE_TIGHTNESS 20.0 //[8.0 10.0 12.0 14.0 16.0 18.0 20.0 22.0 24.0 26.0 28.0 30.0 32.0]
    // ("block airnya jangan gerak, cukup gelombangnya aja" fix): baris ini
    // dimatikan (di-comment). Ini yang menggerakkan mesh air naik-turun
    // secara fisik (lewat DoWave_Water()). Efek gelombang/riak visual di
    // permukaan (dari WATER_NORMALS_STRENGTH, WAVE_AMPLITUDE/STEEPNESS di
    // atas, dan normal-map shading) tetap jalan seperti biasa karena itu
    // sistem terpisah - jadi air masih kelihatan "hidup"/berkilau
    // berombak, tapi block air itu sendiri diam, tidak naik-turun.
    // #define WAVING_WATER_VERTEX
    #define WAVING_RAIN

    #define SPECIAL_PORTAL_EFFECTS
    #define REFLECTION_RES 1.0 //[1.0 0.5]

    #define SUN_ANGLE -1 //[-1 0 -20 -30 -40 -50 -60 60 50 40 30 20]

    #define SELECT_OUTLINE 0 //[0 1 3 4 2]
    #define SELECT_OUTLINE_I 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.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define SELECT_OUTLINE_R 1.35 //[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 SELECT_OUTLINE_G 0.35 //[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 SELECT_OUTLINE_B 1.75 //[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 WORLD_OUTLINE_THICKNESS 1 //[1 2 3 4]
    #define WORLD_OUTLINE_I 1.50 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00]
    #define WORLD_OUTLINE_ON_ENTITIES
    #define DARK_OUTLINE_THICKNESS 1 //[1 2]

    #define HAND_SWAYING 1 //[0 1 2 3]
    #define SHOW_LIGHT_LEVEL 0 //[0 1 2 3]
    #define REDUCE_CLOSE_PARTICLES
    #define LESS_LAVA_FOG

    #define MOON_PHASE_INF_LIGHT
    #define MOON_PHASE_INF_REFLECTION
    #define MOON_PHASE_FULL 1.00 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define MOON_PHASE_PARTIAL 0.85 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define MOON_PHASE_DARK 0.60 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]

    #define PIXEL_SCALE 1 //[-2 -1 1 2 3 4 5]

    // ("cahaya tegas, vivid, warm, tajam - mirip shader Voyager" request):
    // exposure & contrast raised for a punchier, more decisive look.
    #define TM_EXPOSURE 1.00 //[0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.89 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.10 2.20 2.30 2.40 2.50 2.60 2.70 2.80]
    // ("terlalu kontras/shadow gelap" fix): 1.10 pushed the pre-ACES gamma up,
    // which crushes shadow detail toward black before the curve even runs.
    // 1.00 is neutral - still has the ACES curve's own filmic shape, just
    // without an extra contrast boost stacked on top of it.
    #define TM_CONTRAST 1.15 //[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 TONEMAP_STYLE 1 //[0 1 2] // 0 = Lottes (classic Unbound curve), 1 = ACES Filmic (industry-standard film tonemap), 2 = Filmic Highlights/Shadows (Hable/Uncharted2-style curve with separate highlight & shadow rolloff controls)
    #define TM_FILMIC_HIGHLIGHTS 0.40 //[0.10 0.14 0.18 0.22 0.26 0.30 0.34 0.38 0.40 0.42 0.46 0.50] // Only used by TONEMAP_STYLE 2. Lower = highlights roll off/desaturate sooner (more "filmic"), higher = punchier highlights
    #define TM_FILMIC_SHADOWS 0.34 //[0.05 0.08 0.11 0.14 0.17 0.20 0.23 0.25 0.28 0.31 0.34 0.37 0.40] // Only used by TONEMAP_STYLE 2. Lower = deeper/darker shadows, higher = lifted/milkier shadows
    // Turun dikit dari 1.35 -> 1.20 (nilai puluhan diturunkan sedikit)
    // supaya warna nggak terlalu jenuh/vivid, masih tetap hidup tapi lebih
    // natural.
    #define T_SATURATION 1.10 //[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]
    // Turun sepasang dengan T_SATURATION supaya konsisten (1.30 -> 1.15).
    #define T_VIBRANCE 1.05 //[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 HIGHLIGHT_SATURATION_ROLLOFF 30 //[0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100]

    // --- Selective (per-hue) color grading, ported from Photon Shaders ---
    // (see shaders/lib/colors/selectiveColorGrade.glsl + NOTICE_PHOTON_GRADE_PORT.txt).
    // Unlike T_SATURATION/T_VIBRANCE above (which push saturation globally),
    // these isolate a hue band and only push/shift THAT band, so e.g. teal
    // can be pulled down to fight a "too blue-green" look without touching
    // orange torchlight or anything else.
    #define SELECTIVE_COLOR_GRADE 1 //[0 1]
    // ("cahaya matahari vivid/tidak warm oranye" fix): 0.05 -> 0.00 supaya
    // tidak ada dorongan saturasi ekstra pada hue oranye sinar matahari.
    #define SELECTIVE_GRADE_ORANGE 0.00 //[-0.50 -0.40 -0.30 -0.20 -0.10 0.00 0.05 0.08 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50]
    // Negative by default: reins in the blue/teal cast (shadows, water, sky bleed)
    // called out repeatedly for this pack, without desaturating oranges/greens.
    #define SELECTIVE_GRADE_TEAL -0.08 //[-0.50 -0.40 -0.30 -0.25 -0.20 -0.15 -0.12 -0.10 -0.05 0.00 0.10 0.20 0.30 0.40 0.50]
    #define SELECTIVE_GRADE_GREEN_SAT 0.00 //[-0.50 -0.40 -0.30 -0.20 -0.10 0.00 0.05 0.10 0.12 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50]
    // Negative = shift green toward yellow/lime (e.g. matching a fresh #7be028-style
    // grass), positive = shift toward cyan. Degrees.
    #define SELECTIVE_GRADE_GREEN_HUE_SHIFT -2.0 //[-8.0 -7.0 -6.0 -5.0 -4.0 -3.0 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0]
    #define SELECTIVE_GRADE_GAIN 0.8 //[0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0] // final gentle S-curve polish, 0 = off

    #define VIGNETTE 0 //[0 1]
    #define VIGNETTE_INTENSITY 1.00 //[0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]

    // Cinematic letterbox/pillarbox border - crops the visible frame down to
    // a fixed aspect ratio (16:9 by default) by drawing solid black bars,
    // like a movie's aspect-ratio mask. Purely a final.glsl post-process
    // (one comparison against texCoord per pixel), so the cost is
    // negligible - it does NOT change render resolution or any lighting
    // pass, it just masks the already-rendered frame.
    #define CINEMATIC_BORDER 0 //[0 1]
    // Target width:height, expressed as width/height. 1.778 = 16:9. Common
    // alternatives: 2.35 (anamorphic widescreen), 1.85 (theatrical flat).
    #define CINEMATIC_BORDER_RATIO 1.778 //[1.778 1.85 2.00 2.20 2.35 2.40]
    // Soft-edges the bar boundary over this many pixels instead of a hard
    // cut, so it doesn't look like a screenshot glitch.
    #define CINEMATIC_BORDER_FEATHER 1.5 //[0.0 1.0 1.5 2.0 3.0 4.0 6.0 8.0]

    // Higher = duller/more neutral (less "colorful") shadows instead of dark
    // areas reading as saturated/vivid, which is part of what made the dark
    // half of the image feel too "in your face" rather than receding
    // naturally like in a photo.
    // ("shadow gelap banget" fix): 0.15 was greying out shadow colors on top
    // of the ACES toe already darkening them - lowered so shadows stay dark
    // but keep their actual hue instead of reading as flat black/grey.
    #define TM_DARK_DESATURATION 0.05 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00]
    #define TM_WHITE_PATH 0.90 //[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]
    // "HDR headroom" - how many stops of over-bright scene luminance (sun,
    // lava close-up, bright emissives etc) the tonemapper is allowed to
    // render as gradually-brighter-but-not-yet-clipped-white before the
    // Path to White curve above forces it fully to white. The render
    // pipeline is already true HDR internally (colortex0 is a floating-point
    // R11F_G11F_B10F buffer with no 0-1 clamp - see pipelineSettings.glsl),
    // this just controls how much of that headroom survives the final
    // tonemap instead of being compressed away. Higher = brighter
    // highlights keep more color/detail before clipping to flat white
    // (more "HDR-monitor-like" punch); lower = closer to the old flatter
    // default look.
    #define TM_HDR_HEADROOM 16.0 //[8.0 10.0 12.0 14.0 16.0 20.0 24.0 28.0 32.0]
    // Manual display gamma, applied last (after the tone curve above already
    // did its own linear->display gamma encode via LinearToRGB). This is NOT
    // a second/duplicate color-science gamma - it's a small final calibration
    // knob for the player's own monitor (same idea as the "Gamma" slider in
    // a game's video settings), independent of TM_EXPOSURE/TM_CONTRAST which
    // shape the tone curve itself. 1.00 = no change.
    #define MANUAL_GAMMA 1.05 //[0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30]
    #define COLORGRADING
    #define GR_RR 88 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_RG 4 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_RB 8 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_RC 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define GR_GR 8 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_GG 90 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_GB 2 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_GC 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]
    #define GR_BR 2 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_BG 4 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_BB 92 //[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 108 116 124 132 140 148 156 164 172 180 188 196 200 212 224 236 248 260 272 284 296 300 316 332 348 364 380 396 400 424 448 472 496 500]
    #define GR_BC 1.00 //[0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.20 2.40 2.60 2.80 3.00 3.25 3.50 3.75 4.00 4.50 5.00]

    // 3D LUT (ported from Noble Shaders, GPLv3). 0 = off. Applied as the very
    // last step, after the channel-mixer color grading and custom shadow/midtone
    // grade above, like a "film print" pass on top of everything else.
    #define LUT 0 //[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
    // ("LUT nyakitin mata" fix): ApplyLUT() used to fully REPLACE the color
    // (100% strength, no blend) whenever a LUT was picked, which is exactly
    // what makes a LUT grade feel like it's fighting the rest of the pipeline
    // (its own ACES curve, the warm-midtone grade, etc.) instead of sitting
    // on top of it gently. This blends the graded result back with the
    // pre-LUT color instead of a hard swap. 100 = old fully-replace behavior.
    #define LUT_STRENGTH 60 //[10 20 30 40 50 60 70 80 90 100]

    #define LIGHT_COLOR_MULTS
    #define ATM_COLOR_MULTS
    #define LIGHT_MORNING_R 0.97 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_MORNING_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_MORNING_B 1.03 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_MORNING_I 0.56 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_MORNING_R 0.95 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_MORNING_G 0.80 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_MORNING_B 0.55 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_MORNING_I 0.55 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    // ("cahaya matahari vivid/tidak warm oranye" fix): R diturunkan ke
    // netral, B dinaikkan sedikit supaya sinar matahari siang jadi putih
    // bersih/vivid yang menyegarkan, bukan keemasan/hangat oranye.
    #define LIGHT_NOON_R 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NOON_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NOON_B 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NOON_I 0.75 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]

    // --- Physically-inspired dynamic sun color (Blackbody Kelvin + Rayleigh-style extinction) ---
    // Replaces the old fixed-2-color linear blend with a continuous color-temperature curve.
    #define SUN_KELVIN_NOON 6500 //[5000 5500 6000 6500 7000 7500 8000 8500 9000 9500 10000]
    #define SUN_KELVIN_SUNSET 5500 //[1500 1700 1900 2100 2300 2500 2700 2900 3100 3300 3500 3700 3900 4000 4500 5000 5500]
    #define RAYLEIGH_MIE_STRENGTH 0.60 //[0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.65 0.70 0.80 0.90 1.00 1.25 1.50 1.75 2.00 2.25 2.50]
    #define ATM_NOON_R 0.90 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NOON_G 0.90 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NOON_B 0.95 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NOON_I 0.70 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NIGHT_R 0.40 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NIGHT_G 0.62 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NIGHT_B 1.30 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    // Dinaikkan dari 0.12 -> 0.25: sebelumnya cahaya bulan/langit malam
    // cuma 12% dari baseline, jadi malam hari kelihatan hitam pekat tanpa
    // cahaya bulan sama sekali. 25% masih tetap gelap/mood malam tapi ada
    // cahaya bulan yang benar-benar kelihatan.
    #define LIGHT_NIGHT_I 0.25 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NIGHT_R 0.35 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NIGHT_G 0.55 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NIGHT_B 1.50 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    // Dinaikkan dari 0.12 -> 0.25, sepasang dengan LIGHT_NIGHT_I di atas -
    // ini yang atur seberapa terang langit/atmosfer malam secara umum.
    #define ATM_NIGHT_I 0.25 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_RAIN_R 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_RAIN_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_RAIN_B 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_RAIN_I 0.75 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_RAIN_R 0.95 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_RAIN_G 1.10 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_RAIN_B 1.10 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_RAIN_I 0.80 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NETHER_R 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NETHER_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NETHER_B 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_NETHER_I 0.70 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NETHER_R 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NETHER_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NETHER_B 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_NETHER_I 0.70 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_END_R 1.05 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_END_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_END_B 0.90 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define LIGHT_END_I 1.00 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_END_R 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_END_G 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_END_B 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define ATM_END_I 1.00 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]

    // ("torch cuma putih, nggak warm oren-putih" fix): sebelumnya
    // 1.10/1.05/1.00 nyaris rata di ketiga channel, jadi menetralkan
    // sebagian besar warna oren dasarnya. Kontras R>G>B diperbesar biar
    // torch/blocklight kembali kelihatan oren-putih hangat.
    #define XLIGHT_R 1.20 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define XLIGHT_G 0.95 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define XLIGHT_B 0.50 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    // Dinaikkan dari 0.80 -> 1.00: torch/blocklight secara keseluruhan
    // kurang terang, ruangan dengan torch di malam hari masih gelap total.
    #define XLIGHT_I 1.00 //[0.01 0.03 0.05 0.07 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    #define XLIGHT_CURVE 2.20 //[0.20 0.25 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.80 2.00 2.20 2.40 2.60 2.80 3.00]

    // v4.1: Torch/blocklight radius+falloff shape ported from Noble Shaders'
    // getBlocklightFalloff() - changes how far/large torches and other glowing
    // blocks visually reach without changing overall brightness. See mainLighting.glsl.
    #define NOBLE_BLOCKLIGHT_FALLOFF

    #define IMPROVED_RAIN_DEFINE 1 //[0 1]

//Internal Settings//
    #define SIDE_SHADOWING
    #define SHADOW_FILTERING

    #define GLASS_OPACITY 0.12

    #define DIRECTIONAL_SHADING

    #define ATMOSPHERIC_FOG
    #define BLOOM_FOG

    #define GLOWING_ENTITY_FIX
    #define FLICKERING_FIX

    #define SHADOW_FRUSTUM_FIT

//Extensions//

//Information//
    #define info0 0 //[0]
    #define info1 0 //[0]
    #define info2 0 //[0]
    #define info3 0 //[0]
    #define info4 0 //[0]
    #define info5 0 //[0]
    #define info6 0 //[0]
    #define info7 0 //[0]
    #define info8 0 //[0]
    #define info9 0 //[0]
    #define info10 0 //[0]

//RP Mode, Visual Style and Performance Setting Handling//
    #if RP_MODE == 1
        #define IPBR
        #define IPBR_PARTICLE_FEATURES
        #define MORE_REFLECTIVE_DISTANT_GLASS
        #define GENERATED_NORMALS
        #define COATED_TEXTURES
        #define FANCY_GLASS
        #define MIRROR_TINTED_GLASS
        #define HIDE_ARMOR 0 //[0 1 2]
    #endif
    #if RP_MODE >= 2
        #define CUSTOM_PBR
        #define POM
    #endif

    #if SHADER_STYLE == 1
        #define WATER_STYLE_DEFAULT 1
        #define AURORA_STYLE_DEFAULT 1
        #define SUN_MOON_STYLE_DEFAULT 1
        #define CLOUD_STYLE_DEFAULT 1
        #define RAINBOW_STYLE_DEFAULT 1
    #elif SHADER_STYLE == 4
        #define WATER_STYLE_DEFAULT 3
        #define AURORA_STYLE_DEFAULT 2
        #define SUN_MOON_STYLE_DEFAULT 2
        #define CLOUD_STYLE_DEFAULT 3
        #define RAINBOW_STYLE_DEFAULT 4
    #endif
    #if WATER_STYLE_DEFINE == -1
        #define WATER_STYLE WATER_STYLE_DEFAULT
    #else
        #define WATER_STYLE WATER_STYLE_DEFINE
    #endif
    #if WATER_CAUSTIC_STYLE_DEFINE == -1
        #define WATER_CAUSTIC_STYLE WATER_STYLE
    #else
        #define WATER_CAUSTIC_STYLE WATER_CAUSTIC_STYLE_DEFINE
    #endif
    #if AURORA_STYLE_DEFINE == -1
        #define AURORA_STYLE AURORA_STYLE_DEFAULT
    #else
        #define AURORA_STYLE AURORA_STYLE_DEFINE
    #endif
    #if SUN_MOON_STYLE_DEFINE == -1
        #define SUN_MOON_STYLE SUN_MOON_STYLE_DEFAULT
    #else
        #define SUN_MOON_STYLE SUN_MOON_STYLE_DEFINE
    #endif
    #if CLOUD_STYLE_DEFINE == -1
        #define CLOUD_STYLE CLOUD_STYLE_DEFAULT
    #else
        #define CLOUD_STYLE CLOUD_STYLE_DEFINE
    #endif
    #if RAINBOW_STYLE_DEFINE == -1
        #define RAINBOW_STYLE RAINBOW_STYLE_DEFAULT
    #else
        #define RAINBOW_STYLE RAINBOW_STYLE_DEFINE
    #endif
    // Thanks to SpacEagle17 and isuewo for the sun angle handling
    #ifdef END
        const float sunPathRotation = 0.0;
    #else
        #if SUN_ANGLE == -1
            #if SHADER_STYLE == 1
                const float sunPathRotation = 0.0;
                #define PERPENDICULAR_TWEAKS
            #elif SHADER_STYLE == 4
                const float sunPathRotation = -40.0;
            #endif
        #elif SUN_ANGLE == 0
            const float sunPathRotation = 0.0;
            #define PERPENDICULAR_TWEAKS
        #elif SUN_ANGLE == 20
            const float sunPathRotation = 20.0;
        #elif SUN_ANGLE == 30
            const float sunPathRotation = 30.0;
        #elif SUN_ANGLE == 40
            const float sunPathRotation = 40.0;
        #elif SUN_ANGLE == 50
            const float sunPathRotation = 50.0;
        #elif SUN_ANGLE == 60
            const float sunPathRotation = 60.0;
        #elif SUN_ANGLE == -20
            const float sunPathRotation = -20.0;
        #elif SUN_ANGLE == -30
            const float sunPathRotation = -30.0;
        #elif SUN_ANGLE == -40
            const float sunPathRotation = -40.0;
        #elif SUN_ANGLE == -50
            const float sunPathRotation = -50.0;
        #elif SUN_ANGLE == -60
            const float sunPathRotation = -60.0;
        #endif
    #endif

    #if SHADOW_QUALITY >= 2
        const int shadowMapResolution = 3072;
    #else
        #if SHADOW_SMOOTHING < 3
            const int shadowMapResolution = 2048;
        #else
            const int shadowMapResolution = 1536;
        #endif
    #endif

    // Snaps each shadow-pass vertex to the shadow map's own texel grid
    // (in the final, already-distorted NDC space) before rasterization.
    // Without this, the sun-relative shadow camera recenters on the
    // player at full float precision every frame, so a static world edge
    // covers a slightly different set of texels frame to frame -> reads
    // as shimmering/crawling shadow edges, especially on foliage and far
    // terrain where the shadow texel footprint per world unit is large.
    // Snapping makes that texel coverage change in fixed discrete steps
    // instead of drifting continuously, which removes the sub-texel part
    // of the shimmer at effectively zero cost (a floor+multiply in the
    // vertex shader). It does not fix all shadow instability by itself -
    // temporal PCF jitter (see shadowSampling.glsl) still handles the
    // softening/denoising side - but it stops the underlying shadow map
    // itself from "swimming" under the softening.
    #define SHADOW_TEXEL_SNAP

    #if SSAO_I > 0
        #define SSAO_QUALI SSAO_QUALI_DEFINE
    #else
        #define SSAO_QUALI 0
    #endif
    #if LIGHTSHAFT_BEHAVIOUR > 0
        #define LIGHTSHAFT_QUALI LIGHTSHAFT_QUALI_DEFINE
    #else
        #define LIGHTSHAFT_QUALI 0
    #endif

    #if BLOCK_REFLECT_QUALITY >= 1
        #define LIGHT_HIGHLIGHT
    #endif
    #if BLOCK_REFLECT_QUALITY >= 2 && RP_MODE >= 1
        #define PBR_REFLECTIONS
    #endif

    #if DETAIL_QUALITY == 0 // Potato
        #define LEAF_SHADOW_OPTIMISATION
        #undef PERPENDICULAR_TWEAKS
        #define LOW_QUALITY_NETHER_STORM
        #define LOW_QUALITY_MOTION_BLUR
        #define WATER_MAT_QUALITY 2 // bumped from 1 so water waves animate even on Low profile
    #endif
    #if DETAIL_QUALITY >= 1 // not an option for now
        #if TAA_MODE >= 1
            #define TAA
        #endif
        #define WATER_MAT_QUALITY 1
    #endif
    #if DETAIL_QUALITY >= 2 // Medium
        #undef WATER_MAT_QUALITY
        #define WATER_MAT_QUALITY 2
    #endif
    #if DETAIL_QUALITY >= 3 // High
        #undef WATER_MAT_QUALITY
        #define WATER_MAT_QUALITY 3 // we use DETAIL_QUALITY >= 3 when writing in gbuffers_water because optifine bad
        #define HQ_NIGHT_NEBULA
        #define SKY_EFFECT_REFLECTION
        #define CONNECTED_GLASS_CORNER_FIX
        #define ACT_CORNER_LEAK_FIX
        #define DO_NETHER_VINE_WAVING_OUTSIDE_NETHER
        #define DO_MORE_FOLIAGE_WAVING
        #if defined IRIS_FEATURE_CUSTOM_IMAGES && SHADOW_QUALITY > -1 && RAIN_PUDDLES > 0 && COLORED_LIGHTING_INTERNAL > 0
            #define PUDDLE_VOXELIZATION
        #endif
        #if CLOUD_QUALITY >= 3 && CLOUD_STYLE > 0 && CLOUD_STYLE != 50
            #define ENTITY_TAA_NOISY_CLOUD_FIX
        #endif
        #if BLOOM_ENABLED == 1 && MOTION_BLUR_EFFECT == 1
            #define MOTION_BLUR_BLOOM_FOG_FIX
        #endif
    #endif
    #if DETAIL_QUALITY >= 4 // Not an option yet
        #define REFLECTION_BLUR_DEPTH_CHECK
    #endif

//Define Handling//
    #ifdef OVERWORLD
        #if CLOUD_STYLE > 0 && CLOUD_STYLE != 50 && CLOUD_QUALITY > 0
            #define VL_CLOUDS_ACTIVE
            #if CLOUD_STYLE == 1
                #define CLOUDS_REIMAGINED
            #endif
            #if CLOUD_STYLE == 3
                #define CLOUDS_UNBOUND
                // Renders CLOUD_ALT2 as a second cloud layer with its own
                // shape variant (see cloudLayer in unboundClouds.glsl),
                // instead of CLOUD_ALT2 sitting unused. Whichever plane is
                // nearer to the camera is traced first and used as-is if
                // it has coverage in view; the other plane is only traced
                // if the near one came up empty at that pixel, so the sky
                // isn't one single repeating shape everywhere - low chunky
                // clusters at CLOUD_ALT1, separate wispier patches at
                // CLOUD_ALT2.
                #define DOUBLE_UNBOUND_CLOUDS
            #endif
        #endif
    #else
        #undef LIGHT_HIGHLIGHT
        #undef CAVE_FOG
        #undef CLOUD_SHADOWS
        #undef SNOWY_WORLD
        #undef LIGHTSHAFT_SMOKE
    #endif
    #ifdef NETHER
        #undef ATMOSPHERIC_FOG
        #undef NO_WAVING_INDOORS
    #else
        #undef NETHER_STORM
    #endif
    #ifdef END
        #undef BLOOM_FOG
    #endif

    #if BLOOM_ENABLED == -1
        #undef BLOOM_FOG
    #endif

    #if defined PIXELATED_SHADOWS || defined PIXELATED_BLOCKLIGHT || defined PIXELATED_AO
        #if !defined GBUFFERS_BASIC && !defined DH_TERRAIN && !defined DH_WATER && !defined VOXY_PATCH
            #define DO_PIXELATION_EFFECTS
        #endif
    #endif

    #ifndef GBUFFERS_TERRAIN
        #undef PIXELATED_BLOCKLIGHT
    #endif

    #ifdef BLOOM_FOG
        #if WORLD_BLUR > 0
            #define BLOOM_FOG_COMPOSITE3
        #else
            #define BLOOM_FOG_COMPOSITE1
        #endif
    #endif

    #if defined GBUFFERS_HAND || defined GBUFFERS_ENTITIES
        #undef SNOWY_WORLD
        #undef DISTANT_LIGHT_BOKEH
    #endif
    #if defined GBUFFERS_TEXTURED || defined GBUFFERS_BASIC
        #undef LIGHT_HIGHLIGHT
        #undef DIRECTIONAL_SHADING
        #undef SIDE_SHADOWING
    #endif
    #if defined GBUFFERS_WATER || defined DH_WATER || defined VOXY_TRANSLUCENT
        #undef LIGHT_HIGHLIGHT
    #endif

    #ifndef GLOWING_ENTITY_FIX
        #undef GBUFFERS_ENTITIES_GLOWING
    #endif

    #if LIGHTSHAFT_QUALI > 0 && defined OVERWORLD && SHADOW_QUALITY > -1 || defined END
        #define LIGHTSHAFTS_ACTIVE
    #endif

    #if defined WAVING_FOLIAGE || defined WAVING_LEAVES || defined WAVING_LAVA || defined WAVING_LILY_PAD
        #define WAVING_ANYTHING_TERRAIN
    #endif

    #if WATERCOLOR_R != 100 || WATERCOLOR_G != 100 || WATERCOLOR_B != 100
        #define WATERCOLOR_RM WATERCOLOR_R * 0.01
        #define WATERCOLOR_GM WATERCOLOR_G * 0.01
        #define WATERCOLOR_BM WATERCOLOR_B * 0.01
        #define WATERCOLOR_CHANGED
    #endif

    #if UNDERWATERCOLOR_R != 100 || UNDERWATERCOLOR_G != 100 || UNDERWATERCOLOR_B != 100
        #define UNDERWATERCOLOR_RM UNDERWATERCOLOR_R * 0.01
        #define UNDERWATERCOLOR_GM UNDERWATERCOLOR_G * 0.01
        #define UNDERWATERCOLOR_BM UNDERWATERCOLOR_B * 0.01
        #define UNDERWATERCOLOR_CHANGED
    #endif

    // Force FANCY_GLASS on regardless of RP_MODE
    #ifndef FANCY_GLASS
        #define FANCY_GLASS
    #endif

    #if defined IS_IRIS && !defined IRIS_HAS_TRANSLUCENCY_SORTING
        #undef FANCY_GLASS
    #endif

    #ifdef DISTANT_HORIZONS
        #undef DISTANT_LIGHT_BOKEH
    #endif

    #if defined MC_GL_VENDOR_AMD || defined MC_GL_VENDOR_ATI
        #ifndef DEFERRED1
            #define FIX_AMD_REFLECTION_CRASH //BFARC: Fixes a driver crashing problem on AMD GPUs
        #endif
    #endif

    #if !defined IS_IRIS || MC_VERSION < 12109
        #undef END_FLASHES
    #endif

    #if defined DISTANT_HORIZONS && defined TAA && !defined END
        #define DH_BLENDING
    #endif

    #if IMPROVED_RAIN_DEFINE == 1 && !defined MC_OS_MAC && !defined COLOR_CODED_PROGRAMS && MC_VERSION >= 11605
        #define IMPROVED_RAIN
    #endif

//Activate Settings//
    #ifdef POM_ALLOW_CUTOUT
    #endif
    #ifdef BRIGHT_CAVE_WATER
    #endif
    #ifdef IPBR_PARTICLE_FEATURES
    #endif
    #ifdef COLORED_CANDLE_LIGHT
    #endif
    #ifdef PIXELATED_AO
    #endif
    #ifdef DOUBLE_REIM_CLOUDS
    #endif
    #ifdef GLOWING_ORE_MODDED
    #endif

//Very Common Stuff//
    #ifndef VOXY_PATCH
        #include "/lib/uniforms.glsl"
    #endif

    #if SHADOW_QUALITY == -1
      float timeAngle = worldTime / 24000.0;
    #else
      float tAmin     = fract(sunAngle - 0.033333333);
      float tAlin     = tAmin < 0.433333333 ? tAmin * 1.15384615385 : tAmin * 0.882352941176 + 0.117647058824;
      float hA        = tAlin > 0.5 ? 1.0 : 0.0;
      float tAfrc     = fract(tAlin * 2.0);
      float tAfrs     = tAfrc*tAfrc*(3.0-2.0*tAfrc);
      float tAmix     = hA < 0.5 ? 0.3 : -0.1;
      float timeAngle = (tAfrc * (1.0-tAmix) + tAfrs * tAmix + hA) * 0.5;
    #endif

    #include "/lib/util/commonFunctions.glsl"
    #include "/lib/materials/materialMethods/gerstnerWaves.glsl"
    #include "/lib/materials/materialMethods/makeupWaterWaves.glsl"
    #include "/lib/materials/materialMethods/ivxWaterWaves.glsl"
    #include "/lib/materials/materialMethods/realisticWaterColor.glsl"

    #ifdef DISTANT_HORIZONS
        float renderDistance = float(dhRenderDistance);
    #elif defined VOXY
        float renderDistance = vxRenderDistance * 16.0 - 256.0; // -256 due to vxRenderDistance being a little unreliable
    #else
        float renderDistance = far;
    #endif

    const float shadowMapBias = 1.0 - 25.6 / shadowDistance;
    float noonFactor = sqrt(max(sin(timeAngle*6.28318530718),0.0));
    float nightFactor = max(sin(timeAngle*(-6.28318530718)),0.0);
    float invNightFactor = 1.0 - nightFactor;
    float rainFactor2 = rainFactor * rainFactor;
    float invRainFactor = 1.0 - rainFactor;
    float invNoonFactor = 1.0 - noonFactor;
    float invNoonFactor2 = invNoonFactor * invNoonFactor;

    float vsBrightness = clamp(screenBrightness, 0.0, 1.0);

    float nightVisionWithAddedSupport = screenBrightness > 1.0 ? 1.0 : nightVision; // Add support for fullbright mods
    #define nightVision nightVisionWithAddedSupport

    int modifiedWorldDay = int(mod(worldDay, 100) + 5.0);
    float syncedTime = (worldTime + modifiedWorldDay * 24000) * 0.05;

    const float pi = 3.14159265359;
    const float goldenRatio = 1.61803398875;

    const float oceanAltitude = 61.9;

    #if IRIS_VERSION >= 10800
        ivec3 cameraPositionBestInt = cameraPositionInt;
        vec3 cameraPositionBestFract = cameraPositionFract;
        vec3 previousCameraPositionBestFract = previousCameraPositionFract;
    #else
        ivec3 cameraPositionBestInt = ivec3(floor(cameraPosition));
        vec3 cameraPositionBestFract = fract(cameraPosition);
        vec3 previousCameraPositionBestFract = fract(previousCameraPosition);
    #endif

    #include "/lib/colors/blocklightColors.glsl"

    const vec3 caveFogColorRaw = vec3(0.13, 0.13, 0.15);
    #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

    #if WATERCOLOR_MODE >= 2
        vec3 underwaterColorM1 = pow(fogColor, vec3(0.33, 0.21, 0.26));
    #else
        // ("warna underwater kebiruan/ke arah hitam" fix): sebelumnya
        // vec3(0.46, 0.62, 1.0) - biru dominan, hijau kurang. Diganti ke
        // teal (biru muda + hijau tua) sesuai target: biru muda + hijau
        // tua, TIDAK ke arah hitam.
        vec3 underwaterColorM1 = vec3(0.28, 0.62, 0.72);
    #endif
    #ifndef UNDERWATERCOLOR_CHANGED
        vec3 underwaterColorM2 = underwaterColorM1;
    #else
        vec3 underwaterColorM2 = underwaterColorM1 * vec3(UNDERWATERCOLOR_RM, UNDERWATERCOLOR_GM, UNDERWATERCOLOR_BM);
    #endif
    // ("underwater ke arah hitam" fix): sebelumnya dikali cuma 0.26-0.31,
    // gelapin warnanya sampai nyaris hitam. Dinaikkan supaya tetap
    // keliatan biru muda/hijau tua yang jelas, nggak jatuh ke gelap.
    vec3 waterFogColor = underwaterColorM2 * vec3(0.42 + 0.08 * vsBrightness);

    #if NETHER_COLOR_MODE == 3
        float netherColorMixer = inNetherWastes + inCrimsonForest + inWarpedForest + inBasaltDeltas + inSoulValley;
        vec3 netherColor = mix(
            fogColor * 0.6 + 0.2 * normalize(fogColor + 0.0001),
            (
                inNetherWastes * vec3(0.4, 0.14, 0.06) + inCrimsonForest * vec3(0.36, 0.07, 0.05) +
                inWarpedForest * vec3(0.18, 0.1, 0.25) + inBasaltDeltas * vec3(0.25, 0.235, 0.23) +
                inSoulValley * vec3(0.1, vec2(0.24))
            ),
            netherColorMixer
        );
    #elif NETHER_COLOR_MODE == 2
        vec3 netherColor = fogColor * 0.6 + 0.2 * normalize(fogColor + 0.0001);
    #elif NETHER_COLOR_MODE == 0
        vec3 netherColor = vec3(0.7, 0.26, 0.08) * 0.6;
    #endif
    vec3 lavaLightColor = vec3(0.15, 0.06, 0.01);

    const vec3 endSkyColor = vec3(0.095, 0.07, 0.15) * 1.65;

    #if WEATHER_TEX_OPACITY == 100
        const float rainTexOpacity = 0.25;
        const float snowTexOpacity = 0.5;
    #else
        #define WEATHER_TEX_OPACITY_M 100.0 / WEATHER_TEX_OPACITY
        const float rainTexOpacity = pow(0.25, WEATHER_TEX_OPACITY_M);
        const float snowTexOpacity = pow(0.5, WEATHER_TEX_OPACITY_M);
    #endif

    #ifdef FRAGMENT_SHADER
        ivec2 texelCoord = ivec2(gl_FragCoord.xy);
    #endif

    float cloudHeightM = isnan(cloudHeight) ? 192.0 : cloudHeight; // iris returns "nan" if there are no clouds
    float cloudHeightOffset = cloudHeightM - 192.0
        #if defined DISTANT_HORIZONS || defined VOXY
            //+ 64.0
        #endif
    ;
    int cloudAlt1i = int(CLOUD_ALT1 + cloudHeightOffset); // Old setting files can send float values
    int cloudAlt2i = int(CLOUD_ALT2 + cloudHeightOffset);

    const float OSIEBCA = 1.0 / 255.0; // One Step In Eight Bit Color Attachment
    /* materialMask steps
    0 to 240 - PBR Dependant:
        IntegratedPBR:
            0 to 99: deferredMaterials
                OSIEBCA * 0.0 = *Unused as 0.0 is the default value*
                OSIEBCA * 1.0 = Intense Fresnel
                OSIEBCA * 2.0 = Copper Fresnel
                OSIEBCA * 3.0 = Gold Fresnel
                OSIEBCA * 4.0 =
                OSIEBCA * 5.0 = Redstone Fresnel
            100 to 199: Exact copy of deferredMaterials but toned down reflection handling for entities
                materialMask += OSIEBCA * 100.0; // Entity Reflection Handling
            200 to 240: Random checks
                OSIEBCA * 240.0 = Green Screen Lime Blocks
        seuspbr:
            0 to 240: Increasing metalness
        labPBR:
            0 to 229: Increasing f0
            230 to 240: Consistent metalness with still increasing f0
    241 to 255 - PBR Independant:
        OSIEBCA * 241.0 = Water
        OSIEBCA * 242.0 = Glass (lens refraction)
    
        OSIEBCA * 251.0 = No SSAO, Reduce Reflection
        OSIEBCA * 252.0 = Versatile Selection Outline
        OSIEBCA * 253.0 = Reduced Edge TAA (Leaves)
        OSIEBCA * 254.0 = No SSAO, No TAA, Reduce Reflection
        OSIEBCA * 255.0 = *Unused as 1.0 is the clear color*
    */

// 62 75 74 20 74 68 4F 73 65 20 77 68 6F 20 68 6F 70 65 20 69 6E 20 74 68 65 20 6C 69 6D 69 4E 61 6C 0A 77 69 6C 6C 20 72 65 6E 65 77 20 74 68 65 69 72 20 73 54 72 65 6E 67 74 48 2E 0A 74 68 65 79 20 77 69 6C 6C 20 73 6F 41 72 20 6F 6E 20 65 6C 79 54 72 61 73 20 6C 69 6B 65 20 70 68 61 6E 74 6F 6D 73 3B 0A 74 68 65 79 20 77 69 6C 6C 20 72 75 6E 20 61 6E 44 20 6E 6F 74 20 67 72 6F 77 20 77 65 41 72 79 2C 0A 74 68 65 59 20 77 69 6C 6C 20 77 61 6C 6B 20 61 6E 64 20 6E 6F 74 20 62 65 20 66 61 69 6E 74 2E