Add in.dt, slider warnings in --check, and two agent-written effects

Spec fixes come from a test where pi + deepseek-v4.1-flash wrote effects
from EFFECTS.md alone: glitch-blocks and ghost-stamps both compiled on the
first try. The agent's feedback led to in.dt (frame time), documented
limits of in.prev as memory, and a --check warning for ignored slider lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Rasyidan Akbar F. 2026-10-05 20:50:31 +07:00
commit 169c5f9b63
6 changed files with 111 additions and 9 deletions

View file

@ -34,6 +34,7 @@ final class Renderer: NSObject, MTKViewDelegate {
private var result: MTLTexture? // the finished frame
private var lastSerial = -1
private let startTime = CACurrentMediaTime()
private var lastTime: Float?
private var frameCount = 0
private var pixels: [UInt8] = []
@ -224,6 +225,8 @@ final class Renderer: NSObject, MTKViewDelegate {
analysis.update(commands, camera: frames.current, particles: layers.contains { $0.enabled && $0.usesParticles })
let time = Float(CACurrentMediaTime() - startTime)
let dt = min(max(time - (lastTime ?? time - 1.0 / 30.0), 0.001), 0.25)
lastTime = time
var image = frames.current
for layer in layers where layer.enabled {
guard let pipeline = layer.pipeline else { continue }
@ -231,8 +234,8 @@ final class Renderer: NSObject, MTKViewDelegate {
layer.targets = [makeTarget(device, width: width, height: height), makeTarget(device, width: width, height: height)]
for target in layer.targets { commands.pass(into: target, clear: true) }
}
// must match `struct Uniforms` in the shader: time, padding, resolution.xy, params[16]
var uniforms: [Float] = [time, 0, Float(width), Float(height)]
// must match `struct Uniforms` in the shader: time, dt, resolution.xy, params[16]
var uniforms: [Float] = [time, dt, Float(width), Float(height)]
uniforms += layer.params.map(\.value) + [Float](repeating: 0, count: maxParams - layer.params.count)
let textures = [image, frames.current, frames.last, layer.targets[1], analysis.flow, analysis.particles]
commands.pass(into: layer.targets[0]) { $0.fullscreen(pipeline, textures: textures, uniforms: uniforms) }