@meimu/mutracer 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -8,35 +8,35 @@ import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
8
8
  const displacementWgsl = pdm_displacementWgsl;
9
9
  const flatIntersectCode = function () {
10
10
  return /* wgsl */ `
11
- let hit = ga(o, d, tri, eq, gY, tMax);
11
+ let hit = fY(o, d, tri, ei, gZ, tMax);
12
12
  if (hit.t > 0.0) {
13
13
  let e1 = tri.p1 - tri.p0;
14
14
  let e2 = tri.p2 - tri.p0;
15
- eL = normalize(cross(e1, e2));
16
- let kP = i32(ah(bitcast<i32>(pi.z)).x);
17
- let jd = materialsBuffer[kP].doubleSided > 0.5;
18
- if (!doubleSided && !jd && dot(eL, d) > 0.0) {
19
- eL = vec3f(0.0);
15
+ hitNormal = normalize(cross(e1, e2));
16
+ let lc = i32(af(bitcast<i32>(qf.z)).x);
17
+ let jm = materialsBuffer[lc].doubleSided > 0.5;
18
+ if (!doubleSided && !jm && dot(hitNormal, d) > 0.0) {
19
+ hitNormal = vec3f(0.0);
20
20
  continue;
21
21
  }
22
22
 
23
23
  tMax = hit.t;
24
- sj = true;
25
- pl = true;
26
- fi = o + tMax * d;
27
- aC = hit.barycentric;
24
+ tD = true;
25
+ qi = true;
26
+ fe = o + tMax * d;
27
+ aw = hit.barycentric;
28
28
  }
29
29
  `;
30
30
  };
31
31
  function getPDMDisplacmentCode(anyHit) {
32
32
  return /*wgsl */ `
33
- let lH = pY(
33
+ let mh = qW(
34
34
  o, d, tMax,
35
35
  tri.p0, tri.p1, tri.p2,
36
36
  n0, n1, n2,
37
37
  uv0, uv1, uv2,
38
38
  displacementMapIndex,
39
- jO(displacementMapIndex),
39
+ getMapSize(displacementMapIndex),
40
40
  minH, maxH,
41
41
  hScale,
42
42
  matData.displacementBias,
@@ -44,51 +44,51 @@ matData.displacementStepSize,
44
44
  i32(matData.displacementUvProjection),
45
45
  displacementUvProjectionScale,
46
46
  ${anyHit ? 'true' : 'false'},
47
- jA
47
+ jK
48
48
  );
49
49
  `;
50
50
  }
51
51
  const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
52
52
  return /* wgsl */ `
53
53
 
54
- let hScale = pi.w;
55
- let uQ = bitcast<i32>(r3.w);
54
+ let hScale = qf.w;
55
+ let wK = bitcast<i32>(r3.w);
56
56
 
57
- let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
57
+ let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
58
58
  let matData = materialsBuffer[materialIndex];
59
- let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
60
- let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
61
- let n2 = normalize(attrBuffers[index.z * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
59
+ let n0 = normalize(vertexNormal(index.x));
60
+ let n1 = normalize(vertexNormal(index.y));
61
+ let n2 = normalize(vertexNormal(index.z));
62
62
  if (matData.displacementMapIndex >= 0.0 && matData.displacementBias != 0.0) {
63
63
  tri.p0 += n0 * matData.displacementBias;
64
64
  tri.p1 += n1 * matData.displacementBias;
65
65
  tri.p2 += n2 * matData.displacementBias;
66
66
  }
67
- if (abs(hScale) > 0.0 && uQ > 0) {
68
- let minH = f32(uQ >> 8) / 255.0;
69
- let maxH = f32(uQ & 0xff) / 255.0;
67
+ if (abs(hScale) > 0.0 && wK > 0) {
68
+ let minH = f32(wK >> 8) / 255.0;
69
+ let maxH = f32(wK & 0xff) / 255.0;
70
70
  let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
71
71
  let displacementMapIndex = i32(matData.displacementMapIndex);
72
72
 
73
73
 
74
- var uv0 = attrBuffers[index.x * ATTR_STRIDE + UV_OFF].xy;
75
- var uv1 = attrBuffers[index.y * ATTR_STRIDE + UV_OFF].xy;
76
- var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
74
+ var uv0 = hd(index.x);
75
+ var uv1 = hd(index.y);
76
+ var uv2 = hd(index.z);
77
77
 
78
78
  ${getPDMDisplacmentCode(anyHit)}
79
79
 
80
- if (lH.t < tMax) {
81
- eL = lH.normal;
80
+ if (mh.t < tMax) {
81
+ hitNormal = mh.normal;
82
82
 
83
83
 
84
- tMax = lH.t;
84
+ tMax = mh.t;
85
85
 
86
- aC = lH.barycentric;
87
- fi = o + tMax * d;
86
+ aw = mh.barycentric;
87
+ fe = o + tMax * d;
88
88
 
89
- bZ = true;
90
- sj = true;
91
- pl = true;
89
+ bQ = true;
90
+ tD = true;
91
+ qi = true;
92
92
  }
93
93
  }
94
94
  else {
@@ -97,7 +97,7 @@ ${flatIntersectCode()}
97
97
  `;
98
98
  };
99
99
  const cwbvhTraversalWgsl = /* wgsl */ `
100
- fn bA(value: u32) -> vec4f {
100
+ fn bn(value: u32) -> vec4f {
101
101
  return vec4f(
102
102
  f32(value & 0xffu),
103
103
  f32((value >> 8u) & 0xffu),
@@ -112,118 +112,118 @@ f32(value >> 24u)
112
112
 
113
113
 
114
114
 
115
- fn lb(value: u32) -> u32 {
115
+ fn lv(value: u32) -> u32 {
116
116
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
117
117
  }
118
118
 
119
- fn oT(value: u32) -> u32 {
119
+ fn pR(value: u32) -> u32 {
120
120
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
121
121
  }
122
122
 
123
- fn pj(
123
+ fn qg(
124
124
  node: i32,
125
- uJ: i32,
125
+ ww: i32,
126
126
  n0: vec4f,
127
127
  o: vec3f,
128
- gr: vec3f,
128
+ invD: vec3f,
129
129
  tMax: f32
130
130
  ) -> u32 {
131
- let i = node + uJ;
131
+ let i = node + ww;
132
132
  let n2 = bvhBuffer[i + 2];
133
133
  let n3 = bvhBuffer[i + 3];
134
134
  let n4 = bvhBuffer[i + 4];
135
135
  let header = bitcast<u32>(n0.w);
136
- let sH = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
- let sI = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
- let sJ = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
- let hZ = vec3f(
140
- bitcast<f32>(u32(sH + 127) << 23u),
141
- bitcast<f32>(u32(sI + 127) << 23u),
142
- bitcast<f32>(u32(sJ + 127) << 23u)
136
+ let uc = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
+ let ud = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
+ let ue = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
+ let ih = vec3f(
140
+ bitcast<f32>(u32(uc + 127) << 23u),
141
+ bitcast<f32>(u32(ud + 127) << 23u),
142
+ bitcast<f32>(u32(ue + 127) << 23u)
143
143
  );
144
- let padding = fk(gr, o);
145
- let eS = (n0.xyz - o) * gr;
146
- let dq = hZ * gr;
144
+ let padding = ff(invD, o);
145
+ let eM = (n0.xyz - o) * invD;
146
+ let cW = ih * invD;
147
147
 
148
148
 
149
149
 
150
- let vc = bitcast<vec4u>(n2);
151
- let vd = bitcast<vec4u>(n3);
152
- let ve = bitcast<vec4u>(n4);
153
- let negative = gr < vec3f(0.0);
154
- let wn = select(vc.xy, vd.zw, negative.x);
155
- let xt = select(vd.zw, vc.xy, negative.x);
156
- let wo = select(vc.zw, ve.xy, negative.y);
157
- let xu = select(ve.xy, vc.zw, negative.y);
158
- let wp = select(vd.xy, ve.zw, negative.z);
159
- let xv = select(ve.zw, vd.xy, negative.z);
150
+ let xd = bitcast<vec4u>(n2);
151
+ let xe = bitcast<vec4u>(n3);
152
+ let xf = bitcast<vec4u>(n4);
153
+ let negative = invD < vec3f(0.0);
154
+ let yK = select(xd.xy, xe.zw, negative.x);
155
+ let zV = select(xe.zw, xd.xy, negative.x);
156
+ let yL = select(xd.zw, xf.xy, negative.y);
157
+ let zW = select(xf.xy, xd.zw, negative.y);
158
+ let yM = select(xe.xy, xf.zw, negative.z);
159
+ let zX = select(xf.zw, xe.xy, negative.z);
160
160
 
161
- let yl = max(
161
+ let AL = max(
162
162
  max(
163
- bA(wn.x) * dq.x + eS.x - vec4f(padding.x),
164
- bA(wo.x) * dq.y + eS.y - vec4f(padding.y)
163
+ bn(yK.x) * cW.x + eM.x - vec4f(padding.x),
164
+ bn(yL.x) * cW.y + eM.y - vec4f(padding.y)
165
165
  ),
166
- bA(wp.x) * dq.z + eS.z - vec4f(padding.z)
166
+ bn(yM.x) * cW.z + eM.z - vec4f(padding.z)
167
167
  );
168
- let yg = min(
168
+ let AF = min(
169
169
  min(
170
- bA(xt.x) * dq.x + eS.x + vec4f(padding.x),
171
- bA(xu.x) * dq.y + eS.y + vec4f(padding.y)
170
+ bn(zV.x) * cW.x + eM.x + vec4f(padding.x),
171
+ bn(zW.x) * cW.y + eM.y + vec4f(padding.y)
172
172
  ),
173
- bA(xv.x) * dq.z + eS.z + vec4f(padding.z)
173
+ bn(zX.x) * cW.z + eM.z + vec4f(padding.z)
174
174
  );
175
- let ym = max(
175
+ let AM = max(
176
176
  max(
177
- bA(wn.y) * dq.x + eS.x - vec4f(padding.x),
178
- bA(wo.y) * dq.y + eS.y - vec4f(padding.y)
177
+ bn(yK.y) * cW.x + eM.x - vec4f(padding.x),
178
+ bn(yL.y) * cW.y + eM.y - vec4f(padding.y)
179
179
  ),
180
- bA(wp.y) * dq.z + eS.z - vec4f(padding.z)
180
+ bn(yM.y) * cW.z + eM.z - vec4f(padding.z)
181
181
  );
182
- let yh = min(
182
+ let AG = min(
183
183
  min(
184
- bA(xt.y) * dq.x + eS.x + vec4f(padding.x),
185
- bA(xu.y) * dq.y + eS.y + vec4f(padding.y)
184
+ bn(zV.y) * cW.x + eM.x + vec4f(padding.x),
185
+ bn(zW.y) * cW.y + eM.y + vec4f(padding.y)
186
186
  ),
187
- bA(xv.y) * dq.z + eS.z + vec4f(padding.z)
187
+ bn(zX.y) * cW.z + eM.z + vec4f(padding.z)
188
188
  );
189
189
 
190
- let wl = (yl <= min(yg, vec4f(tMax))) & (yg > vec4f(0.0));
191
- let wm = (ym <= min(yh, vec4f(tMax))) & (yh > vec4f(0.0));
192
- return select(0u, 1u, wl.x)
193
- | select(0u, 2u, wl.y)
194
- | select(0u, 4u, wl.z)
195
- | select(0u, 8u, wl.w)
196
- | select(0u, 16u, wm.x)
197
- | select(0u, 32u, wm.y)
198
- | select(0u, 64u, wm.z)
199
- | select(0u, 128u, wm.w);
190
+ let yG = (AL <= min(AF, vec4f(tMax))) & (AF > vec4f(0.0));
191
+ let yH = (AM <= min(AG, vec4f(tMax))) & (AG > vec4f(0.0));
192
+ return select(0u, 1u, yG.x)
193
+ | select(0u, 2u, yG.y)
194
+ | select(0u, 4u, yG.z)
195
+ | select(0u, 8u, yG.w)
196
+ | select(0u, 16u, yH.x)
197
+ | select(0u, 32u, yH.y)
198
+ | select(0u, 64u, yH.z)
199
+ | select(0u, 128u, yH.w);
200
200
  }
201
201
 
202
202
  `;
203
- function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
203
+ function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '', perInstanceBounds = false) {
204
204
  const intersectTriangles = /* wgsl */ `
205
- let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
206
- let vertexOffset = vec3i(bitcast<i32>(pi.y));
205
+ let qf = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
206
+ let vertexOffset = vec3i(bitcast<i32>(qf.y));
207
207
  for (var k = 0; k < primitiveCount; k++) {
208
208
  let triangleIndex = primitiveOffset + k;
209
209
  ${skipTriangleCode}
210
- if (bounces > 0 && triangleIndex == fV) {
210
+ if (bounces > 0 && triangleIndex == fT && bK == fS) {
211
211
  continue;
212
212
  }
213
213
 
214
214
  let r3 = bvhBuffer[triangleIndex];
215
215
  let index = bitcast<vec3i>(r3.xyz) + vertexOffset;
216
- var tri = fP(
217
- attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
218
- attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
219
- attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
216
+ var tri = fL(
217
+ vertexPosition(index.x),
218
+ vertexPosition(index.y),
219
+ vertexPosition(index.z)
220
220
  );
221
- var pl = false;
221
+ var qi = false;
222
222
 
223
223
  ${hasDisplacement
224
224
  ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
225
225
  : flatIntersectCode()}
226
- if (pl) {
226
+ if (qi) {
227
227
  ${handleHitCode}
228
228
  }
229
229
  }
@@ -231,285 +231,291 @@ ${handleHitCode}
231
231
  return /* wgsl */ `
232
232
  var d = ray.d;
233
233
  var o = ray.o;
234
- var jE = -1;
235
- var gr = fo(d);
236
- var bZ = false;
237
- var sj = false;
238
- var fi: vec3f;
239
- var eL: vec3f;
240
- var aC: vec3f;
241
-
242
-
243
- if (cU(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gr, tMax) > 0.0) {
244
- jE = 0;
245
- mK[0] = 0;
246
- }
247
- while (jE >= 0) {
248
- let ul = mK[jE];
249
- jE--;
234
+ var jO = -1;
235
+ ${perInstanceBounds ? 'let worldInvD = traversalInverse(ray.d);\nvar invD = worldInvD;' : 'var invD = traversalInverse(d);'}
236
+ var bQ = false;
237
+ var tD = false;
238
+ var fe: vec3f;
239
+ var hitNormal: vec3f;
240
+ var aw: vec3f;
241
+
242
+
243
+ if (bP(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, invD, tMax) > 0.0) {
244
+ jO = 0;
245
+ nA[0] = 0;
246
+ }
247
+ while (jO >= 0) {
248
+ let vY = nA[jO];
249
+ jO--;
250
250
  o = ray.o;
251
251
  d = ray.d;
252
- gr = fo(d);
253
-
254
- let xW = bvhBuffer[ul];
255
- let ff = bitcast<i32>(xW.w);
256
- if (ff >= 0) {
257
- let left = ul + 2;
258
- let right = ff;
259
- let d0 = cU(
252
+ invD = traversalInverse(d);
253
+
254
+ let Ax = bvhBuffer[vY];
255
+ let eZ = bitcast<i32>(Ax.w);
256
+ if (eZ >= 0) {
257
+ let left = vY + 2;
258
+ let right = eZ;
259
+ let d0 = bP(
260
260
  o,
261
261
  bvhBuffer[left].xyz,
262
262
  bvhBuffer[left + 1].xyz,
263
- gr,
263
+ invD,
264
264
  tMax
265
265
  );
266
- let d1 = cU(
266
+ let d1 = bP(
267
267
  o,
268
268
  bvhBuffer[right].xyz,
269
269
  bvhBuffer[right + 1].xyz,
270
- gr,
270
+ invD,
271
271
  tMax
272
272
  );
273
273
 
274
274
  if (d0 > d1) {
275
- if (d0 > 0.0) { jE++; mK[jE] = left; }
276
- if (d1 > 0.0) { jE++; mK[jE] = right; }
275
+ if (d0 > 0.0) { jO++; nA[jO] = left; }
276
+ if (d1 > 0.0) { jO++; nA[jO] = right; }
277
277
  }
278
278
  else {
279
- if (d1 > 0.0) { jE++; mK[jE] = right; }
280
- if (d0 > 0.0) { jE++; mK[jE] = left; }
279
+ if (d1 > 0.0) { jO++; nA[jO] = right; }
280
+ if (d0 > 0.0) { jO++; nA[jO] = left; }
281
281
  }
282
282
  }
283
283
  else {
284
- let rQ = -ff;
284
+ let td = -eZ;
285
285
 
286
286
 
287
287
  for (
288
- var nq = rQ - 1;
289
- nq >= 0;
290
- nq--
288
+ var nX = td - 1;
289
+ nX >= 0;
290
+ nX--
291
291
  ) {
292
- let qv = bvhBuffer[ul + 2 + nq];
293
- let bY = bitcast<i32>(qv.x);
294
- let wL = bitcast<i32>(qv.y);
295
- let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
292
+ let nY = bvhBuffer[vY + 2 + nX];
293
+ let bK = bitcast<i32>(nY.x);
294
+ ${perInstanceBounds ? /* wgsl */ `
295
+
296
+ let box = bitcast<i32>(nY.w);
297
+ if (bP(ray.o, bvhBuffer[box].xyz, bvhBuffer[box + 1].xyz, worldInvD, tMax) <= 0.0) {
298
+ continue;
299
+ }
300
+ ` : ''} let zn = bitcast<i32>(nY.y);
301
+ let qf = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
296
302
  let w2l = mat4x4<f32>(
297
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 1],
298
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 2],
299
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 3],
300
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 4]
303
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 1],
304
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 2],
305
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 3],
306
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 4]
301
307
  );
302
308
  o = (w2l * vec4f(ray.o, 1.0)).xyz;
303
309
  d = (w2l * vec4f(ray.d, 0.0)).xyz;
304
- gr = fo(d);
305
- eq = maxDimension(abs(d));
306
- gY = nk(d, eq);
310
+ invD = traversalInverse(d);
311
+ ei = maxDimension(abs(d));
312
+ gZ = nV(d, ei);
307
313
 
308
- let fY = bitcast<u32>(pi.x);
309
- let he = fY >> 30u;
310
- let blasOffset = i32(fY & 0x3fffffffu);
311
- let bw = rtUniform.blasOffset;
314
+ let fW = bitcast<u32>(qf.x);
315
+ let hj = fW >> 30u;
316
+ let blasOffset = i32(fW & 0x3fffffffu);
317
+ let bufferOff = rtUniform.blasOffset;
312
318
 
313
319
  ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
314
- if (he == 3u) {
320
+ if (hj == 3u) {
315
321
 
316
322
 
317
323
 
318
324
 
319
- var qj = -1;
320
- var td = 0u;
321
- var lJ = 0u;
325
+ var rk = -1;
326
+ var uD = 0u;
327
+ var mj = 0u;
322
328
 
323
- var eD = 0x80000000u;
324
- let vU = select(0u, 4u, d.x < 0.0)
329
+ var eu = 0x80000000u;
330
+ let yl = select(0u, 4u, d.x < 0.0)
325
331
  | select(0u, 2u, d.y < 0.0)
326
332
  | select(0u, 1u, d.z < 0.0);
327
- let rn = 7u - vU;
333
+ let su = 7u - yl;
328
334
 
329
335
 
330
336
 
331
337
 
332
- while (td < 4096u) {
333
- td++;
338
+ while (uD < 4096u) {
339
+ uD++;
334
340
 
335
- let internalMask = eD & 0xffu;
336
- let ri =
337
- lb(eD >> 24u) + 24u;
338
- eD &= ~(1u << ri);
339
- if ((eD & 0xff000000u) != 0u) {
340
- qj++;
341
+ let internalMask = eu & 0xffu;
342
+ let sp =
343
+ lv(eu >> 24u) + 24u;
344
+ eu &= ~(1u << sp);
345
+ if ((eu & 0xff000000u) != 0u) {
346
+ rk++;
341
347
 
342
- tD[qj] = vec2u(lJ, eD);
348
+ ve[rk] = vec2u(mj, eu);
343
349
  }
344
350
 
345
- let slot = (ri - 24u) ^ rn;
346
- let om = (1u << slot) - 1u;
347
- let relativeIndex = countOneBits(internalMask & om);
348
- let tA = lJ + relativeIndex;
349
- let node = blasOffset + i32(tA * 5u);
350
- let jZ = bvhBuffer[node + bw];
351
- let vG = pj(
352
- node, bw, jZ, o, gr, tMax
351
+ let slot = (sp - 24u) ^ su;
352
+ let oZ = (1u << slot) - 1u;
353
+ let relativeIndex = countOneBits(internalMask & oZ);
354
+ let va = mj + relativeIndex;
355
+ let node = blasOffset + i32(va * 5u);
356
+ let kj = bvhBuffer[node + bufferOff];
357
+ let xK = qg(
358
+ node, bufferOff, kj, o, invD, tMax
353
359
  );
354
360
 
355
361
 
356
- eD = 0u;
357
- if (vG != 0u) {
358
- let fU = bvhBuffer[node + bw + 1];
359
- let sP = bitcast<u32>(jZ.w) >> 24u;
360
- var uO = 0u;
361
- var kM = vG;
362
- while (kM != 0u) {
363
- let sC = lb(kM);
364
- kM &= ~(1u << sC);
365
- let tT = select(
366
- bitcast<u32>(fU.z),
367
- bitcast<u32>(fU.w),
368
- sC >= 4u
362
+ eu = 0u;
363
+ if (xK != 0u) {
364
+ let fR = bvhBuffer[node + bufferOff + 1];
365
+ let ul = bitcast<u32>(kj.w) >> 24u;
366
+ var wG = 0u;
367
+ var kW = xK;
368
+ while (kW != 0u) {
369
+ let tW = lv(kW);
370
+ kW &= ~(1u << tW);
371
+ let vF = select(
372
+ bitcast<u32>(fR.z),
373
+ bitcast<u32>(fR.w),
374
+ tW >= 4u
369
375
  );
370
- let uB =
371
- (tT >> ((sC & 3u) * 8u)) & 0xffu;
372
- let kb = uB & 0x1fu;
373
- let wK = select(
374
- kb,
375
- kb ^ rn,
376
- kb >= 24u
376
+ let wn =
377
+ (vF >> ((tW & 3u) * 8u)) & 0xffu;
378
+ let kl = wn & 0x1fu;
379
+ let zm = select(
380
+ kl,
381
+ kl ^ su,
382
+ kl >= 24u
377
383
  );
378
- let wt = (uB >> 5u) & 0x7u;
379
- uO |= wt << wK;
384
+ let yR = (wn >> 5u) & 0x7u;
385
+ wG |= yR << zm;
380
386
  }
381
387
 
382
- lJ = bitcast<u32>(fU.x);
383
- eD = (uO & 0xff000000u) | sP;
384
- let pM = bitcast<u32>(fU.y);
385
- var pN = uO & 0x00ffffffu;
386
- while (pN != 0u) {
387
- let oO = oT(pN);
388
- pN &= ~(1u << oO);
388
+ mj = bitcast<u32>(fR.x);
389
+ eu = (wG & 0xff000000u) | ul;
390
+ let qE = bitcast<u32>(fR.y);
391
+ var qF = wG & 0x00ffffffu;
392
+ while (qF != 0u) {
393
+ let pI = pR(qF);
394
+ qF &= ~(1u << pI);
389
395
  let primitiveCount = 1;
390
- let primitiveOffset = bw + blasOffset
391
- + i32(pM + oO);
396
+ let primitiveOffset = bufferOff + blasOffset
397
+ + i32(qE + pI);
392
398
  ${intersectTriangles}
393
399
  }
394
400
  }
395
401
 
396
- if ((eD & 0xff000000u) != 0u) { continue; }
397
- if (qj >= 0) {
398
- let ro = tD[qj];
399
- lJ = ro.x;
400
- eD = ro.y;
401
- qj--;
402
+ if ((eu & 0xff000000u) != 0u) { continue; }
403
+ if (rk >= 0) {
404
+ let sw = ve[rk];
405
+ mj = sw.x;
406
+ eu = sw.y;
407
+ rk--;
402
408
  }
403
409
  else { break; }
404
410
  }
405
411
  }
406
412
  ` : ''}
407
413
 
408
- var eh = -1;
409
- if (he != 3u) {
410
- eh = 0;
414
+ var dX = -1;
415
+ if (hj != 3u) {
416
+ dX = 0;
411
417
 
412
- gJ[0] = wL;
418
+ gL[0] = zn;
413
419
  }
414
420
 
415
- while (eh >= 0) {
421
+ while (dX >= 0) {
416
422
 
417
- let node = gJ[eh];
418
- eh--;
423
+ let node = gL[dX];
424
+ dX--;
419
425
  var primitiveCount = 0;
420
426
  var primitiveOffset = 0;
421
427
 
422
428
  ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
423
- if (he == 2u) {
424
- let i = node + bw;
425
- let wP = bvhBuffer[i];
426
- let wQ = bvhBuffer[i + 1];
427
- let wR = bvhBuffer[i + 2];
428
- let wS = bvhBuffer[i + 3];
429
- primitiveCount = i32(bitcast<u32>(wR.w));
429
+ if (hj == 2u) {
430
+ let i = node + bufferOff;
431
+ let zr = bvhBuffer[i];
432
+ let zs = bvhBuffer[i + 1];
433
+ let zt = bvhBuffer[i + 2];
434
+ let zu = bvhBuffer[i + 3];
435
+ primitiveCount = i32(bitcast<u32>(zt.w));
430
436
  if (primitiveCount > 0) {
431
- primitiveOffset = bw + blasOffset
432
- + i32(bitcast<u32>(wS.w));
437
+ primitiveOffset = bufferOff + blasOffset
438
+ + i32(bitcast<u32>(zu.w));
433
439
  }
434
440
  else {
435
- let left = blasOffset + i32(bitcast<u32>(wP.w) * 4u);
436
- let right = blasOffset + i32(bitcast<u32>(wQ.w) * 4u);
437
- let pm = cU(
438
- o, wP.xyz, wQ.xyz, gr, tMax
441
+ let left = blasOffset + i32(bitcast<u32>(zr.w) * 4u);
442
+ let right = blasOffset + i32(bitcast<u32>(zs.w) * 4u);
443
+ let qj = bP(
444
+ o, zr.xyz, zs.xyz, invD, tMax
439
445
  );
440
- let oq = cU(
441
- o, wR.xyz, wS.xyz, gr, tMax
446
+ let pb = bP(
447
+ o, zt.xyz, zu.xyz, invD, tMax
442
448
  );
443
- if (pm > oq) {
444
- if (pm > 0.0) {
445
- eh++; gJ[eh] = left;
449
+ if (qj > pb) {
450
+ if (qj > 0.0) {
451
+ dX++; gL[dX] = left;
446
452
  }
447
- if (oq > 0.0) {
448
- eh++; gJ[eh] = right;
453
+ if (pb > 0.0) {
454
+ dX++; gL[dX] = right;
449
455
  }
450
456
  }
451
457
  else {
452
- if (oq > 0.0) {
453
- eh++; gJ[eh] = right;
458
+ if (pb > 0.0) {
459
+ dX++; gL[dX] = right;
454
460
  }
455
- if (pm > 0.0) {
456
- eh++; gJ[eh] = left;
461
+ if (qj > 0.0) {
462
+ dX++; gL[dX] = left;
457
463
  }
458
464
  }
459
465
  }
460
466
  }
461
467
  ` : ''}
462
468
  ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
463
- if (he == 1u) {
464
- let iw = bitcast<u32>(node);
465
- if ((iw & 0x80000000u) != 0u) {
466
- primitiveCount = i32((iw >> 23u) & 0xffu);
467
- primitiveOffset = bw + blasOffset
468
- + i32(iw & 0x007fffffu);
469
+ if (hj == 1u) {
470
+ let iE = bitcast<u32>(node);
471
+ if ((iE & 0x80000000u) != 0u) {
472
+ primitiveCount = i32((iE >> 23u) & 0xffu);
473
+ primitiveOffset = bufferOff + blasOffset
474
+ + i32(iE & 0x007fffffu);
469
475
  }
470
476
  else {
471
- let i = node + bw;
472
- let vJ = bvhBuffer[i];
473
- let sz = bvhBuffer[i + 1];
474
- let qR = bvhBuffer[i + 2];
475
- let oQ = bvhBuffer[i + 3];
476
- let nodeMin = vJ.xyz;
477
- let er = vec3f(vJ.w, sz.x, sz.y);
478
- let mT = array<u32, 4>(
479
- bitcast<u32>(sz.z), bitcast<u32>(sz.w),
480
- bitcast<u32>(qR.x), bitcast<u32>(qR.y)
477
+ let i = node + bufferOff;
478
+ let xS = bvhBuffer[i];
479
+ let tR = bvhBuffer[i + 1];
480
+ let rW = bvhBuffer[i + 2];
481
+ let pL = bvhBuffer[i + 3];
482
+ let nodeMin = xS.xyz;
483
+ let ej = vec3f(xS.w, tR.x, tR.y);
484
+ let nH = array<u32, 4>(
485
+ bitcast<u32>(tR.z), bitcast<u32>(tR.w),
486
+ bitcast<u32>(rW.x), bitcast<u32>(rW.y)
481
487
  );
482
488
 
483
489
 
484
- let negative = gr < vec3f(0.0);
485
- let wn = unpack4x8unorm(bitcast<u32>(select(qR.z, oQ.y, negative.x)));
486
- let xt = unpack4x8unorm(bitcast<u32>(select(oQ.y, qR.z, negative.x)));
487
- let wo = unpack4x8unorm(bitcast<u32>(select(qR.w, oQ.z, negative.y)));
488
- let xu = unpack4x8unorm(bitcast<u32>(select(oQ.z, qR.w, negative.y)));
489
- let wp = unpack4x8unorm(bitcast<u32>(select(oQ.x, oQ.w, negative.z)));
490
- let xv = unpack4x8unorm(bitcast<u32>(select(oQ.w, oQ.x, negative.z)));
491
- let padding = fk(gr, o);
492
- let nJ = max(
490
+ let negative = invD < vec3f(0.0);
491
+ let yK = unpack4x8unorm(bitcast<u32>(select(rW.z, pL.y, negative.x)));
492
+ let zV = unpack4x8unorm(bitcast<u32>(select(pL.y, rW.z, negative.x)));
493
+ let yL = unpack4x8unorm(bitcast<u32>(select(rW.w, pL.z, negative.y)));
494
+ let zW = unpack4x8unorm(bitcast<u32>(select(pL.z, rW.w, negative.y)));
495
+ let yM = unpack4x8unorm(bitcast<u32>(select(pL.x, pL.w, negative.z)));
496
+ let zX = unpack4x8unorm(bitcast<u32>(select(pL.w, pL.x, negative.z)));
497
+ let padding = ff(invD, o);
498
+ let ot = max(
493
499
  max(
494
- (nodeMin.x + wn * er.x - o.x) * gr.x - vec4f(padding.x),
495
- (nodeMin.y + wo * er.y - o.y) * gr.y - vec4f(padding.y)
500
+ (nodeMin.x + yK * ej.x - o.x) * invD.x - vec4f(padding.x),
501
+ (nodeMin.y + yL * ej.y - o.y) * invD.y - vec4f(padding.y)
496
502
  ),
497
- (nodeMin.z + wp * er.z - o.z) * gr.z - vec4f(padding.z)
503
+ (nodeMin.z + yM * ej.z - o.z) * invD.z - vec4f(padding.z)
498
504
  );
499
- let sY = min(
505
+ let uA = min(
500
506
  min(
501
- (nodeMin.x + xt * er.x - o.x) * gr.x + vec4f(padding.x),
502
- (nodeMin.y + xu * er.y - o.y) * gr.y + vec4f(padding.y)
507
+ (nodeMin.x + zV * ej.x - o.x) * invD.x + vec4f(padding.x),
508
+ (nodeMin.y + zW * ej.y - o.y) * invD.y + vec4f(padding.y)
503
509
  ),
504
- (nodeMin.z + xv * er.z - o.z) * gr.z + vec4f(padding.z)
510
+ (nodeMin.z + zX * ej.z - o.z) * invD.z + vec4f(padding.z)
505
511
  );
506
- var distance = select(sY, nJ, nJ > vec4f(0.0));
512
+ var distance = select(uA, ot, ot > vec4f(0.0));
507
513
  distance = select(
508
514
  distance,
509
515
  vec4f(-1.0),
510
- nJ > min(sY, vec4f(tMax))
516
+ ot > min(uA, vec4f(tMax))
511
517
  );
512
- var fq = array<f32, 4>(
518
+ var fi = array<f32, 4>(
513
519
  distance.x,
514
520
  distance.y,
515
521
  distance.z,
@@ -518,78 +524,78 @@ distance.w
518
524
 
519
525
 
520
526
  for (var order = 0; order < 4; order++) {
521
- var em = -1.0;
522
- var eB = -1;
527
+ var ee = -1.0;
528
+ var eq = -1;
523
529
  for (var child = 0; child < 4; child++) {
524
530
  if (
525
- mT[child] != 0u &&
526
- fq[child] > em
531
+ nH[child] != 0u &&
532
+ fi[child] > ee
527
533
  ) {
528
- em = fq[child];
529
- eB = child;
534
+ ee = fi[child];
535
+ eq = child;
530
536
  }
531
537
  }
532
- if (eB >= 0 && em > 0.0) {
533
- let oy = mT[eB];
534
- var ki = bitcast<i32>(oy);
535
- if ((oy & 0x80000000u) == 0u) {
536
- ki += blasOffset;
538
+ if (eq >= 0 && ee > 0.0) {
539
+ let ph = nH[eq];
540
+ var kv = bitcast<i32>(ph);
541
+ if ((ph & 0x80000000u) == 0u) {
542
+ kv += blasOffset;
537
543
  }
538
- eh++;
539
- gJ[eh] = ki;
540
- fq[eB] = -1.0;
544
+ dX++;
545
+ gL[dX] = kv;
546
+ fi[eq] = -1.0;
541
547
  }
542
548
  }
543
549
  }
544
550
  }
545
551
  ` : ''}
546
552
  ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
547
- if (he == 0u) {
548
- let i = node + bw;
553
+ if (hj == 0u) {
554
+ let i = node + bufferOff;
549
555
  let r1 = bvhBuffer[i];
550
- let bl = bitcast<i32>(r1.w);
556
+ let bh = bitcast<i32>(r1.w);
551
557
 
552
- if (bl >= 0) {
558
+ if (bh >= 0) {
553
559
  let left = node + 2;
554
- let right = bl + blasOffset;
555
- let d0 = cU(
560
+ let right = bh + blasOffset;
561
+ let d0 = bP(
556
562
  o,
557
- bvhBuffer[left + bw].xyz,
558
- bvhBuffer[left + 1 + bw].xyz,
559
- gr,
563
+ bvhBuffer[left + bufferOff].xyz,
564
+ bvhBuffer[left + 1 + bufferOff].xyz,
565
+ invD,
560
566
  tMax
561
567
  );
562
- let d1 = cU(
568
+ let d1 = bP(
563
569
  o,
564
- bvhBuffer[right + bw].xyz,
565
- bvhBuffer[right + 1 + bw].xyz,
566
- gr,
570
+ bvhBuffer[right + bufferOff].xyz,
571
+ bvhBuffer[right + 1 + bufferOff].xyz,
572
+ invD,
567
573
  tMax
568
574
  );
569
575
 
570
576
  if (d0 > d1) {
571
577
  if (d0 > 0.0) {
572
- eh++; gJ[eh] = left;
578
+ dX++; gL[dX] = left;
573
579
 
574
580
  }
575
581
  if (d1 > 0.0) {
576
- eh++; gJ[eh] = right;
582
+ dX++; gL[dX] = right;
577
583
 
578
584
  }
579
585
  }
580
586
  else {
581
587
  if (d1 > 0.0) {
582
- eh++; gJ[eh] = right;
588
+ dX++; gL[dX] = right;
583
589
 
584
590
  }
585
591
  if (d0 > 0.0) {
586
- eh++; gJ[eh] = left;
592
+ dX++; gL[dX] = left;
587
593
 
588
594
  }
589
595
  }
590
596
  }
591
597
  else {
592
- primitiveCount = -bl;
598
+ primitiveCount = -bh;
593
599
  primitiveOffset = i + 2;
594
600
  }
595
601
  }
@@ -608,31 +614,32 @@ ${intersectTriangles}
608
614
  // triangle tests without surface completion or any integrator/alpha sampling.
609
615
  export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
610
616
  return /* wgsl */ `
611
- struct rd {
617
+ struct sl {
612
618
  hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
613
619
  }
614
- fn vW(ray: Ray) -> rd {
615
- var result: rd;
620
+ fn yn(ray: Ray) -> sl {
621
+ var result: sl;
616
622
  result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
617
623
  if (rtUniform.isEmpty > 0) { return result; }
618
624
  let bounces = 0;
619
625
  let doubleSided = false;
620
- let jA = false;
621
- let fV = -1;
626
+ let jK = false;
627
+ let fT = -1;
628
+ let fS = -1;
622
629
  var tMax = RAY_MAX_DISTANCE;
623
- var eq: i32;
624
- var gY: vec3f;
630
+ var ei: i32;
631
+ var gZ: vec3f;
625
632
  ${getBVHTraverseCode(`
626
- result.hit = true; result.instance = bY; result.record = triangleIndex;
627
- result.t = tMax; result.barycentric = aC;
633
+ result.hit = true; result.instance = bK; result.record = triangleIndex;
634
+ result.t = tMax; result.barycentric = aw;
628
635
  `, false, false, 1, hasAnisotropyDirections)}
629
636
  return result;
630
637
  }
631
638
  `;
632
639
  }
633
- export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
640
+ export function createSceneIntersectionsWgsl({ perInstanceBounds = false, compactVertices = false, hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
634
641
  return /* wgsl */ `
635
- fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jA: bool) {
642
+ fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jK: bool) {
636
643
 
637
644
  (*si).hit = false;
638
645
 
@@ -641,31 +648,32 @@ return;
641
648
  }
642
649
 
643
650
  var tMax = RAY_MAX_DISTANCE;
644
- var eq: i32;
645
- var gY: vec3f;
651
+ var ei: i32;
652
+ var gZ: vec3f;
646
653
 
647
- var hK: vec3i;
648
- var mk: fP;
649
- var ap: i32;
650
- var fV: i32 = (*si).triangleIndex;
654
+ var hL: vec3i;
655
+ var mL: fL;
656
+ var am: i32;
657
+ var fT: i32 = (*si).triangleIndex;
658
+ let fS = (*si).instanceIndex;
651
659
 
652
660
  ${getBVHTraverseCode(`
653
661
  (*si).triangleIndex = triangleIndex;
654
- mk = tri;
655
- hK = index;
656
- ap = bY;
657
- `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
662
+ mL = tri;
663
+ hL = index;
664
+ am = bK;
665
+ `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
658
666
 
659
- ${closestHitHook} if (sj) {
660
- mV(
667
+ ${closestHitHook} if (tD) {
668
+ nJ(
661
669
  si,
662
- mk,
663
- aC,
664
- hK,
665
- bZ,
666
- ap,
667
- eL,
668
- fi,
670
+ mL,
671
+ aw,
672
+ hL,
673
+ bQ,
674
+ am,
675
+ hitNormal,
676
+ fe,
669
677
  -1
670
678
  );
671
679
  }
@@ -681,58 +689,59 @@ return;
681
689
 
682
690
  let bounces = 0;
683
691
  let doubleSided = true;
684
- let jA = false;
692
+ let jK = false;
685
693
  var tMax = maxDistance;
686
- var eq: i32;
687
- var gY: vec3f;
688
- var hK: vec3i;
689
- var mk: fP;
690
- var ap: i32;
691
- var fV: i32 = -1;
694
+ var ei: i32;
695
+ var gZ: vec3f;
696
+ var hL: vec3i;
697
+ var mL: fL;
698
+ var am: i32;
699
+ var fT: i32 = -1;
700
+ let fS = instanceIndex;
692
701
 
693
702
  ${getBVHTraverseCode(`
694
703
  (*si).triangleIndex = triangleIndex;
695
- mk = tri;
696
- hK = index;
697
- ap = bY;
704
+ mL = tri;
705
+ hL = index;
706
+ am = bK;
698
707
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
699
- if (bY != instanceIndex) {
708
+ if (bK != instanceIndex) {
700
709
  continue;
701
710
  }
702
- `)}
711
+ `, perInstanceBounds)}
703
712
 
704
- if (sj) {
705
- (*si).instanceIndex = ap;
706
- (*si).normal = eL;
707
- (*si).position = fi;
708
- (*si).materialIndex = i32(ah(bitcast<i32>(instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE}].z)).x);
709
- hH(
713
+ if (tD) {
714
+ (*si).instanceIndex = am;
715
+ (*si).normal = hitNormal;
716
+ (*si).position = fe;
717
+ (*si).materialIndex = i32(af(bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)).x);
718
+ hI(
710
719
  si,
711
- mk,
712
- aC,
713
- hK,
714
- bZ,
720
+ mL,
721
+ aw,
722
+ hL,
723
+ bQ,
715
724
  -1
716
725
  );
717
726
 
718
727
  let l2w = mat4x4<f32>(
719
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 5],
720
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 6],
721
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 7],
722
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 8]
728
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
729
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
730
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
731
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
723
732
  );
724
733
  let w2l = mat4x4<f32>(
725
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 1],
726
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 2],
727
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 3],
728
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 4]
734
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
735
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
736
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
737
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
729
738
  );
730
739
  let aH = transpose(mat3x3<f32>(
731
740
  w2l[0].xyz,
732
741
  w2l[1].xyz,
733
742
  w2l[2].xyz
734
743
  ));
735
- (*si).faceNormal = normalize(aH * eL);
744
+ (*si).faceNormal = normalize(aH * hitNormal);
736
745
  (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
737
746
  (*si).normal = normalize(aH * (*si).normal);
738
747
  ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
@@ -750,75 +759,76 @@ ${hasAnisotropyDirections ? /* wgsl */ `
750
759
  }
751
760
  }
752
761
 
753
- fn ${shadowName}(ray: Ray, lightDistance: f32, kn: i32) -> bool {
762
+ fn ${shadowName}(ray: Ray, lightDistance: f32, kx: i32, tm:i32) -> bool {
754
763
  if (rtUniform.isEmpty > 0) {
755
764
  return false;
756
765
  }
757
766
 
758
767
  let doubleSided = true;
759
- let rq = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
760
- var tMax = rq;
761
- var eq: i32;
762
- var gY: vec3f;
768
+ let sA = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
769
+ var tMax = sA;
770
+ var ei: i32;
771
+ var gZ: vec3f;
763
772
 
764
773
  let bounces = 1;
765
- var jA = false;
766
- var fV: i32 = kn;
774
+ var jK = false;
775
+ var fT: i32 = kx;
776
+ let fS = tm;
767
777
 
768
778
  ${getBVHTraverseCode(
769
779
  /*wgsl */ `
770
780
 
771
781
 
772
782
 
773
- var jS = true;
783
+ var kc = true;
774
784
 
775
- if (jS) {
785
+ if (kc) {
776
786
  if (HAS_ALPHA) {
777
- let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
778
- if (!oC(
787
+ let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
788
+ if (!po(
779
789
  materialIndex,
780
790
  index,
781
- aC,
782
- fi,
783
- eL
791
+ aw,
792
+ fe,
793
+ hitNormal${compactVertices ? ', triangleIndex' : ''}
784
794
  )) {
785
795
 
786
- tMax = rq;
787
- jS = false;
796
+ tMax = sA;
797
+ kc = false;
788
798
  }
789
799
  }
790
800
  }
791
- if (jS) {
801
+ if (kc) {
792
802
  return true;
793
803
  }
794
- `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
804
+ `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
795
805
 
796
806
  return false;
797
807
  }
798
808
 
799
809
  `;
800
810
  }
801
- export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
811
+ export default function getIntersectCode({ perInstanceBounds = false, compactVertices = false, hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
802
812
  return /*wgsl*/ `
803
813
 
804
814
 
805
815
 
806
816
 
807
817
 
808
- var<private> mK: array<i32, TLAS_STACK_SIZE>;
809
- var<private> gJ: array<i32, BLAS_STACK_SIZE>;
810
- ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> tD: array<vec2u, BLAS_STACK_SIZE>;` : ''}
818
+ var<private> nA: array<i32, TLAS_STACK_SIZE>;
819
+ var<private> gL: array<i32, BLAS_STACK_SIZE>;
820
+ ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> ve: array<vec2u, BLAS_STACK_SIZE>;` : ''}
811
821
 
812
822
  ${hasDisplacement ? displacementWgsl : ''}
813
823
  ${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
814
824
 
815
- struct fP {
825
+ struct fL {
816
826
  p0: vec3f,
817
827
  p1: vec3f,
818
828
  p2: vec3f,
819
829
  };
820
830
 
821
- fn hL(rad: f32, pos: vec3f, r: Ray) -> f32 {
831
+ fn hM(rad: f32, pos: vec3f, r: Ray) -> f32 {
822
832
  let op: vec3f = pos - r.o;
823
833
  let eps: f32 = 0.001;
824
834
  let b: f32 = dot(op, r.d);
@@ -841,7 +851,7 @@ return t2;
841
851
  return INF;
842
852
  }
843
853
 
844
- fn og(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
854
+ fn oU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
845
855
  let dt: f32 = dot(r.d, n);
846
856
  let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
847
857
 
@@ -861,14 +871,16 @@ return INF;
861
871
  }
862
872
 
863
873
  fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
864
- let ak = distance(origin, center);
865
- if (ak <= radius) { return INV4PI; }
866
- let jV = min(1.0, radius * radius / (ak * ak));
867
- let cosThetaMax = sqrt(max(0.0, 1.0 - jV));
868
- return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
874
+ let ao = distance(origin, center);
875
+ if (ao <= radius) { return INV4PI; }
876
+ let sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
877
+ let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
878
+
879
+ let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
880
+ return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
869
881
  }
870
882
 
871
- fn nr(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
883
+ fn iB(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
872
884
 
873
885
 
874
886
  var d: f32 = INF;
@@ -880,9 +892,9 @@ var d: f32 = INF;
880
892
  (*lightSample).isDelta = false;
881
893
  var u = light.u;
882
894
  var v = light.v;
883
- var ec = i32(light.litType);
895
+ var dU = i32(light.litType);
884
896
 
885
- if (HAS_SCENE_RECT_LIGHT && ec == RECT_LIGHT) {
897
+ if (HAS_SCENE_RECT_LIGHT && dU == RECT_LIGHT) {
886
898
 
887
899
  var pos = light.position - u * 0.5 - v * 0.5;
888
900
  var normal = normalize(cross(u, v));
@@ -890,18 +902,18 @@ if (dot(normal, r.d) > 0.0) {
890
902
  return INF;
891
903
  }
892
904
 
893
- d = og(pos, u, v, normal, r);
905
+ d = oU(pos, u, v, normal, r);
894
906
  if (d < 0.0) {
895
907
  d = INF;
896
908
  }
897
909
  else {
898
- var ci: f32 = dot(-r.d, normal);
910
+ var cv: f32 = dot(-r.d, normal);
899
911
  let spread = light.radiusOrSpread;
900
- if (ci >= cos(spread * PI / 2.0)) {
912
+ if (cv >= cos(spread * PI / 2.0)) {
901
913
  (*lightSample).direction = r.d;
902
914
  (*lightSample).normal = normal;
903
915
  (*lightSample).dist = d;
904
- (*lightSample).pdf = (d * d) / (light.area * ci);
916
+ (*lightSample).pdf = (d * d) / (light.area * cv);
905
917
  (*lightSample).emission = light.emission;
906
918
  (*lightSample).isDelta = false;
907
919
  }
@@ -911,12 +923,12 @@ d = INF;
911
923
  }
912
924
  }
913
925
 
914
- else if (HAS_SCENE_SPHERE_LIGHT && ec == SPHERE_LIGHT) {
926
+ else if (HAS_SCENE_SPHERE_LIGHT && dU == SPHERE_LIGHT) {
915
927
  if (light.radiusOrSpread <= 0.0) {
916
- let kT = light.position - r.o;
917
- let projection = dot(kT, r.d);
918
- let bk = kT - projection * r.d;
919
- if (projection <= EPS || dot(bk, bk) > 1e-8) {
928
+ let lj = light.position - r.o;
929
+ let projection = dot(lj, r.d);
930
+ let bf = lj - projection * r.d;
931
+ if (projection <= EPS || dot(bf, bf) > 1e-8) {
920
932
  return INF;
921
933
  }
922
934
  d = projection;
@@ -927,7 +939,7 @@ d = projection;
927
939
  (*lightSample).isDelta = true;
928
940
  }
929
941
  else {
930
- d = hL(light.radiusOrSpread, light.position, r);
942
+ d = hM(light.radiusOrSpread, light.position, r);
931
943
  (*lightSample).isDelta = false;
932
944
  if (d > 0.0 && d != INF) {
933
945
  (*lightSample).direction = r.d;
@@ -956,12 +968,12 @@ light.radiusOrSpread <= 0.0
956
968
  }
957
969
  }
958
970
 
959
- else if (HAS_SCENE_SPOT_LIGHT && ec == SPOT_LIGHT) {
971
+ else if (HAS_SCENE_SPOT_LIGHT && dU == SPOT_LIGHT) {
960
972
  if (light.radiusOrSpread <= 0.0) {
961
- let kT = light.position - r.o;
962
- let projection = dot(kT, r.d);
963
- let bk = kT - projection * r.d;
964
- if (projection <= EPS || dot(bk, bk) > 1e-8) {
973
+ let lj = light.position - r.o;
974
+ let projection = dot(lj, r.d);
975
+ let bf = lj - projection * r.d;
976
+ if (projection <= EPS || dot(bf, bf) > 1e-8) {
965
977
  return INF;
966
978
  }
967
979
  d = projection;
@@ -972,13 +984,13 @@ d = projection;
972
984
  (*lightSample).isDelta = true;
973
985
  }
974
986
  else {
975
- d = hL(light.radiusOrSpread, light.position, r);
987
+ d = hM(light.radiusOrSpread, light.position, r);
976
988
  (*lightSample).isDelta = false;
977
989
  }
978
990
  if (d != INF) {
979
- let wW = r.o + d * r.d;
980
- let nv = bP(light, normalize(r.o - wW));
981
- if (nv <= 0.0) { return INF; }
991
+ let zA = r.o + d * r.d;
992
+ let od = evaluateSpotEmissionMultiplier(light, normalize(r.o - zA));
993
+ if (od <= 0.0) { return INF; }
982
994
  if (light.radiusOrSpread > 0.0) {
983
995
  (*lightSample).direction = r.d;
984
996
  (*lightSample).dist = d;
@@ -987,7 +999,7 @@ r.o + r.d * d - light.position
987
999
  );
988
1000
  (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
989
1001
  }
990
- (*lightSample).emission = light.emission * nv * select(
1002
+ (*lightSample).emission = light.emission * od * select(
991
1003
  1.0,
992
1004
  1.0 / max(d * d, 1e-8),
993
1005
  light.radiusOrSpread <= 0.0
@@ -995,7 +1007,7 @@ light.radiusOrSpread <= 0.0
995
1007
  }
996
1008
  }
997
1009
 
998
- else if (ec != RECT_LIGHT && ec != SPHERE_LIGHT && ec != SPOT_LIGHT) {
1010
+ else if (dU != RECT_LIGHT && dU != SPHERE_LIGHT && dU != SPOT_LIGHT) {
999
1011
 
1000
1012
  d = INF;
1001
1013
  }
@@ -1003,111 +1015,113 @@ d = INF;
1003
1015
  return d;
1004
1016
  }
1005
1017
 
1006
- fn fF(m0: vec3i, m1: vec3i, m2: vec3i, eU: vec3f) -> i32 {
1007
- let m00 = ah(m0.x);
1008
- let m01 = ah(m0.y);
1009
- let m02 = ah(m0.z);
1010
- let m10 = ah(m1.x);
1011
- let m11 = ah(m1.y);
1012
- let m12 = ah(m1.z);
1013
- let m20 = ah(m2.x);
1014
- let m21 = ah(m2.y);
1015
- let m22 = ah(m2.z);
1016
- var w00 = m00.y * eU.x;
1017
- var w01 = m01.y * eU.x;
1018
- var w02 = m02.y * eU.x;
1019
- var w10 = m10.y * eU.y;
1020
- var w11 = m11.y * eU.y;
1021
- var w12 = m12.y * eU.y;
1022
- var w20 = m20.y * eU.z;
1023
- var w21 = m21.y * eU.z;
1024
- var w22 = m22.y * eU.z;
1025
-
1026
- var hy = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
1027
-
1028
- w00 = w00 / hy;
1029
- w01 = w01 / hy + w00;
1030
- w02 = w02 / hy + w01;
1031
- w10 = w10 / hy + w02;
1032
- w11 = w11 / hy + w10;
1033
- w12 = w12 / hy + w11;
1034
- w20 = w20 / hy + w12;
1035
- w21 = w21 / hy + w20;
1036
- w22 = w22 / hy + w21;
1037
-
1038
- let rand = eC(0u);
1039
- var oh: f32;
1018
+ fn fv(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
1019
+ let m00 = af(m0.x);
1020
+ let m01 = af(m0.y);
1021
+ let m02 = af(m0.z);
1022
+ let m10 = af(m1.x);
1023
+ let m11 = af(m1.y);
1024
+ let m12 = af(m1.z);
1025
+ let m20 = af(m2.x);
1026
+ let m21 = af(m2.y);
1027
+ let m22 = af(m2.z);
1028
+ var w00 = m00.y * bary.x;
1029
+ var w01 = m01.y * bary.x;
1030
+ var w02 = m02.y * bary.x;
1031
+ var w10 = m10.y * bary.y;
1032
+ var w11 = m11.y * bary.y;
1033
+ var w12 = m12.y * bary.y;
1034
+ var w20 = m20.y * bary.z;
1035
+ var w21 = m21.y * bary.z;
1036
+ var w22 = m22.y * bary.z;
1037
+
1038
+ var hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
1039
+
1040
+ w00 = w00 / hB;
1041
+ w01 = w01 / hB + w00;
1042
+ w02 = w02 / hB + w01;
1043
+ w10 = w10 / hB + w02;
1044
+ w11 = w11 / hB + w10;
1045
+ w12 = w12 / hB + w11;
1046
+ w20 = w20 / hB + w12;
1047
+ w21 = w21 / hB + w20;
1048
+ w22 = w22 / hB + w21;
1049
+
1050
+ let rand = cm(0u);
1051
+ var oV: f32;
1040
1052
  if (rand < w00) {
1041
- oh = m00.x;
1053
+ oV = m00.x;
1042
1054
  } else if (rand < w01) {
1043
- oh = m01.x;
1055
+ oV = m01.x;
1044
1056
  } else if (rand < w02) {
1045
- oh = m02.x;
1057
+ oV = m02.x;
1046
1058
  } else if (rand < w10) {
1047
- oh = m10.x;
1059
+ oV = m10.x;
1048
1060
  } else if (rand < w11) {
1049
- oh = m11.x;
1061
+ oV = m11.x;
1050
1062
  } else if (rand < w12) {
1051
- oh = m12.x;
1063
+ oV = m12.x;
1052
1064
  } else if (rand < w20) {
1053
- oh = m20.x;
1065
+ oV = m20.x;
1054
1066
  } else if (rand < w21) {
1055
- oh = m21.x;
1067
+ oV = m21.x;
1056
1068
  } else {
1057
- oh = m22.x;
1069
+ oV = m22.x;
1058
1070
  }
1059
- return i32(oh);
1071
+ return i32(oV);
1060
1072
  }
1061
1073
 
1062
- fn mF(
1063
- pW: i32,
1074
+ fn nl(
1075
+ lw: i32,
1064
1076
  index: vec3i,
1065
- eU: vec3f
1077
+ bary: vec3f${compactVertices ? ', record: i32' : ''}
1066
1078
  ) -> i32 {
1079
+ ${compactVertices ? /* wgsl */ `return pJ(lw, record);` : /* wgsl */ `
1067
1080
  let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1068
1081
  let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1069
1082
  let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1070
1083
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
1071
- return fF(m0, m1, m2, eU);
1084
+ return fv(m0, m1, m2, bary);
1072
1085
  }
1073
- return pW;
1086
+ return lw;
1087
+ `}
1074
1088
  }
1075
1089
 
1076
1090
 
1077
1091
 
1078
1092
  ${hasAnisotropyDirections ? /* wgsl */ `
1079
- fn eP(normal: vec3f, dp1: vec3f, dp2: vec3f, oW: vec2f, oX: vec2f, input: vec4f) -> mat2x3f {
1080
- let determinant = oW.x * oX.y - oW.y * oX.x;
1093
+ fn eI(normal: vec3f, dp1: vec3f, dp2: vec3f, pU: vec2f, pV: vec2f, input: vec4f) -> mat2x3f {
1094
+ let determinant = pU.x * pV.y - pU.y * pV.x;
1081
1095
  var t = input.xyz;
1082
1096
  var b = vec3f(0.0);
1083
1097
 
1084
1098
  var sign = select(input.w, 0.0, abs(input.w) > 1.5);
1085
1099
  if (abs(determinant) > 1e-12) {
1086
- let dt = (dp1 * oX.y - dp2 * oW.y) / determinant;
1087
- let db = (dp2 * oW.x - dp1 * oX.x) / determinant;
1100
+ let dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
1101
+ let db = (dp2 * pU.x - dp1 * pV.x) / determinant;
1088
1102
  if (dot(t, t) < 1e-8) { t = dt; }
1089
1103
  if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
1090
1104
  }
1091
1105
  t -= normal * dot(normal, t);
1092
1106
  if (dot(t, t) < 1e-8) {
1093
- let iI = select(-1.0, 1.0, normal.z >= 0.0);
1094
- let cL = -1.0 / (iI + normal.z);
1095
- let xy = normal.x * normal.y * cL;
1096
- t = vec3f(1.0 + iI * normal.x * normal.x * cL, iI * xy, -iI * normal.x);
1097
- b = vec3f(xy, iI + normal.y * normal.y * cL, -normal.y);
1107
+ let iP = select(-1.0, 1.0, normal.z >= 0.0);
1108
+ let cA = -1.0 / (iP + normal.z);
1109
+ let xy = normal.x * normal.y * cA;
1110
+ t = vec3f(1.0 + iP * normal.x * normal.x * cA, iP * xy, -iP * normal.x);
1111
+ b = vec3f(xy, iP + normal.y * normal.y * cA, -normal.y);
1098
1112
  }
1099
1113
  else { t = normalize(t); b = normalize(cross(normal, t)); }
1100
1114
  return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
1101
1115
  }
1102
1116
 
1103
1117
  ` : /* wgsl */ ``}
1104
- fn hH(
1118
+ fn hI(
1105
1119
  si: ptr<function, SurfaceInteraction>,
1106
- tri: fP,
1107
- eU: vec3f,
1120
+ tri: fL,
1121
+ bary: vec3f,
1108
1122
  index: vec3i,
1109
- bZ: bool,
1110
- fM: i32
1123
+ bQ: bool,
1124
+ fH: i32
1111
1125
  ) {
1112
1126
  (*si).hit = true;
1113
1127
 
@@ -1119,26 +1133,26 @@ let i1 = index.y;
1119
1133
  let i2 = index.z;
1120
1134
  (*si).vertexColor = vec3f(1.0);
1121
1135
  if (USE_VERTEX_COLOR) {
1122
- (*si).vertexColor = eU.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
1123
- + eU.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
1124
- + eU.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
1136
+ (*si).vertexColor = bary.x * vertexColor(i0)
1137
+ + bary.y * vertexColor(i1)
1138
+ + bary.z * vertexColor(i2);
1125
1139
  }
1126
- let pU = uvProjection == ${uvProjectionConstants.spherical};
1140
+ let qP = uvProjection == ${uvProjectionConstants.spherical};
1127
1141
 
1128
1142
  var normal: vec3f = (*si).normal;
1129
- var hq: vec3f;
1143
+ var hu: vec3f;
1130
1144
  var n0 = vec3f(0.0);
1131
1145
  var n1 = vec3f(0.0);
1132
1146
  var n2 = vec3f(0.0);
1133
1147
 
1134
1148
 
1135
- if (!bZ || pU) {
1136
- n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1137
- n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1138
- n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1139
- hq = normalize(eU.x * n0 + eU.y * n1 + eU.z * n2);
1140
- if (!bZ) {
1141
- normal = hq;
1149
+ if (!bQ || qP) {
1150
+ n0 = vertexNormal(i0);
1151
+ n1 = vertexNormal(i1);
1152
+ n2 = vertexNormal(i2);
1153
+ hu = normalize(bary.x * n0 + bary.y * n1 + bary.z * n2);
1154
+ if (!bQ) {
1155
+ normal = hu;
1142
1156
  }
1143
1157
  }
1144
1158
 
@@ -1146,48 +1160,48 @@ var uv: vec2f;
1146
1160
  var uv0: vec2f;
1147
1161
  var uv1: vec2f;
1148
1162
  var uv2: vec2f;
1149
- var dj = vec2f(0.0);
1163
+ var cT = vec2f(0.0);
1150
1164
  if (USE_UV) {
1151
- uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
1152
- uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
1153
- uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
1154
- uv = eU.x * uv0 + eU.y * uv1 + eU.z * uv2;
1165
+ uv0 = hd(i0);
1166
+ uv1 = hd(i1);
1167
+ uv2 = hd(i2);
1168
+ uv = bary.x * uv0 + bary.y * uv1 + bary.z * uv2;
1155
1169
  if (USE_UV1) {
1156
- let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1157
- let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1158
- let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1159
- dj = eU.x * secondaryUv0
1160
- + eU.y * secondaryUv1
1161
- + eU.z * secondaryUv2;
1170
+ let secondaryUv0 = hV(i0);
1171
+ let secondaryUv1 = hV(i1);
1172
+ let secondaryUv2 = hV(i2);
1173
+ cT = bary.x * secondaryUv0
1174
+ + bary.y * secondaryUv1
1175
+ + bary.z * secondaryUv2;
1162
1176
  }
1163
1177
  }
1164
1178
 
1165
1179
  if (USE_TANGENT) {
1166
- let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1167
- let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1168
- let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1169
- (*si).tangent = normalize(eU.x * t0 + eU.y * t1 + eU.z * t2);
1180
+ let t0 = gC(i0).xyz;
1181
+ let t1 = gC(i1).xyz;
1182
+ let t2 = gC(i2).xyz;
1183
+ (*si).tangent = normalize(bary.x * t0 + bary.y * t1 + bary.z * t2);
1170
1184
  }
1171
1185
 
1172
- if (fM >= 0) {
1173
- (*si).materialIndex = fM;
1186
+ if (fH >= 0) {
1187
+ (*si).materialIndex = fH;
1174
1188
  }
1175
1189
  else {
1176
- (*si).materialIndex = mF(
1190
+ (*si).materialIndex = nl(
1177
1191
  (*si).materialIndex,
1178
1192
  index,
1179
- eU
1193
+ bary${compactVertices ? ', (*si).triangleIndex' : ''}
1180
1194
  );
1181
1195
  }
1182
1196
 
1183
1197
  if (uvProjection > 0) {
1184
1198
 
1185
- uv = gU(uvProjection, (*si).position, select(normal, hq, pU));
1186
- dj = uv;
1199
+ uv = gW(uvProjection, (*si).position, select(normal, hu, qP));
1200
+ cT = uv;
1187
1201
  }
1188
1202
 
1189
1203
  uv = uv * material.uvScale;
1190
- dj = dj * material.uvScale;
1204
+ cT = cT * material.uvScale;
1191
1205
 
1192
1206
 
1193
1207
  if (uvProjection == ${uvProjectionConstants.triplanar}) {
@@ -1200,41 +1214,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
1200
1214
  if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
1201
1215
  let dp1 = tri.p0 - tri.p2;
1202
1216
  let dp2 = tri.p1 - tri.p2;
1203
- var aX = vec4f(0.0);
1217
+ var aT = vec4f(0.0);
1204
1218
  if (USE_TANGENT) {
1205
- aX = eU.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
1206
- + eU.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
1207
- + eU.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1208
- }
1209
- let fc = eP(normal, dp1, dp2, uv0-uv2, uv1-uv2, aX);
1210
- (*si).geometryTangent = fc[0];
1211
- (*si).geometryBitangent = fc[1];
1212
- var gm = fc;
1219
+ aT = bary.x * gC(i0)
1220
+ + bary.y * gC(i1)
1221
+ + bary.z * gC(i2);
1222
+ }
1223
+ let eV = eI(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
1224
+ (*si).geometryTangent = eV[0];
1225
+ (*si).geometryBitangent = eV[1];
1226
+ var gp = eV;
1213
1227
  if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
1214
- let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1215
- let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1216
- let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1217
- gm = eP(normal, dp1, dp2, a-c, b-c, select(aX, vec4f(0.0), aX.w == 0.0));
1228
+ let a = hV(i0);
1229
+ let b = hV(i1);
1230
+ let c = hV(i2);
1231
+ gp = eI(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
1218
1232
  }
1219
- (*si).directionTangent = gm[0];
1220
- (*si).directionBitangent = gm[1];
1233
+ (*si).directionTangent = gp[0];
1234
+ (*si).directionBitangent = gp[1];
1221
1235
  ${hasCoatNormals ? /* wgsl */ `
1222
1236
  if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1223
- let lg = i32(directionMaterial.coatNormalMapIndex);
1224
- var mU = fc;
1225
- if (USE_UV1 && mapInfo[lg + NUM_MAPS * 2].x > 0.5) {
1226
- let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1227
- let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1228
- let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1229
- mU = eP(normal, dp1, dp2, a-c, b-c,
1230
- select(aX, vec4f(0.0), aX.w == 0.0));
1237
+ let lI = i32(directionMaterial.coatNormalMapIndex);
1238
+ var nI = eV;
1239
+ if (USE_UV1 && mapInfo[lI + NUM_MAPS * 2].x > 0.5) {
1240
+ let a = hV(i0);
1241
+ let b = hV(i1);
1242
+ let c = hV(i2);
1243
+ nI = eI(normal, dp1, dp2, a-c, b-c,
1244
+ select(aT, vec4f(0.0), aT.w == 0.0));
1231
1245
  }
1232
1246
 
1233
1247
 
1234
- let decoded = sampleMap(lg, getMapUvSet(lg, uv,
1235
- select(dj, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1236
- let mapped = mU[0] * decoded.x * directionMaterial.coatNormalScale.x
1237
- + mU[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1248
+ let decoded = sampleMap(lI, getMapUvSet(lI, uv,
1249
+ select(cT, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1250
+ let mapped = nI[0] * decoded.x * directionMaterial.coatNormalScale.x
1251
+ + nI[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1238
1252
  if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1239
1253
  }
1240
1254
  ` : ''}
@@ -1244,19 +1258,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1244
1258
  (*si).normal = normal;
1245
1259
  (*si).vertexNormal = normal;
1246
1260
  (*si).shadowOffset = vec3f(0.0);
1247
- if (!bZ) {
1261
+ if (!bQ) {
1248
1262
 
1249
1263
 
1250
1264
 
1251
1265
  let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1252
- let kR = eU.x * n0 + eU.y * n1 + eU.z * n2;
1266
+ let le = bary.x * n0 + bary.y * n1 + bary.z * n2;
1253
1267
  let a = dot(n2 - n0, tri.p0 - tri.p2);
1254
1268
  let b = dot(n2 - n1, tri.p1 - tri.p2);
1255
1269
  let c = dot(n1 - n0, tri.p1 - tri.p0);
1256
- var h = a * eU.x * (eU.x - 1.0)
1257
- + (a + b + c) * eU.x * eU.y
1258
- + b * eU.y * (eU.y - 1.0);
1259
- if (dot(kR, geometricNormal) > 0.0) {
1270
+ var h = a * bary.x * (bary.x - 1.0)
1271
+ + (a + b + c) * bary.x * bary.y
1272
+ + b * bary.y * (bary.y - 1.0);
1273
+ if (dot(le, geometricNormal) > 0.0) {
1260
1274
  var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1261
1275
  var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1262
1276
  var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -1274,22 +1288,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1274
1288
  h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1275
1289
  h = min(-min(min(h0, h1), h2), h * 0.5);
1276
1290
  }
1277
- (*si).shadowOffset = kR * h;
1291
+ (*si).shadowOffset = le * h;
1278
1292
  }
1279
1293
  (*si).uv = uv;
1280
- (*si).uv1 = dj;
1294
+ (*si).uv1 = cT;
1281
1295
  if (USE_NORMAL_MAPS) {
1282
1296
  let dp1 = tri.p0 - tri.p2;
1283
1297
  let dp2 = tri.p1 - tri.p2;
1284
- let oW = uv0 - uv2;
1285
- let oX = uv1 - uv2;
1286
- (*si).normal = pd(
1287
- (*si).materialIndex, uv, normal, dp1, dp2, oW, oX
1298
+ let pU = uv0 - uv2;
1299
+ let pV = uv1 - uv2;
1300
+ (*si).normal = qa(
1301
+ (*si).materialIndex, uv, normal, dp1, dp2, pU, pV
1288
1302
  );
1289
1303
  }
1290
1304
  }
1291
1305
 
1292
- struct eK {
1306
+ struct eF {
1293
1307
  t: f32,
1294
1308
  barycentric: vec3f,
1295
1309
  };
@@ -1298,8 +1312,8 @@ barycentric: vec3f,
1298
1312
 
1299
1313
 
1300
1314
 
1301
- fn ga(o: vec3f, d: vec3f, tri: fP, eq: i32, gY: vec3f, tMax: f32) -> eK {
1302
- var ti: eK;
1315
+ fn fY(o: vec3f, d: vec3f, tri: fL, ei: i32, gZ: vec3f, tMax: f32) -> eF {
1316
+ var ti: eF;
1303
1317
 
1304
1318
 
1305
1319
  var p0t = tri.p0 - o;
@@ -1307,11 +1321,11 @@ var p1t = tri.p1 - o;
1307
1321
  var p2t = tri.p2 - o;
1308
1322
 
1309
1323
 
1310
- if (eq == 0) {
1324
+ if (ei == 0) {
1311
1325
  p0t = p0t.yzx;
1312
1326
  p1t = p1t.yzx;
1313
1327
  p2t = p2t.yzx;
1314
- } else if (eq == 1) {
1328
+ } else if (ei == 1) {
1315
1329
  p0t = p0t.zxy;
1316
1330
  p1t = p1t.zxy;
1317
1331
  p2t = p2t.zxy;
@@ -1319,9 +1333,9 @@ p2t = p2t.zxy;
1319
1333
 
1320
1334
 
1321
1335
 
1322
- p0t = vec3f(p0t.xy + gY.xy * p0t.z, p0t.z);
1323
- p1t = vec3f(p1t.xy + gY.xy * p1t.z, p1t.z);
1324
- p2t = vec3f(p2t.xy + gY.xy * p2t.z, p2t.z);
1336
+ p0t = vec3f(p0t.xy + gZ.xy * p0t.z, p0t.z);
1337
+ p1t = vec3f(p1t.xy + gZ.xy * p1t.z, p1t.z);
1338
+ p2t = vec3f(p2t.xy + gZ.xy * p2t.z, p2t.z);
1325
1339
 
1326
1340
 
1327
1341
  var e = vec3f(
@@ -1333,9 +1347,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
1333
1347
  if (DEPTH_QUERY_MODE) {
1334
1348
 
1335
1349
 
1336
- let sF = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1350
+ let ua = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1337
1351
  + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1338
- e = select(e, vec3f(0.0), abs(e) <= sF * 1e-6);
1352
+ e = select(e, vec3f(0.0), abs(e) <= ua * 1e-6);
1339
1353
  }
1340
1354
 
1341
1355
 
@@ -1346,19 +1360,19 @@ return ti;
1346
1360
  let det = e.x + e.y + e.z;
1347
1361
  if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1348
1362
 
1349
- p0t.z *= gY.z;
1350
- p1t.z *= gY.z;
1351
- p2t.z *= gY.z;
1352
- let sw = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1363
+ p0t.z *= gZ.z;
1364
+ p1t.z *= gZ.z;
1365
+ p2t.z *= gZ.z;
1366
+ let tQ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1353
1367
 
1354
1368
 
1355
- if (abs(sw) > abs(tMax * det)) {
1369
+ if (abs(tQ) > abs(tMax * det)) {
1356
1370
  return ti;
1357
1371
  }
1358
1372
 
1359
- let tN = 1. / det;
1360
- ti.t = sw * tN;
1361
- ti.barycentric = e * tN;
1373
+ let vu = 1. / det;
1374
+ ti.t = tQ * vu;
1375
+ ti.barycentric = e * vu;
1362
1376
 
1363
1377
  return ti;
1364
1378
  }
@@ -1368,26 +1382,26 @@ return ti;
1368
1382
 
1369
1383
  override DEPTH_QUERY_MODE: bool = false;
1370
1384
 
1371
- fn fo(d: vec3f) -> vec3f {
1385
+ fn traversalInverse(d: vec3f) -> vec3f {
1372
1386
  if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1373
1387
  return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1374
1388
  }
1375
1389
 
1376
- fn fk(gr: vec3f, o: vec3f) -> vec3f {
1390
+ fn ff(invD: vec3f, o: vec3f) -> vec3f {
1377
1391
  if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1378
- return abs(gr) * max(vec3f(1.0), abs(o)) * 1e-6;
1392
+ return abs(invD) * max(vec3f(1.0), abs(o)) * 1e-6;
1379
1393
  }
1380
1394
 
1381
1395
 
1382
1396
 
1383
- fn cU(o: vec3f, xq: vec3f, xp: vec3f, gr: vec3f, tMax: f32) -> f32 {
1384
- let wG = (xq - o) * gr;
1385
- let wI = (xp - o) * gr;
1386
- let padding = fk(gr, o);
1387
- let nJ = min(wG, wI) - padding;
1388
- let sY = max(wG, wI) + padding;
1389
- let t0 = max(nJ.x, max(nJ.y, nJ.z));
1390
- let t1 = min(sY.x, min(sY.y, sY.z));
1397
+ fn bP(o: vec3f, zT: vec3f, zS: vec3f, invD: vec3f, tMax: f32) -> f32 {
1398
+ let zi = (zT - o) * invD;
1399
+ let zj = (zS - o) * invD;
1400
+ let padding = ff(invD, o);
1401
+ let ot = min(zi, zj) - padding;
1402
+ let uA = max(zi, zj) + padding;
1403
+ let t0 = max(ot.x, max(ot.y, ot.z));
1404
+ let t1 = min(uA.x, min(uA.y, uA.z));
1391
1405
  return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1392
1406
  }
1393
1407
 
@@ -1395,58 +1409,58 @@ fn maxDimension(v: vec3f) -> i32 {
1395
1409
  return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1396
1410
  }
1397
1411
 
1398
- fn nk(d: vec3f, eq: i32) -> vec3f {
1412
+ fn nV(d: vec3f, ei: i32) -> vec3f {
1399
1413
 
1400
1414
 
1401
- if (eq == 0) {
1415
+ if (ei == 0) {
1402
1416
  return vec3f(-d.y, -d.z, 1.0) / d.x;
1403
- } else if (eq == 1) {
1417
+ } else if (ei == 1) {
1404
1418
  return vec3f(-d.z, -d.x, 1.0) / d.y;
1405
1419
  } else {
1406
1420
  return vec3f(-d.x, -d.y, 1.0) / d.z;
1407
1421
  }
1408
1422
  }
1409
1423
 
1410
- fn mV(
1424
+ fn nJ(
1411
1425
  si: ptr<function, SurfaceInteraction>,
1412
- mk: fP,
1413
- aC: vec3f,
1414
- hK: vec3i,
1415
- bZ: bool,
1416
- ap: i32,
1417
- eL: vec3f,
1418
- fi: vec3f,
1419
- fM: i32
1426
+ mL: fL,
1427
+ aw: vec3f,
1428
+ hL: vec3i,
1429
+ bQ: bool,
1430
+ am: i32,
1431
+ hitNormal: vec3f,
1432
+ fe: vec3f,
1433
+ fH: i32
1420
1434
  ) {
1421
- (*si).instanceIndex = ap;
1422
- (*si).barycentrics = aC.xy;
1423
- (*si).normal = eL;
1424
- (*si).position = fi;
1425
- (*si).materialIndex = i32(ah(
1426
- bitcast<i32>(instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE}].z)
1435
+ (*si).instanceIndex = am;
1436
+ (*si).barycentrics = aw.xy;
1437
+ (*si).normal = hitNormal;
1438
+ (*si).position = fe;
1439
+ (*si).materialIndex = i32(af(
1440
+ bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)
1427
1441
  ).x);
1428
1442
 
1429
1443
 
1430
- hH(
1444
+ hI(
1431
1445
  si,
1432
- mk,
1433
- aC,
1434
- hK,
1435
- bZ,
1436
- fM
1446
+ mL,
1447
+ aw,
1448
+ hL,
1449
+ bQ,
1450
+ fH
1437
1451
  );
1438
1452
 
1439
1453
  let l2w = mat4x4<f32>(
1440
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 5],
1441
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 6],
1442
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 7],
1443
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 8]
1454
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
1455
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
1456
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
1457
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
1444
1458
  );
1445
1459
  let w2l = mat4x4<f32>(
1446
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 1],
1447
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 2],
1448
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 3],
1449
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 4]
1460
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
1461
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
1462
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
1463
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
1450
1464
  );
1451
1465
  let aH = transpose(mat3x3<f32>(
1452
1466
  w2l[0].xyz,
@@ -1454,7 +1468,7 @@ w2l[1].xyz,
1454
1468
  w2l[2].xyz
1455
1469
  ));
1456
1470
 
1457
- (*si).faceNormal = normalize(aH * eL);
1471
+ (*si).faceNormal = normalize(aH * hitNormal);
1458
1472
  (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
1459
1473
  (*si).normal = normalize(aH * (*si).normal);
1460
1474
  ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
@@ -1472,10 +1486,10 @@ ${hasAnisotropyDirections ? /* wgsl */ `
1472
1486
  }
1473
1487
 
1474
1488
 
1475
- ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
1489
+ ${createIntersectionAlphaWgsl(hasAnisotropyDirections, compactVertices)}
1476
1490
 
1477
1491
 
1478
1492
 
1479
- ${sceneIntersections || createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
1493
+ ${sceneIntersections || createSceneIntersectionsWgsl({ perInstanceBounds, compactVertices, hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
1480
1494
  }
1481
1495
  //# sourceMappingURL=intersect.wgsl.js.map