{ "version": 3, "sources": ["../node_modules/@mwcz/pbp-loading/dist/pbp-loading.js", "../rtw-timer.js", "../caniuse-module-worker.js", "../rtw-render.js"], "sourcesContent": ["var a=class extends HTMLElement{constructor(){super();this.attachShadow({mode:\"open\"})}play(){this.style.setProperty(\"--play-state\",\"running\")}pause(){this.style.setProperty(\"--play-state\",\"paused\")}connectedCallback(){let n=this.hasAttribute(\"paused\"),t=+this.getAttribute(\"box-count\")||4,e=+this.getAttribute(\"duration\")||Math.sqrt(t/4),s=new Array(t).fill(),o=e/(t*.7),i=100*o,p=`\n content: \"\";\n position: absolute;\n display: block;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n border: var(--pbp-loading-border, 1px solid white);\n border-width: $WIDTH;\n animation: $DIM ${e}s backwards alternate infinite;\n animation-delay: var(--delay);\n animation-play-state: var(--play-state);\n `;this.shadowRoot.innerHTML=`\n \n
\n ${s.map((d,r)=>``).join(\"\")}\n
\n `}};customElements.define(\"pbp-loading\",a);export{a as default};\n", "import \"@mwcz/pbp-loading\";\n\nexport default class Timer extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n\n this.active = false;\n this.paused = false;\n\n this.step = this.step.bind(this);\n }\n\n connectedCallback() {\n this.shadowRoot.innerHTML = `\n \n \n `;\n\n this.labelText = this.shadowRoot.querySelector(\"#label-text\");\n this.loading = this.shadowRoot.querySelector(\"pbp-loading\");\n }\n\n resetSpinner() {\n this.loading.style.removeProperty(\"--play-state\");\n this.labelText.parentNode.removeChild(this.loading);\n this.labelText.parentNode.insertBefore(this.loading, this.labelText);\n }\n\n start() {\n if (!this.paused) {\n this.startTime = performance.now();\n } else {\n this.paused = false;\n }\n this.active = true;\n this.loading.play();\n requestAnimationFrame(this.step);\n }\n\n pause() {\n this.paused = true;\n this.loading.pause();\n }\n\n step() {\n if (this.active && !this.paused) {\n this.duration = performance.now() - this.startTime;\n this._updateLabel(this.duration);\n requestAnimationFrame(this.step);\n }\n }\n\n _updateLabel(duration) {\n this.setLabel(`${duration.toFixed(1)}ms`);\n }\n\n stop() {\n this.resetSpinner();\n this.active = false;\n }\n\n setLabel(msg) {\n this.labelText.innerText = msg;\n }\n}\ncustomElements.define(\"rtw-timer\", Timer);\n", "export default function supportsModuleWorkers() {\n let supportsModuleWorker = false;\n const workerURL = URL.createObjectURL(new Blob([\"\"]));\n const options = {\n get type() {\n supportsModuleWorker = true;\n },\n };\n new Worker(workerURL, options).terminate();\n URL.revokeObjectURL(workerURL);\n return supportsModuleWorker;\n}\n", "import \"./rtw-timer.js\";\nimport supportsModuleWorkers from \"./caniuse-module-worker.js\";\n\nexport default class RtwRender extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n fetch(`${import.meta.url}/../wasm_bg.wasm`);\n this.shadowRoot.innerHTML = `\n \n\n \n
\n \n \n
\n

Total rays = \u2754\nTotal duration = \u2754\nTime per ray = \u2754\nRay rate = \u2754\nImage width = \u2754\nImage height = \u2754\nSamples per pixel = \u2754

\n `;\n }\n\n async connectedCallback() {\n this.btn = this.shadowRoot.querySelector(\"button\");\n this.canvas = this.shadowRoot.querySelector(\"canvas\");\n this.timer = this.shadowRoot.querySelector(\"rtw-timer\");\n this.log = this.shadowRoot.querySelector(\".log\");\n\n this.ctx = this.canvas.getContext(\"2d\");\n\n if (supportsModuleWorkers()) {\n console.log(\"module workers supported, creating worker\");\n this.worker = this.createWorker();\n } else {\n console.log(\n \"module workers NOT supported, will render on the main thread\"\n );\n await this.initMainThreadRendering();\n }\n\n this.wasmInit = null;\n this.wasmRender = null;\n\n this.btn.addEventListener(\"click\", async () => {\n await this.preRender();\n this.render();\n });\n }\n\n createWorker() {\n const workerUrl = new URL(`${import.meta.url}/../wasm-worker.js`);\n const worker = new Worker(workerUrl.href, { type: \"module\" });\n worker.addEventListener(\"message\", async (e) => {\n if (e.data.status === \"success\") {\n if (e.data.data.renderResult) {\n this.postRender(e.data.data.renderResult);\n } else if (e.data.data.initialized) {\n this.btn.disabled = false;\n }\n } else if (e.data.status === \"error\") {\n if (e.data.data.type === \"render\") {\n this.timer.pause();\n this.log.textContent =\n \"Error occurred in worker during rendering.\";\n }\n }\n });\n\n worker.postMessage(\"init\");\n return worker;\n }\n\n async initMainThreadRendering() {\n // initialize wasm\n const wasmModule = await import(\"./wasm-render.js\");\n this.wasmInit = wasmModule.wasmInit;\n this.wasmRender = wasmModule.wasmRender;\n await this.wasmInit();\n\n this.btn.disabled = false;\n\n this.log.textContent = `Rendering will run on the main thread\nbecause Module Workers are not supported\nin this browser. Expect lock-up during\nrendering.`;\n }\n\n /**\n * Begin the rendering, including starting a timer widget, starting render\n * within the wasm module, and writing the render result into the canvas.\n */\n async preRender() {\n // clearImage();\n this.timer.start();\n\n // if running on the main thread, pause the timer, we'll update it once at the end.\n if (!supportsModuleWorkers()) {\n // this.timer.pause();\n }\n this.btn.disabled = true;\n }\n\n async render() {\n if (supportsModuleWorkers()) {\n console.log(\"starting render in a module worker\");\n this.worker.postMessage(\"render\");\n } else {\n console.log(\"starting render on the main thread\");\n if (!this.wasmInit) {\n await this.initMainThreadRendering();\n }\n const imageData = await this.wasmRender();\n this.postRender(imageData);\n }\n }\n\n writeStats(renderResult) {\n const total_rays = Number(renderResult.total_rays);\n this.log.textContent = `Total rays = ${total_rays.toLocaleString(\n \"en-US\"\n )}\nTotal duration = ${this.timer.duration.toFixed(1)} ms\nTime per ray = ${((this.timer.duration / total_rays) * 1000).toFixed(\n 4\n )} microseconds/ray\nRay rate = ${(total_rays / this.timer.duration / 1000).toFixed(\n 4\n )} rays/microsecond\nImage width = ${renderResult.width}\nImage height = ${renderResult.height}\nSamples per pixel = ${renderResult.samples_per_pixel}`;\n }\n\n postRender(renderResult) {\n console.time(\"drawing canvas\");\n this.canvas.width = renderResult.width;\n this.canvas.height = renderResult.height;\n this.ctx.putImageData(\n new ImageData(renderResult.pixels, renderResult.width),\n 0,\n 0\n );\n console.timeEnd(\"drawing canvas\");\n this.timer.step();\n this.timer.stop();\n\n this.writeStats(renderResult);\n\n this.btn.innerText = \"Re-render\";\n this.btn.disabled = false;\n }\n}\n\ncustomElements.define(\"rtw-render\", RtwRender);\n"], "mappings": "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", "names": [] }