using Sand.Core; namespace Sand.App; internal sealed class CoreSimulationBackend : ISimulationBackend { private readonly SandSimulation _simulation; private readonly AppSimulationFrameStats _frameStats = new(); public CoreSimulationBackend(SandSimulation simulation) { _simulation = simulation; } public string BackendName => "dense"; public SimulationSettings Settings => _simulation.Settings; public AppSimulationFrameStats FrameStats { get { var source = _simulation.FrameStats; _frameStats.Frame = source.Frame; _frameStats.ProcessedCells = source.ProcessedCells; _frameStats.ParticleCount = source.ParticleCount; _frameStats.MinActiveX = source.MinActiveX; _frameStats.MinActiveY = source.MinActiveY; _frameStats.MaxActiveX = source.MaxActiveX; _frameStats.MaxActiveY = source.MaxActiveY; _frameStats.LoadedChunkCount = source.LoadedChunkCount; _frameStats.ActiveChunkCount = source.ActiveChunkCount; _frameStats.DirtyChunkCount = source.DirtyChunkCount; _frameStats.SteppedChunkCount = source.SteppedChunkCount; _frameStats.SleepingChunkCount = source.SleepingChunkCount; _frameStats.FieldPageCount = source.FieldPageCount; _frameStats.MoveAttemptCount = source.MoveAttemptCount; _frameStats.VerticalMoveAttemptCount = source.VerticalMoveAttemptCount; _frameStats.DiagonalMoveAttemptCount = source.DiagonalMoveAttemptCount; _frameStats.LateralMoveAttemptCount = source.LateralMoveAttemptCount; _frameStats.SuccessfulMoveCount = source.SuccessfulMoveCount; _frameStats.SwapAttemptCount = source.SwapAttemptCount; _frameStats.StalledMovableCount = source.StalledMovableCount; _frameStats.MovementOnlyFastPathCount = source.MovementOnlyFastPathCount; _frameStats.FullRuntimeStepCount = source.FullRuntimeStepCount; _frameStats.FullRuntimeSolidCount = source.FullRuntimeSolidCount; _frameStats.FullRuntimeLiquidCount = source.FullRuntimeLiquidCount; _frameStats.FullRuntimeGasCount = source.FullRuntimeGasCount; _frameStats.MovedParticleCount = source.MovedParticleCount; _frameStats.SwappedParticleCount = source.SwappedParticleCount; _frameStats.VisualDirtyPageCount = source.VisualDirtyPageCount; _frameStats.FrameBuildBytesTouched = source.FrameBuildBytesTouched; _frameStats.ActivationTimeMicroseconds = source.ActivationTimeMicroseconds; _frameStats.MovementTimeMicroseconds = source.MovementTimeMicroseconds; _frameStats.RuntimeTimeMicroseconds = source.RuntimeTimeMicroseconds; _frameStats.FieldDecayTimeMicroseconds = source.FieldDecayTimeMicroseconds; _frameStats.RenderTimeMicroseconds = source.RenderTimeMicroseconds; return _frameStats; } } public int Frame => _simulation.Frame; public int ParticleCount => _simulation.ParticleCount; public ReadOnlySpan BuildRgbaFrame() => _simulation.BuildRgbaFrame(); public void Step(float dt) => _simulation.Step(dt); public void Clear() => _simulation.Clear(); public void RefreshSettingsState() => _simulation.RefreshSettingsState(); public void ClearParticleCircle(int centerX, int centerY, int brushRadius) => _simulation.ClearParticleCircle(centerX, centerY, brushRadius); public void ClearParticlePourAtPixel(int centerX, int centerY, int brushRadius, int maxParticles, int seed) => _simulation.ClearParticlePourAtPixel(centerX, centerY, brushRadius, maxParticles, seed); public void CreateParticleCircle(int centerX, int centerY, int brushRadius, string particleId) => _simulation.CreateParticleCircle(centerX, centerY, brushRadius, particleId); public void CreateParticlePourAtPixel(int centerX, int centerY, int brushRadius, string particleId, int maxParticles, int seed) => _simulation.CreateParticlePourAtPixel(centerX, centerY, brushRadius, particleId, maxParticles, seed); public void ApplyWindBrushAtPixel(int centerX, int centerY, int brushRadius, float forceX, float forceY) => _simulation.ApplyWindBrushAtPixel(centerX, centerY, brushRadius, forceX, forceY); public void ApplyAirBrushAtPixel(int centerX, int centerY, int brushRadius, float forceX, float forceY) => _simulation.ApplyAirBrushAtPixel(centerX, centerY, brushRadius, forceX, forceY); public void ApplyGravityBrushAtPixel(int centerX, int centerY, int brushRadius, float strength) => _simulation.ApplyGravityBrushAtPixel(centerX, centerY, brushRadius, strength); public void ApplyRepulsorBrushAtPixel(int centerX, int centerY, int brushRadius, float strength) => _simulation.ApplyRepulsorBrushAtPixel(centerX, centerY, brushRadius, strength); }