3d/html/002-webgpu-instead/main.js
2023-10-07 10:34:40 -04:00

1 line
2 KiB
JavaScript

import{a as V} from"../chunk-0cd54990cab7d3a5.js";class w{s;canvas;_adapter;_device;_context;telemetry;registry={onBeforeUpdate:[],onAfterUpdate:[],onUpdate:[],onStart:[]};constructor(s={}){this.config=s;this.config={fov:45,...s},this.canvas=document.querySelector("canvas"),this.canvas.width=window.innerWidth,this.canvas.height=window.innerHeight,this.telemetry=new V(this),this.init().catch((o)=>{const x=document.querySelector("main");if(x)x.innerHTML="<div><i>your browser didn't let me set up webgpu. firefox nightly or enable <code>dom.webgpu.enable</code>.</i></div>";throw new Error("Unable to initialize WebGPU. Your browser or machine may not support it.",o)})}async init(){if(!navigator.gpu)throw new Error("WebGPU not supported");if(this._adapter=await navigator.gpu.requestAdapter(),!this._adapter)throw new Error("No GPU adapter found");if(this._device=await this.adapter.requestDevice(),!this._device)throw new Error("No GPU device found");this._context=this.canvas.getContext("webgpu"),this.context.configure({device:this.device,format:"bgra8unorm",alphaMode:"premultiplied",...this.config.context})}get context(){if(!this._context)throw new Error("WebGPU context not initialized");return this._context}get adapter(){if(!this._adapter)throw new Error("WebGPU adapter not initialized");return this._adapter}get device(){if(!this._device)throw new Error("WebGPU device not initialized");return this._device}onBeforeUpdate(s){this.registry.onBeforeUpdate.push(s)}onAfterUpdate(s){this.registry.onAfterUpdate.push(s)}onUpdate(s){this.registry.onUpdate.push(s)}onStart(s){this.registry.onStart.push(s)}doUpdate(s){this.registry.onBeforeUpdate.forEach((o)=>o(s,this)),this.registry.onUpdate.forEach((o)=>o(s,this)),this.registry.onAfterUpdate.forEach((o)=>o(s,this))}doStart(s=0){this.registry.onStart.forEach((o)=>o(this,s))}async oneShot(s=0){this.doStart(s),this.doUpdate(s)}start(){this.doStart();const s=(o)=>{this.doUpdate(o),requestAnimationFrame(s)};requestAnimationFrame(s)}}var _=new w({fov:20});_.start();