/*---------------------------------------------------------------------
         ___ __  __ ____   ___  ____ _____  _    _   _ _____
        |_ _|  \/  |  _ \ / _ \|  _ \_   _|/ \  | \ | |_   _|
         | || |\/| | |_) | | | | |_) || | / _ \ |  \| | | |
         | || |  | |  __/| |_| |  _ < | |/ ___ \| |\  | | |
        |___|_|  |_|_|    \___/|_| \_\|_/_/   \_\_| \_| |_|
         .
  -> -> -> 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
---------------------------------------------------------------------*/

// v9.0 performance pass: reduced default GI/IC sampling and Contact AO samples while keeping temporal accumulation, voxel GI, reflections, clouds, bloom, and colored lighting enabled.
// Profile overrides below scale quality back up progressively for stronger GPUs.
//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]
    // Ray-Traced Ambient Occlusion: horizon-traced AO against the real
    // depth buffer (Visibility Bitmask technique, same core algorithm as
    // the SSGI above but AO-only - see GetRTAO in deferred1.glsl).
    // Independent of SSAO_QUALI_DEFINE; the two layer together when both
    // are on. 0 = off, 1 = fast (2 slices/4 steps), 2 = high quality
    // (3 slices/6 steps).
    #define RTAO 0 //[0 1 2]
    #define RTAO_INTENSITY 100 //[50 60 70 80 90 100 110 120 130 150 175 200]
    #define RTAO_RADIUS 1.5 //[0.5 0.75 1.0 1.5 2.0 2.5 3.0 4.0]
    // FPS safety valve for RTAO: view-space distance (in blocks) past which
    // the expensive per-pixel horizon trace is skipped and RTAO fades back
    // to the cheap depth-diff SSAO instead. Most of a typical frame (distant
    // terrain, mountains, anything near the render-distance edge) is far
    // enough that the extra detail is invisible, so this is what makes it
    // safe to run RTAO at LOW/STANDARD instead of ULTRA/CINEMATIC only.
    // Lower = cheaper/safer, higher = RTAO detail reaches further out.
    #define RTAO_MAX_DISTANCE 40.0 //[16.0 20.0 24.0 28.0 32.0 40.0 48.0 64.0 999.0]
    #define FXAA_DEFINE 1 //[-1 1]
    #define DETAIL_QUALITY 0 //[0 2 3]
    // ("Unbound Visual +" fix - awan diperbagus, noise dikurangi): dinaikkan
    // dari 1 -> 2 supaya raymarch awan lebih halus/detail dan noise
    // bintik-bintik pada tepi awan berkurang (setara profile.STANDARD).
    #define CLOUD_QUALITY 3 //[0 1 2 3]
    #define LIGHTSHAFT_QUALI_DEFINE 2 //[0 1 2 3 4]
    #define WATER_REFLECT_QUALITY 2 //[-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).
        // ---------------------------------------------------------------
        // Solar GI (ported from ForkReimagined "SolarGI v1.8"): cheap
        // shadow-map-verified sunlight bounce injected directly into the
        // EXISTING ACT flood-fill volume (floodfill_img) that shadowcomp.glsl
        // already computes every frame for colored block lighting. No new
        // images, no new passes - it only adds a few extra lines inside
        // shadowcomp.glsl's existing compute dispatch. Fully independent of
        // CUSTOM_GI_VOXEL above (separate voxel grid, separate code path) -
        // the two run side by side without conflict: CUSTOM_GI_VOXEL handles
        // multi-bounce room-filling GI, Solar GI adds a cheap, sharp
        // first-bounce glow specifically off sunlit surfaces (window sills,
        // the ground right outside a doorway, etc.) that CUSTOM_GI_VOXEL's
        // coarser/slower-converging grid is not as good at.
        #define SOLAR_GI 1 //[0 1]
        #if SOLAR_GI == 1
            #define SOLAR_GI_STRENGTH 0.25 //[0.00 0.25 0.50 0.75 1.00 1.50 2.00 2.50 3.00 4.00 5.00 6.00 8.00 10.00 12.00 16.00]
            #define SOLAR_GI_SATURATION 0.75 //[0.00 0.15 0.25 0.35 0.50 0.75 1.00]
            #define SOLAR_GI_COLOR_SATURATION 1.20 //[0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.60 1.75 2.00 2.50 3.00 3.50 4.00]
            // ("light bounce kedip-kedip pas diam/gerak" fix): dinaikkan dari
            // 0.90 -> 0.95 dan SOLAR_GI_FADE_TIME dari 3 -> 6 detik. Nilai
            // asli ini justru lebih rendah dari default resmi pack sumbernya
            // sendiri (fork itu pakai STABILITY=0.95 di profile GI_DEFAULT-nya) -
            // dinaikkan lagi di sini supaya history lama dipertahankan lebih
            // kuat dan proses fade-in/fade-out sumber cahaya jauh lebih halus,
            // dengan trade-off munculnya bounce baru (mis. baru masuk ruangan)
            // terasa sedikit lebih lambat.
            #define SOLAR_GI_STABILITY 0.95 //[0.00 0.20 0.35 0.50 0.65 0.82 0.90 0.95]
            #define SOLAR_GI_FADE_TIME 6.00 //[0.00 0.10 0.25 0.50 1.00 2.00 4.00 6.00 8.00 12.00 16.00 24.00 32.00 45.00 60.00 90.00 120.00]
            #define SOLAR_GI_EDGE_FADE 0.15 //[0.00 0.05 0.08 0.10 0.12 0.15 0.18 0.20 0.25 0.30]
            #define SOLAR_GI_SURFACE_FILL 0.75 //[0.00 0.25 0.50 0.75 1.00 1.20 1.50 1.60 2.00 2.50 3.00 4.00 5.00 6.00]
            #define SOLAR_GI_SUNLIT_VISIBILITY 1.00 //[0.00 0.10 0.20 0.35 0.45 0.60 0.75 1.00]
            #define SOLAR_GI_SHADOW_BOOST 0.50 //[0.50 0.75 1.00 1.15 1.35 1.50 1.75 2.00 2.50 3.00]
            #define SOLAR_GI_SHADOW_BIAS 0.0012 //[0.0000 0.0004 0.0008 0.0012 0.0016 0.0020 0.0030 0.0040]
            // NOTE: the original SolarGI also captures a real per-block texture
            // albedo through a dedicated shadowcolor2 buffer (IRIS_FEATURE_HIGHER_
            // SHADOWCOLOR), which needs new DRAWBUFFERS wiring in shadow.glsl.
            // This pack's shadow.glsl is already heavily customized for
            // CUSTOM_GI_VOXEL's own voxelization pass, so that part was left
            // out here to keep this a safe, self-contained addition - bounce
            // color instead falls back to the sun/sky light color only (still
            // real directional, shadow-map-verified sunlight bounce, just
            // without per-texture material tinting). This can be added later
            // by porting shadow.glsl's IRIS_FEATURE_HIGHER_SHADOWCOLOR block
            // if wanted.
        #endif

        #define CUSTOM_GI_VOXEL 1 //[0 1]
        #if CUSTOM_GI_VOXEL == 1
            #define CUSTOM_GI_VOXEL_INTERNAL
            // ("sheders lebih berat dari SEUS PTGI HRR3" fix): raw/base
            // default diturunkan dari 256 (level ULTRA/CINEMATIC) ke 192
            // (level STANDARD). Nilai 256 ini yang dipakai kalau user BELUM
            // memilih profile LOW/STANDARD/ULTRA/CINEMATIC dari dropdown -
            // banyak pemain kasual nggak pernah buka dropdown-nya, jadi
            // kesan pertama performa pack ini malah lebih berat dari tier
            // tertinggi sendiri. Milih profile tetap meng-override nilai ini.
            #define GI_VOXEL_RESOLUTION 160 //[64 96 128 160 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]
            // ("bounce kurang nyebar ke area lain" fix): GI_BOUNCE_PASSES
            // dinaikkan ke 8 supaya cahaya pantulan melompat cukup jauh
            // (setara v8.4) dan menjangkau seluruh ruangan. GI_SINGLE_BOUNCE
            // di-set 0 supaya propagasi multi-hop aktif.
            #define GI_BOUNCE_PASSES 8 //[1 2 3 4 5 6 7 8]
            #define GI_SINGLE_BOUNCE 0
            #define GI_COLOR_ONLY 1
            #define GI_FLAT_SURFACE_SUPPRESS 0.00
            #define GI_COLOR_TINT_STRENGTH 0.35
            #define GI_ADD_LUMINANCE_CLAMP 0.6
            // Solar bounce propagation is horizontal/downward only; it never climbs upward.

            // ("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.
            // ("light bounce nga ada di semua profile" fix): default dinaikkan
            // 0.58->0.85 supaya match dengan semua profile. Sebelumnya
            // default rendah (0.58) bikin bounce mati sangat cepat (0.58^2=34%
            // setelah 2 pass) sehingga area teduh nyaris gelap total.
            #define GI_DECAY 0.85 //[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.
            // ("light bounce lebih pekat & ketara" fix, round 2): dinaikkan
            // lagi ke nilai maksimum slider (2.0 -> 3.0) supaya cahaya
            // pantulan jauh lebih terasa/pekat, bukan cuma tambahan halus.
            // ("bounce sesuai referensi Cornell-box - saturated, nyebar ke
            // seluruh ruangan" fix, round 3): 3.0 ternyata SUDAH nilai
            // paling atas dari daftar pilihan sendiri - slider di game
            // nggak punya ruang naik lagi walau digeser habis ke kanan.
            // Daftar pilihan diperpanjang (3.5, 4.0) dan default dinaikkan
            // ke 3.5 supaya ada headroom nyata menuju bounce warna kuat
            // yang nutupi ruangan seperti referensi, bukan cuma tint.
            // ("light bounce nga ada di semua profile" fix): default dinaikkan
            // 0.65->1.00 supaya match dengan semua profile. Sebelumnya
            // default rendah (0.65) bikin bounce redup bahkan di area
            // yang seharusnya terang.
            #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 3.25 3.5 4.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.
            // ("light bounce cuma dari sinar matahari, torch/lantern jangan
            // bounce" request): dimatikan (1 -> 0) supaya obor/lentera/lava/dll
            // tidak lagi diinjeksikan sebagai sumber cahaya ke grid voxel GI.
            // Bounce/pantulan sekarang murni berasal dari sinar matahari/langit
            // yang mengenai permukaan (lihat GI_BOUNCE_PASSES dkk di atas),
            // block bercahaya tetap menyala di tempatnya tapi tidak lagi
            // "memantul" ke dinding/lantai sekitarnya.
            #define GI_EMISSIVE_BLOCKS 0 //[0 1]
            // ("light bounce lebih pekat & ketara" fix, round 2): dinaikkan
            // dari 1.25 supaya cahaya yang dipantulkan oleh obor/lampu/lava
            // ke dinding/lantai sekitarnya lebih terasa, sementara block
            // sumber cahayanya sendiri (lihat GLOWING_ORE_MULT di bawah)
            // tetap dijaga tidak overexposed.
            #define GI_EMISSIVE_INTENSITY 1.75 //[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 2.5 //[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).
            // ("light bounce kurang lega/kerasa sesak di langit-langit" fix):
            // sebelumnya SETIAP ray Monte Carlo hemisphere di sini dipaksa
            // diratakan ke bidang X/Z (komponen Y dibuang) - lantai jadi
            // tidak pernah bisa membaca pantulan dari langit-langitnya
            // sendiri (dan sebaliknya), padahal itu justru bagian dari
            // hemisphere cosine-weighted yang sudah benar dihasilkan oleh
            // GiCosineSampleHemisphere. Diaktifkan supaya arah ray dipakai
            // apa adanya (Monte Carlo hemisphere penuh, bukan versi
            // diratakan) - inilah yang bikin ruangan tertutup terasa
            // "lega"/terisi penuh, bukan cuma terang di sisi samping.
            // Aman: sistem flood-fill propagasi antar-pass
            // (giPropagateBody.glsl) - yang dulu jadi sumber asli masalah
            // "kolom cahaya" menembus kanopi pohon - TETAP horizontal/turun
            // saja, tidak diubah. Set ke 0 untuk kembali ke perilaku lama
            // (ray diratakan ke X/Z) kalau gejala kolom cahaya itu ternyata
            // muncul lagi di dunia tertentu.
            #define GI_VERTICAL_SPREAD 1 //[0 1]
            // ("sheders lebih berat dari SEUS PTGI HRR3" fix): raw/base
            // default diturunkan dari 16 ke 5 (level STANDARD). 16 di sini
            // sebenarnya LEBIH BERAT dari profile CINEMATIC (14) - ini nilai
            // yang aktif selama user belum pilih profile, jadi ini akar
            // utama komplain performa. Ray count ini paling mahal dari semua
            // parameter GI (linear cost per ray), jadi diprioritaskan turun.
            #define GI_RAYS_PER_PIXEL 6 //[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".
            // ("sheders lebih berat dari SEUS PTGI HRR3" fix): raw/base
            // default diturunkan dari 24 ke 16 (level STANDARD) untuk
            // alasan performa yang sama seperti GI_RAYS_PER_PIXEL di atas.
            #define GI_TRACE_STEPS 12 //[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.
            // ("light bounce menyebar ke ruangan, jangan terperangkap" fix,
            // round 2): dinaikkan ke nilai maksimum slider (0.9 -> 1.0) -
            // ("light bounce kedip-kedip pas diam/gerak" fix): diturunkan dari
            // 1.0 (100% ray-traced, TANPA campuran sampel halus sama sekali)
            // ke 0.85. Ray-traced hemisphere sample itu genuinely noisy per
            // frame (arah ray berubah tiap kali seed cycling) - temporal
            // accumulation meredamnya, tapi 100% murni ray-trace masih
            // kelihatan "hidup"/berkedip terutama di area datar/terbuka.
            // Mencampur sedikit sampel titik-tunggal yang halus (wsrcSample,
            // deterministik/tidak noisy) sebagai dasar meredam kedipan itu,
            // dengan trade-off bentuk bounce sedikit kurang "sadar ruangan"
            // dibanding 1.0 murni - prioritas sekarang stabilitas dulu.
            // Favor the continuous air-side radiance sample over the discrete voxel-face sample.
            // ("transisi terang-gelap terlalu halus" fix, v9.0): dinaikkan
            // 0.35->0.50 supaya porsi ray-traced sample (yang menangkap
            // bentuk ruangan & kontras aktual) lebih dominan. Sebelumnya
            // 65% sampel WSRC yang di-blur terlalu halus, menghilangkan
            // kontras tajam di tepi terang/gelap. Dengan 50/50 split,
            // bounce lebih "sadar ruangan" tanpa terlalu noisy.
            #define GI_RAY_BLEND 0.70 //[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.08 //[0.0 0.05 0.10 0.15 0.18 0.20 0.25 0.30]
                // (edit: 0.18 -> 0.08) diturunkan supaya lubang kecil di
                // dinding/atap ruangan gelap tidak langsung membanjiri area
                // sekitarnya dengan ambient rata; berkas cahaya (light shaft)
                // yang sebenarnya tetap dibawa lewat direct sun + volumetric
                // light, bukan lewat term ini.
                // 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.
            // ("light bounce kedip-kedip pas diam/gerak" fix): dinaikkan ke
            // 0.95 (nilai maksimum slider) supaya history frame sebelumnya
            // dipertahankan lebih kuat - bounce jadi lebih "diam"/stabil
            // baik saat kamera diam maupun bergerak, dengan trade-off respon
            // terhadap perubahan cahaya mendadak (obor baru, dll) jadi
            // sedikit lebih lambat. giAdaptiveDecay di prepare.glsl tetap
            // otomatis menurunkan nilai ini saat kamera bergerak cepat, jadi
            // gerakan besar tetap responsif walau baseline-nya dinaikkan.
            #define GI_TEMPORAL_ACCUM_DECAY 0.95 //[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 5 //[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.
            // ("sheders lebih berat dari SEUS PTGI HRR3" fix): raw/base
            // default diturunkan dari 4 ke 2 (level STANDARD), performa.
            #define IC_RAYS_PER_PROBE 3 //[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.
            // dinaikkan 48 -> 80. Di profile LOW/STANDARD (GI_VOXEL_RESOLUTION
            // 128/192, jadi radius grid 64/96 blok dari player), fade 48
            // cuma mulai 16-48 blok dari player lalu langsung nol di 64-96
            // blok - transisinya cukup tajam buat kelihatan sebagai garis
            // terang di tanah datar yang polos (grass field, dsb).
            // Menaikkan ke 80 bikin fade mulai lebih dekat ke player dan
            // melandai jauh lebih halus, jadi transisinya nggak lagi
            // kebaca sebagai border yang tajam.
            #define GI_EDGE_FADE 20
                // 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 5 //[2 3 4 6 8]
                // Number of AO samples per pixel.
            #define CONTACT_AO_INTENSITY 0.60 //[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
            // ("saturasi warna light bounce keluar" fix, round 2): dinaikkan
            // dari 105 supaya warna cahaya yang dipantulkan (mis. hijau dari
            // dedaunan, oren dari torch, dll) lebih terasa/jenuh saat
            // mantul ke permukaan sekitarnya.
            #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.
            // ("ray traced blocklight biar nga flat diamond, harus punya
            // arah" fix): turned ON by default and paired with a new
            // cosine/geometry-term weighting in blockLightPointShadows.glsl
            // (technique studied from VTXS Screen Space Demo's SSLL system -
            // see the comment above GetBlockLightPointShadows) so each
            // lamp's contribution now falls off by the shaded FACE's
            // direction toward that lamp, not only by distance - this is
            // the actual "punya arah" part, on top of the real per-lamp
            // shadow rays that already existed. Kept at a conservative
            // radius/probe count below (same values this was already tuned
            // at while off) so it stays affordable on top of the existing
            // flood-fill; lower BLOCKLIGHT_POINT_SHADOWS_PROBES first if
            // frame time matters more than extra light separation.
            #define BLOCKLIGHT_POINT_SHADOWS 1 //[0 1]
            // Search radius (in blocks) around the shading point to look
            // for light-emitting voxels in.
            #define BLOCKLIGHT_POINT_SHADOWS_RADIUS 8 //[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 6 //[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
        #define SOLAR_GI 0 // ACT floodfill unavailable -> Solar GI has nothing to inject into
    #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]
    // ("air jangan terlalu jernih/tembus pandang, wave harus keliatan dari
    // atas & samping" fix): dinaikkan cukup jauh dari 60 -> 130. 60 berada
    // di bawah titik netral (100), yang lewat pow(color.a, 100/WATER_ALPHA_MULT)
    // di water.glsl JUSTRU membuat alpha air makin kecil/tembus pandang -
    // itu penyebab utama permukaan air kelihatan seperti kaca bening dan
    // riak gelombangnya tenggelam/tak kelihatan saat dilihat dari atas atau
    // samping. 130 melewati titik netral ke arah lebih opaque, air tetap
    // "jernih" (warna & dasar masih tembus di air dangkal) tapi permukaannya
    // punya cukup "badan" supaya shading gelombang jelas terlihat.
    #define WATER_ALPHA_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 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.
    // ("wave harus keliatan dari atas & samping" fix): dinaikkan sedikit
    // lagi (105 -> 120) berbarengan dengan WATER_ALPHA_MULT di atas, supaya
    // ada sedikit lebih banyak gradasi kedalaman yang membantu riak/gelombang
    // "terbaca" secara visual, tanpa kembali ke fog berat 200 yang bikin air
    // terasa pekat.
    #define WATER_FOG_MULT 90 //[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.
    // ("warna air jernih, biru muda" fix, round 2): R dinaikkan supaya
    // air tidak berat/gelap, B dinaikkan sedikit dari G supaya air condong
    // biru muda yang jernih/segar, bukan hijau-kebiruan atau gelap.
    // ("Unbound Visual +" fix - air biru muda & jernih, round 3): R/G/B
    // dinaikkan semua sedikit (100->108, 108->114, 122->132) supaya air
    // terlihat lebih terang/segar (biru muda) alih-alih pekat/gelap,
    // konsisten dengan referensi gambar yang diberikan user.
    // ("air jangan terlalu putih" fix): diturunkan dari 108/114/132 ke
    // 92/98/112. Nilai sebelumnya (semua di atas 100 = netral) membuat
    // permukaan air jadi terlalu terang/pucat, kesannya "putih" alih-alih
    // biru muda yang jernih. R diturunkan ke sedikit di bawah netral, G
    // sekitar netral, B tetap di atas netral supaya air tetap condong biru
    // muda tapi tidak lagi kelewat terang.
    #define WATERCOLOR_R 75 //[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 88 //[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 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]
    // ("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 75 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]
    #define UNDERWATERCOLOR_G 105 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]
    #define UNDERWATERCOLOR_B 150 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150]
    // v9.0: Underwater tint shifted to a cleaner blue/cyan balance.
    // Keeps depth readable while removing the remaining brown/olive cast. //[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 1 //[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.
    // ("Unbound Visual +" fix - air jernih round 3): B diturunkan lagi
    // (20->15) supaya semburat biru muda bertahan lebih jauh ke kedalaman
    // sebelum meluruh ke warna air dalam, biar makin jernih/tembus pandang.
    // (SalicylicShaders_v1 water color port): matched to Salicylic's
    // WaterAbsorptionCoefficient ratio (0.3, 0.14, 0.11 -> ~100:47:37,
    // rounded to nearest slider steps 100:50:40). Was 100/40/15 (a much
    // clearer/lighter blue, tuned across several earlier rounds) - this
    // shifts the default look toward Salicylic's more teal/less-bright
    // water. RW_CLARITY below still controls how far that clear-color
    // stretches before settling into this ratio's deep-water tone.
    #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 50 //[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 40 //[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.
    // ("warna air jernih, biru muda" fix, round 2): dinaikkan lagi ke 250
    // supaya air makin terasa jernih/tembus pandang sebelum berangsur ke
    // warna air dalam.
    // ("Unbound Visual +" fix - air jernih round 3): dinaikkan lagi dari
    // 250 -> 300 supaya air tetap kelihatan jernih/biru muda untuk jarak
    // pandang yang lebih jauh lagi, sebelum berangsur ke warna air dalam.
    // ("wave harus keliatan dari atas & samping" fix, round 4): diturunkan
    // dari 300 -> 200. Di titik 300, air jadi begitu jernih/rata sehingga
    // gradasi warna akibat kedalaman nyaris hilang - riak gelombang cuma
    // kelihatan dari normal map-nya sendiri, bukan dari bagaimana warna
    // air berubah mengikuti bentuk gelombang. 200 tetap terasa jernih/biru
    // muda di air dangkal, tapi transisi ke warna air dalam datang sedikit
    // lebih cepat sehingga riak permukaan lebih "terbaca" secara visual.
    // ("air jangan ke warna hitam, jernih dikit aja" fix, round 5):
    // dinaikkan lagi ke 250. Karena animasi gelombang fisik
    // (WAVING_WATER_VERTEX) diaktifkan kembali di bawah, kedalaman gerakan
    // mesh air sendiri sudah cukup membuat riak "terbaca" tanpa perlu
    // mengandalkan gradasi warna sedalam sebelumnya, jadi air bisa dibuat
    // sedikit lebih jernih lagi tanpa air terlihat gelap/hitam di
    // kedalaman menengah.
    // ("air jangan terlalu putih" fix): diturunkan dari 250 -> 150. Nilai
    // 250 membuat air "clear"/nyaris tanpa tint terlalu jauh ke kedalaman,
    // sehingga sebagian besar permukaan air memantulkan warna
    // langit/cahaya polos dan terlihat pucat/putih. 150 membuat air lebih
    // cepat menyerap ke warna air-nya sendiri (WATERCOLOR di atas), jadi
    // tetap kelihatan jernih di dangkal tapi tidak putih.
    #define RW_CLARITY 150 //[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.
    // ("animasi air diperbagus, gelombang diperkuat" fix, round 3):
    // dinaikkan lagi dari 0.85 -> 1.00, satu langkah moderat di slider
    // (bukan lompatan besar) supaya riak permukaan lebih terasa hidup
    // tanpa jadi berlebihan/menyilaukan.
    // ("Unbound Visual +" fix - riak air diperbagus, round 4): dinaikkan
    // satu langkah lagi di semua channel bumpiness (1.00->1.25, 0.50->0.65,
    // 0.65->0.80, 0.55->0.70) supaya riak permukaan lebih jelas/hidup,
    // masih satu langkah moderat di slider (bukan lompatan ke nilai
    // ekstrem paling atas).
    // ("perbagus lagi animasi air/wave" fix, round 5): dinaikkan satu
    // langkah lagi (1.25 -> 1.50) supaya riak makin terasa hidup, dipadukan
    // dengan WATER_NORMALS_STRENGTH_MULTIPLIER di bawah untuk memperkuat
    // seberapa jelas gelombang itu ter-shading (bukan cuma seberapa besar
    // bentuknya).
    // ("wave jangan besar/gendut, mau banyak riak kecil yang tenang" fix,
    // round 7): diturunkan dari 1.50 -> 0.80. Sebelumnya bumpiness setinggi
    // ini bikin riak kelihatan tebal/berat; nilai lebih rendah bikin
    // permukaan lebih halus/tenang, detail riak kecil didorong lewat
    // WATER_OCTAVES & WAVE_LENGTH di bawah, bukan lewat bumpiness.
    #define WATER_BUMPINESS 0.80 //[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.65 //[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.80 //[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.70 //[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]
    // ("Unbound Visual +" fix - animasi air diperbagus, round 4): dinaikkan
    // dari 0.90 -> 1.00 supaya pergerakan air kelihatan lebih hidup/mengalir,
    // masih di batas wajar (1.00 setara kecepatan "normal" vanilla-plus).
    // ("wave jangan besar/gendut, mau banyak riak kecil yang tenang" fix,
    // round 7): diturunkan dari 1.20 -> 0.90 supaya gerakan riak lebih
    // santai/tenang, tidak terkesan bergolak.
    #define WATER_SPEED_MULT 0.90 //[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
    // ("animasi air diperbagus" fix, round 3): dinaikkan dari 16 -> 24
    // supaya detail gelombangnya lebih kaya/halus, satu langkah di slider
    // (bukan lompatan ke maksimum 32 yang lebih berat di GPU).
    // ("Unbound Visual +" fix, round 4): dinaikkan dari 24 -> 32 (maksimum)
    // supaya detail gelombang Gerstner makin kaya/halus, sekarang GPU cost
    // sudah tertutupi kenaikan CLOUD_QUALITY jadi tetap seimbang.
    // ("animasi air tipis/deket/terdistorsi" fix, round 5): diturunkan ke 8
    // karena 32 octave bikin detail gelombang makin kecil (panjang gelombang
    // tiap octave dikali 0.91, jadi octave terakhir cuma ~0.25 block) -> ombak
    // kelihatan terlalu rapat, mendetail berlebihan, dan slope-nya menumpuk
    // sampai normal map jenuh/terdistorsi. Dengan 8 octave detail terhalus
    // tetap ~4-5 block, jadi ombaknya lebar/terpisah dan halus.
    // ("wave jangan besar/gendut, mau banyak riak kecil yang tenang" fix,
    // round 7): dinaikkan dari 8 -> 12 supaya jumlah riak kecil di
    // permukaan lebih banyak/rapat (bukan cuma beberapa ombak besar),
    // masih jauh dari 32 yang dulu bikin terlalu detail/jenuh.
    #define WATER_OCTAVES 12 //[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.
    // ("animasi air diperbagus, gelombang diperkuat" fix, round 3):
    // dinaikkan dari 0.18 -> 0.24 supaya shading gelombangnya lebih tegas
    // kelihatan, sepasang dengan WAVE_AMPLITUDE/STEEPNESS di bawah.
    // ("Unbound Visual +" fix - riak diperbagus, round 4): dinaikkan dari
    // 0.24 -> 0.30 supaya shading riak/gelombang lebih tegas kelihatan.
    // ("animasi air tipis/deket/terdistorsi" fix, round 5): dinaikkan ke 0.50
    // untuk mengkompensasi pengurangan WATER_OCTAVES (32->8) dan WAVE_LENGTH
    // yang lebih panjang - slope total lebih kecil, jadi strength naik supaya
    // ombak tetap terasa penuh, padahal sekarang sudah di-soft-normalize di
    // gerstnerWaves.glsl supaya tidak pernah jenuh/terdistorsi.
    #define WATER_NORMALS_STRENGTH 0.50
    // ("perbagus lagi animasi air/wave, wave harus keliatan dari atas &
    // samping" fix, round 6): dinaikkan dari 1.0 -> 1.4. Ini mengalikan
    // WATER_NORMALS_STRENGTH di atas secara langsung, jadi menaikkannya
    // memperkuat seberapa tegas gelombang membelokkan cahaya/pantulan
    // (shading), terpisah dari WATER_BUMPINESS (yang lebih ke skala visual
    // riak kecil/besar) - kombinasi keduanya membuat gelombang lebih jelas
    // terbaca baik dari atas (top-down) maupun dari samping.
    // ("wave jangan besar/gendut, mau banyak riak kecil yang tenang" fix,
    // round 7): diturunkan dari 1.4 -> 0.8 supaya shading gelombang tidak
    // terlalu tegas/kontras (kesan "berat"), riak jadi lebih lembut/tenang.
    #define WATER_NORMALS_STRENGTH_MULTIPLIER 0.8 //[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
    // ("animasi air diperbagus" fix, round 3): dinaikkan dari 0.1 -> 0.15
    // supaya gelombang terlihat bergerak lebih hidup, masih halus (jauh
    // dari nilai maksimum slider 2.0).
    // ("Unbound Visual +" fix, round 4): dinaikkan dari 0.15 -> 0.20 supaya
    // gerakan gelombang lebih hidup/terasa mengalir, masih jauh dari batas
    // maksimum 2.0 yang bisa bikin gerak kesat/gelisah.
    #define WAVE_SPEED 0.30 //[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.
    // ("animasi air diperbagus, gelombang diperkuat" fix, round 3):
    // dinaikkan satu langkah lagi masing-masing (1.6->1.8, 3.4->3.6),
    // sengaja tidak sampai ke titik ekstrem 4.0 yang sebelumnya sudah
    // terbukti terlalu runcing/kontras, supaya tetap aman untuk mata.
    // ("Unbound Visual +" fix, round 4): AMPLITUDE dinaikkan ke 2.0 dan
    // STEEPNESS ke 3.8 - satu langkah lagi dari round 3, TAPI sengaja
    // masih ditahan di bawah 4.0 (STEEPNESS) karena nilai itu sudah
    // terbukti sebelumnya bikin gelombang terlalu runcing/menyilaukan
    // mata (lihat catatan "riak air terlalu pekat" fix di atas).
    // ("animasi air tipis/deket/terdistorsi" fix, round 5): STEEPNESS
    // diturunkan 3.8 -> 2.6 supaya puncak ombak lebih bulat/lebar (bukan
    // runcing tipis) dan WAVE_LENGTH dinaikkan 5.0 -> 10.0 supaya jarak
    // antar ombak lebih lega (perioda dasar ~9 block, bukan ~4.5 block) -
    // di air sempit seperti kaca/cauldron ombak tidak lagi kelihatan
    // seperti potongan acak yang melompat-lompat.
    // ("perbagus lagi animasi air/wave" fix, round 6): AMPLITUDE dinaikkan
    // satu langkah (2.0 -> 2.5) supaya tinggi gelombang lebih terasa.
    // STEEPNESS SENGAJA TIDAK dinaikkan lagi dari 2.6 - nilai itu adalah
    // hasil fix round 5 untuk masalah puncak ombak yang terlalu
    // runcing/terdistorsi, menaikkannya lagi berisiko memunculkan kembali
    // masalah yang sama. Ketajaman visual gelombang sekarang didorong lewat
    // WATER_BUMPINESS dan WATER_NORMALS_STRENGTH_MULTIPLIER di atas.
    // ("wave jangan besar/gendut, mau banyak riak kecil yang tenang" fix,
    // round 7): AMPLITUDE diturunkan 2.5 -> 1.0 supaya tinggi gelombang
    // jauh lebih kecil/tenang (tidak "gendut"). STEEPNESS diturunkan
    // 2.6 -> 1.8 supaya puncak riak makin bulat/lembut (bukan tegas).
    // WAVE_LENGTH diturunkan 10.0 -> 4.0 supaya jarak antar riak jadi
    // rapat, hasilnya banyak riak kecil berdekatan, bukan beberapa ombak
    // besar berjarak lebar - sesuai referensi foto (air agak tenang,
    // riak kecil-kecil merata).
    #define WAVE_AMPLITUDE 1.0 //[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 1.8 //[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 4.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 85 //[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 60 //[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 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]
    // ("hilangkan planet grid" fix): fitur planet custom ini dimatikan
    // total - fungsi GetPlanets() di stars.glsl otomatis return vec3(0.0)
    // di kedua tempat pemanggilannya (gbuffers_skybasic.glsl &
    // reflectionBackground.glsl) begitu define ini tidak aktif.
    //#define NIGHT_PLANETS
    #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
    // ("bintang jangan terlalu banyak" fix): default diturunkan dari 4
    // (paling padat) ke 2 (sedang). Bentuknya juga sudah dibulatkan, lihat
    // GetStars() di stars.glsl.
    #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
    // ("awan jangan terlalu rendah" fix): dinaikkan dari 140 -> 176 supaya
    // posisi awan tidak terlalu dekat ke tanah/gunung, tapi masih di
    // bawah nilai lama 192 supaya gunung tinggi tetap bisa "menembus"
    // lapisan awan.
    #define CLOUD_ALT1 176 //[-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 jangan terlalu menutupi langit" fix): diturunkan dari 1.10
    // -> 0.95 supaya cakupan awan di langit berkurang dan celah biru
    // lebih kelihatan, tanpa membuat awan yang tersisa jadi tipis
    // (ketebalan per-gumpalan tetap dijaga lewat CLOUD_QUALITY & noise
    // shape, bukan lewat setting ini).
    // ("awan lebih banyak di semua profile" request, lanjutan - "bintik2/cat
    // air" fix): 1.35 ternyata kebanyakan - noise oktaf halus yang tadinya
    // di bawah threshold jadi ikut lolos sebagai bercak-bercak kecil
    // terpisah ("bintik-bintik"/watercolor) alih-alih gumpalan besar padat.
    // Diturunkan ke 1.18 (tetap lebih tinggi dari default asli 1.05) dan
    // dipasangkan dengan threshold subtract yang dinaikkan di bawah supaya
    // noise halus tetap tersaring - awan tetap lebih banyak/padat tapi
    // bentuknya gumpalan besar, bukan pecahan kecil-kecil.
    #define CLOUD_UNBOUND_AMOUNT 1.30 //[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.75 //[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 ENDER_MIST
    #define ENDER_MIST_I 0.35 //[0.05 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 1.20 1.40 1.60 1.80 2.00]
    #define ENDER_MIST_ALT 40 //[-64 -48 -32 -16 0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 128 144 160 192 224 256]
    #define ENDER_CLOUD_CEILING
    #define ENDER_CLOUD_CEILING_I 0.55 //[0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.70 0.80 0.90 1.00 1.20 1.40 1.60 1.80 2.00]
    #define ENDER_CLOUD_CEILING_ALT 180 //[80 96 112 128 144 160 176 192 208 224 240 256 272 288 304 320 352 384 416 448 480]
    #define ENDER_LIGHTNING
    #define ENDER_LIGHTNING_I 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.50 3.00]
    #define ENDER_LIGHTNING_FREQ 1.00 //[0.25 0.50 0.75 1.00 1.25 1.50 2.00 2.50 3.00 4.00]

    #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.
    // ("perbagus atmosphere untuk adventure/survival melihat pemandangan"
    // fix): dinaikkan lagi dari 25 -> 35 supaya volumetric light shaft di
    // siang hari lebih terasa/dramatis saat menjelajah dan memandang
    // pemandangan, masih satu langkah moderat di slider.
    #define LIGHTSHAFT_DAY_I 45 //[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 20 //[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 18 //[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
    // ("Unbound Visual +" fix - sunset lightshaft lebih "epic"): dibalik
    // dari -0.10 (desaturate) jadi +0.10 (saturate) supaya crepuscular ray
    // saat senja ikut kena warna jingga-keemasan yang lebih pekat/dramatis,
    // konsisten dengan ATM_MORNING di atas - tapi tetap moderat (bukan
    // nilai maksimum 0.50 yang bisa jadi terlalu norak/menyilaukan).
    #define LIGHTSHAFT_SUNSET_SATURATION 0.10 //[-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.05 //[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]
    // v9.0: Bloom disabled by request; keep the controls for compatibility.
    // 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]
    // ("perbagus atmosphere/postprocessing untuk adventure/survival melihat
    // pemandangan" fix): dinaikkan dari 4 -> 6 supaya detail pemandangan
    // jarak jauh (pegunungan, hutan, dsb) terlihat lebih tajam/jelas.
    // ("sheders kaya blur burem" fix): dinaikkan lagi 6 -> 7 untuk
    // mengimbangi softness sisa dari TAA+FXAA gabungan (lihat
    // FXAA_STRENGTH di bawah & lib/antialiasing/fxaa.glsl edgeThresholdMin).
    #define IMAGE_SHARPENING 7 //[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.40 //[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.50 //[0.40 0.50 0.60 0.65 0.70 0.75 0.80]
    #define SCENE_AUTO_EXPOSURE_MAX 1.00 //[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]
    // ("awan burem/sheders kaya blur" fix): diturunkan dari 75 -> 50.
    // Dikombinasikan dengan edgeThresholdMin yang dinaikkan di
    // lib/antialiasing/fxaa.glsl, FXAA sekarang cuma nge-halusin edge
    // block/geometry yang jelas, bukan gradasi lembut awan/langit -
    // strength yang lebih rendah membuat sisa smoothing di edge asli itu
    // juga lebih ringan/nggak nge-blur, TAA yang sudah stabil (TAA_MODE=1)
    // tetap jadi anti-aliasing utama.
    #define FXAA_STRENGTH 50 //[-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 2 //[0 1 2]
    // v9.0 Survival/Adventure: All ores enabled by default for mining visibility.
    // GLOWING_ORE_MULT raised 0.50 -> 0.70 so ores glow clearly in dark caves
    // without being washed-out. Lower = brighter glow, higher = more subtle.
    #define GLOWING_ORE_MULT 0.70 //[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]
    // ("torch/lantern block nya jadi putih" fix): ini penyebab utamanya -
    // di finalDiffuse (mainLighting.glsl), pow2(emission) langsung
    // dikalikan ke warna asli tekstur block (color.rgb *= finalDiffuse).
    // Di 40, emission block full-bright bisa >1.0 sehingga tekstur
    // torch/lantern yang sudah terang (oranye/kuning) langsung clip ke
    // putih polos, "menghapus" warna fisik teksturnya sendiri. Diturunkan
    // ke 25 supaya block tetap menyala/emissive tapi warna aslinya masih
    // kelihatan, tidak langsung over-expose jadi putih.
    #define CUSTOM_EMISSION_INTENSITY 25 //[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]
    // How strongly torches/glowstone/lava/etc. dim when directly hit by
    // sunlight (checked against the real shadow map, not just sky
    // exposure - a torch under a roof stays lit). 0 = off (old behaviour,
    // emission never dims), 1.0 = fully switches off in direct sun,
    // matching the classic "torch invisible in daylight, glows in the
    // dark/caves" look. See mainLighting.glsl's emissiveSunHit.
    #define EMISSIVE_SUN_SUPPRESS 0.90 //[0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00]
    #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.
    // ("malam jangan gelap banget" fix, round 2): dinaikkan lagi dari 320
    // ke 360 supaya area tanpa sumber cahaya langsung di malam hari makin
    // tidak gelap total.
    // ("area gelap harus benar-benar gelap, jangan pucat, fokus ke satu
    // cahaya" fix, sesuai referensi foto): permintaan sekarang KEBALIKAN
    // dari round di atas - diturunkan jauh dari 360 -> 90. CAVE_LIGHTING
    // adalah lantai kecerahan minimum yang dipaksakan ke area tanpa
    // skylight (lihat minimumLighting.glsl) - di 360% lantai ini cukup
    // tinggi sehingga sudut/ruangan gelap tidak pernah benar-benar gelap,
    // hasilnya "gelap pucat" seperti yang dikeluhkan. 90% menurunkan lantai
    // itu jauh (mendekati baseline lama sebelum kedua fix di atas) supaya
    // area tanpa cahaya langsung bisa jadi benar-benar gelap/hitam seperti
    // foto referensi, tapi tidak nol total (0) supaya tetap ada sedikit
    // panduan visual di gua/malam hari, bukan hitam pekat yang bikin
    // orientasi jadi sulit/terasa "rusak".
    #define CAVE_LIGHTING 40 //[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.
    // ("area gelap harus benar-benar gelap, jangan pucat, fokus ke satu
    // cahaya" fix, sesuai referensi foto): diturunkan jauh dari 170 -> 100
    // (netral). Di atas 100, AMBIENT_MULT men-"angkat" shadowLightMult (si
    // penentu seberapa gelap area yang tidak kena cahaya langsung) ke arah
    // 1.0/terang dan mencampur warna area gelap ke arah warna ambient
    // (lihat mainLighting.glsl) - itu penyebab utama bayangan kelihatan
    // pucat/tercuci alih-alih benar-benar gelap. 100 = netral, tidak ada
    // pengangkatan tambahan itu sama sekali, jadi kontras antara area yang
    // kena cahaya langsung vs yang tidak jadi jauh lebih tegas.
    // ("block/tangan kelihatan cerah/menyala di shadow atau tempat gelap"
    // fix): dikembalikan ke 100 (netral). Di atas 100, AMBIENT_MULT menarik
    // shadowLightMult (penentu segelap apa area yang tak kena cahaya
    // langsung) ke arah 1.0/terang penuh - itu sebabnya block/tangan di
    // dalam shadow ikut "menyala" alih-alih benar-benar gelap. 100 = tidak
    // ada pengangkatan tambahan sama sekali, jadi area gelap tetap gelap.
    #define AMBIENT_MULT 100 //[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
    // sempat 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.
    // ("pastikan animasi air ada ketinggian, jangan datar" fix, round 2):
    // dinyalakan kembali. User sekarang secara eksplisit minta permukaan
    // air benar-benar naik-turun secara fisik, bukan cuma riak dari
    // normal-map/shading yang datar. DoWave_Water() sudah dibatasi
    // amplitudonya (lihat wavingBlocks.glsl, wave * 0.22 - 0.07) jadi
    // pergerakannya tetap halus/moderat, tidak berlebihan.
    //#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.
    // ("di luar terlalu cerah" fix): diturunkan sedikit dari 1.00 -> 0.90
    // supaya scene tidak overexposed di siang hari, terasa lebih sinematik
    // (sedikit "underexposed" khas film), tanpa membuat area gelap jadi
    // ikut gelap gulita.
    #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.
    // ("perbagus atmosphere/postprocessing untuk adventure/survival" fix):
    // dinaikkan satu langkah (1.15 -> 1.20) untuk kesan gambar yang sedikit
    // lebih punchy/sinematik saat memandang pemandangan, masih jauh dari
    // titik yang pernah terbukti bikin shadow crushed.
    #define TM_CONTRAST 0.98 //[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 0.98 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 5 //[0 1 2 3 4 5 6] // 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), 3 = Uchimura/"GT" (Hajime Uchimura's CEDEC 2017 tonemap - explicit toe/linear/shoulder with a hard display-max, tends to keep midtones punchy while still rolling off highlights softly), 4 = AgX (Troy Sobotka's AgX view transform, minimal fitted approximation), 5 = Salicylic AgX Film (full AgX with ASC-CDL look transform - cinematic film look with punchy midtones, soft highlight rolloff, and natural color separation, ported from SalicylicShaders), 6 = ACES Fitted (BakingLab ACES with proper input/output color matrices - realistic film look with natural highlight rolloff, from Foxy Shader)
    #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

    // Shadow/Highlight color grading (from Foxy Shader)
    // 0 = off, 0.05-0.40 = strength. Pushes shadows toward cool/blue, highlights toward warm/golden.
    #define SHADOW_HIGHLIGHT_GRADE 0.35 //[0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40]

    // Purkinje shift (from Foxy Shader)
    // Simulates night vision: increased blue sensitivity in low light.
    // 0 = off, 0.10-0.50 = strength.
    #define PURKINJE_SHIFT 0.30 //[0.00 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.50]

    // White balance (from Foxy Shader) - kelvin temperature
    // 6500 = neutral (D65), lower = warmer, higher = cooler
    #define WHITE_BALANCE 6500 //[4000 4500 5000 5500 6000 6500 7000 7500 8000 8500 9000]

    // Contrast pivot (from Foxy Shader) - strength of pivot-anchored contrast
    // 0 = off, 0.15-0.50 = strength. Pivot at 0.18 luma.
    #define CONTRAST_PIVOT_STRENGTH 0.35 //[0.00 0.15 0.25 0.35 0.50]

    // Chroma boost (from Foxy Shader) - subtle saturation push
    // 0 = off, 0.15-0.50 = strength
    #define CHROMA_BOOST 0.35 //[0.00 0.15 0.25 0.35 0.50]

    // ("film look tapi jangan hitam putih banget" fix): the AgX curve used
    // by TONEMAP_STYLE 4/5 naturally desaturates hard toward the highlights
    // (that's what makes it "filmic"), and its ASC-CDL look-transform step
    // (composite5.glsl) had power/saturation hardcoded (1.15 / 1.25) so it
    // couldn't be tuned without editing code directly. Exposed here instead.
    // CDL power: pushes contrast around the curve. Lowered slightly from
    // 1.15 -> 1.08 so the image doesn't get pushed toward the extremes
    // (near-black/near-white) as hard - a big part of what read as "hitam
    // putih"/monochrome-ish was contrast, not just missing color.
    #define CDL_LOOK_POWER 1.08 //[0.80 0.85 0.90 0.95 1.00 1.05 1.08 1.10 1.15 1.20 1.25 1.30 1.35 1.40]
    // CDL saturation: raised from 1.25 -> 1.45 to push color back into the
    // AgX curve's naturally-desaturated highlights, so bright areas keep
    // visible color/hue instead of fading toward grey/white while the rest
    // of the cinematic AgX look (soft highlight rolloff, filmic contrast
    // shape) stays intact.
    #define CDL_LOOK_SATURATION 1.20 //[0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.60 1.70 1.80 2.00]
    // Turun dikit dari 1.35 -> 1.20 (nilai puluhan diturunkan sedikit)
    // supaya warna nggak terlalu jenuh/vivid, masih tetap hidup tapi lebih
    // natural.
    // ("shader kasih saturasi dikit" fix, round 2): dinaikkan sedikit dari
    // 0.95 -> 1.05 supaya warna keseluruhan (termasuk malam hari) sedikit
    // lebih hidup/jenuh, tanpa balik ke level vivid yang berlebihan.
    // ("shaders kurang saturasi/kaya hitam-putih" fix): dinaikkan dari 1.05
    // -> 1.30 supaya warna keseluruhan lebih hidup, ACES filmic curve-nya
    // tetap dipakai (TONEMAP_STYLE 1) tapi tidak lagi terasa pudar/desaturated.
    // ("shaders jangan over saturasi, enak dilihat, cocok buat sinematik"
    // fix): diturunkan jauh dari 1.65 -> 1.15. 1.65 membuat warna
    // "meledak"/terlalu vivid untuk nuansa sinematik yang tenang; 1.15
    // masih sedikit lebih hidup dari netral (1.00) tapi jauh dari
    // oversaturasi.
    #define T_SATURATION 1.29 //[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.29 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]
    // Diturunkan sepasang dengan T_SATURATION (1.45 -> 1.05) untuk alasan
    // yang sama - biar warna nggak jenuh berlebihan.
    #define T_VIBRANCE 1.29 //[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.29 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]
    // ("jangan over saturasi" fix): dinaikkan dari 20 -> 40 supaya area
    // terang/highlight (obor/lentera/lava dari dekat, matahari) melembut
    // ke arah netral alih-alih tetap dipaksa vivid - efeknya highlight
    // terasa lebih natural/sinematik, bukan menyala warna-warni.
    #define HIGHLIGHT_SATURATION_ROLLOFF 0 //[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.
    // ("cahaya matahari warm tapi jangan pekat oranye/merah, natural" fix,
    // round 2): dinaikkan sedikit dari 0.00 -> 0.08 - dorongan ringan saja
    // pada hue oranye supaya sinar matahari terasa hangat secara alami,
    // sengaja tidak dinaikkan lebih tinggi lagi supaya tidak jatuh ke
    // kesan oranye/merah yang pekat/berlebihan.
    #define SELECTIVE_GRADE_ORANGE 0.08 //[-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.15 //[-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 -3.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

    // ("perbagus atmosphere/postprocessing untuk adventure/survival melihat
    // pemandangan" fix): diaktifkan (0 -> 1) dengan intensitas rendah di
    // bawah, supaya ada sedikit framing sinematik di tepi layar tanpa
    // menggelapkan pemandangan secara keseluruhan.
    #define VIGNETTE 1 //[0 1]
    #define VIGNETTE_INTENSITY 0.08 //[0.00 0.04 0.08 0.12 0.16 0.22 0.30]

    // 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.
    // ("shader kasih saturasi dikit, malam jangan gelap banget" fix, round
    // 2): diturunkan lagi ke 0.00 supaya area gelap/malam mempertahankan
    // saturasi warnanya sepenuhnya, tidak dipudarkan sama sekali.
    #define TM_DARK_DESATURATION 0.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]
    // ("cahaya torch/lantern jangan putih, harus hangat" fix): diturunkan
    // dari 1.20 -> 0.90 supaya cahaya terang (obor/lentera dari dekat) lebih
    // lambat "dipaksa" ke putih polos, jadi warna hangatnya tetap kelihatan.
    #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.
    // ("cahaya torch/lantern jangan putih" fix): dinaikkan ke nilai maksimum
    // slider (28.0 -> 32.0) supaya makin banyak "headroom" sebelum cahaya
    // terang dari obor/lentera dipaksa clip ke putih polos.
    #define TM_HDR_HEADROOM 32.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
    // ("Unbound Visual +" fix - sunrise/sunset "medieval" epic tapi lembut
    // di mata): LIGHT_MORNING (cahaya matahari langsung saat pagi/senja)
    // dihangatkan dari hampir putih-kebiruan jadi keemasan hangat -
    // R dinaikkan, B diturunkan cukup jauh - supaya terasa seperti cahaya
    // senja/golden hour yang dramatis. Intensitas (I) dinaikkan sedikit
    // saja (0.56->0.62), bukan besar-besaran, supaya tetap nyaman di mata.
    // ("pagi/sore jangan oren pekat, tapi jangan putih juga - warm
    // seimbang" fix, round 2): rasio R/G/B ditarik sedikit ke arah netral
    // (R diturunkan tipis, G/B dinaikkan tipis) supaya cahaya golden hour
    // tetap hangat/keemasan tapi nggak jatuh ke oranye pekat, sekaligus
    // nggak mendekati putih polos seperti tengah hari.
    #define LIGHT_MORNING_R 1.02 //[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 0.96 //[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 0.87 //[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]
    // ("kecerahan matahari ke permukaan dikurangi dikit" fix): 0.62 -> 0.55.
    #define LIGHT_MORNING_I 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.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00]
    // ATM_MORNING (warna langit saat pagi/senja) dipertegas ke arah
    // jingga-keemasan yang lebih kaya (R naik, G/B turun) supaya kesan
    // langit senja "epic" ala medieval - tapi ATM_MORNING_I sengaja
    // ditahan moderat (0.55->0.58, bukan >0.7) supaya tidak menyilaukan.
    // ("pagi/sore jangan oren pekat" fix, round 2): sama seperti
    // LIGHT_MORNING di atas, G/B dinaikkan tipis supaya langit senja
    // masih golden/hangat tapi tidak jingga pekat.
    #define ATM_MORNING_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 ATM_MORNING_G 0.78 //[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.58 //[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.58 //[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.
    // ("cahaya matahari ke permukaan jangan vivid cold, tapi warm - jangan
    // pekat oranye/merah, natural kaya dunia asli" fix, round 2): dibalik
    // dari tuning di atas - R dinaikkan tipis & B diturunkan tipis supaya
    // sinar matahari siang punya sedikit kehangatan alami (mendekati
    // cahaya matahari asli ~5500-6000K), tapi pergeserannya sengaja
    // dijaga kecil (bukan ke oranye/merah pekat) supaya masih terasa
    // natural, bukan warna dramatis/keemasan berlebihan.
    // ("Unbound Visual +" fix - cahaya matahari warm-white, tidak pekat):
    // R dinaikkan tipis (1.05->1.08) dan B diturunkan tipis (0.92->0.90)
    // supaya kesan hangat/kekuningan tetap ada tapi cahaya utamanya masih
    // dominan putih (bukan kuning pekat). Intensitas (I) diturunkan sedikit
    // dari 0.75 -> 0.70 supaya cahaya siang terasa lebih lembut/tidak
    // menyilaukan mata.
    #define LIGHT_NOON_R 1.08 //[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 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]
    // ("kecerahan matahari ke permukaan dikurangi dikit" fix): 0.70 -> 0.60.
    // ("kecerahan matahari ke permukaan dikurangi dikit lagi" fix, round 3):
    // 0.60 -> 0.50, satu step moderat lagi supaya cahaya siang ke
    // permukaan tidak terlalu menyilaukan.
    // ("di luar terlalu cerah" fix): diturunkan dari 1.20 -> 1.00 (netral)
    // supaya cahaya siang tidak "overexposed"/kelewat terang.
    #define LIGHT_NOON_I 1.20 //[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.
    // ("cahaya matahari jangan vivid cold, warm natural" fix, round 2):
    // diturunkan dari 6500 -> 5800 - suhu warna matahari siang di dunia
    // nyata ada di kisaran ini, memberi kesan hangat alami dibanding 6500K
    // yang condong putih-kebiruan/vivid-cold.
    #define SUN_KELVIN_NOON 5800 //[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]

    // ("warna cahaya bulan kebiruan total, minta putih/abu-abu" fix): malam
    // hari sebelumnya pakai rasio warna yang sangat condong ke biru (channel
    // biru sampai 3x lebih kuat dari merah/hijau di lightAndAmbientColors.glsl)
    // - dampaknya cahaya bulan/malam terlihat biru pekat, bukan putih
    // keabu-abuan seperti cahaya bulan asli (yang sebenarnya cuma sinar
    // matahari dipantulkan, nyaris netral). Nilai ini menarik warna malam ke
    // arah abu-abu netral SAMBIL MEMPERTAHANKAN kecerahan aslinya (blend
    // menuju luminance-nya sendiri, bukan sekadar dikalikan putih polos, jadi
    // malam tidak jadi lebih terang/gelap, cuma kurang biru). 0.0 = warna
    // asli (biru pekat), 1.0 = abu-abu netral total tanpa tone biru sama
    // sekali. Default 0.6 dipilih supaya tetap terasa "malam" (masih ada
    // sedikit sentuhan sejuk) tapi jelas lebih putih/abu-abu, bukan biru
    // total - aman untuk dikurangi/dinaikkan lewat slider ini kapan saja
    // tanpa perlu edit kode lagi.
    #define MOONLIGHT_DESATURATE 0.6 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0]

    #define RAYLEIGH_MIE_STRENGTH 0.35 //[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]
    // ("cahaya matahari jangan vivid cold, warm natural" fix, round 2):
    // R dinaikkan tipis, B diturunkan tipis supaya atmosfer siang hari
    // sedikit lebih hangat/natural, bukan condong biru/vivid-cold.
    #define ATM_NOON_R 0.94 //[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.88 //[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]
    // ("cahaya bulan ke permukaan putih-biru muda, jangan biru banget"
    // fix): rasio R/G/B ditarik jauh lebih dekat ke netral/putih -
    // sebelumnya R jauh lebih rendah dari B (0.40 vs 1.30) bikin cahaya
    // bulan berat ke biru pekat. R/G dinaikkan, B diturunkan supaya masih
    // ada semburat biru muda malam hari tapi dominan putih.
    #define LIGHT_NIGHT_R 0.78 //[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.88 //[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.12 //[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.
    // ("malam jangan gelap banget" fix, round 2): dinaikkan lagi dari 0.90
    // ke 1.15 supaya malam hari secara keseluruhan lebih terang, masih
    // kerasa malam tapi nggak gelap total.
    #define LIGHT_NIGHT_I 1.15 //[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]
    // Sama seperti LIGHT_NIGHT di atas: warna langit/ambient malam ditarik
    // lebih dekat ke putih, bukan biru pekat.
    #define ATM_NIGHT_R 0.92 //[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.98 //[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.22 //[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.
    // ("langit malam lebih terang & rame" request): dinaikkan lagi dari 1.15
    // ke 1.35 supaya langit malam (bintang, galaxy/nebula, planet) kelihatan
    // lebih terang dan hidup.
    #define ATM_NIGHT_I 1.35 //[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.
    // ("cahaya torch/lantern jangan putih, harus hangat" fix): R dinaikkan,
    // G/B diturunkan supaya rasio warnanya lebih condong ke oranye/amber
    // hangat, bukan mendekati putih netral.
    #define XLIGHT_R 1.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]
    #define XLIGHT_G 0.82 //[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.28 //[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]
    // v9.0: Torch/lantern blocklight warmed slightly; preserve orange/amber hue. //[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/lantern terlalu terang" fix): diturunkan dari 1.00 -> 0.75.
    // Warna tetap hangat (XLIGHT_R/G/B di atas tidak diubah), cuma
    // intensitas keseluruhannya dikurangi supaya tidak terlalu menyilaukan/
    // over-expose dari dekat.
    // ("kecerahan torch/lantern kurangi dikit aja" fix, round 2): diturunkan
    // lagi dari 0.75 -> 0.60. Bukan perubahan besar, cuma satu step lagi
    // biar cahaya block tidak terlalu terang tanpa kehilangan nyala
    // hangatnya (warna XLIGHT_R/G/B tetap sama).
    #define XLIGHT_I 1.10 //[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]
    // ("radius & formula torch/lantern dikembalikan ke versi lama/original" fix):
    // dikembalikan dari 2.20 -> 1.50 (nilai asli v2.3) supaya kurva kecerahan
    // cahaya block (torch/lantern/dll) kembali ke bentuk original.
    #define XLIGHT_CURVE 1.50 //[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.
    // ("radius kecilkan dikit, bentuk halus jangan diamond bawaan MC" fix):
    // NOBLE_BLOCKLIGHT_FALLOFF dinyalakan lagi - kurva inverse-square-nya
    // (lihat mainLighting.glsl) transisi antar level cahaya-nya jauh lebih
    // halus/round dibanding kurva default 2 cabang (steep+calm) yang bikin
    // tepi antar level lightmap kelihatan seperti diamond tajam. Eksponen
    // falloff-nya (di mainLighting.glsl) juga dinaikkan sedikit dari 1.8 ->
    // 2.1 supaya jangkauannya sedikit lebih pendek dari sebelumnya, tanpa
    // balik ke radius sempit versi lama (2.6).
    #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 TAA_MODE >= 1
        #define TAA
    #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
        #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
    #else
        #undef ENDER_MIST
        #undef ENDER_CLOUD_CEILING
        #undef ENDER_LIGHTNING
    #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.
    // ("air jangan ke warna hitam" fix, round 2): dinaikkan tipis lagi
    // dari 0.42 -> 0.48 supaya warna air-dalam (terutama malam hari saat
    // vsBrightness rendah) nggak jatuh terlalu gelap/hitam.
    vec3 waterFogColor = underwaterColorM2 * vec3(0.48 + 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