Squashed from work; the fine-grained history is under tag archive/work-2026-08-26: - vjfx: 104 new presets — the transition lane fills out and the screen family goes wide - vjfx: three lanes land — engine hooks + hold stage, the videomesh engine, and the audio picture - vj: the thumbnail pipeline becomes one honest machine, and effects go livecodable - vj: thumbnails become mp4 — hardware-coded sheets at measured-4K cells, and the bake stops racing the GPU - store: the ceremony dies — batch publish, one transaction, and the engine stops re-reading its own log - store: the ceremony dies — batch publish, one transaction, and the engine stops re-reading its own log - vj: the console grows real transports, and the deck stops lying about reverse - vj: reverse earns a memory, and the effects stop aging - fab: a 3D creation shell and the viewer built on it
62 lines
2.3 KiB
Text
62 lines
2.3 KiB
Text
// MOLTEN GLASS — four SDF blobs smooth-min blended into a floor puddle,
|
|
// radii pumping on the beat: metaballs WITHOUT a CPU marching pass (the
|
|
// raymarcher IS the iso-surface). Pattern taught: smin() blending in a
|
|
// scene_sdf subclass + closed-form orbit centers from time, so the pixel
|
|
// shader is the entire simulation.
|
|
{
|
|
name: "Molten Glass"
|
|
engine: "raymarch"
|
|
|
|
steps: 64
|
|
max_dist: 26.0
|
|
cam: "orbit"
|
|
cam_speed: 0.18
|
|
cam_dist: 6.2
|
|
cam_height: 2.3
|
|
cam_fov: 56.0
|
|
shadow: 1
|
|
|
|
beat_pulse: "0.7 * (0.2 + 1.6*p0)"
|
|
beat_rate: 1.0
|
|
fog: "0.06 * (0.2 + 1.6*p2)"
|
|
glow: "1.1 * (0.25 + 1.5*p1)"
|
|
|
|
// PERFORMANCE DIALS — mid-knob = the stock look, exact.
|
|
p0: 0.5 p1: 0.5 p2: 0.5
|
|
dials: [
|
|
{name: "PUMP", bind: "p0", default: 0.5},
|
|
{name: "GLOW", bind: "p1", default: 0.5},
|
|
{name: "HAZE", bind: "p2", default: 0.5}
|
|
]
|
|
|
|
color_bg: #x0a1012
|
|
color_a: #x18e0b0
|
|
color_b: #x9a2a70
|
|
color_c: #xeafff6
|
|
|
|
stages: [
|
|
{kind: "bloom", threshold: 0.5, strength: 1.3, levels: 3}
|
|
]
|
|
|
|
shader: draw.DrawVjFxRaymarch {
|
|
scene_sdf: fn(p: vec3) -> vec2 {
|
|
// Blobs stay LOW (centers barely above the floor) and orbit
|
|
// tightly, so the smooth-min keeps them merged with the
|
|
// puddle and each other — liquid, never billiards.
|
|
let t = self.time_beat.x * 0.6
|
|
let swell = 0.18 * self.time_beat.w
|
|
let mut d = p.y + 1.1
|
|
let c1 = vec3(sin(t * 1.07) * 1.1, sin(t * 0.71) * 0.55 - 0.25, cos(t * 0.93) * 1.1)
|
|
let c2 = vec3(sin(t * 0.83 + 2.1) * 0.9, cos(t * 1.13) * 0.45 - 0.15, sin(t * 1.31 + 4.0) * 0.9)
|
|
let c3 = vec3(cos(t * 1.19 + 1.0) * 1.3, sin(t * 0.57 + 3.0) * 0.5 - 0.20, sin(t * 0.79 + 0.6) * 1.0)
|
|
let c4 = vec3(sin(t * 0.67 + 5.2) * 0.6, sin(t * 1.41 + 1.4) * 0.6 + 0.15, cos(t * 0.61 + 2.8) * 0.7)
|
|
d = self.smin(d, length(p - c1) - (0.80 + swell), 1.05)
|
|
d = self.smin(d, length(p - c2) - (0.64 + swell), 1.05)
|
|
d = self.smin(d, length(p - c3) - (0.56 + swell), 1.05)
|
|
d = self.smin(d, length(p - c4) - (0.50 + swell), 1.05)
|
|
// Material bands slide up the blobs with the beat count.
|
|
let m = fract(p.y * 0.30 + fract(self.time_beat.y * 0.02))
|
|
return vec2(d, m)
|
|
}
|
|
}
|
|
}
|