sandpypi/Sand.App/CoreSimulationBackend.cs

74 lines
4.8 KiB
C#

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<byte> 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);
}