import { Orton, Data, } from "https://cdn.jsdelivr.net/npm/orton@0.0.0/dist/Orton.min.js"
import { vert, frag } from "./shaderSource.js"
import { PARAMS, pane } from "./panel.js"
const canvas = document.querySelector("canvas")
const O = await Orton.init(canvas)
format: O.preferredFormat,
const positionData = Data(position, "f32")
const positionBuffer = O.Buffer(device, {
size: positionData.byteLength,
usage: ["VERTEX", "COPY_DST"],
O.queue.writeBuffer(positionBuffer, 0, positionData)
const positionAttribute = O.createVertexAttribute({
const positionBufferLayout = O.createVertexBufferLayout({
attributes: [positionAttribute],
const noiseTypeData = Data(1, "i32")
const noiseTypeUniformBuffer = O.Buffer(device, {
label: "noiseType uniform",
size: noiseTypeData.byteLength,
usage: ["UNIFORM", "COPY_DST"],
O.queue.writeBuffer(noiseTypeUniformBuffer, 0, noiseTypeData)
const noiseTypeUniformBinding = O.Binding({
visibility: ["FRAGMENT"],
buffer: noiseTypeUniformBuffer,
const scaleData = Data(1)
const scaleUniformBuffer = O.Buffer(device, {
size: scaleData.byteLength,
usage: ["UNIFORM", "COPY_DST"],
O.queue.writeBuffer(scaleUniformBuffer, 0, scaleData)
const scaleUniformBinding = O.Binding({
visibility: ["FRAGMENT"],
buffer: scaleUniformBuffer,
const translateData = Data(4)
const translateUniformBuffer = O.Buffer(device, {
label: "translate uniform",
size: translateData.byteLength,
usage: ["UNIFORM", "COPY_DST"],
O.queue.writeBuffer(translateUniformBuffer, 0, translateData)
const translateUniformBinding = O.Binding({
visibility: ["FRAGMENT"],
buffer: translateUniformBuffer,
const periodData = Data(4)
const periodUniformBuffer = O.Buffer(device, {
size: periodData.byteLength,
usage: ["UNIFORM", "COPY_DST"],
O.queue.writeBuffer(periodUniformBuffer, 0, periodData)
const periodUniformBinding = O.Binding({
visibility: ["FRAGMENT"],
buffer: periodUniformBuffer,
const normalizeData = Data(1)
const normalizeUniformBuffer = O.Buffer(device, {
label: "normalize uniform",
size: normalizeData.byteLength,
usage: ["UNIFORM", "COPY_DST"],
O.queue.writeBuffer(normalizeUniformBuffer, 0, normalizeData)
const normalizeUniformBinding = O.Binding({
visibility: ["FRAGMENT"],
buffer: normalizeUniformBuffer,
const BindGroup = O.BindGroup(device, [
const renderPipeline = O.RenderPipeline(device, {
layout: O.PipelineLayout(device, [BindGroup.layout]),
vertex: O.Shader.Vertex(device, {
buffers: [positionBufferLayout],
fragment: O.Shader.Fragment(device, {
targets: [{ format: O.preferredFormat }],
const adjustVel = (v, t, min, max) => (t > max || t < min ? -v : v)
noiseTypeData[0] = PARAMS.Noise
device.queue.writeBuffer(noiseTypeUniformBuffer, 0, noiseTypeData.buffer)
scaleData[0] = PARAMS.Scale
device.queue.writeBuffer(scaleUniformBuffer, 0, scaleData.buffer)
Velocity.x = adjustVel(Velocity.x, PARAMS.Translate.x, -5, 5)
Velocity.y = adjustVel(Velocity.y, PARAMS.Translate.y, -5, 5)
Velocity.z = adjustVel(Velocity.z, PARAMS.Translate.z, -5, 5)
Velocity.w = adjustVel(Velocity.w, PARAMS.Translate.w, -5, 5)
PARAMS.Translate.x += Velocity.x * PARAMS.Animation.x
PARAMS.Translate.y += Velocity.y * PARAMS.Animation.y
PARAMS.Translate.z += Velocity.z * PARAMS.Animation.z
PARAMS.Translate.w += Velocity.w * PARAMS.Animation.w
translateData[0] = PARAMS.Translate.x
translateData[1] = PARAMS.Translate.y
translateData[2] = PARAMS.Translate.z
translateData[3] = PARAMS.Translate.w
device.queue.writeBuffer(translateUniformBuffer, 0, translateData.buffer)
periodData[0] = PARAMS.Period.x
periodData[1] = PARAMS.Period.y
periodData[2] = PARAMS.Period.z
periodData[3] = PARAMS.Period.w
device.queue.writeBuffer(periodUniformBuffer, 0, periodData.buffer)
normalizeData[0] = PARAMS.Normalize ? 1 : 0
device.queue.writeBuffer(normalizeUniformBuffer, 0, normalizeData.buffer)
const commandEncoder = O.CommandEncoder(device)
const renderPassDescriptor = O.createRenderPassDescriptor({
clearValue: [0, 0, 0, 1],
O.beginRenderPass(commandEncoder, renderPassDescriptor)
.setPipeline(renderPipeline)
.setVertexBuffer(0, positionBuffer)
.setBindGroup(0, BindGroup.bindGroup)
O.queue.submit([commandEncoder.finish()])
requestAnimationFrame(render)