engine almost working, backup before adding gas types.
This commit is contained in:
@@ -7,39 +7,28 @@ namespace FluidSim.Tests
|
||||
{
|
||||
public abstract class Scenario
|
||||
{
|
||||
/// <summary>Initialize the scenario with a given audio sample rate.</summary>
|
||||
public abstract void Initialize(int sampleRate);
|
||||
|
||||
/// <summary>Advance one simulation step and return an audio sample.</summary>
|
||||
public abstract float Process();
|
||||
|
||||
/// <summary>Draw the current simulation state onto the given SFML render target.</summary>
|
||||
public abstract void Draw(RenderWindow target);
|
||||
|
||||
// ---------- Shared drawing helpers ----------
|
||||
|
||||
protected const double AmbientPressure = 101325.0;
|
||||
protected const double AmbientTemperature = 300.0; // K
|
||||
protected const double AmbientTemperature = 300.0;
|
||||
|
||||
/// <summary>Map temperature [0 K … 2000 K] to a color: blue (0 K) → green (300 K) → red (2000 K).</summary>
|
||||
// ---------- Color helper ----------
|
||||
protected Color TemperatureColor(double temperature)
|
||||
{
|
||||
// Clamp to the range we want to display
|
||||
double t = Math.Clamp(temperature, 0.0, 2000.0);
|
||||
|
||||
byte r, g, b;
|
||||
if (t < AmbientTemperature)
|
||||
{
|
||||
// Blue → Green
|
||||
double factor = t / AmbientTemperature; // 0 at 0 K, 1 at 300 K
|
||||
double factor = t / AmbientTemperature;
|
||||
r = 0;
|
||||
g = (byte)(255 * factor);
|
||||
b = (byte)(255 * (1.0 - factor));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Green → Red
|
||||
double factor = (t - AmbientTemperature) / (2000.0 - AmbientTemperature); // 0 at 300 K, 1 at 2000 K
|
||||
double factor = (t - AmbientTemperature) / (2000.0 - AmbientTemperature);
|
||||
r = (byte)(255 * factor);
|
||||
g = (byte)(255 * (1.0 - factor));
|
||||
b = 0;
|
||||
@@ -47,30 +36,84 @@ namespace FluidSim.Tests
|
||||
return new Color(r, g, b);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the pipe as a smooth triangle‑strip whose radius varies with cell pressure (for visibility),
|
||||
/// but colored by temperature.
|
||||
/// </summary>
|
||||
// ---------- Draw a generic volume (e.g. plenum) ----------
|
||||
protected void DrawVolume(RenderWindow target, Volume0D volume,
|
||||
float centerX, float topY, float width, float height)
|
||||
{
|
||||
var rect = new RectangleShape(new Vector2f(width, height))
|
||||
{
|
||||
FillColor = TemperatureColor(volume.Temperature),
|
||||
Position = new Vector2f(centerX - width / 2f, topY)
|
||||
};
|
||||
target.Draw(rect);
|
||||
var border = new RectangleShape(new Vector2f(width, height))
|
||||
{
|
||||
FillColor = Color.Transparent,
|
||||
OutlineColor = Color.White,
|
||||
OutlineThickness = 1f,
|
||||
Position = new Vector2f(centerX - width / 2f, topY)
|
||||
};
|
||||
target.Draw(border);
|
||||
}
|
||||
|
||||
// ---------- Draw an engine cylinder ----------
|
||||
protected void DrawCylinder(RenderWindow target, Cylinder cylinder,
|
||||
float centerX, float topY, float width, float maxHeight)
|
||||
{
|
||||
double fraction = cylinder.PistonFraction; // 0 = TDC, 1 = BDC
|
||||
float currentHeight = (float)(maxHeight * fraction);
|
||||
|
||||
// Walls
|
||||
var wall = new RectangleShape(new Vector2f(width, maxHeight));
|
||||
wall.FillColor = new Color(60, 60, 60);
|
||||
wall.Position = new Vector2f(centerX - width / 2f, topY);
|
||||
target.Draw(wall);
|
||||
|
||||
// Gas
|
||||
float gasTop = topY;
|
||||
var gasRect = new RectangleShape(new Vector2f(width, currentHeight));
|
||||
gasRect.FillColor = TemperatureColor(cylinder.Temperature);
|
||||
gasRect.Position = new Vector2f(centerX - width / 2f, gasTop);
|
||||
target.Draw(gasRect);
|
||||
|
||||
// Piston line
|
||||
var pistonLine = new RectangleShape(new Vector2f(width, 4f));
|
||||
pistonLine.FillColor = Color.White;
|
||||
pistonLine.Position = new Vector2f(centerX - width / 2f, topY + currentHeight);
|
||||
target.Draw(pistonLine);
|
||||
|
||||
// Valve indicators
|
||||
float valveW = 6f, valveH = 10f, valveY = topY + 4f;
|
||||
var intakeValve = new RectangleShape(new Vector2f(valveW, valveH));
|
||||
intakeValve.FillColor = cylinder.IntakeValveArea > 0 ? Color.Green : Color.Red;
|
||||
intakeValve.Position = new Vector2f(centerX - width / 2f - valveW - 2f, valveY);
|
||||
target.Draw(intakeValve);
|
||||
|
||||
var exhaustValve = new RectangleShape(new Vector2f(valveW, valveH));
|
||||
exhaustValve.FillColor = cylinder.ExhaustValveArea > 0 ? Color.Green : Color.Red;
|
||||
exhaustValve.Position = new Vector2f(centerX + width / 2f + 2f, valveY);
|
||||
target.Draw(exhaustValve);
|
||||
}
|
||||
|
||||
// ---------- Draw a pipe ----------
|
||||
protected void DrawPipe(RenderWindow target, Pipe1D pipe, float pipeCenterY, float pipeStartX, float pipeEndX)
|
||||
{
|
||||
int n = pipe.CellCount;
|
||||
if (n < 2) return;
|
||||
|
||||
float pipeLengthPx = pipeEndX - pipeStartX;
|
||||
float dx = pipeLengthPx / (n - 1); // spacing between cell centres
|
||||
float dx = pipeLengthPx / (n - 1);
|
||||
|
||||
float baseRadius = 25f;
|
||||
float rangeFactor = 2f;
|
||||
float scaleFactor = 2f;
|
||||
|
||||
// ----- smoothstep helper -----
|
||||
static float SmoothStep(float edge0, float edge1, float x)
|
||||
{
|
||||
float t = Math.Clamp((x - edge0) / (edge1 - edge0), 0f, 1f);
|
||||
return t * t * (3f - 2f * t);
|
||||
}
|
||||
|
||||
// ----- Pre‑compute cell positions, radii, and temperatures -----
|
||||
var centers = new float[n];
|
||||
var radii = new float[n];
|
||||
var temperatures = new double[n];
|
||||
@@ -80,7 +123,7 @@ namespace FluidSim.Tests
|
||||
{
|
||||
double p = pipe.GetCellPressure(i);
|
||||
double rho = pipe.GetCellDensity(i);
|
||||
double T = p / Math.Max(rho * R_gas, 1e-12); // ideal gas
|
||||
double T = p / Math.Max(rho * R_gas, 1e-12);
|
||||
temperatures[i] = T;
|
||||
|
||||
float deviation = (float)Math.Tanh((p - AmbientPressure) / AmbientPressure / rangeFactor);
|
||||
@@ -89,7 +132,6 @@ namespace FluidSim.Tests
|
||||
centers[i] = pipeStartX + i * dx;
|
||||
}
|
||||
|
||||
// ----- Build triangle‑strip vertices -----
|
||||
int segmentsPerCell = 8;
|
||||
int totalPoints = n + (n - 1) * segmentsPerCell;
|
||||
Vertex[] stripVertices = new Vertex[totalPoints * 2];
|
||||
@@ -112,7 +154,7 @@ namespace FluidSim.Tests
|
||||
float st = SmoothStep(0f, 1f, t);
|
||||
float xi = centers[i] + (centers[i + 1] - centers[i]) * t;
|
||||
float ri = radii[i] + (radii[i + 1] - radii[i]) * st;
|
||||
double Ti = temperatures[i] + (temperatures[i + 1] - temperatures[i]) * st; // linear interpolation
|
||||
double Ti = temperatures[i] + (temperatures[i + 1] - temperatures[i]) * st;
|
||||
Color coli = TemperatureColor(Ti);
|
||||
|
||||
stripVertices[idx++] = new Vertex(new Vector2f(xi, pipeCenterY - ri), coli);
|
||||
|
||||
Reference in New Issue
Block a user