@meimu/mutracer 0.1.5 → 0.2.0

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 (526) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10407 -8353
  6. package/docs/api.md +200 -10
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +1 -1
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +14 -5
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +11 -6
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -550
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +82 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +429 -429
  206. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +144 -144
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  208. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +801 -801
  209. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  210. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  211. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +49 -49
  212. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  213. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  214. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +102 -102
  215. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  216. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  217. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  218. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  219. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  220. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  221. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  222. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  223. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  224. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  225. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  226. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  227. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  228. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  229. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  230. package/lib/renderer/lightConstants.d.ts +10 -0
  231. package/lib/renderer/lightConstants.js +11 -0
  232. package/lib/renderer/lightConstants.js.map +1 -0
  233. package/lib/renderer/lightCore.d.ts +12 -0
  234. package/lib/renderer/lightCore.js +13 -0
  235. package/lib/renderer/lightCore.js.map +1 -0
  236. package/lib/renderer/lightSampling.d.ts +20 -17
  237. package/lib/renderer/lightSampling.js +123 -56
  238. package/lib/renderer/lightSampling.js.map +1 -1
  239. package/lib/renderer/lightsData.d.ts +21 -0
  240. package/lib/renderer/lightsData.js +192 -0
  241. package/lib/renderer/lightsData.js.map +1 -0
  242. package/lib/renderer/lightsUtil.d.ts +3 -26
  243. package/lib/renderer/lightsUtil.js +3 -153
  244. package/lib/renderer/lightsUtil.js.map +1 -1
  245. package/lib/renderer/materialBufferData.d.ts +70 -0
  246. package/lib/renderer/materialBufferData.js +2 -0
  247. package/lib/renderer/materialBufferData.js.map +1 -0
  248. package/lib/renderer/materialConstants.d.ts +11 -0
  249. package/lib/renderer/materialConstants.js +11 -0
  250. package/lib/renderer/materialConstants.js.map +1 -1
  251. package/lib/renderer/materialCore.d.ts +8 -0
  252. package/lib/renderer/materialCore.js +9 -0
  253. package/lib/renderer/materialCore.js.map +1 -0
  254. package/lib/renderer/materialEmission.d.ts +2 -2
  255. package/lib/renderer/materialEmission.js +3 -3
  256. package/lib/renderer/materialEmission.js.map +1 -1
  257. package/lib/renderer/materialLayout.d.ts +2 -101
  258. package/lib/renderer/materialLayout.js +110 -172
  259. package/lib/renderer/materialLayout.js.map +1 -1
  260. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  261. package/lib/renderer/materialLayoutSchema.js +172 -0
  262. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  263. package/lib/renderer/materialParams.d.ts +69 -0
  264. package/lib/renderer/materialParams.js +272 -0
  265. package/lib/renderer/materialParams.js.map +1 -0
  266. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  267. package/lib/renderer/materialTextureSlots.js +21 -8
  268. package/lib/renderer/materialTextureSlots.js.map +1 -1
  269. package/lib/renderer/materialTextures.d.ts +6 -0
  270. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  271. package/lib/renderer/materialTextures.js.map +1 -0
  272. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  273. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  274. package/lib/renderer/meshInstances.d.ts +4 -21
  275. package/lib/renderer/meshInstances.js +10 -56
  276. package/lib/renderer/meshInstances.js.map +1 -1
  277. package/lib/renderer/oidnNetwork.d.ts +2 -2
  278. package/lib/renderer/oidnNetwork.js +1 -1
  279. package/lib/renderer/oidnNetwork.js.map +1 -1
  280. package/lib/renderer/openPbrEnergyLut.js +850 -846
  281. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  282. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  283. package/lib/renderer/ownedDenoiser.js +2 -0
  284. package/lib/renderer/ownedDenoiser.js.map +1 -0
  285. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  286. package/lib/renderer/packedMeshInstances.js +80 -0
  287. package/lib/renderer/packedMeshInstances.js.map +1 -0
  288. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  289. package/lib/renderer/prepareMeshBVH.js +21 -642
  290. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  291. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  292. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  293. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  294. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  295. package/lib/renderer/progressiveScheduler.js +3 -0
  296. package/lib/renderer/progressiveScheduler.js.map +1 -1
  297. package/lib/renderer/renderPipeline.d.ts +3 -1
  298. package/lib/renderer/renderPipeline.js.map +1 -1
  299. package/lib/renderer/renderingLimits.d.ts +9 -0
  300. package/lib/renderer/renderingLimits.js +18 -0
  301. package/lib/renderer/renderingLimits.js.map +1 -0
  302. package/lib/renderer/sceneAssembly.d.ts +73 -0
  303. package/lib/renderer/sceneAssembly.js +109 -0
  304. package/lib/renderer/sceneAssembly.js.map +1 -0
  305. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  306. package/lib/renderer/sceneChangeCore.js +307 -0
  307. package/lib/renderer/sceneChangeCore.js.map +1 -0
  308. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  309. package/lib/renderer/sceneChangeDetector.js +24 -150
  310. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  311. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  312. package/lib/renderer/sceneLayoutSchema.js +111 -0
  313. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  314. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  315. package/lib/renderer/sceneLightChanges.js.map +1 -1
  316. package/lib/renderer/scenePreparation.d.ts +55 -0
  317. package/lib/renderer/scenePreparation.js +360 -0
  318. package/lib/renderer/scenePreparation.js.map +1 -0
  319. package/lib/renderer/scratchSampling.js +18 -18
  320. package/lib/renderer/scratchSampling.js.map +1 -1
  321. package/lib/renderer/shader.d.ts +2 -0
  322. package/lib/renderer/shader.js +2 -0
  323. package/lib/renderer/shader.js.map +1 -1
  324. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  325. package/lib/renderer/shaderCapabilities.js +55 -0
  326. package/lib/renderer/shaderCapabilities.js.map +1 -0
  327. package/lib/renderer/shaderCapacity.d.ts +2 -0
  328. package/lib/renderer/shaderCapacity.js +5 -0
  329. package/lib/renderer/shaderCapacity.js.map +1 -0
  330. package/lib/renderer/skyModel.d.ts +9 -0
  331. package/lib/renderer/skyModel.js +10 -0
  332. package/lib/renderer/skyModel.js.map +1 -0
  333. package/lib/renderer/textureAtlas.d.ts +60 -0
  334. package/lib/renderer/textureAtlas.js +145 -0
  335. package/lib/renderer/textureAtlas.js.map +1 -0
  336. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  337. package/lib/renderer/textureAtlasPixels.js +68 -0
  338. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  339. package/lib/renderer/util.d.ts +1 -1
  340. package/lib/renderer/util.js.map +1 -1
  341. package/lib/renderer/webgl.d.ts +9 -2
  342. package/lib/renderer/webgl.js +54 -9
  343. package/lib/renderer/webgl.js.map +1 -1
  344. package/lib/renderer/wgpuBindless.d.ts +26 -0
  345. package/lib/renderer/wgpuBindless.js +95 -0
  346. package/lib/renderer/wgpuBindless.js.map +1 -0
  347. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  348. package/lib/renderer/wgpuBindlessSource.js +51 -0
  349. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  350. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  351. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  352. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  353. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  354. package/lib/renderer/wgpuSceneUniform.js +125 -0
  355. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  356. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  357. package/lib/renderer/wgpuShaderSource.js +31 -0
  358. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  359. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  360. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  361. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  362. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  363. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  364. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  367. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  369. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  370. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  372. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  373. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  375. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  376. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  378. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  379. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  381. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  382. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  383. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  384. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  385. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +742 -705
  386. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  388. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  389. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  390. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +84 -82
  391. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  393. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  394. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  395. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  396. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  397. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  398. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  399. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  400. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  401. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  403. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  404. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  406. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  408. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  409. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  410. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  411. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  412. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  413. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  415. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  416. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  418. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  419. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  420. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  421. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  422. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  423. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  424. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  425. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  426. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  427. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  428. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  429. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  430. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  431. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  432. package/lib/scene/Camera.js +7 -3
  433. package/lib/scene/Camera.js.map +1 -1
  434. package/lib/scene/EnvironmentLight.d.ts +5 -9
  435. package/lib/scene/EnvironmentLight.js +4 -14
  436. package/lib/scene/EnvironmentLight.js.map +1 -1
  437. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  438. package/lib/scene/EnvironmentLightState.js +19 -0
  439. package/lib/scene/EnvironmentLightState.js.map +1 -0
  440. package/lib/scene/Geometry.d.ts +12 -6
  441. package/lib/scene/Geometry.js +37 -13
  442. package/lib/scene/Geometry.js.map +1 -1
  443. package/lib/scene/InstanceState.d.ts +39 -0
  444. package/lib/scene/InstanceState.js +77 -0
  445. package/lib/scene/InstanceState.js.map +1 -0
  446. package/lib/scene/InstancedMesh.d.ts +1 -1
  447. package/lib/scene/InstancedMesh.js +3 -0
  448. package/lib/scene/InstancedMesh.js.map +1 -1
  449. package/lib/scene/MaterialState.d.ts +209 -0
  450. package/lib/scene/MaterialState.js +231 -0
  451. package/lib/scene/MaterialState.js.map +1 -0
  452. package/lib/scene/Mesh.d.ts +4 -6
  453. package/lib/scene/Mesh.js +3 -11
  454. package/lib/scene/Mesh.js.map +1 -1
  455. package/lib/scene/MeshState.d.ts +20 -0
  456. package/lib/scene/MeshState.js +35 -0
  457. package/lib/scene/MeshState.js.map +1 -0
  458. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  459. package/lib/scene/OpenPBRMaterial.js +5 -223
  460. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  461. package/lib/scene/PixelTexture.d.ts +6 -0
  462. package/lib/scene/PixelTexture.js +10 -0
  463. package/lib/scene/PixelTexture.js.map +1 -0
  464. package/lib/scene/ProceduralSky.d.ts +24 -0
  465. package/lib/scene/ProceduralSky.js +40 -0
  466. package/lib/scene/ProceduralSky.js.map +1 -0
  467. package/lib/scene/RectLight.d.ts +2 -13
  468. package/lib/scene/RectLight.js +3 -21
  469. package/lib/scene/RectLight.js.map +1 -1
  470. package/lib/scene/RectLightState.d.ts +31 -0
  471. package/lib/scene/RectLightState.js +26 -0
  472. package/lib/scene/RectLightState.js.map +1 -0
  473. package/lib/scene/Scene.d.ts +15 -4
  474. package/lib/scene/Scene.js.map +1 -1
  475. package/lib/scene/SceneNode.js +7 -6
  476. package/lib/scene/SceneNode.js.map +1 -1
  477. package/lib/scene/Texture.d.ts +10 -41
  478. package/lib/scene/Texture.js +4 -33
  479. package/lib/scene/Texture.js.map +1 -1
  480. package/lib/scene/TextureState.d.ts +35 -0
  481. package/lib/scene/TextureState.js +35 -0
  482. package/lib/scene/TextureState.js.map +1 -0
  483. package/lib/scene/attributeData.d.ts +4 -0
  484. package/lib/scene/attributeData.js +10 -0
  485. package/lib/scene/attributeData.js.map +1 -0
  486. package/lib/scene/lightState.d.ts +8 -0
  487. package/lib/scene/lightState.js +2 -0
  488. package/lib/scene/lightState.js.map +1 -0
  489. package/lib/scene/openPbrSchema.d.ts +7 -12
  490. package/lib/scene/openPbrSchema.js +273 -28
  491. package/lib/scene/openPbrSchema.js.map +1 -1
  492. package/lib/scene/skyParameters.d.ts +20 -0
  493. package/lib/scene/skyParameters.js +28 -0
  494. package/lib/scene/skyParameters.js.map +1 -0
  495. package/lib/scene/textureData.d.ts +9 -0
  496. package/lib/scene/textureData.js +2 -0
  497. package/lib/scene/textureData.js.map +1 -0
  498. package/lib/scene/texturePixels.d.ts +6 -0
  499. package/lib/scene/texturePixels.js +10 -0
  500. package/lib/scene/texturePixels.js.map +1 -0
  501. package/lib/settings/display.d.ts +33 -0
  502. package/lib/settings/display.js +7 -0
  503. package/lib/settings/display.js.map +1 -1
  504. package/lib/settings/render.d.ts +25 -3
  505. package/lib/settings/render.js +3 -1
  506. package/lib/settings/render.js.map +1 -1
  507. package/lib/tinybvh/tinybvh.wasm +0 -0
  508. package/lib/util/commonGeometry.js +7 -7
  509. package/lib/util/commonGeometry.js.map +1 -1
  510. package/lib/util/fromTHREE.d.ts +4 -1
  511. package/lib/util/fromTHREE.js +18 -5
  512. package/lib/util/fromTHREE.js.map +1 -1
  513. package/lib/util/geometry.js +42 -29
  514. package/lib/util/geometry.js.map +1 -1
  515. package/lib/util/loadRGBE.js +3 -4
  516. package/lib/util/loadRGBE.js.map +1 -1
  517. package/lib/util/studioLighting.d.ts +18 -0
  518. package/lib/util/studioLighting.js +36 -0
  519. package/lib/util/studioLighting.js.map +1 -0
  520. package/lib/version.d.ts +1 -1
  521. package/lib/version.js +1 -1
  522. package/lib/version.js.map +1 -1
  523. package/llms.txt +4 -0
  524. package/package.json +31 -5
  525. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  526. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1,42 +1,42 @@
1
1
  // Portions adapted from ray-tracing-renderer@0.10.15
2
2
  // (https://github.com/hoverinc/ray-tracing-renderer).
3
3
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
- import { uvProjectionConstants } from '../../MaterialTable.js';
4
+ import { uvProjectionConstants } from '../../materialConstants.js';
5
5
  import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
6
6
  import pdm_displacementWgsl from './pdm_displacement.wgsl.js';
7
7
  import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
8
8
  const displacementWgsl = pdm_displacementWgsl;
9
9
  const flatIntersectCode = function () {
10
10
  return /* wgsl */ `
11
- let hit = fM(o, d, tri, ey, gQ, tMax);
11
+ let hit = ga(o, d, tri, eq, gY, 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
- eD = normalize(cross(e1, e2));
16
- let kk = i32(ae(bitcast<i32>(ot.z)).x);
17
- let iN = materialsBuffer[kk].doubleSided > 0.5;
18
- if (!doubleSided && !iN && dot(eD, d) > 0.0) {
19
- eD = vec3f(0.0);
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);
20
20
  continue;
21
21
  }
22
22
 
23
23
  tMax = hit.t;
24
- rb = true;
25
- ow = true;
26
- eY = o + tMax * d;
27
- aB = hit.barycentric;
24
+ sj = true;
25
+ pl = true;
26
+ fi = o + tMax * d;
27
+ aC = hit.barycentric;
28
28
  }
29
29
  `;
30
30
  };
31
31
  function getPDMDisplacmentCode(anyHit) {
32
32
  return /*wgsl */ `
33
- let kX = pc(
33
+ let lH = pY(
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
- kJ(displacementMapIndex),
39
+ jO(displacementMapIndex),
40
40
  minH, maxH,
41
41
  hScale,
42
42
  matData.displacementBias,
@@ -44,17 +44,17 @@ matData.displacementStepSize,
44
44
  i32(matData.displacementUvProjection),
45
45
  displacementUvProjectionScale,
46
46
  ${anyHit ? 'true' : 'false'},
47
- lC
47
+ jA
48
48
  );
49
49
  `;
50
50
  }
51
51
  const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
52
52
  return /* wgsl */ `
53
53
 
54
- let hScale = ot.w;
55
- let tA = bitcast<i32>(r3.w);
54
+ let hScale = pi.w;
55
+ let uQ = bitcast<i32>(r3.w);
56
56
 
57
- let materialIndex = i32(ae(bitcast<i32>(ot.z)).x);
57
+ let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
58
58
  let matData = materialsBuffer[materialIndex];
59
59
  let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
60
60
  let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
@@ -64,9 +64,9 @@ 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 && tA > 0) {
68
- let minH = f32(tA >> 8) / 255.0;
69
- let maxH = f32(tA & 0xff) / 255.0;
67
+ if (abs(hScale) > 0.0 && uQ > 0) {
68
+ let minH = f32(uQ >> 8) / 255.0;
69
+ let maxH = f32(uQ & 0xff) / 255.0;
70
70
  let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
71
71
  let displacementMapIndex = i32(matData.displacementMapIndex);
72
72
 
@@ -77,18 +77,18 @@ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
77
77
 
78
78
  ${getPDMDisplacmentCode(anyHit)}
79
79
 
80
- if (kX.t < tMax) {
81
- eD = kX.normal;
80
+ if (lH.t < tMax) {
81
+ eL = lH.normal;
82
82
 
83
83
 
84
- tMax = kX.t;
84
+ tMax = lH.t;
85
85
 
86
- aB = kX.barycentric;
87
- eY = o + tMax * d;
86
+ aC = lH.barycentric;
87
+ fi = o + tMax * d;
88
88
 
89
- bU = true;
90
- rb = true;
91
- ow = true;
89
+ bZ = true;
90
+ sj = true;
91
+ pl = true;
92
92
  }
93
93
  }
94
94
  else {
@@ -97,7 +97,7 @@ ${flatIntersectCode()}
97
97
  `;
98
98
  };
99
99
  const cwbvhTraversalWgsl = /* wgsl */ `
100
- fn bp(value: u32) -> vec4f {
100
+ fn bA(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 kx(value: u32) -> u32 {
115
+ fn lb(value: u32) -> u32 {
116
116
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
117
117
  }
118
118
 
119
- fn nY(value: u32) -> u32 {
119
+ fn oT(value: u32) -> u32 {
120
120
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
121
121
  }
122
122
 
123
- fn ou(
123
+ fn pj(
124
124
  node: i32,
125
- tk: i32,
125
+ uJ: i32,
126
126
  n0: vec4f,
127
127
  o: vec3f,
128
- gE: vec3f,
128
+ gr: vec3f,
129
129
  tMax: f32
130
130
  ) -> u32 {
131
- let i = node + tk;
131
+ let i = node + uJ;
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 rG = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
- let rH = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
- let rI = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
- let hJ = vec3f(
140
- bitcast<f32>(u32(rG + 127) << 23u),
141
- bitcast<f32>(u32(rH + 127) << 23u),
142
- bitcast<f32>(u32(rI + 127) << 23u)
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)
143
143
  );
144
- let bJ = eZ(gE, o);
145
- let eI = (n0.xyz - o) * gE;
146
- let dc = hJ * gE;
147
- let wy = bp(bitcast<u32>(n2.x));
148
- let wB = bp(bitcast<u32>(n2.y));
149
- let wC = bp(bitcast<u32>(n2.z));
150
- let wE = bp(bitcast<u32>(n2.w));
151
- let wF = bp(bitcast<u32>(n3.x));
152
- let wG = bp(bitcast<u32>(n3.y));
153
- let ws = bp(bitcast<u32>(n3.z));
154
- let wt = bp(bitcast<u32>(n3.w));
155
- let wu = bp(bitcast<u32>(n4.x));
156
- let wv = bp(bitcast<u32>(n4.y));
157
- let ww = bp(bitcast<u32>(n4.z));
158
- let wx = bp(bitcast<u32>(n4.w));
159
-
160
- let vp = wy * dc.x + eI.x;
161
- let vs = wC * dc.y + eI.y;
162
- let vu = wF * dc.z + eI.z;
163
- let vj = ws * dc.x + eI.x;
164
- let vl = wu * dc.y + eI.y;
165
- let vn = ww * dc.z + eI.z;
166
- let wI = max(
167
- max((min(vp, vj) - vec4f(bJ.x)), (min(vs, vl) - vec4f(bJ.y))),
168
- (min(vu, vn) - vec4f(bJ.z))
144
+ let padding = fk(gr, o);
145
+ let eS = (n0.xyz - o) * gr;
146
+ let dq = hZ * gr;
147
+
148
+
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);
160
+
161
+ let yl = max(
162
+ max(
163
+ bA(wn.x) * dq.x + eS.x - vec4f(padding.x),
164
+ bA(wo.x) * dq.y + eS.y - vec4f(padding.y)
165
+ ),
166
+ bA(wp.x) * dq.z + eS.z - vec4f(padding.z)
169
167
  );
170
- let wn = min(
171
- min((max(vp, vj) + vec4f(bJ.x)), (max(vs, vl) + vec4f(bJ.y))),
172
- (max(vu, vn) + vec4f(bJ.z))
168
+ let yg = min(
169
+ min(
170
+ bA(xt.x) * dq.x + eS.x + vec4f(padding.x),
171
+ bA(xu.x) * dq.y + eS.y + vec4f(padding.y)
172
+ ),
173
+ bA(xv.x) * dq.z + eS.z + vec4f(padding.z)
173
174
  );
174
-
175
- let vq = wB * dc.x + eI.x;
176
- let vt = wE * dc.y + eI.y;
177
- let vw = wG * dc.z + eI.z;
178
- let vk = wt * dc.x + eI.x;
179
- let vm = wv * dc.y + eI.y;
180
- let vo = wx * dc.z + eI.z;
181
- let wJ = max(
182
- max((min(vq, vk) - vec4f(bJ.x)), (min(vt, vm) - vec4f(bJ.y))),
183
- (min(vw, vo) - vec4f(bJ.z))
175
+ let ym = max(
176
+ max(
177
+ bA(wn.y) * dq.x + eS.x - vec4f(padding.x),
178
+ bA(wo.y) * dq.y + eS.y - vec4f(padding.y)
179
+ ),
180
+ bA(wp.y) * dq.z + eS.z - vec4f(padding.z)
184
181
  );
185
- let wo = min(
186
- min((max(vq, vk) + vec4f(bJ.x)), (max(vt, vm) + vec4f(bJ.y))),
187
- (max(vw, vo) + vec4f(bJ.z))
182
+ let yh = min(
183
+ min(
184
+ bA(xt.y) * dq.x + eS.x + vec4f(padding.x),
185
+ bA(xu.y) * dq.y + eS.y + vec4f(padding.y)
186
+ ),
187
+ bA(xv.y) * dq.z + eS.z + vec4f(padding.z)
188
188
  );
189
189
 
190
- let uK = (wI <= min(wn, vec4f(tMax))) & (wn > vec4f(0.0));
191
- let uL = (wJ <= min(wo, vec4f(tMax))) & (wo > vec4f(0.0));
192
- return select(0u, 1u, uK.x)
193
- | select(0u, 2u, uK.y)
194
- | select(0u, 4u, uK.z)
195
- | select(0u, 8u, uK.w)
196
- | select(0u, 16u, uL.x)
197
- | select(0u, 32u, uL.y)
198
- | select(0u, 64u, uL.z)
199
- | select(0u, 128u, uL.w);
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);
200
200
  }
201
201
 
202
202
  `;
203
203
  function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
204
204
  const intersectTriangles = /* wgsl */ `
205
- let ot = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
206
- let vertexOffset = vec3i(bitcast<i32>(ot.y));
207
- for (var k = 0; k < bh; k++) {
205
+ let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
206
+ let vertexOffset = vec3i(bitcast<i32>(pi.y));
207
+ for (var k = 0; k < primitiveCount; k++) {
208
208
  let triangleIndex = primitiveOffset + k;
209
209
  ${skipTriangleCode}
210
- if (bounces > 0 && triangleIndex == hO) {
210
+ if (bounces > 0 && triangleIndex == fV) {
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 = fB(
216
+ var tri = fP(
217
217
  attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
218
218
  attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
219
219
  attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
220
220
  );
221
- var ow = false;
221
+ var pl = false;
222
222
 
223
223
  ${hasDisplacement
224
224
  ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
225
225
  : flatIntersectCode()}
226
- if (ow) {
226
+ if (pl) {
227
227
  ${handleHitCode}
228
228
  }
229
229
  }
@@ -231,285 +231,285 @@ ${handleHitCode}
231
231
  return /* wgsl */ `
232
232
  var d = ray.d;
233
233
  var o = ray.o;
234
- var lZ: array<i32, TLAS_STACK_SIZE>;
235
- var jh = -1;
236
- var gE = fb(d);
237
- var bU = false;
238
- var rb = false;
239
- var eY: vec3f;
240
- var eD: vec3f;
241
- var aB: vec3f;
242
-
243
-
244
- if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gE, tMax) > 0.0) {
245
- jh = 0;
246
- lZ[0] = 0;
247
- }
248
- while (jh >= 0) {
249
- let sV = lZ[jh];
250
- jh--;
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--;
251
250
  o = ray.o;
252
251
  d = ray.d;
253
- gE = fb(d);
254
-
255
- let wf = bvhBuffer[sV];
256
- let eV = bitcast<i32>(wf.w);
257
- if (eV >= 0) {
258
- let left = sV + 2;
259
- let right = eV;
260
- let d0 = cM(
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(
261
260
  o,
262
261
  bvhBuffer[left].xyz,
263
262
  bvhBuffer[left + 1].xyz,
264
- gE,
263
+ gr,
265
264
  tMax
266
265
  );
267
- let d1 = cM(
266
+ let d1 = cU(
268
267
  o,
269
268
  bvhBuffer[right].xyz,
270
269
  bvhBuffer[right + 1].xyz,
271
- gE,
270
+ gr,
272
271
  tMax
273
272
  );
274
273
 
275
274
  if (d0 > d1) {
276
- if (d0 > 0.0) { jh++; lZ[jh] = left; }
277
- if (d1 > 0.0) { jh++; lZ[jh] = right; }
275
+ if (d0 > 0.0) { jE++; mK[jE] = left; }
276
+ if (d1 > 0.0) { jE++; mK[jE] = right; }
278
277
  }
279
278
  else {
280
- if (d1 > 0.0) { jh++; lZ[jh] = right; }
281
- if (d0 > 0.0) { jh++; lZ[jh] = left; }
279
+ if (d1 > 0.0) { jE++; mK[jE] = right; }
280
+ if (d0 > 0.0) { jE++; mK[jE] = left; }
282
281
  }
283
282
  }
284
283
  else {
285
- let qJ = -eV;
284
+ let rQ = -ff;
286
285
 
287
286
 
288
287
  for (
289
- var mw = qJ - 1;
290
- mw >= 0;
291
- mw--
288
+ var nq = rQ - 1;
289
+ nq >= 0;
290
+ nq--
292
291
  ) {
293
- let pI = bvhBuffer[sV + 2 + mw];
294
- let cf = bitcast<i32>(pI.x);
295
- let uU = bitcast<i32>(pI.y);
296
- let ot = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
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}];
297
296
  let w2l = mat4x4<f32>(
298
- instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
299
- instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
300
- instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 3],
301
- instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 4]
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]
302
301
  );
303
302
  o = (w2l * vec4f(ray.o, 1.0)).xyz;
304
303
  d = (w2l * vec4f(ray.d, 0.0)).xyz;
305
- gE = fb(d);
306
- ey = maxDimension(abs(d));
307
- gQ = mu(d, ey);
304
+ gr = fo(d);
305
+ eq = maxDimension(abs(d));
306
+ gY = nk(d, eq);
308
307
 
309
- let fK = bitcast<u32>(ot.x);
310
- let gS = fK >> 30u;
311
- let blasOffset = i32(fK & 0x3fffffffu);
312
- let bo = rtUniform.blasOffset;
308
+ let fY = bitcast<u32>(pi.x);
309
+ let he = fY >> 30u;
310
+ let blasOffset = i32(fY & 0x3fffffffu);
311
+ let bw = rtUniform.blasOffset;
313
312
 
314
313
  ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
315
- if (gS == 3u) {
314
+ if (he == 3u) {
316
315
 
317
316
 
318
317
 
319
318
 
320
- var sm: array<vec2u, BLAS_STACK_SIZE>;
321
- var pn = -1;
322
- var rX = 0u;
323
- var kZ = 0u;
319
+ var qj = -1;
320
+ var td = 0u;
321
+ var lJ = 0u;
324
322
 
325
- var ep = 0x80000000u;
326
- let ut = select(0u, 4u, d.x < 0.0)
323
+ var eD = 0x80000000u;
324
+ let vU = select(0u, 4u, d.x < 0.0)
327
325
  | select(0u, 2u, d.y < 0.0)
328
326
  | select(0u, 1u, d.z < 0.0);
329
- let ql = 7u - ut;
327
+ let rn = 7u - vU;
330
328
 
331
329
 
332
330
 
333
331
 
334
- while (rX < 4096u) {
335
- rX++;
332
+ while (td < 4096u) {
333
+ td++;
336
334
 
337
- let internalMask = ep & 0xffu;
338
- let qh =
339
- kx(ep >> 24u) + 24u;
340
- ep &= ~(1u << qh);
341
- if ((ep & 0xff000000u) != 0u) {
342
- pn++;
335
+ let internalMask = eD & 0xffu;
336
+ let ri =
337
+ lb(eD >> 24u) + 24u;
338
+ eD &= ~(1u << ri);
339
+ if ((eD & 0xff000000u) != 0u) {
340
+ qj++;
343
341
 
344
- sm[pn] = vec2u(kZ, ep);
342
+ tD[qj] = vec2u(lJ, eD);
345
343
  }
346
344
 
347
- let slot = (qh - 24u) ^ ql;
348
- let nr = (1u << slot) - 1u;
349
- let relativeIndex = countOneBits(internalMask & nr);
350
- let sk = kZ + relativeIndex;
351
- let node = blasOffset + i32(sk * 5u);
352
- let jA = bvhBuffer[node + bo];
353
- let ue = ou(
354
- node, bo, jA, o, gE, tMax
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
355
353
  );
356
354
 
357
355
 
358
- ep = 0u;
359
- if (ue != 0u) {
360
- let fG = bvhBuffer[node + bo + 1];
361
- let rO = bitcast<u32>(jA.w) >> 24u;
362
- var tv = 0u;
363
- var kg = ue;
364
- while (kg != 0u) {
365
- let rC = kx(kg);
366
- kg &= ~(1u << rC);
367
- let sE = select(
368
- bitcast<u32>(fG.z),
369
- bitcast<u32>(fG.w),
370
- rC >= 4u
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
371
369
  );
372
- let td =
373
- (sE >> ((rC & 3u) * 8u)) & 0xffu;
374
- let jC = td & 0x1fu;
375
- let uT = select(
376
- jC,
377
- jC ^ ql,
378
- jC >= 24u
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
379
377
  );
380
- let uO = (td >> 5u) & 0x7u;
381
- tv |= uO << uT;
382
- }
383
-
384
- kZ = bitcast<u32>(fG.x);
385
- ep = (tv & 0xff000000u) | rO;
386
- let oP = bitcast<u32>(fG.y);
387
- var oQ = tv & 0x00ffffffu;
388
- while (oQ != 0u) {
389
- let nS = nY(oQ);
390
- oQ &= ~(1u << nS);
391
- let bh = 1;
392
- let primitiveOffset = bo + blasOffset
393
- + i32(oP + nS);
378
+ let wt = (uB >> 5u) & 0x7u;
379
+ uO |= wt << wK;
380
+ }
381
+
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);
389
+ let primitiveCount = 1;
390
+ let primitiveOffset = bw + blasOffset
391
+ + i32(pM + oO);
394
392
  ${intersectTriangles}
395
393
  }
396
394
  }
397
395
 
398
- if ((ep & 0xff000000u) != 0u) { continue; }
399
- if (pn >= 0) {
400
- let qm = sm[pn];
401
- kZ = qm.x;
402
- ep = qm.y;
403
- pn--;
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--;
404
402
  }
405
403
  else { break; }
406
404
  }
407
405
  }
408
406
  ` : ''}
409
407
 
410
- var gu: array<i32, BLAS_STACK_SIZE>;
411
- var dS = -1;
412
- if (gS != 3u) {
413
- dS = 0;
408
+ var eh = -1;
409
+ if (he != 3u) {
410
+ eh = 0;
414
411
 
415
- gu[0] = uU;
412
+ gJ[0] = wL;
416
413
  }
417
414
 
418
- while (dS >= 0) {
415
+ while (eh >= 0) {
419
416
 
420
- let node = gu[dS];
421
- dS--;
422
- var bh = 0;
417
+ let node = gJ[eh];
418
+ eh--;
419
+ var primitiveCount = 0;
423
420
  var primitiveOffset = 0;
424
421
 
425
422
  ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
426
- if (gS == 2u) {
427
- let i = node + bo;
428
- let uY = bvhBuffer[i];
429
- let uZ = bvhBuffer[i + 1];
430
- let va = bvhBuffer[i + 2];
431
- let vb = bvhBuffer[i + 3];
432
- bh = i32(bitcast<u32>(va.w));
433
- if (bh > 0) {
434
- primitiveOffset = bo + blasOffset
435
- + i32(bitcast<u32>(vb.w));
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));
430
+ if (primitiveCount > 0) {
431
+ primitiveOffset = bw + blasOffset
432
+ + i32(bitcast<u32>(wS.w));
436
433
  }
437
434
  else {
438
- let left = blasOffset + i32(bitcast<u32>(uY.w) * 4u);
439
- let right = blasOffset + i32(bitcast<u32>(uZ.w) * 4u);
440
- let ox = cM(
441
- o, uY.xyz, uZ.xyz, gE, tMax
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
442
439
  );
443
- let nt = cM(
444
- o, va.xyz, vb.xyz, gE, tMax
440
+ let oq = cU(
441
+ o, wR.xyz, wS.xyz, gr, tMax
445
442
  );
446
- if (ox > nt) {
447
- if (ox > 0.0) {
448
- dS++; gu[dS] = left;
443
+ if (pm > oq) {
444
+ if (pm > 0.0) {
445
+ eh++; gJ[eh] = left;
449
446
  }
450
- if (nt > 0.0) {
451
- dS++; gu[dS] = right;
447
+ if (oq > 0.0) {
448
+ eh++; gJ[eh] = right;
452
449
  }
453
450
  }
454
451
  else {
455
- if (nt > 0.0) {
456
- dS++; gu[dS] = right;
452
+ if (oq > 0.0) {
453
+ eh++; gJ[eh] = right;
457
454
  }
458
- if (ox > 0.0) {
459
- dS++; gu[dS] = left;
455
+ if (pm > 0.0) {
456
+ eh++; gJ[eh] = left;
460
457
  }
461
458
  }
462
459
  }
463
460
  }
464
461
  ` : ''}
465
462
  ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
466
- if (gS == 1u) {
467
- let hW = bitcast<u32>(node);
468
- if ((hW & 0x80000000u) != 0u) {
469
- bh = i32((hW >> 23u) & 0xffu);
470
- primitiveOffset = bo + blasOffset
471
- + i32(hW & 0x007fffffu);
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);
472
469
  }
473
470
  else {
474
- let i = node + bo;
475
- let ui = bvhBuffer[i];
476
- let ro = bvhBuffer[i + 1];
477
- let rp = bvhBuffer[i + 2];
478
- let rq = bvhBuffer[i + 3];
479
- let nodeMin = ui.xyz;
480
- let ec = vec3f(ui.w, ro.x, ro.y);
481
- let mg = array<u32, 4>(
482
- bitcast<u32>(ro.z), bitcast<u32>(ro.w),
483
- bitcast<u32>(rp.x), bitcast<u32>(rp.y)
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)
484
481
  );
485
- let rw = unpack4x8unorm(bitcast<u32>(rp.z));
486
- let rA = unpack4x8unorm(bitcast<u32>(rp.w));
487
- let rB = unpack4x8unorm(bitcast<u32>(rq.x));
488
- let rt = unpack4x8unorm(bitcast<u32>(rq.y));
489
- let ru = unpack4x8unorm(bitcast<u32>(rq.z));
490
- let rv = unpack4x8unorm(bitcast<u32>(rq.w));
491
- let tx0 = (nodeMin.x + rw * ec.x - o.x) * gE.x;
492
- let tx1 = (nodeMin.x + rt * ec.x - o.x) * gE.x;
493
- let ty0 = (nodeMin.y + rA * ec.y - o.y) * gE.y;
494
- let ty1 = (nodeMin.y + ru * ec.y - o.y) * gE.y;
495
- let tz0 = (nodeMin.z + rB * ec.z - o.z) * gE.z;
496
- let tz1 = (nodeMin.z + rv * ec.z - o.z) * gE.z;
497
- let bJ = eZ(gE, o);
498
- let mK = max(
499
- max((min(tx0, tx1) - vec4f(bJ.x)), (min(ty0, ty1) - vec4f(bJ.y))),
500
- (min(tz0, tz1) - vec4f(bJ.z))
482
+
483
+
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(
493
+ 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)
496
+ ),
497
+ (nodeMin.z + wp * er.z - o.z) * gr.z - vec4f(padding.z)
501
498
  );
502
- let rU = min(
503
- min((max(tx0, tx1) + vec4f(bJ.x)), (max(ty0, ty1) + vec4f(bJ.y))),
504
- (max(tz0, tz1) + vec4f(bJ.z))
499
+ let sY = min(
500
+ 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)
503
+ ),
504
+ (nodeMin.z + xv * er.z - o.z) * gr.z + vec4f(padding.z)
505
505
  );
506
- var distance = select(rU, mK, mK > vec4f(0.0));
506
+ var distance = select(sY, nJ, nJ > vec4f(0.0));
507
507
  distance = select(
508
508
  distance,
509
509
  vec4f(-1.0),
510
- mK > min(rU, vec4f(tMax))
510
+ nJ > min(sY, vec4f(tMax))
511
511
  );
512
- var fd = array<f32, 4>(
512
+ var fq = array<f32, 4>(
513
513
  distance.x,
514
514
  distance.y,
515
515
  distance.z,
@@ -518,83 +518,83 @@ distance.w
518
518
 
519
519
 
520
520
  for (var order = 0; order < 4; order++) {
521
- var dX = -1.0;
522
- var el = -1;
521
+ var em = -1.0;
522
+ var eB = -1;
523
523
  for (var child = 0; child < 4; child++) {
524
524
  if (
525
- mg[child] != 0u &&
526
- fd[child] > dX
525
+ mT[child] != 0u &&
526
+ fq[child] > em
527
527
  ) {
528
- dX = fd[child];
529
- el = child;
528
+ em = fq[child];
529
+ eB = child;
530
530
  }
531
531
  }
532
- if (el >= 0 && dX > 0.0) {
533
- let nC = mg[el];
534
- var jI = bitcast<i32>(nC);
535
- if ((nC & 0x80000000u) == 0u) {
536
- jI += blasOffset;
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;
537
537
  }
538
- dS++;
539
- gu[dS] = jI;
540
- fd[el] = -1.0;
538
+ eh++;
539
+ gJ[eh] = ki;
540
+ fq[eB] = -1.0;
541
541
  }
542
542
  }
543
543
  }
544
544
  }
545
545
  ` : ''}
546
546
  ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
547
- if (gS == 0u) {
548
- let i = node + bo;
547
+ if (he == 0u) {
548
+ let i = node + bw;
549
549
  let r1 = bvhBuffer[i];
550
- let bb = bitcast<i32>(r1.w);
550
+ let bl = bitcast<i32>(r1.w);
551
551
 
552
- if (bb >= 0) {
552
+ if (bl >= 0) {
553
553
  let left = node + 2;
554
- let right = bb + blasOffset;
555
- let d0 = cM(
554
+ let right = bl + blasOffset;
555
+ let d0 = cU(
556
556
  o,
557
- bvhBuffer[left + bo].xyz,
558
- bvhBuffer[left + 1 + bo].xyz,
559
- gE,
557
+ bvhBuffer[left + bw].xyz,
558
+ bvhBuffer[left + 1 + bw].xyz,
559
+ gr,
560
560
  tMax
561
561
  );
562
- let d1 = cM(
562
+ let d1 = cU(
563
563
  o,
564
- bvhBuffer[right + bo].xyz,
565
- bvhBuffer[right + 1 + bo].xyz,
566
- gE,
564
+ bvhBuffer[right + bw].xyz,
565
+ bvhBuffer[right + 1 + bw].xyz,
566
+ gr,
567
567
  tMax
568
568
  );
569
569
 
570
570
  if (d0 > d1) {
571
571
  if (d0 > 0.0) {
572
- dS++; gu[dS] = left;
572
+ eh++; gJ[eh] = left;
573
573
 
574
574
  }
575
575
  if (d1 > 0.0) {
576
- dS++; gu[dS] = right;
576
+ eh++; gJ[eh] = right;
577
577
 
578
578
  }
579
579
  }
580
580
  else {
581
581
  if (d1 > 0.0) {
582
- dS++; gu[dS] = right;
582
+ eh++; gJ[eh] = right;
583
583
 
584
584
  }
585
585
  if (d0 > 0.0) {
586
- dS++; gu[dS] = left;
586
+ eh++; gJ[eh] = left;
587
587
 
588
588
  }
589
589
  }
590
590
  }
591
591
  else {
592
- bh = -bb;
592
+ primitiveCount = -bl;
593
593
  primitiveOffset = i + 2;
594
594
  }
595
595
  }
596
596
  ` : ''}
597
- if (bh > 0) {
597
+ if (primitiveCount > 0) {
598
598
  ${intersectTriangles}
599
599
  }
600
600
  }
@@ -604,19 +604,221 @@ ${intersectTriangles}
604
604
 
605
605
  `;
606
606
  }
607
- export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1 }) {
607
+ // Raw first-hit contract for native diagnostics. Reuse the same traversal and
608
+ // triangle tests without surface completion or any integrator/alpha sampling.
609
+ export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
610
+ return /* wgsl */ `
611
+ struct rd {
612
+ hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
613
+ }
614
+ fn vW(ray: Ray) -> rd {
615
+ var result: rd;
616
+ result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
617
+ if (rtUniform.isEmpty > 0) { return result; }
618
+ let bounces = 0;
619
+ let doubleSided = false;
620
+ let jA = false;
621
+ let fV = -1;
622
+ var tMax = RAY_MAX_DISTANCE;
623
+ var eq: i32;
624
+ var gY: vec3f;
625
+ ${getBVHTraverseCode(`
626
+ result.hit = true; result.instance = bY; result.record = triangleIndex;
627
+ result.t = tMax; result.barycentric = aC;
628
+ `, false, false, 1, hasAnisotropyDirections)}
629
+ return result;
630
+ }
631
+ `;
632
+ }
633
+ export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
634
+ return /* wgsl */ `
635
+ fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jA: bool) {
636
+
637
+ (*si).hit = false;
638
+
639
+ if (rtUniform.isEmpty > 0) {
640
+ return;
641
+ }
642
+
643
+ var tMax = RAY_MAX_DISTANCE;
644
+ var eq: i32;
645
+ var gY: vec3f;
646
+
647
+ var hK: vec3i;
648
+ var mk: fP;
649
+ var ap: i32;
650
+ var fV: i32 = (*si).triangleIndex;
651
+
652
+ ${getBVHTraverseCode(`
653
+ (*si).triangleIndex = triangleIndex;
654
+ mk = tri;
655
+ hK = index;
656
+ ap = bY;
657
+ `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
658
+
659
+ ${closestHitHook} if (sj) {
660
+ mV(
661
+ si,
662
+ mk,
663
+ aC,
664
+ hK,
665
+ bZ,
666
+ ap,
667
+ eL,
668
+ fi,
669
+ -1
670
+ );
671
+ }
672
+ }
673
+
674
+
675
+ fn ${bevelName}(ray: Ray, si: ptr<function, SurfaceInteraction>, instanceIndex: i32, maxDistance: f32) {
676
+ (*si).hit = false;
677
+
678
+ if (rtUniform.isEmpty > 0) {
679
+ return;
680
+ }
681
+
682
+ let bounces = 0;
683
+ let doubleSided = true;
684
+ let jA = false;
685
+ 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;
692
+
693
+ ${getBVHTraverseCode(`
694
+ (*si).triangleIndex = triangleIndex;
695
+ mk = tri;
696
+ hK = index;
697
+ ap = bY;
698
+ `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
699
+ if (bY != instanceIndex) {
700
+ continue;
701
+ }
702
+ `)}
703
+
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(
710
+ si,
711
+ mk,
712
+ aC,
713
+ hK,
714
+ bZ,
715
+ -1
716
+ );
717
+
718
+ 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]
723
+ );
724
+ 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]
729
+ );
730
+ let aH = transpose(mat3x3<f32>(
731
+ w2l[0].xyz,
732
+ w2l[1].xyz,
733
+ w2l[2].xyz
734
+ ));
735
+ (*si).faceNormal = normalize(aH * eL);
736
+ (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
737
+ (*si).normal = normalize(aH * (*si).normal);
738
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
739
+ if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
740
+ (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
741
+ }
742
+ ${hasAnisotropyDirections ? /* wgsl */ `
743
+ (*si).directionTangent = (l2w * vec4f((*si).directionTangent, 0.0)).xyz;
744
+ (*si).directionBitangent = (l2w * vec4f((*si).directionBitangent, 0.0)).xyz;
745
+ (*si).geometryTangent = (l2w * vec4f((*si).geometryTangent, 0.0)).xyz;
746
+ (*si).geometryBitangent = (l2w * vec4f((*si).geometryBitangent, 0.0)).xyz;
747
+ ` : /* wgsl */ ``}
748
+ (*si).shadowOffset = (l2w * vec4f((*si).shadowOffset, 0.0)).xyz;
749
+ (*si).position = (l2w * vec4((*si).position, 1.0)).xyz;
750
+ }
751
+ }
752
+
753
+ fn ${shadowName}(ray: Ray, lightDistance: f32, kn: i32) -> bool {
754
+ if (rtUniform.isEmpty > 0) {
755
+ return false;
756
+ }
757
+
758
+ 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;
763
+
764
+ let bounces = 1;
765
+ var jA = false;
766
+ var fV: i32 = kn;
767
+
768
+ ${getBVHTraverseCode(
769
+ /*wgsl */ `
770
+
771
+
772
+
773
+ var jS = true;
774
+
775
+ if (jS) {
776
+ if (HAS_ALPHA) {
777
+ let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
778
+ if (!oC(
779
+ materialIndex,
780
+ index,
781
+ aC,
782
+ fi,
783
+ eL
784
+ )) {
785
+
786
+ tMax = rq;
787
+ jS = false;
788
+ }
789
+ }
790
+ }
791
+ if (jS) {
792
+ return true;
793
+ }
794
+ `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
795
+
796
+ return false;
797
+ }
798
+
799
+ `;
800
+ }
801
+ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
608
802
  return /*wgsl*/ `
609
803
 
804
+
805
+
806
+
807
+
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>;` : ''}
811
+
610
812
  ${hasDisplacement ? displacementWgsl : ''}
611
813
  ${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
612
814
 
613
- struct fB {
815
+ struct fP {
614
816
  p0: vec3f,
615
817
  p1: vec3f,
616
818
  p2: vec3f,
617
819
  };
618
820
 
619
- fn hx(rad: f32, pos: vec3f, r: Ray) -> f32 {
821
+ fn hL(rad: f32, pos: vec3f, r: Ray) -> f32 {
620
822
  let op: vec3f = pos - r.o;
621
823
  let eps: f32 = 0.001;
622
824
  let b: f32 = dot(op, r.d);
@@ -639,7 +841,7 @@ return t2;
639
841
  return INF;
640
842
  }
641
843
 
642
- fn nh(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
844
+ fn og(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
643
845
  let dt: f32 = dot(r.d, n);
644
846
  let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
645
847
 
@@ -659,14 +861,14 @@ return INF;
659
861
  }
660
862
 
661
863
  fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
662
- let aj = distance(origin, center);
663
- if (aj <= radius) { return INV4PI; }
664
- let jv = min(1.0, radius * radius / (aj * aj));
665
- let cosThetaMax = sqrt(max(0.0, 1.0 - jv));
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));
666
868
  return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
667
869
  }
668
870
 
669
- fn my(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
871
+ fn nr(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
670
872
 
671
873
 
672
874
  var d: f32 = INF;
@@ -678,9 +880,9 @@ var d: f32 = INF;
678
880
  (*lightSample).isDelta = false;
679
881
  var u = light.u;
680
882
  var v = light.v;
681
- var dP = i32(light.litType);
883
+ var ec = i32(light.litType);
682
884
 
683
- if (dP == RECT_LIGHT) {
885
+ if (HAS_SCENE_RECT_LIGHT && ec == RECT_LIGHT) {
684
886
 
685
887
  var pos = light.position - u * 0.5 - v * 0.5;
686
888
  var normal = normalize(cross(u, v));
@@ -688,18 +890,18 @@ if (dot(normal, r.d) > 0.0) {
688
890
  return INF;
689
891
  }
690
892
 
691
- d = nh(pos, u, v, normal, r);
893
+ d = og(pos, u, v, normal, r);
692
894
  if (d < 0.0) {
693
895
  d = INF;
694
896
  }
695
897
  else {
696
- var cc: f32 = dot(-r.d, normal);
898
+ var ci: f32 = dot(-r.d, normal);
697
899
  let spread = light.radiusOrSpread;
698
- if (cc >= cos(spread * PI / 2.0)) {
900
+ if (ci >= cos(spread * PI / 2.0)) {
699
901
  (*lightSample).direction = r.d;
700
902
  (*lightSample).normal = normal;
701
903
  (*lightSample).dist = d;
702
- (*lightSample).pdf = (d * d) / (light.area * cc);
904
+ (*lightSample).pdf = (d * d) / (light.area * ci);
703
905
  (*lightSample).emission = light.emission;
704
906
  (*lightSample).isDelta = false;
705
907
  }
@@ -709,12 +911,12 @@ d = INF;
709
911
  }
710
912
  }
711
913
 
712
- else if (dP == SPHERE_LIGHT) {
914
+ else if (HAS_SCENE_SPHERE_LIGHT && ec == SPHERE_LIGHT) {
713
915
  if (light.radiusOrSpread <= 0.0) {
714
- let ko = light.position - r.o;
715
- let projection = dot(ko, r.d);
716
- let ba = ko - projection * r.d;
717
- if (projection <= EPS || dot(ba, ba) > 1e-8) {
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) {
718
920
  return INF;
719
921
  }
720
922
  d = projection;
@@ -725,7 +927,7 @@ d = projection;
725
927
  (*lightSample).isDelta = true;
726
928
  }
727
929
  else {
728
- d = hx(light.radiusOrSpread, light.position, r);
930
+ d = hL(light.radiusOrSpread, light.position, r);
729
931
  (*lightSample).isDelta = false;
730
932
  if (d > 0.0 && d != INF) {
731
933
  (*lightSample).direction = r.d;
@@ -754,12 +956,12 @@ light.radiusOrSpread <= 0.0
754
956
  }
755
957
  }
756
958
 
757
- else if (dP == SPOT_LIGHT) {
959
+ else if (HAS_SCENE_SPOT_LIGHT && ec == SPOT_LIGHT) {
758
960
  if (light.radiusOrSpread <= 0.0) {
759
- let ko = light.position - r.o;
760
- let projection = dot(ko, r.d);
761
- let ba = ko - projection * r.d;
762
- if (projection <= EPS || dot(ba, ba) > 1e-8) {
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) {
763
965
  return INF;
764
966
  }
765
967
  d = projection;
@@ -770,13 +972,13 @@ d = projection;
770
972
  (*lightSample).isDelta = true;
771
973
  }
772
974
  else {
773
- d = hx(light.radiusOrSpread, light.position, r);
975
+ d = hL(light.radiusOrSpread, light.position, r);
774
976
  (*lightSample).isDelta = false;
775
977
  }
776
978
  if (d != INF) {
777
- let ve = r.o + d * r.d;
778
- let mB = bL(light, normalize(r.o - ve));
779
- if (mB <= 0.0) { return 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; }
780
982
  if (light.radiusOrSpread > 0.0) {
781
983
  (*lightSample).direction = r.d;
782
984
  (*lightSample).dist = d;
@@ -785,7 +987,7 @@ r.o + r.d * d - light.position
785
987
  );
786
988
  (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
787
989
  }
788
- (*lightSample).emission = light.emission * mB * select(
990
+ (*lightSample).emission = light.emission * nv * select(
789
991
  1.0,
790
992
  1.0 / max(d * d, 1e-8),
791
993
  light.radiusOrSpread <= 0.0
@@ -793,7 +995,7 @@ light.radiusOrSpread <= 0.0
793
995
  }
794
996
  }
795
997
 
796
- else if (dP != RECT_LIGHT && dP != SPHERE_LIGHT && dP != SPOT_LIGHT) {
998
+ else if (ec != RECT_LIGHT && ec != SPHERE_LIGHT && ec != SPOT_LIGHT) {
797
999
 
798
1000
  d = INF;
799
1001
  }
@@ -801,111 +1003,111 @@ d = INF;
801
1003
  return d;
802
1004
  }
803
1005
 
804
- fn fm(m0: vec3i, m1: vec3i, m2: vec3i, eK: vec3f) -> i32 {
805
- let m00 = ae(m0.x);
806
- let m01 = ae(m0.y);
807
- let m02 = ae(m0.z);
808
- let m10 = ae(m1.x);
809
- let m11 = ae(m1.y);
810
- let m12 = ae(m1.z);
811
- let m20 = ae(m2.x);
812
- let m21 = ae(m2.y);
813
- let m22 = ae(m2.z);
814
- var w00 = m00.y * eK.x;
815
- var w01 = m01.y * eK.x;
816
- var w02 = m02.y * eK.x;
817
- var w10 = m10.y * eK.y;
818
- var w11 = m11.y * eK.y;
819
- var w12 = m12.y * eK.y;
820
- var w20 = m20.y * eK.z;
821
- var w21 = m21.y * eK.z;
822
- var w22 = m22.y * eK.z;
823
-
824
- var hk = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
825
-
826
- w00 = w00 / hk;
827
- w01 = w01 / hk + w00;
828
- w02 = w02 / hk + w01;
829
- w10 = w10 / hk + w02;
830
- w11 = w11 / hk + w10;
831
- w12 = w12 / hk + w11;
832
- w20 = w20 / hk + w12;
833
- w21 = w21 / hk + w20;
834
- w22 = w22 / hk + w21;
835
-
836
- let rand = eo(0u);
837
- var ni: f32;
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;
838
1040
  if (rand < w00) {
839
- ni = m00.x;
1041
+ oh = m00.x;
840
1042
  } else if (rand < w01) {
841
- ni = m01.x;
1043
+ oh = m01.x;
842
1044
  } else if (rand < w02) {
843
- ni = m02.x;
1045
+ oh = m02.x;
844
1046
  } else if (rand < w10) {
845
- ni = m10.x;
1047
+ oh = m10.x;
846
1048
  } else if (rand < w11) {
847
- ni = m11.x;
1049
+ oh = m11.x;
848
1050
  } else if (rand < w12) {
849
- ni = m12.x;
1051
+ oh = m12.x;
850
1052
  } else if (rand < w20) {
851
- ni = m20.x;
1053
+ oh = m20.x;
852
1054
  } else if (rand < w21) {
853
- ni = m21.x;
1055
+ oh = m21.x;
854
1056
  } else {
855
- ni = m22.x;
1057
+ oh = m22.x;
856
1058
  }
857
- return i32(ni);
1059
+ return i32(oh);
858
1060
  }
859
1061
 
860
- fn lV(
861
- pa: i32,
1062
+ fn mF(
1063
+ pW: i32,
862
1064
  index: vec3i,
863
- eK: vec3f
1065
+ eU: vec3f
864
1066
  ) -> i32 {
865
1067
  let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
866
1068
  let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
867
1069
  let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
868
1070
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
869
- return fm(m0, m1, m2, eK);
1071
+ return fF(m0, m1, m2, eU);
870
1072
  }
871
- return pa;
1073
+ return pW;
872
1074
  }
873
1075
 
874
1076
 
875
1077
 
876
1078
  ${hasAnisotropyDirections ? /* wgsl */ `
877
- fn eE(normal: vec3f, dp1: vec3f, dp2: vec3f, oc: vec2f, od: vec2f, input: vec4f) -> mat2x3f {
878
- let determinant = oc.x * od.y - oc.y * od.x;
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;
879
1081
  var t = input.xyz;
880
1082
  var b = vec3f(0.0);
881
1083
 
882
1084
  var sign = select(input.w, 0.0, abs(input.w) > 1.5);
883
1085
  if (abs(determinant) > 1e-12) {
884
- let dt = (dp1 * od.y - dp2 * oc.y) / determinant;
885
- let db = (dp2 * oc.x - dp1 * od.x) / determinant;
1086
+ let dt = (dp1 * oX.y - dp2 * oW.y) / determinant;
1087
+ let db = (dp2 * oW.x - dp1 * oX.x) / determinant;
886
1088
  if (dot(t, t) < 1e-8) { t = dt; }
887
1089
  if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
888
1090
  }
889
1091
  t -= normal * dot(normal, t);
890
1092
  if (dot(t, t) < 1e-8) {
891
- let ik = select(-1.0, 1.0, normal.z >= 0.0);
892
- let dW = -1.0 / (ik + normal.z);
893
- let xy = normal.x * normal.y * dW;
894
- t = vec3f(1.0 + ik * normal.x * normal.x * dW, ik * xy, -ik * normal.x);
895
- b = vec3f(xy, ik + normal.y * normal.y * dW, -normal.y);
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);
896
1098
  }
897
1099
  else { t = normalize(t); b = normalize(cross(normal, t)); }
898
1100
  return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
899
1101
  }
900
1102
 
901
1103
  ` : /* wgsl */ ``}
902
- fn ht(
903
- si: ptr<function, ad>,
904
- tri: fB,
905
- eK: vec3f,
1104
+ fn hH(
1105
+ si: ptr<function, SurfaceInteraction>,
1106
+ tri: fP,
1107
+ eU: vec3f,
906
1108
  index: vec3i,
907
- bU: bool,
908
- fw: i32
1109
+ bZ: bool,
1110
+ fM: i32
909
1111
  ) {
910
1112
  (*si).hit = true;
911
1113
 
@@ -917,26 +1119,26 @@ let i1 = index.y;
917
1119
  let i2 = index.z;
918
1120
  (*si).vertexColor = vec3f(1.0);
919
1121
  if (USE_VERTEX_COLOR) {
920
- (*si).vertexColor = eK.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
921
- + eK.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
922
- + eK.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
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;
923
1125
  }
924
- let oY = uvProjection == ${uvProjectionConstants.spherical};
1126
+ let pU = uvProjection == ${uvProjectionConstants.spherical};
925
1127
 
926
1128
  var normal: vec3f = (*si).normal;
927
- var ha: vec3f;
1129
+ var hq: vec3f;
928
1130
  var n0 = vec3f(0.0);
929
1131
  var n1 = vec3f(0.0);
930
1132
  var n2 = vec3f(0.0);
931
1133
 
932
1134
 
933
- if (!bU || oY) {
1135
+ if (!bZ || pU) {
934
1136
  n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
935
1137
  n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
936
1138
  n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
937
- ha = normalize(eK.x * n0 + eK.y * n1 + eK.z * n2);
938
- if (!bU) {
939
- normal = ha;
1139
+ hq = normalize(eU.x * n0 + eU.y * n1 + eU.z * n2);
1140
+ if (!bZ) {
1141
+ normal = hq;
940
1142
  }
941
1143
  }
942
1144
 
@@ -944,19 +1146,19 @@ var uv: vec2f;
944
1146
  var uv0: vec2f;
945
1147
  var uv1: vec2f;
946
1148
  var uv2: vec2f;
947
- var cX = vec2f(0.0);
1149
+ var dj = vec2f(0.0);
948
1150
  if (USE_UV) {
949
1151
  uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
950
1152
  uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
951
1153
  uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
952
- uv = eK.x * uv0 + eK.y * uv1 + eK.z * uv2;
1154
+ uv = eU.x * uv0 + eU.y * uv1 + eU.z * uv2;
953
1155
  if (USE_UV1) {
954
1156
  let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
955
1157
  let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
956
1158
  let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
957
- cX = eK.x * secondaryUv0
958
- + eK.y * secondaryUv1
959
- + eK.z * secondaryUv2;
1159
+ dj = eU.x * secondaryUv0
1160
+ + eU.y * secondaryUv1
1161
+ + eU.z * secondaryUv2;
960
1162
  }
961
1163
  }
962
1164
 
@@ -964,28 +1166,28 @@ if (USE_TANGENT) {
964
1166
  let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
965
1167
  let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
966
1168
  let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
967
- (*si).tangent = normalize(eK.x * t0 + eK.y * t1 + eK.z * t2);
1169
+ (*si).tangent = normalize(eU.x * t0 + eU.y * t1 + eU.z * t2);
968
1170
  }
969
1171
 
970
- if (fw >= 0) {
971
- (*si).materialIndex = fw;
1172
+ if (fM >= 0) {
1173
+ (*si).materialIndex = fM;
972
1174
  }
973
1175
  else {
974
- (*si).materialIndex = lV(
1176
+ (*si).materialIndex = mF(
975
1177
  (*si).materialIndex,
976
1178
  index,
977
- eK
1179
+ eU
978
1180
  );
979
1181
  }
980
1182
 
981
1183
  if (uvProjection > 0) {
982
1184
 
983
- uv = gI(uvProjection, (*si).position, select(normal, ha, oY));
984
- cX = uv;
1185
+ uv = gU(uvProjection, (*si).position, select(normal, hq, pU));
1186
+ dj = uv;
985
1187
  }
986
1188
 
987
1189
  uv = uv * material.uvScale;
988
- cX = cX * material.uvScale;
1190
+ dj = dj * material.uvScale;
989
1191
 
990
1192
 
991
1193
  if (uvProjection == ${uvProjectionConstants.triplanar}) {
@@ -998,41 +1200,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
998
1200
  if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
999
1201
  let dp1 = tri.p0 - tri.p2;
1000
1202
  let dp2 = tri.p1 - tri.p2;
1001
- var aT = vec4f(0.0);
1203
+ var aX = vec4f(0.0);
1002
1204
  if (USE_TANGENT) {
1003
- aT = eK.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
1004
- + eK.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
1005
- + eK.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1006
- }
1007
- let eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
1008
- (*si).geometryTangent = eS[0];
1009
- (*si).geometryBitangent = eS[1];
1010
- var fZ = eS;
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;
1011
1213
  if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
1012
1214
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1013
1215
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1014
1216
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1015
- fZ = eE(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
1217
+ gm = eP(normal, dp1, dp2, a-c, b-c, select(aX, vec4f(0.0), aX.w == 0.0));
1016
1218
  }
1017
- (*si).directionTangent = fZ[0];
1018
- (*si).directionBitangent = fZ[1];
1219
+ (*si).directionTangent = gm[0];
1220
+ (*si).directionBitangent = gm[1];
1019
1221
  ${hasCoatNormals ? /* wgsl */ `
1020
1222
  if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1021
- let kC = i32(directionMaterial.coatNormalMapIndex);
1022
- var mh = eS;
1023
- if (USE_UV1 && mapInfo[kC + NUM_MAPS * 2].x > 0.5) {
1223
+ let lg = i32(directionMaterial.coatNormalMapIndex);
1224
+ var mU = fc;
1225
+ if (USE_UV1 && mapInfo[lg + NUM_MAPS * 2].x > 0.5) {
1024
1226
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1025
1227
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1026
1228
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1027
- mh = eE(normal, dp1, dp2, a-c, b-c,
1028
- select(aT, vec4f(0.0), aT.w == 0.0));
1229
+ mU = eP(normal, dp1, dp2, a-c, b-c,
1230
+ select(aX, vec4f(0.0), aX.w == 0.0));
1029
1231
  }
1030
1232
 
1031
1233
 
1032
- let decoded = sampleMap(kC, getMapUvSet(kC, uv,
1033
- select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1034
- let mapped = mh[0] * decoded.x * directionMaterial.coatNormalScale.x
1035
- + mh[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
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;
1036
1238
  if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1037
1239
  }
1038
1240
  ` : ''}
@@ -1042,19 +1244,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1042
1244
  (*si).normal = normal;
1043
1245
  (*si).vertexNormal = normal;
1044
1246
  (*si).shadowOffset = vec3f(0.0);
1045
- if (!bU) {
1247
+ if (!bZ) {
1046
1248
 
1047
1249
 
1048
1250
 
1049
1251
  let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1050
- let km = eK.x * n0 + eK.y * n1 + eK.z * n2;
1252
+ let kR = eU.x * n0 + eU.y * n1 + eU.z * n2;
1051
1253
  let a = dot(n2 - n0, tri.p0 - tri.p2);
1052
1254
  let b = dot(n2 - n1, tri.p1 - tri.p2);
1053
1255
  let c = dot(n1 - n0, tri.p1 - tri.p0);
1054
- var h = a * eK.x * (eK.x - 1.0)
1055
- + (a + b + c) * eK.x * eK.y
1056
- + b * eK.y * (eK.y - 1.0);
1057
- if (dot(km, geometricNormal) > 0.0) {
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) {
1058
1260
  var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1059
1261
  var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1060
1262
  var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -1072,22 +1274,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1072
1274
  h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1073
1275
  h = min(-min(min(h0, h1), h2), h * 0.5);
1074
1276
  }
1075
- (*si).shadowOffset = km * h;
1277
+ (*si).shadowOffset = kR * h;
1076
1278
  }
1077
1279
  (*si).uv = uv;
1078
- (*si).uv1 = cX;
1280
+ (*si).uv1 = dj;
1079
1281
  if (USE_NORMAL_MAPS) {
1080
1282
  let dp1 = tri.p0 - tri.p2;
1081
1283
  let dp2 = tri.p1 - tri.p2;
1082
- let oc = uv0 - uv2;
1083
- let od = uv1 - uv2;
1084
- (*si).normal = ol(
1085
- (*si).materialIndex, uv, normal, dp1, dp2, oc, od
1284
+ let oW = uv0 - uv2;
1285
+ let oX = uv1 - uv2;
1286
+ (*si).normal = pd(
1287
+ (*si).materialIndex, uv, normal, dp1, dp2, oW, oX
1086
1288
  );
1087
1289
  }
1088
1290
  }
1089
1291
 
1090
- struct eC {
1292
+ struct eK {
1091
1293
  t: f32,
1092
1294
  barycentric: vec3f,
1093
1295
  };
@@ -1096,8 +1298,8 @@ barycentric: vec3f,
1096
1298
 
1097
1299
 
1098
1300
 
1099
- fn fM(o: vec3f, d: vec3f, tri: fB, ey: i32, gQ: vec3f, tMax: f32) -> eC {
1100
- var ti: eC;
1301
+ fn ga(o: vec3f, d: vec3f, tri: fP, eq: i32, gY: vec3f, tMax: f32) -> eK {
1302
+ var ti: eK;
1101
1303
 
1102
1304
 
1103
1305
  var p0t = tri.p0 - o;
@@ -1105,11 +1307,11 @@ var p1t = tri.p1 - o;
1105
1307
  var p2t = tri.p2 - o;
1106
1308
 
1107
1309
 
1108
- if (ey == 0) {
1310
+ if (eq == 0) {
1109
1311
  p0t = p0t.yzx;
1110
1312
  p1t = p1t.yzx;
1111
1313
  p2t = p2t.yzx;
1112
- } else if (ey == 1) {
1314
+ } else if (eq == 1) {
1113
1315
  p0t = p0t.zxy;
1114
1316
  p1t = p1t.zxy;
1115
1317
  p2t = p2t.zxy;
@@ -1117,9 +1319,9 @@ p2t = p2t.zxy;
1117
1319
 
1118
1320
 
1119
1321
 
1120
- p0t = vec3f(p0t.xy + gQ.xy * p0t.z, p0t.z);
1121
- p1t = vec3f(p1t.xy + gQ.xy * p1t.z, p1t.z);
1122
- p2t = vec3f(p2t.xy + gQ.xy * p2t.z, p2t.z);
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);
1123
1325
 
1124
1326
 
1125
1327
  var e = vec3f(
@@ -1131,9 +1333,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
1131
1333
  if (DEPTH_QUERY_MODE) {
1132
1334
 
1133
1335
 
1134
- let rE = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1336
+ let sF = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1135
1337
  + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1136
- e = select(e, vec3f(0.0), abs(e) <= rE * 1e-6);
1338
+ e = select(e, vec3f(0.0), abs(e) <= sF * 1e-6);
1137
1339
  }
1138
1340
 
1139
1341
 
@@ -1144,19 +1346,19 @@ return ti;
1144
1346
  let det = e.x + e.y + e.z;
1145
1347
  if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1146
1348
 
1147
- p0t.z *= gQ.z;
1148
- p1t.z *= gQ.z;
1149
- p2t.z *= gQ.z;
1150
- let rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
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);
1151
1353
 
1152
1354
 
1153
- if (abs(rn) > abs(tMax * det)) {
1355
+ if (abs(sw) > abs(tMax * det)) {
1154
1356
  return ti;
1155
1357
  }
1156
1358
 
1157
- let sw = 1. / det;
1158
- ti.t = rn * sw;
1159
- ti.barycentric = e * sw;
1359
+ let tN = 1. / det;
1360
+ ti.t = sw * tN;
1361
+ ti.barycentric = e * tN;
1160
1362
 
1161
1363
  return ti;
1162
1364
  }
@@ -1166,26 +1368,26 @@ return ti;
1166
1368
 
1167
1369
  override DEPTH_QUERY_MODE: bool = false;
1168
1370
 
1169
- fn fb(d: vec3f) -> vec3f {
1371
+ fn fo(d: vec3f) -> vec3f {
1170
1372
  if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1171
1373
  return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1172
1374
  }
1173
1375
 
1174
- fn eZ(gE: vec3f, o: vec3f) -> vec3f {
1376
+ fn fk(gr: vec3f, o: vec3f) -> vec3f {
1175
1377
  if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1176
- return abs(gE) * max(vec3f(1.0), abs(o)) * 1e-6;
1378
+ return abs(gr) * max(vec3f(1.0), abs(o)) * 1e-6;
1177
1379
  }
1178
1380
 
1179
1381
 
1180
1382
 
1181
- fn cM(o: vec3f, vK: vec3f, vJ: vec3f, gE: vec3f, tMax: f32) -> f32 {
1182
- let uR = (vK - o) * gE;
1183
- let uS = (vJ - o) * gE;
1184
- let bJ = eZ(gE, o);
1185
- let mK = min(uR, uS) - bJ;
1186
- let rU = max(uR, uS) + bJ;
1187
- let t0 = max(mK.x, max(mK.y, mK.z));
1188
- let t1 = min(rU.x, min(rU.y, rU.z));
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));
1189
1391
  return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1190
1392
  }
1191
1393
 
@@ -1193,69 +1395,69 @@ fn maxDimension(v: vec3f) -> i32 {
1193
1395
  return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1194
1396
  }
1195
1397
 
1196
- fn mu(d: vec3f, ey: i32) -> vec3f {
1398
+ fn nk(d: vec3f, eq: i32) -> vec3f {
1197
1399
 
1198
1400
 
1199
- if (ey == 0) {
1401
+ if (eq == 0) {
1200
1402
  return vec3f(-d.y, -d.z, 1.0) / d.x;
1201
- } else if (ey == 1) {
1403
+ } else if (eq == 1) {
1202
1404
  return vec3f(-d.z, -d.x, 1.0) / d.y;
1203
1405
  } else {
1204
1406
  return vec3f(-d.x, -d.y, 1.0) / d.z;
1205
1407
  }
1206
1408
  }
1207
1409
 
1208
- fn mi(
1209
- si: ptr<function, ad>,
1210
- lB: fB,
1211
- aB: vec3f,
1212
- hw: vec3i,
1213
- bU: bool,
1214
- ao: i32,
1215
- eD: vec3f,
1216
- eY: vec3f,
1217
- fw: i32
1410
+ fn mV(
1411
+ 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
1218
1420
  ) {
1219
- (*si).instanceIndex = ao;
1220
- (*si).barycentrics = aB.xy;
1221
- (*si).normal = eD;
1222
- (*si).position = eY;
1223
- (*si).materialIndex = i32(ae(
1224
- bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
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)
1225
1427
  ).x);
1226
1428
 
1227
1429
 
1228
- ht(
1430
+ hH(
1229
1431
  si,
1230
- lB,
1231
- aB,
1232
- hw,
1233
- bU,
1234
- fw
1432
+ mk,
1433
+ aC,
1434
+ hK,
1435
+ bZ,
1436
+ fM
1235
1437
  );
1236
1438
 
1237
1439
  let l2w = mat4x4<f32>(
1238
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 5],
1239
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 6],
1240
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 7],
1241
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 8]
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]
1242
1444
  );
1243
1445
  let w2l = mat4x4<f32>(
1244
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 1],
1245
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 2],
1246
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 3],
1247
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 4]
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]
1248
1450
  );
1249
- let aD = transpose(mat3x3<f32>(
1451
+ let aH = transpose(mat3x3<f32>(
1250
1452
  w2l[0].xyz,
1251
1453
  w2l[1].xyz,
1252
1454
  w2l[2].xyz
1253
1455
  ));
1254
1456
 
1255
- (*si).faceNormal = normalize(aD * eD);
1256
- (*si).vertexNormal = normalize(aD * (*si).vertexNormal);
1257
- (*si).normal = normalize(aD * (*si).normal);
1258
- ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
1457
+ (*si).faceNormal = normalize(aH * eL);
1458
+ (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
1459
+ (*si).normal = normalize(aH * (*si).normal);
1460
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
1259
1461
  if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
1260
1462
  (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
1261
1463
  }
@@ -1274,171 +1476,6 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
1274
1476
 
1275
1477
 
1276
1478
 
1277
-
1278
- fn cZ(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lC: bool) {
1279
-
1280
- (*si).hit = false;
1281
-
1282
- if (rtUniform.isEmpty > 0) {
1283
- return;
1284
- }
1285
-
1286
- var tMax = RAY_MAX_DISTANCE;
1287
- var ey: i32;
1288
- var gQ: vec3f;
1289
-
1290
- var hw: vec3i;
1291
- var lB: fB;
1292
- var ao: i32;
1293
- var hO: i32 = (*si).triangleIndex;
1294
-
1295
- ${getBVHTraverseCode(`
1296
- (*si).triangleIndex = triangleIndex;
1297
- lB = tri;
1298
- hw = index;
1299
- ao = cf;
1300
- `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
1301
-
1302
- if (rb) {
1303
- mi(
1304
- si,
1305
- lB,
1306
- aB,
1307
- hw,
1308
- bU,
1309
- ao,
1310
- eD,
1311
- eY,
1312
- -1
1313
- );
1314
- }
1315
- }
1316
-
1317
-
1318
- fn iM(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
1319
- (*si).hit = false;
1320
-
1321
- if (rtUniform.isEmpty > 0) {
1322
- return;
1323
- }
1324
-
1325
- let bounces = 0;
1326
- let doubleSided = true;
1327
- let lC = false;
1328
- var tMax = maxDistance;
1329
- var ey: i32;
1330
- var gQ: vec3f;
1331
- var hw: vec3i;
1332
- var lB: fB;
1333
- var ao: i32;
1334
- var hO: i32 = -1;
1335
-
1336
- ${getBVHTraverseCode(`
1337
- (*si).triangleIndex = triangleIndex;
1338
- lB = tri;
1339
- hw = index;
1340
- ao = cf;
1341
- `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
1342
- if (cf != instanceIndex) {
1343
- continue;
1344
- }
1345
- `)}
1346
-
1347
- if (rb) {
1348
- (*si).instanceIndex = ao;
1349
- (*si).normal = eD;
1350
- (*si).position = eY;
1351
- (*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
1352
- ht(
1353
- si,
1354
- lB,
1355
- aB,
1356
- hw,
1357
- bU,
1358
- -1
1359
- );
1360
-
1361
- let l2w = mat4x4<f32>(
1362
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 5],
1363
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 6],
1364
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 7],
1365
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 8]
1366
- );
1367
- let w2l = mat4x4<f32>(
1368
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 1],
1369
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 2],
1370
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 3],
1371
- instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE} + 4]
1372
- );
1373
- let aD = transpose(mat3x3<f32>(
1374
- w2l[0].xyz,
1375
- w2l[1].xyz,
1376
- w2l[2].xyz
1377
- ));
1378
- (*si).faceNormal = normalize(aD * eD);
1379
- (*si).vertexNormal = normalize(aD * (*si).vertexNormal);
1380
- (*si).normal = normalize(aD * (*si).normal);
1381
- ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
1382
- if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
1383
- (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
1384
- }
1385
- ${hasAnisotropyDirections ? /* wgsl */ `
1386
- (*si).directionTangent = (l2w * vec4f((*si).directionTangent, 0.0)).xyz;
1387
- (*si).directionBitangent = (l2w * vec4f((*si).directionBitangent, 0.0)).xyz;
1388
- (*si).geometryTangent = (l2w * vec4f((*si).geometryTangent, 0.0)).xyz;
1389
- (*si).geometryBitangent = (l2w * vec4f((*si).geometryBitangent, 0.0)).xyz;
1390
- ` : /* wgsl */ ``}
1391
- (*si).shadowOffset = (l2w * vec4f((*si).shadowOffset, 0.0)).xyz;
1392
- (*si).position = (l2w * vec4((*si).position, 1.0)).xyz;
1393
- }
1394
- }
1395
-
1396
- fn ex(ray: Ray, lightDistance: f32, jL: i32) -> bool {
1397
- if (rtUniform.isEmpty > 0) {
1398
- return false;
1399
- }
1400
-
1401
- let doubleSided = true;
1402
- let qo = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1403
- var tMax = qo;
1404
- var ey: i32;
1405
- var gQ: vec3f;
1406
-
1407
- let bounces = 1;
1408
- var lC = false;
1409
- var hO: i32 = jL;
1410
-
1411
- ${getBVHTraverseCode(
1412
- /*wgsl */ `
1413
-
1414
-
1415
-
1416
- var jt = true;
1417
-
1418
- if (jt) {
1419
- if (HAS_ALPHA) {
1420
- let materialIndex = i32(ae(bitcast<i32>(ot.z)).x);
1421
- if (!nF(
1422
- materialIndex,
1423
- index,
1424
- aB,
1425
- eY,
1426
- eD
1427
- )) {
1428
-
1429
- tMax = qo;
1430
- jt = false;
1431
- }
1432
- }
1433
- }
1434
- if (jt) {
1435
- return true;
1436
- }
1437
- `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
1438
-
1439
- return false;
1440
- }
1441
-
1442
- `;
1479
+ ${sceneIntersections || createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
1443
1480
  }
1444
1481
  //# sourceMappingURL=intersect.wgsl.js.map