From 132b1d07c4091dafcb13307455c40c9dbe911daa Mon Sep 17 00:00:00 2001
From: pkuzic
Date: Fri, 25 Sep 2026 23:22:02 +0100
Subject: [PATCH] MONKEY (reviewfix): document Classic skybox fidelity
Co-Authored-By: GPT-5.6 Sol (Codex)
---
LIGHTING.md | 5 +++++
crates/benilla-world/src/skybox.rs | 10 +++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/LIGHTING.md b/LIGHTING.md
index ff447c35..59d58ea2 100644
--- a/LIGHTING.md
+++ b/LIGHTING.md
@@ -38,6 +38,11 @@ behind each constant.
| Zone skyboxes | the painted sky a zone's `LightParams` names (clear-weather slot, storm slot lerped by the storm blend) for the living, fading in by the Light sphere falloff with the modern client's crossfade (ghost > WMO > zone); extended `LightSkybox.dbc` flags `0x1` day cycle, `0x2` keep sun/moon/stars/clouds, `0x4` fog-colour horizon cone, plus a celestial second model; every skybox now plays its bones, texture transforms, colour and alpha tracks (`benilla-world/src/skybox.rs`, `skybox_anim.rs`, `benilla-formats/src/light/skybox.rs`) | Advanced Graphics → Zone Skyboxes, cvar `zoneSkyboxes` (0 Off default, 1 On; High = 1), env `WOW_ZONE_SKYBOXES=0\|1` |
| Night and interior level | global dimming of the night sky term and of interior ambient | `nightGain`, `interiorGain`, `interiorBakeFloor` |
+`zoneSkyboxes = 0` disables only the added living-player zone slot. WMO and ghost skyboxes are
+the reference 1.12 slots, so their fidelity fixes remain active in Classic: authored colour and
+alpha tracks affect the layer, non-white M2 colours reach the mesh, deterministic captures pose at
+their pinned time, and the batch-order base reserves the lower celestial band and final fog cone.
+
Players reach all of it from **Options -> Advanced Graphics** (a Graphics Preset over everything, a Render Distance slider, a Lighting Quality preset Off / Low / Medium / High / Ultra plus the individual rows; Classic / Off is the original client look). The dev build has a panel for all of it: **Ctrl+Shift+D → Lighting & shadows**, with Dim / Default /
Bright presets.
diff --git a/crates/benilla-world/src/skybox.rs b/crates/benilla-world/src/skybox.rs
index 5c153c57..ba807803 100644
--- a/crates/benilla-world/src/skybox.rs
+++ b/crates/benilla-world/src/skybox.rs
@@ -24,6 +24,13 @@
//! the game day, `0x2` keeps the celestial pass, `0x4` draws a fog-colour cone over the horizon;
//! a celestial model draws as a layer under its main model. Every batch animates
//! ([`crate::skybox_anim`]): bones, texture transforms, colour and alpha tracks.
+//!
+//! MONKEY (reviewfix): those M2-fidelity repairs deliberately also apply when `zoneSkyboxes` is
+//! off. The reference WMO and ghost slots animate their authored colour/alpha and texture tracks,
+//! use non-white M2 colours, and draw batches in authored order; deterministic captures pose those
+//! same tracks at their pinned time rather than substituting the bind pose. The main-order offset
+//! only leaves room for a celestial under-layer and the final fog cone. The cvar gates the added
+//! zone slot, not fixes to the two 1.12 slots.
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
@@ -48,7 +55,8 @@ use benilla_formats::{SKYBOX_FOG_BLEND, SKYBOX_FULL_DAY, SKYBOX_KEEP_CELESTIAL};
const SHOW_SKYBOX: u32 = 0x40000;
/// MONKEY (skybox): batch-order base of a main model's batches; a celestial layer takes `1..`, so
-/// it draws first, under the main model, and the fog cone takes [`FOG_CONE_ORDER`], last.
+/// it draws first, under the main model, and the fog cone takes [`FOG_CONE_ORDER`], last. MONKEY
+/// (reviewfix): this ordering also protects the reference WMO/ghost slots when zone skyboxes are off.
const MAIN_ORDER_BASE: u16 = 24;
/// MONKEY (skybox): the fog cone's batch order, the band's last distinct step.
const FOG_CONE_ORDER: u16 = 56;