@meimu/mutracer 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +3525 -3484
  3. package/docs/materials.md +27 -7
  4. package/docs/threejs.md +13 -2
  5. package/docs/viewer.md +53 -0
  6. package/lib/oidn.d.ts +1 -1
  7. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  8. package/lib/renderer/MaterialTable.d.ts +1 -0
  9. package/lib/renderer/MaterialTable.js +2 -1
  10. package/lib/renderer/MaterialTable.js.map +1 -1
  11. package/lib/renderer/WGPUBloomPass.js +18 -18
  12. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  13. package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
  14. package/lib/renderer/WGPURayTraceOutput.js +14 -12
  15. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  16. package/lib/renderer/WGPURayTracePass.js +2 -2
  17. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  18. package/lib/renderer/WGPURenderingPipeline.js +20 -18
  19. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  20. package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
  21. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  22. package/lib/renderer/WebGLRayTracePass.js +3 -1
  23. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  24. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  25. package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
  26. package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
  27. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
  28. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
  29. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  30. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  31. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
  32. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
  33. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
  34. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
  36. package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
  37. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  38. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
  39. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  40. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  41. package/lib/renderer/glsl/rayTrace.frag.js +128 -128
  42. package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
  43. package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
  44. package/lib/renderer/lightsUtil.js +1 -1
  45. package/lib/renderer/lightsUtil.js.map +1 -1
  46. package/lib/renderer/materialComparison.generated.js +5 -0
  47. package/lib/renderer/materialComparison.generated.js.map +1 -1
  48. package/lib/renderer/materialLayout.js +2 -1
  49. package/lib/renderer/materialLayout.js.map +1 -1
  50. package/lib/renderer/prepareMeshBVH.d.ts +4 -2
  51. package/lib/renderer/prepareMeshBVH.js +44 -20
  52. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  53. package/lib/renderer/scratchSampling.js +6 -6
  54. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  55. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
  56. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
  57. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  58. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
  59. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
  60. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
  61. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  62. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
  63. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  64. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  65. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
  66. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
  67. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
  68. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
  69. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
  70. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  71. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  72. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  73. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
  74. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
  75. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  76. package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
  77. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  79. package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
  80. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  81. package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
  82. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  83. package/lib/scene/OpenPBRMaterial.d.ts +4 -2
  84. package/lib/scene/OpenPBRMaterial.js +4 -2
  85. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  86. package/lib/scene/openPbrSchema.d.ts +7 -2
  87. package/lib/scene/openPbrSchema.js +2 -1
  88. package/lib/scene/openPbrSchema.js.map +1 -1
  89. package/lib/util/fromTHREE.d.ts +1 -0
  90. package/lib/util/fromTHREE.js +24 -6
  91. package/lib/util/fromTHREE.js.map +1 -1
  92. package/lib/version.d.ts +1 -1
  93. package/lib/version.js +1 -1
  94. package/lib/version.js.map +1 -1
  95. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"WebGLRayTracePass.js","sourceRoot":"","sources":["../../src/renderer/WebGLRayTracePass.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeBounces } from './pathLimits.js';\nimport { updateMeshInstanceColors } from './prepareMeshBVH.js';\nimport { updateTLASInstanceColors } from './bvhAccel.js';\nimport { getMaterialHashKey } from '../scene/openPbrSchema.js';\nimport { sameInstanceMembership } from './meshInstances.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { dirtyMeshInstanceIndices } from './prepareMeshBVH.js';\nimport { cameraApertureRadius } from './cameraLens.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { samplingPatternCode, zSobolLog2SPP, type SamplingPattern } from './sampling.js';\nimport depthQueryFrag from './glsl/depthQuery.frag.js';\nimport { readFloatPixelsAsync } from './WebGLReadback.js';\nimport { DEPTH_SAMPLE_GRID, packDepthSampleArea, unpackDepthSamples, type DepthSampleArea } from './depthQuery.js';\nimport { MeshMembershipCache } from './meshMembership.js';\nimport { SceneEnvironmentCache, RectLightTextureTracker } from './sceneLightChanges.js';\nimport { MaterialChangeTracker, materialIsEmissive, type MaterialUpdateLevel } from './materialChanges.js';\nimport {\n constants,\n WebGLDevice as WebGLRenderer,\n Texture2D as WebGLTexture2D\n} from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport { mat4 } from '../math.js';\nimport Mesh from '../scene/Mesh.js';\nimport {\n buildBLAS,\n buildTLAS,\n concatBLASBuffers,\n refitBLAS,\n refitTLAS,\n mergeRefitRanges,\n type FlattendBVH\n} from './bvhAccel.js';\nimport {\n generateBackgroundMapFromSceneBackground\n} from './envMapCreation.js';\nimport {\n envMapDistribution,\n environmentMapSourcesMatch,\n type EnvironmentMapSource\n} from './envMapDistribution.js';\nimport createRayTraceFragmentShader from './glsl/rayTrace.frag.js';\nimport shadowCatcherFrag from './glsl/shadowCatcher.frag.js';\nimport MaterialTable, {\n DEFAULT_MAX_TEXTURE_ARRAY_BYTES,\n materialUsesMedium\n} from './MaterialTable.js';\nimport OpenPBRMaterial, {\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\n\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { isIntelMac, numberArraysEqual } from './util.js';\nimport Camera from '../scene/Camera.js';\nimport {\n commonLinearFloatProps,\n commonNearestFloatProps,\n setDataTexture,\n textureDimensionsFromArray\n} from './dataTextureUtil.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n packLightsToBuffer\n} from './lightsUtil.js';\nimport {\n estimateAnalyticLightPower,\n estimateEnvironmentPower,\n packIESProfiles\n} from './lightSampling.js';\nimport { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged } from './geometryUpdates.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';\nimport { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';\nimport {\n DEFAULT_BEVEL_SAMPLES,\n normalizeBevelSamples\n} from './RenderingPipeline.js';\nimport {\n getOpenPbrEnergyLutData,\n OPENPBR_ENERGY_LUT_HEIGHT,\n OPENPBR_ENERGY_LUT_WIDTH\n} from './openPbrEnergyLut.js';\n\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n// A defensive mixture keeps weak-but-wide lights from being starved by an\n// imperfect scalar power estimate while still favoring dominant emitters.\nconst POWER_WEIGHTED_LIGHT_MIX = 0.25;\n\nfunction packLightsToTexture(\n texture: WebGLTexture2D,\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number>,\n selectionCdfs: ArrayLike<number>,\n iesProfileTexelOffsets: ArrayLike<number>\n) {\n const data = packLightsToBuffer(\n lights,\n texturesIndices,\n selectionPmfs,\n selectionCdfs,\n iesProfileTexelOffsets\n );\n texture.source = {\n data,\n width: data.length / 4,\n height: 1\n };\n}\n\n// TODO EXT_float_blend\n// rayTraceBlendNode.inputs = {\n// colorTex: rayTraceNode,\n// prevColorTex: {\n// node: rayTraceBlendNode,\n// prevFrame: true\n// }\n// };\n\n// TODO use one method to set all required properties.\n// Ensure necessary properties are set.\nclass WebGLRayTracePass {\n private readonly _renderer: WebGLRenderer;\n private _meshes: Mesh[] = [];\n private _sceneEnvironment = new SceneEnvironmentCache();\n private _rectLightTextures = new RectLightTextureTracker();\n private _analyticLights: AnalyticLight[] = [];\n private _analyticLightSelectionPmfs = new Float32Array(0);\n private _analyticLightSelectionCdfs = new Float32Array(0);\n private _envLightSelectionPmf = 0;\n private _materialData: MaterialTable | undefined;\n private _maxTextureArrayBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n private _preparedMeshData?: ReturnType<typeof updateMeshInstances>;\n private _membershipCache = new MeshMembershipCache();\n private _pendingMembershipData?: ReturnType<typeof updateMeshInstances>;\n private _materialChanges = new MaterialChangeTracker();\n private _pendingMaterialUpdate?: { level: MaterialUpdateLevel; emission: boolean; emissiveMap: boolean; materials: Set<OpenPBRMaterial> };\n private _pendingGeometryUpdates = new Set<Geometry>();\n private _needsUpdateMeshData = true;\n private _needsUpdateMeshMembership = false;\n private _needsRefitTLAS = false;\n private _dirtyTransformMeshes = new Set<Mesh>();\n private _dirtyColorMeshes = new Set<Mesh>();\n private _tlas?: FlattendBVH;\n private _bvhData?: Float32Array;\n private _instancesData?: Float32Array;\n private _materialIndexData?: Float32Array;\n private _meshSnapshot: {\n mesh: Mesh;\n instanceCount: number;\n instanceVersion: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion: number;\n geometry: Mesh['geometry'];\n materials: OpenPBRMaterial[];\n materialKeys: string[];\n geometryVersion: number;\n positionArray: Float32Array;\n indexArray: Geometry['indices']['array'];\n matrix: number[];\n }[] = [];\n private _snapshotByMesh = new WeakMap<Mesh, (typeof this._meshSnapshot)[number]>();\n private _needsUpdateAnalyticLightsBuffer = true;\n private _debugBvhData?: {\n buffer: ArrayBuffer;\n };\n\n private _lightTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileColumns = 1;\n private _iesProfileTexelOffsets = new Int32Array(0);\n private _openPbrEnergyLut = new WebGLTexture2D({\n ...commonNearestFloatProps,\n source: {\n data: getOpenPbrEnergyLutData(),\n width: OPENPBR_ENERGY_LUT_WIDTH,\n height: OPENPBR_ENERGY_LUT_HEIGHT\n }\n });\n\n private _envMap = new WebGLTexture2D(commonLinearFloatProps);\n private _envMapDistribution = new WebGLTexture2D(commonLinearFloatProps);\n private _envImageSource?: EnvironmentMapSource;\n private _backgroundTex = new WebGLTexture2D(commonLinearFloatProps);\n\n private _hasEnvMap = false;\n private _hasBackground = false;\n private _groundedBackgroundParams = new Float32Array([0, 0, 0, 0]);\n private _groundedBackgroundCenter = new Float32Array([0, 0]);\n\n private _bounces = 2;\n private _bevelSamples = DEFAULT_BEVEL_SAMPLES;\n private _clamping?: number;\n\n // higher number results in faster convergence over time, but with lower quality initial samples\n\n private _samplingCode = -1;\n private _sequenceSeed = 0;\n private _zLogSPP = 0;\n\n private _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _matIndexBufferTex = new WebGLTexture2D({\n ...commonNearestFloatProps\n // type: constants.INT\n });\n\n private _hasTransmission = false;\n private _hasAlpha = false;\n\n private _invalid = false;\n private _transmissiveAlphaMin = 1;\n\n private _mainPass: WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >;\n private _shadowCatcherPass: WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >;\n\n private _viewProjInv = mat4.create();\n private _apertureRadius = 0;\n private _focusDistance = 10;\n\n private _tracePasses: WebGLFullQuadPass<any, any>[];\n private readonly _depthPass: WebGLFullQuadPass<never, 'depth'>;\n private readonly _depthAbort = new AbortController();\n private _depthAspect = 1;\n private _hasShadowCatcher = false;\n private _spectral = false;\n\n constructor(renderer: WebGLRenderer) {\n this._renderer = renderer;\n const accumulationOutput = {\n type: constants.FLOAT,\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n };\n\n const rayTraceFrag = createRayTraceFragmentShader();\n rayTraceFrag.parallelCompile = true;\n shadowCatcherFrag.parallelCompile = true;\n this._mainPass = new WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >('rayTrace', renderer, {\n shader: rayTraceFrag,\n // `moments` holds the denoiser's guide value moments and sample count.\n outputs: ['color', 'albedo', 'normal', 'moments'],\n outputParams: {\n color: accumulationOutput,\n albedo: accumulationOutput,\n normal: accumulationOutput,\n moments: accumulationOutput\n }\n });\n this._shadowCatcherPass = new WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >(\n 'shadowCatcher',\n renderer,\n {\n shader: shadowCatcherFrag,\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n outputParams: {\n shadowCatcher: accumulationOutput,\n catcherBackground: accumulationOutput,\n catcherMoments: accumulationOutput\n }\n }\n );\n this._depthPass = new WebGLFullQuadPass('Depth query', renderer, {\n shader: depthQueryFrag, outputs: ['depth'],\n outputParams: { depth: commonNearestFloatProps }\n });\n this._tracePasses = [this._mainPass, this._shadowCatcherPass, this._depthPass];\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n OES_texture_float_linear: !!renderer.gl.getExtension(\n 'OES_texture_float_linear'\n )\n });\n });\n this._mainPass.setUniform('openPbrEnergyLut', this._openPbrEnergyLut);\n }\n\n createPass(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number },\n disableShadowCatcher = false\n ) {\n this.prepare();\n const options = {\n clear,\n blend: !clear,\n scissor: tile\n };\n this._mainPass.createPass({} as Record<never, WebGLTexture2D>, undefined, options);\n if (this._hasShadowCatcher && !disableShadowCatcher) {\n this._shadowCatcherPass.createPass(\n {} as Record<never, WebGLTexture2D>,\n undefined,\n options\n );\n }\n }\n\n getOutput(\n label: 'color' | 'albedo' | 'normal' | 'moments' |\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n ) {\n return label === 'shadowCatcher' || label === 'catcherBackground' ||\n label === 'catcherMoments'\n ? this._shadowCatcherPass.getOutput(label)\n : this._mainPass.getOutput(label);\n }\n\n setBounce(bounce: number) {\n const next = normalizeBounces(bounce);\n const changed = this._bounces !== next;\n this._bounces = next;\n return changed;\n }\n\n setClamping(clamping?: number) {\n const changed = this._clamping !== clamping;\n this._clamping = clamping;\n return changed;\n }\n\n setBevelSamples(samples: number) {\n const next = normalizeBevelSamples(samples);\n const changed = this._bevelSamples !== next;\n if (changed) {\n this._bevelSamples = next;\n }\n return changed;\n }\n\n private _setEnvMap(envImage: EnvironmentMapSource | undefined) {\n if (!environmentMapSourcesMatch(envImage, this._envImageSource) && envImage) {\n this._envMap.source = envImage;\n this._envMapDistribution.source = envMapDistribution(envImage);\n }\n this._envImageSource = envImage;\n this._tracePasses.forEach((pass) => {\n pass.setUniform('envMap', envImage ? this._envMap : null);\n pass.setUniform(\n 'envMapDistribution',\n envImage ? this._envMapDistribution : null\n );\n pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf);\n\n pass.setDefines({\n USE_ENVMAP: !!envImage\n });\n });\n\n this._hasEnvMap = !!envImage;\n }\n\n setBackground(background?: SceneBackground) {\n const backgroundImage =\n background && generateBackgroundMapFromSceneBackground(background)!;\n\n if (backgroundImage) {\n this._backgroundTex.source = backgroundImage;\n }\n this._hasBackground = !!backgroundImage;\n const grounded =\n background &&\n !Array.isArray(background) &&\n 'type' in background &&\n background.type === 'GroundedSkybox'\n ? background\n : undefined;\n this._groundedBackgroundParams.set(\n grounded\n ? [\n Math.max(grounded.height, 0.0001),\n Math.max(grounded.radius, 0.0001),\n grounded.groundHeight ?? 0,\n 1\n ]\n : [0, 0, 0, 0]\n );\n this._groundedBackgroundCenter.set(grounded?.center ?? [0, 0]);\n }\n\n setTransmissiveOutputAlphaMin(transmissiveAlphaMin: number) {\n const changed = this._transmissiveAlphaMin !== transmissiveAlphaMin;\n this._transmissiveAlphaMin = transmissiveAlphaMin;\n return changed;\n }\n\n setMeshes(meshes: Mesh[], update?: { transforms?: readonly Mesh[]; colors?: readonly Mesh[]; geometries?: readonly Geometry[]; materials?: readonly OpenPBRMaterial[] }) {\n for (const mesh of update?.colors ?? []) this._dirtyColorMeshes.add(mesh);\n if (update && this._preparedMeshData && this._materialData &&\n !this._needsUpdateMeshData && meshes === this._meshes) {\n const change = this._materialChanges.classify(update.materials ?? []);\n if (change.level !== 'geometry' && canUpdateGeometries(this._preparedMeshData, update.geometries ?? [])) {\n if (update.materials?.length) {\n const pending = this._pendingMaterialUpdate;\n this._pendingMaterialUpdate = { level: pending?.level === 'textures' ? 'textures' : change.level,\n emission: !!pending?.emission || change.emission,\n emissiveMap: !!pending?.emissiveMap || change.emissiveMap,\n materials: new Set([...(pending?.materials ?? []), ...update.materials]) };\n this._meshSnapshot.forEach(item => { item.materialKeys = item.materials.map(getMaterialHashKey); });\n }\n for (const geometry of update.geometries ?? []) this._pendingGeometryUpdates.add(geometry);\n for (const item of this._meshSnapshot) if (this._pendingGeometryUpdates.has(item.geometry)) item.geometryVersion = item.geometry.version;\n for (const mesh of update.transforms ?? []) {\n const item = this._snapshotByMesh.get(mesh);\n if (!item) continue;\n for (let i = 0; i < 16; i++) item.matrix[i] = mesh.transform[i];\n this._dirtyTransformMeshes.add(mesh); this._needsRefitTLAS = true;\n }\n return !!update.materials?.length || !!update.transforms?.length || !!update.colors?.length || !!update.geometries?.length;\n }\n }\n const materialChange = !!update?.materials?.length;\n const next = meshes.map((mesh) => ({\n mesh,\n instanceCount: mesh instanceof InstancedMesh ? mesh.count : 1,\n instanceVersion: mesh instanceof InstancedMesh ? mesh.transformsVersion : 0,\n instanceTransforms: mesh instanceof InstancedMesh ? mesh.transforms : undefined,\n instanceColors: mesh instanceof InstancedMesh ? mesh.colors : undefined,\n colorVersion: mesh instanceof InstancedMesh ? mesh.colorsVersion : 0,\n geometry: mesh.geometry,\n materials: mesh.materials.slice(),\n materialKeys: mesh.materials.map(getMaterialHashKey),\n geometryVersion: mesh.geometry.version,\n positionArray: mesh.geometry.position.array, indexArray: mesh.geometry.indices.array,\n matrix: Array.from(mesh.transform as ArrayLike<number>)\n }));\n const membershipChanged = next.length !== this._meshSnapshot.length ||\n next.some((item, i) => item.mesh !== this._meshSnapshot[i]?.mesh || item.instanceCount !== this._meshSnapshot[i]?.instanceCount ||\n item.materials.some((material, k) => material !== this._meshSnapshot[i]?.materials[k]));\n const membership = !this._needsUpdateMeshData && membershipChanged && this._preparedMeshData\n ? this._membershipCache.update(this._preparedMeshData, meshes) : undefined;\n if (membership) {\n const versions = new Map(this._meshSnapshot.flatMap(item => item.materials.map((m, i) => [m, item.materialKeys[i]] as const)));\n const materialsChanged = membership.materials.length !== this._preparedMeshData!.materials.length ||\n membership.materials.some((m, i) => m !== this._preparedMeshData!.materials[i] ||\n versions.has(m) && getMaterialHashKey(m) !== versions.get(m));\n this._pendingMembershipData = membership;\n this._meshes = meshes;\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n this._needsUpdateMeshMembership = true;\n this._needsRefitTLAS = false;\n this._dirtyTransformMeshes.clear();\n if (materialsChanged) this._pendingMaterialUpdate = { level: 'textures', emission: true,\n emissiveMap: true, materials: new Set(membership.materials) };\n return true;\n }\n const changed =\n next.length !== this._meshSnapshot.length ||\n next.some((item, i) => {\n const prev = this._meshSnapshot[i];\n return (\n !prev ||\n item.mesh !== prev.mesh || item.instanceCount !== prev.instanceCount || item.instanceVersion !== prev.instanceVersion || item.instanceTransforms !== prev.instanceTransforms ||\n item.geometry !== prev.geometry || item.colorVersion !== prev.colorVersion || item.instanceColors !== prev.instanceColors ||\n item.materials.length !== prev.materials.length ||\n item.materials.some((material, k) => material !== prev.materials[k]) ||\n item.materialKeys.some((hash, k) => hash !== prev.materialKeys[k]) ||\n item.geometryVersion !== prev.geometryVersion ||\n item.matrix.some((value, k) => value !== prev.matrix[k])\n );\n });\n next.forEach((item, i) => {\n const prev = this._meshSnapshot[i];\n if (\n prev &&\n item.geometry === prev.geometry &&\n (item.geometryVersion !== prev.geometryVersion || item.positionArray !== prev.positionArray || item.indexArray !== prev.indexArray)\n ) {\n const usesDisplacement =\n !!item.materials[0]?.displacementMap &&\n Math.abs(item.materials[0].displacementScale) > 1e-6;\n if (\n usesDisplacement || geometryTopologyChanged(this._preparedMeshData, item.geometry) ||\n !getGeometryBvh(item.geometry) ||\n !refitBLAS(getGeometryBvh(item.geometry)!, item.geometry)\n ) {\n setGeometryBvh(item.geometry, undefined);\n }\n }\n });\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n if (!changed && update && !materialChange) return false;\n this._meshes = meshes;\n this._needsUpdateMeshData = true;\n this._needsRefitTLAS = false; this._dirtyTransformMeshes.clear();\n this._debugBvhData = undefined;\n return true;\n }\n\n setTextureAtlasBudget(maxBytes: number) {\n const next = Number.isFinite(maxBytes)\n ? Math.max(4, Math.floor(maxBytes))\n : DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n if (next === this._maxTextureArrayBytes) return false;\n this._maxTextureArrayBytes = next;\n this._needsUpdateMeshData = true;\n return true;\n }\n\n getDebugBVHData() {\n if (!this._debugBvhData) {\n const mergedMesh = mergeMeshesToGeometry(this._meshes);\n const bvh = buildBLAS(mergedMesh.geometry);\n this._debugBvhData = { buffer: bvh.buffer };\n }\n return this._debugBvhData;\n }\n\n getDiagnostics() {\n return {\n textureAtlas: this._materialData?.textureAtlasStats\n };\n }\n\n private _updateMeshData() {\n this._pendingGeometryUpdates.clear();\n this._needsUpdateMeshData = false;\n\n const res = updateMeshInstances(this._meshes);\n this._preparedMeshData = res;\n this._membershipCache.capture(res);\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n const mergedGeometry = res.geometry;\n const materials = res.materials;\n const tlas = buildTLAS(res.instances, res.blases);\n this._tlas = tlas;\n const tlasBuffer = new Float32Array(tlas.buffer);\n const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer!);\n const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));\n const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);\n const blasOffset = tlasBuffer.length / 4;\n bvhBuffer.set(tlasBuffer);\n bvhBuffer.set(blasBuffer, blasOffset * 4);\n\n if (mergedGeometry.position.array.length > 0) {\n setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);\n setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);\n mergedGeometry.color &&\n setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);\n mergedGeometry.tangent &&\n setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);\n mergedGeometry.uv &&\n setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);\n mergedGeometry.uv1 &&\n setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);\n mergedGeometry.materialIndex &&\n setDataTexture(\n this._matIndexBufferTex,\n // TODO currently int texture doesn't work\n this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array),\n 4\n );\n }\n if (bvhBuffer.length > 0) {\n setDataTexture(this._bvhBufferTex, bvhBuffer, 4);\n setDataTexture(this._instancesBufferTex, instancesBuffer, 4);\n }\n\n this._materialData?.dispose(this._renderer.gl);\n const materialData = new MaterialTable(\n materials,\n this._analyticLights,\n {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS\n ),\n maxTextureDimension2D: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_TEXTURE_SIZE\n )\n }\n );\n this._materialData = materialData;\n\n this._tracePasses.forEach((pass) => {\n pass.setUniforms({\n bvhBuffer: this._bvhBufferTex,\n instancesBuffer: this._instancesBufferTex,\n positionBuffer: this._positionBufferTex,\n normalBuffer: this._normalBufferTex,\n tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,\n colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,\n uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,\n uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,\n materialIndexBuffer: this._matIndexBufferTex,\n\n bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,\n vertexColumns: textureDimensionsFromArray(\n Attribute.getCount(mergedGeometry.position)\n ).columnsLog,\n instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)\n .columnsLog,\n blasOffset,\n\n isEmptyScene: +(res.instances.length === 0)\n });\n\n });\n this._updateMaterialConstants(materials, materialData, mergedGeometry);\n this._materialChanges.capture(materials);\n this._pendingMaterialUpdate = undefined;\n\n return bvhBuffer;\n }\n\n private _updateMaterialConstants(materials: OpenPBRMaterial[], materialData: MaterialTable, mergedGeometry: Geometry) {\n // Avoid too much shader compilation\n const STACK_SIZE = 50;\n const hasShadowCatcher = materials.some((m) => m.shadowCatcher);\n const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);\n const HAS_MEDIUM = materials.some(materialUsesMedium);\n\n this._hasShadowCatcher = hasShadowCatcher;\n this._hasTransmission = materials.some(\n (m) =>\n m.transmissionWeight > 0 ||\n m.mapAlphaUsage === \"transmission\"\n );\n this._hasAlpha = materials.some(\n (m) => resolveMaterialAlphaMode(m) !== 'opaque'\n );\n this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);\n\n\n this._tracePasses.forEach(pass => {\n pass.setDefines({\n OES_texture_float_linear: true,\n\n STACK_SIZE,\n USE_VERTEX_COLOR: mergedGeometry.color != null,\n USE_TANGENT: mergedGeometry.tangent != null,\n HAS_TRANSMISSION: this._hasTransmission,\n HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),\n HAS_BEVEL,\n HAS_MEDIUM,\n HAS_ALPHA: this._hasAlpha,\n\n BEVEL_SAMPLES: this._bevelSamples,\n\n RECT_LIGHT: CONSTANT_RECT_LIGHT,\n SPHERE_LIGHT: CONSTANT_SPHERE_LIGHT,\n DIRECTIONAL_LIGHT: CONSTANT_DIRECTIONAL_LIGHT,\n\n USE_RR: true,\n // Multiple-scattering SSS paths need enough collisions to return to\n // the boundary before roulette; terminating at depth five produces\n // dark materials and a handful of very large surviving samples.\n RR_MAX: HAS_MEDIUM ? 12 : 2,\n\n ...materialData.defines\n });\n\n materialData.setToPass(pass);\n });\n }\n\n private _updateMeshMembership() {\n const res = this._pendingMembershipData!;\n this._preparedMeshData = res;\n const tlas = this._tlas = buildTLAS(res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n data.set(new Float32Array(tlas.buffer));\n data.set(blas, tlas.buffer.byteLength / 4);\n this._instancesData = new Float32Array(tlas.instancesBuffer!);\n setDataTexture(this._bvhBufferTex, data, 4);\n setDataTexture(this._instancesBufferTex, this._instancesData, 4);\n this._tracePasses.forEach(pass => pass.setUniforms({\n bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,\n instancesColumns: textureDimensionsFromArray(this._instancesData!.length / 4).columnsLog,\n blasOffset: tlas.buffer.byteLength / 16,\n isEmptyScene: +(res.instances.length === 0)\n }));\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n this._debugBvhData = undefined;\n }\n\n private _updateGeometryData() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);\n for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {\n for (const [attribute, texture] of [\n [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],\n [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],\n [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]\n ] as const) if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent)) texture.updateDataRange(this._renderer.gl, attribute.array,\n first * attribute.itemSize * 4, count * attribute.itemSize * 4);\n if (!topologyChanged) continue;\n const material = this._materialIndexData!;\n for (let i = first * 4; i < (first + count) * 4; i++) material[i] = res.geometry.materialIndex!.array[i];\n this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);\n }\n for (const mesh of update.meshes) this._dirtyTransformMeshes.add(mesh);\n if (update.relocated) for (const binding of res.instanceBindings) this._dirtyTransformMeshes.add(binding.mesh);\n if (update.resized) {\n res.instances = updateMeshInstanceTransforms(res.instanceBindings);\n refitTLAS(tlas, res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n this._bvhData.set(new Float32Array(tlas.buffer)); this._bvhData.set(blas, tlas.buffer.byteLength / 4);\n setDataTexture(this._bvhBufferTex, this._bvhData, 4);\n this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData!.length / 4).columnsLog));\n } else {\n const ranges = [];\n for (const { blas, offset } of update.blases) {\n const target = tlas.buffer.byteLength + offset;\n new Uint8Array(this._bvhData!.buffer).set(new Uint8Array(blas.buffer), target);\n ranges.push({offset: target, size: blas.buffer.byteLength});\n }\n for (const { offset, size } of mergeRefitRanges(ranges)) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n }\n this._needsRefitTLAS = true; this._pendingGeometryUpdates.clear(); this._debugBvhData = undefined;\n }\n\n private _updateMeshColors() {\n const res = this._preparedMeshData, tlas = this._tlas;\n if (res && tlas) {\n const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);\n const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);\n for (const {offset, size} of ranges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n }\n this._dirtyColorMeshes.clear();\n }\n\n private _refitMeshInstances() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const dirty = dirtyMeshInstanceIndices(res.instanceBindings, this._dirtyTransformMeshes, res.instances);\n const previousInstances = res.instances;\n res.instances = updateMeshInstanceTransforms(res.instanceBindings, res.instances, dirty);\n if (!sameInstanceMembership(previousInstances, res.instances)) {\n this._pendingMembershipData = res;\n this._updateMeshMembership();\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n return;\n }\n const ranges = refitTLAS(tlas, res.instances, res.blases, dirty);\n this._bvhData!.set(new Float32Array(tlas.buffer));\n for (const { offset, size } of ranges.tlasRanges) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n for (const { offset, size } of ranges.instanceRanges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n this._debugBvhData = undefined;\n }\n\n private _updateMaterialData() {\n const update = this._pendingMaterialUpdate!;\n const res = this._preparedMeshData!;\n let data = this._materialData!;\n if (update.level === 'textures') {\n data.dispose(this._renderer.gl);\n data = this._materialData = new MaterialTable(res.materials, this._analyticLights, {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS),\n maxTextureDimension2D: this._renderer.gl.getParameter(this._renderer.gl.MAX_TEXTURE_SIZE)\n });\n this._needsUpdateAnalyticLightsBuffer = true;\n } else data.repackParams(res.materials);\n this._updateMaterialConstants(res.materials, data, res.geometry);\n if (update.emission || update.emissiveMap) {\n // WebGL currently evaluates mesh emission on path hits; its direct-light\n // sampler has only analytic/environment sources. Retain that behavior.\n res.emissiveBindings = res.instanceBindings.filter(binding =>\n binding.materialIndices.some(index => materialIsEmissive(res.materials[index])));\n }\n this._materialChanges.capture([...update.materials]);\n this._pendingMaterialUpdate = undefined;\n }\n\n setLights(lights: SceneLight[]) {\n const analyticLights = lights.filter(\n (light) =>\n light.type === 'DirectionalLight' ||\n light.type === 'SphereLight' ||\n light.type === 'SpotLight' ||\n light.type === 'RectLight'\n ) as AnalyticLight[];\n const numAnalyticLights = analyticLights.length;\n\n const envImage = this._sceneEnvironment.update(lights);\n\n const envWeight = estimateEnvironmentPower(envImage);\n const analyticWeights = analyticLights.map(estimateAnalyticLightPower);\n const totalWeight =\n envWeight + analyticWeights.reduce((sum, weight) => sum + weight, 0);\n const sourceCount = analyticLights.length + (envImage ? 1 : 0);\n const fallbackPmf = sourceCount > 0 ? 1 / sourceCount : 0;\n this._envLightSelectionPmf = envImage\n ? totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (envWeight / totalWeight)\n : fallbackPmf\n : 0;\n this._analyticLightSelectionPmfs = Float32Array.from(\n analyticWeights,\n (weight) =>\n totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)\n : fallbackPmf\n );\n let cumulativePmf = this._envLightSelectionPmf;\n this._analyticLightSelectionCdfs = Float32Array.from(\n this._analyticLightSelectionPmfs,\n (pmf) => {\n cumulativePmf += pmf;\n return cumulativePmf;\n }\n );\n if (this._analyticLightSelectionCdfs.length > 0) {\n this._analyticLightSelectionCdfs[\n this._analyticLightSelectionCdfs.length - 1\n ] = 1;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n NUM_LIGHTS: numAnalyticLights,\n HAS_SPHERE_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SphereLight'\n ),\n HAS_SPOT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SpotLight'\n ),\n HAS_RECT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'RectLight'\n ),\n HAS_DIRECTIONAL_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'DirectionalLight'\n )\n });\n });\n\n const lightTexturesChanged = this._rectLightTextures.update(analyticLights);\n this._analyticLights = analyticLights;\n const packedIES = packIESProfiles(analyticLights);\n this._iesProfileTexelOffsets = packedIES.offsets;\n this._iesProfileColumns = setDataTexture(\n this._iesProfileTex,\n packedIES.data.length ? packedIES.data : new Float32Array(4),\n 4\n ).columns;\n if (lightTexturesChanged) this._needsUpdateMeshData = true;\n\n this._needsUpdateAnalyticLightsBuffer = true;\n\n this._setEnvMap(envImage);\n }\n\n private _getViewProjInv(camera: Camera, viewProjInv: mat4.Mat4Array) {\n mat4.invert(viewProjInv, camera.getProjectionMatrix(this._depthAspect));\n mat4.mul(viewProjInv, camera.transform, viewProjInv);\n }\n\n setCamera(camera: Camera) {\n const viewProjectionInv = this._viewProjInv;\n this._apertureRadius = cameraApertureRadius(camera);\n this._focusDistance = camera.focusDistance;\n this._getViewProjInv(camera, viewProjectionInv);\n this._tracePasses.forEach((pass) => {\n pass.setUniform('viewProjectionInv', viewProjectionInv);\n pass.setUniform('viewInv', camera.transform);\n // Zero for orthographic cameras, which have no depth of field.\n pass.setUniform('cameraApertureRadius', this._apertureRadius);\n pass.setUniform('cameraFocusDistance', camera.focusDistance);\n });\n }\n\n cameraChanged(camera: Camera) {\n const tmp = mat4.create();\n this._getViewProjInv(camera, tmp);\n return (\n !numberArraysEqual(this._viewProjInv, tmp) ||\n cameraApertureRadius(camera) !== this._apertureRadius ||\n camera.focusDistance !== this._focusDistance\n );\n }\n\n setSize(width: number, height: number, targetAspect = width / height) {\n this._depthAspect = targetAspect;\n this._tracePasses.forEach((pass) => {\n pass.setSize(pass === this._depthPass ? DEPTH_SAMPLE_GRID : width,\n pass === this._depthPass ? DEPTH_SAMPLE_GRID : height);\n pass.setUniform('pixelSize', [1 / width, 1 / height]);\n });\n }\n\n setJitter(x: number, y: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('jitter', [x, y]);\n });\n }\n\n releaseTarget(target: object) { this._mainPass.releaseTarget(target); this._shadowCatcherPass.releaseTarget(target); }\n\n getTargetMemoryBytes(target: object) {\n return this._mainPass.getMemoryBytes(target) + this._shadowCatcherPass.getMemoryBytes(target);\n }\n\n useTarget(target: object) {\n this._mainPass.useTarget(target);\n this._shadowCatcherPass.useTarget(target);\n }\n\n setQuality(options: { bounces: number; bevel: boolean; dispersionWavelengths: 1 | 3; directLightCandidates: number }) {\n this._tracePasses.forEach(pass => {\n pass.setUniform('bounceLimit', normalizeBounces(options.bounces));\n pass.setUniform('bevelEnabled', options.bevel);\n pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);\n });\n }\n\n setWavelength(wavelength: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('wavelength', wavelength);\n });\n }\n\n setSampleCount(sampleCount: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('sampleCount', sampleCount);\n });\n }\n\n isInvalid() {\n return this._invalid;\n }\n\n hasShadowCatcher() {\n return this._hasShadowCatcher;\n }\n\n hasDispersion() {\n return this._spectral;\n }\n\n prepare(): void {\n if (this._needsUpdateMeshData) {\n this._updateMeshData();\n } else if (this._needsUpdateMeshMembership) {\n this._updateMeshMembership();\n }\n if (this._pendingGeometryUpdates.size) this._updateGeometryData();\n if (this._needsRefitTLAS) this._refitMeshInstances();\n if (this._dirtyColorMeshes.size) this._updateMeshColors();\n\n if (this._pendingMaterialUpdate) this._updateMaterialData();\n\n if (this._needsUpdateAnalyticLightsBuffer) {\n const analyticLights = this._analyticLights;\n analyticLights.length > 0 &&\n packLightsToTexture(\n this._lightTex,\n analyticLights,\n this._materialData!.getLightTexturesIndices(),\n this._analyticLightSelectionPmfs,\n this._analyticLightSelectionCdfs,\n this._iesProfileTexelOffsets\n );\n this._needsUpdateAnalyticLightsBuffer = false;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setUniform(\n 'backgroundMap',\n this._hasBackground\n ? this._backgroundTex\n : this._hasEnvMap\n ? this._envMap\n : null\n );\n\n pass.setUniform(\n 'transmissiveOutputAlphaMin',\n Math.max(Math.min(1, this._transmissiveAlphaMin), 0)\n );\n\n pass.setUniform('lightsTex', this._lightTex);\n pass.setUniform('iesProfileData', this._iesProfileTex);\n pass.setUniform('iesProfileColumns', this._iesProfileColumns);\n pass.setUniform('groundedBackgroundParams', this._groundedBackgroundParams);\n pass.setUniform('groundedBackgroundCenter', this._groundedBackgroundCenter);\n\n pass.setDefines({\n // Double bounce fix on intel mac\n // Limit the bounce to avoid long compilation time.\n BOUNCES: isIntelMac()\n ? Math.min(this._bounces, 3) *\n (this._hasTransmission || this._hasAlpha ? 2 : 1)\n : this._bounces,\n CLAMPING: this._clamping || undefined,\n BEVEL_SAMPLES: this._bevelSamples,\n USE_BACKGROUND: this._hasBackground,\n USE_GROUNDED_BACKGROUND: this._groundedBackgroundParams[3] > 0\n });\n });\n }\n\n setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed = 0) {\n const code = samplingPatternCode(pattern);\n const logSPP = zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples);\n const changed = this._samplingCode !== code || this._sequenceSeed !== (sequenceSeed >>> 0) ||\n (code === 1 && this._zLogSPP !== logSPP);\n this._samplingCode = code;\n this._sequenceSeed = sequenceSeed >>> 0;\n this._zLogSPP = logSPP;\n this._tracePasses.forEach(pass => {\n pass.setUniform('samplingPattern', code);\n pass.setUniform('sequenceSeed', this._sequenceSeed);\n pass.setUniform('zSobolLogSPP', logSPP);\n });\n return changed;\n }\n\n // WebGL has uniform per-pixel counts; setSampleCount already includes offset.\n setSampleSequenceOffset(_offset: number) {}\n\n async readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined> {\n if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||\n !this._renderer.isAllProgramCompiled()) return;\n this.prepare();\n this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));\n this._depthPass.createPass({});\n const rgba = await readFloatPixelsAsync(this._renderer.gl,\n DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);\n return unpackDepthSamples(rgba);\n }\n\n dispose() {\n this._depthAbort.abort();\n this._materialData?.dispose(this._renderer.gl);\n this._materialData = undefined;\n this._tracePasses.forEach((pass) => pass.dispose());\n const gl = this._renderer.gl;\n [\n this._lightTex,\n this._openPbrEnergyLut,\n this._envMap,\n this._envMapDistribution,\n this._backgroundTex,\n this._positionBufferTex,\n this._normalBufferTex,\n this._colorBufferTex,\n this._tangentBufferTex,\n this._uvBufferTex,\n this._uv1BufferTex,\n this._bvhBufferTex,\n this._instancesBufferTex,\n this._matIndexBufferTex\n ].forEach((texture) => texture.dispose(gl));\n }\n}\n\nexport default WebGLRayTracePass;\n"]}
1
+ {"version":3,"file":"WebGLRayTracePass.js","sourceRoot":"","sources":["../../src/renderer/WebGLRayTracePass.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeBounces } from './pathLimits.js';\nimport { updateMeshInstanceColors } from './prepareMeshBVH.js';\nimport { updateTLASInstanceColors } from './bvhAccel.js';\nimport { getMaterialHashKey } from '../scene/openPbrSchema.js';\nimport { sameInstanceMembership } from './meshInstances.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { dirtyMeshInstanceIndices } from './prepareMeshBVH.js';\nimport { cameraApertureRadius } from './cameraLens.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { samplingPatternCode, zSobolLog2SPP, type SamplingPattern } from './sampling.js';\nimport depthQueryFrag from './glsl/depthQuery.frag.js';\nimport { readFloatPixelsAsync } from './WebGLReadback.js';\nimport { DEPTH_SAMPLE_GRID, packDepthSampleArea, unpackDepthSamples, type DepthSampleArea } from './depthQuery.js';\nimport { MeshMembershipCache } from './meshMembership.js';\nimport { SceneEnvironmentCache, RectLightTextureTracker } from './sceneLightChanges.js';\nimport { MaterialChangeTracker, materialIsEmissive, type MaterialUpdateLevel } from './materialChanges.js';\nimport {\n constants,\n WebGLDevice as WebGLRenderer,\n Texture2D as WebGLTexture2D\n} from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport { mat4 } from '../math.js';\nimport Mesh from '../scene/Mesh.js';\nimport {\n buildBLAS,\n buildTLAS,\n concatBLASBuffers,\n refitBLAS,\n refitTLAS,\n mergeRefitRanges,\n type FlattendBVH\n} from './bvhAccel.js';\nimport {\n generateBackgroundMapFromSceneBackground\n} from './envMapCreation.js';\nimport {\n envMapDistribution,\n environmentMapSourcesMatch,\n type EnvironmentMapSource\n} from './envMapDistribution.js';\nimport createRayTraceFragmentShader from './glsl/rayTrace.frag.js';\nimport shadowCatcherFrag from './glsl/shadowCatcher.frag.js';\nimport MaterialTable, {\n DEFAULT_MAX_TEXTURE_ARRAY_BYTES,\n materialUsesMedium\n} from './MaterialTable.js';\nimport OpenPBRMaterial, {\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\n\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { isIntelMac, numberArraysEqual } from './util.js';\nimport Camera from '../scene/Camera.js';\nimport {\n commonLinearFloatProps,\n commonNearestFloatProps,\n setDataTexture,\n textureDimensionsFromArray\n} from './dataTextureUtil.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n packLightsToBuffer\n} from './lightsUtil.js';\nimport {\n estimateAnalyticLightPower,\n estimateEnvironmentPower,\n packIESProfiles\n} from './lightSampling.js';\nimport { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged } from './geometryUpdates.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';\nimport { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';\nimport {\n DEFAULT_BEVEL_SAMPLES,\n normalizeBevelSamples\n} from './RenderingPipeline.js';\nimport {\n getOpenPbrEnergyLutData,\n OPENPBR_ENERGY_LUT_HEIGHT,\n OPENPBR_ENERGY_LUT_WIDTH\n} from './openPbrEnergyLut.js';\n\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n// A defensive mixture keeps weak-but-wide lights from being starved by an\n// imperfect scalar power estimate while still favoring dominant emitters.\nconst POWER_WEIGHTED_LIGHT_MIX = 0.25;\n\nfunction packLightsToTexture(\n texture: WebGLTexture2D,\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number>,\n selectionCdfs: ArrayLike<number>,\n iesProfileTexelOffsets: ArrayLike<number>\n) {\n const data = packLightsToBuffer(\n lights,\n texturesIndices,\n selectionPmfs,\n selectionCdfs,\n iesProfileTexelOffsets\n );\n texture.source = {\n data,\n width: data.length / 4,\n height: 1\n };\n}\n\n// TODO EXT_float_blend\n// rayTraceBlendNode.inputs = {\n// colorTex: rayTraceNode,\n// prevColorTex: {\n// node: rayTraceBlendNode,\n// prevFrame: true\n// }\n// };\n\n// TODO use one method to set all required properties.\n// Ensure necessary properties are set.\nclass WebGLRayTracePass {\n private readonly _renderer: WebGLRenderer;\n private _meshes: Mesh[] = [];\n private _sceneEnvironment = new SceneEnvironmentCache();\n private _rectLightTextures = new RectLightTextureTracker();\n private _analyticLights: AnalyticLight[] = [];\n private _analyticLightSelectionPmfs = new Float32Array(0);\n private _analyticLightSelectionCdfs = new Float32Array(0);\n private _envLightSelectionPmf = 0;\n private _materialData: MaterialTable | undefined;\n private _maxTextureArrayBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n private _preparedMeshData?: ReturnType<typeof updateMeshInstances>;\n private _membershipCache = new MeshMembershipCache();\n private _pendingMembershipData?: ReturnType<typeof updateMeshInstances>;\n private _materialChanges = new MaterialChangeTracker();\n private _pendingMaterialUpdate?: { level: MaterialUpdateLevel; emission: boolean; emissiveMap: boolean; materials: Set<OpenPBRMaterial> };\n private _pendingGeometryUpdates = new Set<Geometry>();\n private _needsUpdateMeshData = true;\n private _needsUpdateMeshMembership = false;\n private _needsRefitTLAS = false;\n private _dirtyTransformMeshes = new Set<Mesh>();\n private _dirtyColorMeshes = new Set<Mesh>();\n private _tlas?: FlattendBVH;\n private _bvhData?: Float32Array;\n private _instancesData?: Float32Array;\n private _materialIndexData?: Float32Array;\n private _meshSnapshot: {\n mesh: Mesh;\n instanceCount: number;\n instanceVersion: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion: number;\n geometry: Mesh['geometry'];\n materials: OpenPBRMaterial[];\n materialKeys: string[];\n geometryVersion: number;\n positionArray: Float32Array;\n indexArray: Geometry['indices']['array'];\n matrix: number[];\n }[] = [];\n private _snapshotByMesh = new WeakMap<Mesh, (typeof this._meshSnapshot)[number]>();\n private _needsUpdateAnalyticLightsBuffer = true;\n private _debugBvhData?: {\n buffer: ArrayBuffer;\n };\n\n private _lightTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileColumns = 1;\n private _iesProfileTexelOffsets = new Int32Array(0);\n private _openPbrEnergyLut = new WebGLTexture2D({\n ...commonNearestFloatProps,\n source: {\n data: getOpenPbrEnergyLutData(),\n width: OPENPBR_ENERGY_LUT_WIDTH,\n height: OPENPBR_ENERGY_LUT_HEIGHT\n }\n });\n\n private _envMap = new WebGLTexture2D(commonLinearFloatProps);\n private _envMapDistribution = new WebGLTexture2D(commonLinearFloatProps);\n private _envImageSource?: EnvironmentMapSource;\n private _backgroundTex = new WebGLTexture2D(commonLinearFloatProps);\n\n private _hasEnvMap = false;\n private _hasBackground = false;\n private _groundedBackgroundParams = new Float32Array([0, 0, 0, 0]);\n private _groundedBackgroundCenter = new Float32Array([0, 0]);\n\n private _bounces = 2;\n private _bevelSamples = DEFAULT_BEVEL_SAMPLES;\n private _clamping?: number;\n\n // higher number results in faster convergence over time, but with lower quality initial samples\n\n private _samplingCode = -1;\n private _sequenceSeed = 0;\n private _zLogSPP = 0;\n\n private _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _matIndexBufferTex = new WebGLTexture2D({\n ...commonNearestFloatProps\n // type: constants.INT\n });\n\n private _hasTransmission = false;\n private _hasAlpha = false;\n\n private _invalid = false;\n private _transmissiveAlphaMin = 1;\n\n private _mainPass: WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >;\n private _shadowCatcherPass: WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >;\n\n private _viewProjInv = mat4.create();\n private _apertureRadius = 0;\n private _focusDistance = 10;\n\n private _tracePasses: WebGLFullQuadPass<any, any>[];\n private readonly _depthPass: WebGLFullQuadPass<never, 'depth'>;\n private readonly _depthAbort = new AbortController();\n private _depthAspect = 1;\n private _hasShadowCatcher = false;\n private _spectral = false;\n\n constructor(renderer: WebGLRenderer) {\n this._renderer = renderer;\n const accumulationOutput = {\n type: constants.FLOAT,\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n };\n\n const rayTraceFrag = createRayTraceFragmentShader();\n rayTraceFrag.parallelCompile = true;\n shadowCatcherFrag.parallelCompile = true;\n this._mainPass = new WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >('rayTrace', renderer, {\n shader: rayTraceFrag,\n // `moments` holds the denoiser's guide value moments and sample count.\n outputs: ['color', 'albedo', 'normal', 'moments'],\n outputParams: {\n color: accumulationOutput,\n albedo: accumulationOutput,\n normal: accumulationOutput,\n moments: accumulationOutput\n }\n });\n this._shadowCatcherPass = new WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >(\n 'shadowCatcher',\n renderer,\n {\n shader: shadowCatcherFrag,\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n outputParams: {\n shadowCatcher: accumulationOutput,\n catcherBackground: accumulationOutput,\n catcherMoments: accumulationOutput\n }\n }\n );\n this._depthPass = new WebGLFullQuadPass('Depth query', renderer, {\n shader: depthQueryFrag, outputs: ['depth'],\n outputParams: { depth: commonNearestFloatProps }\n });\n this._tracePasses = [this._mainPass, this._shadowCatcherPass, this._depthPass];\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n OES_texture_float_linear: !!renderer.gl.getExtension(\n 'OES_texture_float_linear'\n )\n });\n });\n this._mainPass.setUniform('openPbrEnergyLut', this._openPbrEnergyLut);\n }\n\n createPass(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number },\n disableShadowCatcher = false\n ) {\n this.prepare();\n const options = {\n clear,\n blend: !clear,\n scissor: tile\n };\n this._mainPass.createPass({} as Record<never, WebGLTexture2D>, undefined, options);\n if (this._hasShadowCatcher && !disableShadowCatcher) {\n this._shadowCatcherPass.createPass(\n {} as Record<never, WebGLTexture2D>,\n undefined,\n options\n );\n }\n }\n\n getOutput(\n label: 'color' | 'albedo' | 'normal' | 'moments' |\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n ) {\n return label === 'shadowCatcher' || label === 'catcherBackground' ||\n label === 'catcherMoments'\n ? this._shadowCatcherPass.getOutput(label)\n : this._mainPass.getOutput(label);\n }\n\n setBounce(bounce: number) {\n const next = normalizeBounces(bounce);\n const changed = this._bounces !== next;\n this._bounces = next;\n return changed;\n }\n\n setClamping(clamping?: number) {\n const changed = this._clamping !== clamping;\n this._clamping = clamping;\n return changed;\n }\n\n setBevelSamples(samples: number) {\n const next = normalizeBevelSamples(samples);\n const changed = this._bevelSamples !== next;\n if (changed) {\n this._bevelSamples = next;\n }\n return changed;\n }\n\n private _setEnvMap(envImage: EnvironmentMapSource | undefined) {\n if (!environmentMapSourcesMatch(envImage, this._envImageSource) && envImage) {\n this._envMap.source = envImage;\n this._envMapDistribution.source = envMapDistribution(envImage);\n }\n this._envImageSource = envImage;\n this._tracePasses.forEach((pass) => {\n pass.setUniform('envMap', envImage ? this._envMap : null);\n pass.setUniform(\n 'envMapDistribution',\n envImage ? this._envMapDistribution : null\n );\n pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf);\n\n pass.setDefines({\n USE_ENVMAP: !!envImage\n });\n });\n\n this._hasEnvMap = !!envImage;\n }\n\n setBackground(background?: SceneBackground) {\n const backgroundImage =\n background && generateBackgroundMapFromSceneBackground(background)!;\n\n if (backgroundImage) {\n this._backgroundTex.source = backgroundImage;\n }\n this._hasBackground = !!backgroundImage;\n const grounded =\n background &&\n !Array.isArray(background) &&\n 'type' in background &&\n background.type === 'GroundedSkybox'\n ? background\n : undefined;\n this._groundedBackgroundParams.set(\n grounded\n ? [\n Math.max(grounded.height, 0.0001),\n Math.max(grounded.radius, 0.0001),\n grounded.groundHeight ?? 0,\n 1\n ]\n : [0, 0, 0, 0]\n );\n this._groundedBackgroundCenter.set(grounded?.center ?? [0, 0]);\n }\n\n setTransmissiveOutputAlphaMin(transmissiveAlphaMin: number) {\n const changed = this._transmissiveAlphaMin !== transmissiveAlphaMin;\n this._transmissiveAlphaMin = transmissiveAlphaMin;\n return changed;\n }\n\n setMeshes(meshes: Mesh[], update?: { transforms?: readonly Mesh[]; colors?: readonly Mesh[]; geometries?: readonly Geometry[]; materials?: readonly OpenPBRMaterial[] }) {\n for (const mesh of update?.colors ?? []) this._dirtyColorMeshes.add(mesh);\n if (update && this._preparedMeshData && this._materialData &&\n !this._needsUpdateMeshData && meshes === this._meshes) {\n const change = this._materialChanges.classify(update.materials ?? []);\n if (change.level !== 'geometry' && canUpdateGeometries(this._preparedMeshData, update.geometries ?? [])) {\n if (update.materials?.length) {\n const pending = this._pendingMaterialUpdate;\n this._pendingMaterialUpdate = { level: pending?.level === 'textures' ? 'textures' : change.level,\n emission: !!pending?.emission || change.emission,\n emissiveMap: !!pending?.emissiveMap || change.emissiveMap,\n materials: new Set([...(pending?.materials ?? []), ...update.materials]) };\n this._meshSnapshot.forEach(item => { item.materialKeys = item.materials.map(getMaterialHashKey); });\n }\n for (const geometry of update.geometries ?? []) this._pendingGeometryUpdates.add(geometry);\n for (const item of this._meshSnapshot) if (this._pendingGeometryUpdates.has(item.geometry)) item.geometryVersion = item.geometry.version;\n for (const mesh of update.transforms ?? []) {\n const item = this._snapshotByMesh.get(mesh);\n if (!item) continue;\n for (let i = 0; i < 16; i++) item.matrix[i] = mesh.transform[i];\n this._dirtyTransformMeshes.add(mesh); this._needsRefitTLAS = true;\n }\n return !!update.materials?.length || !!update.transforms?.length || !!update.colors?.length || !!update.geometries?.length;\n }\n }\n const materialChange = !!update?.materials?.length;\n const next = meshes.map((mesh) => ({\n mesh,\n instanceCount: mesh instanceof InstancedMesh ? mesh.count : 1,\n instanceVersion: mesh instanceof InstancedMesh ? mesh.transformsVersion : 0,\n instanceTransforms: mesh instanceof InstancedMesh ? mesh.transforms : undefined,\n instanceColors: mesh instanceof InstancedMesh ? mesh.colors : undefined,\n colorVersion: mesh instanceof InstancedMesh ? mesh.colorsVersion : 0,\n geometry: mesh.geometry,\n materials: mesh.materials.slice(),\n materialKeys: mesh.materials.map(getMaterialHashKey),\n geometryVersion: mesh.geometry.version,\n positionArray: mesh.geometry.position.array, indexArray: mesh.geometry.indices.array,\n matrix: Array.from(mesh.transform as ArrayLike<number>)\n }));\n const membershipChanged = next.length !== this._meshSnapshot.length ||\n next.some((item, i) => item.mesh !== this._meshSnapshot[i]?.mesh || item.instanceCount !== this._meshSnapshot[i]?.instanceCount ||\n item.materials.some((material, k) => material !== this._meshSnapshot[i]?.materials[k]));\n const membership = !this._needsUpdateMeshData && membershipChanged && this._preparedMeshData\n ? this._membershipCache.update(this._preparedMeshData, meshes) : undefined;\n if (membership) {\n const versions = new Map(this._meshSnapshot.flatMap(item => item.materials.map((m, i) => [m, item.materialKeys[i]] as const)));\n const materialsChanged = membership.materials.length !== this._preparedMeshData!.materials.length ||\n membership.materials.some((m, i) => m !== this._preparedMeshData!.materials[i] ||\n versions.has(m) && getMaterialHashKey(m) !== versions.get(m));\n this._pendingMembershipData = membership;\n this._meshes = meshes;\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n this._needsUpdateMeshMembership = true;\n this._needsRefitTLAS = false;\n this._dirtyTransformMeshes.clear();\n if (materialsChanged) this._pendingMaterialUpdate = { level: 'textures', emission: true,\n emissiveMap: true, materials: new Set(membership.materials) };\n return true;\n }\n const changed =\n next.length !== this._meshSnapshot.length ||\n next.some((item, i) => {\n const prev = this._meshSnapshot[i];\n return (\n !prev ||\n item.mesh !== prev.mesh || item.instanceCount !== prev.instanceCount || item.instanceVersion !== prev.instanceVersion || item.instanceTransforms !== prev.instanceTransforms ||\n item.geometry !== prev.geometry || item.colorVersion !== prev.colorVersion || item.instanceColors !== prev.instanceColors ||\n item.materials.length !== prev.materials.length ||\n item.materials.some((material, k) => material !== prev.materials[k]) ||\n item.materialKeys.some((hash, k) => hash !== prev.materialKeys[k]) ||\n item.geometryVersion !== prev.geometryVersion ||\n item.matrix.some((value, k) => value !== prev.matrix[k])\n );\n });\n next.forEach((item, i) => {\n const prev = this._meshSnapshot[i];\n if (\n prev &&\n item.geometry === prev.geometry &&\n (item.geometryVersion !== prev.geometryVersion || item.positionArray !== prev.positionArray || item.indexArray !== prev.indexArray)\n ) {\n const usesDisplacement =\n !!item.materials[0]?.displacementMap &&\n Math.abs(item.materials[0].displacementScale) > 1e-6;\n if (\n usesDisplacement || geometryTopologyChanged(this._preparedMeshData, item.geometry) ||\n !getGeometryBvh(item.geometry) ||\n !refitBLAS(getGeometryBvh(item.geometry)!, item.geometry)\n ) {\n setGeometryBvh(item.geometry, undefined);\n }\n }\n });\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n if (!changed && update && !materialChange) return false;\n this._meshes = meshes;\n this._needsUpdateMeshData = true;\n this._needsRefitTLAS = false; this._dirtyTransformMeshes.clear();\n this._debugBvhData = undefined;\n return true;\n }\n\n setTextureAtlasBudget(maxBytes: number) {\n const next = Number.isFinite(maxBytes)\n ? Math.max(4, Math.floor(maxBytes))\n : DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n if (next === this._maxTextureArrayBytes) return false;\n this._maxTextureArrayBytes = next;\n this._needsUpdateMeshData = true;\n return true;\n }\n\n getDebugBVHData() {\n if (!this._debugBvhData) {\n const mergedMesh = mergeMeshesToGeometry(this._meshes);\n const bvh = buildBLAS(mergedMesh.geometry);\n this._debugBvhData = { buffer: bvh.buffer };\n }\n return this._debugBvhData;\n }\n\n getDiagnostics() {\n return {\n textureAtlas: this._materialData?.textureAtlasStats\n };\n }\n\n private _updateMeshData() {\n this._pendingGeometryUpdates.clear();\n this._needsUpdateMeshData = false;\n\n // GLSL intersects the original triangles, so its BVH must bound those\n // triangles rather than WebGPU's displaced height prisms.\n const res = updateMeshInstances(this._meshes, { displacement: false });\n this._preparedMeshData = res;\n this._membershipCache.capture(res);\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n const mergedGeometry = res.geometry;\n const materials = res.materials;\n const tlas = buildTLAS(res.instances, res.blases);\n this._tlas = tlas;\n const tlasBuffer = new Float32Array(tlas.buffer);\n const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer!);\n const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));\n const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);\n const blasOffset = tlasBuffer.length / 4;\n bvhBuffer.set(tlasBuffer);\n bvhBuffer.set(blasBuffer, blasOffset * 4);\n\n if (mergedGeometry.position.array.length > 0) {\n setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);\n setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);\n mergedGeometry.color &&\n setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);\n mergedGeometry.tangent &&\n setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);\n mergedGeometry.uv &&\n setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);\n mergedGeometry.uv1 &&\n setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);\n mergedGeometry.materialIndex &&\n setDataTexture(\n this._matIndexBufferTex,\n // TODO currently int texture doesn't work\n this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array),\n 4\n );\n }\n if (bvhBuffer.length > 0) {\n setDataTexture(this._bvhBufferTex, bvhBuffer, 4);\n setDataTexture(this._instancesBufferTex, instancesBuffer, 4);\n }\n\n this._materialData?.dispose(this._renderer.gl);\n const materialData = new MaterialTable(\n materials,\n this._analyticLights,\n {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS\n ),\n maxTextureDimension2D: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_TEXTURE_SIZE\n )\n }\n );\n this._materialData = materialData;\n\n this._tracePasses.forEach((pass) => {\n pass.setUniforms({\n bvhBuffer: this._bvhBufferTex,\n instancesBuffer: this._instancesBufferTex,\n positionBuffer: this._positionBufferTex,\n normalBuffer: this._normalBufferTex,\n tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,\n colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,\n uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,\n uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,\n materialIndexBuffer: this._matIndexBufferTex,\n\n bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,\n vertexColumns: textureDimensionsFromArray(\n Attribute.getCount(mergedGeometry.position)\n ).columnsLog,\n instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)\n .columnsLog,\n blasOffset,\n\n isEmptyScene: +(res.instances.length === 0)\n });\n\n });\n this._updateMaterialConstants(materials, materialData, mergedGeometry);\n this._materialChanges.capture(materials);\n this._pendingMaterialUpdate = undefined;\n\n return bvhBuffer;\n }\n\n private _updateMaterialConstants(materials: OpenPBRMaterial[], materialData: MaterialTable, mergedGeometry: Geometry) {\n // Avoid too much shader compilation\n const STACK_SIZE = 50;\n const hasShadowCatcher = materials.some((m) => m.shadowCatcher);\n const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);\n const HAS_MEDIUM = materials.some(materialUsesMedium);\n\n this._hasShadowCatcher = hasShadowCatcher;\n this._hasTransmission = materials.some(\n (m) =>\n m.transmissionWeight > 0 ||\n m.mapAlphaUsage === \"transmission\"\n );\n this._hasAlpha = materials.some(\n (m) => resolveMaterialAlphaMode(m) !== 'opaque'\n );\n this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);\n\n\n this._tracePasses.forEach(pass => {\n pass.setDefines({\n OES_texture_float_linear: true,\n\n STACK_SIZE,\n USE_VERTEX_COLOR: mergedGeometry.color != null,\n USE_TANGENT: mergedGeometry.tangent != null,\n HAS_TRANSMISSION: this._hasTransmission,\n HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),\n HAS_BEVEL,\n HAS_MEDIUM,\n HAS_ALPHA: this._hasAlpha,\n\n BEVEL_SAMPLES: this._bevelSamples,\n\n RECT_LIGHT: CONSTANT_RECT_LIGHT,\n SPHERE_LIGHT: CONSTANT_SPHERE_LIGHT,\n DIRECTIONAL_LIGHT: CONSTANT_DIRECTIONAL_LIGHT,\n\n USE_RR: true,\n // Multiple-scattering SSS paths need enough collisions to return to\n // the boundary before roulette; terminating at depth five produces\n // dark materials and a handful of very large surviving samples.\n RR_MAX: HAS_MEDIUM ? 12 : 2,\n\n ...materialData.defines\n });\n\n materialData.setToPass(pass);\n });\n }\n\n private _updateMeshMembership() {\n const res = this._pendingMembershipData!;\n this._preparedMeshData = res;\n const tlas = this._tlas = buildTLAS(res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n data.set(new Float32Array(tlas.buffer));\n data.set(blas, tlas.buffer.byteLength / 4);\n this._instancesData = new Float32Array(tlas.instancesBuffer!);\n setDataTexture(this._bvhBufferTex, data, 4);\n setDataTexture(this._instancesBufferTex, this._instancesData, 4);\n this._tracePasses.forEach(pass => pass.setUniforms({\n bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,\n instancesColumns: textureDimensionsFromArray(this._instancesData!.length / 4).columnsLog,\n blasOffset: tlas.buffer.byteLength / 16,\n isEmptyScene: +(res.instances.length === 0)\n }));\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n this._debugBvhData = undefined;\n }\n\n private _updateGeometryData() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);\n for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {\n for (const [attribute, texture] of [\n [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],\n [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],\n [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]\n ] as const) if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent)) texture.updateDataRange(this._renderer.gl, attribute.array,\n first * attribute.itemSize * 4, count * attribute.itemSize * 4);\n if (!topologyChanged) continue;\n const material = this._materialIndexData!;\n for (let i = first * 4; i < (first + count) * 4; i++) material[i] = res.geometry.materialIndex!.array[i];\n this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);\n }\n for (const mesh of update.meshes) this._dirtyTransformMeshes.add(mesh);\n if (update.relocated) for (const binding of res.instanceBindings) this._dirtyTransformMeshes.add(binding.mesh);\n if (update.resized) {\n res.instances = updateMeshInstanceTransforms(res.instanceBindings);\n refitTLAS(tlas, res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n this._bvhData.set(new Float32Array(tlas.buffer)); this._bvhData.set(blas, tlas.buffer.byteLength / 4);\n setDataTexture(this._bvhBufferTex, this._bvhData, 4);\n this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData!.length / 4).columnsLog));\n } else {\n const ranges = [];\n for (const { blas, offset } of update.blases) {\n const target = tlas.buffer.byteLength + offset;\n new Uint8Array(this._bvhData!.buffer).set(new Uint8Array(blas.buffer), target);\n ranges.push({offset: target, size: blas.buffer.byteLength});\n }\n for (const { offset, size } of mergeRefitRanges(ranges)) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n }\n this._needsRefitTLAS = true; this._pendingGeometryUpdates.clear(); this._debugBvhData = undefined;\n }\n\n private _updateMeshColors() {\n const res = this._preparedMeshData, tlas = this._tlas;\n if (res && tlas) {\n const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);\n const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);\n for (const {offset, size} of ranges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n }\n this._dirtyColorMeshes.clear();\n }\n\n private _refitMeshInstances() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const dirty = dirtyMeshInstanceIndices(res.instanceBindings, this._dirtyTransformMeshes, res.instances);\n const previousInstances = res.instances;\n res.instances = updateMeshInstanceTransforms(res.instanceBindings, res.instances, dirty);\n if (!sameInstanceMembership(previousInstances, res.instances)) {\n this._pendingMembershipData = res;\n this._updateMeshMembership();\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n return;\n }\n const ranges = refitTLAS(tlas, res.instances, res.blases, dirty);\n this._bvhData!.set(new Float32Array(tlas.buffer));\n for (const { offset, size } of ranges.tlasRanges) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n for (const { offset, size } of ranges.instanceRanges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n this._debugBvhData = undefined;\n }\n\n private _updateMaterialData() {\n const update = this._pendingMaterialUpdate!;\n const res = this._preparedMeshData!;\n let data = this._materialData!;\n if (update.level === 'textures') {\n data.dispose(this._renderer.gl);\n data = this._materialData = new MaterialTable(res.materials, this._analyticLights, {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS),\n maxTextureDimension2D: this._renderer.gl.getParameter(this._renderer.gl.MAX_TEXTURE_SIZE)\n });\n this._needsUpdateAnalyticLightsBuffer = true;\n } else data.repackParams(res.materials);\n this._updateMaterialConstants(res.materials, data, res.geometry);\n if (update.emission || update.emissiveMap) {\n // WebGL currently evaluates mesh emission on path hits; its direct-light\n // sampler has only analytic/environment sources. Retain that behavior.\n res.emissiveBindings = res.instanceBindings.filter(binding =>\n binding.materialIndices.some(index => materialIsEmissive(res.materials[index])));\n }\n this._materialChanges.capture([...update.materials]);\n this._pendingMaterialUpdate = undefined;\n }\n\n setLights(lights: SceneLight[]) {\n const analyticLights = lights.filter(\n (light) =>\n light.type === 'DirectionalLight' ||\n light.type === 'SphereLight' ||\n light.type === 'SpotLight' ||\n light.type === 'RectLight'\n ) as AnalyticLight[];\n const numAnalyticLights = analyticLights.length;\n\n const envImage = this._sceneEnvironment.update(lights);\n\n const envWeight = estimateEnvironmentPower(envImage);\n const analyticWeights = analyticLights.map(estimateAnalyticLightPower);\n const totalWeight =\n envWeight + analyticWeights.reduce((sum, weight) => sum + weight, 0);\n const sourceCount = analyticLights.length + (envImage ? 1 : 0);\n const fallbackPmf = sourceCount > 0 ? 1 / sourceCount : 0;\n this._envLightSelectionPmf = envImage\n ? totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (envWeight / totalWeight)\n : fallbackPmf\n : 0;\n this._analyticLightSelectionPmfs = Float32Array.from(\n analyticWeights,\n (weight) =>\n totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)\n : fallbackPmf\n );\n let cumulativePmf = this._envLightSelectionPmf;\n this._analyticLightSelectionCdfs = Float32Array.from(\n this._analyticLightSelectionPmfs,\n (pmf) => {\n cumulativePmf += pmf;\n return cumulativePmf;\n }\n );\n if (this._analyticLightSelectionCdfs.length > 0) {\n this._analyticLightSelectionCdfs[\n this._analyticLightSelectionCdfs.length - 1\n ] = 1;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n NUM_LIGHTS: numAnalyticLights,\n HAS_SPHERE_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SphereLight'\n ),\n HAS_SPOT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SpotLight'\n ),\n HAS_RECT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'RectLight'\n ),\n HAS_DIRECTIONAL_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'DirectionalLight'\n )\n });\n });\n\n const lightTexturesChanged = this._rectLightTextures.update(analyticLights);\n this._analyticLights = analyticLights;\n const packedIES = packIESProfiles(analyticLights);\n this._iesProfileTexelOffsets = packedIES.offsets;\n this._iesProfileColumns = setDataTexture(\n this._iesProfileTex,\n packedIES.data.length ? packedIES.data : new Float32Array(4),\n 4\n ).columns;\n if (lightTexturesChanged) this._needsUpdateMeshData = true;\n\n this._needsUpdateAnalyticLightsBuffer = true;\n\n this._setEnvMap(envImage);\n }\n\n private _getViewProjInv(camera: Camera, viewProjInv: mat4.Mat4Array) {\n mat4.invert(viewProjInv, camera.getProjectionMatrix(this._depthAspect));\n mat4.mul(viewProjInv, camera.transform, viewProjInv);\n }\n\n setCamera(camera: Camera) {\n const viewProjectionInv = this._viewProjInv;\n this._apertureRadius = cameraApertureRadius(camera);\n this._focusDistance = camera.focusDistance;\n this._getViewProjInv(camera, viewProjectionInv);\n this._tracePasses.forEach((pass) => {\n pass.setUniform('viewProjectionInv', viewProjectionInv);\n pass.setUniform('viewInv', camera.transform);\n // Zero for orthographic cameras, which have no depth of field.\n pass.setUniform('cameraApertureRadius', this._apertureRadius);\n pass.setUniform('cameraFocusDistance', camera.focusDistance);\n });\n }\n\n cameraChanged(camera: Camera) {\n const tmp = mat4.create();\n this._getViewProjInv(camera, tmp);\n return (\n !numberArraysEqual(this._viewProjInv, tmp) ||\n cameraApertureRadius(camera) !== this._apertureRadius ||\n camera.focusDistance !== this._focusDistance\n );\n }\n\n setSize(width: number, height: number, targetAspect = width / height) {\n this._depthAspect = targetAspect;\n this._tracePasses.forEach((pass) => {\n pass.setSize(pass === this._depthPass ? DEPTH_SAMPLE_GRID : width,\n pass === this._depthPass ? DEPTH_SAMPLE_GRID : height);\n pass.setUniform('pixelSize', [1 / width, 1 / height]);\n });\n }\n\n setJitter(x: number, y: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('jitter', [x, y]);\n });\n }\n\n releaseTarget(target: object) { this._mainPass.releaseTarget(target); this._shadowCatcherPass.releaseTarget(target); }\n\n getTargetMemoryBytes(target: object) {\n return this._mainPass.getMemoryBytes(target) + this._shadowCatcherPass.getMemoryBytes(target);\n }\n\n useTarget(target: object) {\n this._mainPass.useTarget(target);\n this._shadowCatcherPass.useTarget(target);\n }\n\n setQuality(options: { bounces: number; bevel: boolean; dispersionWavelengths: 1 | 3; directLightCandidates: number }) {\n this._tracePasses.forEach(pass => {\n pass.setUniform('bounceLimit', normalizeBounces(options.bounces));\n pass.setUniform('bevelEnabled', options.bevel);\n pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);\n });\n }\n\n setWavelength(wavelength: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('wavelength', wavelength);\n });\n }\n\n setSampleCount(sampleCount: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('sampleCount', sampleCount);\n });\n }\n\n isInvalid() {\n return this._invalid;\n }\n\n hasShadowCatcher() {\n return this._hasShadowCatcher;\n }\n\n hasDispersion() {\n return this._spectral;\n }\n\n prepare(): void {\n if (this._needsUpdateMeshData) {\n this._updateMeshData();\n } else if (this._needsUpdateMeshMembership) {\n this._updateMeshMembership();\n }\n if (this._pendingGeometryUpdates.size) this._updateGeometryData();\n if (this._needsRefitTLAS) this._refitMeshInstances();\n if (this._dirtyColorMeshes.size) this._updateMeshColors();\n\n if (this._pendingMaterialUpdate) this._updateMaterialData();\n\n if (this._needsUpdateAnalyticLightsBuffer) {\n const analyticLights = this._analyticLights;\n analyticLights.length > 0 &&\n packLightsToTexture(\n this._lightTex,\n analyticLights,\n this._materialData!.getLightTexturesIndices(),\n this._analyticLightSelectionPmfs,\n this._analyticLightSelectionCdfs,\n this._iesProfileTexelOffsets\n );\n this._needsUpdateAnalyticLightsBuffer = false;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setUniform(\n 'backgroundMap',\n this._hasBackground\n ? this._backgroundTex\n : this._hasEnvMap\n ? this._envMap\n : null\n );\n\n pass.setUniform(\n 'transmissiveOutputAlphaMin',\n Math.max(Math.min(1, this._transmissiveAlphaMin), 0)\n );\n\n pass.setUniform('lightsTex', this._lightTex);\n pass.setUniform('iesProfileData', this._iesProfileTex);\n pass.setUniform('iesProfileColumns', this._iesProfileColumns);\n pass.setUniform('groundedBackgroundParams', this._groundedBackgroundParams);\n pass.setUniform('groundedBackgroundCenter', this._groundedBackgroundCenter);\n\n pass.setDefines({\n // Double bounce fix on intel mac\n // Limit the bounce to avoid long compilation time.\n BOUNCES: isIntelMac()\n ? Math.min(this._bounces, 3) *\n (this._hasTransmission || this._hasAlpha ? 2 : 1)\n : this._bounces,\n CLAMPING: this._clamping || undefined,\n BEVEL_SAMPLES: this._bevelSamples,\n USE_BACKGROUND: this._hasBackground,\n USE_GROUNDED_BACKGROUND: this._groundedBackgroundParams[3] > 0\n });\n });\n }\n\n setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed = 0) {\n const code = samplingPatternCode(pattern);\n const logSPP = zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples);\n const changed = this._samplingCode !== code || this._sequenceSeed !== (sequenceSeed >>> 0) ||\n (code === 1 && this._zLogSPP !== logSPP);\n this._samplingCode = code;\n this._sequenceSeed = sequenceSeed >>> 0;\n this._zLogSPP = logSPP;\n this._tracePasses.forEach(pass => {\n pass.setUniform('samplingPattern', code);\n pass.setUniform('sequenceSeed', this._sequenceSeed);\n pass.setUniform('zSobolLogSPP', logSPP);\n });\n return changed;\n }\n\n // WebGL has uniform per-pixel counts; setSampleCount already includes offset.\n setSampleSequenceOffset(_offset: number) {}\n\n async readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined> {\n if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||\n !this._renderer.isAllProgramCompiled()) return;\n this.prepare();\n this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));\n this._depthPass.createPass({});\n const rgba = await readFloatPixelsAsync(this._renderer.gl,\n DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);\n return unpackDepthSamples(rgba);\n }\n\n dispose() {\n this._depthAbort.abort();\n this._materialData?.dispose(this._renderer.gl);\n this._materialData = undefined;\n this._tracePasses.forEach((pass) => pass.dispose());\n const gl = this._renderer.gl;\n [\n this._lightTex,\n this._openPbrEnergyLut,\n this._envMap,\n this._envMapDistribution,\n this._backgroundTex,\n this._positionBufferTex,\n this._normalBufferTex,\n this._colorBufferTex,\n this._tangentBufferTex,\n this._uvBufferTex,\n this._uv1BufferTex,\n this._bvhBufferTex,\n this._instancesBufferTex,\n this._matIndexBufferTex\n ].forEach((texture) => texture.dispose(gl));\n }\n}\n\nexport default WebGLRayTracePass;\n"]}
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
4
  // Shared primary-ray construction keeps beauty and catcher coverage aligned.
5
5
  export default /* glsl */ `
6
- Ray hz(vec2 fD) {
6
+ Ray hy(vec2 fD) {
7
7
  vec4 origin = viewProjectionInv * vec4(fD * 2.0 - 1.0, -1.0, 1.0);
8
8
  vec4 target = viewProjectionInv * vec4(fD * 2.0 - 1.0, 1.0, 1.0);
9
9
  Ray cam;
@@ -12,7 +12,7 @@ iw(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * ta
12
12
  return cam;
13
13
  }
14
14
 
15
- vec2 oz(vec2 p) {
15
+ vec2 oC(vec2 p) {
16
16
  p = 2.0 * p - 1.0;
17
17
  bool greater = abs(p.x) > abs(p.y);
18
18
  float r = greater ? p.x : p.y;
@@ -20,16 +20,16 @@ float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);
20
20
  return r * vec2(cos(theta), sin(theta));
21
21
  }
22
22
 
23
- Ray nv() {
24
- Ray cam = hz(v_Texcoord + rN());
23
+ Ray nC() {
24
+ Ray cam = hy(v_Texcoord + rS());
25
25
  if (cameraApertureRadius > 0.0) {
26
26
 
27
27
  vec3 eye = viewInv[3].xyz;
28
- vec3 nV = -normalize(viewInv[2].xyz);
29
- vec3 qm = eye + cam.d * (cameraFocusDistance / dot(cam.d, nV));
30
- vec2 ru = cameraApertureRadius * oz(fk(CAMERA_LENS));
31
- vec3 origin = vec3(viewInv * vec4(ru, 0.0, 1.0));
32
- iw(cam, origin, normalize(qm - origin));
28
+ vec3 nY = -normalize(viewInv[2].xyz);
29
+ vec3 qq = eye + cam.d * (cameraFocusDistance / dot(cam.d, nY));
30
+ vec2 rC = cameraApertureRadius * oC(fk(CAMERA_LENS));
31
+ vec3 origin = vec3(viewInv * vec4(rC, 0.0, 1.0));
32
+ iw(cam, origin, normalize(qq - origin));
33
33
  }
34
34
  return cam;
35
35
  }
@@ -13,13 +13,13 @@ export default createShaderMixin({
13
13
  groundedBackgroundCenter: Shader.uniform('vec2')
14
14
  },
15
15
  main: glsl `
16
- vec2 aS(vec3 gb) {
17
- float phi = mod(atan(-gb.z, -gb.x), TWOPI);
18
- float theta = acos(gb.y);
16
+ vec2 aS(vec3 gc) {
17
+ float phi = mod(atan(-gc.z, -gc.x), TWOPI);
18
+ float theta = acos(gc.y);
19
19
  return vec2(phi * 0.5 * INVPI, theta * INVPI);
20
20
  }
21
21
 
22
- float qp(float u, out int vOffset, out float pdf) {
22
+ float qt(float u, out int vOffset, out float pdf) {
23
23
  ivec2 size = textureSize(envMap, 0);
24
24
 
25
25
  int left = 0;
@@ -45,7 +45,7 @@ pdf = s0.y;
45
45
  return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);
46
46
  }
47
47
 
48
- float qo(float u, int vOffset, out float pdf) {
48
+ float qs(float u, int vOffset, out float pdf) {
49
49
  ivec2 size = textureSize(envMap, 0);
50
50
 
51
51
  int left = 0;
@@ -59,36 +59,36 @@ left = mid + 1;
59
59
  right = mid;
60
60
  }
61
61
  }
62
- int oG = left - 1;
62
+ int oJ = left - 1;
63
63
 
64
64
 
65
65
 
66
- vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + oG, vOffset), 0).xy;
67
- vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + oG + 1, vOffset), 0).xy;
66
+ vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + oJ, vOffset), 0).xy;
67
+ vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + oJ + 1, vOffset), 0).xy;
68
68
 
69
69
  pdf = s0.y;
70
70
 
71
- return (float(oG) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
71
+ return (float(oJ) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
72
72
  }
73
73
 
74
74
 
75
- vec3 oA(vec2 random, out vec2 uv, out float pdf) {
76
- vec2 gY;
75
+ vec3 oD(vec2 random, out vec2 uv, out float pdf) {
76
+ vec2 gZ;
77
77
  int vOffset;
78
78
 
79
- uv.y = qp(random.x, vOffset, gY.y);
80
- uv.x = qo(random.y, vOffset, gY.x);
79
+ uv.y = qt(random.x, vOffset, gZ.y);
80
+ uv.x = qs(random.y, vOffset, gZ.x);
81
81
 
82
82
  float phi = uv.x * TWOPI;
83
83
  float theta = uv.y * PI;
84
84
  float cc = cos(theta);
85
85
  float sinTheta = sin(theta);
86
- float tY = cos(phi);
87
- float ug = sin(phi);
86
+ float ue = cos(phi);
87
+ float um = sin(phi);
88
88
 
89
- vec3 dir = vec3(-sinTheta * tY, cc, -sinTheta * ug);
89
+ vec3 dir = vec3(-sinTheta * ue, cc, -sinTheta * um);
90
90
 
91
- pdf = gY.x * gY.y * INVPI2 / (2.0 * sinTheta);
91
+ pdf = gZ.x * gZ.y * INVPI2 / (2.0 * sinTheta);
92
92
 
93
93
  return dir;
94
94
  }
@@ -100,28 +100,28 @@ float sinTheta = sin(uv.y * PI);
100
100
 
101
101
  uv *= size;
102
102
 
103
- float sw = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;
104
- float sz = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;
103
+ float sD = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;
104
+ float sE = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;
105
105
 
106
- return sw * sz * INVPI2 / (2.0 * sinTheta);
106
+ return sD * sE * INVPI2 / (2.0 * sinTheta);
107
107
  }
108
108
 
109
- float dq(vec3 sA, float height, float radius) {
110
- float fN = length(sA);
109
+ float dq(vec3 sF, float height, float radius) {
110
+ float fN = length(sF);
111
111
  if (fN < 0.00001) {
112
112
  return -radius;
113
113
  }
114
114
 
115
- float iC = radius * sA.y / fN;
116
- float ik = -1.5 * height;
115
+ float iC = radius * sF.y / fN;
116
+ float ij = -1.5 * height;
117
117
  float ev;
118
118
  if (iC >= 0.0) {
119
119
  ev = radius;
120
- } else if (iC < ik) {
121
- ev = -height * fN / sA.y;
120
+ } else if (iC < ij) {
121
+ ev = -height * fN / sF.y;
122
122
  } else {
123
123
  float dW = 1.0
124
- - iC * iC / (3.0 * ik * ik);
124
+ - iC * iC / (3.0 * ij * ij);
125
125
  ev = radius * dW;
126
126
  }
127
127
  return fN - ev;
@@ -131,11 +131,11 @@ vec3 eQ(vec3 origin, vec3 d) {
131
131
  #ifdef USE_GROUNDED_BACKGROUND
132
132
  float height = groundedBackgroundParams.x;
133
133
  float radius = groundedBackgroundParams.y;
134
- float vA = groundedBackgroundParams.z;
134
+ float vG = groundedBackgroundParams.z;
135
135
  vec3 bY = normalize(d);
136
136
  vec3 bB = origin - vec3(
137
137
  groundedBackgroundCenter.x,
138
- vA + height,
138
+ vG + height,
139
139
  groundedBackgroundCenter.y
140
140
  );
141
141
 
@@ -145,37 +145,37 @@ float eI = dot(bB, bY);
145
145
  float ej = eI * eI
146
146
  - dot(bB, bB) + radius * radius;
147
147
  if (ej > 0.0) {
148
- float cB = -eI + sqrt(ej);
148
+ float cC = -eI + sqrt(ej);
149
149
  if (
150
- cB > 0.0
150
+ cC > 0.0
151
151
  && dq(bB, height, radius) <= 0.0
152
152
  ) {
153
- vec3 nB = bB + bY * cB;
154
- if (nB.y >= 0.0) {
155
- return normalize(nB);
153
+ vec3 nE = bB + bY * cC;
154
+ if (nE.y >= 0.0) {
155
+ return normalize(nE);
156
156
  }
157
157
 
158
158
  if (bY.y < -0.00001 && radius > 1.5 * height) {
159
- float hQ = (-height - bB.y) / bY.y;
160
- vec3 nk = bB + bY * hQ;
161
- float nZ = (2.0 / 3.0)
159
+ float hP = (-height - bB.y) / bY.y;
160
+ vec3 nq = bB + bY * hP;
161
+ float oc = (2.0 / 3.0)
162
162
  * sqrt(radius * radius - 2.25 * height * height);
163
- if (hQ > 0.0 && length(nk.xz) <= nZ) {
164
- return normalize(nk);
163
+ if (hP > 0.0 && length(nq.xz) <= oc) {
164
+ return normalize(nq);
165
165
  }
166
166
  }
167
167
 
168
168
  float cN = 0.0;
169
169
  for (int i = 0; i < 14; i++) {
170
- float fe = (cN + cB) * 0.5;
171
- vec3 pp = bB + bY * fe;
172
- if (dq(pp, height, radius) > 0.0) {
173
- cB = fe;
170
+ float fe = (cN + cC) * 0.5;
171
+ vec3 pt = bB + bY * fe;
172
+ if (dq(pt, height, radius) > 0.0) {
173
+ cC = fe;
174
174
  } else {
175
175
  cN = fe;
176
176
  }
177
177
  }
178
- vec3 hit = bB + bY * ((cN + cB) * 0.5);
178
+ vec3 hit = bB + bY * ((cN + cC) * 0.5);
179
179
  return normalize(hit);
180
180
  }
181
181
  }
@@ -183,7 +183,7 @@ return normalize(hit);
183
183
  return d;
184
184
  }
185
185
 
186
- vec4 cw(vec3 origin, vec3 d) {
186
+ vec4 cx(vec3 origin, vec3 d) {
187
187
  d = eQ(origin, d);
188
188
  vec2 uv = aS(d);
189
189
  return textureLinear(backgroundMap, uv);