@meimu/mutracer 0.1.2 → 0.1.4

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 (125) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +4475 -4337
  3. package/docs/api.md +11 -9
  4. package/docs/threejs.md +30 -4
  5. package/lib/Engine.js +18 -1
  6. package/lib/Engine.js.map +1 -1
  7. package/lib/main.d.ts +1 -1
  8. package/lib/main.js.map +1 -1
  9. package/lib/oidn.d.ts +1 -1
  10. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  11. package/lib/renderer/MaterialTable.d.ts +1 -0
  12. package/lib/renderer/MaterialTable.js +10 -4
  13. package/lib/renderer/MaterialTable.js.map +1 -1
  14. package/lib/renderer/WGPUBloomPass.js +18 -18
  15. package/lib/renderer/WGPUFullQuadPass.js +6 -6
  16. package/lib/renderer/WGPUJNLMDenoiser.js +68 -68
  17. package/lib/renderer/WGPURayTraceOutput.js +16 -14
  18. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  19. package/lib/renderer/WGPURayTracePass.d.ts +2 -0
  20. package/lib/renderer/WGPURayTracePass.js +13 -7
  21. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  22. package/lib/renderer/WGPURenderingPipeline.js +24 -22
  23. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  24. package/lib/renderer/WebGLJNLMDenoiser.js +68 -68
  25. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  26. package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
  27. package/lib/renderer/WebGLRayTracePass.js +7 -1
  28. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  29. package/lib/renderer/envMapCreation.d.ts +5 -1
  30. package/lib/renderer/envMapCreation.js +42 -5
  31. package/lib/renderer/envMapCreation.js.map +1 -1
  32. package/lib/renderer/geometryUpdates.js +1 -1
  33. package/lib/renderer/geometryUpdates.js.map +1 -1
  34. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/envMap.glsl.js +69 -57
  36. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  37. package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
  38. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  39. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +153 -121
  40. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  41. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +540 -540
  42. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  43. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  44. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +40 -39
  45. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  46. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +71 -71
  47. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
  48. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +13 -13
  49. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  50. package/lib/renderer/glsl/chunks/sobol.glsl.js +65 -65
  51. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  52. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  53. package/lib/renderer/glsl/depthQuery.frag.js +5 -5
  54. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  55. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  56. package/lib/renderer/glsl/rayTrace.frag.js +165 -165
  57. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  58. package/lib/renderer/glsl/shadowCatcher.frag.js +14 -14
  59. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  60. package/lib/renderer/glsl/webglPipeline.frag.js +56 -56
  61. package/lib/renderer/lightsUtil.js +7 -5
  62. package/lib/renderer/lightsUtil.js.map +1 -1
  63. package/lib/renderer/materialChanges.js +1 -1
  64. package/lib/renderer/materialChanges.js.map +1 -1
  65. package/lib/renderer/materialComparison.generated.js +36 -18
  66. package/lib/renderer/materialComparison.generated.js.map +1 -1
  67. package/lib/renderer/prepareMeshBVH.js +2 -2
  68. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  69. package/lib/renderer/sceneChangeDetector.js +4 -1
  70. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  71. package/lib/renderer/sceneLightChanges.js +3 -2
  72. package/lib/renderer/sceneLightChanges.js.map +1 -1
  73. package/lib/renderer/scratchSampling.js +18 -18
  74. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  75. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  76. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
  77. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +475 -469
  79. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  80. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
  81. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -61
  82. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  83. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +562 -562
  84. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  85. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
  86. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  87. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  88. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
  89. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  90. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +128 -128
  91. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +143 -143
  92. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
  93. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +75 -75
  94. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  95. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  96. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  97. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +69 -69
  98. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  99. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  100. package/lib/renderer/wgsl/compose.frag.wgsl.js +130 -102
  101. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  102. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  103. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  104. package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
  105. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  106. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  107. package/lib/renderer/wgsl/rayTrace.compute.js +289 -277
  108. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  109. package/lib/scene/EnvironmentLight.d.ts +9 -3
  110. package/lib/scene/EnvironmentLight.js +9 -2
  111. package/lib/scene/EnvironmentLight.js.map +1 -1
  112. package/lib/scene/Scene.d.ts +4 -0
  113. package/lib/scene/Scene.js.map +1 -1
  114. package/lib/scene/SpotLight.d.ts +2 -2
  115. package/lib/scene/SpotLight.js +1 -1
  116. package/lib/scene/SpotLight.js.map +1 -1
  117. package/lib/scene/Texture.d.ts +17 -6
  118. package/lib/scene/Texture.js +13 -4
  119. package/lib/scene/Texture.js.map +1 -1
  120. package/lib/util/fromTHREE.js +151 -29
  121. package/lib/util/fromTHREE.js.map +1 -1
  122. package/lib/version.d.ts +1 -1
  123. package/lib/version.js +1 -1
  124. package/lib/version.js.map +1 -1
  125. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"geometryUpdates.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { isDeformationUpdate } from '../scene/geometryChanges.js';\nimport Geometry from '../scene/Geometry.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\nimport { buildBLAS, refitBLAS, type FlattendBVH } from './bvhAccel.js';\nimport { getBvhBounds, updateMeshInstances } from './prepareMeshBVH.js';\nimport Mesh from '../scene/Mesh.js';\n\ntype Prepared = ReturnType<typeof updateMeshInstances>;\nconst vertexAttributes = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\nconst bindingIndices = new WeakMap<Prepared, { source: Map<Geometry, Prepared['instanceBindings']>;\n prepared: Map<Geometry, Prepared['instanceBindings']> }>();\nfunction indices(prepared: Prepared) {\n let maps = bindingIndices.get(prepared);\n if (!maps) {\n maps = { source: new Map(), prepared: new Map() };\n for (const binding of prepared.instanceBindings) {\n for (const [map, geometry] of [[maps.source, binding.mesh.geometry], [maps.prepared, binding.geometry]] as const) {\n let bindings = map.get(geometry);\n if (!bindings) map.set(geometry, bindings = []);\n bindings.push(binding);\n }\n }\n bindingIndices.set(prepared, maps);\n }\n return maps;\n}\n\n/** Displaced geometry must be prepared as a whole. */\nexport function canUpdateGeometries(prepared: Prepared, geometries: readonly Geometry[]) {\n return geometries.every(geometry => {\n const bindings = indices(prepared).source.get(geometry) ?? [];\n return bindings.length > 0 && bindings.every(b => !b.mesh.materials.some(m => m.displacementMap) &&\n b.geometry.position.array === geometry.position.array);\n });\n}\n\n/** Rewrites only a geometry's existing region, preserving global material indices. */\nfunction copyRegion(source: Geometry, merged: Geometry, region: Prepared['geometryRegions'] extends Map<Geometry, infer R> ? R : never, topologyChanged: boolean, deformationOnly: boolean) {\n const { vertexOffset, indexOffset, materialIndices } = region;\n const count = source.vertexCount;\n for (const name of vertexAttributes) {\n if (name === 'materialIndex' || deformationOnly && name !== 'position' && name !== 'normal' && name !== 'tangent') continue;\n const target = merged[name]; if (!target) continue;\n const attribute = name === 'uv1' ? source.uv1 ?? source.uv : source[name];\n const offset = vertexOffset * target.itemSize;\n if (attribute && attribute.itemSize !== target.itemSize) {\n for (let v = 0; v < count; v++) for (let c = 0; c < target.itemSize; c++) {\n target.array[offset + v * target.itemSize + c] = c < attribute.itemSize ? attribute.array[v * attribute.itemSize + c] : name === 'tangent' && !hasGeneratedVertexTangents(source) ? 2 : 0;\n }\n }\n else if (attribute) target.array.set(attribute.array, offset);\n else target.array.fill(0, offset, offset + count * target.itemSize);\n }\n if (!topologyChanged) return;\n writeMaterialIndices(source, materialIndices, merged.materialIndex!.array, vertexOffset);\n for (let i = 0; i < source.indices.array.length; i++) merged.indices.array[indexOffset + i] = source.indices.array[i] + vertexOffset;\n}\n\n/** Constant-time topology detection; markUpdated also covers in-place index edits. */\nexport function geometryTopologyChanged(prepared: Prepared | undefined, source: Geometry) {\n const state = prepared?.geometryStates.get(source);\n return !!state && (state.topologyVersion !== source.topologyVersion ||\n state.indices !== source.indices.array || state.indexCount !== source.indices.array.length);\n}\n\n/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */\nexport function updatePreparedGeometries(prepared: Prepared, changed: ReadonlySet<Geometry>) {\n const vertices: { first: number; count: number; topologyChanged: boolean; deformationOnly: boolean }[] = [];\n const blases: { blas: FlattendBVH; offset: number }[] = [];\n const meshes = new Set<Mesh>();\n let resized = false, relocated = false, offset = 0;\n const updated = new Map<Geometry, FlattendBVH>();\n prepared.geometries.forEach((geometry, i) => {\n const source = indices(prepared).prepared.get(geometry)?.[0].mesh.geometry ?? geometry;\n const previous = prepared.blases[i].bvh;\n if (changed.has(source)) {\n const region = prepared.geometryRegions.get(geometry)!;\n const topologyChanged = geometryTopologyChanged(prepared, source);\n const deformationOnly = !topologyChanged && isDeformationUpdate(source);\n let bvh = updated.get(source);\n if (!bvh) {\n bvh = getGeometryBvh(source);\n if (topologyChanged || !bvh || source.dynamic && bvh.builder !== 'builtin' || !refitBLAS(bvh, source)) {\n bvh = buildBLAS(source);\n }\n setGeometryBvh(source, bvh); updated.set(source, bvh);\n }\n setGeometryBvh(geometry, bvh); geometry.version = source.version;\n prepared.blases[i].bvh = bvh;\n resized ||= previous.buffer.byteLength !== bvh.buffer.byteLength;\n relocated ||= previous.buffer.byteLength !== bvh.buffer.byteLength || previous.layout !== bvh.layout;\n copyRegion(source, prepared.geometry, region, topologyChanged, deformationOnly);\n const count = source.vertexCount, previousVertices = vertices[vertices.length - 1];\n if (previousVertices && previousVertices.first + previousVertices.count === region.vertexOffset && previousVertices.topologyChanged === topologyChanged && previousVertices.deformationOnly === deformationOnly) previousVertices.count += count;\n else vertices.push({first: region.vertexOffset, count, topologyChanged, deformationOnly});\n blases.push({blas: bvh, offset});\n for (const binding of indices(prepared).prepared.get(geometry) ?? []) {\n binding.bvhBounds = getBvhBounds(geometry); meshes.add(binding.mesh);\n }\n }\n offset += prepared.blases[i].bvh.buffer.byteLength;\n });\n for (const source of changed) prepared.geometryStates.set(source, { topologyVersion: source.topologyVersion,\n indices: source.indices.array, indexCount: source.indices.array.length });\n return { vertices, blases, meshes, resized, relocated };\n}\n\n/** Packs the same interleaved vertex layout for full and partial GPU uploads. */\nexport function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number,\n offsets: readonly number[], first: number, count: number, includeMaterialIndex = true, deformationOnly = false) {\n for (let k = 0; k < vertexAttributes.length; k++) {\n if (k === 6 && !includeMaterialIndex || deformationOnly && k >= 2 && k <= 4) continue;\n const attribute = geometry[vertexAttributes[k]];\n if (!attribute) continue;\n const array = attribute.array, size = attribute.itemSize;\n let destination = first * stride + offsets[k], source = first * size;\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n for (let c = 0; c < size; c++) output[destination + c] = array[source + c];\n }\n }\n}\n"]}
1
+ {"version":3,"file":"geometryUpdates.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { isDeformationUpdate } from '../scene/geometryChanges.js';\nimport Geometry from '../scene/Geometry.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\nimport { buildBLAS, refitBLAS, type FlattendBVH } from './bvhAccel.js';\nimport { getBvhBounds, updateMeshInstances } from './prepareMeshBVH.js';\nimport Mesh from '../scene/Mesh.js';\n\ntype Prepared = ReturnType<typeof updateMeshInstances>;\nconst vertexAttributes = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\nconst bindingIndices = new WeakMap<Prepared, { source: Map<Geometry, Prepared['instanceBindings']>;\n prepared: Map<Geometry, Prepared['instanceBindings']> }>();\nfunction indices(prepared: Prepared) {\n let maps = bindingIndices.get(prepared);\n if (!maps) {\n maps = { source: new Map(), prepared: new Map() };\n for (const binding of prepared.instanceBindings) {\n for (const [map, geometry] of [[maps.source, binding.mesh.geometry], [maps.prepared, binding.geometry]] as const) {\n let bindings = map.get(geometry);\n if (!bindings) map.set(geometry, bindings = []);\n bindings.push(binding);\n }\n }\n bindingIndices.set(prepared, maps);\n }\n return maps;\n}\n\n/** Displaced geometry must be prepared as a whole. */\nexport function canUpdateGeometries(prepared: Prepared, geometries: readonly Geometry[]) {\n return geometries.every(geometry => {\n const bindings = indices(prepared).source.get(geometry) ?? [];\n return bindings.length > 0 && bindings.every(b => !b.mesh.materials.some(m => m.displacementMap) &&\n b.geometry.position.array === geometry.position.array);\n });\n}\n\n/** Rewrites only a geometry's existing region, preserving global material indices. */\nfunction copyRegion(source: Geometry, merged: Geometry, region: Prepared['geometryRegions'] extends Map<Geometry, infer R> ? R : never, topologyChanged: boolean, deformationOnly: boolean) {\n const { vertexOffset, indexOffset, materialIndices } = region;\n const count = source.vertexCount;\n for (const name of vertexAttributes) {\n if (name === 'materialIndex' || deformationOnly && name !== 'position' && name !== 'normal' && name !== 'tangent') continue;\n const target = merged[name]; if (!target) continue;\n const attribute = name === 'uv1' ? source.uv1 ?? source.uv : source[name];\n const offset = vertexOffset * target.itemSize;\n if (attribute && attribute.itemSize !== target.itemSize) {\n for (let v = 0; v < count; v++) for (let c = 0; c < target.itemSize; c++) {\n target.array[offset + v * target.itemSize + c] = c < attribute.itemSize ? attribute.array[v * attribute.itemSize + c] : name === 'tangent' && !hasGeneratedVertexTangents(source) ? 2 : 0;\n }\n }\n else if (attribute) target.array.set(attribute.array, offset);\n else target.array.fill(name === 'color' ? 1 : 0, offset, offset + count * target.itemSize);\n }\n if (!topologyChanged) return;\n writeMaterialIndices(source, materialIndices, merged.materialIndex!.array, vertexOffset);\n for (let i = 0; i < source.indices.array.length; i++) merged.indices.array[indexOffset + i] = source.indices.array[i] + vertexOffset;\n}\n\n/** Constant-time topology detection; markUpdated also covers in-place index edits. */\nexport function geometryTopologyChanged(prepared: Prepared | undefined, source: Geometry) {\n const state = prepared?.geometryStates.get(source);\n return !!state && (state.topologyVersion !== source.topologyVersion ||\n state.indices !== source.indices.array || state.indexCount !== source.indices.array.length);\n}\n\n/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */\nexport function updatePreparedGeometries(prepared: Prepared, changed: ReadonlySet<Geometry>) {\n const vertices: { first: number; count: number; topologyChanged: boolean; deformationOnly: boolean }[] = [];\n const blases: { blas: FlattendBVH; offset: number }[] = [];\n const meshes = new Set<Mesh>();\n let resized = false, relocated = false, offset = 0;\n const updated = new Map<Geometry, FlattendBVH>();\n prepared.geometries.forEach((geometry, i) => {\n const source = indices(prepared).prepared.get(geometry)?.[0].mesh.geometry ?? geometry;\n const previous = prepared.blases[i].bvh;\n if (changed.has(source)) {\n const region = prepared.geometryRegions.get(geometry)!;\n const topologyChanged = geometryTopologyChanged(prepared, source);\n const deformationOnly = !topologyChanged && isDeformationUpdate(source);\n let bvh = updated.get(source);\n if (!bvh) {\n bvh = getGeometryBvh(source);\n if (topologyChanged || !bvh || source.dynamic && bvh.builder !== 'builtin' || !refitBLAS(bvh, source)) {\n bvh = buildBLAS(source);\n }\n setGeometryBvh(source, bvh); updated.set(source, bvh);\n }\n setGeometryBvh(geometry, bvh); geometry.version = source.version;\n prepared.blases[i].bvh = bvh;\n resized ||= previous.buffer.byteLength !== bvh.buffer.byteLength;\n relocated ||= previous.buffer.byteLength !== bvh.buffer.byteLength || previous.layout !== bvh.layout;\n copyRegion(source, prepared.geometry, region, topologyChanged, deformationOnly);\n const count = source.vertexCount, previousVertices = vertices[vertices.length - 1];\n if (previousVertices && previousVertices.first + previousVertices.count === region.vertexOffset && previousVertices.topologyChanged === topologyChanged && previousVertices.deformationOnly === deformationOnly) previousVertices.count += count;\n else vertices.push({first: region.vertexOffset, count, topologyChanged, deformationOnly});\n blases.push({blas: bvh, offset});\n for (const binding of indices(prepared).prepared.get(geometry) ?? []) {\n binding.bvhBounds = getBvhBounds(geometry); meshes.add(binding.mesh);\n }\n }\n offset += prepared.blases[i].bvh.buffer.byteLength;\n });\n for (const source of changed) prepared.geometryStates.set(source, { topologyVersion: source.topologyVersion,\n indices: source.indices.array, indexCount: source.indices.array.length });\n return { vertices, blases, meshes, resized, relocated };\n}\n\n/** Packs the same interleaved vertex layout for full and partial GPU uploads. */\nexport function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number,\n offsets: readonly number[], first: number, count: number, includeMaterialIndex = true, deformationOnly = false) {\n for (let k = 0; k < vertexAttributes.length; k++) {\n if (k === 6 && !includeMaterialIndex || deformationOnly && k >= 2 && k <= 4) continue;\n const attribute = geometry[vertexAttributes[k]];\n if (!attribute) continue;\n const array = attribute.array, size = attribute.itemSize;\n let destination = first * stride + offsets[k], source = first * size;\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n for (let c = 0; c < size; c++) output[destination + c] = array[source + c];\n }\n }\n}\n"]}
@@ -3,16 +3,16 @@
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) {
7
- vec4 origin = viewProjectionInv * vec4(fD * 2.0 - 1.0, -1.0, 1.0);
8
- vec4 target = viewProjectionInv * vec4(fD * 2.0 - 1.0, 1.0, 1.0);
6
+ Ray hC(vec2 fG) {
7
+ vec4 origin = viewProjectionInv * vec4(fG * 2.0 - 1.0, -1.0, 1.0);
8
+ vec4 target = viewProjectionInv * vec4(fG * 2.0 - 1.0, 1.0, 1.0);
9
9
  Ray cam;
10
- iw(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
10
+ iC(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
11
11
 
12
12
  return cam;
13
13
  }
14
14
 
15
- vec2 oz(vec2 p) {
15
+ vec2 oL(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 nN() {
24
+ Ray cam = hC(v_Texcoord + sa());
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 ol = -normalize(viewInv[2].xyz);
29
+ vec3 qy = eye + cam.d * (cameraFocusDistance / dot(cam.d, ol));
30
+ vec2 rK = cameraApertureRadius * oL(fo(CAMERA_LENS));
31
+ vec3 origin = vec3(viewInv * vec4(rK, 0.0, 1.0));
32
+ iC(cam, origin, normalize(qy - origin));
33
33
  }
34
34
  return cam;
35
35
  }
@@ -6,20 +6,26 @@
6
6
  import { createShaderMixin, glsl, Shader } from '../../shader.js';
7
7
  export default createShaderMixin({
8
8
  uniforms: {
9
+ environmentRotation: Shader.uniform('mat3', [1, 0, 0, 0, 1, 0, 0, 0, 1]),
9
10
  envMap: Shader.uniform('sampler2D'),
10
11
  envMapDistribution: Shader.uniform('sampler2D'),
11
12
  backgroundMap: Shader.uniform('sampler2D'),
13
+ backgroundMapTransform: Shader.uniform('vec4', [1, 0, 1, 0]),
12
14
  groundedBackgroundParams: Shader.uniform('vec4'),
13
15
  groundedBackgroundCenter: Shader.uniform('vec2')
14
16
  },
15
17
  main: glsl `
16
- vec2 aS(vec3 gb) {
17
- float phi = mod(atan(-gb.z, -gb.x), TWOPI);
18
- float theta = acos(gb.y);
18
+ vec2 eL(vec3 gg) {
19
+ float phi = mod(atan(-gg.z, -gg.x), TWOPI);
20
+ float theta = acos(clamp(gg.y, -1.0, 1.0));
19
21
  return vec2(phi * 0.5 * INVPI, theta * INVPI);
20
22
  }
21
23
 
22
- float qp(float u, out int vOffset, out float pdf) {
24
+ vec2 cY(vec3 mQ) {
25
+ return eL(transpose(environmentRotation) * mQ);
26
+ }
27
+
28
+ float qB(float u, out int vOffset, out float pdf) {
23
29
  ivec2 size = textureSize(envMap, 0);
24
30
 
25
31
  int left = 0;
@@ -45,7 +51,7 @@ pdf = s0.y;
45
51
  return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);
46
52
  }
47
53
 
48
- float qo(float u, int vOffset, out float pdf) {
54
+ float qA(float u, int vOffset, out float pdf) {
49
55
  ivec2 size = textureSize(envMap, 0);
50
56
 
51
57
  int left = 0;
@@ -59,123 +65,123 @@ left = mid + 1;
59
65
  right = mid;
60
66
  }
61
67
  }
62
- int oG = left - 1;
68
+ int oS = left - 1;
63
69
 
64
70
 
65
71
 
66
- vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + oG, vOffset), 0).xy;
67
- vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + oG + 1, vOffset), 0).xy;
72
+ vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + oS, vOffset), 0).xy;
73
+ vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + oS + 1, vOffset), 0).xy;
68
74
 
69
75
  pdf = s0.y;
70
76
 
71
- return (float(oG) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
77
+ return (float(oS) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
72
78
  }
73
79
 
74
80
 
75
- vec3 oA(vec2 random, out vec2 uv, out float pdf) {
76
- vec2 gY;
81
+ vec3 oM(vec2 random, out vec2 uv, out float pdf) {
82
+ vec2 hd;
77
83
  int vOffset;
78
84
 
79
- uv.y = qp(random.x, vOffset, gY.y);
80
- uv.x = qo(random.y, vOffset, gY.x);
85
+ uv.y = qB(random.x, vOffset, hd.y);
86
+ uv.x = qA(random.y, vOffset, hd.x);
81
87
 
82
88
  float phi = uv.x * TWOPI;
83
89
  float theta = uv.y * PI;
84
90
  float cc = cos(theta);
85
91
  float sinTheta = sin(theta);
86
- float tZ = cos(phi);
87
- float uh = sin(phi);
92
+ float ul = cos(phi);
93
+ float uw = sin(phi);
88
94
 
89
- vec3 dir = vec3(-sinTheta * tZ, cc, -sinTheta * uh);
95
+ vec3 dir = vec3(-sinTheta * ul, cc, -sinTheta * uw);
90
96
 
91
- pdf = gY.x * gY.y * INVPI2 / (2.0 * sinTheta);
97
+ pdf = hd.x * hd.y * INVPI2 / (2.0 * sinTheta);
92
98
 
93
- return dir;
99
+ return environmentRotation * dir;
94
100
  }
95
101
 
96
- float iv(vec2 uv) {
102
+ float iB(vec2 uv) {
97
103
  vec2 size = vec2(textureSize(envMap, 0));
98
104
 
99
105
  float sinTheta = sin(uv.y * PI);
100
106
 
101
107
  uv *= size;
102
108
 
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;
109
+ float sL = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;
110
+ float sM = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;
105
111
 
106
- return sw * sz * INVPI2 / (2.0 * sinTheta);
112
+ return sL * sM * INVPI2 / (2.0 * sinTheta);
107
113
  }
108
114
 
109
- float dq(vec3 sA, float height, float radius) {
110
- float fN = length(sA);
111
- if (fN < 0.00001) {
115
+ float dq(vec3 sN, float height, float radius) {
116
+ float fQ = length(sN);
117
+ if (fQ < 0.00001) {
112
118
  return -radius;
113
119
  }
114
120
 
115
- float iC = radius * sA.y / fN;
116
- float ik = -1.5 * height;
121
+ float iG = radius * sN.y / fQ;
122
+ float iq = -1.5 * height;
117
123
  float ev;
118
- if (iC >= 0.0) {
124
+ if (iG >= 0.0) {
119
125
  ev = radius;
120
- } else if (iC < ik) {
121
- ev = -height * fN / sA.y;
126
+ } else if (iG < iq) {
127
+ ev = -height * fQ / sN.y;
122
128
  } else {
123
129
  float dW = 1.0
124
- - iC * iC / (3.0 * ik * ik);
130
+ - iG * iG / (3.0 * iq * iq);
125
131
  ev = radius * dW;
126
132
  }
127
- return fN - ev;
133
+ return fQ - ev;
128
134
  }
129
135
 
130
- vec3 eQ(vec3 origin, vec3 d) {
136
+ vec3 eT(vec3 origin, vec3 d) {
131
137
  #ifdef USE_GROUNDED_BACKGROUND
132
138
  float height = groundedBackgroundParams.x;
133
139
  float radius = groundedBackgroundParams.y;
134
- float vB = groundedBackgroundParams.z;
140
+ float vN = groundedBackgroundParams.z;
135
141
  vec3 bY = normalize(d);
136
142
  vec3 bB = origin - vec3(
137
143
  groundedBackgroundCenter.x,
138
- vB + height,
144
+ vN + height,
139
145
  groundedBackgroundCenter.y
140
146
  );
141
147
 
142
148
 
143
149
 
144
- float eI = dot(bB, bY);
145
- float ej = eI * eI
150
+ float eJ = dot(bB, bY);
151
+ float ej = eJ * eJ
146
152
  - dot(bB, bB) + radius * radius;
147
153
  if (ej > 0.0) {
148
- float cB = -eI + sqrt(ej);
154
+ float cC = -eJ + sqrt(ej);
149
155
  if (
150
- cB > 0.0
156
+ cC > 0.0
151
157
  && dq(bB, height, radius) <= 0.0
152
158
  ) {
153
- vec3 nB = bB + bY * cB;
154
- if (nB.y >= 0.0) {
155
- return normalize(nB);
159
+ vec3 nP = bB + bY * cC;
160
+ if (nP.y >= 0.0) {
161
+ return normalize(nP);
156
162
  }
157
163
 
158
164
  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)
165
+ float hT = (-height - bB.y) / bY.y;
166
+ vec3 nF = bB + bY * hT;
167
+ float oo = (2.0 / 3.0)
162
168
  * sqrt(radius * radius - 2.25 * height * height);
163
- if (hQ > 0.0 && length(nk.xz) <= nZ) {
164
- return normalize(nk);
169
+ if (hT > 0.0 && length(nF.xz) <= oo) {
170
+ return normalize(nF);
165
171
  }
166
172
  }
167
173
 
168
174
  float cN = 0.0;
169
175
  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;
176
+ float fh = (cN + cC) * 0.5;
177
+ vec3 pL = bB + bY * fh;
178
+ if (dq(pL, height, radius) > 0.0) {
179
+ cC = fh;
174
180
  } else {
175
- cN = fe;
181
+ cN = fh;
176
182
  }
177
183
  }
178
- vec3 hit = bB + bY * ((cN + cB) * 0.5);
184
+ vec3 hit = bB + bY * ((cN + cC) * 0.5);
179
185
  return normalize(hit);
180
186
  }
181
187
  }
@@ -183,10 +189,16 @@ return normalize(hit);
183
189
  return d;
184
190
  }
185
191
 
186
- vec4 cw(vec3 origin, vec3 d) {
187
- d = eQ(origin, d);
188
- vec2 uv = aS(d);
189
- return textureLinear(backgroundMap, uv);
192
+ vec4 cx(vec3 origin, vec3 d) {
193
+ d = eT(origin, d);
194
+ #ifdef USE_BACKGROUND
195
+ vec4 t = backgroundMapTransform;
196
+ d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
197
+ vec4 aW = textureLinear(backgroundMap, eL(d));
198
+ return vec4(aW.rgb * t.z, aW.a);
199
+ #else
200
+ return textureLinear(backgroundMap, cY(d));
201
+ #endif
190
202
  }`
191
203
  });
192
204
  //# sourceMappingURL=envMap.glsl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"envMap.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/envMap.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,sFAAsF;AACtF,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+KV;CACD,CAAC,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Sample the environment map using a cumulative distribution function as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Sampling_Light_Sources.html#InfiniteAreaLights\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nexport default createShaderMixin({\n uniforms: {\n envMap: Shader.uniform('sampler2D'),\n envMapDistribution: Shader.uniform('sampler2D'),\n backgroundMap: Shader.uniform('sampler2D'),\n groundedBackgroundParams: Shader.uniform('vec4'),\n groundedBackgroundCenter: Shader.uniform('vec2')\n },\n main: glsl`\nvec2 cartesianToEquirect(vec3 pointOnSphere) {\n float phi = mod(atan(-pointOnSphere.z, -pointOnSphere.x), TWOPI);\n float theta = acos(pointOnSphere.y);\n return vec2(phi * 0.5 * INVPI, theta * INVPI);\n}\n\nfloat getEnvmapV(float u, out int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.y + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(0, mid), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n vOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(0, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(0, vOffset + 1), 0).xy;\n\n pdf = s0.y;\n\n return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);\n}\n\nfloat getEnvmapU(float u, int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.x + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(1 + mid, vOffset), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n int uOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + uOffset, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + uOffset + 1, vOffset), 0).xy;\n\n pdf = s0.y;\n\n return (float(uOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);\n}\n\n// Perform two binary searches to find light direction.\nvec3 sampleEnvmap(vec2 random, out vec2 uv, out float pdf) {\n vec2 partialPdf;\n int vOffset;\n\n uv.y = getEnvmapV(random.x, vOffset, partialPdf.y);\n uv.x = getEnvmapU(random.y, vOffset, partialPdf.x);\n\n float phi = uv.x * TWOPI;\n float theta = uv.y * PI;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n float cosPhi = cos(phi);\n float sinPhi = sin(phi);\n\n vec3 dir = vec3(-sinTheta * cosPhi, cosTheta, -sinTheta * sinPhi);\n\n pdf = partialPdf.x * partialPdf.y * INVPI2 / (2.0 * sinTheta);\n\n return dir;\n}\n\nfloat envMapPdf(vec2 uv) {\n vec2 size = vec2(textureSize(envMap, 0));\n\n float sinTheta = sin(uv.y * PI);\n\n uv *= size;\n\n float partialX = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;\n float partialY = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;\n\n return partialX * partialY * INVPI2 / (2.0 * sinTheta);\n}\n\nfloat groundedSurfaceDistance(vec3 point, float height, float radius) {\n float pointLength = length(point);\n if (pointLength < 0.00001) {\n return -radius;\n }\n\n float originalY = radius * point.y / pointLength;\n float transitionY = -1.5 * height;\n float surfaceRadius;\n if (originalY >= 0.0) {\n surfaceRadius = radius;\n } else if (originalY < transitionY) {\n surfaceRadius = -height * pointLength / point.y;\n } else {\n float factor = 1.0\n - originalY * originalY / (3.0 * transitionY * transitionY);\n surfaceRadius = radius * factor;\n }\n return pointLength - surfaceRadius;\n}\n\nvec3 groundedBackgroundDirection(vec3 origin, vec3 d) {\n#ifdef USE_GROUNDED_BACKGROUND\n float height = groundedBackgroundParams.x;\n float radius = groundedBackgroundParams.y;\n float groundY = groundedBackgroundParams.z;\n vec3 rayDirection = normalize(d);\n vec3 localOrigin = origin - vec3(\n groundedBackgroundCenter.x,\n groundY + height,\n groundedBackgroundCenter.y\n );\n\n // The grounded skybox is a deformed sphere. Find the point where the ray\n // exits that surface so its texture lookup matches the rasterized geometry.\n float projectedOrigin = dot(localOrigin, rayDirection);\n float discriminant = projectedOrigin * projectedOrigin\n - dot(localOrigin, localOrigin) + radius * radius;\n if (discriminant > 0.0) {\n float farDistance = -projectedOrigin + sqrt(discriminant);\n if (\n farDistance > 0.0\n && groundedSurfaceDistance(localOrigin, height, radius) <= 0.0\n ) {\n vec3 sphereHit = localOrigin + rayDirection * farDistance;\n if (sphereHit.y >= 0.0) {\n return normalize(sphereHit);\n }\n\n if (rayDirection.y < -0.00001 && radius > 1.5 * height) {\n float groundDistance = (-height - localOrigin.y) / rayDirection.y;\n vec3 groundHit = localOrigin + rayDirection * groundDistance;\n float groundRadius = (2.0 / 3.0)\n * sqrt(radius * radius - 2.25 * height * height);\n if (groundDistance > 0.0 && length(groundHit.xz) <= groundRadius) {\n return normalize(groundHit);\n }\n }\n\n float nearDistance = 0.0;\n for (int i = 0; i < 14; i++) {\n float middleDistance = (nearDistance + farDistance) * 0.5;\n vec3 middlePoint = localOrigin + rayDirection * middleDistance;\n if (groundedSurfaceDistance(middlePoint, height, radius) > 0.0) {\n farDistance = middleDistance;\n } else {\n nearDistance = middleDistance;\n }\n }\n vec3 hit = localOrigin + rayDirection * ((nearDistance + farDistance) * 0.5);\n return normalize(hit);\n }\n }\n#endif\n return d;\n}\n\nvec4 sampleBackgroundFromRay(vec3 origin, vec3 d) {\n d = groundedBackgroundDirection(origin, d);\n vec2 uv = cartesianToEquirect(d);\n return textureLinear(backgroundMap, uv);\n}`\n});\n"]}
1
+ {"version":3,"file":"envMap.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/envMap.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,sFAAsF;AACtF,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QACzD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyLV;CACD,CAAC,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Sample the environment map using a cumulative distribution function as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Sampling_Light_Sources.html#InfiniteAreaLights\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nexport default createShaderMixin({\n uniforms: {\n environmentRotation: Shader.uniform('mat3', [1,0,0, 0,1,0, 0,0,1]),\n envMap: Shader.uniform('sampler2D'),\n envMapDistribution: Shader.uniform('sampler2D'),\n backgroundMap: Shader.uniform('sampler2D'),\n backgroundMapTransform: Shader.uniform('vec4', [1,0,1,0]),\n groundedBackgroundParams: Shader.uniform('vec4'),\n groundedBackgroundCenter: Shader.uniform('vec2')\n },\n main: glsl`\nvec2 cartesianToEquirect(vec3 pointOnSphere) {\n float phi = mod(atan(-pointOnSphere.z, -pointOnSphere.x), TWOPI);\n float theta = acos(clamp(pointOnSphere.y, -1.0, 1.0));\n return vec2(phi * 0.5 * INVPI, theta * INVPI);\n}\n\nvec2 environmentUv(vec3 worldDirection) {\n return cartesianToEquirect(transpose(environmentRotation) * worldDirection);\n}\n\nfloat getEnvmapV(float u, out int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.y + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(0, mid), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n vOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(0, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(0, vOffset + 1), 0).xy;\n\n pdf = s0.y;\n\n return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);\n}\n\nfloat getEnvmapU(float u, int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.x + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(1 + mid, vOffset), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n int uOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + uOffset, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + uOffset + 1, vOffset), 0).xy;\n\n pdf = s0.y;\n\n return (float(uOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);\n}\n\n// Perform two binary searches to find light direction.\nvec3 sampleEnvmap(vec2 random, out vec2 uv, out float pdf) {\n vec2 partialPdf;\n int vOffset;\n\n uv.y = getEnvmapV(random.x, vOffset, partialPdf.y);\n uv.x = getEnvmapU(random.y, vOffset, partialPdf.x);\n\n float phi = uv.x * TWOPI;\n float theta = uv.y * PI;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n float cosPhi = cos(phi);\n float sinPhi = sin(phi);\n\n vec3 dir = vec3(-sinTheta * cosPhi, cosTheta, -sinTheta * sinPhi);\n\n pdf = partialPdf.x * partialPdf.y * INVPI2 / (2.0 * sinTheta);\n\n return environmentRotation * dir;\n}\n\nfloat envMapPdf(vec2 uv) {\n vec2 size = vec2(textureSize(envMap, 0));\n\n float sinTheta = sin(uv.y * PI);\n\n uv *= size;\n\n float partialX = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;\n float partialY = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;\n\n return partialX * partialY * INVPI2 / (2.0 * sinTheta);\n}\n\nfloat groundedSurfaceDistance(vec3 point, float height, float radius) {\n float pointLength = length(point);\n if (pointLength < 0.00001) {\n return -radius;\n }\n\n float originalY = radius * point.y / pointLength;\n float transitionY = -1.5 * height;\n float surfaceRadius;\n if (originalY >= 0.0) {\n surfaceRadius = radius;\n } else if (originalY < transitionY) {\n surfaceRadius = -height * pointLength / point.y;\n } else {\n float factor = 1.0\n - originalY * originalY / (3.0 * transitionY * transitionY);\n surfaceRadius = radius * factor;\n }\n return pointLength - surfaceRadius;\n}\n\nvec3 groundedBackgroundDirection(vec3 origin, vec3 d) {\n#ifdef USE_GROUNDED_BACKGROUND\n float height = groundedBackgroundParams.x;\n float radius = groundedBackgroundParams.y;\n float groundY = groundedBackgroundParams.z;\n vec3 rayDirection = normalize(d);\n vec3 localOrigin = origin - vec3(\n groundedBackgroundCenter.x,\n groundY + height,\n groundedBackgroundCenter.y\n );\n\n // The grounded skybox is a deformed sphere. Find the point where the ray\n // exits that surface so its texture lookup matches the rasterized geometry.\n float projectedOrigin = dot(localOrigin, rayDirection);\n float discriminant = projectedOrigin * projectedOrigin\n - dot(localOrigin, localOrigin) + radius * radius;\n if (discriminant > 0.0) {\n float farDistance = -projectedOrigin + sqrt(discriminant);\n if (\n farDistance > 0.0\n && groundedSurfaceDistance(localOrigin, height, radius) <= 0.0\n ) {\n vec3 sphereHit = localOrigin + rayDirection * farDistance;\n if (sphereHit.y >= 0.0) {\n return normalize(sphereHit);\n }\n\n if (rayDirection.y < -0.00001 && radius > 1.5 * height) {\n float groundDistance = (-height - localOrigin.y) / rayDirection.y;\n vec3 groundHit = localOrigin + rayDirection * groundDistance;\n float groundRadius = (2.0 / 3.0)\n * sqrt(radius * radius - 2.25 * height * height);\n if (groundDistance > 0.0 && length(groundHit.xz) <= groundRadius) {\n return normalize(groundHit);\n }\n }\n\n float nearDistance = 0.0;\n for (int i = 0; i < 14; i++) {\n float middleDistance = (nearDistance + farDistance) * 0.5;\n vec3 middlePoint = localOrigin + rayDirection * middleDistance;\n if (groundedSurfaceDistance(middlePoint, height, radius) > 0.0) {\n farDistance = middleDistance;\n } else {\n nearDistance = middleDistance;\n }\n }\n vec3 hit = localOrigin + rayDirection * ((nearDistance + farDistance) * 0.5);\n return normalize(hit);\n }\n }\n#endif\n return d;\n}\n\nvec4 sampleBackgroundFromRay(vec3 origin, vec3 d) {\n d = groundedBackgroundDirection(origin, d);\n#ifdef USE_BACKGROUND\n vec4 t = backgroundMapTransform;\n d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);\n vec4 backgroundSample = textureLinear(backgroundMap, cartesianToEquirect(d));\n return vec4(backgroundSample.rgb * t.z, backgroundSample.a);\n#else\n return textureLinear(backgroundMap, environmentUv(d));\n#endif\n}`\n});\n"]}