fix(render): foliage wind keys on the DAT-classified WeatherKind, not the day-group index (Campaign VM VM6)
FoliageWindByDayGroup / FoliageWindDayGroupPoint(int ActiveDayGroup, ...) becomes FoliageWindByWeather / FoliageWindWeatherPoint(string WeatherKind, ...) in AtmospherePolicyDeclaration (Plugin.Abstractions is BCL-only, so the key is the exact member name of AcDream.Core.World.WeatherKind rather than the enum itself). The raw activeDayGroup index carries no weather meaning by itself; WeatherState.cs already classifies each day group's authored DAT name into one of five real weather kinds, and that fact was already threaded through AtmosphericFrameInputs.Weather / uAtmosphereWeather.x — this reuses it instead of guessing an index-to-category mapping. Built-in table (BuiltInAtmosphericRenderPack.AtmospherePolicy()): Clear 0.25/0.15, Overcast 0.60/0.35, Rain 0.85/0.60, Snow 0.35/0.20, Storm 1.00/0.75 — all five WeatherKind members declared, the invented "Cloudy" row dropped. RenderPackAtmospherePolicyEvaluation.FoliageWind now takes a WeatherKind and matches by weather.ToString() (ordinal) against each declared point's name; a kind absent from the table falls back to the declared Clear row, then to (0,0) if Clear itself is undeclared. The delta-seconds EMA interpolation (EaseTowardTarget) is unchanged. AtmosphericPostProcessGraph.ResolveFoliageWind and its two callers (RenderPostProcess via inputs.Weather; RenderDirectionalShadows via foundation.Atmosphere.Kind) now pass WeatherKind instead of the day-group int. RenderPackValidation.ValidateAtmosphere (runs for every pack declaring an AtmospherePolicy, not gated to Tier2/shadow packs) now rejects an unknown or non-exact-case weather-kind name and a repeated kind, mirroring the existing ActiveDayGroupMultiplier duplicate-key check. Tests: RenderPackAtmospherePolicyEvaluationTests rewritten for the kind-keyed API (all five kinds resolve to their declared row, an unlisted kind falls back to Clear, ordinal exact-case matching, null-table handling); RenderPackSpirvValidatorTests gains four descriptor-validation cases (unknown name, wrong case, duplicate kind, the five-kind table accepted); AtmosphericPostProcessGraphTests' three foliage-wind cases now select WeatherKind.Storm via `with` instead of an assumed day-group index. Spot-check (per the coordinator's ask, not changed here): yes — ActiveDayGroupMultiplier / EvaluateDayGroupPolicy (pre-existing, Campaign AR/VM3-era — BuiltInAtmosphericRenderPack.AtmospherePolicy()'s three rows `new ActiveDayGroupMultiplier(0, 1.0), (1, 0.35), (2, 0.20)`) key the sun-ray/shadow/volumetric day-group strength multiplier by the same raw activeDayGroup index with an undocumented assumed meaning (0=brightest ... 2=dimmest), the identical class of issue this commit fixes for foliage wind. Left unchanged per instruction; flagging for the coordinator to file. Full solution Debug and Release builds green. App hermetic filter 6024/6026 — the same 2 pre-existing failures as VM6a/VM6b. Both were re-run in isolation per the verification ask: both still fail alone (not a load-flake in this environment) — confirmed via git stash earlier this session that both already fail on the unmodified pre-VM6 baseline, so they are pre-existing and unrelated to this change. Core.Tests hermetic 4697/4697. RenderPackValidator.Tests 30/30. No shader/spv changes in this commit (pure C#/docs fix). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
39e8408c7d
commit
6cc5e183b9
10 changed files with 325 additions and 106 deletions
|
|
@ -474,18 +474,26 @@ direction to read, and the register row says so.
|
|||
|
||||
### VM6 outcome (implementation landed 2026-08-22; owner visual gate outstanding)
|
||||
|
||||
Two commits (VM6a shader ABI v2 plumbing, VM6b the feature) shipped the exact
|
||||
design above. Settings (`BuiltInAtmosphericRenderPack.Settings()`):
|
||||
`wind-enabled` (bool, default on), `wind-strength` (0–2×, default 1.0),
|
||||
`wind-direction-degrees` (0–360°, default 225 — no authored retail wind
|
||||
direction exists to read), `wind-lean-metres` (default 0.25),
|
||||
`wind-branch-metres` (default 0.15), `wind-flutter-metres` (default 0.05,
|
||||
forced to 0 on the Low preset), `wind-canopy-height-metres` (default 8). The
|
||||
Clear/Cloudy/Overcast/Rainy mean/gust rows live in
|
||||
`AtmospherePolicyDeclaration.FoliageWindByDayGroup`, keyed by the SAME
|
||||
day-group index convention `ActiveDayGroupMultipliers` already established
|
||||
two lines above it in `AtmosphericPolicy()` (0 Clear / 1 Cloudy / 2 Overcast;
|
||||
index 3 Rainy is new). Classification bits live in
|
||||
Two commits (VM6a shader ABI v2 plumbing, VM6b the feature) shipped the
|
||||
design above; a same-day fix-round commit corrected the weather-table key.
|
||||
Settings (`BuiltInAtmosphericRenderPack.Settings()`): `wind-enabled` (bool,
|
||||
default on), `wind-strength` (0–2×, default 1.0), `wind-direction-degrees`
|
||||
(0–360°, default 225 — no authored retail wind direction exists to read),
|
||||
`wind-lean-metres` (default 0.25), `wind-branch-metres` (default 0.15),
|
||||
`wind-flutter-metres` (default 0.05, forced to 0 on the Low preset),
|
||||
`wind-canopy-height-metres` (default 8). The mean/gust rows live in
|
||||
`AtmospherePolicyDeclaration.FoliageWindByWeather`, keyed by NAME
|
||||
(`FoliageWindWeatherPoint.WeatherKind`, an exact ordinal match against
|
||||
`AcDream.Core.World.WeatherKind`'s member names — `Clear` 0.25/0.15,
|
||||
`Overcast` 0.60/0.35, `Rain` 0.85/0.60, `Snow` 0.35/0.20, `Storm` 1.00/0.75),
|
||||
not the raw `activeDayGroup` index the original design used: the index
|
||||
carries no weather meaning by itself, and `WeatherState.cs` already
|
||||
classifies each day group's authored DAT name into one of these five real
|
||||
kinds — the same fact `AtmosphericFrameInputs.Weather` /
|
||||
`uAtmosphereWeather.x` already threads through the frame, reused here
|
||||
instead of re-guessed. `RenderPackAtmospherePolicyEvaluation.FoliageWind`
|
||||
matches by `weather.ToString()` and falls back to the declared Clear row for
|
||||
an unlisted kind. Classification bits live in
|
||||
`FoliageWindClassification` (`AcDream.App.Rendering.Wb`): bit 1 (`0x2`)
|
||||
cutout foliage, bit 2 (`0x4`) trunk, computed once per (entity, subset) in
|
||||
`WbDrawDispatcher.ClassifyBatches` (world receiver) and
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue