progpu-renderer 0.1.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +97 -0
- package/THIRD-PARTY-NOTICES.md +22 -0
- package/build-info.json +20 -0
- package/index.d.ts +91 -0
- package/index.js +158 -0
- package/licenses/emdawnwebgpu/webgpu/src/LICENSE +68 -0
- package/licenses/emdawnwebgpu/webgpu_cpp/LICENSE +26 -0
- package/licenses/emscripten/LICENSE +102 -0
- package/licenses/emscripten/system/lib/compiler-rt/LICENSE.TXT +311 -0
- package/licenses/emscripten/system/lib/libc/musl/COPYRIGHT +193 -0
- package/licenses/emscripten/system/lib/libcxx/LICENSE.TXT +311 -0
- package/licenses/emscripten/system/lib/libcxxabi/LICENSE.TXT +311 -0
- package/licenses/emscripten/system/lib/libunwind/LICENSE.TXT +311 -0
- package/licenses/emscripten/system/lib/llvm-libc/LICENSE.TXT +278 -0
- package/licenses/emscripten/system/lib/mimalloc/LICENSE +21 -0
- package/package.json +29 -0
- package/progpu-native.mjs +2 -0
- package/progpu-native.wasm +0 -0
- package/scene.js +205 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
async function Module(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["Ya"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("progpu-native.wasm")}return new URL("progpu-native.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var exceptionCaught=[];var uncaughtExceptionCount=0;var ___cxa_begin_catch=ptr=>{var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);___cxa_increment_exception_refcount(ptr);return ___cxa_get_exception_ptr(ptr)};var exceptionLast=0;var ___cxa_end_catch=()=>{_setThrew(0,0);var info=exceptionCaught.pop();___cxa_decrement_exception_refcount(info.excPtr);exceptionLast=0};class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var setTempRet0=val=>__emscripten_tempret_set(val);var findMatchingCatch=args=>{var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var caughtType of args){if(caughtType===0||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};var ___cxa_find_matching_catch_2=()=>findMatchingCatch([]);var ___cxa_find_matching_catch_3=arg0=>findMatchingCatch([arg0]);var ___cxa_find_matching_catch_4=(arg0,arg1)=>findMatchingCatch([arg0,arg1]);var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var ___resumeException=ptr=>{if(!exceptionLast){exceptionLast=ptr}throw exceptionLast};var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==106?HEAP64[buf>>3]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_double=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.codePointAt(i);if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var WebGPU={Internals:{jsObjects:[],jsObjectInsert:(ptr,jsObject)=>{ptr>>>=0;WebGPU.Internals.jsObjects[ptr]=jsObject},bufferOnUnmaps:[],futures:[],futureInsert:(futureId,promise)=>{}},getJsObject:ptr=>{if(!ptr)return undefined;ptr>>>=0;return WebGPU.Internals.jsObjects[ptr]},importJsAdapter:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateAdapter(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsBindGroup:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateBindGroup(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsBindGroupLayout:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateBindGroupLayout(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsBuffer:(buffer,parentPtr=0)=>{assert(buffer.mapState!="pending");var mapState=buffer.mapState=="mapped"?3:1;var bufferPtr=_emwgpuCreateBuffer(parentPtr,mapState);WebGPU.Internals.jsObjectInsert(bufferPtr,buffer);if(buffer.mapState=="mapped"){WebGPU.Internals.bufferOnUnmaps[bufferPtr]=[]}return bufferPtr},importJsCommandBuffer:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateCommandBuffer(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsCommandEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateCommandEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsComputePassEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateComputePassEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsComputePipeline:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateComputePipeline(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsDevice:(device,parentPtr=0)=>{var queuePtr=_emwgpuCreateQueue(parentPtr);var devicePtr=_emwgpuCreateDevice(parentPtr,queuePtr);WebGPU.Internals.jsObjectInsert(queuePtr,device.queue);WebGPU.Internals.jsObjectInsert(devicePtr,device);return devicePtr},importJsPipelineLayout:(obj,parentPtr=0)=>{var ptr=_emwgpuCreatePipelineLayout(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsQuerySet:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateQuerySet(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsQueue:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateQueue(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderBundle:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderBundle(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderBundleEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderBundleEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderPassEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderPassEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderPipeline:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderPipeline(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsSampler:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateSampler(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsShaderModule:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateShaderModule(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsSurface:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateSurface(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsTexture:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateTexture(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsTextureView:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateTextureView(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},errorCallback:(callback,type,message,userdata)=>{var sp=stackSave();var messagePtr=stringToUTF8OnStack(message);getWasmTableEntry(callback)(type,messagePtr,userdata);stackRestore(sp)},setStringView:(ptr,data,length)=>{HEAPU32[ptr>>2]=data;HEAPU32[ptr+4>>2]=length},makeStringFromStringView:stringViewPtr=>{var ptr=HEAPU32[stringViewPtr>>2];var length=HEAPU32[stringViewPtr+4>>2];return UTF8ToString(ptr,length)},makeStringFromOptionalStringView:stringViewPtr=>{var ptr=HEAPU32[stringViewPtr>>2];var length=HEAPU32[stringViewPtr+4>>2];if(!ptr){if(length===0){return""}return undefined}return UTF8ToString(ptr,length)},makeColor:ptr=>({r:HEAPF64[ptr>>3],g:HEAPF64[ptr+8>>3],b:HEAPF64[ptr+16>>3],a:HEAPF64[ptr+24>>3]}),makeExtent3D:ptr=>({width:HEAPU32[ptr>>2],height:HEAPU32[ptr+4>>2],depthOrArrayLayers:HEAPU32[ptr+8>>2]}),makeOrigin3D:ptr=>({x:HEAPU32[ptr>>2],y:HEAPU32[ptr+4>>2],z:HEAPU32[ptr+8>>2]}),makeTexelCopyTextureInfo:ptr=>({texture:WebGPU.getJsObject(HEAPU32[ptr>>2]),mipLevel:HEAPU32[ptr+4>>2],origin:WebGPU.makeOrigin3D(ptr+8),aspect:WebGPU.TextureAspect[HEAPU32[ptr+20>>2]]}),makeTexelCopyBufferLayout:ptr=>{var bytesPerRow=HEAPU32[ptr+8>>2];var rowsPerImage=HEAPU32[ptr+12>>2];return{offset:HEAPU32[ptr+4>>2]*4294967296+HEAPU32[ptr>>2],bytesPerRow:bytesPerRow===4294967295?undefined:bytesPerRow,rowsPerImage:rowsPerImage===4294967295?undefined:rowsPerImage}},makeTexelCopyBufferInfo:ptr=>{var layoutPtr=ptr+0;var bufferCopyView=WebGPU.makeTexelCopyBufferLayout(layoutPtr);bufferCopyView["buffer"]=WebGPU.getJsObject(HEAPU32[ptr+16>>2]);return bufferCopyView},makePassTimestampWrites:ptr=>{if(ptr===0)return undefined;return{querySet:WebGPU.getJsObject(HEAPU32[ptr+4>>2]),beginningOfPassWriteIndex:HEAPU32[ptr+8>>2],endOfPassWriteIndex:HEAPU32[ptr+12>>2]}},makePipelineConstants:(constantCount,constantsPtr)=>{if(!constantCount)return;var constants={};for(var i=0;i<constantCount;++i){var entryPtr=constantsPtr+24*i;var key=WebGPU.makeStringFromStringView(entryPtr+4);constants[key]=HEAPF64[entryPtr+16>>3]}return constants},makePipelineLayout:layoutPtr=>{if(!layoutPtr)return"auto";return WebGPU.getJsObject(layoutPtr)},makeComputeState:ptr=>{if(!ptr)return undefined;var desc={module:WebGPU.getJsObject(HEAPU32[ptr+4>>2]),constants:WebGPU.makePipelineConstants(HEAPU32[ptr+16>>2],HEAPU32[ptr+20>>2]),entryPoint:WebGPU.makeStringFromOptionalStringView(ptr+8)};return desc},makeComputePipelineDesc:descriptor=>{var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),layout:WebGPU.makePipelineLayout(HEAPU32[descriptor+12>>2]),compute:WebGPU.makeComputeState(descriptor+16)};return desc},makeRenderPipelineDesc:descriptor=>{function makePrimitiveState(psPtr){if(!psPtr)return undefined;return{topology:WebGPU.PrimitiveTopology[HEAPU32[psPtr+4>>2]],stripIndexFormat:WebGPU.IndexFormat[HEAPU32[psPtr+8>>2]],frontFace:WebGPU.FrontFace[HEAPU32[psPtr+12>>2]],cullMode:WebGPU.CullMode[HEAPU32[psPtr+16>>2]],unclippedDepth:!!HEAPU32[psPtr+20>>2]}}function makeBlendComponent(bdPtr){if(!bdPtr)return undefined;return{operation:WebGPU.BlendOperation[HEAPU32[bdPtr>>2]],srcFactor:WebGPU.BlendFactor[HEAPU32[bdPtr+4>>2]],dstFactor:WebGPU.BlendFactor[HEAPU32[bdPtr+8>>2]]}}function makeBlendState(bsPtr){if(!bsPtr)return undefined;return{alpha:makeBlendComponent(bsPtr+12),color:makeBlendComponent(bsPtr+0)}}function makeColorState(csPtr){var formatInt=HEAPU32[csPtr+4>>2];return formatInt===0?undefined:{format:WebGPU.TextureFormat[formatInt],blend:makeBlendState(HEAPU32[csPtr+8>>2]),writeMask:HEAPU32[csPtr+16>>2]}}function makeColorStates(count,csArrayPtr){var states=[];for(var i=0;i<count;++i){states.push(makeColorState(csArrayPtr+24*i))}return states}function makeStencilStateFace(ssfPtr){return{compare:WebGPU.CompareFunction[HEAPU32[ssfPtr>>2]],failOp:WebGPU.StencilOperation[HEAPU32[ssfPtr+4>>2]],depthFailOp:WebGPU.StencilOperation[HEAPU32[ssfPtr+8>>2]],passOp:WebGPU.StencilOperation[HEAPU32[ssfPtr+12>>2]]}}function makeDepthStencilState(dssPtr){if(!dssPtr)return undefined;return{format:WebGPU.TextureFormat[HEAPU32[dssPtr+4>>2]],depthWriteEnabled:!!HEAPU32[dssPtr+8>>2],depthCompare:WebGPU.CompareFunction[HEAPU32[dssPtr+12>>2]],stencilFront:makeStencilStateFace(dssPtr+16),stencilBack:makeStencilStateFace(dssPtr+32),stencilReadMask:HEAPU32[dssPtr+48>>2],stencilWriteMask:HEAPU32[dssPtr+52>>2],depthBias:HEAP32[dssPtr+56>>2],depthBiasSlopeScale:HEAPF32[dssPtr+60>>2],depthBiasClamp:HEAPF32[dssPtr+64>>2]}}function makeVertexAttribute(vaPtr){return{format:WebGPU.VertexFormat[HEAPU32[vaPtr+4>>2]],offset:HEAPU32[vaPtr+4+8>>2]*4294967296+HEAPU32[vaPtr+8>>2],shaderLocation:HEAPU32[vaPtr+16>>2]}}function makeVertexAttributes(count,vaArrayPtr){var vas=[];for(var i=0;i<count;++i){vas.push(makeVertexAttribute(vaArrayPtr+i*24))}return vas}function makeVertexBuffer(vbPtr){if(!vbPtr)return undefined;var stepModeInt=HEAPU32[vbPtr+4>>2];var attributeCountInt=HEAPU32[vbPtr+16>>2];if(stepModeInt===0&&attributeCountInt===0){return null}return{arrayStride:HEAPU32[vbPtr+4+8>>2]*4294967296+HEAPU32[vbPtr+8>>2],stepMode:WebGPU.VertexStepMode[stepModeInt],attributes:makeVertexAttributes(attributeCountInt,HEAPU32[vbPtr+20>>2])}}function makeVertexBuffers(count,vbArrayPtr){if(!count)return undefined;var vbs=[];for(var i=0;i<count;++i){vbs.push(makeVertexBuffer(vbArrayPtr+i*24))}return vbs}function makeVertexState(viPtr){if(!viPtr)return undefined;var desc={module:WebGPU.getJsObject(HEAPU32[viPtr+4>>2]),constants:WebGPU.makePipelineConstants(HEAPU32[viPtr+16>>2],HEAPU32[viPtr+20>>2]),buffers:makeVertexBuffers(HEAPU32[viPtr+24>>2],HEAPU32[viPtr+28>>2]),entryPoint:WebGPU.makeStringFromOptionalStringView(viPtr+8)};return desc}function makeMultisampleState(msPtr){if(!msPtr)return undefined;return{count:HEAPU32[msPtr+4>>2],mask:HEAPU32[msPtr+8>>2],alphaToCoverageEnabled:!!HEAPU32[msPtr+12>>2]}}function makeFragmentState(fsPtr){if(!fsPtr)return undefined;var desc={module:WebGPU.getJsObject(HEAPU32[fsPtr+4>>2]),constants:WebGPU.makePipelineConstants(HEAPU32[fsPtr+16>>2],HEAPU32[fsPtr+20>>2]),targets:makeColorStates(HEAPU32[fsPtr+24>>2],HEAPU32[fsPtr+28>>2]),entryPoint:WebGPU.makeStringFromOptionalStringView(fsPtr+8)};return desc}var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),layout:WebGPU.makePipelineLayout(HEAPU32[descriptor+12>>2]),vertex:makeVertexState(descriptor+16),primitive:makePrimitiveState(descriptor+48),depthStencil:makeDepthStencilState(HEAPU32[descriptor+72>>2]),multisample:makeMultisampleState(descriptor+76),fragment:makeFragmentState(HEAPU32[descriptor+92>>2])};return desc},fillLimitStruct:(limits,limitsOutPtr)=>{function setLimitValueU32(name,limitOffset){var limitValue=limits[name];HEAP32[limitsOutPtr+limitOffset>>2]=limitValue}function setLimitValueU64(name,limitOffset){var limitValue=limits[name];HEAP64[limitsOutPtr+limitOffset>>3]=BigInt(limitValue)}setLimitValueU32("maxTextureDimension1D",4);setLimitValueU32("maxTextureDimension2D",8);setLimitValueU32("maxTextureDimension3D",12);setLimitValueU32("maxTextureArrayLayers",16);setLimitValueU32("maxBindGroups",20);setLimitValueU32("maxBindGroupsPlusVertexBuffers",24);setLimitValueU32("maxBindingsPerBindGroup",28);setLimitValueU32("maxDynamicUniformBuffersPerPipelineLayout",32);setLimitValueU32("maxDynamicStorageBuffersPerPipelineLayout",36);setLimitValueU32("maxSampledTexturesPerShaderStage",40);setLimitValueU32("maxSamplersPerShaderStage",44);setLimitValueU32("maxStorageBuffersPerShaderStage",48);setLimitValueU32("maxStorageTexturesPerShaderStage",52);setLimitValueU32("maxUniformBuffersPerShaderStage",56);setLimitValueU32("minUniformBufferOffsetAlignment",80);setLimitValueU32("minStorageBufferOffsetAlignment",84);setLimitValueU64("maxUniformBufferBindingSize",64);setLimitValueU64("maxStorageBufferBindingSize",72);setLimitValueU32("maxVertexBuffers",88);setLimitValueU64("maxBufferSize",96);setLimitValueU32("maxVertexAttributes",104);setLimitValueU32("maxVertexBufferArrayStride",108);setLimitValueU32("maxInterStageShaderVariables",112);setLimitValueU32("maxColorAttachments",116);setLimitValueU32("maxColorAttachmentBytesPerSample",120);setLimitValueU32("maxComputeWorkgroupStorageSize",124);setLimitValueU32("maxComputeInvocationsPerWorkgroup",128);setLimitValueU32("maxComputeWorkgroupSizeX",132);setLimitValueU32("maxComputeWorkgroupSizeY",136);setLimitValueU32("maxComputeWorkgroupSizeZ",140);setLimitValueU32("maxComputeWorkgroupsPerDimension",144);if(limits.maxImmediateSize!==undefined){setLimitValueU32("maxImmediateSize",148)}},fillAdapterInfoStruct:(info,infoStruct)=>{HEAP32[infoStruct+52>>2]=info.subgroupMinSize;HEAP32[infoStruct+56>>2]=info.subgroupMaxSize;var strs=info.vendor+info.architecture+info.device+info.description;var strPtr=stringToNewUTF8(strs);var vendorLen=lengthBytesUTF8(info.vendor);WebGPU.setStringView(infoStruct+4,strPtr,vendorLen);strPtr+=vendorLen;var architectureLen=lengthBytesUTF8(info.architecture);WebGPU.setStringView(infoStruct+12,strPtr,architectureLen);strPtr+=architectureLen;var deviceLen=lengthBytesUTF8(info.device);WebGPU.setStringView(infoStruct+20,strPtr,deviceLen);strPtr+=deviceLen;var descriptionLen=lengthBytesUTF8(info.description);WebGPU.setStringView(infoStruct+28,strPtr,descriptionLen);strPtr+=descriptionLen;HEAP32[infoStruct+36>>2]=2;var adapterType=info.isFallbackAdapter?3:4;HEAP32[infoStruct+40>>2]=adapterType;HEAP32[infoStruct+44>>2]=0;HEAP32[infoStruct+48>>2]=0},AddressMode:[,"clamp-to-edge","repeat","mirror-repeat"],BlendFactor:[,"zero","one","src","one-minus-src","src-alpha","one-minus-src-alpha","dst","one-minus-dst","dst-alpha","one-minus-dst-alpha","src-alpha-saturated","constant","one-minus-constant","src1","one-minus-src1","src1alpha","one-minus-src1alpha"],BlendOperation:[,"add","subtract","reverse-subtract","min","max"],BufferBindingType:["binding-not-used",,"uniform","storage","read-only-storage"],BufferMapState:[,"unmapped","pending","mapped"],CompareFunction:[,"never","less","equal","less-equal","greater","not-equal","greater-equal","always"],CompilationInfoRequestStatus:[,"success","callback-cancelled"],CompositeAlphaMode:[,"opaque","premultiplied","unpremultiplied","inherit"],CullMode:[,"none","front","back"],ErrorFilter:[,"validation","out-of-memory","internal"],FeatureLevel:[,"compatibility","core"],FeatureName:{1:"core-features-and-limits",2:"depth-clip-control",3:"depth32float-stencil8",4:"texture-compression-bc",5:"texture-compression-bc-sliced-3d",6:"texture-compression-etc2",7:"texture-compression-astc",8:"texture-compression-astc-sliced-3d",9:"timestamp-query",10:"indirect-first-instance",11:"shader-f16",12:"rg11b10ufloat-renderable",13:"bgra8unorm-storage",14:"float32-filterable",15:"float32-blendable",16:"clip-distances",17:"dual-source-blending",18:"subgroups",19:"texture-formats-tier1",20:"texture-formats-tier2",21:"primitive-index",327692:"chromium-experimental-unorm16-texture-formats",327693:"chromium-experimental-snorm16-texture-formats",327732:"chromium-experimental-multi-draw-indirect"},FilterMode:[,"nearest","linear"],FrontFace:[,"ccw","cw"],IndexFormat:[,"uint16","uint32"],InstanceFeatureName:[,"timed-wait-any","shader-source-spirv","multiple-devices-per-adapter"],LoadOp:[,"load","clear"],MipmapFilterMode:[,"nearest","linear"],OptionalBool:["false","true"],PowerPreference:[,"low-power","high-performance"],PredefinedColorSpace:[,"srgb","display-p3"],PrimitiveTopology:[,"point-list","line-list","line-strip","triangle-list","triangle-strip"],QueryType:[,"occlusion","timestamp"],SamplerBindingType:["binding-not-used",,"filtering","non-filtering","comparison"],Status:[,"success","error"],StencilOperation:[,"keep","zero","replace","invert","increment-clamp","decrement-clamp","increment-wrap","decrement-wrap"],StorageTextureAccess:["binding-not-used",,"write-only","read-only","read-write"],StoreOp:[,"store","discard"],SurfaceGetCurrentTextureStatus:[,"success-optimal","success-suboptimal","timeout","outdated","lost","error"],TextureAspect:[,"all","stencil-only","depth-only"],TextureDimension:[,"1d","2d","3d"],TextureFormat:[,"r8unorm","r8snorm","r8uint","r8sint","r16unorm","r16snorm","r16uint","r16sint","r16float","rg8unorm","rg8snorm","rg8uint","rg8sint","r32float","r32uint","r32sint","rg16unorm","rg16snorm","rg16uint","rg16sint","rg16float","rgba8unorm","rgba8unorm-srgb","rgba8snorm","rgba8uint","rgba8sint","bgra8unorm","bgra8unorm-srgb","rgb10a2uint","rgb10a2unorm","rg11b10ufloat","rgb9e5ufloat","rg32float","rg32uint","rg32sint","rgba16unorm","rgba16snorm","rgba16uint","rgba16sint","rgba16float","rgba32float","rgba32uint","rgba32sint","stencil8","depth16unorm","depth24plus","depth24plus-stencil8","depth32float","depth32float-stencil8","bc1-rgba-unorm","bc1-rgba-unorm-srgb","bc2-rgba-unorm","bc2-rgba-unorm-srgb","bc3-rgba-unorm","bc3-rgba-unorm-srgb","bc4-r-unorm","bc4-r-snorm","bc5-rg-unorm","bc5-rg-snorm","bc6h-rgb-ufloat","bc6h-rgb-float","bc7-rgba-unorm","bc7-rgba-unorm-srgb","etc2-rgb8unorm","etc2-rgb8unorm-srgb","etc2-rgb8a1unorm","etc2-rgb8a1unorm-srgb","etc2-rgba8unorm","etc2-rgba8unorm-srgb","eac-r11unorm","eac-r11snorm","eac-rg11unorm","eac-rg11snorm","astc-4x4-unorm","astc-4x4-unorm-srgb","astc-5x4-unorm","astc-5x4-unorm-srgb","astc-5x5-unorm","astc-5x5-unorm-srgb","astc-6x5-unorm","astc-6x5-unorm-srgb","astc-6x6-unorm","astc-6x6-unorm-srgb","astc-8x5-unorm","astc-8x5-unorm-srgb","astc-8x6-unorm","astc-8x6-unorm-srgb","astc-8x8-unorm","astc-8x8-unorm-srgb","astc-10x5-unorm","astc-10x5-unorm-srgb","astc-10x6-unorm","astc-10x6-unorm-srgb","astc-10x8-unorm","astc-10x8-unorm-srgb","astc-10x10-unorm","astc-10x10-unorm-srgb","astc-12x10-unorm","astc-12x10-unorm-srgb","astc-12x12-unorm","astc-12x12-unorm-srgb"],TextureSampleType:["binding-not-used",,"float","unfilterable-float","depth","sint","uint"],TextureViewDimension:[,"1d","2d","2d-array","cube","cube-array","3d"],ToneMappingMode:[,"standard","extended"],VertexFormat:[,"uint8","uint8x2","uint8x4","sint8","sint8x2","sint8x4","unorm8","unorm8x2","unorm8x4","snorm8","snorm8x2","snorm8x4","uint16","uint16x2","uint16x4","sint16","sint16x2","sint16x4","unorm16","unorm16x2","unorm16x4","snorm16","snorm16x2","snorm16x4","float16","float16x2","float16x4","float32","float32x2","float32x3","float32x4","uint32","uint32x2","uint32x3","uint32x4","sint32","sint32x2","sint32x3","sint32x4","unorm10-10-10-2","unorm8x4-bgra"],VertexStepMode:[,"vertex","instance"],WGSLLanguageFeatureName:[,"readonly_and_readwrite_storage_textures","packed_4x8_integer_dot_product","unrestricted_pointer_parameters","pointer_composite_access"]};var _emscripten_webgpu_get_device=()=>{if(WebGPU.preinitializedDeviceId===undefined){WebGPU.preinitializedDeviceId=WebGPU.importJsDevice(Module["preinitializedWebGPUDevice"]);_wgpuDeviceAddRef(WebGPU.preinitializedDeviceId)}_wgpuDeviceAddRef(WebGPU.preinitializedDeviceId);return WebGPU.preinitializedDeviceId};var _emwgpuBufferDestroy=bufferPtr=>{var buffer=WebGPU.getJsObject(bufferPtr);var onUnmap=WebGPU.Internals.bufferOnUnmaps[bufferPtr];if(onUnmap){for(var i=0;i<onUnmap.length;++i){onUnmap[i]()}delete WebGPU.Internals.bufferOnUnmaps[bufferPtr]}buffer.destroy()};var warnOnce=text=>{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}};var _emwgpuBufferGetConstMappedRange=(bufferPtr,offset,size)=>{var buffer=WebGPU.getJsObject(bufferPtr);if(size===0)warnOnce("getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE");if(size==-1)size=undefined;var mapped;try{mapped=buffer.getMappedRange(offset,size)}catch(ex){return 0}var data=_memalign(16,mapped.byteLength);HEAPU8.set(new Uint8Array(mapped),data);WebGPU.Internals.bufferOnUnmaps[bufferPtr].push(()=>_free(data));return data};var _emwgpuBufferMapAsync=function(bufferPtr,futureId,mode,offset,size){futureId=bigintToI53Checked(futureId);mode=bigintToI53Checked(mode);var buffer=WebGPU.getJsObject(bufferPtr);WebGPU.Internals.bufferOnUnmaps[bufferPtr]=[];if(size==-1)size=undefined;WebGPU.Internals.futureInsert(futureId,buffer.mapAsync(mode,offset,size).then(()=>{callUserCallback(()=>{_emwgpuOnMapAsyncCompleted(futureId,1,0)})},ex=>{callUserCallback(()=>{var sp=stackSave();var messagePtr=stringToUTF8OnStack(ex.message);var status=ex.name==="AbortError"?4:ex.name==="OperationError"?3:0;_emwgpuOnMapAsyncCompleted(futureId,status,messagePtr);delete WebGPU.Internals.bufferOnUnmaps[bufferPtr]})}))};var _emwgpuBufferUnmap=bufferPtr=>{var buffer=WebGPU.getJsObject(bufferPtr);var onUnmap=WebGPU.Internals.bufferOnUnmaps[bufferPtr];if(!onUnmap){return}for(var i=0;i<onUnmap.length;++i){onUnmap[i]()}delete WebGPU.Internals.bufferOnUnmaps[bufferPtr];buffer.unmap()};var _emwgpuDelete=ptr=>{delete WebGPU.Internals.jsObjects[ptr]};var _emwgpuDeviceCreateBuffer=(devicePtr,descriptor,bufferPtr)=>{var mappedAtCreation=!!HEAPU32[descriptor+32>>2];var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),usage:HEAPU32[descriptor+16>>2],size:HEAPU32[descriptor+4+24>>2]*4294967296+HEAPU32[descriptor+24>>2],mappedAtCreation};var device=WebGPU.getJsObject(devicePtr);var buffer;try{buffer=device.createBuffer(desc)}catch(ex){return false}WebGPU.Internals.jsObjectInsert(bufferPtr,buffer);if(mappedAtCreation){WebGPU.Internals.bufferOnUnmaps[bufferPtr]=[]}return true};var _emwgpuDeviceCreateShaderModule=(devicePtr,descriptor,shaderModulePtr)=>{var nextInChainPtr=HEAPU32[descriptor>>2];var sType=HEAPU32[nextInChainPtr+4>>2];var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),code:""};switch(sType){case 2:{desc["code"]=WebGPU.makeStringFromStringView(nextInChainPtr+8);break}}var device=WebGPU.getJsObject(devicePtr);WebGPU.Internals.jsObjectInsert(shaderModulePtr,device.createShaderModule(desc))};var _emwgpuDeviceDestroy=devicePtr=>{const device=WebGPU.getJsObject(devicePtr);device.onuncapturederror=null;device.destroy()};var _emwgpuQueueOnSubmittedWorkDone=function(queuePtr,futureId){futureId=bigintToI53Checked(futureId);var queue=WebGPU.getJsObject(queuePtr);WebGPU.Internals.futureInsert(futureId,queue.onSubmittedWorkDone().then(()=>{callUserCallback(()=>{_emwgpuOnWorkDoneCompleted(futureId,1)})}))};var _emwgpuWaitAny=(futurePtr,futureCount,timeoutMSPtr)=>{abort("TODO: Implement asyncify-free WaitAny for timeout=0")};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.language||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var _fd_close=fd=>52;function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0};var _llvm_eh_typeid_for=type=>type;var _wgpuBufferGetSize=function(bufferPtr){var ret=(()=>{var buffer=WebGPU.getJsObject(bufferPtr);return buffer.size})();return BigInt(ret)};var _wgpuCommandEncoderBeginComputePass=(encoderPtr,descriptor)=>{var desc;if(descriptor){desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),timestampWrites:WebGPU.makePassTimestampWrites(HEAPU32[descriptor+12>>2])}}var commandEncoder=WebGPU.getJsObject(encoderPtr);var ptr=_emwgpuCreateComputePassEncoder(0);WebGPU.Internals.jsObjectInsert(ptr,commandEncoder.beginComputePass(desc));return ptr};var _wgpuCommandEncoderBeginRenderPass=(encoderPtr,descriptor)=>{function makeColorAttachment(caPtr){var viewPtr=HEAPU32[caPtr+4>>2];if(viewPtr===0){return undefined}var depthSlice=HEAP32[caPtr+8>>2];if(depthSlice==-1)depthSlice=undefined;var loadOpInt=HEAPU32[caPtr+16>>2];var storeOpInt=HEAPU32[caPtr+20>>2];var clearValue=WebGPU.makeColor(caPtr+24);return{view:WebGPU.getJsObject(viewPtr),depthSlice,resolveTarget:WebGPU.getJsObject(HEAPU32[caPtr+12>>2]),clearValue,loadOp:WebGPU.LoadOp[loadOpInt],storeOp:WebGPU.StoreOp[storeOpInt]}}function makeColorAttachments(count,caPtr){var attachments=[];for(var i=0;i<count;++i){attachments.push(makeColorAttachment(caPtr+56*i))}return attachments}function makeDepthStencilAttachment(dsaPtr){if(dsaPtr===0)return undefined;return{view:WebGPU.getJsObject(HEAPU32[dsaPtr+4>>2]),depthClearValue:HEAPF32[dsaPtr+16>>2],depthLoadOp:WebGPU.LoadOp[HEAPU32[dsaPtr+8>>2]],depthStoreOp:WebGPU.StoreOp[HEAPU32[dsaPtr+12>>2]],depthReadOnly:!!HEAPU32[dsaPtr+20>>2],stencilClearValue:HEAPU32[dsaPtr+32>>2],stencilLoadOp:WebGPU.LoadOp[HEAPU32[dsaPtr+24>>2]],stencilStoreOp:WebGPU.StoreOp[HEAPU32[dsaPtr+28>>2]],stencilReadOnly:!!HEAPU32[dsaPtr+36>>2]}}function makeRenderPassDescriptor(descriptor){var nextInChainPtr=HEAPU32[descriptor>>2];var maxDrawCount=undefined;if(nextInChainPtr!==0){var sType=HEAPU32[nextInChainPtr+4>>2];var renderPassMaxDrawCount=nextInChainPtr;maxDrawCount=HEAPU32[renderPassMaxDrawCount+4+8>>2]*4294967296+HEAPU32[renderPassMaxDrawCount+8>>2]}var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),colorAttachments:makeColorAttachments(HEAPU32[descriptor+12>>2],HEAPU32[descriptor+16>>2]),depthStencilAttachment:makeDepthStencilAttachment(HEAPU32[descriptor+20>>2]),occlusionQuerySet:WebGPU.getJsObject(HEAPU32[descriptor+24>>2]),timestampWrites:WebGPU.makePassTimestampWrites(HEAPU32[descriptor+28>>2]),maxDrawCount};return desc}var desc=makeRenderPassDescriptor(descriptor);var commandEncoder=WebGPU.getJsObject(encoderPtr);var ptr=_emwgpuCreateRenderPassEncoder(0);WebGPU.Internals.jsObjectInsert(ptr,commandEncoder.beginRenderPass(desc));return ptr};function _wgpuCommandEncoderCopyBufferToBuffer(encoderPtr,srcPtr,srcOffset,dstPtr,dstOffset,size){srcOffset=bigintToI53Checked(srcOffset);dstOffset=bigintToI53Checked(dstOffset);size=bigintToI53Checked(size);var commandEncoder=WebGPU.getJsObject(encoderPtr);var src=WebGPU.getJsObject(srcPtr);var dst=WebGPU.getJsObject(dstPtr);commandEncoder.copyBufferToBuffer(src,srcOffset,dst,dstOffset,size)}var _wgpuCommandEncoderCopyBufferToTexture=(encoderPtr,srcPtr,dstPtr,copySizePtr)=>{var commandEncoder=WebGPU.getJsObject(encoderPtr);var copySize=WebGPU.makeExtent3D(copySizePtr);commandEncoder.copyBufferToTexture(WebGPU.makeTexelCopyBufferInfo(srcPtr),WebGPU.makeTexelCopyTextureInfo(dstPtr),copySize)};var _wgpuCommandEncoderCopyTextureToBuffer=(encoderPtr,srcPtr,dstPtr,copySizePtr)=>{var commandEncoder=WebGPU.getJsObject(encoderPtr);var copySize=WebGPU.makeExtent3D(copySizePtr);commandEncoder.copyTextureToBuffer(WebGPU.makeTexelCopyTextureInfo(srcPtr),WebGPU.makeTexelCopyBufferInfo(dstPtr),copySize)};var _wgpuCommandEncoderCopyTextureToTexture=(encoderPtr,srcPtr,dstPtr,copySizePtr)=>{var commandEncoder=WebGPU.getJsObject(encoderPtr);var copySize=WebGPU.makeExtent3D(copySizePtr);commandEncoder.copyTextureToTexture(WebGPU.makeTexelCopyTextureInfo(srcPtr),WebGPU.makeTexelCopyTextureInfo(dstPtr),copySize)};var _wgpuCommandEncoderFinish=(encoderPtr,descriptor)=>{var commandEncoder=WebGPU.getJsObject(encoderPtr);var ptr=_emwgpuCreateCommandBuffer(0);WebGPU.Internals.jsObjectInsert(ptr,commandEncoder.finish());return ptr};var _wgpuComputePassEncoderDispatchWorkgroups=(passPtr,x,y,z)=>{var pass=WebGPU.getJsObject(passPtr);pass.dispatchWorkgroups(x,y,z)};function _wgpuComputePassEncoderDispatchWorkgroupsIndirect(passPtr,indirectBufferPtr,indirectOffset){indirectOffset=bigintToI53Checked(indirectOffset);var indirectBuffer=WebGPU.getJsObject(indirectBufferPtr);var pass=WebGPU.getJsObject(passPtr);pass.dispatchWorkgroupsIndirect(indirectBuffer,indirectOffset)}var _wgpuComputePassEncoderEnd=passPtr=>{var pass=WebGPU.getJsObject(passPtr);pass.end()};var _wgpuComputePassEncoderSetBindGroup=(passPtr,groupIndex,groupPtr,dynamicOffsetCount,dynamicOffsetsPtr)=>{var pass=WebGPU.getJsObject(passPtr);var group=WebGPU.getJsObject(groupPtr);if(dynamicOffsetCount==0){pass.setBindGroup(groupIndex,group)}else{pass.setBindGroup(groupIndex,group,HEAPU32,dynamicOffsetsPtr>>2,dynamicOffsetCount)}};var _wgpuComputePassEncoderSetPipeline=(passPtr,pipelinePtr)=>{var pass=WebGPU.getJsObject(passPtr);var pipeline=WebGPU.getJsObject(pipelinePtr);pass.setPipeline(pipeline)};var readI53FromI64=ptr=>HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;var _wgpuDeviceCreateBindGroup=(devicePtr,descriptor)=>{function makeEntry(entryPtr){var bufferPtr=HEAPU32[entryPtr+8>>2];var samplerPtr=HEAPU32[entryPtr+32>>2];var textureViewPtr=HEAPU32[entryPtr+36>>2];var binding=HEAPU32[entryPtr+4>>2];if(bufferPtr){var size=readI53FromI64(entryPtr+24);if(size==-1)size=undefined;return{binding,resource:{buffer:WebGPU.getJsObject(bufferPtr),offset:HEAPU32[entryPtr+4+16>>2]*4294967296+HEAPU32[entryPtr+16>>2],size}}}else if(samplerPtr){return{binding,resource:WebGPU.getJsObject(samplerPtr)}}else{return{binding,resource:WebGPU.getJsObject(textureViewPtr)}}}function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i<count;++i){entries.push(makeEntry(entriesPtrs+40*i))}return entries}var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),layout:WebGPU.getJsObject(HEAPU32[descriptor+12>>2]),entries:makeEntries(HEAPU32[descriptor+16>>2],HEAPU32[descriptor+20>>2])};var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateBindGroup(0);WebGPU.Internals.jsObjectInsert(ptr,device.createBindGroup(desc));return ptr};var _wgpuDeviceCreateBindGroupLayout=(devicePtr,descriptor)=>{function makeBufferEntry(entryPtr){var typeInt=HEAPU32[entryPtr+4>>2];if(!typeInt)return undefined;return{type:WebGPU.BufferBindingType[typeInt],hasDynamicOffset:!!HEAPU32[entryPtr+8>>2],minBindingSize:HEAPU32[entryPtr+4+16>>2]*4294967296+HEAPU32[entryPtr+16>>2]}}function makeSamplerEntry(entryPtr){var typeInt=HEAPU32[entryPtr+4>>2];if(!typeInt)return undefined;return{type:WebGPU.SamplerBindingType[typeInt]}}function makeTextureEntry(entryPtr){var sampleTypeInt=HEAPU32[entryPtr+4>>2];if(!sampleTypeInt)return undefined;return{sampleType:WebGPU.TextureSampleType[sampleTypeInt],viewDimension:WebGPU.TextureViewDimension[HEAPU32[entryPtr+8>>2]],multisampled:!!HEAPU32[entryPtr+12>>2]}}function makeStorageTextureEntry(entryPtr){var accessInt=HEAPU32[entryPtr+4>>2];if(!accessInt)return undefined;return{access:WebGPU.StorageTextureAccess[accessInt],format:WebGPU.TextureFormat[HEAPU32[entryPtr+8>>2]],viewDimension:WebGPU.TextureViewDimension[HEAPU32[entryPtr+12>>2]]}}function makeEntry(entryPtr){return{binding:HEAPU32[entryPtr+4>>2],visibility:HEAPU32[entryPtr+8>>2],buffer:makeBufferEntry(entryPtr+24),sampler:makeSamplerEntry(entryPtr+48),texture:makeTextureEntry(entryPtr+56),storageTexture:makeStorageTextureEntry(entryPtr+72)}}function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i<count;++i){entries.push(makeEntry(entriesPtrs+88*i))}return entries}var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),entries:makeEntries(HEAPU32[descriptor+12>>2],HEAPU32[descriptor+16>>2])};var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateBindGroupLayout(0);WebGPU.Internals.jsObjectInsert(ptr,device.createBindGroupLayout(desc));return ptr};var _wgpuDeviceCreateCommandEncoder=(devicePtr,descriptor)=>{var desc;if(descriptor){desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4)}}var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateCommandEncoder(0);WebGPU.Internals.jsObjectInsert(ptr,device.createCommandEncoder(desc));return ptr};var _wgpuDeviceCreateComputePipeline=(devicePtr,descriptor)=>{var desc=WebGPU.makeComputePipelineDesc(descriptor);var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateComputePipeline(0);WebGPU.Internals.jsObjectInsert(ptr,device.createComputePipeline(desc));return ptr};var _wgpuDeviceCreatePipelineLayout=(devicePtr,descriptor)=>{var bglCount=HEAPU32[descriptor+12>>2];var bglPtr=HEAPU32[descriptor+16>>2];var bgls=[];for(var i=0;i<bglCount;++i){bgls.push(WebGPU.getJsObject(HEAPU32[bglPtr+4*i>>2]))}var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),bindGroupLayouts:bgls};var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreatePipelineLayout(0);WebGPU.Internals.jsObjectInsert(ptr,device.createPipelineLayout(desc));return ptr};var _wgpuDeviceCreateRenderBundleEncoder=(devicePtr,descriptor)=>{function makeRenderBundleEncoderDescriptor(descriptor){function makeColorFormats(count,formatsPtr){var formats=[];for(var i=0;i<count;++i,formatsPtr+=4){formats.push(WebGPU.TextureFormat[HEAPU32[formatsPtr>>2]])}return formats}var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),colorFormats:makeColorFormats(HEAPU32[descriptor+12>>2],HEAPU32[descriptor+16>>2]),depthStencilFormat:WebGPU.TextureFormat[HEAPU32[descriptor+20>>2]],sampleCount:HEAPU32[descriptor+24>>2],depthReadOnly:!!HEAPU32[descriptor+28>>2],stencilReadOnly:!!HEAPU32[descriptor+32>>2]};return desc}var desc=makeRenderBundleEncoderDescriptor(descriptor);var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateRenderBundleEncoder(0);WebGPU.Internals.jsObjectInsert(ptr,device.createRenderBundleEncoder(desc));return ptr};var _wgpuDeviceCreateRenderPipeline=(devicePtr,descriptor)=>{var desc=WebGPU.makeRenderPipelineDesc(descriptor);var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateRenderPipeline(0);WebGPU.Internals.jsObjectInsert(ptr,device.createRenderPipeline(desc));return ptr};var _wgpuDeviceCreateSampler=(devicePtr,descriptor)=>{var desc;if(descriptor){desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),addressModeU:WebGPU.AddressMode[HEAPU32[descriptor+12>>2]],addressModeV:WebGPU.AddressMode[HEAPU32[descriptor+16>>2]],addressModeW:WebGPU.AddressMode[HEAPU32[descriptor+20>>2]],magFilter:WebGPU.FilterMode[HEAPU32[descriptor+24>>2]],minFilter:WebGPU.FilterMode[HEAPU32[descriptor+28>>2]],mipmapFilter:WebGPU.MipmapFilterMode[HEAPU32[descriptor+32>>2]],lodMinClamp:HEAPF32[descriptor+36>>2],lodMaxClamp:HEAPF32[descriptor+40>>2],compare:WebGPU.CompareFunction[HEAPU32[descriptor+44>>2]],maxAnisotropy:HEAPU16[descriptor+48>>1]}}var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateSampler(0);WebGPU.Internals.jsObjectInsert(ptr,device.createSampler(desc));return ptr};var _wgpuDeviceCreateTexture=(devicePtr,descriptor)=>{var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),size:WebGPU.makeExtent3D(descriptor+28),mipLevelCount:HEAPU32[descriptor+44>>2],sampleCount:HEAPU32[descriptor+48>>2],dimension:WebGPU.TextureDimension[HEAPU32[descriptor+24>>2]],format:WebGPU.TextureFormat[HEAPU32[descriptor+40>>2]],usage:HEAPU32[descriptor+16>>2]};var viewFormatCount=HEAPU32[descriptor+52>>2];if(viewFormatCount){var viewFormatsPtr=HEAPU32[descriptor+56>>2];desc["viewFormats"]=Array.from(HEAP32.subarray(viewFormatsPtr>>2,viewFormatsPtr+viewFormatCount*4>>2),format=>WebGPU.TextureFormat[format])}var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateTexture(0);WebGPU.Internals.jsObjectInsert(ptr,device.createTexture(desc));return ptr};var _wgpuDeviceGetLimits=(devicePtr,limitsOutPtr)=>{var device=WebGPU.getJsObject(devicePtr);WebGPU.fillLimitStruct(device.limits,limitsOutPtr);return 1};var maybeCStringToJsString=cString=>cString>2?UTF8ToString(cString):cString;var specialHTMLTargets=[0,document,window];var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||document.querySelector(target);return domElement};var findCanvasEventTarget=findEventTarget;var _wgpuInstanceCreateSurface=(instancePtr,descriptor)=>{var nextInChainPtr=HEAPU32[descriptor>>2];var sourceCanvasHTMLSelector=nextInChainPtr;var selectorPtr=HEAPU32[sourceCanvasHTMLSelector+8>>2];var canvas=findCanvasEventTarget(selectorPtr);var context=canvas.getContext("webgpu");if(!context)return 0;context.surfaceLabelWebGPU=WebGPU.makeStringFromOptionalStringView(descriptor+4);var ptr=_emwgpuCreateSurface(0);WebGPU.Internals.jsObjectInsert(ptr,context);return ptr};var _wgpuQueueSubmit=(queuePtr,commandCount,commands)=>{var queue=WebGPU.getJsObject(queuePtr);var cmds=Array.from(HEAP32.subarray(commands>>2,commands+commandCount*4>>2),id=>WebGPU.getJsObject(id));queue.submit(cmds)};function _wgpuQueueWriteBuffer(queuePtr,bufferPtr,bufferOffset,data,size){bufferOffset=bigintToI53Checked(bufferOffset);var queue=WebGPU.getJsObject(queuePtr);var buffer=WebGPU.getJsObject(bufferPtr);var subarray=HEAPU8.subarray(data,data+size);queue.writeBuffer(buffer,bufferOffset,subarray,0,size)}var _wgpuQueueWriteTexture=(queuePtr,destinationPtr,data,dataSize,dataLayoutPtr,writeSizePtr)=>{var queue=WebGPU.getJsObject(queuePtr);var destination=WebGPU.makeTexelCopyTextureInfo(destinationPtr);var dataLayout=WebGPU.makeTexelCopyBufferLayout(dataLayoutPtr);var writeSize=WebGPU.makeExtent3D(writeSizePtr);var subarray=HEAPU8.subarray(data,data+dataSize);queue.writeTexture(destination,subarray,dataLayout,writeSize)};var _wgpuRenderBundleEncoderDraw=(passPtr,vertexCount,instanceCount,firstVertex,firstInstance)=>{firstVertex>>>=0;firstInstance>>>=0;var pass=WebGPU.getJsObject(passPtr);pass.draw(vertexCount,instanceCount,firstVertex,firstInstance)};var _wgpuRenderBundleEncoderDrawIndexed=(passPtr,indexCount,instanceCount,firstIndex,baseVertex,firstInstance)=>{firstIndex>>>=0;firstInstance>>>=0;var pass=WebGPU.getJsObject(passPtr);pass.drawIndexed(indexCount,instanceCount,firstIndex,baseVertex,firstInstance)};var _wgpuRenderBundleEncoderFinish=(encoderPtr,descriptor)=>{var desc;if(descriptor){desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4)}}var encoder=WebGPU.getJsObject(encoderPtr);var ptr=_emwgpuCreateRenderBundle(0);WebGPU.Internals.jsObjectInsert(ptr,encoder.finish(desc));return ptr};var _wgpuRenderBundleEncoderSetBindGroup=(passPtr,groupIndex,groupPtr,dynamicOffsetCount,dynamicOffsetsPtr)=>{var pass=WebGPU.getJsObject(passPtr);var group=WebGPU.getJsObject(groupPtr);if(dynamicOffsetCount==0){pass.setBindGroup(groupIndex,group)}else{pass.setBindGroup(groupIndex,group,HEAPU32,dynamicOffsetsPtr>>2,dynamicOffsetCount)}};function _wgpuRenderBundleEncoderSetIndexBuffer(passPtr,bufferPtr,format,offset,size){offset=bigintToI53Checked(offset);size=bigintToI53Checked(size);var pass=WebGPU.getJsObject(passPtr);var buffer=WebGPU.getJsObject(bufferPtr);if(size==-1)size=undefined;pass.setIndexBuffer(buffer,WebGPU.IndexFormat[format],offset,size)}var _wgpuRenderBundleEncoderSetPipeline=(passPtr,pipelinePtr)=>{var pass=WebGPU.getJsObject(passPtr);var pipeline=WebGPU.getJsObject(pipelinePtr);pass.setPipeline(pipeline)};function _wgpuRenderBundleEncoderSetVertexBuffer(passPtr,slot,bufferPtr,offset,size){offset=bigintToI53Checked(offset);size=bigintToI53Checked(size);var pass=WebGPU.getJsObject(passPtr);var buffer=WebGPU.getJsObject(bufferPtr);if(size==-1)size=undefined;pass.setVertexBuffer(slot,buffer,offset,size)}var _wgpuRenderPassEncoderDraw=(passPtr,vertexCount,instanceCount,firstVertex,firstInstance)=>{firstVertex>>>=0;firstInstance>>>=0;var pass=WebGPU.getJsObject(passPtr);pass.draw(vertexCount,instanceCount,firstVertex,firstInstance)};var _wgpuRenderPassEncoderDrawIndexed=(passPtr,indexCount,instanceCount,firstIndex,baseVertex,firstInstance)=>{firstIndex>>>=0;firstInstance>>>=0;var pass=WebGPU.getJsObject(passPtr);pass.drawIndexed(indexCount,instanceCount,firstIndex,baseVertex,firstInstance)};var _wgpuRenderPassEncoderEnd=encoderPtr=>{var encoder=WebGPU.getJsObject(encoderPtr);encoder.end()};var _wgpuRenderPassEncoderExecuteBundles=(passPtr,count,bundlesPtr)=>{var pass=WebGPU.getJsObject(passPtr);var bundles=Array.from(HEAP32.subarray(bundlesPtr>>2,bundlesPtr+count*4>>2),id=>WebGPU.getJsObject(id));pass.executeBundles(bundles)};var _wgpuRenderPassEncoderSetBindGroup=(passPtr,groupIndex,groupPtr,dynamicOffsetCount,dynamicOffsetsPtr)=>{var pass=WebGPU.getJsObject(passPtr);var group=WebGPU.getJsObject(groupPtr);if(dynamicOffsetCount==0){pass.setBindGroup(groupIndex,group)}else{pass.setBindGroup(groupIndex,group,HEAPU32,dynamicOffsetsPtr>>2,dynamicOffsetCount)}};function _wgpuRenderPassEncoderSetIndexBuffer(passPtr,bufferPtr,format,offset,size){offset=bigintToI53Checked(offset);size=bigintToI53Checked(size);var pass=WebGPU.getJsObject(passPtr);var buffer=WebGPU.getJsObject(bufferPtr);if(size==-1)size=undefined;pass.setIndexBuffer(buffer,WebGPU.IndexFormat[format],offset,size)}var _wgpuRenderPassEncoderSetPipeline=(passPtr,pipelinePtr)=>{var pass=WebGPU.getJsObject(passPtr);var pipeline=WebGPU.getJsObject(pipelinePtr);pass.setPipeline(pipeline)};var _wgpuRenderPassEncoderSetScissorRect=(passPtr,x,y,w,h)=>{var pass=WebGPU.getJsObject(passPtr);pass.setScissorRect(x,y,w,h)};function _wgpuRenderPassEncoderSetVertexBuffer(passPtr,slot,bufferPtr,offset,size){offset=bigintToI53Checked(offset);size=bigintToI53Checked(size);var pass=WebGPU.getJsObject(passPtr);var buffer=WebGPU.getJsObject(bufferPtr);if(size==-1)size=undefined;pass.setVertexBuffer(slot,buffer,offset,size)}var _wgpuRenderPassEncoderSetViewport=(passPtr,x,y,w,h,minDepth,maxDepth)=>{var pass=WebGPU.getJsObject(passPtr);pass.setViewport(x,y,w,h,minDepth,maxDepth)};var _wgpuRenderPipelineGetBindGroupLayout=(pipelinePtr,groupIndex)=>{var pipeline=WebGPU.getJsObject(pipelinePtr);var ptr=_emwgpuCreateBindGroupLayout(0);WebGPU.Internals.jsObjectInsert(ptr,pipeline.getBindGroupLayout(groupIndex));return ptr};var _wgpuSurfaceConfigure=(surfacePtr,config)=>{var devicePtr=HEAPU32[config+4>>2];var context=WebGPU.getJsObject(surfacePtr);var canvasSize=[HEAPU32[config+24>>2],HEAPU32[config+28>>2]];if(canvasSize[0]!==0){context["canvas"]["width"]=canvasSize[0]}if(canvasSize[1]!==0){context["canvas"]["height"]=canvasSize[1]}var configuration={device:WebGPU.getJsObject(devicePtr),format:WebGPU.TextureFormat[HEAPU32[config+8>>2]],usage:HEAPU32[config+16>>2],alphaMode:WebGPU.CompositeAlphaMode[HEAPU32[config+40>>2]]};var viewFormatCount=HEAPU32[config+32>>2];if(viewFormatCount){var viewFormatsPtr=HEAPU32[config+36>>2];configuration["viewFormats"]=Array.from(HEAP32.subarray(viewFormatsPtr>>2,viewFormatsPtr+viewFormatCount*4>>2),format=>WebGPU.TextureFormat[format])}{var nextInChainPtr=HEAPU32[config>>2];if(nextInChainPtr!==0){var sType=HEAPU32[nextInChainPtr+4>>2];var surfaceColorManagement=nextInChainPtr;configuration.colorSpace=WebGPU.PredefinedColorSpace[HEAPU32[surfaceColorManagement+8>>2]];configuration.toneMapping={mode:WebGPU.ToneMappingMode[HEAPU32[surfaceColorManagement+12>>2]]}}}context.configure(configuration)};var _wgpuSurfaceGetCurrentTexture=(surfacePtr,surfaceTexturePtr)=>{var context=WebGPU.getJsObject(surfacePtr);try{var texturePtr=_emwgpuCreateTexture(0);WebGPU.Internals.jsObjectInsert(texturePtr,context.getCurrentTexture());HEAPU32[surfaceTexturePtr+4>>2]=texturePtr;HEAP32[surfaceTexturePtr+8>>2]=1}catch(ex){HEAPU32[surfaceTexturePtr+4>>2]=0;HEAP32[surfaceTexturePtr+8>>2]=6}};var _wgpuSurfaceUnconfigure=surfacePtr=>{var context=WebGPU.getJsObject(surfacePtr);context.unconfigure()};var _wgpuTextureCreateView=(texturePtr,descriptor)=>{var desc;if(descriptor){var mipLevelCount=HEAPU32[descriptor+24>>2];var arrayLayerCount=HEAPU32[descriptor+32>>2];desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+4),format:WebGPU.TextureFormat[HEAPU32[descriptor+12>>2]],dimension:WebGPU.TextureViewDimension[HEAPU32[descriptor+16>>2]],baseMipLevel:HEAPU32[descriptor+20>>2],mipLevelCount:mipLevelCount===4294967295?undefined:mipLevelCount,baseArrayLayer:HEAPU32[descriptor+28>>2],arrayLayerCount:arrayLayerCount===4294967295?undefined:arrayLayerCount,aspect:WebGPU.TextureAspect[HEAPU32[descriptor+36>>2]]}}var texture=WebGPU.getJsObject(texturePtr);var ptr=_emwgpuCreateTextureView(0);WebGPU.Internals.jsObjectInsert(ptr,texture.createView(desc));return ptr};var _wgpuTextureDestroy=texturePtr=>{WebGPU.getJsObject(texturePtr).destroy()};var _wgpuTextureGetDepthOrArrayLayers=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return texture.depthOrArrayLayers};var _wgpuTextureGetDimension=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return WebGPU.TextureDimension.indexOf(texture.dimension)};var _wgpuTextureGetFormat=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return WebGPU.TextureFormat.indexOf(texture.format)};var _wgpuTextureGetHeight=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return texture.height};var _wgpuTextureGetMipLevelCount=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return texture.mipLevelCount};var _wgpuTextureGetSampleCount=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return texture.sampleCount};var _wgpuTextureGetWidth=texturePtr=>{var texture=WebGPU.getJsObject(texturePtr);return texture.width};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}var ASM_CONSTS={402252:()=>Module.progpuBrowserCanvasFormat==="rgba8unorm"?1:2,402322:()=>Number(Module.progpuBrowserMetrics?.scale||1),402382:()=>Module.progpuBrowserMetrics?.width||1,402434:()=>Module.progpuBrowserMetrics?.height||1,402487:()=>Number(Module.progpuBrowserMetrics?.logicalWidth||1),402554:()=>Number(Module.progpuBrowserMetrics?.logicalHeight||1)};var _wgpuDeviceAddRef,_progpu_browser_initialize,_progpu_browser_dispose,_progpu_browser_error,_progpu_browser_metrics,_progpu_browser_stream,_progpu_browser_stream_size,_progpu_browser_device_lost,_progpu_browser_update,_progpu_browser_render,_emwgpuCreateBindGroup,_emwgpuCreateBindGroupLayout,_emwgpuCreateCommandBuffer,_emwgpuCreateCommandEncoder,_emwgpuCreateComputePassEncoder,_emwgpuCreateComputePipeline,_emwgpuCreatePipelineLayout,_emwgpuCreateQuerySet,_emwgpuCreateRenderBundle,_emwgpuCreateRenderBundleEncoder,_emwgpuCreateRenderPassEncoder,_emwgpuCreateRenderPipeline,_emwgpuCreateSampler,_emwgpuCreateSurface,_emwgpuCreateTexture,_emwgpuCreateTextureView,_emwgpuCreateAdapter,_emwgpuCreateBuffer,_emwgpuCreateDevice,_emwgpuCreateQueue,_emwgpuCreateShaderModule,_emwgpuOnMapAsyncCompleted,_emwgpuOnWorkDoneCompleted,_free,__emscripten_timeout,_malloc,_memalign,_setThrew,__emscripten_tempret_set,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___cxa_decrement_exception_refcount,___cxa_increment_exception_refcount,___cxa_can_catch,___cxa_get_exception_ptr,memory,__indirect_function_table,wasmMemory,wasmTable;function assignWasmExports(wasmExports){_wgpuDeviceAddRef=wasmExports["_a"];_progpu_browser_initialize=Module["_progpu_browser_initialize"]=wasmExports["$a"];_progpu_browser_dispose=Module["_progpu_browser_dispose"]=wasmExports["ab"];_progpu_browser_error=Module["_progpu_browser_error"]=wasmExports["bb"];_progpu_browser_metrics=Module["_progpu_browser_metrics"]=wasmExports["cb"];_progpu_browser_stream=Module["_progpu_browser_stream"]=wasmExports["db"];_progpu_browser_stream_size=Module["_progpu_browser_stream_size"]=wasmExports["eb"];_progpu_browser_device_lost=Module["_progpu_browser_device_lost"]=wasmExports["fb"];_progpu_browser_update=Module["_progpu_browser_update"]=wasmExports["gb"];_progpu_browser_render=Module["_progpu_browser_render"]=wasmExports["hb"];_emwgpuCreateBindGroup=wasmExports["ib"];_emwgpuCreateBindGroupLayout=wasmExports["jb"];_emwgpuCreateCommandBuffer=wasmExports["kb"];_emwgpuCreateCommandEncoder=wasmExports["lb"];_emwgpuCreateComputePassEncoder=wasmExports["mb"];_emwgpuCreateComputePipeline=wasmExports["nb"];_emwgpuCreatePipelineLayout=wasmExports["ob"];_emwgpuCreateQuerySet=wasmExports["pb"];_emwgpuCreateRenderBundle=wasmExports["qb"];_emwgpuCreateRenderBundleEncoder=wasmExports["rb"];_emwgpuCreateRenderPassEncoder=wasmExports["sb"];_emwgpuCreateRenderPipeline=wasmExports["tb"];_emwgpuCreateSampler=wasmExports["ub"];_emwgpuCreateSurface=wasmExports["vb"];_emwgpuCreateTexture=wasmExports["wb"];_emwgpuCreateTextureView=wasmExports["xb"];_emwgpuCreateAdapter=wasmExports["yb"];_emwgpuCreateBuffer=wasmExports["zb"];_emwgpuCreateDevice=wasmExports["Ab"];_emwgpuCreateQueue=wasmExports["Bb"];_emwgpuCreateShaderModule=wasmExports["Cb"];_emwgpuOnMapAsyncCompleted=wasmExports["Db"];_emwgpuOnWorkDoneCompleted=wasmExports["Eb"];_free=Module["_free"]=wasmExports["Fb"];__emscripten_timeout=wasmExports["Gb"];_malloc=Module["_malloc"]=wasmExports["Hb"];_memalign=wasmExports["Ib"];_setThrew=wasmExports["Jb"];__emscripten_tempret_set=wasmExports["Kb"];__emscripten_stack_restore=wasmExports["Lb"];__emscripten_stack_alloc=wasmExports["Mb"];_emscripten_stack_get_current=wasmExports["Nb"];___cxa_decrement_exception_refcount=wasmExports["Ob"];___cxa_increment_exception_refcount=wasmExports["Pb"];___cxa_can_catch=wasmExports["Qb"];___cxa_get_exception_ptr=wasmExports["Rb"];memory=wasmMemory=wasmExports["Xa"];__indirect_function_table=wasmTable=wasmExports["Za"]}var wasmImports={m:___cxa_begin_catch,U:___cxa_end_catch,g:___cxa_find_matching_catch_2,i:___cxa_find_matching_catch_3,a:___cxa_find_matching_catch_4,h:___cxa_throw,j:___resumeException,J:__abort_js,z:__emscripten_runtime_keepalive_clear,A:__setitimer_js,B:_clock_time_get,o:_emscripten_asm_const_double,p:_emscripten_asm_const_int,D:_emscripten_resize_heap,V:_emscripten_webgpu_get_device,T:_emwgpuBufferDestroy,S:_emwgpuBufferGetConstMappedRange,R:_emwgpuBufferMapAsync,Q:_emwgpuBufferUnmap,d:_emwgpuDelete,O:_emwgpuDeviceCreateBuffer,M:_emwgpuDeviceCreateShaderModule,P:_emwgpuDeviceDestroy,L:_emwgpuQueueOnSubmittedWorkDone,K:_emwgpuWaitAny,H:_environ_get,I:_environ_sizes_get,G:_fd_close,E:_fd_seek,F:_fd_write,c:invoke_fi,x:invoke_i,f:invoke_ii,b:invoke_iii,r:invoke_iiii,t:invoke_iiiii,v:invoke_iijj,Ua:invoke_j,n:invoke_ji,l:invoke_v,s:invoke_vi,k:invoke_vii,e:invoke_viii,q:invoke_viiii,u:_llvm_eh_typeid_for,y:_proc_exit,$:_wgpuBufferGetSize,aa:_wgpuCommandEncoderBeginComputePass,ba:_wgpuCommandEncoderBeginRenderPass,ca:_wgpuCommandEncoderCopyBufferToBuffer,ea:_wgpuCommandEncoderCopyBufferToTexture,fa:_wgpuCommandEncoderCopyTextureToBuffer,ga:_wgpuCommandEncoderCopyTextureToTexture,ha:_wgpuCommandEncoderFinish,ia:_wgpuComputePassEncoderDispatchWorkgroups,ja:_wgpuComputePassEncoderDispatchWorkgroupsIndirect,ka:_wgpuComputePassEncoderEnd,la:_wgpuComputePassEncoderSetBindGroup,ma:_wgpuComputePassEncoderSetPipeline,pa:_wgpuDeviceCreateBindGroup,qa:_wgpuDeviceCreateBindGroupLayout,ra:_wgpuDeviceCreateCommandEncoder,sa:_wgpuDeviceCreateComputePipeline,ta:_wgpuDeviceCreatePipelineLayout,ua:_wgpuDeviceCreateRenderBundleEncoder,va:_wgpuDeviceCreateRenderPipeline,wa:_wgpuDeviceCreateSampler,xa:_wgpuDeviceCreateTexture,na:_wgpuDeviceGetLimits,Z:_wgpuInstanceCreateSurface,ya:_wgpuQueueSubmit,Aa:_wgpuQueueWriteBuffer,Ba:_wgpuQueueWriteTexture,Na:_wgpuRenderBundleEncoderDraw,Oa:_wgpuRenderBundleEncoderDrawIndexed,Pa:_wgpuRenderBundleEncoderFinish,Qa:_wgpuRenderBundleEncoderSetBindGroup,Ra:_wgpuRenderBundleEncoderSetIndexBuffer,Sa:_wgpuRenderBundleEncoderSetPipeline,Ta:_wgpuRenderBundleEncoderSetVertexBuffer,Ca:_wgpuRenderPassEncoderDraw,Da:_wgpuRenderPassEncoderDrawIndexed,Ea:_wgpuRenderPassEncoderEnd,Fa:_wgpuRenderPassEncoderExecuteBundles,Ga:_wgpuRenderPassEncoderSetBindGroup,Ha:_wgpuRenderPassEncoderSetIndexBuffer,Ia:_wgpuRenderPassEncoderSetPipeline,Ja:_wgpuRenderPassEncoderSetScissorRect,Ma:_wgpuRenderPassEncoderSetVertexBuffer,La:_wgpuRenderPassEncoderSetViewport,Va:_wgpuRenderPipelineGetBindGroupLayout,W:_wgpuSurfaceConfigure,Y:_wgpuSurfaceGetCurrentTexture,_:_wgpuSurfaceUnconfigure,w:_wgpuTextureCreateView,C:_wgpuTextureDestroy,N:_wgpuTextureGetDepthOrArrayLayers,X:_wgpuTextureGetDimension,da:_wgpuTextureGetFormat,oa:_wgpuTextureGetHeight,za:_wgpuTextureGetMipLevelCount,Ka:_wgpuTextureGetSampleCount,Wa:_wgpuTextureGetWidth};function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ji(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_iijj(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_fi(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_j(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}
|
|
2
|
+
;return moduleRtn}export default Module;
|
|
Binary file
|
package/scene.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// Authoring transport only. Geometry preparation, rasterization and retained
|
|
2
|
+
// scene validation remain in the original native semantic_scene_builder.
|
|
3
|
+
const identity = Object.freeze([1, 0, 0, 1, 0, 0]);
|
|
4
|
+
const packets = new WeakMap();
|
|
5
|
+
const pathSegments = new WeakMap();
|
|
6
|
+
const limit = 64 * 1024 * 1024;
|
|
7
|
+
let nextSceneId = 1n;
|
|
8
|
+
|
|
9
|
+
function finite(value, name) {
|
|
10
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isFinite(Math.fround(value)))
|
|
11
|
+
throw new TypeError(`${name} must be a finite float32 number`);
|
|
12
|
+
return Math.fround(value);
|
|
13
|
+
}
|
|
14
|
+
function tuple(value, length, name) {
|
|
15
|
+
if (!value || value.length !== length) throw new TypeError(`${name} must have ${length} entries`);
|
|
16
|
+
return Array.from(value, (v) => finite(v, name));
|
|
17
|
+
}
|
|
18
|
+
function unit(value, name) {
|
|
19
|
+
const n = finite(value, name);
|
|
20
|
+
if (n < 0 || n > 1) throw new RangeError(`${name} must be between zero and one`);
|
|
21
|
+
return n;
|
|
22
|
+
}
|
|
23
|
+
function color(value) { return tuple(value, 4, 'color').map((v) => unit(v, 'color')); }
|
|
24
|
+
function rectangle(value) {
|
|
25
|
+
const result = tuple(value, 4, 'rectangle');
|
|
26
|
+
if (result[2] < 0 || result[3] < 0) throw new RangeError('Rectangle extents must be nonnegative');
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
function choice(value, values, name) {
|
|
30
|
+
const result = values.indexOf(value);
|
|
31
|
+
if (result < 0) throw new TypeError(`Unsupported ${name}: ${value}`);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function id(value, name) {
|
|
35
|
+
if (typeof value !== 'bigint' || value <= 0n || value > 0xffffffffffffffffn)
|
|
36
|
+
throw new RangeError(`${name} must be a nonzero uint64 bigint`);
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function brush(value) {
|
|
40
|
+
if (Array.isArray(value) || ArrayBuffer.isView(value)) return {kind: 0, color: color(value)};
|
|
41
|
+
if (!value || value.type !== 'linearGradient') throw new TypeError('Expected a color or linearGradient brush');
|
|
42
|
+
if (!Array.isArray(value.stops) || value.stops.length < 2 || value.stops.length > 65536)
|
|
43
|
+
throw new RangeError('A gradient requires 2 to 65536 ordered stops');
|
|
44
|
+
let previous = -Infinity;
|
|
45
|
+
const stops = value.stops.map((stop) => {
|
|
46
|
+
const offset = unit(stop.offset, 'gradient stop');
|
|
47
|
+
if (offset < previous) throw new RangeError('Gradient stops must be ordered');
|
|
48
|
+
previous = offset;
|
|
49
|
+
return {offset, color: color(stop.color)};
|
|
50
|
+
});
|
|
51
|
+
return {kind: 1, start: tuple(value.start, 2, 'gradient start'), end: tuple(value.end, 2, 'gradient end'),
|
|
52
|
+
opacity: unit(value.opacity ?? 1, 'opacity'),
|
|
53
|
+
spread: choice(value.spread ?? 'pad', ['pad', 'reflect', 'repeat'], 'gradient spread'), stops};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
class Writer {
|
|
57
|
+
constructor() { this.bytes = new Uint8Array(256); this.view = new DataView(this.bytes.buffer); this.length = 0; }
|
|
58
|
+
grow(size) {
|
|
59
|
+
if (this.length + size > limit) throw new RangeError('Typed scene exceeds the 64 MiB transport limit');
|
|
60
|
+
if (this.length + size <= this.bytes.length) return;
|
|
61
|
+
const bytes = new Uint8Array(Math.min(limit, Math.max(this.bytes.length * 2, this.length + size)));
|
|
62
|
+
bytes.set(this.bytes); this.bytes = bytes; this.view = new DataView(bytes.buffer);
|
|
63
|
+
}
|
|
64
|
+
u32(value) { this.grow(4); this.view.setUint32(this.length, value, true); this.length += 4; }
|
|
65
|
+
u64(value) { this.grow(8); this.view.setBigUint64(this.length, value, true); this.length += 8; }
|
|
66
|
+
f32(value) { this.grow(4); this.view.setFloat32(this.length, value, true); this.length += 4; }
|
|
67
|
+
f64(value) { this.grow(8); this.view.setFloat64(this.length, value, true); this.length += 8; }
|
|
68
|
+
floats(values) { for (const value of values) this.f32(value); }
|
|
69
|
+
paint(value) {
|
|
70
|
+
this.u32(value.kind);
|
|
71
|
+
if (value.kind === 0) { this.floats(value.color); return; }
|
|
72
|
+
this.f32(value.opacity); this.floats(value.start); this.floats(value.end);
|
|
73
|
+
this.u32(value.spread); this.u32(value.stops.length);
|
|
74
|
+
for (const stop of value.stops) { this.f32(stop.offset); this.floats(stop.color); }
|
|
75
|
+
}
|
|
76
|
+
record(kind, write) {
|
|
77
|
+
this.u32(kind); const start = this.length; this.u32(0); write(this);
|
|
78
|
+
this.view.setUint32(start, this.length - start - 4, true);
|
|
79
|
+
}
|
|
80
|
+
finish() { return this.bytes.slice(0, this.length); }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Mutable path authoring; fillPath takes an independent snapshot immediately. */
|
|
84
|
+
export class Path {
|
|
85
|
+
#segments = []; #current = null; #start = null;
|
|
86
|
+
constructor() {
|
|
87
|
+
pathSegments.set(this, () => {
|
|
88
|
+
const result = this.#segments.map((segment) => [...segment]);
|
|
89
|
+
this.#closeInto(result);
|
|
90
|
+
return result;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
#closeInto(segments) {
|
|
94
|
+
if (this.#current && (this.#current[0] !== this.#start[0] || this.#current[1] !== this.#start[1]))
|
|
95
|
+
segments.push([0, ...this.#current, ...this.#start, 0, 0, 0, 0]);
|
|
96
|
+
}
|
|
97
|
+
moveTo(x, y) {
|
|
98
|
+
const point = tuple([x, y], 2, 'point');
|
|
99
|
+
this.#closeInto(this.#segments); this.#current = point; this.#start = point; return this;
|
|
100
|
+
}
|
|
101
|
+
#segment(kind, values, end) {
|
|
102
|
+
if (!this.#current) throw new Error('A path must start with moveTo');
|
|
103
|
+
const points = tuple(values, values.length, 'point');
|
|
104
|
+
this.#segments.push([kind, ...this.#current, ...points, ...Array(6 - points.length).fill(0)]);
|
|
105
|
+
this.#current = points.slice(end, end + 2); return this;
|
|
106
|
+
}
|
|
107
|
+
lineTo(x, y) { return this.#segment(0, [x, y], 0); }
|
|
108
|
+
quadraticTo(cx, cy, x, y) { return this.#segment(1, [cx, cy, x, y], 2); }
|
|
109
|
+
cubicTo(c1x, c1y, c2x, c2y, x, y) { return this.#segment(2, [c1x, c1y, c2x, c2y, x, y], 4); }
|
|
110
|
+
close() {
|
|
111
|
+
if (!this.#current) throw new Error('A path must start with moveTo');
|
|
112
|
+
this.#closeInto(this.#segments); this.#current = this.#start; return this;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Immutable authoring snapshot. Construct with SceneBuilder.build(). */
|
|
117
|
+
export class Scene {
|
|
118
|
+
constructor(key, bytes, sceneId, generation) {
|
|
119
|
+
if (key !== packets) throw new TypeError('Use SceneBuilder.build() to create a Scene');
|
|
120
|
+
this.sceneId = sceneId; this.generation = generation;
|
|
121
|
+
packets.set(this, bytes); Object.freeze(this);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Internal module seam, not a package export. Never return the owned byte array
|
|
126
|
+
// to an application: the renderer only borrows it for one synchronous update.
|
|
127
|
+
export function scenePacket(scene) { return packets.get(scene); }
|
|
128
|
+
|
|
129
|
+
export class SceneBuilder {
|
|
130
|
+
#records = []; #stack = []; #sceneId; #generation;
|
|
131
|
+
constructor({sceneId = nextSceneId++, generation = 1n} = {}) {
|
|
132
|
+
this.#sceneId = id(sceneId, 'sceneId'); this.#generation = id(generation, 'generation');
|
|
133
|
+
}
|
|
134
|
+
fillRect(x, y, width, height, paint, {transform = identity} = {}) {
|
|
135
|
+
const rect = rectangle([x, y, width, height]); const material = brush(paint);
|
|
136
|
+
const matrix = tuple(transform, 6, 'transform');
|
|
137
|
+
this.#records.push([1, (w) => { w.floats(rect); w.floats(matrix); w.paint(material); }]); return this;
|
|
138
|
+
}
|
|
139
|
+
fillPath(path, paint, {fillRule = 'nonzero', transform = identity} = {}) {
|
|
140
|
+
const snapshot = pathSegments.get(path);
|
|
141
|
+
if (!snapshot) throw new TypeError('Expected a Path');
|
|
142
|
+
const segments = snapshot();
|
|
143
|
+
if (segments.length === 0) throw new RangeError('A filled path requires segments');
|
|
144
|
+
const rule = choice(fillRule, ['nonzero', 'evenodd'], 'fill rule');
|
|
145
|
+
const matrix = tuple(transform, 6, 'transform'); const material = brush(paint);
|
|
146
|
+
this.#records.push([2, (w) => {
|
|
147
|
+
w.floats(matrix); w.u32(rule); w.u32(segments.length);
|
|
148
|
+
for (const segment of segments) { w.u32(segment[0]); w.floats(segment.slice(1)); }
|
|
149
|
+
w.paint(material);
|
|
150
|
+
}]); return this;
|
|
151
|
+
}
|
|
152
|
+
strokePolyline(points, paint, {width = 1, closed = false, startCap = 'flat', endCap = 'flat',
|
|
153
|
+
lineJoin = 'miter', dashCap = 'flat', dashes = [], dashOffset = 0, miterLimit = 10, transform = identity} = {}) {
|
|
154
|
+
if (!Array.isArray(points) || points.length < 2) throw new RangeError('A polyline requires at least two points');
|
|
155
|
+
const snapshot = points.map((point) => tuple(point, 2, 'point'));
|
|
156
|
+
const thickness = finite(width, 'width'); const miter = finite(miterLimit, 'miterLimit');
|
|
157
|
+
if (thickness <= 0 || miter < 1) throw new RangeError('Width must be positive and miterLimit at least one');
|
|
158
|
+
if (typeof closed !== 'boolean') throw new TypeError('closed must be boolean');
|
|
159
|
+
const caps = [startCap, endCap, dashCap].map((cap) => choice(cap, ['flat', 'square', 'round', 'triangle'], 'cap'));
|
|
160
|
+
const join = choice(lineJoin, ['miter', 'bevel', 'round'], 'join');
|
|
161
|
+
if (!Array.isArray(dashes)) throw new TypeError('dashes must be an array');
|
|
162
|
+
const intervals = dashes.map((v) => {
|
|
163
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || v < 0) throw new RangeError('Dash multipliers must be finite and nonnegative');
|
|
164
|
+
return v;
|
|
165
|
+
});
|
|
166
|
+
if (intervals.length && !intervals.some((v) => v > 0)) throw new RangeError('A dash pattern needs a positive interval');
|
|
167
|
+
if (typeof dashOffset !== 'number' || !Number.isFinite(dashOffset)) throw new TypeError('dashOffset must be finite');
|
|
168
|
+
const matrix = tuple(transform, 6, 'transform'); const material = brush(paint);
|
|
169
|
+
this.#records.push([3, (w) => {
|
|
170
|
+
w.floats(matrix); w.f32(thickness); w.f32(miter); w.u32(closed ? 1 : 0);
|
|
171
|
+
w.u32(caps[0]); w.u32(caps[1]); w.u32(join); w.u32(caps[2]); w.f64(dashOffset);
|
|
172
|
+
w.u32(snapshot.length); w.u32(intervals.length);
|
|
173
|
+
for (const point of snapshot) w.floats(point);
|
|
174
|
+
for (const interval of intervals) w.f64(interval);
|
|
175
|
+
w.paint(material);
|
|
176
|
+
}]); return this;
|
|
177
|
+
}
|
|
178
|
+
/** Absolute native draw state, not a concatenating Canvas2D transform. */
|
|
179
|
+
save({transform = identity, clipRect, opacity = 1} = {}) {
|
|
180
|
+
const matrix = tuple(transform, 6, 'transform'); const alpha = unit(opacity, 'opacity');
|
|
181
|
+
const clip = clipRect === undefined ? null : rectangle(clipRect);
|
|
182
|
+
this.#records.push([4, (w) => { w.floats(matrix); w.f32(alpha); w.u32(clip ? 1 : 0); if (clip) w.floats(clip); }]);
|
|
183
|
+
this.#stack.push(4); return this;
|
|
184
|
+
}
|
|
185
|
+
restore() {
|
|
186
|
+
if (this.#stack.at(-1) !== 4) throw new Error('restore must match the innermost save');
|
|
187
|
+
this.#stack.pop(); this.#records.push([5, () => {}]); return this;
|
|
188
|
+
}
|
|
189
|
+
pushLayer({opacity = 1, bounds} = {}) {
|
|
190
|
+
const alpha = unit(opacity, 'opacity'); const rect = bounds === undefined ? null : rectangle(bounds);
|
|
191
|
+
this.#records.push([6, (w) => { w.f32(alpha); w.u32(rect ? 1 : 0); if (rect) w.floats(rect); }]);
|
|
192
|
+
this.#stack.push(6); return this;
|
|
193
|
+
}
|
|
194
|
+
popLayer() {
|
|
195
|
+
if (this.#stack.at(-1) !== 6) throw new Error('popLayer must match the innermost pushLayer');
|
|
196
|
+
this.#stack.pop(); this.#records.push([7, () => {}]); return this;
|
|
197
|
+
}
|
|
198
|
+
build() {
|
|
199
|
+
if (this.#stack.length) throw new Error('Scene scopes must be balanced before build');
|
|
200
|
+
const writer = new Writer(); writer.u32(0x50534750); writer.u32(1);
|
|
201
|
+
writer.u64(this.#sceneId); writer.u64(this.#generation); writer.u32(this.#records.length); writer.u32(0);
|
|
202
|
+
for (const [kind, record] of this.#records) writer.record(kind, record);
|
|
203
|
+
return new Scene(packets, writer.finish(), this.#sceneId, this.#generation);
|
|
204
|
+
}
|
|
205
|
+
}
|