using AcDream.App.Streaming; using AcDream.Core.World; namespace AcDream.App.Rendering.Wb; /// /// Retains the exact published destination-neighborhood snapshot consumed by /// composite-texture reveal warmup. The source refreshes only when canonical /// spatial membership or its destination scope changes, avoiding a scan of /// the retained Far-tier world on every reveal tick. /// internal sealed class CompositeWarmupEntitySource { private readonly GpuWorldState _world; private readonly List _entities = []; private bool _initialized; private ulong _worldGeneration; private uint _destinationCell; private int _radius; public CompositeWarmupEntitySource(GpuWorldState world) { _world = world ?? throw new ArgumentNullException(nameof(world)); } public IReadOnlyList Entities => _entities; public ulong Generation => _worldGeneration; public void Refresh(uint destinationCell, int radius) { ArgumentOutOfRangeException.ThrowIfNegative(radius); ulong worldGeneration = _world.FlatViewGeneration; if (_initialized && _worldGeneration == worldGeneration && _destinationCell == destinationCell && _radius == radius) { return; } _world.CopyPublishedEntitiesNearLandblockForReadiness( destinationCell, radius, _entities); _worldGeneration = worldGeneration; _destinationCell = destinationCell; _radius = radius; _initialized = true; } public void Reset() { _entities.Clear(); _initialized = false; _worldGeneration = 0; _destinationCell = 0; _radius = 0; } }