This checkout had no git history at all, so this one commit carries the whole
of the Everwood work as a single import on top of chairmanpow/benilla-octo's
`main` (706cd71). The two trees have genuinely diverged — each has files the
other does not — so this is a fork point, not a catch-up.
Today's work, which is the reason a baseline exists at all:
- Booth previews no longer cast world shadows (`NO_BOOTH_SHADOW`). Portrait
characters were entering the sun's shadow cascades, so every skinned-rig
shadow specialization compiled live mid-frame; the hitch detector logged
"main thread blocked 1316 ms" beside a `compiled LIVE` warning. This was
the Fashion/Tmog stutter.
- Per-pane dress-up: each `DressUpModel` pane assembles and stages its own
tried-on look instead of every pane mirroring the live player.
- Item template cache is append-only JSONL written on the IO pool, replacing
an 11.6 MB whole-map JSON rewrite on the main thread every 10 s.
- `WOW_SYSTEM_TIMING` rebuilt per-thread: it took 2 mutexes per system enter
and 4 per exit, costing 15 ms a frame (590 fps -> 60) and corrupting the
measurements it was taken to produce.
- The visibility-churn sweep moved to its own `WOW_FLASH_CHURN` switch, so a
frame-cost reading no longer pays 2.7 ms a frame for it.
Local state (`benilla-config/`, `logs/`, `target/`) is excluded by the
existing .gitignore; the account credential it holds is not in this commit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
114 lines
3.9 KiB
Rust
114 lines
3.9 KiB
Rust
//! The stock fade and flash kits (`UIParent.lua`), walked from `UIParent`'s own OnUpdate
|
|
//! (`UIParent.xml:17`), so hiding `UIParent` stops both.
|
|
|
|
use benilla_ui::script::UiScript;
|
|
|
|
use super::test_ui::load_ui as load_xml;
|
|
|
|
#[test]
|
|
fn a_started_fade_ramps_off_uiparents_tick_and_completes() {
|
|
benilla_formats::wow_data_or_skip!();
|
|
let mut s = UiScript::new().unwrap();
|
|
s.set_screen_size(1024.0, 768.0);
|
|
load_xml(&s, r"Interface\FrameXML\MoneyFrame.lua");
|
|
load_xml(&s, r"Interface\FrameXML\MoneyFrame.xml");
|
|
load_xml(&s, r"Interface\FrameXML\UIParent.xml");
|
|
load_xml(&s, r"Interface\FrameXML\UIPanelTemplates.lua");
|
|
load_xml(&s, r"Interface\FrameXML\UIPanelTemplates.xml");
|
|
load_xml(&s, r"Interface\FrameXML\GlobalStrings.lua");
|
|
load_xml(&s, r"Interface\FrameXML\BasicControls.xml");
|
|
load_xml(&s, r"Interface\FrameXML\LocaleProperties.lua");
|
|
load_xml(&s, r"Interface\FrameXML\StaticPopup.xml");
|
|
s.resolve();
|
|
s.run(r#"CreateFrame("Frame", "BenillaFadeProbe")"#)
|
|
.unwrap();
|
|
s.run("UIFrameFadeIn(BenillaFadeProbe, 1.0)").unwrap();
|
|
assert!(
|
|
s.eval::<bool>("return UIFrameIsFading(BenillaFadeProbe) == 1")
|
|
.unwrap(),
|
|
"on the fade list"
|
|
);
|
|
assert_eq!(
|
|
s.eval::<f64>("return BenillaFadeProbe:GetAlpha()").unwrap(),
|
|
0.0,
|
|
"the fade armed at its IN startAlpha"
|
|
);
|
|
|
|
s.tick(0.5);
|
|
s.resolve();
|
|
let mid = s.eval::<f64>("return BenillaFadeProbe:GetAlpha()").unwrap();
|
|
assert!(
|
|
(mid - 0.5).abs() < 1e-3,
|
|
"half the timeToFade in, half the ramp: {mid}"
|
|
);
|
|
|
|
s.tick(0.6); // past timeToFade
|
|
s.resolve();
|
|
assert_eq!(
|
|
s.eval::<f64>("return BenillaFadeProbe:GetAlpha()").unwrap(),
|
|
1.0,
|
|
"the fade completes at its endAlpha"
|
|
);
|
|
assert!(
|
|
!s.eval::<bool>("return UIFrameIsFading(BenillaFadeProbe) == 1")
|
|
.unwrap(),
|
|
"…and leaves the list"
|
|
);
|
|
assert!(s.errors().is_empty(), "script errors: {:?}", s.errors());
|
|
}
|
|
|
|
#[test]
|
|
fn a_flash_alternates_then_stops() {
|
|
benilla_formats::wow_data_or_skip!();
|
|
let mut s = UiScript::new().unwrap();
|
|
s.set_screen_size(1024.0, 768.0);
|
|
load_xml(&s, r"Interface\FrameXML\MoneyFrame.lua");
|
|
load_xml(&s, r"Interface\FrameXML\MoneyFrame.xml");
|
|
load_xml(&s, r"Interface\FrameXML\UIParent.xml");
|
|
load_xml(&s, r"Interface\FrameXML\UIPanelTemplates.lua");
|
|
load_xml(&s, r"Interface\FrameXML\UIPanelTemplates.xml");
|
|
load_xml(&s, r"Interface\FrameXML\GlobalStrings.lua");
|
|
load_xml(&s, r"Interface\FrameXML\BasicControls.xml");
|
|
load_xml(&s, r"Interface\FrameXML\LocaleProperties.lua");
|
|
load_xml(&s, r"Interface\FrameXML\StaticPopup.xml");
|
|
s.resolve();
|
|
|
|
s.run(
|
|
r#"Probe = CreateFrame("Frame", "BenillaFlashProbe", UIParent)
|
|
Probe:SetWidth(10) Probe:SetHeight(10) Probe:SetPoint("TOPLEFT", 0, 0)
|
|
UIFrameFlash(Probe, 0.05, 0.05, 0.3, nil, 0, 0)"#,
|
|
)
|
|
.unwrap();
|
|
assert!(
|
|
s.eval::<bool>("return UIFrameIsFlashing(BenillaFlashProbe) == 1")
|
|
.unwrap(),
|
|
"the frame is on the flash list"
|
|
);
|
|
|
|
// Re-arming a flashing frame returns early (`UIParent.lua:1235`).
|
|
s.run("UIFrameFlash(BenillaFlashProbe, 1, 1, 1, nil, 0, 0)")
|
|
.unwrap();
|
|
assert_eq!(
|
|
s.eval::<i64>("return table.getn(FLASHFRAMES)").unwrap(),
|
|
1,
|
|
"already flashing: the reference returns rather than re-arming"
|
|
);
|
|
|
|
// Past flashDuration the frame leaves both lists at full alpha (`UIParent.lua:1272`).
|
|
for _ in 0..40 {
|
|
s.tick(0.016);
|
|
s.resolve();
|
|
}
|
|
assert!(s.errors().is_empty(), "flashing raised: {:?}", s.errors());
|
|
assert_eq!(
|
|
s.eval::<i64>("return table.getn(FLASHFRAMES)").unwrap(),
|
|
0,
|
|
"the flash finished and the frame left the list"
|
|
);
|
|
assert!(
|
|
!s.eval::<bool>("return BenillaFlashProbe:IsShown()")
|
|
.unwrap(),
|
|
"showWhenDone was nil, so it ends hidden"
|
|
);
|
|
}
|