Trying Something New (update)

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


1 Like