diff --git a/docs/research/2026-09-01-overhaul/s5-consumers-material-closeout-packet.md b/docs/research/2026-09-01-overhaul/s5-consumers-material-closeout-packet.md index e77c0f83..77762cc6 100644 --- a/docs/research/2026-09-01-overhaul/s5-consumers-material-closeout-packet.md +++ b/docs/research/2026-09-01-overhaul/s5-consumers-material-closeout-packet.md @@ -360,3 +360,15 @@ visibility/terrain/frame/renderer tests, and 3 AP-116 settings/live-object tests), commit once, then return to a narrow retail comment-truth re-review. The production/gate-honesty lens remains undispatched until that re-review passes. A third fix round still stops the chunk. + +### 10.1 Fix-round-1 implementation result + +The three stale descriptions are corrected without behavior or assertion +changes. `UseWorldView` now names only the completed retail PView and explicitly +excludes the null-root safety draw. `CopyVisibleCellsTo` describes a diagnostic +union and names the distinct particle, point-light, and future directional- +shadow consumers. `ParticleSystem` scopes the logarithmic lifecycle statement +to its `SortedSet` indexes and records the sorted list's binary-search plus +linear-shift insertion and linear search/compaction removal costs. Focused gate +results: Core `ParticleSystemTests` 47/47, App visibility/terrain/frame/renderer +38/38, and AP-116 settings/live-object 3/3; `git diff --check` is clean. diff --git a/src/AcDream.App/Rendering/Vfx/ParticleVisibilityController.cs b/src/AcDream.App/Rendering/Vfx/ParticleVisibilityController.cs index 1ba84a27..5dcb274d 100644 --- a/src/AcDream.App/Rendering/Vfx/ParticleVisibilityController.cs +++ b/src/AcDream.App/Rendering/Vfx/ParticleVisibilityController.cs @@ -41,10 +41,11 @@ public sealed class ParticleVisibilityController : IWorldSceneParticleVisibility } /// - /// Declares that this frame has an authoritative world-visibility product. - /// That product can come from the unified retail PView or from the outdoor - /// landscape fallback. Login and portal-space frames deliberately omit it; - /// dedicated pass and examination emitters carry explicit bypass policies. + /// Declares that this frame has the completed retail PView product: one + /// viewer position plus its exact walk-owned landscape-cell set. Frames + /// without that PView product, including login, portal space, and the + /// null-root terrain safety draw, deliberately omit it; dedicated-pass and + /// examination emitters carry explicit bypass policies. /// public void UseWorldView() { diff --git a/src/AcDream.App/Rendering/Walk/WalkFrameDriver.cs b/src/AcDream.App/Rendering/Walk/WalkFrameDriver.cs index 23313aa4..0ff79d10 100644 --- a/src/AcDream.App/Rendering/Walk/WalkFrameDriver.cs +++ b/src/AcDream.App/Rendering/Walk/WalkFrameDriver.cs @@ -868,11 +868,14 @@ internal sealed class WalkFrameDriver : IWalkEventSink, IWalkLookInViewSource } /// - /// Copies the walk's complete retail CObjCell::IsInView answer: - /// EnvCells reached by interior floods/look-ins plus outdoor land cells - /// visited by the landscape walk. The two families stay separately - /// retained because only the first is valid EnvCell batch input, but - /// particles, lights, and shadows consume their union. + /// Copies the walk's diagnostic union: EnvCells reached by interior + /// floods/look-ins plus outdoor land cells visited by the landscape walk. + /// The two families remain separately retained because EnvCells are shell + /// preparation input while only the landscape half feeds land-cell particle + /// eligibility; EnvCell particle eligibility is the constant-true virtual. + /// Point lights use the resident registry, and directional-shadow use of the + /// landscape product remains owned by S5-c2. No admission path consumes this + /// union as a complete CObjCell::IsInView answer. /// internal void CopyVisibleCellsTo(HashSet destination) { diff --git a/src/AcDream.Core/Vfx/ParticleSystem.cs b/src/AcDream.Core/Vfx/ParticleSystem.cs index 3bbae610..3a5ad01c 100644 --- a/src/AcDream.Core/Vfx/ParticleSystem.cs +++ b/src/AcDream.Core/Vfx/ParticleSystem.cs @@ -14,16 +14,17 @@ public sealed class ParticleSystem : IParticleSystem private readonly EmitterDescRegistry _registry; private readonly Random _rng; private readonly Dictionary _byHandle = new(); - // Handles are monotonic, so sorted indexes preserve retail emitter-spawn - // order while making every lifecycle edge O(log E). The old List.Remove - // hard-stop path was O(E) and became visible when portal routes retained - // thousands of finite/fading emitters. + // Handles are monotonic, so the SortedSet indexes preserve retail + // emitter-spawn order while making their lifecycle edges O(log E). Their + // predecessor List.Remove hard-stop path was O(E) and became visible when + // portal routes retained thousands of finite/fading emitters. private readonly SortedSet _allHandles = []; private readonly SortedSet _simulationHandles = []; // ApplyRetailView is a per-frame production path. SortedSet's enumerator - // allocates its traversal stack, so retain this subset as a sorted list; - // lifecycle mutations pay the binary insertion/removal cost and the - // warmed view walk stays allocation-free in emitter-spawn order. + // allocates its traversal stack, so retain this subset as a sorted list. + // Insertion uses a binary search followed by a linear list shift; removal + // searches and compacts linearly. Lifecycle mutations pay those costs so + // the warmed view walk stays allocation-free in emitter-spawn order. private readonly List _worldSimulationHandles = []; private readonly SortedSet[] _renderableHandlesByPass = [[], [], []];