makepad/apps/vj/resources/effects/87_molten_glass.splash
Admin cb49b032df vjfx: 104 presets, engine hooks + hold stage, the videomesh engine, the audio picture, livecodable effects, and mp4 thumbnail sheets
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
2026-08-26 08:49:48 +02:00

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