@meimu/mutracer 0.1.0 → 0.1.2

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.
Files changed (88) hide show
  1. package/README.md +61 -16
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +668 -658
  4. package/docs/materials.md +27 -7
  5. package/docs/progressive-rendering.md +24 -8
  6. package/docs/threejs.md +15 -3
  7. package/docs/viewer.md +53 -0
  8. package/lib/Display.d.ts +1 -1
  9. package/lib/Display.js +4 -2
  10. package/lib/Display.js.map +1 -1
  11. package/lib/Render.d.ts +9 -0
  12. package/lib/Render.js +84 -13
  13. package/lib/Render.js.map +1 -1
  14. package/lib/RenderLoop.d.ts +5 -2
  15. package/lib/RenderLoop.js +47 -15
  16. package/lib/RenderLoop.js.map +1 -1
  17. package/lib/oidn.d.ts +1 -1
  18. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  19. package/lib/renderer/MaterialTable.d.ts +1 -0
  20. package/lib/renderer/MaterialTable.js +2 -1
  21. package/lib/renderer/MaterialTable.js.map +1 -1
  22. package/lib/renderer/WGPUBloomPass.js +8 -8
  23. package/lib/renderer/WGPUJNLMDenoiser.js +2 -2
  24. package/lib/renderer/WGPURayTraceOutput.js +5 -5
  25. package/lib/renderer/WGPURayTracePass.js +1 -1
  26. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  27. package/lib/renderer/WGPURenderingPipeline.js +8 -6
  28. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  29. package/lib/renderer/WebGLJNLMDenoiser.js +2 -2
  30. package/lib/renderer/WebGLRayTracePass.js +3 -1
  31. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  32. package/lib/renderer/committedScene.js +11 -6
  33. package/lib/renderer/committedScene.js.map +1 -1
  34. package/lib/renderer/glsl/chunks/envMap.glsl.js +5 -5
  35. package/lib/renderer/glsl/chunks/intersect.glsl.js +32 -32
  36. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +9 -9
  37. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +30 -30
  38. package/lib/renderer/glsl/chunks/rand.glsl.js +2 -2
  39. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +4 -4
  40. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +3 -3
  41. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +4 -4
  42. package/lib/renderer/glsl/chunks/sampling.glsl.js +3 -3
  43. package/lib/renderer/glsl/chunks/sobol.glsl.js +3 -3
  44. package/lib/renderer/glsl/rayTrace.frag.js +7 -3
  45. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  46. package/lib/renderer/glsl/webglPipeline.frag.js +2 -2
  47. package/lib/renderer/materialComparison.generated.js +5 -0
  48. package/lib/renderer/materialComparison.generated.js.map +1 -1
  49. package/lib/renderer/materialLayout.js +2 -1
  50. package/lib/renderer/materialLayout.js.map +1 -1
  51. package/lib/renderer/prepareMeshBVH.d.ts +4 -2
  52. package/lib/renderer/prepareMeshBVH.js +44 -20
  53. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  54. package/lib/renderer/util.d.ts +2 -2
  55. package/lib/renderer/util.js +3 -3
  56. package/lib/renderer/util.js.map +1 -1
  57. package/lib/renderer/wgsl/chunks/common.wgsl.js +2 -2
  58. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
  59. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +85 -88
  60. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  61. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +34 -34
  62. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  63. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +51 -46
  64. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  65. package/lib/renderer/wgsl/chunks/rand.wgsl.js +2 -2
  66. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +3 -3
  67. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +4 -4
  68. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +4 -4
  69. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +3 -3
  70. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +3 -3
  71. package/lib/renderer/wgsl/compose.frag.wgsl.js +2 -2
  72. package/lib/renderer/wgsl/customDenoise.wgsl.js +4 -4
  73. package/lib/renderer/wgsl/offlineAdaptive.compute.js +10 -10
  74. package/lib/renderer/wgsl/rayTrace.compute.js +13 -9
  75. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  76. package/lib/scene/OpenPBRMaterial.d.ts +4 -2
  77. package/lib/scene/OpenPBRMaterial.js +4 -2
  78. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  79. package/lib/scene/openPbrSchema.d.ts +7 -2
  80. package/lib/scene/openPbrSchema.js +2 -1
  81. package/lib/scene/openPbrSchema.js.map +1 -1
  82. package/lib/util/fromTHREE.d.ts +6 -0
  83. package/lib/util/fromTHREE.js +85 -19
  84. package/lib/util/fromTHREE.js.map +1 -1
  85. package/lib/version.d.ts +1 -1
  86. package/lib/version.js +1 -1
  87. package/lib/version.js.map +1 -1
  88. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RenderLoop.js","sourceRoot":"","sources":["../src/RenderLoop.ts"],"names":[],"mappings":"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","sourcesContent":["import {scheduleFrame} from './util/frame.js';\nimport type Engine from './Engine.js';\nimport type Display from './Display.js';\nimport Render, { type RenderOptions, type RenderStatus, type ConvergeOptions, type ConvergeResult, type SampleEvent } from './Render.js';\nimport type Sync from './Sync.js';\nimport { Events } from './util/events.js';\nimport { updateProgressiveState, loopImageState, type ProgressiveState } from './renderer/progressiveScheduler.js';\n\n/** Presentation state; preview images never count as final completion. */\nexport type RenderLoopStatus = RenderStatus | 'previewing';\nexport interface RenderLoopOptions {\n /** Presentation settings/canvas. Default engine.display. */ display?: Display;\n /** Preview render/settings, or false to disable. Default half resolution with adaptive scale .25–.5, 20 ms, 2 bounces, no bevel, 1 wavelength and 2 light candidates. */ preview?: Render | RenderOptions | false;\n /** Final render/settings. Default a new Render with preview as fallback. */ final?: Render | RenderOptions;\n /** External integrations, invoked in order. Default none. */ sync?: Sync | Sync[];\n /** Idle delay for consecutive edits without explicit sync activity. Default 150 ms. */ idleMs?: number;\n /** Hold preview inference before committing the latest camera/scene. Default false. */ coalesceSceneUpdates?: boolean;\n}\ninterface LoopEvents {\n status: {status: RenderLoopStatus; previous: RenderLoopStatus};\n sample: SampleEvent & {preview: false};\n}\n\n/** Built-in interactive policy implemented entirely through the first-layer API. */\nexport default class RenderLoop {\n readonly preview: Render | undefined;\n readonly final: Render;\n readonly display: Display;\n /** Selection policy. Default changing ? preview : final; absent previews select final. */\n select: (info: {changing: boolean}) => 'preview' | 'final' = ({changing}) => changing ? 'preview' : 'final';\n /** Heuristic idle delay. Default 150 ms. */ idleMs: number;\n /** Defer engine commits while preview inference is pending. Default false. */ coalesceSceneUpdates: boolean;\n private _changing = false;\n private _status: RenderLoopStatus = 'preparing';\n private _events = new Events<LoopEvents>();\n private _syncs = new Set<Sync>();\n private _owned = new Set<Render>();\n private _policy: ProgressiveState = {previousChanged: false, lastContinuousChange: -Infinity, changing: false};\n private _running = false;\n private _busy = false;\n private _disposed = false;\n private _cancelScheduled?: () => void;\n private _warnedTick = false;\n private _previewDenoising = false;\n private _finishedImage?: string;\n private _unsubscribe: () => void;\n constructor(readonly engine: Engine, options: RenderLoopOptions = {}) {\n // Validate foreign objects before allocating owned resources.\n const syncs = options.sync ? (Array.isArray(options.sync) ? options.sync : [options.sync]) : [];\n for (const sync of syncs) this._checkEngine(sync.engine);\n for (const render of [options.preview, options.final]) if (render instanceof Render) this._checkEngine(render.engine);\n this.display = options.display ?? engine.display;\n this.idleMs = options.idleMs ?? 150;\n this.coalesceSceneUpdates = options.coalesceSceneUpdates ?? false;\n try {\n if (options.preview !== false) this.preview = this._render(options.preview, {\n resolutionScale: .5, adaptiveResolution: {targetFrameMs: 20, minScale: .25},\n bounces: 2, bevel: false, dispersionWavelengths: 1, directLightCandidates: 2,\n });\n this.final = this._render(options.final, {fallback: this.preview ?? null});\n } catch (error) {for (const render of this._owned) render.dispose(); throw error;}\n for (const sync of syncs) this.addSync(sync);\n this._unsubscribe = this.final.on('sample', event => this._events.emit('sample', {...event, preview: false}));\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', this._visibility);\n }\n private _render(value: Render | RenderOptions | undefined, defaults: RenderOptions): Render {\n if (value instanceof Render) return value;\n const settings = {...defaults, ...value};\n if (value && 'width' in value) {\n if (!('resolutionScale' in value)) delete settings.resolutionScale;\n if (!('adaptiveResolution' in value)) delete settings.adaptiveResolution;\n }\n const render = new Render(this.engine, settings as RenderOptions); this._owned.add(render); return render;\n }\n private _checkEngine(engine: Engine): void { if (engine !== this.engine) throw new Error('RenderLoop renders and syncs must belong to the same engine.'); }\n private _assertAlive(): void { if (this._disposed) throw new Error('RenderLoop is disposed.'); }\n /** Whether an explicit integration or consecutive edits indicate motion. Default false. */ get changing(): boolean { return this._changing; }\n /** Complete final samples; preview sampling is excluded. Default 0. */ get samples(): number { return this.status === 'previewing' ? 0 : this.final.samples; }\n /** Current presented/execution state. Default preparing. */ get status(): RenderLoopStatus { return this._status; }\n /** Subscribes to status transitions or complete final samples; returns unsubscribe. */\n on<K extends keyof LoopEvents>(event: K, listener: (value: LoopEvents[K]) => void): () => void { return this._events.on(event, listener); }\n /** Adds an integration on this engine. Duplicate registrations are ignored. */\n addSync(sync: Sync): void { this._assertAlive(); this._checkEngine(sync.engine); this._syncs.add(sync); }\n /** Removes an integration without disposing it. */ removeSync(sync: Sync): void { this._syncs.delete(sync); }\n private _setStatus(status: RenderLoopStatus): RenderLoopStatus {\n if (status !== this._status) { const previous = this._status; this._status = status; this._events.emit('status', {status, previous}); }\n return status;\n }\n /** Executes one manual tick. Calls during start are ignored with one warning. */\n tick(): RenderLoopStatus {\n this._assertAlive();\n if (this._running) { if (!this._warnedTick) {this._warnedTick = true; console.warn('RenderLoop.tick() is ignored while start() is active.');} return this.status; }\n return this._tick();\n }\n private _tick(): RenderLoopStatus {\n if (this._busy || (typeof document !== 'undefined' && document.hidden)) return this.status;\n for (const sync of this._syncs) sync.update();\n const holding = this.coalesceSceneUpdates && !!this.preview?.denoising;\n // Present completed inference before a newer engine revision can invalidate it,\n // including synchronous filters which finish between animation frames.\n if (this.coalesceSceneUpdates && this._previewDenoising && !this.preview?.denoising && this.preview) this.display.present(this.preview);\n const changed = holding ? false : this.engine.update();\n const active = [...this._syncs].some(sync => sync.active);\n this._policy = updateProgressiveState(this._policy, changed, active, performance.now(), this.idleMs);\n this._changing = this._policy.changing;\n const selected = this.select({changing: this.changing});\n if (holding && this.preview) {\n const shown = this.display.present(this.preview); this._previewDenoising = true;\n return this._setStatus(shown ? 'previewing' : this.preview.status);\n }\n const current = selected === 'preview' && this.preview ? this.preview : this.final;\n const imageState = loopImageState(this.final, this.display);\n if (!changed && !this.changing && current === this.final && this.status === 'finished' && this.final.status === 'finished' && imageState === this._finishedImage) return this.status;\n // Invalidate a completed filter before refinement when display settings changed.\n if (this.status === 'finished' && imageState !== this._finishedImage && this.final.samples > 0) this.display.present(this.final);\n const status = current.refine();\n const shown = this.display.present(current);\n this._previewDenoising = !!this.preview?.denoising;\n const next = status === 'error' ? 'error' : shown === this.preview && shown ? 'previewing' : status;\n this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;\n return this._setStatus(next);\n }\n private _schedule(): void {\n if (!this._running || this._busy || this._cancelScheduled !== undefined || (typeof document !== 'undefined' && document.hidden)) return;\n this._cancelScheduled = scheduleFrame(() => { this._cancelScheduled = undefined; try {this._tick();} finally {this._schedule();} });\n }\n private _visibility = (): void => {\n if (document.hidden) this._cancelFrame(); else this._schedule();\n };\n private _cancelFrame(): void { this._cancelScheduled?.(); this._cancelScheduled = undefined; }\n /** Starts an idempotent loop; uses a 16 ms timer without rAF. Hidden pages pause automatically. */ start(): void { this._assertAlive(); this._running = true; this._schedule(); }\n /** Stops scheduling without discarding accumulated images. */ stop(): void { this._running = false; this._cancelFrame(); }\n /** Pauses ticks, converges final, presents it, and resumes a previously running loop. */\n async converge(options: ConvergeOptions): Promise<ConvergeResult> {\n this._assertAlive(); if (this._busy) throw new Error('RenderLoop convergence is already running.');\n this._busy = true; this._cancelFrame();\n try {\n for (const sync of this._syncs) sync.update(); this.engine.update();\n this._setStatus('preparing');\n const result = await this.final.converge({...options, onProgress: progress => {\n this._setStatus(progress.stage === 'denoising' ? 'denoising' : this.final.status);\n options.onProgress?.(progress);\n }});\n this.display.present(this.final); this._setStatus('finished'); return result;\n } catch (error) {this._setStatus('error'); throw error;}\n finally {this._busy = false; this._schedule();}\n }\n /** Stops the loop and releases renders it created. Supplied renders/syncs remain owned by the caller. */\n dispose(): void {\n if (this._disposed) return;\n this.stop(); this._disposed = true; this._unsubscribe(); this._events.clear(); this._syncs.clear();\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', this._visibility);\n for (const render of this._owned) render.dispose(); this._owned.clear();\n }\n}\n"]}
1
+ {"version":3,"file":"RenderLoop.js","sourceRoot":"","sources":["../src/RenderLoop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAG9C,OAAO,MAA8G,MAAM,aAAa,CAAC;AAEzI,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAyB,MAAM,oCAAoC,CAAC;AAiBnH,oFAAoF;AACpF,MAAM,CAAC,OAAO,OAAO,UAAU;IAwBR;IAvBZ,OAAO,CAAqB;IAC5B,KAAK,CAAS;IACd,OAAO,CAAU;IAC1B,0FAA0F;IAC1F,MAAM,GAAuD,CAAC,EAAC,QAAQ,EAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5G,4CAA4C,CAAC,MAAM,CAAS;IAC5D,8EAA8E,CAAC,oBAAoB,CAAU;IACrG,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,GAAqB,WAAW,CAAC;IACxC,OAAO,GAAG,IAAI,MAAM,EAAc,CAAC;IACnC,MAAM,GAAG,IAAI,GAAG,EAAQ,CAAC;IACzB,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3B,OAAO,GAAqB,EAAC,eAAe,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC;IACvG,QAAQ,GAAG,KAAK,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IACd,SAAS,GAAG,KAAK,CAAC;IAClB,gBAAgB,CAAc;IAC9B,WAAW,GAAG,KAAK,CAAC;IAC5B,8EAA8E;IACtE,kBAAkB,CAAU;IAC5B,UAAU,CAAU;IACpB,cAAc,CAAU;IACxB,YAAY,CAAa;IACjC,YAAqB,MAAc,EAAE,UAA6B,EAAE;QAA/C,WAAM,GAAN,MAAM,CAAQ;QACjC,8DAA8D;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,MAAM,YAAY,MAAM;gBAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;QACpC,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,KAAK,CAAC;QAClE,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;gBAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE;oBAC1E,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAC;oBAC9F,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC;iBAC7E,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAA,CAAC;QAClF,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAC,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;QAC9G,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACvG,CAAC;IACO,OAAO,CAAC,KAAyC,EAAE,QAAuB;QAChF,IAAI,KAAK,YAAY,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,QAAQ,GAAG,EAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAC,CAAC;QACzC,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC,eAAe,CAAC;YACnE,IAAI,CAAC,CAAC,oBAAoB,IAAI,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC,kBAAkB,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAyB,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC;IAC5G,CAAC;IACO,YAAY,CAAC,MAAc,IAAU,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC,CAAC;IACnJ,YAAY,KAAW,IAAI,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;IAChG,2FAA2F,CAAC,IAAI,QAAQ,KAAc,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9I,uEAAuE,CAAC,IAAI,OAAO,KAAa,OAAO,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/J,4DAA4D,CAAC,IAAI,MAAM,KAAuB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpH,uFAAuF;IACvF,EAAE,CAA6B,KAAQ,EAAE,QAAwC,IAAgB,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3I,+EAA+E;IAC/E,OAAO,CAAC,IAAU,IAAU,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzG,mDAAmD,CAAC,UAAU,CAAC,IAAU,IAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtG,UAAU,CAAC,MAAwB;QACzC,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,QAAQ,EAAC,CAAC,CAAC;QAAC,CAAC;QACvI,OAAO,MAAM,CAAC;IAChB,CAAC;IACO,QAAQ,CAAC,MAAc;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,KAAK;YAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,iFAAiF;IACjF,IAAI;QACF,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YAAA,CAAC;YAAC,OAAO,IAAI,CAAC,MAAM,CAAC;QAAC,CAAC;QACnK,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IACO,KAAK;QACX,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC3F,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACtC,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC;QAC7G,MAAM,OAAO,GAAG,cAAc,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7G,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,cAAc,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QAClD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC,CAAC;QACxD,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,yEAAyE;YACzE,8EAA8E;YAC9E,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBAAC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;oBAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBACjG,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YAClI,CAAC;YACD,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACnF,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,UAAU,KAAK,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACrL,iFAAiF;QACjF,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,UAAU,KAAK,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAChC,uEAAuE;QACvE,6EAA6E;QAC7E,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,YAAY,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnL,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1F,IAAI,iBAAiB;YAAE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;;YACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5B,4EAA4E;QAC5E,4EAA4E;QAC5E,MAAM,UAAU,GAAG,iBAAiB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;QAChJ,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/E,IAAI,CAAC,cAAc,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjG,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QACxI,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC;YAAA,IAAI,CAAC,KAAK,EAAE,CAAC;QAAA,CAAC;gBAAS,CAAC;YAAA,IAAI,CAAC,SAAS,EAAE,CAAC;QAAA,CAAC,CAAC,CAAC,CAAC,CAAC;IACtI,CAAC;IACO,WAAW,GAAG,GAAS,EAAE;QAC/B,IAAI,QAAQ,CAAC,MAAM;YAAE,IAAI,CAAC,YAAY,EAAE,CAAC;;YAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IAClE,CAAC,CAAC;IACM,YAAY,KAAW,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC;IAC9F,mGAAmG,CAAC,KAAK,KAAW,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAClL,8DAA8D,CAAC,IAAI,KAAW,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC3H,yFAAyF;IACzF,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,IAAI,CAAC,YAAY,EAAE,CAAC;QAAC,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACnG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAC,GAAG,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE;oBAC3E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAClF,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC,EAAC,CAAC,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAAC,OAAO,MAAM,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAAC,MAAM,KAAK,CAAC;QAAA,CAAC;gBAChD,CAAC;YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAAA,CAAC;IACjD,CAAC;IACD,yGAAyG;IACzG,OAAO;QACL,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnG,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxG,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1E,CAAC;CACF","sourcesContent":["import {scheduleFrame} from './util/frame.js';\nimport type Engine from './Engine.js';\nimport type Display from './Display.js';\nimport Render, { type RenderOptions, type RenderStatus, type ConvergeOptions, type ConvergeResult, type SampleEvent } from './Render.js';\nimport type Sync from './Sync.js';\nimport { Events } from './util/events.js';\nimport { updateProgressiveState, loopImageState, type ProgressiveState } from './renderer/progressiveScheduler.js';\n\n/** Presentation state; preview images never count as final completion. */\nexport type RenderLoopStatus = RenderStatus | 'previewing';\nexport interface RenderLoopOptions {\n /** Presentation settings/canvas. Default engine.display. */ display?: Display;\n /** Preview render/settings, or false to disable. Default half resolution with adaptive scale .125–.5, 80 ms budget, 2 bounces, no bevel, 1 wavelength and 2 light candidates. */ preview?: Render | RenderOptions | false;\n /** Final render/settings. Default a new Render with preview as fallback. */ final?: Render | RenderOptions;\n /** External integrations, invoked in order. Default none. */ sync?: Sync | Sync[];\n /** Idle delay for consecutive edits without explicit sync activity. Default 150 ms. */ idleMs?: number;\n /** Hold preview inference before committing the latest camera/scene. Default false. */ coalesceSceneUpdates?: boolean;\n}\ninterface LoopEvents {\n status: {status: RenderLoopStatus; previous: RenderLoopStatus};\n sample: SampleEvent & {preview: false};\n}\n\n/** Built-in interactive policy implemented entirely through the first-layer API. */\nexport default class RenderLoop {\n readonly preview: Render | undefined;\n readonly final: Render;\n readonly display: Display;\n /** Selection policy. Default changing ? preview : final; absent previews select final. */\n select: (info: {changing: boolean}) => 'preview' | 'final' = ({changing}) => changing ? 'preview' : 'final';\n /** Heuristic idle delay. Default 150 ms. */ idleMs: number;\n /** Defer engine commits while preview inference is pending. Default false. */ coalesceSceneUpdates: boolean;\n private _changing = false;\n private _status: RenderLoopStatus = 'preparing';\n private _events = new Events<LoopEvents>();\n private _syncs = new Set<Sync>();\n private _owned = new Set<Render>();\n private _policy: ProgressiveState = {previousChanged: false, lastContinuousChange: -Infinity, changing: false};\n private _running = false;\n private _busy = false;\n private _disposed = false;\n private _cancelScheduled?: () => void;\n private _warnedTick = false;\n /** Render whose next presentation is waiting for a complete preview frame. */\n private _previewFrameOwner?: Render;\n private _presented?: Render;\n private _finishedImage?: string;\n private _unsubscribe: () => void;\n constructor(readonly engine: Engine, options: RenderLoopOptions = {}) {\n // Validate foreign objects before allocating owned resources.\n const syncs = options.sync ? (Array.isArray(options.sync) ? options.sync : [options.sync]) : [];\n for (const sync of syncs) this._checkEngine(sync.engine);\n for (const render of [options.preview, options.final]) if (render instanceof Render) this._checkEngine(render.engine);\n this.display = options.display ?? engine.display;\n this.idleMs = options.idleMs ?? 150;\n this.coalesceSceneUpdates = options.coalesceSceneUpdates ?? false;\n try {\n if (options.preview !== false) this.preview = this._render(options.preview, {\n resolutionScale: .5, timeBudgetMs: 80, adaptiveResolution: {targetFrameMs: 80, minScale: .125},\n bounces: 2, bevel: false, dispersionWavelengths: 1, directLightCandidates: 2,\n });\n this.final = this._render(options.final, {fallback: this.preview ?? null});\n } catch (error) {for (const render of this._owned) render.dispose(); throw error;}\n for (const sync of syncs) this.addSync(sync);\n this._unsubscribe = this.final.on('sample', event => this._events.emit('sample', {...event, preview: false}));\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', this._visibility);\n }\n private _render(value: Render | RenderOptions | undefined, defaults: RenderOptions): Render {\n if (value instanceof Render) return value;\n const settings = {...defaults, ...value};\n if (value && 'width' in value) {\n if (!('resolutionScale' in value)) delete settings.resolutionScale;\n if (!('adaptiveResolution' in value)) delete settings.adaptiveResolution;\n }\n const render = new Render(this.engine, settings as RenderOptions); this._owned.add(render); return render;\n }\n private _checkEngine(engine: Engine): void { if (engine !== this.engine) throw new Error('RenderLoop renders and syncs must belong to the same engine.'); }\n private _assertAlive(): void { if (this._disposed) throw new Error('RenderLoop is disposed.'); }\n /** Whether an explicit integration or consecutive edits indicate motion. Default false. */ get changing(): boolean { return this._changing; }\n /** Complete final samples; preview sampling is excluded. Default 0. */ get samples(): number { return this.status === 'previewing' ? 0 : this.final.samples; }\n /** Current presented/execution state. Default preparing. */ get status(): RenderLoopStatus { return this._status; }\n /** Subscribes to status transitions or complete final samples; returns unsubscribe. */\n on<K extends keyof LoopEvents>(event: K, listener: (value: LoopEvents[K]) => void): () => void { return this._events.on(event, listener); }\n /** Adds an integration on this engine. Duplicate registrations are ignored. */\n addSync(sync: Sync): void { this._assertAlive(); this._checkEngine(sync.engine); this._syncs.add(sync); }\n /** Removes an integration without disposing it. */ removeSync(sync: Sync): void { this._syncs.delete(sync); }\n private _setStatus(status: RenderLoopStatus): RenderLoopStatus {\n if (status !== this._status) { const previous = this._status; this._status = status; this._events.emit('status', {status, previous}); }\n return status;\n }\n private _present(render: Render): Render | undefined {\n const shown = this.display.present(render);\n if (shown) this._presented = shown;\n return shown;\n }\n /** Executes one manual tick. Calls during start are ignored with one warning. */\n tick(): RenderLoopStatus {\n this._assertAlive();\n if (this._running) { if (!this._warnedTick) {this._warnedTick = true; console.warn('RenderLoop.tick() is ignored while start() is active.');} return this.status; }\n return this._tick();\n }\n private _tick(): RenderLoopStatus {\n if (this._busy || (typeof document !== 'undefined' && document.hidden)) return this.status;\n for (const sync of this._syncs) sync.update();\n const owner = this._previewFrameOwner;\n const pendingPreview = !!owner && (owner === this.preview || !owner._complete);\n const tracingPreview = pendingPreview && this.preview?.status === 'converging' && this.preview.samples === 0;\n const holding = tracingPreview || (this.coalesceSceneUpdates && pendingPreview && !!this.preview?.denoising);\n // Inference belongs to a presentation, not merely to a background render.\n // A fallback result must never replace an already available final image.\n if (pendingPreview && !holding && this.preview) this._present(this.preview);\n if (!holding) this._previewFrameOwner = undefined;\n const changed = holding ? false : this.engine.update();\n const active = [...this._syncs].some(sync => sync.active);\n this._policy = updateProgressiveState(this._policy, changed, active, performance.now(), this.idleMs);\n this._changing = this._policy.changing;\n const selected = this.select({changing: this.changing});\n if (holding && this.preview) {\n // Finish this image against its committed camera while syncs collect the\n // latest input. Restarting its first tile on every edit starves presentation.\n if (tracingPreview) {\n const status = this.preview.refine();\n if (status === 'error') { this._previewFrameOwner = undefined; return this._setStatus('error'); }\n if ((!this.coalesceSceneUpdates || !this.preview.denoising) && this._present(this.preview)) this._previewFrameOwner = undefined;\n }\n return this._setStatus('previewing');\n }\n const current = selected === 'preview' && this.preview ? this.preview : this.final;\n const imageState = loopImageState(this.final, this.display);\n if (!changed && !this.changing && current === this.final && this.status === 'finished' && this.final.status === 'finished' && imageState === this._finishedImage) return this.status;\n // Invalidate a completed filter before refinement when display settings changed.\n if (this.status === 'finished' && imageState !== this._finishedImage && this.final.samples > 0) this._present(this.final);\n const status = current.refine();\n // Keep the canvas on the last completed image while filtering the next\n // preview; presenting its raw sample here would overwrite the denoise above.\n const waitingForPreview = !!this.preview && ((current === this.preview && status === 'converging' && current.samples === 0) || (this.coalesceSceneUpdates && this.preview.denoising)) &&\n (current === this.preview || (!current._complete && current.fallback === this.preview));\n if (waitingForPreview) this._previewFrameOwner = current;\n else this._present(current);\n // Execution may already be tracing final tiles while the canvas still shows\n // preview. Only a successful presentation transfers ownership of the image.\n const previewing = waitingForPreview || (current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);\n const next = status === 'error' ? 'error' : previewing ? 'previewing' : status;\n this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;\n return this._setStatus(next);\n }\n private _schedule(): void {\n if (!this._running || this._busy || this._cancelScheduled !== undefined || (typeof document !== 'undefined' && document.hidden)) return;\n this._cancelScheduled = scheduleFrame(() => { this._cancelScheduled = undefined; try {this._tick();} finally {this._schedule();} });\n }\n private _visibility = (): void => {\n if (document.hidden) this._cancelFrame(); else this._schedule();\n };\n private _cancelFrame(): void { this._cancelScheduled?.(); this._cancelScheduled = undefined; }\n /** Starts an idempotent loop; uses a 16 ms timer without rAF. Hidden pages pause automatically. */ start(): void { this._assertAlive(); this._running = true; this._schedule(); }\n /** Stops scheduling without discarding accumulated images. */ stop(): void { this._running = false; this._cancelFrame(); }\n /** Pauses ticks, converges final, presents it, and resumes a previously running loop. */\n async converge(options: ConvergeOptions): Promise<ConvergeResult> {\n this._assertAlive(); if (this._busy) throw new Error('RenderLoop convergence is already running.');\n this._busy = true; this._previewFrameOwner = undefined; this._cancelFrame();\n try {\n for (const sync of this._syncs) sync.update(); this.engine.update();\n this._setStatus('preparing');\n const result = await this.final.converge({...options, onProgress: progress => {\n this._setStatus(progress.stage === 'denoising' ? 'denoising' : this.final.status);\n options.onProgress?.(progress);\n }});\n this._present(this.final); this._setStatus('finished'); return result;\n } catch (error) {this._setStatus('error'); throw error;}\n finally {this._busy = false; this._schedule();}\n }\n /** Stops the loop and releases renders it created. Supplied renders/syncs remain owned by the caller. */\n dispose(): void {\n if (this._disposed) return;\n this.stop(); this._disposed = true; this._unsubscribe(); this._events.clear(); this._syncs.clear();\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', this._visibility);\n for (const render of this._owned) render.dispose(); this._owned.clear();\n }\n}\n"]}
package/lib/oidn.d.ts CHANGED
@@ -40,6 +40,6 @@ export declare const DEFAULT_OIDN_WEIGHTS_PACKAGE_BASE_URL = "https://cdn.jsdeli
40
40
  * Fallback for bundled standard/small weights when application assets fail.
41
41
  * Defaults to jsDelivr's `@meimu/mutracer@VERSION/oidn/weights/` directory.
42
42
  */
43
- export declare const DEFAULT_OIDN_WEIGHTS_BASE_URL = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.0/oidn/weights/";
43
+ export declare const DEFAULT_OIDN_WEIGHTS_BASE_URL = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.2/oidn/weights/";
44
44
  export declare function resolveOIDNModelUrl(model: OIDNModel, weightsBaseUrl?: string | URL): string;
45
45
  export declare function resolveOIDNAuxiliaryModelUrls(weightsBaseUrl?: string | URL): OIDNAuxiliaryModelUrls;
@@ -1,2 +1,2 @@
1
- export declare const standardWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.0/oidn/weights/rt_hdr_alb_nrm.tza";
2
- export declare const smallWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.0/oidn/weights/rt_hdr_alb_nrm_small.tza";
1
+ export declare const standardWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.2/oidn/weights/rt_hdr_alb_nrm.tza";
2
+ export declare const smallWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.2/oidn/weights/rt_hdr_alb_nrm_small.tza";
@@ -62,6 +62,7 @@ export interface BufferData extends Record<MaterialTextureIndex, number[]> {
62
62
  displacementUvProjection: number[];
63
63
  displacementUvProjectionScale: number[];
64
64
  displacementStepSize: number[];
65
+ displacementBias: number[];
65
66
  alpha: number[];
66
67
  alphaMode: number[];
67
68
  alphaCutoff: number[];
@@ -478,7 +478,8 @@ class MaterialTable {
478
478
  uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),
479
479
  displacementUvProjection: materials.map((m) => uvProjectionConstants[m.displacementUvProjection] || 0),
480
480
  displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),
481
- displacementStepSize: materials.map((m) => m.displacementStepSize || 0.01),
481
+ displacementBias: materials.map((m) => m.displacementBias),
482
+ displacementStepSize: materials.map((m) => Number.isFinite(m.displacementStepSize) && m.displacementStepSize > 0 ? m.displacementStepSize : 0),
482
483
  // Alpha
483
484
  alpha: materials.map((m) => m.opacity),
484
485
  alphaMode: materials.map((m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]),
@@ -1 +1 @@
1
- {"version":3,"file":"MaterialTable.js","sourceRoot":"","sources":["../../src/renderer/MaterialTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { specularAnisotropyModelIndex, finiteAnisotropySource } from '../scene/anisotropyParameters.js';\nimport { finiteFilmThickness, thinFilmMapChannelIndex } from '../scene/thinFilmParameters.js';\nimport { MATERIAL_TEXTURE_NAMES, MATERIAL_TEXTURE_SLOTS, type MaterialTextureIndex } from './materialTextureSlots.js';\nimport { packMaterialBuffer } from './materialLayout.js';\nimport { float16Bits } from './float16.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { mapAlphaUsageConstants } from './materialConstants.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';\nimport { vec2 } from '../math.js';\nimport { materialEmission } from './materialEmission.js';\nimport {\n Texture2DArray as WebGLTexture2DArray,\n constants,\n Texture2D,\n type TexturePixelSource\n} from './webgl.js';\nimport OpenPBRMaterial, {\n materialAlphaModeConstants,\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\nimport { ColorRGB } from '../types.js';\nimport { mergeTexturesFromMaterials } from './texturesFromMaterials.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';\nimport { SceneLight } from '../scene/Scene.js';\n\nexport const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;\n\nexport interface MaterialTableOptions {\n maxTextureArrayBytes?: number;\n maxTextureArrayLayers?: number;\n maxTextureDimension2D?: number;\n}\n\nexport interface TextureAtlasStats {\n estimatedBytes: number;\n height: number;\n layers: number;\n packTimeMs: number;\n scale: number;\n sourcePixels: number;\n textureCount: number;\n width: number;\n}\n\nexport function materialUsesMedium(material: OpenPBRMaterial): boolean {\n return !material.thinWalled && (\n (material.transmissionWeight > 0 && material.transmissionDepth > 0) ||\n material.subsurfaceWeight > 0\n );\n}\n\nexport const uvProjectionConstants = {\n none: 0,\n spherical: 1,\n cylindrical: 2,\n triplanar: 3\n};\n\ninterface AtlasPlacement {\n height: number;\n index: number;\n layer: number;\n width: number;\n x: number;\n y: number;\n}\n\ninterface AtlasShelf {\n height: number;\n x: number;\n y: number;\n}\n\ninterface AtlasPage {\n nextY: number;\n placements: AtlasPlacement[];\n shelves: AtlasShelf[];\n}\n\n/**\n * Packs material textures into a small 2D-array atlas.\n *\n * The input rectangles are sorted from tallest/largest to smallest, then\n * placed with a shelf allocator. Each atlas layer contains horizontal shelves;\n * a texture is inserted into the first shelf with enough remaining width, or a\n * new shelf is opened below the existing ones. A new array layer is allocated\n * only when none of the current layers has enough room.\n *\n * `makeTextureArray` first tries this packing at full resolution. If the result\n * exceeds the adapter layer limit or the configured memory budget, it performs\n * a binary search for the largest uniform scale that fits. This preserves full\n * resolution whenever packing alone is sufficient and degrades predictably on\n * constrained hardware.\n *\n * The returned placements keep the original logical texture indices. Shaders\n * use per-texture atlas metadata instead of treating the logical index as the\n * physical array layer.\n */\nfunction packTextureAtlas(\n textures: Texture[],\n pageSize: number,\n scale: number\n) {\n const pages: AtlasPage[] = [];\n const placements = new Array<AtlasPlacement>(textures.length);\n const items = textures\n .map((texture, index) => ({\n height: Math.max(1, Math.floor(texture.image.height * scale)),\n index,\n width: Math.max(1, Math.floor(texture.image.width * scale))\n }))\n .sort((a, b) => b.height - a.height || b.width - a.width);\n\n for (const item of items) {\n let placement: AtlasPlacement | undefined;\n for (let layer = 0; layer < pages.length && !placement; layer++) {\n const page = pages[layer];\n for (const shelf of page.shelves) {\n if (\n item.height <= shelf.height &&\n shelf.x + item.width <= pageSize\n ) {\n placement = {\n ...item,\n layer,\n x: shelf.x,\n y: shelf.y\n };\n shelf.x += item.width;\n break;\n }\n }\n if (!placement && page.nextY + item.height <= pageSize) {\n placement = {\n ...item,\n layer,\n x: 0,\n y: page.nextY\n };\n page.shelves.push({\n height: item.height,\n x: item.width,\n y: page.nextY\n });\n page.nextY += item.height;\n }\n }\n\n if (!placement) {\n const layer = pages.length;\n placement = { ...item, layer, x: 0, y: 0 };\n pages.push({\n nextY: item.height,\n placements: [],\n shelves: [{ height: item.height, x: item.width, y: 0 }]\n });\n }\n pages[placement.layer].placements.push(placement);\n placements[item.index] = placement;\n }\n\n return { pages, placements };\n}\n\nfunction createAtlasCanvas(width: number, height: number) {\n return createCanvas(width, height);\n}\n\nfunction createDataAtlasPage(\n width: number,\n height: number,\n page: ReturnType<typeof packTextureAtlas>['pages'][number],\n textures: Texture[],\n floatStorage: boolean\n): TexturePixelSource {\n const data = floatStorage ? new Uint16Array(width * height * 4) : new Uint8Array(width * height * 4);\n // Retain the same Canvas composition for DOM layers, including straight-alpha\n // readback. Raw sources never pass through Canvas or its color conversion.\n const domPlacements = page.placements.filter(p => !isTextureDataSource(textures[p.index].image));\n if (domPlacements.length) {\n const canvas = createAtlasCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Unable to create a canvas for the texture atlas.');\n for (const placement of domPlacements) drawAtlasImage(context, placement, textures[placement.index]);\n const pixels = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < pixels.length; i++) data[i] = floatStorage ? float16Bits(pixels[i] / 255) : pixels[i];\n }\n for (const placement of page.placements) {\n const texture = textures[placement.index];\n const source = texture.image;\n if (!isTextureDataSource(source)) continue;\n const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;\n if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {\n throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');\n }\n if (source.data.length !== source.width * source.height * 4) {\n throw new Error('Material texture RGBA source length does not match its dimensions.');\n }\n for (let y = 0; y < placement.height; y++) {\n let sourceY = Math.min(source.height - 1, Math.floor(((y + 0.5) * source.height) / placement.height));\n if (texture.flipY) sourceY = source.height - 1 - sourceY;\n for (let x = 0; x < placement.width; x++) {\n const sourceX = Math.min(source.width - 1, Math.floor(((x + 0.5) * source.width) / placement.width));\n const sourceOffset = (sourceY * source.width + sourceX) * 4;\n const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;\n for (let c = 0; c < 4; c++) {\n const value = source.data[sourceOffset + c];\n data[targetOffset + c] = floatStorage ? float16Bits(bytes ? value / 255 : value) : value;\n }\n }\n }\n }\n return { data, width, height };\n}\n\nfunction drawAtlasImage(\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n placement: AtlasPlacement,\n texture: Texture\n) {\n if (texture.flipY) {\n context.save();\n context.translate(placement.x, placement.y + placement.height);\n context.scale(1, -1);\n context.drawImage(texture.image as CanvasImageSource, 0, 0, placement.width, placement.height);\n context.restore();\n } else {\n context.drawImage(texture.image as CanvasImageSource, placement.x, placement.y, placement.width, placement.height);\n }\n}\n\nfunction makeTextureArray(\n textures: Texture[],\n sRGB = false,\n options: MaterialTableOptions = {}\n) {\n const packStart = performance.now();\n if (!textures.length) {\n return {\n mapInfo: [] as number[],\n mapTransform: [] as number[],\n mapUvChannel: [] as number[],\n mapColorLinear: [] as number[],\n stats: {\n estimatedBytes: 0,\n height: 1,\n layers: 0,\n packTimeMs: performance.now() - packStart,\n scale: 1,\n sourcePixels: 0,\n textureCount: 0,\n width: 1\n } satisfies TextureAtlasStats,\n texture: new WebGLTexture2DArray({\n width: 1,\n height: 1,\n sRGB,\n source: [],\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n })\n };\n }\n\n const dataBacked = textures.some((texture) =>\n isTextureDataSource(texture.image)\n );\n const mapColorLinear = textures.map(texture => {\n const image = texture.image;\n return Number(isTextureDataSource(image) &&\n !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));\n });\n const floatStorage = mapColorLinear.some(Boolean);\n const bytesPerPixel = floatStorage ? 8 : 4;\n\n const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;\n const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;\n const maxTextureArrayBytes =\n options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n const sourcePixels = textures.reduce(\n (sum, texture) => sum + texture.image.width * texture.image.height,\n 0\n );\n const maxSourceDimension = textures.reduce(\n (max, texture) =>\n Math.max(max, texture.image.width, texture.image.height),\n 1\n );\n const maxPageSizeFromBudget = Math.max(\n 1,\n Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel))\n );\n const pageSize = Math.max(\n 1,\n Math.floor(\n Math.min(\n maxSourceDimension,\n maxTextureDimension2D,\n maxPageSizeFromBudget\n )\n )\n );\n const pageBytes = pageSize * pageSize * bytesPerPixel;\n const maxPageCount = Math.max(\n 1,\n Math.min(\n maxTextureArrayLayers,\n Math.floor(maxTextureArrayBytes / pageBytes)\n )\n );\n const maxScale = Math.min(1, pageSize / maxSourceDimension);\n let packed = packTextureAtlas(textures, pageSize, maxScale);\n let scale = maxScale;\n\n if (packed.pages.length > maxPageCount) {\n let low = 0;\n let high = maxScale;\n let bestPacked: ReturnType<typeof packTextureAtlas> | undefined;\n let bestScale = 0;\n for (let i = 0; i < 14; i++) {\n const candidateScale = (low + high) / 2;\n const candidate = packTextureAtlas(\n textures,\n pageSize,\n candidateScale\n );\n if (candidate.pages.length <= maxPageCount) {\n low = candidateScale;\n bestScale = candidateScale;\n bestPacked = candidate;\n } else {\n high = candidateScale;\n }\n }\n if (!bestPacked) {\n throw new Error(\n `Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`\n );\n }\n packed = bestPacked;\n scale = bestScale;\n }\n\n const atlasWidth = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.x + placement.width)\n );\n const atlasHeight = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.y + placement.height)\n );\n const pages = packed.pages.map((page) => {\n if (dataBacked) {\n return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);\n }\n const canvas = createAtlasCanvas(atlasWidth, atlasHeight);\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Unable to create a canvas for the texture atlas.');\n }\n for (const placement of page.placements) drawAtlasImage(context, placement, textures[placement.index]);\n return canvas;\n });\n\n if (scale < 0.999) {\n console.warn(\n `Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`\n );\n }\n\n // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].\n // Packing layer and X offset into one float keeps the shader metadata to one\n // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.\n const mapInfo = packed.placements.flatMap((placement) => {\n const offsetX = (placement.x + 0.5) / atlasWidth;\n const offsetY = (placement.y + 0.5) / atlasHeight;\n return [\n Math.max(placement.width - 1, 0) / atlasWidth,\n Math.max(placement.height - 1, 0) / atlasHeight,\n placement.layer + offsetX,\n offsetY\n ];\n });\n\n const texture = new WebGLTexture2DArray({\n width: atlasWidth,\n height: atlasHeight,\n sRGB,\n type: floatStorage ? constants.HALF_FLOAT : constants.UNSIGNED_BYTE,\n source: pages,\n flipY: false,\n flipYArray: pages.map(() => false),\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n });\n\n return {\n texture,\n mapInfo,\n mapTransform: textures.flatMap((texture) => [\n texture.uvScale[0],\n texture.uvScale[1],\n texture.uvOffset[0],\n texture.uvOffset[1]\n ]),\n mapUvChannel: textures.map((texture) => texture.uvChannel),\n mapColorLinear,\n stats: {\n estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,\n height: atlasHeight,\n layers: pages.length,\n packTimeMs: performance.now() - packStart,\n scale,\n sourcePixels,\n textureCount: textures.length,\n width: atlasWidth\n } satisfies TextureAtlasStats\n };\n}\n\nexport interface BufferData extends Record<MaterialTextureIndex, number[]> {\n color: ColorRGB[];\n roughness: number[];\n metallic: number[];\n emission: ColorRGB[];\n ior: number[];\n transmission: number[];\n dispersion: number[];\n thinFilmThickness: number[];\n thinFilmThicknessMinimum: number[];\n thinFilmMapChannel: number[];\n thinFilmIor: number[];\n anisotropy: number[];\n thin: number[];\n doubleSided: number[];\n bevelSize: number[];\n mapAlphaUsage: number[];\n\n normalScale: vec2.Vec2Array[];\n\n type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];\n mapInfo: number[];\n mapTransform: number[];\n mapUvChannel: number[];\n mapColorLinear: number[];\n\n mediumType: number[];\n specularAnisotropyModel: number[];\n specularAnisotropyRotation: number[];\n coatAnisotropyRotation: number[];\n coatNormalScale: vec2.Vec2Array[];\n\n uvProjection: number[];\n uvScale: vec2.Vec2Array[];\n\n displacementUvProjection: number[];\n displacementUvProjectionScale: number[];\n\n // For PDM displacement.\n displacementStepSize: number[];\n\n // Alpha\n alpha: number[];\n alphaMode: number[];\n alphaCutoff: number[];\n\n baseWeight: number[];\n baseDiffuseRoughness: number[];\n specularWeight: number[];\n specularColor: ColorRGB[];\n transmissionColor: ColorRGB[];\n transmissionDepth: number[];\n transmissionScatter: ColorRGB[];\n transmissionScatterAnisotropy: number[];\n subsurfaceWeight: number[];\n subsurfaceColor: ColorRGB[];\n subsurfaceRadius: number[];\n subsurfaceRadiusScale: ColorRGB[];\n subsurfaceScatterAnisotropy: number[];\n fuzzWeight: number[];\n fuzzColor: ColorRGB[];\n fuzzRoughness: number[];\n coatWeight: number[];\n coatColor: ColorRGB[];\n coatRoughness: number[];\n coatAnisotropy: number[];\n coatIor: number[];\n coatDarkening: number[];\n thinFilmWeight: number[];\n dispersionAbbeNumber: number[];\n mediumExtinction: ColorRGB[];\n mediumScattering: ColorRGB[];\n mediumAnisotropy: number[];\n}\n\nfunction clampColor(color: ArrayLike<number>, fallback = 0): ColorRGB {\n return [0, 1, 2].map((channel) => {\n const value = Number(color[channel]);\n return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;\n }) as ColorRGB;\n}\n\ntype OpenPbrMedium = {\n anisotropy: number;\n extinction: ColorRGB;\n scattering: ColorRGB;\n};\n\nfunction emptyOpenPbrMedium(): OpenPbrMedium {\n return {\n anisotropy: 0,\n extinction: [0, 0, 0],\n scattering: [0, 0, 0]\n };\n}\n\nfunction transmissionMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.transmissionWeight));\n const depth = Math.max(0, material.transmissionDepth);\n if (weight <= 0 || depth <= 0 || material.thinWalled) return undefined;\n\n const color = clampColor(material.transmissionColor, 1);\n const scatterColor = clampColor(material.transmissionScatter);\n const extinction = color.map((channel) =>\n Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth)\n ) as ColorRGB;\n const scattering = scatterColor.map((channel, index) =>\n extinction[index] * channel\n ) as ColorRGB;\n return {\n anisotropy: Math.min(\n 0.999,\n Math.max(-0.999, material.transmissionScatterAnisotropy)\n ),\n extinction,\n scattering\n } satisfies OpenPbrMedium;\n}\n\nfunction subsurfaceMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));\n if (weight <= 0 || material.thinWalled) return undefined;\n\n // OpenPBR's radius is the extinction mean free path. The van de Hulst\n // mapping converts the artist-facing multiple-scattering color to a\n // single-scattering albedo while compensating for phase anisotropy.\n const radius = Math.max(material.subsurfaceRadius, 1e-3);\n const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);\n const color = clampColor(material.subsurfaceColor);\n const anisotropy = Math.min(\n 0.999,\n Math.max(-0.999, material.subsurfaceAnisotropy)\n );\n const extinction = radiusScale.map(\n (scale) => 1 / Math.max(radius * scale, 1e-3)\n ) as ColorRGB;\n const scattering = color.map((channel, index) => {\n const s = 4.09712 + 4.20863 * channel - Math.sqrt(\n 9.59217 + 41.6808 * channel + 17.7126 * channel * channel\n );\n const sSquared = s * s;\n const albedo = Math.min(\n 1,\n Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared))\n );\n return extinction[index] * albedo;\n }) as ColorRGB;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction combineOpenPbrMedia(\n material: OpenPBRMaterial,\n transmission: OpenPbrMedium | undefined,\n subsurface: OpenPbrMedium | undefined\n) {\n const transmissionFraction = transmission\n ? Math.min(1, Math.max(0, material.transmissionWeight))\n : 0;\n const subsurfaceFraction = subsurface\n ? (1 - transmissionFraction)\n * Math.min(1, Math.max(0, material.subsurfaceWeight))\n : 0;\n const total = transmissionFraction + subsurfaceFraction;\n if (total <= 0) return undefined;\n\n const transmissionWeight = transmissionFraction / total;\n const subsurfaceWeight = subsurfaceFraction / total;\n const extinction = [0, 1, 2].map((channel) => {\n const transmissionAbsorption = transmission\n ? transmission.extinction[channel] - transmission.scattering[channel]\n : 0;\n const subsurfaceAbsorption = subsurface\n ? subsurface.extinction[channel] - subsurface.scattering[channel]\n : 0;\n const absorption = transmissionAbsorption * transmissionWeight\n + subsurfaceAbsorption * subsurfaceWeight;\n const scattering = (transmission?.scattering[channel] || 0)\n * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight;\n return Math.max(0, absorption + scattering);\n }) as ColorRGB;\n const scattering = [0, 1, 2].map((channel) =>\n (transmission?.scattering[channel] || 0) * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight\n ) as ColorRGB;\n const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight\n + (subsurface?.anisotropy || 0) * subsurfaceWeight;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction openPbrMedium(material: OpenPBRMaterial) {\n const volume = combineOpenPbrMedia(\n material,\n transmissionMedium(material),\n subsurfaceMedium(material)\n );\n return volume ?? emptyOpenPbrMedium();\n}\n\nclass MaterialTable {\n texture: WebGLTexture2DArray | undefined;\n textureAtlasStats: TextureAtlasStats;\n\n defines: Record<string, string | number> = {};\n\n bufferData: BufferData;\n\n private _matBufferTex = new Texture2D(commonNearestFloatProps);\n private _materialBufferColumnsLog: number = 0;\n\n private _displacementMaps: Texture[] = [];\n private _lightTexturesIndices: number[] = [];\n\n constructor(\n materials: OpenPBRMaterial[],\n lights: SceneLight[],\n options: MaterialTableOptions = {}\n ) {\n const maps = mergeTexturesFromMaterials(materials, MATERIAL_TEXTURE_NAMES);\n this._displacementMaps =\n maps.indices.displacementMap\n .map((idx) => {\n return maps.textures[idx];\n })\n .filter((a) => !!a);\n\n const bufferData = this._packParams(materials);\n\n const allTextures = maps.textures.slice();\n const lightTexturesIndices: number[] = [];\n for (let i = 0; i < lights.length; i++) {\n const light = lights[i];\n if (light.type === 'RectLight' && light.texture) {\n lightTexturesIndices.push(allTextures.length);\n allTextures.push(light.texture);\n } else {\n lightTexturesIndices.push(-1);\n }\n }\n const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, stats, texture } = makeTextureArray(\n allTextures,\n false,\n options\n );\n\n this.texture = texture;\n this.textureAtlasStats = stats;\n bufferData.mapInfo = mapInfo;\n bufferData.mapTransform = mapTransform;\n bufferData.mapUvChannel = mapUvChannel;\n bufferData.mapColorLinear = mapColorLinear;\n for (const slot of MATERIAL_TEXTURE_SLOTS) {\n bufferData[slot.index] = maps.indices[slot.property];\n }\n\n this.bufferData = bufferData;\n\n this._lightTexturesIndices = lightTexturesIndices;\n\n function countMaps(indices: number[]) {\n return indices.filter((idx) => idx >= 0).length;\n }\n\n this.defines = {\n NUM_MAPS: allTextures.length,\n ...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define\n ? [[slot.define, countMaps(maps.indices[slot.property])]] : []))\n };\n\n this._updateBuffer();\n }\n\n private _packParams(materials: OpenPBRMaterial[]) {\n const media = materials.map(openPbrMedium);\n return {\n color: materials.map((m) => m.baseColor.slice(0, 3) as ColorRGB),\n roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),\n emission: materials.map(materialEmission),\n metallic: materials.map((m) => m.baseMetalness),\n ior: materials.map((m) => m.specularIor),\n dispersion: materials.map((m) => m.transmissionDispersionScale),\n thin: materials.map((m) => +m.thinWalled),\n bevelSize: materials.map((m) => m.bevelSize),\n transmission: materials.map((m) => m.transmissionWeight),\n anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),\n specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),\n thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),\n thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),\n thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),\n thinFilmIor: materials.map((m) => m.thinFilmIor),\n normalScale: materials.map((m) => m.normalScale),\n mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),\n type: materials.map((m) => {\n if (m.shadowCatcher) {\n return ShadowCatcherMaterial;\n }\n if (m.unlit) {\n return UnlitMaterial;\n }\n // Standard material\n return 0;\n }),\n // Retain mediumType until both legacy readers are migrated; the\n // direction and coat-normal inputs are reserved for later C1 steps.\n mediumType: materials.map((m) => Number(materialUsesMedium(m))),\n specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),\n coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),\n coatNormalScale: materials.map(m => m.coatNormalScale),\n uvProjection: materials.map(\n (m) => uvProjectionConstants[m.uvProjection] || 0\n ),\n uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),\n\n displacementUvProjection: materials.map(\n (m) => uvProjectionConstants[m.displacementUvProjection] || 0\n ),\n displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),\n displacementStepSize: materials.map(\n (m) => m.displacementStepSize || 0.01\n ),\n\n // Alpha\n alpha: materials.map((m) => m.opacity),\n alphaMode: materials.map(\n (m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]\n ),\n alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),\n doubleSided: materials.map((m) => Number(m.doubleSided)),\n\n baseWeight: materials.map((m) => m.baseWeight),\n baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),\n specularWeight: materials.map((m) => m.specularWeight),\n specularColor: materials.map((m) => clampColor(m.specularColor, 1)),\n transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),\n transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),\n transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),\n transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),\n subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),\n subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),\n subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),\n subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),\n subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),\n fuzzWeight: materials.map((m) => m.fuzzWeight),\n fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),\n fuzzRoughness: materials.map((m) => m.fuzzRoughness),\n coatWeight: materials.map((m) => m.coatWeight),\n coatColor: materials.map((m) => clampColor(m.coatColor, 1)),\n coatRoughness: materials.map((m) => m.coatRoughness),\n coatAnisotropy: materials.map((m) => m.coatAnisotropy),\n coatIor: materials.map((m) => m.coatIor),\n coatDarkening: materials.map((m) => m.coatDarkening),\n thinFilmWeight: materials.map((m) => m.thinFilmWeight),\n dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),\n mediumExtinction: media.map((medium) => medium.extinction),\n mediumScattering: media.map((medium) => medium.scattering),\n mediumAnisotropy: media.map((medium) => medium.anisotropy),\n\n } as BufferData;\n }\n\n /** Repack parameters with the same material slots and unchanged texture metadata. */\n repackParams(materials: OpenPBRMaterial[]) {\n Object.assign(this.bufferData, this._packParams(materials));\n this._updateBuffer();\n }\n\n getBufferArray() {\n return packMaterialBuffer(this.bufferData);\n }\n\n getDisplacementMaps() {\n return this._displacementMaps;\n }\n\n getLightTexturesIndices() {\n return this._lightTexturesIndices;\n }\n\n private _updateBuffer() {\n this._materialBufferColumnsLog = setDataTexture(\n this._matBufferTex,\n this.getBufferArray(),\n 4\n ).columnsLog;\n }\n\n setToPass(pass: {\n setUniform(label: string, value: unknown): unknown;\n setUniforms(values: Record<string, unknown>): void;\n }) {\n pass.setUniform('map', this.texture || null);\n pass.setUniform('mapInfo', this.bufferData.mapInfo);\n pass.setUniform('mapTransform', this.bufferData.mapTransform);\n pass.setUniform('mapUvChannel', this.bufferData.mapUvChannel);\n pass.setUniform('mapColorLinear', this.bufferData.mapColorLinear);\n pass.setUniforms({\n materialBuffer: this._matBufferTex,\n materialBufferColumns: this._materialBufferColumnsLog\n });\n }\n\n dispose(gl: WebGL2RenderingContext) {\n this.texture?.dispose(gl);\n this._matBufferTex.dispose(gl);\n }\n}\n\nexport default MaterialTable;\n"]}
1
+ {"version":3,"file":"MaterialTable.js","sourceRoot":"","sources":["../../src/renderer/MaterialTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { specularAnisotropyModelIndex, finiteAnisotropySource } from '../scene/anisotropyParameters.js';\nimport { finiteFilmThickness, thinFilmMapChannelIndex } from '../scene/thinFilmParameters.js';\nimport { MATERIAL_TEXTURE_NAMES, MATERIAL_TEXTURE_SLOTS, type MaterialTextureIndex } from './materialTextureSlots.js';\nimport { packMaterialBuffer } from './materialLayout.js';\nimport { float16Bits } from './float16.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { mapAlphaUsageConstants } from './materialConstants.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';\nimport { vec2 } from '../math.js';\nimport { materialEmission } from './materialEmission.js';\nimport {\n Texture2DArray as WebGLTexture2DArray,\n constants,\n Texture2D,\n type TexturePixelSource\n} from './webgl.js';\nimport OpenPBRMaterial, {\n materialAlphaModeConstants,\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\nimport { ColorRGB } from '../types.js';\nimport { mergeTexturesFromMaterials } from './texturesFromMaterials.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';\nimport { SceneLight } from '../scene/Scene.js';\n\nexport const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;\n\nexport interface MaterialTableOptions {\n maxTextureArrayBytes?: number;\n maxTextureArrayLayers?: number;\n maxTextureDimension2D?: number;\n}\n\nexport interface TextureAtlasStats {\n estimatedBytes: number;\n height: number;\n layers: number;\n packTimeMs: number;\n scale: number;\n sourcePixels: number;\n textureCount: number;\n width: number;\n}\n\nexport function materialUsesMedium(material: OpenPBRMaterial): boolean {\n return !material.thinWalled && (\n (material.transmissionWeight > 0 && material.transmissionDepth > 0) ||\n material.subsurfaceWeight > 0\n );\n}\n\nexport const uvProjectionConstants = {\n none: 0,\n spherical: 1,\n cylindrical: 2,\n triplanar: 3\n};\n\ninterface AtlasPlacement {\n height: number;\n index: number;\n layer: number;\n width: number;\n x: number;\n y: number;\n}\n\ninterface AtlasShelf {\n height: number;\n x: number;\n y: number;\n}\n\ninterface AtlasPage {\n nextY: number;\n placements: AtlasPlacement[];\n shelves: AtlasShelf[];\n}\n\n/**\n * Packs material textures into a small 2D-array atlas.\n *\n * The input rectangles are sorted from tallest/largest to smallest, then\n * placed with a shelf allocator. Each atlas layer contains horizontal shelves;\n * a texture is inserted into the first shelf with enough remaining width, or a\n * new shelf is opened below the existing ones. A new array layer is allocated\n * only when none of the current layers has enough room.\n *\n * `makeTextureArray` first tries this packing at full resolution. If the result\n * exceeds the adapter layer limit or the configured memory budget, it performs\n * a binary search for the largest uniform scale that fits. This preserves full\n * resolution whenever packing alone is sufficient and degrades predictably on\n * constrained hardware.\n *\n * The returned placements keep the original logical texture indices. Shaders\n * use per-texture atlas metadata instead of treating the logical index as the\n * physical array layer.\n */\nfunction packTextureAtlas(\n textures: Texture[],\n pageSize: number,\n scale: number\n) {\n const pages: AtlasPage[] = [];\n const placements = new Array<AtlasPlacement>(textures.length);\n const items = textures\n .map((texture, index) => ({\n height: Math.max(1, Math.floor(texture.image.height * scale)),\n index,\n width: Math.max(1, Math.floor(texture.image.width * scale))\n }))\n .sort((a, b) => b.height - a.height || b.width - a.width);\n\n for (const item of items) {\n let placement: AtlasPlacement | undefined;\n for (let layer = 0; layer < pages.length && !placement; layer++) {\n const page = pages[layer];\n for (const shelf of page.shelves) {\n if (\n item.height <= shelf.height &&\n shelf.x + item.width <= pageSize\n ) {\n placement = {\n ...item,\n layer,\n x: shelf.x,\n y: shelf.y\n };\n shelf.x += item.width;\n break;\n }\n }\n if (!placement && page.nextY + item.height <= pageSize) {\n placement = {\n ...item,\n layer,\n x: 0,\n y: page.nextY\n };\n page.shelves.push({\n height: item.height,\n x: item.width,\n y: page.nextY\n });\n page.nextY += item.height;\n }\n }\n\n if (!placement) {\n const layer = pages.length;\n placement = { ...item, layer, x: 0, y: 0 };\n pages.push({\n nextY: item.height,\n placements: [],\n shelves: [{ height: item.height, x: item.width, y: 0 }]\n });\n }\n pages[placement.layer].placements.push(placement);\n placements[item.index] = placement;\n }\n\n return { pages, placements };\n}\n\nfunction createAtlasCanvas(width: number, height: number) {\n return createCanvas(width, height);\n}\n\nfunction createDataAtlasPage(\n width: number,\n height: number,\n page: ReturnType<typeof packTextureAtlas>['pages'][number],\n textures: Texture[],\n floatStorage: boolean\n): TexturePixelSource {\n const data = floatStorage ? new Uint16Array(width * height * 4) : new Uint8Array(width * height * 4);\n // Retain the same Canvas composition for DOM layers, including straight-alpha\n // readback. Raw sources never pass through Canvas or its color conversion.\n const domPlacements = page.placements.filter(p => !isTextureDataSource(textures[p.index].image));\n if (domPlacements.length) {\n const canvas = createAtlasCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Unable to create a canvas for the texture atlas.');\n for (const placement of domPlacements) drawAtlasImage(context, placement, textures[placement.index]);\n const pixels = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < pixels.length; i++) data[i] = floatStorage ? float16Bits(pixels[i] / 255) : pixels[i];\n }\n for (const placement of page.placements) {\n const texture = textures[placement.index];\n const source = texture.image;\n if (!isTextureDataSource(source)) continue;\n const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;\n if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {\n throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');\n }\n if (source.data.length !== source.width * source.height * 4) {\n throw new Error('Material texture RGBA source length does not match its dimensions.');\n }\n for (let y = 0; y < placement.height; y++) {\n let sourceY = Math.min(source.height - 1, Math.floor(((y + 0.5) * source.height) / placement.height));\n if (texture.flipY) sourceY = source.height - 1 - sourceY;\n for (let x = 0; x < placement.width; x++) {\n const sourceX = Math.min(source.width - 1, Math.floor(((x + 0.5) * source.width) / placement.width));\n const sourceOffset = (sourceY * source.width + sourceX) * 4;\n const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;\n for (let c = 0; c < 4; c++) {\n const value = source.data[sourceOffset + c];\n data[targetOffset + c] = floatStorage ? float16Bits(bytes ? value / 255 : value) : value;\n }\n }\n }\n }\n return { data, width, height };\n}\n\nfunction drawAtlasImage(\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n placement: AtlasPlacement,\n texture: Texture\n) {\n if (texture.flipY) {\n context.save();\n context.translate(placement.x, placement.y + placement.height);\n context.scale(1, -1);\n context.drawImage(texture.image as CanvasImageSource, 0, 0, placement.width, placement.height);\n context.restore();\n } else {\n context.drawImage(texture.image as CanvasImageSource, placement.x, placement.y, placement.width, placement.height);\n }\n}\n\nfunction makeTextureArray(\n textures: Texture[],\n sRGB = false,\n options: MaterialTableOptions = {}\n) {\n const packStart = performance.now();\n if (!textures.length) {\n return {\n mapInfo: [] as number[],\n mapTransform: [] as number[],\n mapUvChannel: [] as number[],\n mapColorLinear: [] as number[],\n stats: {\n estimatedBytes: 0,\n height: 1,\n layers: 0,\n packTimeMs: performance.now() - packStart,\n scale: 1,\n sourcePixels: 0,\n textureCount: 0,\n width: 1\n } satisfies TextureAtlasStats,\n texture: new WebGLTexture2DArray({\n width: 1,\n height: 1,\n sRGB,\n source: [],\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n })\n };\n }\n\n const dataBacked = textures.some((texture) =>\n isTextureDataSource(texture.image)\n );\n const mapColorLinear = textures.map(texture => {\n const image = texture.image;\n return Number(isTextureDataSource(image) &&\n !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));\n });\n const floatStorage = mapColorLinear.some(Boolean);\n const bytesPerPixel = floatStorage ? 8 : 4;\n\n const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;\n const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;\n const maxTextureArrayBytes =\n options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n const sourcePixels = textures.reduce(\n (sum, texture) => sum + texture.image.width * texture.image.height,\n 0\n );\n const maxSourceDimension = textures.reduce(\n (max, texture) =>\n Math.max(max, texture.image.width, texture.image.height),\n 1\n );\n const maxPageSizeFromBudget = Math.max(\n 1,\n Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel))\n );\n const pageSize = Math.max(\n 1,\n Math.floor(\n Math.min(\n maxSourceDimension,\n maxTextureDimension2D,\n maxPageSizeFromBudget\n )\n )\n );\n const pageBytes = pageSize * pageSize * bytesPerPixel;\n const maxPageCount = Math.max(\n 1,\n Math.min(\n maxTextureArrayLayers,\n Math.floor(maxTextureArrayBytes / pageBytes)\n )\n );\n const maxScale = Math.min(1, pageSize / maxSourceDimension);\n let packed = packTextureAtlas(textures, pageSize, maxScale);\n let scale = maxScale;\n\n if (packed.pages.length > maxPageCount) {\n let low = 0;\n let high = maxScale;\n let bestPacked: ReturnType<typeof packTextureAtlas> | undefined;\n let bestScale = 0;\n for (let i = 0; i < 14; i++) {\n const candidateScale = (low + high) / 2;\n const candidate = packTextureAtlas(\n textures,\n pageSize,\n candidateScale\n );\n if (candidate.pages.length <= maxPageCount) {\n low = candidateScale;\n bestScale = candidateScale;\n bestPacked = candidate;\n } else {\n high = candidateScale;\n }\n }\n if (!bestPacked) {\n throw new Error(\n `Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`\n );\n }\n packed = bestPacked;\n scale = bestScale;\n }\n\n const atlasWidth = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.x + placement.width)\n );\n const atlasHeight = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.y + placement.height)\n );\n const pages = packed.pages.map((page) => {\n if (dataBacked) {\n return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);\n }\n const canvas = createAtlasCanvas(atlasWidth, atlasHeight);\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Unable to create a canvas for the texture atlas.');\n }\n for (const placement of page.placements) drawAtlasImage(context, placement, textures[placement.index]);\n return canvas;\n });\n\n if (scale < 0.999) {\n console.warn(\n `Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`\n );\n }\n\n // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].\n // Packing layer and X offset into one float keeps the shader metadata to one\n // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.\n const mapInfo = packed.placements.flatMap((placement) => {\n const offsetX = (placement.x + 0.5) / atlasWidth;\n const offsetY = (placement.y + 0.5) / atlasHeight;\n return [\n Math.max(placement.width - 1, 0) / atlasWidth,\n Math.max(placement.height - 1, 0) / atlasHeight,\n placement.layer + offsetX,\n offsetY\n ];\n });\n\n const texture = new WebGLTexture2DArray({\n width: atlasWidth,\n height: atlasHeight,\n sRGB,\n type: floatStorage ? constants.HALF_FLOAT : constants.UNSIGNED_BYTE,\n source: pages,\n flipY: false,\n flipYArray: pages.map(() => false),\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n });\n\n return {\n texture,\n mapInfo,\n mapTransform: textures.flatMap((texture) => [\n texture.uvScale[0],\n texture.uvScale[1],\n texture.uvOffset[0],\n texture.uvOffset[1]\n ]),\n mapUvChannel: textures.map((texture) => texture.uvChannel),\n mapColorLinear,\n stats: {\n estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,\n height: atlasHeight,\n layers: pages.length,\n packTimeMs: performance.now() - packStart,\n scale,\n sourcePixels,\n textureCount: textures.length,\n width: atlasWidth\n } satisfies TextureAtlasStats\n };\n}\n\nexport interface BufferData extends Record<MaterialTextureIndex, number[]> {\n color: ColorRGB[];\n roughness: number[];\n metallic: number[];\n emission: ColorRGB[];\n ior: number[];\n transmission: number[];\n dispersion: number[];\n thinFilmThickness: number[];\n thinFilmThicknessMinimum: number[];\n thinFilmMapChannel: number[];\n thinFilmIor: number[];\n anisotropy: number[];\n thin: number[];\n doubleSided: number[];\n bevelSize: number[];\n mapAlphaUsage: number[];\n\n normalScale: vec2.Vec2Array[];\n\n type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];\n mapInfo: number[];\n mapTransform: number[];\n mapUvChannel: number[];\n mapColorLinear: number[];\n\n mediumType: number[];\n specularAnisotropyModel: number[];\n specularAnisotropyRotation: number[];\n coatAnisotropyRotation: number[];\n coatNormalScale: vec2.Vec2Array[];\n\n uvProjection: number[];\n uvScale: vec2.Vec2Array[];\n\n displacementUvProjection: number[];\n displacementUvProjectionScale: number[];\n\n // For PDM displacement.\n displacementStepSize: number[];\n displacementBias: number[];\n\n // Alpha\n alpha: number[];\n alphaMode: number[];\n alphaCutoff: number[];\n\n baseWeight: number[];\n baseDiffuseRoughness: number[];\n specularWeight: number[];\n specularColor: ColorRGB[];\n transmissionColor: ColorRGB[];\n transmissionDepth: number[];\n transmissionScatter: ColorRGB[];\n transmissionScatterAnisotropy: number[];\n subsurfaceWeight: number[];\n subsurfaceColor: ColorRGB[];\n subsurfaceRadius: number[];\n subsurfaceRadiusScale: ColorRGB[];\n subsurfaceScatterAnisotropy: number[];\n fuzzWeight: number[];\n fuzzColor: ColorRGB[];\n fuzzRoughness: number[];\n coatWeight: number[];\n coatColor: ColorRGB[];\n coatRoughness: number[];\n coatAnisotropy: number[];\n coatIor: number[];\n coatDarkening: number[];\n thinFilmWeight: number[];\n dispersionAbbeNumber: number[];\n mediumExtinction: ColorRGB[];\n mediumScattering: ColorRGB[];\n mediumAnisotropy: number[];\n}\n\nfunction clampColor(color: ArrayLike<number>, fallback = 0): ColorRGB {\n return [0, 1, 2].map((channel) => {\n const value = Number(color[channel]);\n return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;\n }) as ColorRGB;\n}\n\ntype OpenPbrMedium = {\n anisotropy: number;\n extinction: ColorRGB;\n scattering: ColorRGB;\n};\n\nfunction emptyOpenPbrMedium(): OpenPbrMedium {\n return {\n anisotropy: 0,\n extinction: [0, 0, 0],\n scattering: [0, 0, 0]\n };\n}\n\nfunction transmissionMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.transmissionWeight));\n const depth = Math.max(0, material.transmissionDepth);\n if (weight <= 0 || depth <= 0 || material.thinWalled) return undefined;\n\n const color = clampColor(material.transmissionColor, 1);\n const scatterColor = clampColor(material.transmissionScatter);\n const extinction = color.map((channel) =>\n Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth)\n ) as ColorRGB;\n const scattering = scatterColor.map((channel, index) =>\n extinction[index] * channel\n ) as ColorRGB;\n return {\n anisotropy: Math.min(\n 0.999,\n Math.max(-0.999, material.transmissionScatterAnisotropy)\n ),\n extinction,\n scattering\n } satisfies OpenPbrMedium;\n}\n\nfunction subsurfaceMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));\n if (weight <= 0 || material.thinWalled) return undefined;\n\n // OpenPBR's radius is the extinction mean free path. The van de Hulst\n // mapping converts the artist-facing multiple-scattering color to a\n // single-scattering albedo while compensating for phase anisotropy.\n const radius = Math.max(material.subsurfaceRadius, 1e-3);\n const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);\n const color = clampColor(material.subsurfaceColor);\n const anisotropy = Math.min(\n 0.999,\n Math.max(-0.999, material.subsurfaceAnisotropy)\n );\n const extinction = radiusScale.map(\n (scale) => 1 / Math.max(radius * scale, 1e-3)\n ) as ColorRGB;\n const scattering = color.map((channel, index) => {\n const s = 4.09712 + 4.20863 * channel - Math.sqrt(\n 9.59217 + 41.6808 * channel + 17.7126 * channel * channel\n );\n const sSquared = s * s;\n const albedo = Math.min(\n 1,\n Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared))\n );\n return extinction[index] * albedo;\n }) as ColorRGB;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction combineOpenPbrMedia(\n material: OpenPBRMaterial,\n transmission: OpenPbrMedium | undefined,\n subsurface: OpenPbrMedium | undefined\n) {\n const transmissionFraction = transmission\n ? Math.min(1, Math.max(0, material.transmissionWeight))\n : 0;\n const subsurfaceFraction = subsurface\n ? (1 - transmissionFraction)\n * Math.min(1, Math.max(0, material.subsurfaceWeight))\n : 0;\n const total = transmissionFraction + subsurfaceFraction;\n if (total <= 0) return undefined;\n\n const transmissionWeight = transmissionFraction / total;\n const subsurfaceWeight = subsurfaceFraction / total;\n const extinction = [0, 1, 2].map((channel) => {\n const transmissionAbsorption = transmission\n ? transmission.extinction[channel] - transmission.scattering[channel]\n : 0;\n const subsurfaceAbsorption = subsurface\n ? subsurface.extinction[channel] - subsurface.scattering[channel]\n : 0;\n const absorption = transmissionAbsorption * transmissionWeight\n + subsurfaceAbsorption * subsurfaceWeight;\n const scattering = (transmission?.scattering[channel] || 0)\n * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight;\n return Math.max(0, absorption + scattering);\n }) as ColorRGB;\n const scattering = [0, 1, 2].map((channel) =>\n (transmission?.scattering[channel] || 0) * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight\n ) as ColorRGB;\n const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight\n + (subsurface?.anisotropy || 0) * subsurfaceWeight;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction openPbrMedium(material: OpenPBRMaterial) {\n const volume = combineOpenPbrMedia(\n material,\n transmissionMedium(material),\n subsurfaceMedium(material)\n );\n return volume ?? emptyOpenPbrMedium();\n}\n\nclass MaterialTable {\n texture: WebGLTexture2DArray | undefined;\n textureAtlasStats: TextureAtlasStats;\n\n defines: Record<string, string | number> = {};\n\n bufferData: BufferData;\n\n private _matBufferTex = new Texture2D(commonNearestFloatProps);\n private _materialBufferColumnsLog: number = 0;\n\n private _displacementMaps: Texture[] = [];\n private _lightTexturesIndices: number[] = [];\n\n constructor(\n materials: OpenPBRMaterial[],\n lights: SceneLight[],\n options: MaterialTableOptions = {}\n ) {\n const maps = mergeTexturesFromMaterials(materials, MATERIAL_TEXTURE_NAMES);\n this._displacementMaps =\n maps.indices.displacementMap\n .map((idx) => {\n return maps.textures[idx];\n })\n .filter((a) => !!a);\n\n const bufferData = this._packParams(materials);\n\n const allTextures = maps.textures.slice();\n const lightTexturesIndices: number[] = [];\n for (let i = 0; i < lights.length; i++) {\n const light = lights[i];\n if (light.type === 'RectLight' && light.texture) {\n lightTexturesIndices.push(allTextures.length);\n allTextures.push(light.texture);\n } else {\n lightTexturesIndices.push(-1);\n }\n }\n const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, stats, texture } = makeTextureArray(\n allTextures,\n false,\n options\n );\n\n this.texture = texture;\n this.textureAtlasStats = stats;\n bufferData.mapInfo = mapInfo;\n bufferData.mapTransform = mapTransform;\n bufferData.mapUvChannel = mapUvChannel;\n bufferData.mapColorLinear = mapColorLinear;\n for (const slot of MATERIAL_TEXTURE_SLOTS) {\n bufferData[slot.index] = maps.indices[slot.property];\n }\n\n this.bufferData = bufferData;\n\n this._lightTexturesIndices = lightTexturesIndices;\n\n function countMaps(indices: number[]) {\n return indices.filter((idx) => idx >= 0).length;\n }\n\n this.defines = {\n NUM_MAPS: allTextures.length,\n ...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define\n ? [[slot.define, countMaps(maps.indices[slot.property])]] : []))\n };\n\n this._updateBuffer();\n }\n\n private _packParams(materials: OpenPBRMaterial[]) {\n const media = materials.map(openPbrMedium);\n return {\n color: materials.map((m) => m.baseColor.slice(0, 3) as ColorRGB),\n roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),\n emission: materials.map(materialEmission),\n metallic: materials.map((m) => m.baseMetalness),\n ior: materials.map((m) => m.specularIor),\n dispersion: materials.map((m) => m.transmissionDispersionScale),\n thin: materials.map((m) => +m.thinWalled),\n bevelSize: materials.map((m) => m.bevelSize),\n transmission: materials.map((m) => m.transmissionWeight),\n anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),\n specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),\n thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),\n thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),\n thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),\n thinFilmIor: materials.map((m) => m.thinFilmIor),\n normalScale: materials.map((m) => m.normalScale),\n mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),\n type: materials.map((m) => {\n if (m.shadowCatcher) {\n return ShadowCatcherMaterial;\n }\n if (m.unlit) {\n return UnlitMaterial;\n }\n // Standard material\n return 0;\n }),\n // Retain mediumType until both legacy readers are migrated; the\n // direction and coat-normal inputs are reserved for later C1 steps.\n mediumType: materials.map((m) => Number(materialUsesMedium(m))),\n specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),\n coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),\n coatNormalScale: materials.map(m => m.coatNormalScale),\n uvProjection: materials.map(\n (m) => uvProjectionConstants[m.uvProjection] || 0\n ),\n uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),\n\n displacementUvProjection: materials.map(\n (m) => uvProjectionConstants[m.displacementUvProjection] || 0\n ),\n displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),\n displacementBias: materials.map((m) => m.displacementBias),\n displacementStepSize: materials.map(\n (m) => Number.isFinite(m.displacementStepSize) && m.displacementStepSize > 0 ? m.displacementStepSize : 0\n ),\n\n // Alpha\n alpha: materials.map((m) => m.opacity),\n alphaMode: materials.map(\n (m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]\n ),\n alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),\n doubleSided: materials.map((m) => Number(m.doubleSided)),\n\n baseWeight: materials.map((m) => m.baseWeight),\n baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),\n specularWeight: materials.map((m) => m.specularWeight),\n specularColor: materials.map((m) => clampColor(m.specularColor, 1)),\n transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),\n transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),\n transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),\n transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),\n subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),\n subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),\n subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),\n subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),\n subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),\n fuzzWeight: materials.map((m) => m.fuzzWeight),\n fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),\n fuzzRoughness: materials.map((m) => m.fuzzRoughness),\n coatWeight: materials.map((m) => m.coatWeight),\n coatColor: materials.map((m) => clampColor(m.coatColor, 1)),\n coatRoughness: materials.map((m) => m.coatRoughness),\n coatAnisotropy: materials.map((m) => m.coatAnisotropy),\n coatIor: materials.map((m) => m.coatIor),\n coatDarkening: materials.map((m) => m.coatDarkening),\n thinFilmWeight: materials.map((m) => m.thinFilmWeight),\n dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),\n mediumExtinction: media.map((medium) => medium.extinction),\n mediumScattering: media.map((medium) => medium.scattering),\n mediumAnisotropy: media.map((medium) => medium.anisotropy),\n\n } as BufferData;\n }\n\n /** Repack parameters with the same material slots and unchanged texture metadata. */\n repackParams(materials: OpenPBRMaterial[]) {\n Object.assign(this.bufferData, this._packParams(materials));\n this._updateBuffer();\n }\n\n getBufferArray() {\n return packMaterialBuffer(this.bufferData);\n }\n\n getDisplacementMaps() {\n return this._displacementMaps;\n }\n\n getLightTexturesIndices() {\n return this._lightTexturesIndices;\n }\n\n private _updateBuffer() {\n this._materialBufferColumnsLog = setDataTexture(\n this._matBufferTex,\n this.getBufferArray(),\n 4\n ).columnsLog;\n }\n\n setToPass(pass: {\n setUniform(label: string, value: unknown): unknown;\n setUniforms(values: Record<string, unknown>): void;\n }) {\n pass.setUniform('map', this.texture || null);\n pass.setUniform('mapInfo', this.bufferData.mapInfo);\n pass.setUniform('mapTransform', this.bufferData.mapTransform);\n pass.setUniform('mapUvChannel', this.bufferData.mapUvChannel);\n pass.setUniform('mapColorLinear', this.bufferData.mapColorLinear);\n pass.setUniforms({\n materialBuffer: this._matBufferTex,\n materialBufferColumns: this._materialBufferColumnsLog\n });\n }\n\n dispose(gl: WebGL2RenderingContext) {\n this.texture?.dispose(gl);\n this._matBufferTex.dispose(gl);\n }\n}\n\nexport default MaterialTable;\n"]}
@@ -61,7 +61,7 @@ function createDownsamplePass(device) {
61
61
  linearSampler: device.createSampler(linearSamplerDescriptor)
62
62
  },
63
63
  fsDefine: /*wgsl*/ `
64
- fn vL(c: vec3f) -> f32 {
64
+ fn vM(c: vec3f) -> f32 {
65
65
  return max(max(c.r, c.g), c.b);
66
66
  }
67
67
  `,
@@ -96,16 +96,16 @@ function createGaussianPass(device) {
96
96
  linearSampler: device.createSampler(linearSamplerDescriptor)
97
97
  },
98
98
  fsDefine: /*wgsl*/ `
99
- const vP = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
99
+ const vQ = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
100
100
  `,
101
101
  fsMain: /*wgsl*/ `
102
- let vE = vec2f(colorTexRegion());
103
- let off = direction / vE * size;
102
+ let vF = vec2f(colorTexRegion());
103
+ let off = direction / vF * size;
104
104
 
105
105
  var sum = vec4f(0.0);
106
106
  var sU = 0.0;
107
107
  for (var i = 0; i < 9; i++) {
108
- let w = vP[i];
108
+ let w = vQ[i];
109
109
  sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
110
110
  sU += w;
111
111
  }
@@ -128,9 +128,9 @@ function createBlendPass(device) {
128
128
  linearSampler: device.createSampler(linearSamplerDescriptor)
129
129
  },
130
130
  fsMain: /*wgsl*/ `
131
- let vM = sample_colorTex1_linearSampler(uv2);
132
- let vN = sample_colorTex2_linearSampler(uv2);
133
- output.color = mix(vM, vN, weight);
131
+ let vN = sample_colorTex1_linearSampler(uv2);
132
+ let vO = sample_colorTex2_linearSampler(uv2);
133
+ output.color = mix(vN, vO, weight);
134
134
  `
135
135
  });
136
136
  }
@@ -245,8 +245,8 @@ let qi = hn / totalWeight - ez * mean.rgb;
245
245
 
246
246
  let qs = bs.rgb + ez * gP;
247
247
  let ol = mean.rgb * gP / max(qs, vec3f(${JNLM_ALBEDO_FLOOR}));
248
- let vk = clamp(qi / (ll + vec3f(${JNLM_ALBEDO_REGULARIZATION})), vec3f(0.0), ol);
249
- let rn = mean.rgb - vk * ez;
248
+ let vm = clamp(qi / (ll + vec3f(${JNLM_ALBEDO_REGULARIZATION})), vec3f(0.0), ol);
249
+ let rn = mean.rgb - vm * ez;
250
250
  let filtered = vec4f(max(rn, vec3f(0.0)), max(mean.a, 0.0));
251
251
  let rgb = select(
252
252
  center.rgb,
@@ -32,12 +32,12 @@ var idx = fM.x + fM.y * size.x;
32
32
 
33
33
 
34
34
  if (sampleCount < 1.0 && normalBuffer[idx].a <= 0.0) {
35
- let uO = max(sampleTileGrid, vec2u(1u));
36
- let uy = min(
37
- ((fM + uO / 2u) / uO) * uO,
38
- ((size - vec2u(1u)) / uO) * uO
35
+ let uQ = max(sampleTileGrid, vec2u(1u));
36
+ let uA = min(
37
+ ((fM + uQ / 2u) / uQ) * uQ,
38
+ ((size - vec2u(1u)) / uQ) * uQ
39
39
  );
40
- let sr = uy.x + uy.y * size.x;
40
+ let sr = uA.x + uA.y * size.x;
41
41
  if (normalBuffer[sr].a > 0.0) {
42
42
  idx = sr;
43
43
  }
@@ -1802,7 +1802,7 @@ ${rayTraceCompute({
1802
1802
  for (const geometry of this._geometriesNeedRefit) {
1803
1803
  const usesDisplacement = meshes.some((mesh) => mesh.geometry === geometry &&
1804
1804
  !!mesh.materials[0]?.displacementMap &&
1805
- Math.abs(mesh.materials[0].displacementScale) > 1e-6);
1805
+ (mesh.materials[0].displacementScale !== 0 || mesh.materials[0].displacementBias !== 0));
1806
1806
  if (usesDisplacement || geometryTopologyChanged(this._preparedMeshData, geometry) || !getGeometryBvh(geometry) || !refitBLAS(getGeometryBvh(geometry), geometry)) {
1807
1807
  setGeometryBvh(geometry, undefined);
1808
1808
  }