doubleray
Version:
WASM raytracer
53 lines (52 loc) • 23.3 kB
HTML
<html lang=en-us><head><meta charset=utf-8><meta content="text/html; charset=utf-8"http-equiv=Content-Type><title>Emscripten-Generated Code</title><style>body{font-family:arial;margin:0;padding:none}.emscripten{padding-right:0;margin-left:auto;margin-right:auto;display:block}div.emscripten{text-align:center}div.emscripten_border{border:1px solid #000}canvas.emscripten{border:0 none;background-color:#000}#emscripten_logo{display:inline-block;margin:0}.spinner{height:30px;width:30px;margin:0;margin-top:20px;margin-left:20px;display:inline-block;vertical-align:top;-webkit-animation:rotation .8s linear infinite;-moz-animation:rotation .8s linear infinite;-o-animation:rotation .8s linear infinite;animation:rotation .8s linear infinite;border-left:5px solid #ebebeb;border-right:5px solid #ebebeb;border-bottom:5px solid #ebebeb;border-top:5px solid #787878;border-radius:100%;background-color:#bdd72e}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@-moz-keyframes rotation{from{-moz-transform:rotate(0)}to{-moz-transform:rotate(360deg)}}@-o-keyframes rotation{from{-o-transform:rotate(0)}to{-o-transform:rotate(360deg)}}@keyframes rotation{from{transform:rotate(0)}to{transform:rotate(360deg)}}#status{display:inline-block;vertical-align:top;margin-top:30px;margin-left:20px;font-weight:700;color:#787878}#progress{height:20px;width:300px}#controls{display:inline-block;float:right;vertical-align:top;margin-top:30px;margin-right:20px}#output{width:100%;height:200px;margin:0 auto;margin-top:10px;border-left:0;border-right:0;padding-left:0;padding-right:0;display:block;background-color:#000;color:#fff;font-family:'Lucida Console',Monaco,monospace;outline:0}</style><script src=jquery-3.4.1.min.js></script><script src=LoadSave.js></script><script src=LZWEncoder.js></script><script src=NeuQuant.js></script><script src=GIFEncoder.js></script><script src=b64.js></script><script src=doubleRayControls.js></script><script>var encoder,context;function onLoadSetupGif(){var e=document.getElementById("canvas");context=e.getContext("2d"),(encoder=new GIFEncoder).setRepeat(0),encoder.setDelay(100),encoder.start()}function saveGifFrame(){encoder.addFrame(context)}function downloadGif(){encoder.finish(),encoder.download("download.gif")}</script><script>var doPublicRender=!1;doPublicRender&&$(document).ready(()=>{["setupEngineButton","coutButton","coutDualButton","dumpPolyButton"].forEach((function(o){$("#"+o).remove()}))})</script><script>["keydown","keyup","keypress","blur","visibilitychange"].forEach((function(e){document.addEventListener(e,(function(e){e.stopImmediatePropagation()}))}));var requestedX=400,requestedY=400;function onLoadHookClick(){["mousedown"].forEach((function(e){Module.canvas.addEventListener(e,(function(e){let n=getEventLocation(this,e);const t=n.y,o=n.x;jsPrint("x: "+o+" y: "+(requestedY-t))}),!0)}))}</script><script>function onLoadRender(){setTimeout(()=>{setupEngineClick(),setPrintRenderTime(!0),setPrintRotCamera(!0),parseAndRender()},200)}window.onload=()=>{onLoadSetupGif(),onLoadRender(),onLoadHookClick()}</script></head><body><script>function downloadPng(n){var e=document.getElementById("canvas").toDataURL("image/png"),t=window.open("about:blank");let i=new Image;i.src=e,setTimeout((function(){t.document.write(i.outerHTML)}),0)}var simpleRotZRunning=!1;function simpleRotZClick(){if(!simpleRotZRunning)return setupOrbit(30),simpleRotZRunning=!0,nextOrbitRender(!1),void nextOrbitRender(!0);nextOrbitRender(!0),dumpCamera()}</script><table><td valign=top><input onclick=setupEngineClick() type=button value="Setup Engine"id=setupEngineButton><br><input onclick=doRenderOfficial() type=button value="Render Official"id=renderOfficialButton><br><br><br><input onclick=nextRainbowClick() type=button value="Next Rainbow"id=nextRainbowButton><br><input onclick=coutIntClick() type=button value="Cout from C++"id=coutButton><br><input onclick=coutIntDualClick() type=button value="Cout from C++ dual"id=coutDualButton><br><input onclick=dumpPoly(0) type=button value="Dump Poly 0"id=dumpPolyButton><br><input onclick=saveGifFrame() type=button value="Safe Gif Frame"id=saveGifFrameButton><br><input onclick=downloadGif() type=button value="Download Gif"id=downloadGifButton><br><input onclick=simpleRotZClick() type=button value="Rotate Camera (z)"id=rotateCameraButton><br><input onclick=downloadPng() type=button value="Download PNG"id=downloadPngButton><br><a href=https://github.com/esromneb/DoubleRay>Github Page</a></td><td><textarea id=jsonscene rows=13 cols=50>
{
"camera": {
"loc": [5, 0, 0],
"dir": [-1, 0, 0],
"rot": [0, 0, 1],
"depth": 6
},
"global": {
"color": [0.2, 0.2, 0.2],
"c": 10,
"scale":166.6666666
},
"spheres": [{
"rad": 1,
"loc": [-1, 0, 0],
"ambient": 0.0,
"specular": 1.46,
"reflected": 1,
"transmitted": 1.0,
"diffuse": [0.0, 0.0, 0.0],
"n": 32,
"refraction":1.4
},
{
"rad": 1.0,
"loc": [-4, -1.1, 0],
"ambient": 0.1,
"specular": 1.46,
"reflected": 0,
"transmitted": 0.0,
"diffuse": [0.8, 0.0, 0.8],
"n": 32
},
{
"rad": 10,
"loc": [-4, 0, -11],
"ambient": 0.4,
"specular": 0,
"reflected": 1,
"transmitted": 0.0,
"diffuse": [0.4, 0.4, 0.4],
"n": 1
}
],
"lights": [{
"dir": [-0.4, 0, -1],
"color": [20, 20, 20]
}
]
}
</textarea><br><select id=loadScenesSel></select></td><td>Save or Load a scene (via a cookie). There is only 1 save slot.<br><input onclick='globalSave("default")'type=button value="Save Scene"><br><input onclick='globalLoad("default"),parseAndRender()'type=button value="Load Scene"><br></td></table><script>var $sel=$("#loadScenesSel");const ss=["<Choose A Scene>","color_balls_refraction_1.json","color_balls_refraction_2.json","color_balls_refraction.json","cool_reflection_1.json","false_color_reflection_1.json","floating_spheres_1.json","global_scale_1.json","glowing_bomb.json","hit_order_1.json","orientation_1.json","refraction_1.json","refraction_2.json","refraction_9.json","refraction_shadow_1.json","refraction_shadow_3.json","refraction_shadow_4.json","soap_bubble_1.json","test_shadow_1.json","test_shadow_2.json","test_shadow_3.json","three_color_balls.json","three_color_balls_yellow.json"];ss.forEach((function(o){$sel.append($("<option />").val("scenes/"+o).text(o))})),$sel.change((function(o){const s=$(this).val();"scenes/<Choose A Scene>"!==s&&$.ajax({url:s,dataType:"text",context:{}}).done((function(o){$("#jsonscene").val(o),parseAndRender()}))}))</script><script>var parseInJavascript=!1;function parseAndRender(){simpleRotZRunning=!1;const e=$("#jsonscene").val();parseInJavascript?doJsonParse(e):(parseJsonScene(e,!0,!0,0),determineCanvas(e))}function determineCanvas(e){let n;try{n=JSON.parse(e)}catch(e){return}if(n.global){const e=n.global;void 0!==e.x&&void 0!==e.y?(requestedX=e.x,requestedY=e.y):(requestedX=400,requestedY=400)}}function doJsonParse(e){let n;try{n=JSON.parse(e)}catch(e){return jsPrint("ERROR: illegal json"),void jsPrint(e.toString())}doubleRayExampleDoJsonCalls(n)}let changeTimer=null;const jsonChangeTimeout=333;$(document).ready(()=>{$("#jsonscene").bind("input propertychange",()=>{null!==changeTimer&&clearTimeout(changeTimer),changeTimer=setTimeout(parseAndRender,333)})})</script><script>function getElementPosition(e){var t=0,n=0;if(e.offsetParent){do{t+=e.offsetLeft,n+=e.offsetTop}while(e=e.offsetParent);return{x:t,y:n}}}function getEventLocation(e,t){var n=getElementPosition(e);return{x:t.pageX-n.x,y:t.pageY-n.y}}</script><div class=spinner id=spinner></div><div class=emscripten id=status>Downloading...</div><div class=emscripten><progress hidden id=progress max=100 value=0></progress></div><div class=emscripten_border><canvas class=emscripten id=canvas oncontextmenu=event.preventDefault() tabindex=-1></canvas></div><textarea id=output rows=8></textarea><script src=doubleRayInstantiate.js></script><script>function myGotB64(t,o){jsPrint(t),jsPrint(""),jsPrint("above from tag "+o)}doubleRaySetB64Callback(myGotB64)</script><script>var ASSERTIONS=0,dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(e){return String.prototype.startsWith?e.startsWith(dataURIPrefix):0===e.indexOf(dataURIPrefix)}var decodeBase64="function"==typeof atob?atob:function(e){var n,t,r,a,o,i,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c="",f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{n=u.indexOf(e.charAt(f++))<<2|(a=u.indexOf(e.charAt(f++)))>>4,t=(15&a)<<4|(o=u.indexOf(e.charAt(f++)))>>2,r=(3&o)<<6|(i=u.indexOf(e.charAt(f++))),c+=String.fromCharCode(n),64!==o&&(c+=String.fromCharCode(t)),64!==i&&(c+=String.fromCharCode(r))}while(f<e.length);return c};function intArrayFromBase64(e){if("boolean"==typeof ENVIRONMENT_IS_NODE&&ENVIRONMENT_IS_NODE){var n;try{n=Buffer.from(e,"base64")}catch(t){n=new Buffer(e,"base64")}return new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}try{for(var t=decodeBase64(e),r=new Uint8Array(t.length),a=0;a<t.length;++a)r[a]=t.charCodeAt(a);return r}catch(e){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(e){if(isDataURI(e))return intArrayFromBase64(e.slice(dataURIPrefix.length))}function intArrayFromString(e,n,t){var r=t>0?t:lengthBytesUTF8(e)+1,a=new Array(r),o=stringToUTF8Array(e,a,0,a.length);return n&&(a.length=o),a}function intArrayToString(e){for(var n=[],t=0;t<e.length;t++){var r=e[t];r>255&&(ASSERTIONS&&assert(!1,"Character code "+r+" ("+String.fromCharCode(r)+") at offset "+t+" not in 0x00-0xFF."),r&=255),n.push(String.fromCharCode(r))}return n.join("")}var filename="ray.js";if((","+window.location.search.substr(1)+",").indexOf(",noProxy,")<0){function assert(e){if(!e)throw"failed assert"}function WebGLClient(){var e={},n=null,t=null,r=0,a=!1,o=null;function i(e){n[e](t[r]),r++}function u(e){n[e](t[r],t[r+1]),r+=2}function c(e){n[e](t[r],t[r+1],t[r+2]),r+=3}function f(e){n[e](t[r],t[r+1],t[r+2],t[r+3]),r+=4}function s(e){n[e](t[r],t[r+1],t[r+2],t[r+3],t[r+4],t[r+5],t[r+6],t[r+7],t[r+8]),r+=9}function d(a){n[a](e[t[r]]),r++}function m(a){n[a](t[r],t[r+1]?e[t[r+1]]:null),r+=2}function l(a){n[a](e[t[r]],t[r+1],t[r+2]),r+=3}function g(a){var o=n[a](),i=t[r++];e[i]=o}function h(a){var o=t[r++],i=e[o];e[o]=null,n[a](i)}var b={0:{name:"NULL",func:function(e){n[e]()}},1:{name:"getExtension",func:i},2:{name:"enable",func:function(){n.enable(t[r++])}},3:{name:"disable",func:function(){n.disable(t[r++])}},4:{name:"clear",func:i},5:{name:"clearColor",func:f},6:{name:"createShader",func:function(a){var o=n[a](t[r++]),i=t[r++];e[i]=o}},7:{name:"deleteShader",func:h},8:{name:"shaderSource",func:function(a){n[a](e[t[r]],t[r+1]),r+=2}},9:{name:"compileShader",func:d},10:{name:"createProgram",func:g},11:{name:"deleteProgram",func:h},12:{name:"attachShader",func:function(a){n[a](e[t[r]],e[t[r+1]]),r+=2}},13:{name:"bindAttribLocation",func:l},14:{name:"linkProgram",func:d},15:{name:"getProgramParameter",func:function(){assert(n.getProgramParameter(e[t[r++]],t[r++]),"we cannot handle errors, we are async proxied WebGL")}},16:{name:"getUniformLocation",func:function(a){var o=n[a](e[t[r++]],t[r++]),i=t[r++];e[i]=o}},17:{name:"useProgram",func:d},18:{name:"uniform1i",func:function(){n.uniform1i(e[t[r]],t[r+1]),r+=2}},19:{name:"uniform1f",func:function(){n.uniform1f(e[t[r]],t[r+1]),r+=2}},20:{name:"uniform3fv",func:function(){n.uniform3fv(e[t[r]],t[r+1]),r+=2}},21:{name:"uniform4fv",func:function(){n.uniform4fv(e[t[r]],t[r+1]),r+=2}},22:{name:"uniformMatrix4fv",func:l},23:{name:"vertexAttrib4fv",func:u},24:{name:"createBuffer",func:g},25:{name:"deleteBuffer",func:h},26:{name:"bindBuffer",func:m},27:{name:"bufferData",func:c},28:{name:"bufferSubData",func:c},29:{name:"viewport",func:f},30:{name:"vertexAttribPointer",func:function(){n.vertexAttribPointer(t[r],t[r+1],t[r+2],t[r+3],t[r+4],t[r+5]),r+=6}},31:{name:"enableVertexAttribArray",func:function(){n.enableVertexAttribArray(t[r++])}},32:{name:"disableVertexAttribArray",func:function(){n.disableVertexAttribArray(t[r++])}},33:{name:"drawArrays",func:function(e){a&&null===o||n.drawArrays(t[r],t[r+1],t[r+2]),r+=3}},34:{name:"drawElements",func:function(e){a&&null===o||n.drawElements(t[r],t[r+1],t[r+2],t[r+3]),r+=4}},35:{name:"getError",func:function(){assert(n.getError()===n.NO_ERROR,"we cannot handle errors, we are async proxied WebGL")}},36:{name:"createTexture",func:g},37:{name:"deleteTexture",func:h},38:{name:"bindTexture",func:m},39:{name:"texParameteri",func:c},40:{name:"texImage2D",func:s},41:{name:"compressedTexImage2D",func:function(e){n[e](t[r],t[r+1],t[r+2],t[r+3],t[r+4],t[r+5],t[r+6]),r+=7}},42:{name:"activeTexture",func:function(){n.activeTexture(t[r++])}},43:{name:"getShaderParameter",func:function(){assert(n.getShaderParameter(e[t[r++]],t[r++]),"we cannot handle errors, we are async proxied WebGL")}},44:{name:"clearDepth",func:i},45:{name:"depthFunc",func:i},46:{name:"frontFace",func:i},47:{name:"cullFace",func:i},48:{name:"pixelStorei",func:u},49:{name:"depthMask",func:i},50:{name:"depthRange",func:u},51:{name:"blendFunc",func:u},52:{name:"scissor",func:f},53:{name:"colorMask",func:f},54:{name:"lineWidth",func:i},55:{name:"createFramebuffer",func:g},56:{name:"deleteFramebuffer",func:h},57:{name:"bindFramebuffer",func:function(){o=t[r+1]?e[t[r+1]]:null,n.bindFramebuffer(t[r],o),r+=2}},58:{name:"framebufferTexture2D",func:function(a){n[a](t[r],t[r+1],t[r+2],t[r+3]?e[t[r+3]]:null,t[r+4]),r+=5}},59:{name:"createRenderbuffer",func:g},60:{name:"deleteRenderbuffer",func:h},61:{name:"bindRenderbuffer",func:m},62:{name:"renderbufferStorage",func:f},63:{name:"framebufferRenderbuffer",func:function(a){n[a](t[r],t[r+1],t[r+2],t[r+3]?e[t[r+3]]:null),r+=4}},64:{name:"debugPrint",func:i},65:{name:"hint",func:u},66:{name:"blendEquation",func:i},67:{name:"generateMipmap",func:i},68:{name:"uniformMatrix3fv",func:l},69:{name:"stencilMask",func:i},70:{name:"clearStencil",func:i},71:{name:"texSubImage2D",func:s},72:{name:"uniform3f",func:function(){n.uniform3f(e[t[r]],t[r+1],t[r+2],t[r+3]),r+=4}},73:{name:"blendFuncSeparate",func:f},74:{name:"uniform2fv",func:function(){n.uniform2fv(e[t[r]],t[r+1]),r+=2}},75:{name:"texParameterf",func:c},76:{name:"isContextLost",func:function(){assert(!n.isContextLost(),"context lost which we cannot handle, we are async proxied WebGL")}},77:{name:"blendEquationSeparate",func:u},78:{name:"stencilFuncSeparate",func:f},79:{name:"stencilOpSeparate",func:f},80:{name:"drawBuffersWEBGL",func:i},81:{name:"uniform1iv",func:function(){n.uniform1iv(e[t[r]],t[r+1]),r+=2}},82:{name:"uniform1fv",func:function(){n.uniform1fv(e[t[r]],t[r+1]),r+=2}}};function w(e){n=Module.ctx,r=0;for(var a=(t=e).length;r<a;){var o=b[t[r++]],i=o.name;o.func(i),assert(r<=a)}}var E=[];function p(){a=!0;for(var e=0;e<E.length-1;e++)w(E[e]);a=!1,w(E[E.length-1]),E.length=0}this.onmessage=function(e){switch(e.op){case"render":0===E.length&&window.requestAnimationFrame(p),E.push(e.commandBuffer);break;default:throw"weird gl onmessage "+JSON.stringify(e)}}}function FPSTracker(e){var n=0,t=0,r=0;this.tick=function(){var a=Date.now();n>0&&(t=.99*t+.01*(a-n),60==r++&&(r=0,dump(e+" fps: "+(1e3/t).toFixed(2)+"\n")));n=a}}console.log("running code in a web worker"),WebGLClient.prefetch=function(){var e=document.createElement("canvas"),n=e.getContext("webgl-experimental")||e.getContext("webgl");if(n){var t={};["MAX_VERTEX_ATTRIBS","MAX_TEXTURE_IMAGE_UNITS","MAX_TEXTURE_SIZE","MAX_CUBE_MAP_TEXTURE_SIZE","MAX_VERTEX_UNIFORM_VECTORS","MAX_FRAGMENT_UNIFORM_VECTORS","MAX_VARYING_VECTORS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","VENDOR","RENDERER","VERSION","SHADING_LANGUAGE_VERSION","COMPRESSED_TEXTURE_FORMATS","RED_BITS","GREEN_BITS","BLUE_BITS","ALPHA_BITS","DEPTH_BITS","STENCIL_BITS","MAX_RENDERBUFFER_SIZE"].forEach((function(e){var r=n[e];t[r]=n.getParameter(r)})),[{extName:"EXT_texture_filter_anisotropic",paramName:"MAX_TEXTURE_MAX_ANISOTROPY_EXT"},{extName:"WEBGL_draw_buffers",paramName:"MAX_COLOR_ATTACHMENTS_WEBGL"}].forEach((function(e){var r=n.getExtension(e.extName);if(r){var a=r[e.paramName];t[a]=n.getParameter(a)}}));var r={};["FRAGMENT_SHADER","VERTEX_SHADER"].forEach((function(e){e=n[e],r[e]={},["LOW_FLOAT","MEDIUM_FLOAT","HIGH_FLOAT","LOW_INT","MEDIUM_INT","HIGH_INT"].forEach((function(t){t=n[t];var a=n.getShaderPrecisionFormat(e,t);r[e][t]=a?{rangeMin:a.rangeMin,rangeMax:a.rangeMax,precision:a.precision}:a}))})),worker.postMessage({target:"gl",op:"setPrefetched",parameters:t,extensions:n.getSupportedExtensions(),precisions:r,preMain:!0})}else worker.postMessage({target:"gl",op:"setPrefetched",preMain:!0})},"undefined"==typeof Module&&(console.warn("no Module object defined - cannot proxy canvas rendering and input events, etc."),Module={print:function(e){console.log(e)},printErr:function(e){console.log(e)},canvas:{addEventListener:function(){},getBoundingClientRect:function(){return{bottom:0,height:0,left:0,right:0,top:0,width:0}}}});var renderFrameData=null;function renderFrame(){var e=Module.canvasData.data;if(e.set)e.set(renderFrameData);else for(var n=0;n<renderFrameData.length;n++)e[n]=renderFrameData[n];Module.ctx.putImageData(Module.canvasData,0,0),renderFrameData=null}window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||renderFrame;var SUPPORT_BASE64_EMBEDDING,IDBStore={indexedDB:function(){if("undefined"!=typeof indexedDB)return indexedDB;var e=null;return"object"==typeof window&&(e=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB),assert(e,"IDBStore used, but indexedDB not supported"),e},DB_VERSION:22,DB_STORE_NAME:"FILE_DATA",dbs:{},blobs:[0],getDB:function(e,n){var t,r=IDBStore.dbs[e];if(r)return n(null,r);try{t=IDBStore.indexedDB().open(e,IDBStore.DB_VERSION)}catch(e){return n(e)}t.onupgradeneeded=function(e){var n=e.target.result,t=e.target.transaction;n.objectStoreNames.contains(IDBStore.DB_STORE_NAME)?t.objectStore(IDBStore.DB_STORE_NAME):n.createObjectStore(IDBStore.DB_STORE_NAME)},t.onsuccess=function(){r=t.result,IDBStore.dbs[e]=r,n(null,r)},t.onerror=function(e){n(this.error),e.preventDefault()}},getStore:function(e,n,t){IDBStore.getDB(e,(function(e,r){if(e)return t(e);var a=r.transaction([IDBStore.DB_STORE_NAME],n);a.onerror=function(e){t(this.error||"unknown error"),e.preventDefault()};var o=a.objectStore(IDBStore.DB_STORE_NAME);t(null,o)}))},getFile:function(e,n,t){IDBStore.getStore(e,"readonly",(function(e,r){if(e)return t(e);var a=r.get(n);a.onsuccess=function(e){var r=e.target.result;return r?t(null,r):t("file "+n+" not found")},a.onerror=function(e){t(e)}}))},setFile:function(e,n,t,r){IDBStore.getStore(e,"readwrite",(function(e,a){if(e)return r(e);var o=a.put(t,n);o.onsuccess=function(e){r()},o.onerror=function(e){r(e)}}))},deleteFile:function(e,n,t){IDBStore.getStore(e,"readwrite",(function(e,r){if(e)return t(e);var a=r.delete(n);a.onsuccess=function(e){t()},a.onerror=function(e){t(e)}}))},existsFile:function(e,n,t){IDBStore.getStore(e,"readonly",(function(e,r){if(e)return t(e);var a=r.count(n);a.onsuccess=function(e){t(null,e.target.result>0)},a.onerror=function(e){t(e)}}))}},frameId=0;filename||(filename="ray.js");var workerURL=filename;if(SUPPORT_BASE64_EMBEDDING)(fileBytes=tryParseAsDataURI(filename))&&(workerURL=URL.createObjectURL(new Blob([fileBytes],{type:"application/javascript"})));var worker=new Worker(workerURL);WebGLClient.prefetch(),setTimeout((function(){worker.postMessage({target:"worker-init",width:Module.canvas.width,height:Module.canvas.height,boundingClientRect:cloneObject(Module.canvas.getBoundingClientRect()),URL:document.URL,currentScriptUrl:filename,preMain:!0})}),0);var workerResponded=!1;function postCustomMessage(e,n){n=n||{},worker.postMessage({target:"custom",userData:e,preMain:n.preMain})}function cloneObject(e){var n={};for(var t in e)if(t!=t.toUpperCase()){var r=e[t];"number"!=typeof r&&"string"!=typeof r||(n[t]=r)}return n}function shouldPreventDefault(e){return"keydown"!==e.type||8===e.keyCode||9===e.keyCode}worker.onmessage=function(e){workerResponded||(workerResponded=!0,Module.setStatus&&Module.setStatus(""),SUPPORT_BASE64_EMBEDDING&&workerURL!==filename&&URL.revokeObjectURL(workerURL));var n=e.data;switch(n.target){case"stdout":Module.print(n.content);break;case"stderr":Module.printErr(n.content);break;case"window":window[n.method]();break;case"canvas":switch(n.op){case"getContext":Module.ctx=Module.canvas.getContext(n.type,n.attributes),"2d"!==n.type&&(Module.glClient=new WebGLClient);break;case"resize":Module.canvas.width=n.width,Module.canvas.height=n.height,Module.ctx&&Module.ctx.getImageData&&(Module.canvasData=Module.ctx.getImageData(0,0,n.width,n.height)),worker.postMessage({target:"canvas",boundingClientRect:cloneObject(Module.canvas.getBoundingClientRect())});break;case"render":renderFrameData?renderFrameData=n.image.data:(renderFrameData=n.image.data,window.requestAnimationFrame(renderFrame));break;case"setObjectProperty":Module.canvas[n.object][n.property]=n.value;break;default:throw"eh?"}break;case"gl":Module.glClient.onmessage(n);break;case"tick":frameId=n.id,worker.postMessage({target:"tock",id:frameId});break;case"Image":assert("src"===n.method);var t=new Image;t.onload=function(){assert(t.complete);var e=document.createElement("canvas");e.width=t.width,e.height=t.height;var r=e.getContext("2d");r.drawImage(t,0,0);var a=r.getImageData(0,0,t.width,t.height);worker.postMessage({target:"Image",method:"onload",id:n.id,width:t.width,height:t.height,data:a.data,preMain:!0})},t.onerror=function(){worker.postMessage({target:"Image",method:"onerror",id:n.id,preMain:!0})},t.src=n.src;break;case"IDBStore":switch(n.method){case"loadBlob":IDBStore.getFile(n.db,n.id,(function(e,n){worker.postMessage({target:"IDBStore",method:"response",blob:e?null:n})}));break;case"storeBlob":IDBStore.setFile(n.db,n.id,n.blob,(function(e){worker.postMessage({target:"IDBStore",method:"response",error:!!e})}))}break;case"custom":if(!Module.onCustomMessage)throw"Custom message received but client Module.onCustomMessage not implemented.";Module.onCustomMessage(e);break;case"setimmediate":worker.postMessage({target:"setimmediate"});break;default:throw"what? "+n.target}},["keydown","keyup","keypress","blur","visibilitychange"].forEach((function(e){document.addEventListener(e,(function(e){worker.postMessage({target:"document",event:cloneObject(e)}),shouldPreventDefault(e)&&e.preventDefault()}))})),["unload"].forEach((function(e){window.addEventListener(e,(function(e){worker.postMessage({target:"window",event:cloneObject(e)})}))})),["mousedown","mouseup","mousemove","DOMMouseScroll","mousewheel","mouseout"].forEach((function(e){Module.canvas.addEventListener(e,(function(e){worker.postMessage({target:"canvas",event:cloneObject(e)}),e.preventDefault()}),!0)}))}else{console.log("running code on the main thread");var fileBytes=tryParseAsDataURI(filename),script=document.createElement("script");fileBytes?script.innerHTML=intArrayToString(fileBytes):script.src=filename,document.body.appendChild(script)}</script></body></html>