@meimu/mutracer 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +240 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14360 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +160 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +274 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +123 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +265 -0
  35. package/lib/Render.js +742 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +79 -0
  38. package/lib/RenderLoop.js +236 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1448 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +126 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +623 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +927 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +105 -0
  511. package/lib/util/fromTHREE.js +1111 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,1441 @@
1
+ // Portions adapted from ray-tracing-renderer@0.10.15
2
+ // (https://github.com/hoverinc/ray-tracing-renderer).
3
+ // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
+ import { uvProjectionConstants } from '../../MaterialTable.js';
5
+ import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
6
+ import pdm_displacementWgsl from './pdm_displacement.wgsl.js';
7
+ import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
8
+ const displacementWgsl = pdm_displacementWgsl;
9
+ const flatIntersectCode = function () {
10
+ return /* wgsl */ `
11
+ let hit = fI(o, d, tri, ey, gJ, tMax);
12
+ if (hit.t > 0.0) {
13
+ let e1 = tri.p1 - tri.p0;
14
+ let e2 = tri.p2 - tri.p0;
15
+ eC = normalize(cross(e1, e2));
16
+ let kb = i32(ae(bitcast<i32>(od.z)).x);
17
+ let iH = materialsBuffer[kb].doubleSided > 0.5;
18
+ if (!doubleSided && !iH && dot(eC, d) > 0.0) {
19
+ eC = vec3f(0.0);
20
+ continue;
21
+ }
22
+
23
+ tMax = hit.t;
24
+ qP = true;
25
+ oh = true;
26
+ eU = o + tMax * d;
27
+ aB = hit.barycentric;
28
+ }
29
+ `;
30
+ };
31
+ function getPDMDisplacmentCode(anyHit) {
32
+ return /*wgsl */ `
33
+ let kL = oP(
34
+ o, d, tMax,
35
+ tri.p0, tri.p1, tri.p2,
36
+ n0, n1, n2,
37
+ uv0, uv1, uv2,
38
+ displacementMapIndex,
39
+ nX(displacementMapIndex),
40
+ minH, maxH,
41
+ hScale,
42
+ matData.displacementStepSize,
43
+ i32(matData.displacementUvProjection),
44
+ displacementUvProjectionScale,
45
+ ${anyHit ? 'true' : 'false'},
46
+ ln
47
+ );
48
+ `;
49
+ }
50
+ const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
51
+ return /* wgsl */ `
52
+
53
+ let hScale = od.w;
54
+ let th = bitcast<i32>(r3.w);
55
+ if (abs(hScale) > 0.0 && th > 0) {
56
+
57
+ let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
58
+ let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
59
+ let n2 = normalize(attrBuffers[index.z * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
60
+
61
+ let minH = f32(th >> 8) / 255.0;
62
+ let maxH = f32(th & 0xff) / 255.0;
63
+
64
+ let pA = tri.p0 + n0 * hScale * minH;
65
+ let pB = tri.p1 + n1 * hScale * minH;
66
+ let pC = tri.p2 + n2 * hScale * minH;
67
+ let pD = tri.p0 + n0 * hScale * maxH;
68
+ let pE = tri.p1 + n1 * hScale * maxH;
69
+ let pF = tri.p2 + n2 * hScale * maxH;
70
+
71
+ let materialIndex = i32(ae(bitcast<i32>(od.z)).x);
72
+ let matData = materialsBuffer[materialIndex];
73
+ let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
74
+ let displacementMapIndex = i32(matData.displacementMapIndex);
75
+
76
+
77
+ var uv0 = attrBuffers[index.x * ATTR_STRIDE + UV_OFF].xy;
78
+ var uv1 = attrBuffers[index.y * ATTR_STRIDE + UV_OFF].xy;
79
+ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
80
+
81
+ ${getPDMDisplacmentCode(anyHit)}
82
+
83
+ if (kL.t < tMax) {
84
+ eC = kL.normal;
85
+
86
+
87
+ tMax = kL.t;
88
+
89
+ aB = kL.barycentric;
90
+ eU = o + tMax * d;
91
+
92
+ bU = true;
93
+ qP = true;
94
+ oh = true;
95
+ }
96
+ }
97
+ else {
98
+ ${flatIntersectCode()}
99
+ }
100
+ `;
101
+ };
102
+ const cwbvhTraversalWgsl = /* wgsl */ `
103
+ fn bp(value: u32) -> vec4f {
104
+ return vec4f(
105
+ f32(value & 0xffu),
106
+ f32((value >> 8u) & 0xffu),
107
+ f32((value >> 16u) & 0xffu),
108
+ f32(value >> 24u)
109
+ );
110
+ }
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+ fn kl(value: u32) -> u32 {
119
+ return (bitcast<u32>(f32(value)) >> 23u) - 127u;
120
+ }
121
+
122
+ fn nL(value: u32) -> u32 {
123
+ return (bitcast<u32>(f32(value)) >> 23u) - 127u;
124
+ }
125
+
126
+ fn oe(
127
+ node: i32,
128
+ sX: i32,
129
+ n0: vec4f,
130
+ o: vec3f,
131
+ gv: vec3f,
132
+ tMax: f32
133
+ ) -> u32 {
134
+ let i = node + sX;
135
+ let n2 = bvhBuffer[i + 2];
136
+ let n3 = bvhBuffer[i + 3];
137
+ let n4 = bvhBuffer[i + 4];
138
+ let header = bitcast<u32>(n0.w);
139
+ let rq = bitcast<i32>((header & 0xffu) << 24u) >> 24;
140
+ let rr = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
141
+ let rs = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
142
+ let hG = vec3f(
143
+ bitcast<f32>(u32(rq + 127) << 23u),
144
+ bitcast<f32>(u32(rr + 127) << 23u),
145
+ bitcast<f32>(u32(rs + 127) << 23u)
146
+ );
147
+ let bJ = eV(gv, o);
148
+ let eH = (n0.xyz - o) * gv;
149
+ let da = hG * gv;
150
+ let wl = bp(bitcast<u32>(n2.x));
151
+ let wm = bp(bitcast<u32>(n2.y));
152
+ let wn = bp(bitcast<u32>(n2.z));
153
+ let wo = bp(bitcast<u32>(n2.w));
154
+ let wp = bp(bitcast<u32>(n3.x));
155
+ let wq = bp(bitcast<u32>(n3.y));
156
+ let wf = bp(bitcast<u32>(n3.z));
157
+ let wg = bp(bitcast<u32>(n3.w));
158
+ let wh = bp(bitcast<u32>(n4.x));
159
+ let wi = bp(bitcast<u32>(n4.y));
160
+ let wj = bp(bitcast<u32>(n4.z));
161
+ let wk = bp(bitcast<u32>(n4.w));
162
+
163
+ let uZ = wl * da.x + eH.x;
164
+ let vb = wn * da.y + eH.y;
165
+ let vd = wp * da.z + eH.z;
166
+ let uT = wf * da.x + eH.x;
167
+ let uV = wh * da.y + eH.y;
168
+ let uX = wj * da.z + eH.z;
169
+ let wr = max(
170
+ max((min(uZ, uT) - vec4f(bJ.x)), (min(vb, uV) - vec4f(bJ.y))),
171
+ (min(vd, uX) - vec4f(bJ.z))
172
+ );
173
+ let vZ = min(
174
+ min((max(uZ, uT) + vec4f(bJ.x)), (max(vb, uV) + vec4f(bJ.y))),
175
+ (max(vd, uX) + vec4f(bJ.z))
176
+ );
177
+
178
+ let va = wm * da.x + eH.x;
179
+ let vc = wo * da.y + eH.y;
180
+ let ve = wq * da.z + eH.z;
181
+ let uU = wg * da.x + eH.x;
182
+ let uW = wi * da.y + eH.y;
183
+ let uY = wk * da.z + eH.z;
184
+ let ws = max(
185
+ max((min(va, uU) - vec4f(bJ.x)), (min(vc, uW) - vec4f(bJ.y))),
186
+ (min(ve, uY) - vec4f(bJ.z))
187
+ );
188
+ let wa = min(
189
+ min((max(va, uU) + vec4f(bJ.x)), (max(vc, uW) + vec4f(bJ.y))),
190
+ (max(ve, uY) + vec4f(bJ.z))
191
+ );
192
+
193
+ let uw = (wr <= min(vZ, vec4f(tMax))) & (vZ > vec4f(0.0));
194
+ let ux = (ws <= min(wa, vec4f(tMax))) & (wa > vec4f(0.0));
195
+ return select(0u, 1u, uw.x)
196
+ | select(0u, 2u, uw.y)
197
+ | select(0u, 4u, uw.z)
198
+ | select(0u, 8u, uw.w)
199
+ | select(0u, 16u, ux.x)
200
+ | select(0u, 32u, ux.y)
201
+ | select(0u, 64u, ux.z)
202
+ | select(0u, 128u, ux.w);
203
+ }
204
+
205
+ `;
206
+ function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
207
+ const intersectTriangles = /* wgsl */ `
208
+ let od = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
209
+ let vertexOffset = vec3i(bitcast<i32>(od.y));
210
+ for (var k = 0; k < bh; k++) {
211
+ let triangleIndex = primitiveOffset + k;
212
+ ${skipTriangleCode}
213
+ if (bounces > 0 && triangleIndex == hL) {
214
+ continue;
215
+ }
216
+
217
+ let r3 = bvhBuffer[triangleIndex];
218
+ let index = bitcast<vec3i>(r3.xyz) + vertexOffset;
219
+ var tri = fu(
220
+ attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
221
+ attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
222
+ attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
223
+ );
224
+ var oh = false;
225
+
226
+ ${hasDisplacement
227
+ ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
228
+ : flatIntersectCode()}
229
+ if (oh) {
230
+ ${handleHitCode}
231
+ }
232
+ }
233
+ `;
234
+ return /* wgsl */ `
235
+ var d = ray.d;
236
+ var o = ray.o;
237
+ var lN: array<i32, TLAS_STACK_SIZE>;
238
+ var jb = -1;
239
+ var gv = eX(d);
240
+ var bU = false;
241
+ var qP = false;
242
+ var eU: vec3f;
243
+ var eC: vec3f;
244
+ var aB: vec3f;
245
+
246
+
247
+ if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gv, tMax) > 0.0) {
248
+ jb = 0;
249
+ lN[0] = 0;
250
+ }
251
+ while (jb >= 0) {
252
+ let sI = lN[jb];
253
+ jb--;
254
+ o = ray.o;
255
+ d = ray.d;
256
+ gv = eX(d);
257
+
258
+ let vR = bvhBuffer[sI];
259
+ let eR = bitcast<i32>(vR.w);
260
+ if (eR >= 0) {
261
+ let left = sI + 2;
262
+ let right = eR;
263
+ let d0 = cM(
264
+ o,
265
+ bvhBuffer[left].xyz,
266
+ bvhBuffer[left + 1].xyz,
267
+ gv,
268
+ tMax
269
+ );
270
+ let d1 = cM(
271
+ o,
272
+ bvhBuffer[right].xyz,
273
+ bvhBuffer[right + 1].xyz,
274
+ gv,
275
+ tMax
276
+ );
277
+
278
+ if (d0 > d1) {
279
+ if (d0 > 0.0) { jb++; lN[jb] = left; }
280
+ if (d1 > 0.0) { jb++; lN[jb] = right; }
281
+ }
282
+ else {
283
+ if (d1 > 0.0) { jb++; lN[jb] = right; }
284
+ if (d0 > 0.0) { jb++; lN[jb] = left; }
285
+ }
286
+ }
287
+ else {
288
+ let qx = -eR;
289
+
290
+
291
+ for (
292
+ var mi = qx - 1;
293
+ mi >= 0;
294
+ mi--
295
+ ) {
296
+ let pm = bvhBuffer[sI + 2 + mi];
297
+ let cf = bitcast<i32>(pm.x);
298
+ let uG = bitcast<i32>(pm.y);
299
+ let od = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
300
+ let w2l = mat4x4<f32>(
301
+ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
302
+ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
303
+ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 3],
304
+ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 4]
305
+ );
306
+ o = (w2l * vec4f(ray.o, 1.0)).xyz;
307
+ d = (w2l * vec4f(ray.d, 0.0)).xyz;
308
+ gv = eX(d);
309
+ ey = maxDimension(abs(d));
310
+ gJ = mg(d, ey);
311
+
312
+ let fG = bitcast<u32>(od.x);
313
+ let gL = fG >> 30u;
314
+ let blasOffset = i32(fG & 0x3fffffffu);
315
+ let bo = rtUniform.blasOffset;
316
+
317
+ ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
318
+ if (gL == 3u) {
319
+
320
+
321
+
322
+
323
+ var rY: array<vec2u, BLAS_STACK_SIZE>;
324
+ var pa = -1;
325
+ var rK = 0u;
326
+ var kN = 0u;
327
+
328
+ var ep = 0x80000000u;
329
+ let uf = select(0u, 4u, d.x < 0.0)
330
+ | select(0u, 2u, d.y < 0.0)
331
+ | select(0u, 1u, d.z < 0.0);
332
+ let pZ = 7u - uf;
333
+
334
+
335
+
336
+
337
+ while (rK < 4096u) {
338
+ rK++;
339
+
340
+ let internalMask = ep & 0xffu;
341
+ let pV =
342
+ kl(ep >> 24u) + 24u;
343
+ ep &= ~(1u << pV);
344
+ if ((ep & 0xff000000u) != 0u) {
345
+ pa++;
346
+
347
+ rY[pa] = vec2u(kN, ep);
348
+ }
349
+
350
+ let slot = (pV - 24u) ^ pZ;
351
+ let mY = (1u << slot) - 1u;
352
+ let relativeIndex = countOneBits(internalMask & mY);
353
+ let rW = kN + relativeIndex;
354
+ let node = blasOffset + i32(rW * 5u);
355
+ let jr = bvhBuffer[node + bo];
356
+ let tS = oe(
357
+ node, bo, jr, o, gv, tMax
358
+ );
359
+
360
+
361
+ ep = 0u;
362
+ if (tS != 0u) {
363
+ let fC = bvhBuffer[node + bo + 1];
364
+ let rB = bitcast<u32>(jr.w) >> 24u;
365
+ var tf = 0u;
366
+ var jX = tS;
367
+ while (jX != 0u) {
368
+ let rm = kl(jX);
369
+ jX &= ~(1u << rm);
370
+ let sn = select(
371
+ bitcast<u32>(fC.z),
372
+ bitcast<u32>(fC.w),
373
+ rm >= 4u
374
+ );
375
+ let sR =
376
+ (sn >> ((rm & 3u) * 8u)) & 0xffu;
377
+ let ju = sR & 0x1fu;
378
+ let uF = select(
379
+ ju,
380
+ ju ^ pZ,
381
+ ju >= 24u
382
+ );
383
+ let uA = (sR >> 5u) & 0x7u;
384
+ tf |= uA << uF;
385
+ }
386
+
387
+ kN = bitcast<u32>(fC.x);
388
+ ep = (tf & 0xff000000u) | rB;
389
+ let oE = bitcast<u32>(fC.y);
390
+ var oF = tf & 0x00ffffffu;
391
+ while (oF != 0u) {
392
+ let nF = nL(oF);
393
+ oF &= ~(1u << nF);
394
+ let bh = 1;
395
+ let primitiveOffset = bo + blasOffset
396
+ + i32(oE + nF);
397
+ ${intersectTriangles}
398
+ }
399
+ }
400
+
401
+ if ((ep & 0xff000000u) != 0u) { continue; }
402
+ if (pa >= 0) {
403
+ let qa = rY[pa];
404
+ kN = qa.x;
405
+ ep = qa.y;
406
+ pa--;
407
+ }
408
+ else { break; }
409
+ }
410
+ }
411
+ ` : ''}
412
+
413
+ var gn: array<i32, BLAS_STACK_SIZE>;
414
+ var dR = -1;
415
+ if (gL != 3u) {
416
+ dR = 0;
417
+
418
+ gn[0] = uG;
419
+ }
420
+
421
+ while (dR >= 0) {
422
+
423
+ let node = gn[dR];
424
+ dR--;
425
+ var bh = 0;
426
+ var primitiveOffset = 0;
427
+
428
+ ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
429
+ if (gL == 2u) {
430
+ let i = node + bo;
431
+ let uK = bvhBuffer[i];
432
+ let uL = bvhBuffer[i + 1];
433
+ let uM = bvhBuffer[i + 2];
434
+ let uN = bvhBuffer[i + 3];
435
+ bh = i32(bitcast<u32>(uM.w));
436
+ if (bh > 0) {
437
+ primitiveOffset = bo + blasOffset
438
+ + i32(bitcast<u32>(uN.w));
439
+ }
440
+ else {
441
+ let left = blasOffset + i32(bitcast<u32>(uK.w) * 4u);
442
+ let right = blasOffset + i32(bitcast<u32>(uL.w) * 4u);
443
+ let oi = cM(
444
+ o, uK.xyz, uL.xyz, gv, tMax
445
+ );
446
+ let nd = cM(
447
+ o, uM.xyz, uN.xyz, gv, tMax
448
+ );
449
+ if (oi > nd) {
450
+ if (oi > 0.0) {
451
+ dR++; gn[dR] = left;
452
+ }
453
+ if (nd > 0.0) {
454
+ dR++; gn[dR] = right;
455
+ }
456
+ }
457
+ else {
458
+ if (nd > 0.0) {
459
+ dR++; gn[dR] = right;
460
+ }
461
+ if (oi > 0.0) {
462
+ dR++; gn[dR] = left;
463
+ }
464
+ }
465
+ }
466
+ }
467
+ ` : ''}
468
+ ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
469
+ if (gL == 1u) {
470
+ let hT = bitcast<u32>(node);
471
+ if ((hT & 0x80000000u) != 0u) {
472
+ bh = i32((hT >> 23u) & 0xffu);
473
+ primitiveOffset = bo + blasOffset
474
+ + i32(hT & 0x007fffffu);
475
+ }
476
+ else {
477
+ let i = node + bo;
478
+ let tV = bvhBuffer[i];
479
+ let ra = bvhBuffer[i + 1];
480
+ let rb = bvhBuffer[i + 2];
481
+ let rc = bvhBuffer[i + 3];
482
+ let nodeMin = tV.xyz;
483
+ let ec = vec3f(tV.w, ra.x, ra.y);
484
+ let lS = array<u32, 4>(
485
+ bitcast<u32>(ra.z), bitcast<u32>(ra.w),
486
+ bitcast<u32>(rb.x), bitcast<u32>(rb.y)
487
+ );
488
+ let rj = unpack4x8unorm(bitcast<u32>(rb.z));
489
+ let rk = unpack4x8unorm(bitcast<u32>(rb.w));
490
+ let rl = unpack4x8unorm(bitcast<u32>(rc.x));
491
+ let rf = unpack4x8unorm(bitcast<u32>(rc.y));
492
+ let rh = unpack4x8unorm(bitcast<u32>(rc.z));
493
+ let ri = unpack4x8unorm(bitcast<u32>(rc.w));
494
+ let tx0 = (nodeMin.x + rj * ec.x - o.x) * gv.x;
495
+ let tx1 = (nodeMin.x + rf * ec.x - o.x) * gv.x;
496
+ let ty0 = (nodeMin.y + rk * ec.y - o.y) * gv.y;
497
+ let ty1 = (nodeMin.y + rh * ec.y - o.y) * gv.y;
498
+ let tz0 = (nodeMin.z + rl * ec.z - o.z) * gv.z;
499
+ let tz1 = (nodeMin.z + ri * ec.z - o.z) * gv.z;
500
+ let bJ = eV(gv, o);
501
+ let my = max(
502
+ max((min(tx0, tx1) - vec4f(bJ.x)), (min(ty0, ty1) - vec4f(bJ.y))),
503
+ (min(tz0, tz1) - vec4f(bJ.z))
504
+ );
505
+ let rH = min(
506
+ min((max(tx0, tx1) + vec4f(bJ.x)), (max(ty0, ty1) + vec4f(bJ.y))),
507
+ (max(tz0, tz1) + vec4f(bJ.z))
508
+ );
509
+ var distance = select(rH, my, my > vec4f(0.0));
510
+ distance = select(
511
+ distance,
512
+ vec4f(-1.0),
513
+ my > min(rH, vec4f(tMax))
514
+ );
515
+ var fa = array<f32, 4>(
516
+ distance.x,
517
+ distance.y,
518
+ distance.z,
519
+ distance.w
520
+ );
521
+
522
+
523
+ for (var order = 0; order < 4; order++) {
524
+ var dX = -1.0;
525
+ var el = -1;
526
+ for (var child = 0; child < 4; child++) {
527
+ if (
528
+ lS[child] != 0u &&
529
+ fa[child] > dX
530
+ ) {
531
+ dX = fa[child];
532
+ el = child;
533
+ }
534
+ }
535
+ if (el >= 0 && dX > 0.0) {
536
+ let ni = lS[el];
537
+ var jB = bitcast<i32>(ni);
538
+ if ((ni & 0x80000000u) == 0u) {
539
+ jB += blasOffset;
540
+ }
541
+ dR++;
542
+ gn[dR] = jB;
543
+ fa[el] = -1.0;
544
+ }
545
+ }
546
+ }
547
+ }
548
+ ` : ''}
549
+ ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
550
+ if (gL == 0u) {
551
+ let i = node + bo;
552
+ let r1 = bvhBuffer[i];
553
+ let bb = bitcast<i32>(r1.w);
554
+
555
+ if (bb >= 0) {
556
+ let left = node + 2;
557
+ let right = bb + blasOffset;
558
+ let d0 = cM(
559
+ o,
560
+ bvhBuffer[left + bo].xyz,
561
+ bvhBuffer[left + 1 + bo].xyz,
562
+ gv,
563
+ tMax
564
+ );
565
+ let d1 = cM(
566
+ o,
567
+ bvhBuffer[right + bo].xyz,
568
+ bvhBuffer[right + 1 + bo].xyz,
569
+ gv,
570
+ tMax
571
+ );
572
+
573
+ if (d0 > d1) {
574
+ if (d0 > 0.0) {
575
+ dR++; gn[dR] = left;
576
+
577
+ }
578
+ if (d1 > 0.0) {
579
+ dR++; gn[dR] = right;
580
+
581
+ }
582
+ }
583
+ else {
584
+ if (d1 > 0.0) {
585
+ dR++; gn[dR] = right;
586
+
587
+ }
588
+ if (d0 > 0.0) {
589
+ dR++; gn[dR] = left;
590
+
591
+ }
592
+ }
593
+ }
594
+ else {
595
+ bh = -bb;
596
+ primitiveOffset = i + 2;
597
+ }
598
+ }
599
+ ` : ''}
600
+ if (bh > 0) {
601
+ ${intersectTriangles}
602
+ }
603
+ }
604
+ }
605
+ }
606
+ }
607
+
608
+ `;
609
+ }
610
+ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1 }) {
611
+ return /*wgsl*/ `
612
+
613
+ ${hasDisplacement ? displacementWgsl : ''}
614
+ ${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
615
+
616
+ struct fu {
617
+ p0: vec3f,
618
+ p1: vec3f,
619
+ p2: vec3f,
620
+ };
621
+
622
+ fn ht(rad: f32, pos: vec3f, r: Ray) -> f32 {
623
+ let op: vec3f = pos - r.o;
624
+ let eps: f32 = 0.001;
625
+ let b: f32 = dot(op, r.d);
626
+ var det: f32 = b * b - dot(op, op) + rad * rad;
627
+ if (det < 0.0) {
628
+ return INF;
629
+ }
630
+
631
+ det = sqrt(det);
632
+ let t1: f32 = b - det;
633
+ if (t1 > eps) {
634
+ return t1;
635
+ }
636
+
637
+ let t2: f32 = b + det;
638
+ if (t2 > eps) {
639
+ return t2;
640
+ }
641
+
642
+ return INF;
643
+ }
644
+
645
+ fn mR(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
646
+ let dt: f32 = dot(r.d, n);
647
+ let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
648
+
649
+ if (t > EPS) {
650
+ let p: vec3f = r.o + r.d * t;
651
+ let vi: vec3f = p - pos;
652
+ let a1: f32 = dot(u / dot(u, u), vi);
653
+ if (a1 >= 0.0 && a1 <= 1.0) {
654
+ let a2: f32 = dot(v / dot(v, v), vi);
655
+ if (a2 >= 0.0 && a2 <= 1.0) {
656
+ return t;
657
+ }
658
+ }
659
+ }
660
+
661
+ return INF;
662
+ }
663
+
664
+ fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
665
+ let aj = distance(origin, center);
666
+ if (aj <= radius) { return INV4PI; }
667
+ let jn = min(1.0, radius * radius / (aj * aj));
668
+ let cosThetaMax = sqrt(max(0.0, 1.0 - jn));
669
+ return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
670
+ }
671
+
672
+ fn mk(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
673
+
674
+
675
+ var d: f32 = INF;
676
+ (*lightSample).direction = r.d;
677
+ (*lightSample).normal = -r.d;
678
+ (*lightSample).dist = INF;
679
+ (*lightSample).pdf = 0.0;
680
+ (*lightSample).emission = vec3f(0.0);
681
+ (*lightSample).isDelta = false;
682
+ var u = light.u;
683
+ var v = light.v;
684
+ var dO = i32(light.litType);
685
+
686
+ if (dO == RECT_LIGHT) {
687
+
688
+ var pos = light.position - u * 0.5 - v * 0.5;
689
+ var normal = normalize(cross(u, v));
690
+ if (dot(normal, r.d) > 0.0) {
691
+ return INF;
692
+ }
693
+
694
+ d = mR(pos, u, v, normal, r);
695
+ if (d < 0.0) {
696
+ d = INF;
697
+ }
698
+ else {
699
+ var cc: f32 = dot(-r.d, normal);
700
+ let spread = light.radiusOrSpread;
701
+ if (cc >= cos(spread * PI / 2.0)) {
702
+ (*lightSample).direction = r.d;
703
+ (*lightSample).normal = normal;
704
+ (*lightSample).dist = d;
705
+ (*lightSample).pdf = (d * d) / (light.area * cc);
706
+ (*lightSample).emission = light.emission;
707
+ (*lightSample).isDelta = false;
708
+ }
709
+ else {
710
+ d = INF;
711
+ }
712
+ }
713
+ }
714
+
715
+ else if (dO == SPHERE_LIGHT) {
716
+ if (light.radiusOrSpread <= 0.0) {
717
+ let kf = light.position - r.o;
718
+ let projection = dot(kf, r.d);
719
+ let ba = kf - projection * r.d;
720
+ if (projection <= EPS || dot(ba, ba) > 1e-8) {
721
+ return INF;
722
+ }
723
+ d = projection;
724
+ (*lightSample).direction = r.d;
725
+ (*lightSample).normal = -r.d;
726
+ (*lightSample).dist = d;
727
+ (*lightSample).pdf = 1.0;
728
+ (*lightSample).isDelta = true;
729
+ }
730
+ else {
731
+ d = ht(light.radiusOrSpread, light.position, r);
732
+ (*lightSample).isDelta = false;
733
+ if (d > 0.0 && d != INF) {
734
+ (*lightSample).direction = r.d;
735
+ (*lightSample).dist = d;
736
+ (*lightSample).normal = normalize(
737
+ r.o + r.d * d - light.position
738
+ );
739
+ (*lightSample).pdf = sphereSolidAnglePdf(
740
+ r.o,
741
+ light.position,
742
+ light.radiusOrSpread
743
+ );
744
+ }
745
+ }
746
+ if (d < 0.0) {
747
+ d = INF;
748
+ }
749
+ else {
750
+ (*lightSample).direction = r.d;
751
+ (*lightSample).dist = d;
752
+ (*lightSample).emission = select(
753
+ light.emission,
754
+ light.emission / max(d * d, 1e-8),
755
+ light.radiusOrSpread <= 0.0
756
+ );
757
+ }
758
+ }
759
+
760
+ else if (dO == SPOT_LIGHT) {
761
+ if (light.radiusOrSpread <= 0.0) {
762
+ let kf = light.position - r.o;
763
+ let projection = dot(kf, r.d);
764
+ let ba = kf - projection * r.d;
765
+ if (projection <= EPS || dot(ba, ba) > 1e-8) {
766
+ return INF;
767
+ }
768
+ d = projection;
769
+ (*lightSample).direction = r.d;
770
+ (*lightSample).normal = -r.d;
771
+ (*lightSample).dist = d;
772
+ (*lightSample).pdf = 1.0;
773
+ (*lightSample).isDelta = true;
774
+ }
775
+ else {
776
+ d = ht(light.radiusOrSpread, light.position, r);
777
+ (*lightSample).isDelta = false;
778
+ }
779
+ if (d != INF) {
780
+ let uQ = r.o + d * r.d;
781
+ let mo = bL(light, normalize(r.o - uQ));
782
+ if (mo <= 0.0) { return INF; }
783
+ if (light.radiusOrSpread > 0.0) {
784
+ (*lightSample).direction = r.d;
785
+ (*lightSample).dist = d;
786
+ (*lightSample).normal = normalize(
787
+ r.o + r.d * d - light.position
788
+ );
789
+ (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
790
+ }
791
+ (*lightSample).emission = light.emission * mo * select(
792
+ 1.0,
793
+ 1.0 / max(d * d, 1e-8),
794
+ light.radiusOrSpread <= 0.0
795
+ );
796
+ }
797
+ }
798
+
799
+ else if (dO != RECT_LIGHT && dO != SPHERE_LIGHT && dO != SPOT_LIGHT) {
800
+
801
+ d = INF;
802
+ }
803
+
804
+ return d;
805
+ }
806
+
807
+ fn fj(m0: vec3i, m1: vec3i, m2: vec3i, eZ: vec3f) -> i32 {
808
+ let m00 = ae(m0.x);
809
+ let m01 = ae(m0.y);
810
+ let m02 = ae(m0.z);
811
+ let m10 = ae(m1.x);
812
+ let m11 = ae(m1.y);
813
+ let m12 = ae(m1.z);
814
+ let m20 = ae(m2.x);
815
+ let m21 = ae(m2.y);
816
+ let m22 = ae(m2.z);
817
+ var w00 = m00.y * eZ.x;
818
+ var w01 = m01.y * eZ.x;
819
+ var w02 = m02.y * eZ.x;
820
+ var w10 = m10.y * eZ.y;
821
+ var w11 = m11.y * eZ.y;
822
+ var w12 = m12.y * eZ.y;
823
+ var w20 = m20.y * eZ.z;
824
+ var w21 = m21.y * eZ.z;
825
+ var w22 = m22.y * eZ.z;
826
+
827
+ var he = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
828
+
829
+ w00 = w00 / he;
830
+ w01 = w01 / he + w00;
831
+ w02 = w02 / he + w01;
832
+ w10 = w10 / he + w02;
833
+ w11 = w11 / he + w10;
834
+ w12 = w12 / he + w11;
835
+ w20 = w20 / he + w12;
836
+ w21 = w21 / he + w20;
837
+ w22 = w22 / he + w21;
838
+
839
+ let rand = eo(0u);
840
+ var mS: f32;
841
+ if (rand < w00) {
842
+ mS = m00.x;
843
+ } else if (rand < w01) {
844
+ mS = m01.x;
845
+ } else if (rand < w02) {
846
+ mS = m02.x;
847
+ } else if (rand < w10) {
848
+ mS = m10.x;
849
+ } else if (rand < w11) {
850
+ mS = m11.x;
851
+ } else if (rand < w12) {
852
+ mS = m12.x;
853
+ } else if (rand < w20) {
854
+ mS = m20.x;
855
+ } else if (rand < w21) {
856
+ mS = m21.x;
857
+ } else {
858
+ mS = m22.x;
859
+ }
860
+ return i32(mS);
861
+ }
862
+
863
+ fn lJ(
864
+ oN: i32,
865
+ index: vec3i,
866
+ eZ: vec3f
867
+ ) -> i32 {
868
+ let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
869
+ let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
870
+ let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
871
+ if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
872
+ return fj(m0, m1, m2, eZ);
873
+ }
874
+ return oN;
875
+ }
876
+
877
+
878
+
879
+ ${hasAnisotropyDirections ? /* wgsl */ `
880
+ fn eD(normal: vec3f, dp1: vec3f, dp2: vec3f, nP: vec2f, nQ: vec2f, input: vec4f) -> mat2x3f {
881
+ let determinant = nP.x * nQ.y - nP.y * nQ.x;
882
+ var t = input.xyz;
883
+ var b = vec3f(0.0);
884
+
885
+ var sign = select(input.w, 0.0, abs(input.w) > 1.5);
886
+ if (abs(determinant) > 1e-12) {
887
+ let dt = (dp1 * nQ.y - dp2 * nP.y) / determinant;
888
+ let db = (dp2 * nP.x - dp1 * nQ.x) / determinant;
889
+ if (dot(t, t) < 1e-8) { t = dt; }
890
+ if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
891
+ }
892
+ t -= normal * dot(normal, t);
893
+ if (dot(t, t) < 1e-8) {
894
+ let ig = select(-1.0, 1.0, normal.z >= 0.0);
895
+ let dW = -1.0 / (ig + normal.z);
896
+ let xy = normal.x * normal.y * dW;
897
+ t = vec3f(1.0 + ig * normal.x * normal.x * dW, ig * xy, -ig * normal.x);
898
+ b = vec3f(xy, ig + normal.y * normal.y * dW, -normal.y);
899
+ }
900
+ else { t = normalize(t); b = normalize(cross(normal, t)); }
901
+ return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
902
+ }
903
+
904
+ ` : /* wgsl */ ``}
905
+ fn hp(
906
+ si: ptr<function, ad>,
907
+ tri: fu,
908
+ eZ: vec3f,
909
+ index: vec3i,
910
+ bU: bool,
911
+ fq: i32
912
+ ) {
913
+ (*si).hit = true;
914
+
915
+ let material = materialsBuffer[(*si).materialIndex];
916
+ let uvProjection = i32(material.uvProjection);
917
+
918
+ let i0 = index.x;
919
+ let i1 = index.y;
920
+ let i2 = index.z;
921
+ let oL = uvProjection == ${uvProjectionConstants.spherical};
922
+
923
+ var normal: vec3f = (*si).normal;
924
+ var gU: vec3f;
925
+ var n0 = vec3f(0.0);
926
+ var n1 = vec3f(0.0);
927
+ var n2 = vec3f(0.0);
928
+
929
+
930
+ if (!bU || oL) {
931
+ n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
932
+ n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
933
+ n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
934
+ gU = normalize(eZ.x * n0 + eZ.y * n1 + eZ.z * n2);
935
+ if (!bU) {
936
+ normal = gU;
937
+ }
938
+ }
939
+
940
+ var uv: vec2f;
941
+ var uv0: vec2f;
942
+ var uv1: vec2f;
943
+ var uv2: vec2f;
944
+ var cX = vec2f(0.0);
945
+ if (USE_UV) {
946
+ uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
947
+ uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
948
+ uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
949
+ uv = eZ.x * uv0 + eZ.y * uv1 + eZ.z * uv2;
950
+ if (USE_UV1) {
951
+ let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
952
+ let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
953
+ let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
954
+ cX = eZ.x * secondaryUv0
955
+ + eZ.y * secondaryUv1
956
+ + eZ.z * secondaryUv2;
957
+ }
958
+ }
959
+
960
+ if (USE_TANGENT) {
961
+ let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
962
+ let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
963
+ let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
964
+ (*si).tangent = normalize(eZ.x * t0 + eZ.y * t1 + eZ.z * t2);
965
+ }
966
+
967
+ if (fq >= 0) {
968
+ (*si).materialIndex = fq;
969
+ }
970
+ else {
971
+ (*si).materialIndex = lJ(
972
+ (*si).materialIndex,
973
+ index,
974
+ eZ
975
+ );
976
+ }
977
+
978
+ if (uvProjection > 0) {
979
+
980
+ uv = gz(uvProjection, (*si).position, select(normal, gU, oL));
981
+ cX = uv;
982
+ }
983
+
984
+ uv = uv * material.uvScale;
985
+ cX = cX * material.uvScale;
986
+
987
+
988
+ if (uvProjection == ${uvProjectionConstants.triplanar}) {
989
+ uv = fract(uv);
990
+ }
991
+
992
+ ${hasAnisotropyDirections ? /* wgsl */ `
993
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normal;` : ''}
994
+ let directionMaterial = materialsBuffer[(*si).materialIndex];
995
+ if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0)" : ""}) {
996
+ let dp1 = tri.p0 - tri.p2;
997
+ let dp2 = tri.p1 - tri.p2;
998
+ var aU = vec4f(0.0);
999
+ if (USE_TANGENT) {
1000
+ aU = eZ.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
1001
+ + eZ.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
1002
+ + eZ.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1003
+ }
1004
+ let eP = eD(normal, dp1, dp2, uv0-uv2, uv1-uv2, aU);
1005
+ (*si).geometryTangent = eP[0];
1006
+ (*si).geometryBitangent = eP[1];
1007
+ var fU = eP;
1008
+ if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
1009
+ let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1010
+ let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1011
+ let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1012
+ fU = eD(normal, dp1, dp2, a-c, b-c, select(aU, vec4f(0.0), aU.w == 0.0));
1013
+ }
1014
+ (*si).directionTangent = fU[0];
1015
+ (*si).directionBitangent = fU[1];
1016
+ ${hasCoatNormals ? /* wgsl */ `
1017
+ if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1018
+ let kq = i32(directionMaterial.coatNormalMapIndex);
1019
+ var lT = eP;
1020
+ if (USE_UV1 && mapInfo[kq + NUM_MAPS * 2].x > 0.5) {
1021
+ let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1022
+ let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1023
+ let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1024
+ lT = eD(normal, dp1, dp2, a-c, b-c,
1025
+ select(aU, vec4f(0.0), aU.w == 0.0));
1026
+ }
1027
+
1028
+
1029
+ let decoded = sampleMap(kq, getMapUvSet(kq, uv,
1030
+ select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1031
+ let mapped = lT[0] * decoded.x * directionMaterial.coatNormalScale.x
1032
+ + lT[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1033
+ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1034
+ }
1035
+ ` : ''}
1036
+ }
1037
+
1038
+ ` : /* wgsl */ ``}
1039
+ (*si).normal = normal;
1040
+ (*si).vertexNormal = normal;
1041
+ (*si).shadowOffset = vec3f(0.0);
1042
+ if (!bU) {
1043
+
1044
+
1045
+
1046
+ let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1047
+ let kd = eZ.x * n0 + eZ.y * n1 + eZ.z * n2;
1048
+ let a = dot(n2 - n0, tri.p0 - tri.p2);
1049
+ let b = dot(n2 - n1, tri.p1 - tri.p2);
1050
+ let c = dot(n1 - n0, tri.p1 - tri.p0);
1051
+ var h = a * eZ.x * (eZ.x - 1.0)
1052
+ + (a + b + c) * eZ.x * eZ.y
1053
+ + b * eZ.y * (eZ.y - 1.0);
1054
+ if (dot(kd, geometricNormal) > 0.0) {
1055
+ var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1056
+ var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1057
+ var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
1058
+ h0 = max(dot(tri.p0 - (*si).position, n0) + h0, 0.0);
1059
+ h1 = max(dot(tri.p1 - (*si).position, n1) + h1, 0.0);
1060
+ h2 = max(dot(tri.p2 - (*si).position, n2) + h2, 0.0);
1061
+ h = max(min(min(h0, h1), h2), h * 0.5);
1062
+ }
1063
+ else {
1064
+ var h0 = max(max(dot(tri.p0 - tri.p1, n0), dot(tri.p0 - tri.p2, n0)), 0.0);
1065
+ var h1 = max(max(dot(tri.p1 - tri.p0, n1), dot(tri.p1 - tri.p2, n1)), 0.0);
1066
+ var h2 = max(max(dot(tri.p2 - tri.p0, n2), dot(tri.p2 - tri.p1, n2)), 0.0);
1067
+ h0 = max(dot((*si).position - tri.p0, n0) + h0, 0.0);
1068
+ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1069
+ h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1070
+ h = min(-min(min(h0, h1), h2), h * 0.5);
1071
+ }
1072
+ (*si).shadowOffset = kd * h;
1073
+ }
1074
+ (*si).uv = uv;
1075
+ (*si).uv1 = cX;
1076
+ if (USE_NORMAL_MAPS) {
1077
+ let dp1 = tri.p0 - tri.p2;
1078
+ let dp2 = tri.p1 - tri.p2;
1079
+ let nP = uv0 - uv2;
1080
+ let nQ = uv1 - uv2;
1081
+ (*si).normal = nY(
1082
+ (*si).materialIndex, uv, normal, dp1, dp2, nP, nQ
1083
+ );
1084
+ }
1085
+ }
1086
+
1087
+ struct eB {
1088
+ t: f32,
1089
+ barycentric: vec3f,
1090
+ };
1091
+
1092
+
1093
+
1094
+
1095
+
1096
+ fn fI(o: vec3f, d: vec3f, tri: fu, ey: i32, gJ: vec3f, tMax: f32) -> eB {
1097
+ var ti: eB;
1098
+
1099
+
1100
+ var p0t = tri.p0 - o;
1101
+ var p1t = tri.p1 - o;
1102
+ var p2t = tri.p2 - o;
1103
+
1104
+
1105
+ if (ey == 0) {
1106
+ p0t = p0t.yzx;
1107
+ p1t = p1t.yzx;
1108
+ p2t = p2t.yzx;
1109
+ } else if (ey == 1) {
1110
+ p0t = p0t.zxy;
1111
+ p1t = p1t.zxy;
1112
+ p2t = p2t.zxy;
1113
+ }
1114
+
1115
+
1116
+
1117
+ p0t = vec3f(p0t.xy + gJ.xy * p0t.z, p0t.z);
1118
+ p1t = vec3f(p1t.xy + gJ.xy * p1t.z, p1t.z);
1119
+ p2t = vec3f(p2t.xy + gJ.xy * p2t.z, p2t.z);
1120
+
1121
+
1122
+ var e = vec3f(
1123
+ p1t.x * p2t.y - p1t.y * p2t.x,
1124
+ p2t.x * p0t.y - p2t.y * p0t.x,
1125
+ p0t.x * p1t.y - p0t.y * p1t.x
1126
+ );
1127
+
1128
+ if (DEPTH_QUERY_MODE) {
1129
+
1130
+
1131
+ let ro = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1132
+ + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1133
+ e = select(e, vec3f(0.0), abs(e) <= ro * 1e-6);
1134
+ }
1135
+
1136
+
1137
+ if (any(e < vec3f(0)) && any(e > vec3f(0))) {
1138
+ return ti;
1139
+ }
1140
+
1141
+ let det = e.x + e.y + e.z;
1142
+ if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1143
+
1144
+ p0t.z *= gJ.z;
1145
+ p1t.z *= gJ.z;
1146
+ p2t.z *= gJ.z;
1147
+ let qZ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1148
+
1149
+
1150
+ if (abs(qZ) > abs(tMax * det)) {
1151
+ return ti;
1152
+ }
1153
+
1154
+ let sg = 1. / det;
1155
+ ti.t = qZ * sg;
1156
+ ti.barycentric = e * sg;
1157
+
1158
+ return ti;
1159
+ }
1160
+
1161
+
1162
+
1163
+
1164
+ override DEPTH_QUERY_MODE: bool = false;
1165
+
1166
+ fn eX(d: vec3f) -> vec3f {
1167
+ if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1168
+ return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1169
+ }
1170
+
1171
+ fn eV(gv: vec3f, o: vec3f) -> vec3f {
1172
+ if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1173
+ return abs(gv) * max(vec3f(1.0), abs(o)) * 1e-6;
1174
+ }
1175
+
1176
+
1177
+
1178
+ fn cM(o: vec3f, vw: vec3f, vu: vec3f, gv: vec3f, tMax: f32) -> f32 {
1179
+ let uD = (vw - o) * gv;
1180
+ let uE = (vu - o) * gv;
1181
+ let bJ = eV(gv, o);
1182
+ let my = min(uD, uE) - bJ;
1183
+ let rH = max(uD, uE) + bJ;
1184
+ let t0 = max(my.x, max(my.y, my.z));
1185
+ let t1 = min(rH.x, min(rH.y, rH.z));
1186
+ return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1187
+ }
1188
+
1189
+ fn maxDimension(v: vec3f) -> i32 {
1190
+ return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1191
+ }
1192
+
1193
+ fn mg(d: vec3f, ey: i32) -> vec3f {
1194
+
1195
+
1196
+ if (ey == 0) {
1197
+ return vec3f(-d.y, -d.z, 1.0) / d.x;
1198
+ } else if (ey == 1) {
1199
+ return vec3f(-d.z, -d.x, 1.0) / d.y;
1200
+ } else {
1201
+ return vec3f(-d.x, -d.y, 1.0) / d.z;
1202
+ }
1203
+ }
1204
+
1205
+ fn lU(
1206
+ si: ptr<function, ad>,
1207
+ lm: fu,
1208
+ aB: vec3f,
1209
+ hs: vec3i,
1210
+ bU: bool,
1211
+ ao: i32,
1212
+ eC: vec3f,
1213
+ eU: vec3f,
1214
+ fq: i32
1215
+ ) {
1216
+ (*si).instanceIndex = ao;
1217
+ (*si).barycentrics = aB.xy;
1218
+ (*si).normal = eC;
1219
+ (*si).position = eU;
1220
+ (*si).materialIndex = i32(ae(
1221
+ bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
1222
+ ).x);
1223
+
1224
+
1225
+ hp(
1226
+ si,
1227
+ lm,
1228
+ aB,
1229
+ hs,
1230
+ bU,
1231
+ fq
1232
+ );
1233
+
1234
+ let l2w = mat4x4<f32>(
1235
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 5],
1236
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 6],
1237
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 7],
1238
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 8]
1239
+ );
1240
+ let w2l = mat4x4<f32>(
1241
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 1],
1242
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 2],
1243
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 3],
1244
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 4]
1245
+ );
1246
+ let aD = transpose(mat3x3<f32>(
1247
+ w2l[0].xyz,
1248
+ w2l[1].xyz,
1249
+ w2l[2].xyz
1250
+ ));
1251
+
1252
+ (*si).faceNormal = normalize(aD * eC);
1253
+ (*si).vertexNormal = normalize(aD * (*si).vertexNormal);
1254
+ (*si).normal = normalize(aD * (*si).normal);
1255
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
1256
+ if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
1257
+ (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
1258
+ }
1259
+ ${hasAnisotropyDirections ? /* wgsl */ `
1260
+ (*si).directionTangent = (l2w * vec4f((*si).directionTangent, 0.0)).xyz;
1261
+ (*si).directionBitangent = (l2w * vec4f((*si).directionBitangent, 0.0)).xyz;
1262
+ (*si).geometryTangent = (l2w * vec4f((*si).geometryTangent, 0.0)).xyz;
1263
+ (*si).geometryBitangent = (l2w * vec4f((*si).geometryBitangent, 0.0)).xyz;
1264
+ ` : /* wgsl */ ``}
1265
+ (*si).shadowOffset = (l2w * vec4f((*si).shadowOffset, 0.0)).xyz;
1266
+ (*si).position = (l2w * vec4((*si).position, 1.0)).xyz;
1267
+ }
1268
+
1269
+
1270
+ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
1271
+
1272
+
1273
+
1274
+
1275
+ fn cY(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, ln: bool) {
1276
+
1277
+ (*si).hit = false;
1278
+
1279
+ if (rtUniform.isEmpty > 0) {
1280
+ return;
1281
+ }
1282
+
1283
+ var tMax = RAY_MAX_DISTANCE;
1284
+ var ey: i32;
1285
+ var gJ: vec3f;
1286
+
1287
+ var hs: vec3i;
1288
+ var lm: fu;
1289
+ var ao: i32;
1290
+ var hL: i32 = (*si).triangleIndex;
1291
+
1292
+ ${getBVHTraverseCode(`
1293
+ (*si).triangleIndex = triangleIndex;
1294
+ lm = tri;
1295
+ hs = index;
1296
+ ao = cf;
1297
+ `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
1298
+
1299
+ if (qP) {
1300
+ lU(
1301
+ si,
1302
+ lm,
1303
+ aB,
1304
+ hs,
1305
+ bU,
1306
+ ao,
1307
+ eC,
1308
+ eU,
1309
+ -1
1310
+ );
1311
+ }
1312
+ }
1313
+
1314
+
1315
+ fn iG(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
1316
+ (*si).hit = false;
1317
+
1318
+ if (rtUniform.isEmpty > 0) {
1319
+ return;
1320
+ }
1321
+
1322
+ let bounces = 0;
1323
+ let doubleSided = true;
1324
+ let ln = false;
1325
+ var tMax = maxDistance;
1326
+ var ey: i32;
1327
+ var gJ: vec3f;
1328
+ var hs: vec3i;
1329
+ var lm: fu;
1330
+ var ao: i32;
1331
+ var hL: i32 = -1;
1332
+
1333
+ ${getBVHTraverseCode(`
1334
+ (*si).triangleIndex = triangleIndex;
1335
+ lm = tri;
1336
+ hs = index;
1337
+ ao = cf;
1338
+ `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
1339
+ if (cf != instanceIndex) {
1340
+ continue;
1341
+ }
1342
+ `)}
1343
+
1344
+ if (qP) {
1345
+ (*si).instanceIndex = ao;
1346
+ (*si).normal = eC;
1347
+ (*si).position = eU;
1348
+ (*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
1349
+ hp(
1350
+ si,
1351
+ lm,
1352
+ aB,
1353
+ hs,
1354
+ bU,
1355
+ -1
1356
+ );
1357
+
1358
+ let l2w = mat4x4<f32>(
1359
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 5],
1360
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 6],
1361
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 7],
1362
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 8]
1363
+ );
1364
+ let w2l = mat4x4<f32>(
1365
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 1],
1366
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 2],
1367
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 3],
1368
+ instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 4]
1369
+ );
1370
+ let aD = transpose(mat3x3<f32>(
1371
+ w2l[0].xyz,
1372
+ w2l[1].xyz,
1373
+ w2l[2].xyz
1374
+ ));
1375
+ (*si).faceNormal = normalize(aD * eC);
1376
+ (*si).vertexNormal = normalize(aD * (*si).vertexNormal);
1377
+ (*si).normal = normalize(aD * (*si).normal);
1378
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
1379
+ if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
1380
+ (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
1381
+ }
1382
+ ${hasAnisotropyDirections ? /* wgsl */ `
1383
+ (*si).directionTangent = (l2w * vec4f((*si).directionTangent, 0.0)).xyz;
1384
+ (*si).directionBitangent = (l2w * vec4f((*si).directionBitangent, 0.0)).xyz;
1385
+ (*si).geometryTangent = (l2w * vec4f((*si).geometryTangent, 0.0)).xyz;
1386
+ (*si).geometryBitangent = (l2w * vec4f((*si).geometryBitangent, 0.0)).xyz;
1387
+ ` : /* wgsl */ ``}
1388
+ (*si).shadowOffset = (l2w * vec4f((*si).shadowOffset, 0.0)).xyz;
1389
+ (*si).position = (l2w * vec4((*si).position, 1.0)).xyz;
1390
+ }
1391
+ }
1392
+
1393
+ fn ex(ray: Ray, lightDistance: f32, jE: i32) -> bool {
1394
+ if (rtUniform.isEmpty > 0) {
1395
+ return false;
1396
+ }
1397
+
1398
+ let doubleSided = true;
1399
+ let qc = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1400
+ var tMax = qc;
1401
+ var ey: i32;
1402
+ var gJ: vec3f;
1403
+
1404
+ let bounces = 1;
1405
+ var ln = false;
1406
+ var hL: i32 = jE;
1407
+
1408
+ ${getBVHTraverseCode(
1409
+ /*wgsl */ `
1410
+
1411
+
1412
+
1413
+ var jl = true;
1414
+
1415
+ if (jl) {
1416
+ if (HAS_ALPHA) {
1417
+ let materialIndex = i32(ae(bitcast<i32>(od.z)).x);
1418
+ if (!nl(
1419
+ materialIndex,
1420
+ index,
1421
+ aB,
1422
+ eU,
1423
+ eC
1424
+ )) {
1425
+
1426
+ tMax = qc;
1427
+ jl = false;
1428
+ }
1429
+ }
1430
+ }
1431
+ if (jl) {
1432
+ return true;
1433
+ }
1434
+ `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
1435
+
1436
+ return false;
1437
+ }
1438
+
1439
+ `;
1440
+ }
1441
+ //# sourceMappingURL=intersect.wgsl.js.map