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