feat(p10-reframe-w2): CPU wax-blob lava physics + 2D collision; smin metaball render

This commit is contained in:
daniel-c-harvey
2026-06-16 12:19:30 -04:00
parent ed7304af1f
commit db7afe4ea7
3 changed files with 680 additions and 488 deletions
@@ -27,23 +27,32 @@ public sealed class MixVisualizerControlState
/// </summary>
public const double DefaultVisibleSeconds = 10.0;
/// <summary>
/// Default bulge amount. Mirrors <c>DEFAULT_BUBBLYNESS</c> in MixVisualizer.ts. Normalized [0,1];
/// 0 = straight rectangular bars, 1 = fully rounded liquid silhouettes (still attached).
/// </summary>
public const double DefaultBubblyness = 0.35;
// R2 TEMP (Phase 10 reframe Wave R2): the three controls below are re-routed to the new
// lava physics for Daniel's in-browser test — the JS handle setters map them as:
// Bubblyness → lava GRAVITY, Detach → lava HEAT, ColorShiftSpeed → COLLISION STRENGTH.
// The defaults are bumped so the lava looks ALIVE on open (heat non-zero). Wave R4
// replaces this with the proper six-knob set + its own typed properties. Keep these
// mirrored to the DEFAULT_* anchors in MixVisualizer.ts, as the existing sync discipline.
/// <summary>
/// Default detach amount. Mirrors <c>DEFAULT_DETACH</c> in MixVisualizer.ts. Normalized [0,1];
/// 0 = fully attached, 1 = blobs separate and float upward. Off by default.
/// Default GRAVITY dial (R2 temp; was bulge). Mirrors <c>DEFAULT_BUBBLYNESS</c> in MixVisualizer.ts.
/// Normalized [0,1]; 0 = near-weightless float, 1 = wax falls + settles fast.
/// </summary>
public const double DefaultDetach = 0.0;
public const double DefaultBubblyness = 0.5;
/// <summary>
/// Default color-shift speed. Mirrors <c>DEFAULT_COLOR_SHIFT_SPEED</c> in MixVisualizer.ts.
/// Normalized [0,1], mapped to a gradient-morph cycle period in the shader (slow → quick).
/// Default HEAT dial (R2 temp; was detach). Mirrors <c>DEFAULT_DETACH</c> in MixVisualizer.ts.
/// Normalized [0,1]; 0 = wax rests at the bottom (collision-only), 1 = many bubbles rising.
/// Non-zero default so the lamp is alive on open.
/// </summary>
public const double DefaultColorShiftSpeed = 0.3;
public const double DefaultDetach = 0.45;
/// <summary>
/// Default COLLISION-STRENGTH dial (R2 temp; was color-shift). Mirrors
/// <c>DEFAULT_COLOR_SHIFT_SPEED</c> in MixVisualizer.ts. Normalized [0,1]; 0 = soft shove,
/// 1 = hard elastic wall.
/// </summary>
public const double DefaultColorShiftSpeed = 0.5;
/// <summary>Visible time-span in seconds (the resolution/zoom control). Reused as-is from 8.K.</summary>
public double VisibleSeconds { get; set; } = DefaultVisibleSeconds;