@meimu/mutracer 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -16
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +240 -232
- package/docs/progressive-rendering.md +24 -8
- package/docs/threejs.md +3 -2
- package/lib/Display.d.ts +1 -1
- package/lib/Display.js +4 -2
- package/lib/Display.js.map +1 -1
- package/lib/Render.d.ts +9 -0
- package/lib/Render.js +84 -13
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +5 -2
- package/lib/RenderLoop.js +47 -15
- package/lib/RenderLoop.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPURenderingPipeline.js +4 -2
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/committedScene.js +11 -6
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +4 -0
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/util.d.ts +2 -2
- package/lib/renderer/util.js +3 -3
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +6 -2
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +5 -0
- package/lib/util/fromTHREE.js +64 -16
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
package/lib/Render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Render.js","sourceRoot":"","sources":["../src/Render.ts"],"names":[],"mappings":"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","sourcesContent":["import { Events } from './util/events.js';\nimport type Engine from './Engine.js';\nimport type Camera from './scene/Camera.js';\nimport { cameraSnapshot } from './renderer/cameraSnapshot.js';\nimport type { AlphaBlendStrategy } from './renderer/RenderingPipeline.js';\nimport { collectTraceSettings, imageSettingsKey } from './settings/render.js';\nimport type { SamplingPattern } from './renderer/sampling.js';\nimport type { RenderTarget, TraceSettings } from './renderer/renderPipeline.js';\nimport type {DenoiserHandle, OwnedDenoiser} from './renderer/denoiser.js';\nimport type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';\nimport { DEFAULT_JNLM_OPTIONS, createJNLMDenoiser, type JNLMOptions } from './renderer/jnlm.js';\nimport type { OfflineAdaptiveSamplingOptions, OfflineVarianceHistory } from './renderer/OfflineAdaptiveSampling.js';\nimport { nextPreviewScale } from './renderer/util.js';\n\n/** Complete-sample notification, including the backend's measured sample time. */\nexport interface SampleEvent { samples: number; isFirstFrame: boolean; frameTimeMs: number; }\n/** State of one independent accumulation. Default preparing. */\nexport type RenderStatus = 'preparing' | 'compiling' | 'converging' | 'denoising' | 'finished' | 'error';\n/** When a render filters its complete samples. Default converged. */\nexport type DenoiseSchedule = 'converged' | 'progressive' | 'every-sample';\n/** Caller-owned WebGPU filter. Render/Engine never dispose it; calls on one engine are serialized. */\nexport interface Denoiser {\n /** Optional preallocation before first use or after device/dimension changes. Default undefined. The device may change after recovery; recreate device-owned resources then. */\n prepare?(input: {device: GPUDevice; width: number; height: number}): Promise<void>;\n /** Write all output RGB, then resolve after submitting GPU work. Abort on input changes, restart, replacement or disposal; aborted results are discarded even if this resolves. Buffers are borrowed until settlement; do not retain or destroy them. */\n denoise(input: DenoiseInput, context: {signal: AbortSignal; schedule: DenoiseSchedule}): Promise<void>;\n}\n/** Borrowed, tightly packed rgba32float buffers, top row first, width*height*16 bytes of image data. */\nexport interface DenoiseInput {\n /** Engine WebGPU device; may change after device loss/recovery. */ device: GPUDevice;\n /** Actual internal width, including backend alignment. */ width: number;\n /** Actual internal height, including backend alignment. */ height: number;\n /** Read-only native resolved linear HDR ray color, before exposure, grading, tone mapping, vignette, bloom and display background/catcher composition. RGB uses native hit-count normalization (flat primary misses are averaged by samples); alpha is raw path coverage. Usage STORAGE | COPY_SRC | COPY_DST. */ color: GPUBuffer;\n /** Read-only resolved linear RGB albedo averaged over complete samples; alpha is primary-hit coverage. Same packing/usage as color. */ albedo: GPUBuffer;\n /** Read-only resolved world-space RGB normal encoded as averaged normal*.5+.5, without renormalizing; alpha 1 for a valid surface, otherwise zero RGBA. Same packing/usage as albedo. */ normal: GPUBuffer;\n /** Write linear HDR RGB here. Same packing/usage as color; alpha is ignored and original path coverage is retained. */ output: GPUBuffer;\n}\n/** Third-party WebGPU filter; ignored with one warning on WebGL. */\nexport interface CustomDenoiserOptions {\n /** Required implementation selector. */ type: 'custom';\n /** Required caller-owned instance, keyed by object identity; never serialized or released by Render/Engine. */ denoiser: Denoiser;\n /** When to filter complete samples. Default converged. */ schedule?: DenoiseSchedule;\n}\n/** Built-in joint non-local means filter on both backends. */\nexport interface JNLMDenoiserOptions extends JNLMOptions {\n /** Required implementation selector. */ type: 'jnlm';\n /** When to filter complete samples. Default converged. */ schedule?: DenoiseSchedule;\n}\n/** Loading and execution options shared by both OIDN network sources. */\ninterface OIDNSettings {\n /** Required implementation selector. */ type: 'oidn';\n /** When to filter complete samples. Default converged. */ schedule?: DenoiseSchedule;\n /** Override albedo and normal prefilter networks. Default packaged filters for cleanAuxLarge, otherwise undefined. */ auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n /** Execution backend. Default auto (native WGSL unless WebNN is selected). */ engine?: OIDNEngine;\n /** WGSL precision. Default auto (fp16 when shader-f16 is available). */ precision?: OIDNPrecision;\n /** Adaptive tile controller. Default enabled with minTileSize 256, initialTileSize 432, targetTileTimeMs 16, adjustmentStep 16. */ dynamicTile?: OIDNDynamicTileSetting;\n /** Maximum OIDN tile size. Default chosen by oidn-web. */ maxTileSize?: number;\n /** Abort weight downloads. Default undefined; does not distinguish cached networks. */ signal?: AbortSignal;\n}\n/** OIDN configuration on WebGPU: choose a packaged model or an explicit network URL. */\nexport type OIDNDenoiserOptions = OIDNSettings & (\n | {\n /** Packaged network. Default standard. */ model?: OIDNModel;\n /** Weight directory override. Default bundled standard/small assets and CDN large weights. */ weightsBaseUrl?: string | URL;\n weightsUrl?: never; aux?: never; hdr?: never; hdrTransfer?: never;\n }\n | {\n /** Custom network file. Required in this branch; failures never fall back to CDN. */ weightsUrl: string | URL;\n /** Custom model consumes albedo and normal. Default true. */ aux?: boolean;\n /** Custom model consumes HDR color. Default true. */ hdr?: boolean;\n /** Custom model HDR encoding. Default pu. */ hdrTransfer?: OIDNHDRTransfer;\n model?: never; weightsBaseUrl?: never;\n }\n);\n/** Assign a complete configuration, or null to disable denoising. The type selector is required. */\nexport type DenoiserOptions = JNLMDenoiserOptions | OIDNDenoiserOptions | CustomDenoiserOptions;\n\n/** Optional per-render execution and image-quality settings. */\nexport interface RenderSettings {\n /** Maximum complete samples. Default 2048. */ maxSamples?: number;\n /**\n * Maximum scattering depth, rounded and clamped to [1, 20] (NaN becomes 1).\n * Total path events, including transmission and alpha skips, are capped at 20\n * and at three times this depth. Intel Mac WebGL uses min(depth, 3), doubled\n * for scenes with transmission or alpha, with its existing early termination.\n * Default 3.\n */ bounces?: number;\n /** Radiance clamp; 0 disables it. Default 0. */ clamping?: number;\n /** Sampling sequence. Default sobol. */ samplingPattern?: SamplingPattern;\n /** Light candidates per vertex; WebGPU only, ignored on WebGL. Default 4. */ directLightCandidates?: number;\n /** Rounded material edges. Default true. */ bevel?: boolean;\n /** Bevel neighborhood probes, clamped to 1–32. Default 8. */ bevelSamples?: number;\n /** Wavelengths per dispersion sample. Default 3; 1 selects one random wavelength. */ dispersionWavelengths?: 1 | 3;\n /** Primary-ray alpha blend strategy; WebGPU only. Default stochastic. */ alphaBlendStrategy?: AlphaBlendStrategy;\n /** Minimum transmissive path alpha, using path depth. Default 1. Changes restart this accumulation. */ transmissiveOutputAlphaMin?: number;\n /** Tile execution budget in milliseconds. Default 21. */ timeBudgetMs?: number;\n /** Maximum tiles per frame. Default Infinity. */ maxTiles?: number;\n /** Accumulate multiple samples when frame time permits. Default false. */ allowMultipleSamplesPerFrame?: boolean;\n /** Adapt scale to frame timing; minScale must not exceed resolutionScale. Default false. */ adaptiveResolution?: {targetFrameMs: number; minScale: number} | false;\n /** Single-level fallback on the same engine. Default null. */ fallback?: Render | null;\n /** Denoising configuration. Default null. */ denoiser?: DenoiserOptions | null;\n}\n/** Constructor options: fixed dimensions and canvas-relative scale are mutually exclusive. */\nexport type RenderOptions = RenderSettings & (\n | { /** Fixed width in pixels, paired with height. */ width: number; /** Fixed height in pixels, paired with width. */ height: number; resolutionScale?: never }\n | { /** Canvas-relative resolution scale. Default 1. */ resolutionScale?: number; width?: never; height?: never }\n);\n/** Deterministic offline execution options. */\nexport interface ConvergeOptions {\n /** Final complete-sample budget. Required. */ samples: number;\n /** Camera override for this output only, copied on entry. Default committed engine camera. */ camera?: Camera;\n /** Two-stage variance sampling; WebGPU only, ignored on WebGL. Default undefined. */ adaptiveSampling?: Omit<OfflineAdaptiveSamplingOptions, 'maxSamples'>;\n /** Deterministic sequence base. Default 0. */ sampleSequenceOffset?: number;\n /** Maximum samples per submission batch. Default 8. */ samplesPerBatch?: number;\n /** WebGPU target batch completion time in milliseconds. Default undefined (fixed batch size). */ targetBatchTimeMs?: number;\n /** Delay between intermediate resolved images in milliseconds. Default undefined (resolve only at the end). */ previewIntervalMs?: number;\n /** Batch progress callback. Default undefined. */ onProgress?: (progress: {stage: 'pilot' | 'final' | 'denoising'; samples: number; targetSamples: number}) => void;\n /** Cancels the task. Default undefined. */ signal?: AbortSignal;\n /** Timeout per stage in milliseconds. Default 600000. */ timeoutMs?: number;\n}\n/** Result of deterministic offline convergence. */\nexport interface ConvergeResult {\n samples: number; averageSamplesPerPixel: number; pilotSamples: number;\n varianceHistory?: OfflineVarianceHistory; adaptiveSampling: boolean;\n}\n\nlet oidnModule: Promise<typeof import('./renderer/oidnNetwork.js')> | undefined;\nconst loadOIDN = () => oidnModule ??= import('./renderer/oidnNetwork.js');\n\nfunction validateDenoiserOptions(options: DenoiserOptions) {\n if (!options || typeof options !== 'object' || (options.type !== 'jnlm' && options.type !== 'oidn' && options.type !== 'custom')) throw new Error('Denoiser type must be jnlm, oidn or custom.');\n const allowed = options.type === 'jnlm'\n ? ['type', 'schedule', ...Object.keys(DEFAULT_JNLM_OPTIONS)]\n : options.type === 'custom' ? ['type', 'schedule', 'denoiser']\n : ['type', 'schedule', 'model', 'weightsBaseUrl', 'weightsUrl', 'aux', 'hdr', 'hdrTransfer', 'auxiliaryModelUrls', 'engine', 'precision', 'dynamicTile', 'maxTileSize', 'signal'];\n for (const key of Object.keys(options)) if (!allowed.includes(key)) throw new Error(`Denoiser field ${key} does not belong to ${options.type}.`);\n if (options.schedule !== undefined && !['converged', 'progressive', 'every-sample'].includes(options.schedule)) throw new Error('Unknown denoise schedule.');\n if (options.type === 'jnlm') createJNLMDenoiser(options);\n else if (options.type === 'custom') {\n if (!options.denoiser || typeof options.denoiser !== 'object' || typeof options.denoiser.denoise !== 'function' || (options.denoiser.prepare !== undefined && typeof options.denoiser.prepare !== 'function')) throw new Error('Custom denoiser must implement denoise and optional prepare.');\n } else {\n if (options.weightsUrl !== undefined) {\n if (options.model !== undefined || options.weightsBaseUrl !== undefined) throw new Error('weightsUrl is mutually exclusive with model and weightsBaseUrl.');\n } else if (options.aux !== undefined || options.hdr !== undefined || options.hdrTransfer !== undefined) throw new Error('aux, hdr and hdrTransfer require weightsUrl.');\n for (const key of ['weightsUrl', 'weightsBaseUrl'] as const) if (options[key] !== undefined && !isURL(options[key])) throw new Error(`${key} must be a nonempty string or URL.`);\n if (options.auxiliaryModelUrls !== undefined) {\n const urls = options.auxiliaryModelUrls;\n if (!urls || !isURL(urls.albedo) || !isURL(urls.normal) || Object.keys(urls).some(key => !['albedo', 'normal'].includes(key))) throw new Error('auxiliaryModelUrls requires only albedo and normal URLs.');\n }\n for (const [key, values] of [['engine', ['auto', 'wgsl', 'webnn']], ['precision', ['auto', 'fp32', 'fp16']], ['hdrTransfer', ['pu', 'log']]] as const) {\n if (options[key] !== undefined && !(values as readonly string[]).includes(options[key]!)) throw new Error(`Unknown OIDN ${key}.`);\n }\n for (const key of ['aux', 'hdr'] as const) if (options[key] !== undefined && typeof options[key] !== 'boolean') throw new Error(`${key} must be boolean.`);\n if (options.dynamicTile !== undefined && typeof options.dynamicTile !== 'boolean') {\n if (!options.dynamicTile || typeof options.dynamicTile !== 'object') throw new Error('dynamicTile must be boolean or tile settings.');\n for (const [key, value] of Object.entries(options.dynamicTile)) {\n if (!['minTileSize', 'initialTileSize', 'targetTileTimeMs', 'adjustmentStep'].includes(key) || (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || value <= 0))) throw new Error(`Invalid dynamicTile ${key}.`);\n }\n }\n if (options.model !== undefined && !['standard', 'small', 'cleanAuxLarge'].includes(options.model)) throw new Error('Unknown OIDN model.');\n if (options.maxTileSize !== undefined && (!Number.isInteger(options.maxTileSize) || options.maxTileSize < 1)) throw new Error('maxTileSize must be a positive integer.');\n }\n}\n\nfunction isURL(value: unknown): value is string | URL { return (typeof value === 'string' && value.length > 0) || value instanceof URL; }\n\n// Snapshot nested values too, so application edits cannot silently change a cache key.\nfunction snapshotDenoiserOptions(options: DenoiserOptions): Readonly<DenoiserOptions> {\n if (options.type !== 'oidn') return Object.freeze({...options});\n const next: OIDNDenoiserOptions = {...options};\n if (options.weightsBaseUrl !== undefined) next.weightsBaseUrl = String(options.weightsBaseUrl);\n if (options.weightsUrl !== undefined) next.weightsUrl = String(options.weightsUrl);\n if (options.auxiliaryModelUrls !== undefined) next.auxiliaryModelUrls = Object.freeze({albedo: String(options.auxiliaryModelUrls.albedo), normal: String(options.auxiliaryModelUrls.normal)});\n if (typeof options.dynamicTile === 'object') next.dynamicTile = Object.freeze({...options.dynamicTile});\n return Object.freeze(next);\n}\n\nfunction denoiserKey(options: Readonly<DenoiserOptions>): string | Denoiser {\n if (options.type === 'custom') return options.denoiser;\n if (options.type === 'jnlm') return JSON.stringify({type: 'jnlm', ...Object.fromEntries(Object.entries(DEFAULT_JNLM_OPTIONS).map(([key, value]) => [key, options[key as keyof JNLMOptions] ?? value]))});\n const tile = options.dynamicTile;\n return JSON.stringify({type: 'oidn',\n ...(options.weightsUrl === undefined ? {model: options.model ?? 'standard', weightsBaseUrl: options.weightsBaseUrl?.toString()} : {weightsUrl: String(options.weightsUrl), aux: options.aux ?? true, hdr: options.hdr ?? true, hdrTransfer: options.hdrTransfer ?? 'pu'}),\n auxiliaryModelUrls: options.auxiliaryModelUrls && {albedo: String(options.auxiliaryModelUrls.albedo), normal: String(options.auxiliaryModelUrls.normal)},\n maxTileSize: options.maxTileSize, engine: options.engine ?? 'auto', precision: options.precision ?? 'auto',\n dynamicTile: tile === false ? false : {minTileSize: typeof tile === 'object' ? tile.minTileSize ?? 256 : 256,\n initialTileSize: typeof tile === 'object' ? tile.initialTileSize ?? 432 : 432,\n targetTileTimeMs: typeof tile === 'object' ? tile.targetTileTimeMs ?? 16 : 16,\n adjustmentStep: typeof tile === 'object' ? tile.adjustmentStep ?? 16 : 16}\n });\n}\n\n/** One independently configured image and its accumulation, owned by an engine. */\nexport default class Render {\n /** Maximum complete samples. Default 2048. */ maxSamples = 2048;\n /**\n * Maximum scattering depth, rounded and clamped to [1, 20] (NaN becomes 1).\n * Total path events, including transmission and alpha skips, are capped at 20\n * and at three times this depth. Intel Mac WebGL uses min(depth, 3), doubled\n * for scenes with transmission or alpha, with its existing early termination.\n * Default 3.\n */ bounces = 3;\n /** Per-sample radiance clamp; 0 disables it. Default 0. */ clamping = 0;\n /** Sampling sequence. Default sobol. */ samplingPattern: SamplingPattern = 'sobol';\n /** WebGPU light candidates per vertex; ignored on WebGL. Default 4. */ directLightCandidates = 4;\n /** Rounded material edges. Default true. */ bevel = true;\n /** Bevel probes, clamped to 1–32. Default 8. */ bevelSamples = 8;\n /** Dispersion wavelengths per sample. Default 3. */ dispersionWavelengths: 1 | 3 = 3;\n /** WebGPU primary-ray alpha policy; ignored on WebGL. Default stochastic. */ alphaBlendStrategy: AlphaBlendStrategy = 'stochastic';\n /** Minimum transmissive path alpha. Default 1. Changing it restarts this render. */ transmissiveOutputAlphaMin = 1;\n /** Execution budget in milliseconds. Default 21. */ timeBudgetMs = 21;\n /** Maximum tiles per frame. Default Infinity. */ maxTiles = Infinity;\n /** Allow several samples per frame when possible. Default false. */ allowMultipleSamplesPerFrame = false;\n /** Adaptive resolution controller, or false. Default false. */ adaptiveResolution: {targetFrameMs: number; minScale: number} | false = false;\n private _resolutionScale = 1;\n /** Canvas-relative scale. Default 1; cannot be assigned on a fixed-size render. */\n get resolutionScale() { return this._resolutionScale; }\n set resolutionScale(value: number) {\n if (this._fixed) throw new Error('Fixed-size renders cannot use resolutionScale.');\n if (!Number.isFinite(value) || value <= 0) throw new Error('resolutionScale must be positive.');\n this._resolutionScale = value;\n }\n private _fallback: Render | null = null;\n /** Single-level fallback on this engine. Default null; chains and cycles are rejected. */\n get fallback() { return this._fallback; }\n set fallback(value: Render | null) {\n if (value && (value._engine !== this._engine || value === this || value.fallback)) throw new Error('Fallback must be a render on the same engine with no fallback.');\n if (value && this._dependents.size) throw new Error('Fallback renders cannot have their own fallback.');\n this._fallback?._dependents.delete(this);\n this._fallback = value; value?._dependents.add(this);\n }\n private _dependents = new Set<Render>();\n private _denoiserOptions: Readonly<DenoiserOptions> | null = null;\n /** Frozen configuration snapshot. Default null. Change it with {@link Render.setDenoiser}. */\n get denoiser(): Readonly<DenoiserOptions> | null { return this._denoiserOptions; }\n /**\n * Replaces the denoising configuration; null disables denoising. Invalid options throw synchronously\n * before replacing any state. Resolves when the filter is ready to use (after OIDN weights load) or this\n * configuration is replaced; rejects when loading fails. An equal configuration returns the current\n * promise without reloading.\n */\n setDenoiser(options: DenoiserOptions | null): Promise<void> {\n if (options !== null) validateDenoiserOptions(options);\n const next = options ? snapshotDenoiserOptions(options) : null;\n const current = this._denoiserOptions;\n if (current === null && next === null) return this._denoiserReady;\n if (next && current && denoiserKey(next) === denoiserKey(current)\n && next.schedule === current.schedule && (next.type !== 'oidn' ||\n (current.type === 'oidn' && next.signal === current.signal))) return this._denoiserReady;\n this._denoiserOptions = next;\n return this._refreshDenoiser() ?? this._denoiserReady;\n }\n private _denoiserReady: Promise<void> = Promise.resolve();\n private _fixed?: {width: number; height: number};\n private _target?: RenderTarget;\n private _status: RenderStatus = 'preparing';\n private _disposed = false;\n private _busy = false;\n private _offlineCamera = false;\n private _input = {scene: -1, camera: -1, settings: ''};\n private _adaptiveScale = 1;\n private _lastScale = 1;\n private _frameTime = 0;\n private _events = new Events<{sample: SampleEvent}>();\n /** Owning engine. */ get engine(): Engine { return this._engine; }\n /** Whether inference is queued or running, including intermediate updates. Default false. */ get denoising(): boolean { return !!this._denoisePending; }\n /** Subscribes to every complete sample on this render; returns unsubscribe. */\n on(event: 'sample', listener: (value: SampleEvent) => void): () => void { return this._events.on(event, listener); }\n private _filter?: OwnedDenoiser | Extract<DenoiserHandle, {kind: 'custom'}>;\n private _filterKey: string | Denoiser = '';\n private _warnedWebGPUFilter = false;\n private _denoiseController?: AbortController;\n private _filterRevision = 0;\n private _filterPending?: Promise<void>;\n private _denoiseRevision = 0;\n private _denoisePending?: Promise<void>;\n private _denoisedSamples = 0;\n private _lastDenoiseTime = 0;\n private _warnedDenoisedReadback = false;\n /** @internal */ readonly _engine: Engine;\n\n constructor(engine: Engine, options: RenderOptions = {}) {\n this._engine = engine;\n if (options.denoiser != null) validateDenoiserOptions(options.denoiser);\n if ('width' in options || 'height' in options) {\n if ('resolutionScale' in options || !Number.isInteger(options.width) || !Number.isInteger(options.height) || options.width! < 1 || options.height! < 1) throw new Error('Provide positive integer width and height, or resolutionScale, exclusively.');\n this._fixed = {width: options.width!, height: options.height!};\n }\n const {width: _width, height: _height, resolutionScale, fallback, denoiser, ...settings} = options;\n Object.assign(this, settings);\n if (resolutionScale !== undefined) this.resolutionScale = resolutionScale;\n this._adaptiveScale = this._resolutionScale; this._lastScale = this._resolutionScale;\n this._validate(); this.fallback = fallback ?? null;\n engine._register(this);\n if (denoiser) void this.setDenoiser(denoiser).catch(error => this._engine._notifyError(error));\n }\n /** Actual target width; before allocation uses the requested dimensions. */ get width() { return this._target?.getMemory().width || this._size().width; }\n /** Actual target height; before allocation uses the requested dimensions. */ get height() { return this._target?.getMemory().height || this._size().height; }\n /** Complete samples since the last restart; stale engine inputs report 0. Default 0. */\n get samples() { return this._current ? this._target?.getTotalSamplesRendered() ?? 0 : 0; }\n /** Whether complete samples reached maxSamples. Default false. */ get converged() { return this.samples >= this.maxSamples; }\n /** Current execution state. Default preparing. */ get status(): RenderStatus {\n if (!this._current && this._status !== 'error') return this._engine._ready ? 'converging' : 'preparing';\n return this._status;\n }\n private get _current() { const inputs = this._engine._inputs; return inputs.scene === this._input.scene && inputs.camera === this._input.camera && !this._disposed; }\n /** @internal */ get _complete() { return this._current && !!this._target?.presentationComplete && !this._target.isFirstFrame() && this.samples > 0; }\n /** @internal */ get _output() { if (this._disposed) throw new Error('Render is disposed.'); return this._target; }\n private _validate() {\n if (!Number.isFinite(this.maxSamples) || this.maxSamples < 1) throw new Error('maxSamples must be positive.');\n if (this.dispersionWavelengths !== 1 && this.dispersionWavelengths !== 3) throw new Error('dispersionWavelengths must be 1 or 3.');\n const adaptive = this.adaptiveResolution;\n if (adaptive && (this._fixed || !Number.isFinite(adaptive.targetFrameMs) || adaptive.targetFrameMs <= 0 || !Number.isFinite(adaptive.minScale) || adaptive.minScale <= 0 || adaptive.minScale > this._resolutionScale)) throw new Error('adaptiveResolution requires a scale-based render with positive targetFrameMs and minScale <= resolutionScale.');\n }\n private _size() {\n if (this._fixed) return this._fixed;\n const scale = this.adaptiveResolution ? Math.min(this._adaptiveScale, this._resolutionScale) : this._resolutionScale;\n return {width: Math.max(1, Math.round(this._engine.display.canvas.width * scale)), height: Math.max(1, Math.round(this._engine.display.canvas.height * scale))};\n }\n private _settings(sampleCap = this.maxSamples): TraceSettings {\n return collectTraceSettings(this, sampleCap);\n }\n private _synchronize(sampleCap = this.maxSamples, offline = false) {\n this._validate();\n if (this._lastScale !== this._resolutionScale) { this._adaptiveScale = this._resolutionScale; this._lastScale = this._resolutionScale; }\n const target = this._target ??= this._engine._createTarget();\n if (!target) return;\n const settings = this._settings(sampleCap), size = this._size();\n const key = imageSettingsKey(settings, size);\n const inputs = this._engine._inputs;\n target.configure(settings); target.activate();\n if ((!offline && this._offlineCamera) || inputs.scene !== this._input.scene || inputs.camera !== this._input.camera || key !== this._input.settings) {\n if (!offline) this._offlineCamera = false;\n this._cancelDenoise(); target.restartSamples();\n target.setSize(size.width, size.height);\n this._input = {scene: inputs.scene, camera: inputs.camera, settings: key};\n }\n target.setOnSampleRendered((samples, isFirstFrame, frameTimeMs) => { this._frameTime = frameTimeMs; this._events.emit('sample', {samples, isFirstFrame, frameTimeMs}); });\n return target;\n }\n /** Accumulates within this frame's budget. Rejects calls during converge or after disposal. */\n refine(): RenderStatus {\n if (this._busy) throw new Error('Cannot refine a render while converge is running.');\n if (this._disposed) throw new Error('Render is disposed.');\n this._engine._setRenderError();\n try { return this._refine(); }\n catch (error) { this._engine._setRenderError(this._engine._notifyError(error)); return this._status = 'error'; }\n finally { this._engine._reportShaderProgress(); }\n }\n private _refine(): RenderStatus {\n if (this._engine._initializationError) throw this._engine._initializationError;\n this._reloadDenoiser();\n if (!this._engine._ready) {\n const generation = this._engine._deviceGeneration;\n void this._engine.init().catch(error => {\n if (this._disposed || generation !== this._engine._deviceGeneration) return;\n this._status = 'error'; this._engine._notifyError(error);\n });\n return this._status = 'preparing';\n }\n const target = this._synchronize();\n if (!target) return this._status = 'preparing';\n if (this._fallback && this.samples === 0 && !target.canCompleteSampleWithin(this.timeBudgetMs) && !this._fallback._complete) this._fallback._refineOne();\n target.activate();\n if (this._denoisePending) return this._status = this.converged ? 'denoising' : 'converging';\n target.setPreserveDenoisedOutput?.(!!this._filter && this._schedule() === 'progressive');\n const limit = this._nextSampleTarget();\n if (this.samples < limit) {\n if (target.trace(this._engine._inputs.value!, limit)) return this._status = 'compiling';\n }\n this._maybeDenoise(false, limit);\n if (this._denoisePending) return this._status = this.converged ? 'denoising' : 'converging';\n if (this._filterPending && this.converged) return this._status = 'preparing';\n if (this.adaptiveResolution && this._frameTime > 0 && this.samples > 0) this._adaptiveScale = nextPreviewScale(this._adaptiveScale, this._frameTime, this.adaptiveResolution.targetFrameMs, this._resolutionScale, this.adaptiveResolution.minScale);\n return this._status = this.converged ? 'finished' : 'converging';\n }\n private _refineOne() {\n if (this._busy || this._disposed || !this._engine._ready) return;\n this._reloadDenoiser(); const target = this._synchronize();\n if (!target) return;\n target.activate();\n if (this.samples < 1) this._status = target.trace(this._engine._inputs.value!, 1) ? 'compiling' : 'converging';\n this._maybeDenoise();\n }\n private _schedule() { return this._denoiserOptions?.schedule ?? 'converged'; }\n private _nextSampleTarget() {\n if (!this._filter) return this.maxSamples;\n if (this._schedule() === 'every-sample') return Math.min(this.maxSamples, this.samples + 1);\n if (this._schedule() === 'converged') return this.maxSamples;\n if (this._denoisedSamples === 0) return 1;\n if (performance.now() - this._lastDenoiseTime >= 10000) return Math.min(this.maxSamples, this.samples + 1);\n return Math.min(this.maxSamples, Math.max(4, this._denoisedSamples * 2));\n }\n /** Reloads a filter dropped by device recovery; failures report through engine errors. */\n private _reloadDenoiser() { void this._refreshDenoiser()?.catch(error => this._engine._notifyError(error)); }\n /** Starts loading the configured filter; returns its readiness when a new configuration was applied. */\n private _refreshDenoiser(): Promise<void> | undefined {\n if (this._disposed) return;\n const options = this._denoiserOptions;\n const key = options ? denoiserKey(options) : '';\n if (key === this._filterKey) return;\n this._filterKey = key; const revision = ++this._filterRevision;\n this._cancelDenoise();\n if (this._filter && this._filter.kind !== 'custom') this._engine._releaseDenoiser(this._filter);\n this._target?.invalidateDenoisedOutput();\n this._filter = undefined; this._filterPending = undefined;\n if (!options) return this._denoiserReady = Promise.resolve();\n if (options.type === 'jnlm') { this._filter = this._engine._retainDenoiser(`jnlm:${key}`, () => ({kind: 'jnlm', denoiser: createJNLMDenoiser(options)})); return this._denoiserReady = Promise.resolve(); }\n const task = (async () => {\n await this._engine.init();\n if (this._engine.backend !== 'webgpu') { if (revision === this._filterRevision && !this._warnedWebGPUFilter) { this._warnedWebGPUFilter = true; console.warn('This denoiser requires WebGPU; denoising is disabled for this render.'); } return; }\n if (revision !== this._filterRevision || this._disposed) return;\n if (options.type === 'custom') { this._filter = {kind: 'custom', denoiser: options.denoiser}; return; }\n const {loadOIDNNetwork} = await loadOIDN();\n const filter = await this._engine._acquireDenoiser(key as string, async () => ({kind: 'oidn', denoiser: await loadOIDNNetwork(this._engine, options)}));\n if (revision !== this._filterRevision || this._disposed) { this._engine._releaseDenoiser(filter); return; }\n this._filter = filter; this._warmDenoiser();\n })();\n this._filterPending = task;\n // Superseded or disposed loads resolve instead of reporting obsolete failures.\n return this._denoiserReady = task.catch(error => { if (revision === this._filterRevision && !this._disposed) throw error; })\n .finally(() => { if (this._filterPending === task) this._filterPending = undefined; });\n }\n private _warmDenoiser() {\n const filter = this._filter, revision = this._filterRevision;\n if (!filter || filter.kind !== 'oidn') return;\n const network = filter.denoiser;\n const filters = [network, network.auxiliaryDenoisers?.albedo, network.auxiliaryDenoisers?.normal];\n const width = this.width, height = this.height;\n const task = this._engine._enqueueDenoise(async () => {\n if (revision !== this._filterRevision || filter !== this._filter || this._disposed) return;\n await Promise.all(filters.map(network => network?.prepareForImage?.(width, height, {tileOverlap: this._schedule() === 'converged' ? undefined : 80})));\n });\n void task.catch(error => {\n if (revision === this._filterRevision && filter === this._filter && !this._disposed) this._engine._notifyError(error);\n });\n }\n\n private _cancelDenoise() { this._denoiseController?.abort(); this._denoiseController = undefined; this._denoiseRevision++; this._target?.cancelDenoise?.(); this._denoisePending = undefined; this._denoisedSamples = 0; }\n /** @internal */ _inputsChanged(resetTiming = false) { this._cancelDenoise(); if (resetTiming) this._target?.invalidateTiming?.(); }\n /** @internal */ _deviceLost(recovering: boolean) {\n this._cancelDenoise(); this._filterRevision++;\n this._filter = undefined; this._filterPending = undefined; this._filterKey = '';\n this._target = undefined; this._input = {scene: -1, camera: -1, settings: ''};\n this._status = recovering ? 'preparing' : 'error';\n }\n /** @internal */ _displayChanged() { this._cancelDenoise(); this._target?.invalidateDenoisedOutput(); }\n private _maybeDenoise(force = false, sampleTarget = this._nextSampleTarget()) {\n const target = this._target, filter = this._filter;\n if (!target || !filter || this._denoisePending || this.samples < 1 || this._denoisedSamples === this.samples) return;\n if (!force && this._schedule() === 'converged' && !this.converged) return;\n if (!force && this._schedule() === 'progressive' && this.samples < sampleTarget) return;\n this._engine.display._configure(this);\n target.activate(); target.drawPostProcess();\n const revision = ++this._denoiseRevision, samples = this.samples;\n const controller = this._denoiseController = new AbortController();\n // One shared scratch lease across all renders; queued stale jobs do no GPU work.\n const task = this._engine._enqueueDenoise(async () => {\n if (revision !== this._denoiseRevision || this._disposed) return;\n target.activate(); this._engine.display._configure(this);\n if (revision !== this._denoiseRevision || this._disposed) return;\n target.drawPostProcess();\n if (filter.kind === 'custom') {\n await this._engine._prepareCustomDenoiser(filter.denoiser, this.width, this.height);\n if (controller.signal.aborted || revision !== this._denoiseRevision || this._disposed) return;\n }\n const complete = await target.performDenoise?.(filter, undefined, this._schedule(), controller.signal);\n if (revision !== this._denoiseRevision || this._disposed) return;\n if (complete) { target.activate(); target.drawPostProcess(); this._denoisedSamples = samples; this._lastDenoiseTime = performance.now(); }\n });\n this._denoisePending = task;\n void task.catch(error => { if (revision === this._denoiseRevision && !this._disposed) this._engine._notifyError(error); }).finally(() => { if (this._denoisePending === task) { this._denoiseController = undefined; this._denoisePending = undefined; this._status = this.converged ? 'finished' : 'converging'; } });\n }\n /** Reads native RGBA float32, top row first. Default hdr. Custom denoised output is resolved linear HDR ray color before display background/catcher composition; built-ins retain their native display-space output. Unavailable denoised output falls back to hdr. */\n async readPixels(kind: 'hdr' | 'denoised' | 'albedo' | 'normal' = 'hdr') {\n if (this._disposed) throw new Error('Render is disposed.');\n const target = this._target;\n if (!target) return {width: 0, height: 0, data: new Float32Array(0)};\n if (kind === 'denoised' && this._denoisedSamples === 0) {\n if (!this._warnedDenoisedReadback) { this._warnedDenoisedReadback = true; console.warn('Denoised output is not ready; reading HDR samples instead.'); }\n kind = 'hdr';\n }\n target.activate(); return target.readOutput(kind);\n }\n /** Borrows a read-only WebGPU texture; undefined on WebGL or before a complete sample. Kind is required. HDR is native resolved linear ray color before denoising/display composition, with DenoiseInput.color normalization and coverage. Display is the latest compose, including filters and display passes. Valid only until this render's next refine/converge, display present/setSize, restart/dispose or device loss; never retain, write or destroy it. */\n getOutputTexture(kind: 'hdr' | 'display'): GPUTexture | undefined {\n if (!this._complete || this._engine.backend !== 'webgpu') return;\n return this._target?.getOutputTexture?.(kind);\n }\n /** Discards only this render's accumulation and pending denoising. */\n restart() { if (this._disposed) throw new Error('Render is disposed.'); this._cancelDenoise(); this._target?.restartSamples(); this._status = 'converging'; }\n /** Releases only this render's image resources and denoiser. */\n dispose() {\n if (this._disposed) return;\n this._disposed = true; this._events.clear(); this._filterRevision++; this._cancelDenoise();\n if (this._target) this._engine._releaseTarget(this._target);\n if (this._filter && this._filter.kind !== 'custom') this._engine._releaseDenoiser(this._filter);\n this._target = undefined; this._filter = undefined; this._engine._unregister(this);\n this._fallback?._dependents.delete(this);\n for (const dependent of this._dependents) dependent._fallback = null;\n this._dependents.clear();\n }\n /** Deterministically renders this image. Rejects on abort/timeout/input revision changes and blocks refine on this render. */\n async converge(options: ConvergeOptions): Promise<ConvergeResult> {\n if (this._busy) throw new Error('Converge is already running on this render.');\n if (this._disposed) throw new Error('Render is disposed.');\n const inputs = this._engine._inputs;\n const deviceGeneration = this._engine._deviceGeneration;\n if (!inputs.value) throw new Error('Commit engine.scene and engine.camera with engine.update() before converge.');\n const camera = cameraSnapshot(options.camera ?? inputs.value);\n const samples = Math.max(1, Math.round(options.samples));\n if (!Number.isFinite(samples)) throw new Error('samples must be finite and positive.');\n const batchLimit = Math.max(1, Math.round(options.samplesPerBatch ?? 8));\n const sequenceOffset = Math.max(0, Math.round(options.sampleSequenceOffset ?? 0));\n const timeout = Math.max(1, options.timeoutMs ?? 600000);\n const check = () => {\n if (this._disposed) throw new Error('Render is disposed.');\n if (this._engine._deviceGeneration !== deviceGeneration) throw this._engine._lostError;\n if (options.signal?.aborted) throw options.signal.reason ?? new DOMException('Convergence aborted', 'AbortError');\n const current = this._engine._inputs;\n if (current.scene !== inputs.scene || current.camera !== inputs.camera) throw new Error('Engine inputs changed during converge.');\n };\n this._busy = true;\n const abortConverge = () => this._cancelDenoise();\n options.signal?.addEventListener('abort', abortConverge, {once: true});\n let target: RenderTarget | undefined;\n const start = performance.now();\n try {\n await this._engine._awaitDevice(this._engine.init());\n check();\n while (!this._engine._ready) { check(); if (performance.now() - start > timeout) throw new Error('Timed out preparing convergence.'); await new Promise(resolve => setTimeout(resolve, 0)); }\n target = this._synchronize(samples, true);\n this._offlineCamera = !!options.camera;\n if (!target) throw new Error('The render target is not ready.');\n this._cancelDenoise(); target.restartSamples();\n this._reloadDenoiser(); await this._engine._awaitDevice(Promise.resolve(this._filterPending)); check();\n const stage = async (cap: number, name: 'pilot' | 'final', offset: number) => {\n check(); this._cancelDenoise(); target!.activate(); target!.restartSamples();\n target!.configure({...this._settings(cap), allowMultipleSamplesPerFrame: true});\n let batch = options.targetBatchTimeMs && this._engine.device ? 1 : Math.min(batchLimit, cap);\n let previous = -1, lastPreview = performance.now(); const started = performance.now();\n for (;;) {\n check(); if (performance.now() - started > timeout) throw new Error(`Timed out rendering the offline ${name} pass.`);\n target!.activate(); target!.setOfflineRenderOptions({samplesPerBatch: batch, deferPostProcess: true, sampleSequenceOffset: offset});\n const before = target!.getTotalSamplesRendered(), batchStarted = performance.now();\n this._status = target!.trace(camera, cap) ? 'compiling' : 'converging';\n const count = target!.getTotalSamplesRendered();\n if (count !== previous) {\n previous = count; options.onProgress?.({stage: name, samples: Math.min(count, cap), targetSamples: cap});\n if (name === 'final' && options.previewIntervalMs !== undefined && count > 0 && count < cap && performance.now() - lastPreview >= options.previewIntervalMs) { target!.drawPostProcess(); lastPreview = performance.now(); }\n }\n if (count >= cap) break;\n if (count > before && this._engine.device) await this._engine._awaitDevice(this._engine.device.queue.onSubmittedWorkDone());\n else await new Promise(resolve => setTimeout(resolve, 0));\n if (options.targetBatchTimeMs && this._engine.device && count > before) {\n const desired = Math.max(1, Math.min(batchLimit, Math.round(options.targetBatchTimeMs * (count - before) / Math.max(1, performance.now() - batchStarted))));\n batch = desired > batch ? Math.min(desired, batch * 2) : desired;\n }\n }\n await this._engine._awaitDevice(Promise.resolve(this._engine.device?.queue.onSubmittedWorkDone())); check();\n };\n let result: ConvergeResult = {samples, averageSamplesPerPixel: samples, pilotSamples: 0, adaptiveSampling: false};\n if (options.adaptiveSampling && this._engine.device) {\n const pilotSamples = Math.min(samples, Math.max(2, Math.round(options.adaptiveSampling.pilotSamples ?? 8)));\n target.activate(); target.setVarianceMoments(true); target.setAdaptiveSamplingTargets(undefined);\n await stage(pilotSamples, 'pilot', sequenceOffset);\n target.activate(); const plan = await this._engine._awaitDevice(target.prepareOfflineAdaptiveSampling({...options.adaptiveSampling, maxSamples: samples}));\n if (plan) {\n target.activate(); target.setVarianceMoments(false);\n await stage(plan.maximumTarget, 'final', sequenceOffset + pilotSamples);\n result = {samples: plan.maximumTarget, averageSamplesPerPixel: plan.averageTarget, pilotSamples, varianceHistory: plan.history, adaptiveSampling: true};\n } else { target.setVarianceMoments(false); target.setAdaptiveSamplingTargets(undefined); await stage(samples, 'final', sequenceOffset); }\n } else { target.activate(); target.setVarianceMoments(false); target.setAdaptiveSamplingTargets(undefined); await stage(samples, 'final', sequenceOffset); }\n if (this._filter) {\n options.onProgress?.({stage: 'denoising', samples: result.samples, targetSamples: result.samples});\n this._status = 'denoising'; this._maybeDenoise(true); await this._engine._awaitDevice(Promise.resolve(this._denoisePending)); check();\n }\n this._status = 'finished'; return result;\n } catch (error) { if (this._engine._deviceGeneration === deviceGeneration) this._status = 'error'; throw error; }\n finally {\n if (target && !this._disposed && this._engine._deviceGeneration === deviceGeneration) { target.activate(); target.setVarianceMoments(false); target.setAdaptiveSamplingTargets(undefined); target.setOfflineRenderOptions({samplesPerBatch: 0, deferPostProcess: false, sampleSequenceOffset: 0}); }\n options.signal?.removeEventListener('abort', abortConverge);\n this._busy = false;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Render.js","sourceRoot":"","sources":["../src/Render.ts"],"names":[],"mappings":"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","sourcesContent":["import { Events } from './util/events.js';\nimport type Engine from './Engine.js';\nimport type Camera from './scene/Camera.js';\nimport { cameraSnapshot } from './renderer/cameraSnapshot.js';\nimport type { AlphaBlendStrategy } from './renderer/RenderingPipeline.js';\nimport { collectTraceSettings, imageSettingsKey } from './settings/render.js';\nimport type { SamplingPattern } from './renderer/sampling.js';\nimport type { RenderTarget, TraceSettings } from './renderer/renderPipeline.js';\nimport type {DenoiserHandle, OwnedDenoiser} from './renderer/denoiser.js';\nimport type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';\nimport { DEFAULT_JNLM_OPTIONS, createJNLMDenoiser, type JNLMOptions } from './renderer/jnlm.js';\nimport type { OfflineAdaptiveSamplingOptions, OfflineVarianceHistory } from './renderer/OfflineAdaptiveSampling.js';\nimport { nextPreviewScale } from './renderer/util.js';\nimport {scheduleFrame} from './util/frame.js';\n\n/** Complete-sample notification, including the backend's measured sample time. */\nexport interface SampleEvent { samples: number; isFirstFrame: boolean; frameTimeMs: number; }\n/** State of one independent accumulation. Default preparing. */\nexport type RenderStatus = 'preparing' | 'compiling' | 'converging' | 'denoising' | 'finished' | 'error';\n/** When a render filters its complete samples. Default converged. */\nexport type DenoiseSchedule = 'converged' | 'progressive' | 'every-sample';\n/** Caller-owned WebGPU filter. Render/Engine never dispose it; calls on one engine are serialized. */\nexport interface Denoiser {\n /** Optional preallocation before first use or after device/dimension changes. Default undefined. The device may change after recovery; recreate device-owned resources then. */\n prepare?(input: {device: GPUDevice; width: number; height: number}): Promise<void>;\n /** Write all output RGB, then resolve after submitting GPU work. Abort on input changes, restart, replacement or disposal; aborted results are discarded even if this resolves. Buffers are borrowed until settlement; do not retain or destroy them. */\n denoise(input: DenoiseInput, context: {signal: AbortSignal; schedule: DenoiseSchedule}): Promise<void>;\n}\n/** Borrowed, tightly packed rgba32float buffers, top row first, width*height*16 bytes of image data. */\nexport interface DenoiseInput {\n /** Engine WebGPU device; may change after device loss/recovery. */ device: GPUDevice;\n /** Actual internal width, including backend alignment. */ width: number;\n /** Actual internal height, including backend alignment. */ height: number;\n /** Read-only native resolved linear HDR ray color, before exposure, grading, tone mapping, vignette, bloom and display background/catcher composition. RGB uses native hit-count normalization (flat primary misses are averaged by samples); alpha is raw path coverage. Usage STORAGE | COPY_SRC | COPY_DST. */ color: GPUBuffer;\n /** Read-only resolved linear RGB albedo averaged over complete samples; alpha is primary-hit coverage. Same packing/usage as color. */ albedo: GPUBuffer;\n /** Read-only resolved world-space RGB normal encoded as averaged normal*.5+.5, without renormalizing; alpha 1 for a valid surface, otherwise zero RGBA. Same packing/usage as albedo. */ normal: GPUBuffer;\n /** Write linear HDR RGB here. Same packing/usage as color; alpha is ignored and original path coverage is retained. */ output: GPUBuffer;\n}\n/** Third-party WebGPU filter; ignored with one warning on WebGL. */\nexport interface CustomDenoiserOptions {\n /** Required implementation selector. */ type: 'custom';\n /** Required caller-owned instance, keyed by object identity; never serialized or released by Render/Engine. */ denoiser: Denoiser;\n /** When to filter complete samples. Default converged. */ schedule?: DenoiseSchedule;\n}\n/** Built-in joint non-local means filter on both backends. */\nexport interface JNLMDenoiserOptions extends JNLMOptions {\n /** Required implementation selector. */ type: 'jnlm';\n /** When to filter complete samples. Default converged. */ schedule?: DenoiseSchedule;\n}\n/** Loading and execution options shared by both OIDN network sources. */\ninterface OIDNSettings {\n /** Required implementation selector. */ type: 'oidn';\n /** When to filter complete samples. Default converged. */ schedule?: DenoiseSchedule;\n /** Override albedo and normal prefilter networks. Default packaged filters for cleanAuxLarge, otherwise undefined. */ auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n /** Execution backend. Default auto (native WGSL unless WebNN is selected). */ engine?: OIDNEngine;\n /** WGSL precision. Default auto (fp16 when shader-f16 is available). */ precision?: OIDNPrecision;\n /** Adaptive tile controller. Default enabled with minTileSize 256, initialTileSize 432, targetTileTimeMs 16, adjustmentStep 16. */ dynamicTile?: OIDNDynamicTileSetting;\n /** Maximum OIDN tile size. Default chosen by oidn-web. */ maxTileSize?: number;\n /** Abort weight downloads. Default undefined; does not distinguish cached networks. */ signal?: AbortSignal;\n}\n/** OIDN configuration on WebGPU: choose a packaged model or an explicit network URL. */\nexport type OIDNDenoiserOptions = OIDNSettings & (\n | {\n /** Packaged network. Default standard. */ model?: OIDNModel;\n /** Weight directory override. Default bundled standard/small assets and CDN large weights. */ weightsBaseUrl?: string | URL;\n weightsUrl?: never; aux?: never; hdr?: never; hdrTransfer?: never;\n }\n | {\n /** Custom network file. Required in this branch; failures never fall back to CDN. */ weightsUrl: string | URL;\n /** Custom model consumes albedo and normal. Default true. */ aux?: boolean;\n /** Custom model consumes HDR color. Default true. */ hdr?: boolean;\n /** Custom model HDR encoding. Default pu. */ hdrTransfer?: OIDNHDRTransfer;\n model?: never; weightsBaseUrl?: never;\n }\n);\n/** Assign a complete configuration, or null to disable denoising. The type selector is required. */\nexport type DenoiserOptions = JNLMDenoiserOptions | OIDNDenoiserOptions | CustomDenoiserOptions;\n\n/** Optional per-render execution and image-quality settings. */\nexport interface RenderSettings {\n /** Maximum complete samples. Default 2048. */ maxSamples?: number;\n /**\n * Maximum scattering depth, rounded and clamped to [1, 20] (NaN becomes 1).\n * Total path events, including transmission and alpha skips, are capped at 20\n * and at three times this depth. Intel Mac WebGL uses min(depth, 3), doubled\n * for scenes with transmission or alpha, with its existing early termination.\n * Default 3.\n */ bounces?: number;\n /** Radiance clamp; 0 disables it. Default 0. */ clamping?: number;\n /** Sampling sequence. Default sobol. */ samplingPattern?: SamplingPattern;\n /** Light candidates per vertex; WebGPU only, ignored on WebGL. Default 4. */ directLightCandidates?: number;\n /** Rounded material edges. Default true. */ bevel?: boolean;\n /** Bevel neighborhood probes, clamped to 1–32. Default 8. */ bevelSamples?: number;\n /** Wavelengths per dispersion sample. Default 3; 1 selects one random wavelength. */ dispersionWavelengths?: 1 | 3;\n /** Primary-ray alpha blend strategy; WebGPU only. Default stochastic. */ alphaBlendStrategy?: AlphaBlendStrategy;\n /** Minimum transmissive path alpha, using path depth. Default 1. Changes restart this accumulation. */ transmissiveOutputAlphaMin?: number;\n /** Tile execution budget in milliseconds. Default 21. */ timeBudgetMs?: number;\n /** Maximum tiles per frame. Default Infinity. */ maxTiles?: number;\n /** Accumulate multiple samples when frame time permits. Default false. */ allowMultipleSamplesPerFrame?: boolean;\n /** Adapt scale to frame timing; minScale must not exceed resolutionScale. Default false. */ adaptiveResolution?: {targetFrameMs: number; minScale: number} | false;\n /** Single-level fallback on the same engine. Default null. */ fallback?: Render | null;\n /** Denoising configuration. Default null. */ denoiser?: DenoiserOptions | null;\n}\n/** Constructor options: fixed dimensions and canvas-relative scale are mutually exclusive. */\nexport type RenderOptions = RenderSettings & (\n | { /** Fixed width in pixels, paired with height. */ width: number; /** Fixed height in pixels, paired with width. */ height: number; resolutionScale?: never }\n | { /** Canvas-relative resolution scale. Default 1. */ resolutionScale?: number; width?: never; height?: never }\n);\n/** Deterministic offline execution options. */\nexport interface ConvergeOptions {\n /** Final complete-sample budget. Required. */ samples: number;\n /** Camera override for this output only, copied on entry. Default committed engine camera. */ camera?: Camera;\n /** Two-stage variance sampling; WebGPU only, ignored on WebGL. Default undefined. */ adaptiveSampling?: Omit<OfflineAdaptiveSamplingOptions, 'maxSamples'>;\n /** Deterministic sequence base. Default 0. */ sampleSequenceOffset?: number;\n /** Maximum samples per submission batch. Default 8. */ samplesPerBatch?: number;\n /** WebGPU target batch completion time in milliseconds. Default undefined (fixed batch size). */ targetBatchTimeMs?: number;\n /** Delay between intermediate resolved images in milliseconds. Default undefined (resolve only at the end). */ previewIntervalMs?: number;\n /** Batch progress callback. Default undefined. */ onProgress?: (progress: {stage: 'pilot' | 'final' | 'denoising'; samples: number; targetSamples: number}) => void;\n /** Cancels the task. Default undefined. */ signal?: AbortSignal;\n /** Timeout per stage in milliseconds. Default 600000. */ timeoutMs?: number;\n}\n/** Result of deterministic offline convergence. */\nexport interface ConvergeResult {\n samples: number; averageSamplesPerPixel: number; pilotSamples: number;\n varianceHistory?: OfflineVarianceHistory; adaptiveSampling: boolean;\n}\n\nlet oidnModule: Promise<typeof import('./renderer/oidnNetwork.js')> | undefined;\nconst loadOIDN = () => oidnModule ??= import('./renderer/oidnNetwork.js');\n\nfunction validateDenoiserOptions(options: DenoiserOptions) {\n if (!options || typeof options !== 'object' || (options.type !== 'jnlm' && options.type !== 'oidn' && options.type !== 'custom')) throw new Error('Denoiser type must be jnlm, oidn or custom.');\n const allowed = options.type === 'jnlm'\n ? ['type', 'schedule', ...Object.keys(DEFAULT_JNLM_OPTIONS)]\n : options.type === 'custom' ? ['type', 'schedule', 'denoiser']\n : ['type', 'schedule', 'model', 'weightsBaseUrl', 'weightsUrl', 'aux', 'hdr', 'hdrTransfer', 'auxiliaryModelUrls', 'engine', 'precision', 'dynamicTile', 'maxTileSize', 'signal'];\n for (const key of Object.keys(options)) if (!allowed.includes(key)) throw new Error(`Denoiser field ${key} does not belong to ${options.type}.`);\n if (options.schedule !== undefined && !['converged', 'progressive', 'every-sample'].includes(options.schedule)) throw new Error('Unknown denoise schedule.');\n if (options.type === 'jnlm') createJNLMDenoiser(options);\n else if (options.type === 'custom') {\n if (!options.denoiser || typeof options.denoiser !== 'object' || typeof options.denoiser.denoise !== 'function' || (options.denoiser.prepare !== undefined && typeof options.denoiser.prepare !== 'function')) throw new Error('Custom denoiser must implement denoise and optional prepare.');\n } else {\n if (options.weightsUrl !== undefined) {\n if (options.model !== undefined || options.weightsBaseUrl !== undefined) throw new Error('weightsUrl is mutually exclusive with model and weightsBaseUrl.');\n } else if (options.aux !== undefined || options.hdr !== undefined || options.hdrTransfer !== undefined) throw new Error('aux, hdr and hdrTransfer require weightsUrl.');\n for (const key of ['weightsUrl', 'weightsBaseUrl'] as const) if (options[key] !== undefined && !isURL(options[key])) throw new Error(`${key} must be a nonempty string or URL.`);\n if (options.auxiliaryModelUrls !== undefined) {\n const urls = options.auxiliaryModelUrls;\n if (!urls || !isURL(urls.albedo) || !isURL(urls.normal) || Object.keys(urls).some(key => !['albedo', 'normal'].includes(key))) throw new Error('auxiliaryModelUrls requires only albedo and normal URLs.');\n }\n for (const [key, values] of [['engine', ['auto', 'wgsl', 'webnn']], ['precision', ['auto', 'fp32', 'fp16']], ['hdrTransfer', ['pu', 'log']]] as const) {\n if (options[key] !== undefined && !(values as readonly string[]).includes(options[key]!)) throw new Error(`Unknown OIDN ${key}.`);\n }\n for (const key of ['aux', 'hdr'] as const) if (options[key] !== undefined && typeof options[key] !== 'boolean') throw new Error(`${key} must be boolean.`);\n if (options.dynamicTile !== undefined && typeof options.dynamicTile !== 'boolean') {\n if (!options.dynamicTile || typeof options.dynamicTile !== 'object') throw new Error('dynamicTile must be boolean or tile settings.');\n for (const [key, value] of Object.entries(options.dynamicTile)) {\n if (!['minTileSize', 'initialTileSize', 'targetTileTimeMs', 'adjustmentStep'].includes(key) || (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || value <= 0))) throw new Error(`Invalid dynamicTile ${key}.`);\n }\n }\n if (options.model !== undefined && !['standard', 'small', 'cleanAuxLarge'].includes(options.model)) throw new Error('Unknown OIDN model.');\n if (options.maxTileSize !== undefined && (!Number.isInteger(options.maxTileSize) || options.maxTileSize < 1)) throw new Error('maxTileSize must be a positive integer.');\n }\n}\n\nfunction isURL(value: unknown): value is string | URL { return (typeof value === 'string' && value.length > 0) || value instanceof URL; }\n\n// Snapshot nested values too, so application edits cannot silently change a cache key.\nfunction snapshotDenoiserOptions(options: DenoiserOptions): Readonly<DenoiserOptions> {\n if (options.type !== 'oidn') return Object.freeze({...options});\n const next: OIDNDenoiserOptions = {...options};\n if (options.weightsBaseUrl !== undefined) next.weightsBaseUrl = String(options.weightsBaseUrl);\n if (options.weightsUrl !== undefined) next.weightsUrl = String(options.weightsUrl);\n if (options.auxiliaryModelUrls !== undefined) next.auxiliaryModelUrls = Object.freeze({albedo: String(options.auxiliaryModelUrls.albedo), normal: String(options.auxiliaryModelUrls.normal)});\n if (typeof options.dynamicTile === 'object') next.dynamicTile = Object.freeze({...options.dynamicTile});\n return Object.freeze(next);\n}\n\nfunction denoiserKey(options: Readonly<DenoiserOptions>): string | Denoiser {\n if (options.type === 'custom') return options.denoiser;\n if (options.type === 'jnlm') return JSON.stringify({type: 'jnlm', ...Object.fromEntries(Object.entries(DEFAULT_JNLM_OPTIONS).map(([key, value]) => [key, options[key as keyof JNLMOptions] ?? value]))});\n const tile = options.dynamicTile;\n return JSON.stringify({type: 'oidn',\n ...(options.weightsUrl === undefined ? {model: options.model ?? 'standard', weightsBaseUrl: options.weightsBaseUrl?.toString()} : {weightsUrl: String(options.weightsUrl), aux: options.aux ?? true, hdr: options.hdr ?? true, hdrTransfer: options.hdrTransfer ?? 'pu'}),\n auxiliaryModelUrls: options.auxiliaryModelUrls && {albedo: String(options.auxiliaryModelUrls.albedo), normal: String(options.auxiliaryModelUrls.normal)},\n maxTileSize: options.maxTileSize, engine: options.engine ?? 'auto', precision: options.precision ?? 'auto',\n dynamicTile: tile === false ? false : {minTileSize: typeof tile === 'object' ? tile.minTileSize ?? 256 : 256,\n initialTileSize: typeof tile === 'object' ? tile.initialTileSize ?? 432 : 432,\n targetTileTimeMs: typeof tile === 'object' ? tile.targetTileTimeMs ?? 16 : 16,\n adjustmentStep: typeof tile === 'object' ? tile.adjustmentStep ?? 16 : 16}\n });\n}\n\n/** One independently configured image and its accumulation, owned by an engine. */\nexport default class Render {\n /** Maximum complete samples. Default 2048. */ maxSamples = 2048;\n /**\n * Maximum scattering depth, rounded and clamped to [1, 20] (NaN becomes 1).\n * Total path events, including transmission and alpha skips, are capped at 20\n * and at three times this depth. Intel Mac WebGL uses min(depth, 3), doubled\n * for scenes with transmission or alpha, with its existing early termination.\n * Default 3.\n */ bounces = 3;\n /** Per-sample radiance clamp; 0 disables it. Default 0. */ clamping = 0;\n /** Sampling sequence. Default sobol. */ samplingPattern: SamplingPattern = 'sobol';\n /** WebGPU light candidates per vertex; ignored on WebGL. Default 4. */ directLightCandidates = 4;\n /** Rounded material edges. Default true. */ bevel = true;\n /** Bevel probes, clamped to 1–32. Default 8. */ bevelSamples = 8;\n /** Dispersion wavelengths per sample. Default 3. */ dispersionWavelengths: 1 | 3 = 3;\n /** WebGPU primary-ray alpha policy; ignored on WebGL. Default stochastic. */ alphaBlendStrategy: AlphaBlendStrategy = 'stochastic';\n /** Minimum transmissive path alpha. Default 1. Changing it restarts this render. */ transmissiveOutputAlphaMin = 1;\n /** Execution budget in milliseconds. Default 21. */ timeBudgetMs = 21;\n /** Maximum tiles per frame. Default Infinity. */ maxTiles = Infinity;\n /** Allow several samples per frame when possible. Default false. */ allowMultipleSamplesPerFrame = false;\n /** Adaptive resolution controller, or false. Default false. */ adaptiveResolution: {targetFrameMs: number; minScale: number} | false = false;\n private _resolutionScale = 1;\n /** Canvas-relative scale. Default 1; cannot be assigned on a fixed-size render. */\n get resolutionScale() { return this._resolutionScale; }\n set resolutionScale(value: number) {\n if (this._fixed) throw new Error('Fixed-size renders cannot use resolutionScale.');\n if (!Number.isFinite(value) || value <= 0) throw new Error('resolutionScale must be positive.');\n if (value !== this._resolutionScale) this._cancelAdaptiveFrames();\n this._resolutionScale = value;\n }\n private _fallback: Render | null = null;\n /** Single-level fallback on this engine. Default null; chains and cycles are rejected. */\n get fallback() { return this._fallback; }\n set fallback(value: Render | null) {\n if (value && (value._engine !== this._engine || value === this || value.fallback)) throw new Error('Fallback must be a render on the same engine with no fallback.');\n if (value && this._dependents.size) throw new Error('Fallback renders cannot have their own fallback.');\n this._fallback?._dependents.delete(this);\n this._fallback = value; value?._dependents.add(this);\n }\n private _dependents = new Set<Render>();\n private _denoiserOptions: Readonly<DenoiserOptions> | null = null;\n /** Frozen configuration snapshot. Default null. Change it with {@link Render.setDenoiser}. */\n get denoiser(): Readonly<DenoiserOptions> | null { return this._denoiserOptions; }\n /**\n * Replaces the denoising configuration; null disables denoising. Invalid options throw synchronously\n * before replacing any state. Resolves when the filter is ready to use (after OIDN weights load) or this\n * configuration is replaced; rejects when loading fails. An equal configuration returns the current\n * promise without reloading.\n */\n setDenoiser(options: DenoiserOptions | null): Promise<void> {\n if (options !== null) validateDenoiserOptions(options);\n const next = options ? snapshotDenoiserOptions(options) : null;\n const current = this._denoiserOptions;\n if (current === null && next === null) return this._denoiserReady;\n if (next && current && denoiserKey(next) === denoiserKey(current)\n && next.schedule === current.schedule && (next.type !== 'oidn' ||\n (current.type === 'oidn' && next.signal === current.signal))) return this._denoiserReady;\n this._denoiserOptions = next;\n return this._refreshDenoiser() ?? this._denoiserReady;\n }\n private _denoiserReady: Promise<void> = Promise.resolve();\n private _fixed?: {width: number; height: number};\n private _target?: RenderTarget;\n private _status: RenderStatus = 'preparing';\n private _disposed = false;\n private _busy = false;\n private _offlineCamera = false;\n private _input = {scene: -1, camera: -1, settings: ''};\n private _adaptiveScale = 1;\n private _lastScale = 1;\n private _frameTime = 0;\n private _sampleStart?: number;\n private _frameStart?: number;\n private _sampleScale = 1;\n private _frameScale = 1;\n private _adaptiveFrames = new Set<() => void>();\n private _adaptiveFastFrames = 0;\n private _events = new Events<{sample: SampleEvent}>();\n /** Owning engine. */ get engine(): Engine { return this._engine; }\n /** Whether inference is queued or running, including intermediate updates. Default false. */ get denoising(): boolean { return !!this._denoisePending; }\n /** Subscribes to every complete sample on this render; returns unsubscribe. */\n on(event: 'sample', listener: (value: SampleEvent) => void): () => void { return this._events.on(event, listener); }\n private _filter?: OwnedDenoiser | Extract<DenoiserHandle, {kind: 'custom'}>;\n private _filterKey: string | Denoiser = '';\n private _warnedWebGPUFilter = false;\n private _denoiseController?: AbortController;\n private _filterRevision = 0;\n private _filterPending?: Promise<void>;\n private _denoiseRevision = 0;\n private _denoisePending?: Promise<void>;\n private _denoisedSamples = 0;\n private _lastDenoiseTime = 0;\n private _warnedDenoisedReadback = false;\n /** @internal */ readonly _engine: Engine;\n\n constructor(engine: Engine, options: RenderOptions = {}) {\n this._engine = engine;\n if (options.denoiser != null) validateDenoiserOptions(options.denoiser);\n if ('width' in options || 'height' in options) {\n if ('resolutionScale' in options || !Number.isInteger(options.width) || !Number.isInteger(options.height) || options.width! < 1 || options.height! < 1) throw new Error('Provide positive integer width and height, or resolutionScale, exclusively.');\n this._fixed = {width: options.width!, height: options.height!};\n }\n const {width: _width, height: _height, resolutionScale, fallback, denoiser, ...settings} = options;\n Object.assign(this, settings);\n if (resolutionScale !== undefined) this.resolutionScale = resolutionScale;\n this._adaptiveScale = this._resolutionScale; this._lastScale = this._resolutionScale;\n this._validate(); this.fallback = fallback ?? null;\n engine._register(this);\n if (denoiser) void this.setDenoiser(denoiser).catch(error => this._engine._notifyError(error));\n }\n /** Actual target width; before allocation uses the requested dimensions. */ get width() { return this._target?.getMemory().width || this._size().width; }\n /** Actual target height; before allocation uses the requested dimensions. */ get height() { return this._target?.getMemory().height || this._size().height; }\n /** Complete samples since the last restart; stale engine inputs report 0. Default 0. */\n get samples() { return this._current ? this._target?.getTotalSamplesRendered() ?? 0 : 0; }\n /** Whether complete samples reached maxSamples. Default false. */ get converged() { return this.samples >= this.maxSamples; }\n /** Current execution state. Default preparing. */ get status(): RenderStatus {\n if (!this._current && this._status !== 'error') return this._engine._ready ? 'converging' : 'preparing';\n return this._status;\n }\n private get _current() { const inputs = this._engine._inputs; return inputs.scene === this._input.scene && inputs.camera === this._input.camera && !this._disposed; }\n /** @internal */ get _complete() { return this._current && !!this._target?.presentationComplete && !this._target.isFirstFrame() && this.samples > 0; }\n /** @internal */ get _presentable() { return this._complete && (!this._denoisePending || this._denoisedSamples > 0 || (this._schedule() === 'converged' && this.maxSamples > 1)); }\n /** @internal */ get _output() { if (this._disposed) throw new Error('Render is disposed.'); return this._target; }\n private _validate() {\n if (!Number.isFinite(this.maxSamples) || this.maxSamples < 1) throw new Error('maxSamples must be positive.');\n if (this.dispersionWavelengths !== 1 && this.dispersionWavelengths !== 3) throw new Error('dispersionWavelengths must be 1 or 3.');\n const adaptive = this.adaptiveResolution;\n if (adaptive && (this._fixed || !Number.isFinite(adaptive.targetFrameMs) || adaptive.targetFrameMs <= 0 || !Number.isFinite(adaptive.minScale) || adaptive.minScale <= 0 || adaptive.minScale > this._resolutionScale)) throw new Error('adaptiveResolution requires a scale-based render with positive targetFrameMs and minScale <= resolutionScale.');\n }\n private _size() {\n if (this._fixed) return this._fixed;\n const scale = this.adaptiveResolution ? Math.min(this._adaptiveScale, this._resolutionScale) : this._resolutionScale;\n return {width: Math.max(1, Math.round(this._engine.display.canvas.width * scale)), height: Math.max(1, Math.round(this._engine.display.canvas.height * scale))};\n }\n private _settings(sampleCap = this.maxSamples): TraceSettings {\n return collectTraceSettings(this, sampleCap);\n }\n private _synchronize(sampleCap = this.maxSamples, offline = false) {\n this._validate();\n if (this._lastScale !== this._resolutionScale) { this._adaptiveScale = this._resolutionScale; this._lastScale = this._resolutionScale; }\n const target = this._target ??= this._engine._createTarget();\n if (!target) return;\n const settings = this._settings(sampleCap), size = this._size();\n const key = imageSettingsKey(settings, size);\n const inputs = this._engine._inputs;\n target.configure(settings); target.activate();\n if ((!offline && this._offlineCamera) || inputs.scene !== this._input.scene || inputs.camera !== this._input.camera || key !== this._input.settings) {\n if (!offline) this._offlineCamera = false;\n this._cancelDenoise(); target.restartSamples();\n this._sampleStart = this._frameStart = undefined; this._frameTime = 0;\n target.setSize(size.width, size.height);\n this._input = {scene: inputs.scene, camera: inputs.camera, settings: key};\n }\n target.setOnSampleRendered((samples, isFirstFrame, frameTimeMs) => {\n // A preview's latency includes every tile, not just its last dispatch.\n this._frameTime = Math.max(frameTimeMs, this._sampleStart === undefined ? 0 : performance.now() - this._sampleStart);\n this._frameStart = this._sampleStart;\n this._frameScale = this._sampleScale;\n this._sampleStart = undefined;\n this._events.emit('sample', {samples, isFirstFrame, frameTimeMs});\n });\n return target;\n }\n private _trace(target: RenderTarget, limit: number) {\n if (this._sampleStart === undefined) { this._sampleStart = performance.now(); this._sampleScale = this._adaptiveScale; }\n const compiling = target.trace(this._engine._inputs.value!, limit);\n if (compiling) this._sampleStart = undefined;\n return compiling;\n }\n private _adaptResolution() {\n if (!this._busy && this.adaptiveResolution && this._frameTime > 0 && this.samples > 0) {\n const {targetFrameMs, minScale} = this.adaptiveResolution;\n const start = this._frameStart, time = this._frameTime, scale = this._frameScale, maxScale = this._resolutionScale;\n const {width, height} = this._engine.display.canvas;\n this._frameTime = 0;\n // Observe the following display frame too: GPU submissions and WebGL\n // filters can return long before their work reaches the screen.\n const cancel = scheduleFrame(() => {\n this._adaptiveFrames.delete(cancel);\n const adaptive = this.adaptiveResolution, canvas = this._engine.display.canvas;\n if (this._disposed || this._busy || !adaptive || adaptive.targetFrameMs !== targetFrameMs || adaptive.minScale !== minScale ||\n this._resolutionScale !== maxScale || canvas.width !== width || canvas.height !== height) return;\n const elapsed = Math.max(time, start === undefined ? 0 : performance.now() - start);\n const next = nextPreviewScale(scale, elapsed, targetFrameMs, maxScale, this._adaptiveScale, minScale);\n if (next > this._adaptiveScale) {\n if (++this._adaptiveFastFrames < 4) return;\n this._adaptiveScale = Math.min(next, this._adaptiveScale * 1.25);\n } else this._adaptiveScale = next;\n this._adaptiveFastFrames = 0;\n });\n this._adaptiveFrames.add(cancel);\n }\n }\n private _cancelAdaptiveFrames() {\n for (const cancel of this._adaptiveFrames) cancel();\n this._adaptiveFrames.clear(); this._adaptiveFastFrames = 0;\n }\n /** Accumulates within this frame's budget. Rejects calls during converge or after disposal. */\n refine(): RenderStatus {\n if (this._busy) throw new Error('Cannot refine a render while converge is running.');\n if (this._disposed) throw new Error('Render is disposed.');\n this._engine._setRenderError();\n try { return this._refine(); }\n catch (error) { this._engine._setRenderError(this._engine._notifyError(error)); return this._status = 'error'; }\n finally { this._engine._reportShaderProgress(); }\n }\n private _refine(): RenderStatus {\n if (this._engine._initializationError) throw this._engine._initializationError;\n this._reloadDenoiser();\n if (!this._engine._ready) {\n const generation = this._engine._deviceGeneration;\n void this._engine.init().catch(error => {\n if (this._disposed || generation !== this._engine._deviceGeneration) return;\n this._status = 'error'; this._engine._notifyError(error);\n });\n return this._status = 'preparing';\n }\n const target = this._synchronize();\n if (!target) return this._status = 'preparing';\n if (this._fallback && this.samples === 0 && !target.canCompleteSampleWithin(this.timeBudgetMs) && !this._fallback._complete) this._fallback._refineOne();\n target.activate();\n if (this._denoisePending) return this._status = this.converged ? 'denoising' : 'converging';\n target.setPreserveDenoisedOutput?.(!!this._filter && this._schedule() !== 'converged');\n const limit = this._nextSampleTarget();\n if (this.samples < limit) {\n if (this._trace(target, limit)) return this._status = 'compiling';\n }\n this._maybeDenoise(false, limit);\n if (this._denoisePending) return this._status = this.converged ? 'denoising' : 'converging';\n if (this._filterPending && this.converged) return this._status = 'preparing';\n this._adaptResolution();\n return this._status = this.converged ? 'finished' : 'converging';\n }\n private _refineOne() {\n if (this._busy || this._disposed || !this._engine._ready) return;\n this._reloadDenoiser(); const target = this._synchronize();\n if (!target) return;\n target.activate();\n if (this.samples < 1) this._status = this._trace(target, 1) ? 'compiling' : 'converging';\n this._maybeDenoise();\n if (!this._denoisePending) this._adaptResolution();\n }\n private _schedule() { return this._denoiserOptions?.schedule ?? 'converged'; }\n private _nextSampleTarget() {\n if (!this._filter) return this.maxSamples;\n if (this._schedule() === 'every-sample') return Math.min(this.maxSamples, this.samples + 1);\n if (this._schedule() === 'converged') return this.maxSamples;\n if (this._denoisedSamples === 0) return 1;\n if (performance.now() - this._lastDenoiseTime >= 10000) return Math.min(this.maxSamples, this.samples + 1);\n return Math.min(this.maxSamples, Math.max(4, this._denoisedSamples * 2));\n }\n /** Reloads a filter dropped by device recovery; failures report through engine errors. */\n private _reloadDenoiser() { void this._refreshDenoiser()?.catch(error => this._engine._notifyError(error)); }\n /** Starts loading the configured filter; returns its readiness when a new configuration was applied. */\n private _refreshDenoiser(): Promise<void> | undefined {\n if (this._disposed) return;\n const options = this._denoiserOptions;\n const key = options ? denoiserKey(options) : '';\n if (key === this._filterKey) return;\n this._filterKey = key; const revision = ++this._filterRevision;\n this._cancelDenoise();\n if (this._filter && this._filter.kind !== 'custom') this._engine._releaseDenoiser(this._filter);\n this._target?.invalidateDenoisedOutput();\n this._filter = undefined; this._filterPending = undefined;\n if (!options) return this._denoiserReady = Promise.resolve();\n if (options.type === 'jnlm') { this._filter = this._engine._retainDenoiser(`jnlm:${key}`, () => ({kind: 'jnlm', denoiser: createJNLMDenoiser(options)})); return this._denoiserReady = Promise.resolve(); }\n const task = (async () => {\n await this._engine.init();\n if (this._engine.backend !== 'webgpu') { if (revision === this._filterRevision && !this._warnedWebGPUFilter) { this._warnedWebGPUFilter = true; console.warn('This denoiser requires WebGPU; denoising is disabled for this render.'); } return; }\n if (revision !== this._filterRevision || this._disposed) return;\n if (options.type === 'custom') { this._filter = {kind: 'custom', denoiser: options.denoiser}; return; }\n const {loadOIDNNetwork} = await loadOIDN();\n const filter = await this._engine._acquireDenoiser(key as string, async () => ({kind: 'oidn', denoiser: await loadOIDNNetwork(this._engine, options)}));\n if (revision !== this._filterRevision || this._disposed) { this._engine._releaseDenoiser(filter); return; }\n this._filter = filter; this._warmDenoiser();\n })();\n this._filterPending = task;\n // Superseded or disposed loads resolve instead of reporting obsolete failures.\n return this._denoiserReady = task.catch(error => { if (revision === this._filterRevision && !this._disposed) throw error; })\n .finally(() => { if (this._filterPending === task) this._filterPending = undefined; });\n }\n private _warmDenoiser() {\n const filter = this._filter, revision = this._filterRevision;\n if (!filter || filter.kind !== 'oidn') return;\n const network = filter.denoiser;\n const filters = [network, network.auxiliaryDenoisers?.albedo, network.auxiliaryDenoisers?.normal];\n const width = this.width, height = this.height;\n const task = this._engine._enqueueDenoise(async () => {\n if (revision !== this._filterRevision || filter !== this._filter || this._disposed) return;\n await Promise.all(filters.map(network => network?.prepareForImage?.(width, height, {tileOverlap: this._schedule() === 'converged' ? undefined : 80})));\n });\n void task.catch(error => {\n if (revision === this._filterRevision && filter === this._filter && !this._disposed) this._engine._notifyError(error);\n });\n }\n\n private _cancelDenoise() { this._denoiseController?.abort(); this._denoiseController = undefined; this._denoiseRevision++; this._target?.cancelDenoise?.(); this._denoisePending = undefined; this._denoisedSamples = 0; }\n /** @internal */ _inputsChanged(resetTiming = false) { this._cancelDenoise(); if (resetTiming) this._target?.invalidateTiming?.(); }\n /** @internal */ _deviceLost(recovering: boolean) {\n this._cancelAdaptiveFrames();\n this._cancelDenoise(); this._filterRevision++;\n this._filter = undefined; this._filterPending = undefined; this._filterKey = '';\n this._target = undefined; this._input = {scene: -1, camera: -1, settings: ''};\n this._status = recovering ? 'preparing' : 'error';\n }\n /** @internal */ _displayChanged() { this._cancelDenoise(); this._target?.invalidateDenoisedOutput(); }\n private _maybeDenoise(force = false, sampleTarget = this._nextSampleTarget()) {\n const target = this._target, filter = this._filter;\n if (!target || !filter || this._denoisePending || this.samples < 1 || this._denoisedSamples === this.samples) return;\n if (!force && this._schedule() === 'converged' && !this.converged) return;\n if (!force && this._schedule() === 'progressive' && this.samples < sampleTarget) return;\n this._engine.display._configure(this);\n target.activate(); target.drawPostProcess();\n const revision = ++this._denoiseRevision, samples = this.samples, frameStart = this._frameStart;\n const controller = this._denoiseController = new AbortController();\n // One shared scratch lease across all renders; queued stale jobs do no GPU work.\n const task = this._engine._enqueueDenoise(async () => {\n if (revision !== this._denoiseRevision || this._disposed) return;\n target.activate(); this._engine.display._configure(this);\n if (revision !== this._denoiseRevision || this._disposed) return;\n target.drawPostProcess();\n if (filter.kind === 'custom') {\n await this._engine._prepareCustomDenoiser(filter.denoiser, this.width, this.height);\n if (controller.signal.aborted || revision !== this._denoiseRevision || this._disposed) return;\n }\n const complete = await target.performDenoise?.(filter, undefined, this._schedule(), controller.signal);\n if (revision !== this._denoiseRevision || this._disposed) return;\n if (complete) {\n target.activate(); target.drawPostProcess(); this._denoisedSamples = samples; this._lastDenoiseTime = performance.now();\n if (frameStart !== undefined) this._frameTime = Math.max(this._frameTime, this._lastDenoiseTime - frameStart);\n }\n });\n this._denoisePending = task;\n void task.catch(error => { if (revision === this._denoiseRevision && !this._disposed) this._engine._notifyError(error); }).finally(() => {\n if (this._denoisePending === task) {\n this._denoiseController = undefined; this._denoisePending = undefined;\n this._status = this.converged ? 'finished' : 'converging'; this._adaptResolution();\n }\n });\n }\n /** Reads native RGBA float32, top row first. Default hdr. Custom denoised output is resolved linear HDR ray color before display background/catcher composition; built-ins retain their native display-space output. Unavailable denoised output falls back to hdr. */\n async readPixels(kind: 'hdr' | 'denoised' | 'albedo' | 'normal' = 'hdr') {\n if (this._disposed) throw new Error('Render is disposed.');\n const target = this._target;\n if (!target) return {width: 0, height: 0, data: new Float32Array(0)};\n if (kind === 'denoised' && this._denoisedSamples === 0) {\n if (!this._warnedDenoisedReadback) { this._warnedDenoisedReadback = true; console.warn('Denoised output is not ready; reading HDR samples instead.'); }\n kind = 'hdr';\n }\n target.activate(); return target.readOutput(kind);\n }\n /** Borrows a read-only WebGPU texture; undefined on WebGL or before a complete sample. Kind is required. HDR is native resolved linear ray color before denoising/display composition, with DenoiseInput.color normalization and coverage. Display is the latest compose, including filters and display passes. Valid only until this render's next refine/converge, display present/setSize, restart/dispose or device loss; never retain, write or destroy it. */\n getOutputTexture(kind: 'hdr' | 'display'): GPUTexture | undefined {\n if (!this._complete || this._engine.backend !== 'webgpu') return;\n return this._target?.getOutputTexture?.(kind);\n }\n /** Discards only this render's accumulation and pending denoising. */\n restart() { if (this._disposed) throw new Error('Render is disposed.'); this._cancelDenoise(); this._cancelAdaptiveFrames(); this._sampleStart = this._frameStart = undefined; this._frameTime = 0; this._target?.restartSamples(); this._status = 'converging'; }\n /** Releases only this render's image resources and denoiser. */\n dispose() {\n if (this._disposed) return;\n this._disposed = true; this._events.clear(); this._filterRevision++; this._cancelDenoise(); this._cancelAdaptiveFrames();\n if (this._target) this._engine._releaseTarget(this._target);\n if (this._filter && this._filter.kind !== 'custom') this._engine._releaseDenoiser(this._filter);\n this._target = undefined; this._filter = undefined; this._engine._unregister(this);\n this._fallback?._dependents.delete(this);\n for (const dependent of this._dependents) dependent._fallback = null;\n this._dependents.clear();\n }\n /** Deterministically renders this image. Rejects on abort/timeout/input revision changes and blocks refine on this render. */\n async converge(options: ConvergeOptions): Promise<ConvergeResult> {\n if (this._busy) throw new Error('Converge is already running on this render.');\n if (this._disposed) throw new Error('Render is disposed.');\n const inputs = this._engine._inputs;\n const deviceGeneration = this._engine._deviceGeneration;\n if (!inputs.value) throw new Error('Commit engine.scene and engine.camera with engine.update() before converge.');\n const camera = cameraSnapshot(options.camera ?? inputs.value);\n const samples = Math.max(1, Math.round(options.samples));\n if (!Number.isFinite(samples)) throw new Error('samples must be finite and positive.');\n const batchLimit = Math.max(1, Math.round(options.samplesPerBatch ?? 8));\n const sequenceOffset = Math.max(0, Math.round(options.sampleSequenceOffset ?? 0));\n const timeout = Math.max(1, options.timeoutMs ?? 600000);\n const check = () => {\n if (this._disposed) throw new Error('Render is disposed.');\n if (this._engine._deviceGeneration !== deviceGeneration) throw this._engine._lostError;\n if (options.signal?.aborted) throw options.signal.reason ?? new DOMException('Convergence aborted', 'AbortError');\n const current = this._engine._inputs;\n if (current.scene !== inputs.scene || current.camera !== inputs.camera) throw new Error('Engine inputs changed during converge.');\n };\n this._busy = true;\n const abortConverge = () => this._cancelDenoise();\n options.signal?.addEventListener('abort', abortConverge, {once: true});\n let target: RenderTarget | undefined;\n const start = performance.now();\n try {\n await this._engine._awaitDevice(this._engine.init());\n check();\n while (!this._engine._ready) { check(); if (performance.now() - start > timeout) throw new Error('Timed out preparing convergence.'); await new Promise(resolve => setTimeout(resolve, 0)); }\n target = this._synchronize(samples, true);\n this._offlineCamera = !!options.camera;\n if (!target) throw new Error('The render target is not ready.');\n this._cancelDenoise(); target.restartSamples();\n this._reloadDenoiser(); await this._engine._awaitDevice(Promise.resolve(this._filterPending)); check();\n const stage = async (cap: number, name: 'pilot' | 'final', offset: number) => {\n check(); this._cancelDenoise(); target!.activate(); target!.restartSamples();\n target!.configure({...this._settings(cap), allowMultipleSamplesPerFrame: true});\n let batch = options.targetBatchTimeMs && this._engine.device ? 1 : Math.min(batchLimit, cap);\n let previous = -1, lastPreview = performance.now(); const started = performance.now();\n for (;;) {\n check(); if (performance.now() - started > timeout) throw new Error(`Timed out rendering the offline ${name} pass.`);\n target!.activate(); target!.setOfflineRenderOptions({samplesPerBatch: batch, deferPostProcess: true, sampleSequenceOffset: offset});\n const before = target!.getTotalSamplesRendered(), batchStarted = performance.now();\n this._status = target!.trace(camera, cap) ? 'compiling' : 'converging';\n const count = target!.getTotalSamplesRendered();\n if (count !== previous) {\n previous = count; options.onProgress?.({stage: name, samples: Math.min(count, cap), targetSamples: cap});\n if (name === 'final' && options.previewIntervalMs !== undefined && count > 0 && count < cap && performance.now() - lastPreview >= options.previewIntervalMs) { target!.drawPostProcess(); lastPreview = performance.now(); }\n }\n if (count >= cap) break;\n if (count > before && this._engine.device) await this._engine._awaitDevice(this._engine.device.queue.onSubmittedWorkDone());\n else await new Promise(resolve => setTimeout(resolve, 0));\n if (options.targetBatchTimeMs && this._engine.device && count > before) {\n const desired = Math.max(1, Math.min(batchLimit, Math.round(options.targetBatchTimeMs * (count - before) / Math.max(1, performance.now() - batchStarted))));\n batch = desired > batch ? Math.min(desired, batch * 2) : desired;\n }\n }\n await this._engine._awaitDevice(Promise.resolve(this._engine.device?.queue.onSubmittedWorkDone())); check();\n };\n let result: ConvergeResult = {samples, averageSamplesPerPixel: samples, pilotSamples: 0, adaptiveSampling: false};\n if (options.adaptiveSampling && this._engine.device) {\n const pilotSamples = Math.min(samples, Math.max(2, Math.round(options.adaptiveSampling.pilotSamples ?? 8)));\n target.activate(); target.setVarianceMoments(true); target.setAdaptiveSamplingTargets(undefined);\n await stage(pilotSamples, 'pilot', sequenceOffset);\n target.activate(); const plan = await this._engine._awaitDevice(target.prepareOfflineAdaptiveSampling({...options.adaptiveSampling, maxSamples: samples}));\n if (plan) {\n target.activate(); target.setVarianceMoments(false);\n await stage(plan.maximumTarget, 'final', sequenceOffset + pilotSamples);\n result = {samples: plan.maximumTarget, averageSamplesPerPixel: plan.averageTarget, pilotSamples, varianceHistory: plan.history, adaptiveSampling: true};\n } else { target.setVarianceMoments(false); target.setAdaptiveSamplingTargets(undefined); await stage(samples, 'final', sequenceOffset); }\n } else { target.activate(); target.setVarianceMoments(false); target.setAdaptiveSamplingTargets(undefined); await stage(samples, 'final', sequenceOffset); }\n if (this._filter) {\n options.onProgress?.({stage: 'denoising', samples: result.samples, targetSamples: result.samples});\n this._status = 'denoising'; this._maybeDenoise(true); await this._engine._awaitDevice(Promise.resolve(this._denoisePending)); check();\n }\n this._status = 'finished'; return result;\n } catch (error) { if (this._engine._deviceGeneration === deviceGeneration) this._status = 'error'; throw error; }\n finally {\n if (target && !this._disposed && this._engine._deviceGeneration === deviceGeneration) { target.activate(); target.setVarianceMoments(false); target.setAdaptiveSamplingTargets(undefined); target.setOfflineRenderOptions({samplesPerBatch: 0, deferPostProcess: false, sampleSequenceOffset: 0}); }\n options.signal?.removeEventListener('abort', abortConverge);\n this._busy = false;\n }\n }\n}\n"]}
|
package/lib/RenderLoop.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type Sync from './Sync.js';
|
|
|
6
6
|
export type RenderLoopStatus = RenderStatus | 'previewing';
|
|
7
7
|
export interface RenderLoopOptions {
|
|
8
8
|
/** Presentation settings/canvas. Default engine.display. */ display?: Display;
|
|
9
|
-
/** Preview render/settings, or false to disable. Default half resolution with adaptive scale .
|
|
9
|
+
/** 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;
|
|
10
10
|
/** Final render/settings. Default a new Render with preview as fallback. */ final?: Render | RenderOptions;
|
|
11
11
|
/** External integrations, invoked in order. Default none. */ sync?: Sync | Sync[];
|
|
12
12
|
/** Idle delay for consecutive edits without explicit sync activity. Default 150 ms. */ idleMs?: number;
|
|
@@ -44,7 +44,9 @@ export default class RenderLoop {
|
|
|
44
44
|
private _disposed;
|
|
45
45
|
private _cancelScheduled?;
|
|
46
46
|
private _warnedTick;
|
|
47
|
-
|
|
47
|
+
/** Render whose next presentation is waiting for a complete preview frame. */
|
|
48
|
+
private _previewFrameOwner?;
|
|
49
|
+
private _presented?;
|
|
48
50
|
private _finishedImage?;
|
|
49
51
|
private _unsubscribe;
|
|
50
52
|
constructor(engine: Engine, options?: RenderLoopOptions);
|
|
@@ -60,6 +62,7 @@ export default class RenderLoop {
|
|
|
60
62
|
addSync(sync: Sync): void;
|
|
61
63
|
/** Removes an integration without disposing it. */ removeSync(sync: Sync): void;
|
|
62
64
|
private _setStatus;
|
|
65
|
+
private _present;
|
|
63
66
|
/** Executes one manual tick. Calls during start are ignored with one warning. */
|
|
64
67
|
tick(): RenderLoopStatus;
|
|
65
68
|
private _tick;
|
package/lib/RenderLoop.js
CHANGED
|
@@ -23,7 +23,9 @@ export default class RenderLoop {
|
|
|
23
23
|
_disposed = false;
|
|
24
24
|
_cancelScheduled;
|
|
25
25
|
_warnedTick = false;
|
|
26
|
-
|
|
26
|
+
/** Render whose next presentation is waiting for a complete preview frame. */
|
|
27
|
+
_previewFrameOwner;
|
|
28
|
+
_presented;
|
|
27
29
|
_finishedImage;
|
|
28
30
|
_unsubscribe;
|
|
29
31
|
constructor(engine, options = {}) {
|
|
@@ -41,7 +43,7 @@ export default class RenderLoop {
|
|
|
41
43
|
try {
|
|
42
44
|
if (options.preview !== false)
|
|
43
45
|
this.preview = this._render(options.preview, {
|
|
44
|
-
resolutionScale: .5, adaptiveResolution: { targetFrameMs:
|
|
46
|
+
resolutionScale: .5, timeBudgetMs: 80, adaptiveResolution: { targetFrameMs: 80, minScale: .125 },
|
|
45
47
|
bounces: 2, bevel: false, dispersionWavelengths: 1, directLightCandidates: 2,
|
|
46
48
|
});
|
|
47
49
|
this.final = this._render(options.final, { fallback: this.preview ?? null });
|
|
@@ -91,6 +93,12 @@ export default class RenderLoop {
|
|
|
91
93
|
}
|
|
92
94
|
return status;
|
|
93
95
|
}
|
|
96
|
+
_present(render) {
|
|
97
|
+
const shown = this.display.present(render);
|
|
98
|
+
if (shown)
|
|
99
|
+
this._presented = shown;
|
|
100
|
+
return shown;
|
|
101
|
+
}
|
|
94
102
|
/** Executes one manual tick. Calls during start are ignored with one warning. */
|
|
95
103
|
tick() {
|
|
96
104
|
this._assertAlive();
|
|
@@ -108,20 +116,34 @@ export default class RenderLoop {
|
|
|
108
116
|
return this.status;
|
|
109
117
|
for (const sync of this._syncs)
|
|
110
118
|
sync.update();
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
119
|
+
const owner = this._previewFrameOwner;
|
|
120
|
+
const pendingPreview = !!owner && (owner === this.preview || !owner._complete);
|
|
121
|
+
const tracingPreview = pendingPreview && this.preview?.status === 'converging' && this.preview.samples === 0;
|
|
122
|
+
const holding = tracingPreview || (this.coalesceSceneUpdates && pendingPreview && !!this.preview?.denoising);
|
|
123
|
+
// Inference belongs to a presentation, not merely to a background render.
|
|
124
|
+
// A fallback result must never replace an already available final image.
|
|
125
|
+
if (pendingPreview && !holding && this.preview)
|
|
126
|
+
this._present(this.preview);
|
|
127
|
+
if (!holding)
|
|
128
|
+
this._previewFrameOwner = undefined;
|
|
116
129
|
const changed = holding ? false : this.engine.update();
|
|
117
130
|
const active = [...this._syncs].some(sync => sync.active);
|
|
118
131
|
this._policy = updateProgressiveState(this._policy, changed, active, performance.now(), this.idleMs);
|
|
119
132
|
this._changing = this._policy.changing;
|
|
120
133
|
const selected = this.select({ changing: this.changing });
|
|
121
134
|
if (holding && this.preview) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
135
|
+
// Finish this image against its committed camera while syncs collect the
|
|
136
|
+
// latest input. Restarting its first tile on every edit starves presentation.
|
|
137
|
+
if (tracingPreview) {
|
|
138
|
+
const status = this.preview.refine();
|
|
139
|
+
if (status === 'error') {
|
|
140
|
+
this._previewFrameOwner = undefined;
|
|
141
|
+
return this._setStatus('error');
|
|
142
|
+
}
|
|
143
|
+
if ((!this.coalesceSceneUpdates || !this.preview.denoising) && this._present(this.preview))
|
|
144
|
+
this._previewFrameOwner = undefined;
|
|
145
|
+
}
|
|
146
|
+
return this._setStatus('previewing');
|
|
125
147
|
}
|
|
126
148
|
const current = selected === 'preview' && this.preview ? this.preview : this.final;
|
|
127
149
|
const imageState = loopImageState(this.final, this.display);
|
|
@@ -129,11 +151,20 @@ export default class RenderLoop {
|
|
|
129
151
|
return this.status;
|
|
130
152
|
// Invalidate a completed filter before refinement when display settings changed.
|
|
131
153
|
if (this.status === 'finished' && imageState !== this._finishedImage && this.final.samples > 0)
|
|
132
|
-
this.
|
|
154
|
+
this._present(this.final);
|
|
133
155
|
const status = current.refine();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const
|
|
156
|
+
// Keep the canvas on the last completed image while filtering the next
|
|
157
|
+
// preview; presenting its raw sample here would overwrite the denoise above.
|
|
158
|
+
const waitingForPreview = !!this.preview && ((current === this.preview && status === 'converging' && current.samples === 0) || (this.coalesceSceneUpdates && this.preview.denoising)) &&
|
|
159
|
+
(current === this.preview || (!current._complete && current.fallback === this.preview));
|
|
160
|
+
if (waitingForPreview)
|
|
161
|
+
this._previewFrameOwner = current;
|
|
162
|
+
else
|
|
163
|
+
this._present(current);
|
|
164
|
+
// Execution may already be tracing final tiles while the canvas still shows
|
|
165
|
+
// preview. Only a successful presentation transfers ownership of the image.
|
|
166
|
+
const previewing = waitingForPreview || (current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);
|
|
167
|
+
const next = status === 'error' ? 'error' : previewing ? 'previewing' : status;
|
|
137
168
|
this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;
|
|
138
169
|
return this._setStatus(next);
|
|
139
170
|
}
|
|
@@ -162,6 +193,7 @@ export default class RenderLoop {
|
|
|
162
193
|
if (this._busy)
|
|
163
194
|
throw new Error('RenderLoop convergence is already running.');
|
|
164
195
|
this._busy = true;
|
|
196
|
+
this._previewFrameOwner = undefined;
|
|
165
197
|
this._cancelFrame();
|
|
166
198
|
try {
|
|
167
199
|
for (const sync of this._syncs)
|
|
@@ -172,7 +204,7 @@ export default class RenderLoop {
|
|
|
172
204
|
this._setStatus(progress.stage === 'denoising' ? 'denoising' : this.final.status);
|
|
173
205
|
options.onProgress?.(progress);
|
|
174
206
|
} });
|
|
175
|
-
this.
|
|
207
|
+
this._present(this.final);
|
|
176
208
|
this._setStatus('finished');
|
|
177
209
|
return result;
|
|
178
210
|
}
|