I was trying to create a flowfield like pattern but this is all I could manage.
// === UI Controls ===
export function sliderFlowSpeed(v) {
flowSpeed = mix(0.0005, 0.02, v)
}
export function sliderFlowScale(v) {
flowScale = mix(0.02, 2.0, v)
}
export function sliderHueShift(v) {
hueShiftSpeed = mix(0.0, 0.5, v)
}
export function sliderHuePalette(v) {
hueRange = mix(0.02, 1.0, v)
}
export function sliderHueBase(v) {
hueBaseOffset = v
}
// Make drift more noticeable by expanding the range
export function sliderDriftX(v) {
driftXSpeed = mix(-0.2, 0.2, v) // was -0.05 to 0.05
}
export function sliderDriftY(v) {
driftYSpeed = mix(-0.2, 0.2, v) // was -0.05 to 0.05
}
export function sliderBreathing(v) {
breathingSpeed = mix(0.005, 0.1, v)
}
// === Globals ===
var t = 0
var flowSpeed = 0.5
var flowScale = 0.2
var hueShiftSpeed = 0.1
var hueRange = 1.0
var hueBaseOffset = 0.0
var driftX = 0
var driftY = 0
var driftXSpeed = 0.0
var driftYSpeed = 0.0
var breathingSpeed = 0.01
var breathingFactor = 0.5
// === Frame update: called once per frame
export function beforeRender(delta) {
var dt = delta / 1000
t += dt
// Breathing rhythm: sin curve from 0 to 1
breathingFactor = 0.5 + 0.5 * sin(t * breathingSpeed * PI2)
// Drift positions update independently of breathing
driftX += driftXSpeed * dt
driftY += driftYSpeed * dt
}
// === Pixel render: called once per pixel
export function render2D(index, x, y) {
// Apply drifting offsets to position
var shiftedX = x + driftX
var shiftedY = y + driftY
// Perlin flow angle at current position
var angle = perlin(shiftedX * flowScale, shiftedY * flowScale, t * flowSpeed * breathingFactor, 0) * PI2
// Compute hue based on angle + time
var baseHue = (angle / PI2 + t * hueShiftSpeed * breathingFactor) % 1
var hue = (hueBaseOffset + baseHue * hueRange) % 1
// Pulsing brightness from angle + breathing
var brightness = 0.5 + 0.5 * sin(angle * 4 + t * 2 * breathingFactor)
hsv(hue, 1, brightness)
}