import { UPDATE_VERT, UPDATE_FRAG } from "./shaderSource.js"
import { RENDER_VERT, RENDER_FRAG } from "./shaderSource.js"
import Olon, { Data } from "https://cdn.jsdelivr.net/npm/olon@0.0.0/src/Olon.js"
import { random, floor, min } from "./tools.js"
const MAX_AMOUNT = 100000
const ol = Olon(720, 720)
dfactor: ol.ONE_MINUS_SRC_ALPHA,
const TFV = ["vPosition", "vAge", "vLife", "vVel"]
const updateProgram = ol.createProgram(UPDATE_VERT, UPDATE_FRAG, TFV)
const renderProgram = ol.createProgram(RENDER_VERT, RENDER_FRAG)
const aPosition = { name: "aPosition", unit: "f32", size: 2 }
const aAge = { name: "aAge", unit: "f32", size: 1 }
const aLife = { name: "aLife", unit: "f32", size: 1 }
const aVel = { name: "aVel", unit: "f32", size: 2 }
const attributes = [aPosition, aAge, aLife, aVel]
for (let i = 0; i < MAX_AMOUNT; i++) {
const life = random(MIN_AGE, MAX_AGE)
particleData.push(life + 1)
const initData = Data(particleData)
const buffer0 = ol.createBuffer(initData, ol.STREAM_DRAW)
const buffer1 = ol.createBuffer(initData, ol.STREAM_DRAW)
const vao0 = ol.createVAO(updateProgram, {
const vao1 = ol.createVAO(updateProgram, {
const buffers = [buffer0, buffer1]
const vaos = [vao0, vao1]
let [read, write] = [0, 1]
let [lastTime, bornAmount] = [0, 0]
ol.uniform("uRandom", [random() * 1024, random() * 1024])
const time = ol.frame / 60
const timeDelta = time - lastTime
const nextAmount = floor(bornAmount + BIRTH_RATE * 1000)
bornAmount = min(MAX_AMOUNT, nextAmount)
ol.clearColor(0, 0, 0, 0.25)
ol.use({ program: updateProgram }).run(() => {
ol.transformFeedback(vaos[read], buffers[write], ol.POINTS, () => {
ol.uniform("uTimeDelta", timeDelta)
ol.uniform("uTime", time)
}).run(() => ol.points(0, bornAmount))
;[read, write] = [write, read]