import Olon from "https://cdn.jsdelivr.net/npm/olon@0.3.2/dist/Olon.min.js"
import { BASE_FRAG, ITER_FRAG, QUAD_FRAG, QUAD_VERT } from "./shaderSource.js"
import { random, floor } from "./tools.js"
const STOP_FRAME = 50 * floor(random(1, 11))
const ol = Olon(1024, 1024, true)
ol.flex({ container: { padding: "20px" }, canvas: { fit: ol.SCALE_DOWN } })
const baseProgram = ol.createProgram(QUAD_VERT, BASE_FRAG)
const iterProgram = ol.createProgram(QUAD_VERT, ITER_FRAG)
const quadProgram = ol.createProgram(QUAD_VERT, QUAD_FRAG)
dfactor: ol.ONE_MINUS_SRC_ALPHA,
const baseVAO = ol.createVAO(baseProgram, ol.quadBufferInfo())
const iterVAO = ol.createVAO(iterProgram, ol.quadBufferInfo())
const quadVAO = ol.createVAO(quadProgram, ol.quadBufferInfo())
const texOpts = { iformat: ol.RGBA32F, immutableStorage: true }
const fragColorTex0 = ol.texture2D(texOpts)
const fragColorTex1 = ol.texture2D(texOpts)
const fragColorTex2 = ol.texture2D(texOpts)
const depthBuffer = ol.createDepthBuffer(ol.width, ol.height)
const fbo0 = ol.createFBO({
depthBuffer: depthBuffer,
outs: [{ name: "fragColor", texture: fragColorTex0 }],
const fbo1 = ol.createFBO({
depthBuffer: depthBuffer,
outs: [{ name: "fragColor", texture: fragColorTex1 }],
const fbo2 = ol.createFBO({
depthBuffer: depthBuffer,
outs: [{ name: "fragColor", texture: fragColorTex2 }],
const frameBuffer = (fbo, texture) => {
ol.clear(ol.COLOR_BUFF | ol.DEPTH_BUFF)
ol.uniform("uImage", texture)
ol.uniform("time", ol.frame / 60)
const feedback = (texture) => {
frameBuffer(fbo1, texture)
frameBuffer(fbo2, fragColorTex1)
}).run(() => ol.triangles(0, 6))
ol.uniform("uImage", fragColorTex2)
ol.frame === STOP_FRAME && ol.pause()