diff --git a/.gitignore b/.gitignore
index 706cf583..7664883e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,6 @@ trace-*.json
.DS_Store
*.swp
/.idea/
+
+# MONKEY: per-run client state written by benilla (saved variables, camera) — not source.
+/benilla-config/
diff --git a/crates/benilla-app/assets/ui/OptionsFrame.xml b/crates/benilla-app/assets/ui/OptionsFrame.xml
index 34096572..39320152 100644
--- a/crates/benilla-app/assets/ui/OptionsFrame.xml
+++ b/crates/benilla-app/assets/ui/OptionsFrame.xml
@@ -677,6 +677,11 @@
.. "There is no exclusive fullscreen mode. WoW itself removed one in 8.0.1, and "
.. "modern Classic offers these same two."
+ BENILLA_TOOLTIP_WORLD_SHADOWS =
+ "Renders real dynamic silhouettes for players, NPCs, creatures, and mounts. Terrain, "
+ .. "buildings, and trees keep their authored shading, matching Wrath's character-only "
+ .. "shadow tier. This uses additional GPU time and memory."
+
OPTIONS_PAGE_ROWS = {
Controls = {
"RowStickyTarget", "RowBlockTrades", "RowAutoLoot", "RowInvertMouse",
@@ -689,7 +694,7 @@
},
Graphics = {
"RowUiScale", "RowFarclip", "RowWorldDetail",
- "RowDisplayMode", "RowVerticalSync", "RowRenderScale",
+ "RowDisplayMode", "RowVerticalSync", "RowWorldShadows", "RowRenderScale",
},
Nameplates = {
"RowEnemyPlates", "RowFriendlyPlates",
@@ -2517,11 +2522,21 @@
"OPTION_TOOLTIP_VERTICAL_SYNC")
-
+
+
+ OptionsRow_OnLoad(self, "worldShadows", "Real Character Shadows",
+ "BENILLA_TOOLTIP_WORLD_SHADOWS")
+
+
+
+
+
+
+
-- Render Scale (decision 1639) -- benilla's own
-- row, no 1.12 counterpart: the reference renders
diff --git a/crates/benilla-app/src/blob_shadow.rs b/crates/benilla-app/src/blob_shadow.rs
index 6070f668..953f15d8 100644
--- a/crates/benilla-app/src/blob_shadow.rs
+++ b/crates/benilla-app/src/blob_shadow.rs
@@ -182,6 +182,7 @@ fn sync_shadows(
/// reaches zero, or no receiving surface is in the box (the reference's no-ground gate).
#[allow(clippy::too_many_arguments, clippy::type_complexity)]
fn update_shadows(
+ video: Res,
time: Res