@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
@@ -6,31 +6,31 @@ import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
6
6
  import { createShaderMixin, glsl, Shader } from '../../shader.js';
7
7
  function getBVHTraverseCode(handleHitCode, skipTriangleCode = '', initialTMax = 'RAY_MAX_DISTANCE') {
8
8
  const intersectTriangles = glsl `
9
- ivec3 vertexOffset = ivec3(floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).y));
10
- for (int k = 0; k < bh; k++) {
9
+ ivec3 vertexOffset = ivec3(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).y));
10
+ for (int k = 0; k < primitiveCount; k++) {
11
11
  int triangleIndex = primitiveOffset + k;
12
12
  ${skipTriangleCode}
13
- vec4 r3 = dp(triangleIndex);
13
+ vec4 r3 = fetchBVH(triangleIndex);
14
14
  ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
15
- fB tri = fB(
16
- kG(positionBuffer, index.x, vertexColumns).xyz,
17
- kG(positionBuffer, index.y, vertexColumns).xyz,
18
- kG(positionBuffer, index.z, vertexColumns).xyz
15
+ fw tri = fw(
16
+ fetchData(positionBuffer, index.x, vertexColumns).xyz,
17
+ fetchData(positionBuffer, index.y, vertexColumns).xyz,
18
+ fetchData(positionBuffer, index.z, vertexColumns).xyz
19
19
  );
20
- eC hit = fM(o, d, tri, ey, gQ, tMax);
20
+ ev hit = fM(o, d, tri, dZ, gH, tMax);
21
21
 
22
22
  if (hit.t > 0.0) {
23
23
  tMax = hit.t;
24
24
  vec3 e1 = tri.p1 - tri.p0;
25
25
  vec3 e2 = tri.p2 - tri.p0;
26
26
  vec3 faceNormal = normalize(cross(e1, e2));
27
- int kk = int(ae(
28
- floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)
27
+ int ku = int(af(
28
+ floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)
29
29
  ).x);
30
- bool iN = fetchMatData(
31
- kk * MAT_DATA_SIZE + MAT_ROW_ALPHA
30
+ bool iL = fetchMatData(
31
+ ku * MAT_DATA_SIZE + MAT_ROW_ALPHA
32
32
  ).z > 0.5;
33
- if (!doubleSided && !iN && dot(faceNormal, d) > 0.0) {
33
+ if (!doubleSided && !iL && dot(faceNormal, d) > 0.0) {
34
34
  continue;
35
35
  }
36
36
 
@@ -41,262 +41,262 @@ ${handleHitCode}
41
41
  return glsl `
42
42
  ivec2 stack[STACK_SIZE];
43
43
  int top = -1;
44
- int sO = -1;
44
+ int ug = -1;
45
45
  float tMax = ${initialTMax};
46
46
 
47
47
  vec3 o = ray.o;
48
48
  vec3 d = ray.d;
49
49
 
50
- bool rb = false;
51
- vec3 hB;
52
- vec3 aB;
53
- ivec3 hw;
50
+ bool sd = false;
51
+ vec3 hz;
52
+ vec3 aw;
53
+ ivec3 hr;
54
54
 
55
- fB lB;
55
+ fw lR;
56
56
 
57
57
 
58
58
  top = 0;
59
59
  stack[0] = ivec2(0, -1);
60
60
 
61
- int wr = 0;
62
- while(top >= 0 && wr < 5000) {
63
- wr++;
61
+ int yK = 0;
62
+ while(top >= 0 && yK < 5000) {
63
+ yK++;
64
64
  ivec2 node = stack[top--];
65
65
 
66
- int cf = node.y;
66
+ int bK = node.y;
67
67
 
68
- if (cf != sO) {
69
- if (cf < 0) {
68
+ if (bK != ug) {
69
+ if (bK < 0) {
70
70
  o = ray.o;
71
71
  d = ray.d;
72
72
  }
73
73
  else {
74
74
  mat4 w2l = mat4(
75
- bv(cf * ${INSTANCE_VEC4_STRIDE} + 1),
76
- bv(cf * ${INSTANCE_VEC4_STRIDE} + 2),
77
- bv(cf * ${INSTANCE_VEC4_STRIDE} + 3),
78
- bv(cf * ${INSTANCE_VEC4_STRIDE} + 4)
75
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 1),
76
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 2),
77
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 3),
78
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 4)
79
79
  );
80
80
  o = (w2l * vec4(ray.o, 1.0)).xyz;
81
81
  d = (w2l * vec4(ray.d, 0.0)).xyz;
82
82
  }
83
- ey = maxDimension(abs(d));
84
- gQ = mu(d, ey);
85
- sO = cf;
83
+ dZ = maxDimension(abs(d));
84
+ gH = mU(d, dZ);
85
+ ug = bK;
86
86
  }
87
87
 
88
- int bo = cf < 0 ? 0 : blasOffset;
89
- uint fK = cf < 0 ? 0u : floatBitsToUint(bv(cf * ${INSTANCE_VEC4_STRIDE}).x);
90
- int gS = int(fK >> 30u);
91
- int eW = int(fK & 0x3fffffffu);
92
- int bh = 0;
88
+ int bufferOff = bK < 0 ? 0 : blasOffset;
89
+ uint fK = bK < 0 ? 0u : floatBitsToUint(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).x);
90
+ int gN = int(fK >> 30u);
91
+ int eQ = int(fK & 0x3fffffffu);
92
+ int primitiveCount = 0;
93
93
  int primitiveOffset = 0;
94
94
 
95
- if (gS == 3) {
96
- uint hW = uint(node.x);
97
- if ((hW & 0x80000000u) != 0u) {
98
- bh = int((hW >> 23u) & 0xffu);
99
- primitiveOffset = bo + eW + int(hW & 0x007fffffu);
95
+ if (gN == 3) {
96
+ uint hT = uint(node.x);
97
+ if ((hT & 0x80000000u) != 0u) {
98
+ primitiveCount = int((hT >> 23u) & 0xffu);
99
+ primitiveOffset = bufferOff + eQ + int(hT & 0x007fffffu);
100
100
  }
101
101
  else {
102
- int i = node.x + bo;
103
- vec4 jA = dp(i);
104
- vec4 fG = dp(i + 1);
105
- vec4 mU = dp(i + 2);
106
- vec4 mV = dp(i + 3);
107
- vec4 mW = dp(i + 4);
108
- uint header = floatBitsToUint(jA.w);
109
- int rG = int(header << 24u) >> 24;
110
- int rH = int((header >> 8u) << 24u) >> 24;
111
- int rI = int((header >> 16u) << 24u) >> 24;
112
- vec3 hJ = vec3(
113
- uintBitsToFloat(uint(rG + 127) << 23u),
114
- uintBitsToFloat(uint(rH + 127) << 23u),
115
- uintBitsToFloat(uint(rI + 127) << 23u)
102
+ int i = node.x + bufferOff;
103
+ vec4 jF = fetchBVH(i);
104
+ vec4 fF = fetchBVH(i + 1);
105
+ vec4 nI = fetchBVH(i + 2);
106
+ vec4 nJ = fetchBVH(i + 3);
107
+ vec4 nK = fetchBVH(i + 4);
108
+ uint header = floatBitsToUint(jF.w);
109
+ int sD = int(header << 24u) >> 24;
110
+ int sE = int((header >> 8u) << 24u) >> 24;
111
+ int sF = int((header >> 16u) << 24u) >> 24;
112
+ vec3 hG = vec3(
113
+ uintBitsToFloat(uint(sD + 127) << 23u),
114
+ uintBitsToFloat(uint(sE + 127) << 23u),
115
+ uintBitsToFloat(uint(sF + 127) << 23u)
116
116
  );
117
- uint childBase = floatBitsToUint(fG.x);
118
- uint oP = floatBitsToUint(fG.y);
117
+ uint childBase = floatBitsToUint(fF.x);
118
+ uint ps = floatBitsToUint(fF.y);
119
119
  uint internalMask = header >> 24u;
120
- uint ut = (d.x < 0.0 ? 4u : 0u) |
120
+ uint wm = (d.x < 0.0 ? 4u : 0u) |
121
121
  (d.y < 0.0 ? 2u : 0u) |
122
122
  (d.z < 0.0 ? 1u : 0u);
123
- uint gJ[12] = uint[12](
124
- floatBitsToUint(mU.x), floatBitsToUint(mU.y),
125
- floatBitsToUint(mU.z), floatBitsToUint(mU.w),
126
- floatBitsToUint(mV.x), floatBitsToUint(mV.y),
127
- floatBitsToUint(mV.z), floatBitsToUint(mV.w),
128
- floatBitsToUint(mW.x), floatBitsToUint(mW.y),
129
- floatBitsToUint(mW.z), floatBitsToUint(mW.w)
123
+ uint gF[12] = uint[12](
124
+ floatBitsToUint(nI.x), floatBitsToUint(nI.y),
125
+ floatBitsToUint(nI.z), floatBitsToUint(nI.w),
126
+ floatBitsToUint(nJ.x), floatBitsToUint(nJ.y),
127
+ floatBitsToUint(nJ.z), floatBitsToUint(nJ.w),
128
+ floatBitsToUint(nK.x), floatBitsToUint(nK.y),
129
+ floatBitsToUint(nK.z), floatBitsToUint(nK.w)
130
130
  );
131
131
 
132
132
  for (int order = 7; order >= 0; order--) {
133
- uint slot = uint(order) ^ ut;
134
- uint sE = slot >= 4u
135
- ? floatBitsToUint(fG.w)
136
- : floatBitsToUint(fG.z);
137
- uint meta = (sE >> ((slot & 3u) * 8u)) & 0xffu;
133
+ uint slot = uint(order) ^ wm;
134
+ uint tW = slot >= 4u
135
+ ? floatBitsToUint(fF.w)
136
+ : floatBitsToUint(fF.z);
137
+ uint meta = (tW >> ((slot & 3u) * 8u)) & 0xffu;
138
138
  if (meta == 0u) continue;
139
- uint lX = (slot & 3u) * 8u;
140
- uint kV = slot >> 2u;
141
- vec3 tH = vec3(
142
- float((gJ[kV] >> lX) & 0xffu),
143
- float((gJ[2u + kV] >> lX) & 0xffu),
144
- float((gJ[4u + kV] >> lX) & 0xffu)
139
+ uint mt = (slot & 3u) * 8u;
140
+ uint lh = slot >> 2u;
141
+ vec3 ve = vec3(
142
+ float((gF[lh] >> mt) & 0xffu),
143
+ float((gF[2u + lh] >> mt) & 0xffu),
144
+ float((gF[4u + lh] >> mt) & 0xffu)
145
145
  );
146
- vec3 tG = vec3(
147
- float((gJ[6u + kV] >> lX) & 0xffu),
148
- float((gJ[8u + kV] >> lX) & 0xffu),
149
- float((gJ[10u + kV] >> lX) & 0xffu)
146
+ vec3 vd = vec3(
147
+ float((gF[6u + lh] >> mt) & 0xffu),
148
+ float((gF[8u + lh] >> mt) & 0xffu),
149
+ float((gF[10u + lh] >> mt) & 0xffu)
150
150
  );
151
- vec3 uW = jA.xyz + tH * hJ;
152
- vec3 uV = jA.xyz + tG * hJ;
153
- if (cM(o, d, uW, uV, tMax) <= 0.0) continue;
154
- uint jC = meta & 0x1fu;
155
- if (jC >= 24u) {
156
- uint nr = internalMask & ((1u << slot) - 1u);
157
- uint sX = childBase + qT(nr);
151
+ vec3 xn = jF.xyz + ve * hG;
152
+ vec3 xm = jF.xyz + vd * hG;
153
+ if (cH(o, d, xn, xm, tMax) <= 0.0) continue;
154
+ uint jH = meta & 0x1fu;
155
+ if (jH >= 24u) {
156
+ uint oa = internalMask & ((1u << slot) - 1u);
157
+ uint ur = childBase + rT(oa);
158
158
  stack[++top] = ivec2(
159
- eW + int(sX * 5u), cf
159
+ eQ + int(ur * 5u), bK
160
160
  );
161
161
  }
162
162
  else {
163
- uint triangleCount = qT(meta >> 5u);
164
- uint rS = oP + jC;
165
- uint vh = 0x80000000u |
163
+ uint triangleCount = rT(meta >> 5u);
164
+ uint sT = ps + jH;
165
+ uint xC = 0x80000000u |
166
166
  (triangleCount << 23u) |
167
- (rS & 0x007fffffu);
168
- stack[++top] = ivec2(int(vh), cf);
167
+ (sT & 0x007fffffu);
168
+ stack[++top] = ivec2(int(xC), bK);
169
169
  }
170
170
  }
171
171
  }
172
172
  }
173
- else if (gS == 2) {
174
- int i = node.x + bo;
175
- vec4 uY = dp(i);
176
- vec4 uZ = dp(i + 1);
177
- vec4 va = dp(i + 2);
178
- vec4 vb = dp(i + 3);
179
- bh = int(floatBitsToUint(va.w));
180
- if (bh > 0) {
181
- primitiveOffset = bo + eW + int(floatBitsToUint(vb.w));
173
+ else if (gN == 2) {
174
+ int i = node.x + bufferOff;
175
+ vec4 xq = fetchBVH(i);
176
+ vec4 xr = fetchBVH(i + 1);
177
+ vec4 xs = fetchBVH(i + 2);
178
+ vec4 xt = fetchBVH(i + 3);
179
+ primitiveCount = int(floatBitsToUint(xs.w));
180
+ if (primitiveCount > 0) {
181
+ primitiveOffset = bufferOff + eQ + int(floatBitsToUint(xt.w));
182
182
  }
183
183
  else {
184
- int left = eW + int(floatBitsToUint(uY.w) * 4u);
185
- int right = eW + int(floatBitsToUint(uZ.w) * 4u);
186
- float d0 = cM(o, d, uY.xyz, uZ.xyz, tMax);
187
- float d1 = cM(o, d, va.xyz, vb.xyz, tMax);
184
+ int left = eQ + int(floatBitsToUint(xq.w) * 4u);
185
+ int right = eQ + int(floatBitsToUint(xr.w) * 4u);
186
+ float d0 = cH(o, d, xq.xyz, xr.xyz, tMax);
187
+ float d1 = cH(o, d, xs.xyz, xt.xyz, tMax);
188
188
  if (d0 > d1) {
189
- if (d0 > 0.0) stack[++top] = ivec2(left, cf);
190
- if (d1 > 0.0) stack[++top] = ivec2(right, cf);
189
+ if (d0 > 0.0) stack[++top] = ivec2(left, bK);
190
+ if (d1 > 0.0) stack[++top] = ivec2(right, bK);
191
191
  }
192
192
  else {
193
- if (d1 > 0.0) stack[++top] = ivec2(right, cf);
194
- if (d0 > 0.0) stack[++top] = ivec2(left, cf);
193
+ if (d1 > 0.0) stack[++top] = ivec2(right, bK);
194
+ if (d0 > 0.0) stack[++top] = ivec2(left, bK);
195
195
  }
196
196
  }
197
197
  }
198
- else if (gS == 1) {
199
- uint hW = uint(node.x);
200
- if ((hW & 0x80000000u) != 0u) {
201
- bh = int((hW >> 23u) & 0xffu);
202
- primitiveOffset = bo + eW + int(hW & 0x007fffffu);
198
+ else if (gN == 1) {
199
+ uint hT = uint(node.x);
200
+ if ((hT & 0x80000000u) != 0u) {
201
+ primitiveCount = int((hT >> 23u) & 0xffu);
202
+ primitiveOffset = bufferOff + eQ + int(hT & 0x007fffffu);
203
203
  }
204
204
  else {
205
- int i = node.x + bo;
206
- vec4 ui = dp(i);
207
- vec4 ro = dp(i + 1);
208
- vec4 rp = dp(i + 2);
209
- vec4 rq = dp(i + 3);
210
- vec3 nodeMin = ui.xyz;
211
- vec3 ec = vec3(ui.w, ro.x, ro.y);
212
- uint mg[4] = uint[4](
213
- floatBitsToUint(ro.z), floatBitsToUint(ro.w),
214
- floatBitsToUint(rp.x), floatBitsToUint(rp.y)
205
+ int i = node.x + bufferOff;
206
+ vec4 vW = fetchBVH(i);
207
+ vec4 sq = fetchBVH(i + 1);
208
+ vec4 qI = fetchBVH(i + 2);
209
+ vec4 oF = fetchBVH(i + 3);
210
+ vec3 nodeMin = vW.xyz;
211
+ vec3 ea = vec3(vW.w, sq.x, sq.y);
212
+ uint mF[4] = uint[4](
213
+ floatBitsToUint(sq.z), floatBitsToUint(sq.w),
214
+ floatBitsToUint(qI.x), floatBitsToUint(qI.y)
215
215
  );
216
- vec4 rw = fc(floatBitsToUint(rp.z));
217
- vec4 rA = fc(floatBitsToUint(rp.w));
218
- vec4 rB = fc(floatBitsToUint(rq.x));
219
- vec4 rt = fc(floatBitsToUint(rq.y));
220
- vec4 ru = fc(floatBitsToUint(rq.z));
221
- vec4 rv = fc(floatBitsToUint(rq.w));
222
- vec3 gE = fb(d);
223
- vec3 bJ = eZ(gE, o);
224
- vec4 tx0 = (nodeMin.x + rw * ec.x - o.x) * gE.x;
225
- vec4 tx1 = (nodeMin.x + rt * ec.x - o.x) * gE.x;
226
- vec4 ty0 = (nodeMin.y + rA * ec.y - o.y) * gE.y;
227
- vec4 ty1 = (nodeMin.y + ru * ec.y - o.y) * gE.y;
228
- vec4 tz0 = (nodeMin.z + rB * ec.z - o.z) * gE.z;
229
- vec4 tz1 = (nodeMin.z + rv * ec.z - o.z) * gE.z;
230
- vec4 mK = max(max((min(tx0, tx1) - vec4(bJ.x)), (min(ty0, ty1) - vec4(bJ.y))), (min(tz0, tz1) - vec4(bJ.z)));
231
- vec4 rU = min(min((max(tx0, tx1) + vec4(bJ.x)), (max(ty0, ty1) + vec4(bJ.y))), (max(tz0, tz1) + vec4(bJ.z)));
232
- vec4 distance = mix(rU, mK, greaterThan(mK, vec4(0.0)));
233
- distance = mix(distance, vec4(-1.0), greaterThan(mK, min(rU, vec4(tMax))));
234
- float fd[4] = float[4](distance.x, distance.y, distance.z, distance.w);
216
+ vec4 wV = eX(floatBitsToUint(qI.z));
217
+ vec4 wW = eX(floatBitsToUint(qI.w));
218
+ vec4 wX = eX(floatBitsToUint(oF.x));
219
+ vec4 wR = eX(floatBitsToUint(oF.y));
220
+ vec4 wS = eX(floatBitsToUint(oF.z));
221
+ vec4 wU = eX(floatBitsToUint(oF.w));
222
+ vec3 gb = eW(d);
223
+ vec3 padding = eU(gb, o);
224
+ vec4 tx0 = (nodeMin.x + wV * ea.x - o.x) * gb.x;
225
+ vec4 tx1 = (nodeMin.x + wR * ea.x - o.x) * gb.x;
226
+ vec4 ty0 = (nodeMin.y + wW * ea.y - o.y) * gb.y;
227
+ vec4 ty1 = (nodeMin.y + wS * ea.y - o.y) * gb.y;
228
+ vec4 tz0 = (nodeMin.z + wX * ea.z - o.z) * gb.z;
229
+ vec4 tz1 = (nodeMin.z + wU * ea.z - o.z) * gb.z;
230
+ vec4 ns = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
231
+ vec4 sW = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
232
+ vec4 distance = mix(sW, ns, greaterThan(ns, vec4(0.0)));
233
+ distance = mix(distance, vec4(-1.0), greaterThan(ns, min(sW, vec4(tMax))));
234
+ float eY[4] = float[4](distance.x, distance.y, distance.z, distance.w);
235
235
 
236
236
 
237
237
  for (int order = 0; order < 4; order++) {
238
- float dX = -1.0;
239
- int el = -1;
238
+ float dW = -1.0;
239
+ int ej = -1;
240
240
  for (int child = 0; child < 4; child++) {
241
- if (mg[child] != 0u && fd[child] > dX) {
242
- dX = fd[child];
243
- el = child;
241
+ if (mF[child] != 0u && eY[child] > dW) {
242
+ dW = eY[child];
243
+ ej = child;
244
244
  }
245
245
  }
246
- if (el >= 0 && dX > 0.0) {
247
- uint nC = mg[el];
248
- int jI = int(nC);
249
- if ((nC & 0x80000000u) == 0u) {
250
- jI += eW;
246
+ if (ej >= 0 && dW > 0.0) {
247
+ uint ol = mF[ej];
248
+ int jO = int(ol);
249
+ if ((ol & 0x80000000u) == 0u) {
250
+ jO += eQ;
251
251
  }
252
- stack[++top] = ivec2(jI, cf);
253
- fd[el] = -1.0;
252
+ stack[++top] = ivec2(jO, bK);
253
+ eY[ej] = -1.0;
254
254
  }
255
255
  }
256
256
  }
257
257
  }
258
258
  else {
259
- int i = node.x + bo;
260
- vec4 r1 = dp(i);
261
- int bb = floatBitsToInt(r1.w);
259
+ int i = node.x + bufferOff;
260
+ vec4 r1 = fetchBVH(i);
261
+ int bf = floatBitsToInt(r1.w);
262
262
 
263
- if (bb >= 0) {
263
+ if (bf >= 0) {
264
264
  int left = node.x + 2;
265
- int right = bb + eW;
265
+ int right = bf + eQ;
266
266
 
267
- float d0 = cM(o, d, dp(left + bo).xyz, dp(left + 1 + bo).xyz, tMax);
268
- float d1 = cM(o, d, dp(right + bo).xyz, dp(right + 1 + bo).xyz, tMax);
267
+ float d0 = cH(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);
268
+ float d1 = cH(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).xyz, tMax);
269
269
  if (d0 > d1) {
270
270
  if (d0 > 0.0) {
271
- stack[++top] = ivec2(left, cf);
271
+ stack[++top] = ivec2(left, bK);
272
272
  }
273
273
  if (d1 > 0.0) {
274
- stack[++top] = ivec2(right, cf);
274
+ stack[++top] = ivec2(right, bK);
275
275
  }
276
276
  }
277
277
  else {
278
278
  if (d1 > 0.0) {
279
- stack[++top] = ivec2(right, cf);
279
+ stack[++top] = ivec2(right, bK);
280
280
  }
281
281
  if (d0 > 0.0) {
282
- stack[++top] = ivec2(left, cf);
282
+ stack[++top] = ivec2(left, bK);
283
283
  }
284
284
  }
285
285
  }
286
286
  else {
287
- if (cf < 0) {
288
- for (int k = 0; k < -bb; k++) {
289
- vec4 r3 = dp(i + 2 + k);
287
+ if (bK < 0) {
288
+ for (int k = 0; k < -bf; k++) {
289
+ vec4 r3 = fetchBVH(i + 2 + k);
290
290
  stack[++top] = ivec2(floatBitsToInt(r3.y), floatBitsToInt(r3.x));
291
291
  }
292
292
  }
293
293
  else {
294
- bh = -bb;
294
+ primitiveCount = -bf;
295
295
  primitiveOffset = i + 2;
296
296
  }
297
297
  }
298
298
  }
299
- if (bh > 0) {
299
+ if (primitiveCount > 0) {
300
300
  ${intersectTriangles}
301
301
  }
302
302
  }
@@ -321,13 +321,13 @@ export default createShaderMixin({
321
321
  },
322
322
  main: glsl `
323
323
 
324
- struct fB {
324
+ struct fw {
325
325
  vec3 p0;
326
326
  vec3 p1;
327
327
  vec3 p2;
328
328
  };
329
329
  #ifdef NUM_LIGHTS
330
- float hx(float rad, vec3 pos, Ray r) {
330
+ float hs(float rad, vec3 pos, Ray r) {
331
331
  vec3 op = pos - r.o;
332
332
  float eps = 0.001;
333
333
  float b = dot(op, r.d);
@@ -347,7 +347,7 @@ return t2;
347
347
  return INF;
348
348
  }
349
349
 
350
- float nh(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
350
+ float nV(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
351
351
  float dt = dot(r.d, n);
352
352
  float t = (dot(n, pos) - dot(n, r.o)) / dt;
353
353
 
@@ -366,7 +366,17 @@ return t;
366
366
  return INF;
367
367
  }
368
368
 
369
- float my(Ray r, Light light, out LightSampleRec lightSample) {
369
+ float sphereSolidAnglePdf(vec3 origin, vec3 center, float radius) {
370
+ float ao = distance(origin, center);
371
+ if (ao <= radius) return INV4PI;
372
+ float sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
373
+ float cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
374
+
375
+ float oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
376
+ return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
377
+ }
378
+
379
+ float mX(Ray r, Light light, out LightSampleRec lightSample) {
370
380
 
371
381
 
372
382
 
@@ -383,15 +393,15 @@ vec3 normal = normalize(cross(u, v));
383
393
  if (dot(normal, r.d) > 0.)
384
394
  return INF;
385
395
 
386
- d = nh(pos, u, v, normal, r);
396
+ d = nV(pos, u, v, normal, r);
387
397
  if (d < 0.) {
388
398
  d = INF;
389
399
  }
390
400
  else {
391
- float cc = dot(-r.d, normal);
401
+ float ct = dot(-r.d, normal);
392
402
  float spread = light.spread;
393
- if (cc >= cos(spread * PI / 2.0)) {
394
- lightSample.pdf = (d * d) / (light.area * cc);
403
+ if (ct >= cos(spread * PI / 2.0)) {
404
+ lightSample.pdf = (d * d) / (light.area * ct);
395
405
  lightSample.emission = light.emission;
396
406
  }
397
407
  }
@@ -400,10 +410,10 @@ lightSample.emission = light.emission;
400
410
  #ifdef HAS_SPHERE_LIGHTS
401
411
  if (type == SPHERE_LIGHT) {
402
412
  if (light.radius <= 0.0) {
403
- vec3 ko = light.position - r.o;
404
- float projection = dot(ko, r.d);
405
- vec3 ba = ko - projection * r.d;
406
- if (projection <= EPS || dot(ba, ba) > 1e-8) return INF;
413
+ vec3 kz = light.position - r.o;
414
+ float projection = dot(kz, r.d);
415
+ vec3 bd = kz - projection * r.d;
416
+ if (projection <= EPS || dot(bd, bd) > 1e-8) return INF;
407
417
  d = projection;
408
418
  lightSample.direction = r.d;
409
419
  lightSample.normal = -r.d;
@@ -411,21 +421,15 @@ lightSample.dist = d;
411
421
  lightSample.pdf = 1.0;
412
422
  lightSample.isDelta = true;
413
423
  } else {
414
- d = hx(light.radius, light.position, r);
424
+ d = hs(light.radius, light.position, r);
415
425
  lightSample.isDelta = false;
416
426
  }
417
427
  if (d < 0.) {
418
428
  d = INF;
419
429
  }
420
430
  else {
421
- float aj = distance(r.o, light.position);
422
- float cosThetaMax = aj <= light.radius
423
- ? -1.0
424
- : sqrt(max(0.0, 1.0 - light.radius * light.radius / (aj * aj)));
425
431
  if (light.radius > 0.0) {
426
- lightSample.pdf = aj <= light.radius
427
- ? INV4PI
428
- : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
432
+ lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
429
433
  }
430
434
  lightSample.emission = light.radius <= 0.0
431
435
  ? light.emission / max(d * d, 1e-8)
@@ -436,10 +440,10 @@ lightSample.emission = light.radius <= 0.0
436
440
  #ifdef HAS_SPOT_LIGHTS
437
441
  if (type == SPOT_LIGHT) {
438
442
  if (light.radius <= 0.0) {
439
- vec3 ko = light.position - r.o;
440
- float projection = dot(ko, r.d);
441
- vec3 ba = ko - projection * r.d;
442
- if (projection <= EPS || dot(ba, ba) > 1e-8) return INF;
443
+ vec3 kz = light.position - r.o;
444
+ float projection = dot(kz, r.d);
445
+ vec3 bd = kz - projection * r.d;
446
+ if (projection <= EPS || dot(bd, bd) > 1e-8) return INF;
443
447
  d = projection;
444
448
  lightSample.direction = r.d;
445
449
  lightSample.normal = -r.d;
@@ -447,23 +451,17 @@ lightSample.dist = d;
447
451
  lightSample.pdf = 1.0;
448
452
  lightSample.isDelta = true;
449
453
  } else {
450
- d = hx(light.radius, light.position, r);
454
+ d = hs(light.radius, light.position, r);
451
455
  lightSample.isDelta = false;
452
456
  }
453
457
  if (d != INF) {
454
- vec3 ve = r.o + d * r.d;
455
- float mB = bL(light, normalize(r.o - ve));
456
- if (mB <= 0.0) return INF;
457
- float aj = distance(r.o, light.position);
458
- float cosThetaMax = aj <= light.radius
459
- ? -1.0
460
- : sqrt(max(0.0, 1.0 - light.radius * light.radius / (aj * aj)));
458
+ vec3 xv = r.o + d * r.d;
459
+ float ne = evaluateSpotEmissionMultiplier(light, normalize(r.o - xv));
460
+ if (ne <= 0.0) return INF;
461
461
  if (light.radius > 0.0) {
462
- lightSample.pdf = aj <= light.radius
463
- ? INV4PI
464
- : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
462
+ lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
465
463
  }
466
- lightSample.emission = light.emission * mB * (light.radius <= 0.0
464
+ lightSample.emission = light.emission * ne * (light.radius <= 0.0
467
465
  ? 1.0 / max(d * d, 1e-8)
468
466
  : 1.0);
469
467
  }
@@ -474,96 +472,96 @@ return d;
474
472
  }
475
473
  #endif
476
474
 
477
- int fm(ivec4 m0, ivec4 m1, ivec4 m2, vec3 eK) {
478
- vec2 m00 = ae(m0.x);
479
- vec2 m01 = ae(m0.y);
480
- vec2 m02 = ae(m0.z);
481
- vec2 m10 = ae(m1.x);
482
- vec2 m11 = ae(m1.y);
483
- vec2 m12 = ae(m1.z);
484
- vec2 m20 = ae(m2.x);
485
- vec2 m21 = ae(m2.y);
486
- vec2 m22 = ae(m2.z);
487
- float w00 = m00.y * eK.x;
488
- float w01 = m01.y * eK.x;
489
- float w02 = m02.y * eK.x;
490
- float w10 = m10.y * eK.y;
491
- float w11 = m11.y * eK.y;
492
- float w12 = m12.y * eK.y;
493
- float w20 = m20.y * eK.z;
494
- float w21 = m21.y * eK.z;
495
- float w22 = m22.y * eK.z;
496
-
497
- float hk = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
498
-
499
- w00 = w00 / hk;
500
- w01 = w01 / hk + w00;
501
- w02 = w02 / hk + w01;
502
- w10 = w10 / hk + w02;
503
- w11 = w11 / hk + w10;
504
- w12 = w12 / hk + w11;
505
- w20 = w20 / hk + w12;
506
- w21 = w21 / hk + w20;
507
- w22 = w22 / hk + w21;
508
-
509
- float rand = eo(0u);
510
- float ni;
475
+ int fh(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
476
+ vec2 m00 = af(m0.x);
477
+ vec2 m01 = af(m0.y);
478
+ vec2 m02 = af(m0.z);
479
+ vec2 m10 = af(m1.x);
480
+ vec2 m11 = af(m1.y);
481
+ vec2 m12 = af(m1.z);
482
+ vec2 m20 = af(m2.x);
483
+ vec2 m21 = af(m2.y);
484
+ vec2 m22 = af(m2.z);
485
+ float w00 = m00.y * bary.x;
486
+ float w01 = m01.y * bary.x;
487
+ float w02 = m02.y * bary.x;
488
+ float w10 = m10.y * bary.y;
489
+ float w11 = m11.y * bary.y;
490
+ float w12 = m12.y * bary.y;
491
+ float w20 = m20.y * bary.z;
492
+ float w21 = m21.y * bary.z;
493
+ float w22 = m22.y * bary.z;
494
+
495
+ float hd = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
496
+
497
+ w00 = w00 / hd;
498
+ w01 = w01 / hd + w00;
499
+ w02 = w02 / hd + w01;
500
+ w10 = w10 / hd + w02;
501
+ w11 = w11 / hd + w10;
502
+ w12 = w12 / hd + w11;
503
+ w20 = w20 / hd + w12;
504
+ w21 = w21 / hd + w20;
505
+ w22 = w22 / hd + w21;
506
+
507
+ float rand = ek(0u);
508
+ float nW;
511
509
  if (rand < w00) {
512
- ni = m00.x;
510
+ nW = m00.x;
513
511
  } else if (rand < w01) {
514
- ni = m01.x;
512
+ nW = m01.x;
515
513
  } else if (rand < w02) {
516
- ni = m02.x;
514
+ nW = m02.x;
517
515
  } else if (rand < w10) {
518
- ni = m10.x;
516
+ nW = m10.x;
519
517
  } else if (rand < w11) {
520
- ni = m11.x;
518
+ nW = m11.x;
521
519
  } else if (rand < w12) {
522
- ni = m12.x;
520
+ nW = m12.x;
523
521
  } else if (rand < w20) {
524
- ni = m20.x;
522
+ nW = m20.x;
525
523
  } else if (rand < w21) {
526
- ni = m21.x;
524
+ nW = m21.x;
527
525
  } else {
528
- ni = m22.x;
526
+ nW = m22.x;
529
527
  }
530
- return int(ni);
528
+ return int(nW);
531
529
  }
532
530
 
533
531
 
534
- vec4 bv(int i);
532
+ vec4 fetchIns(int i);
535
533
 
536
534
 
537
- mat2x3 eE(vec3 normal, vec3 dp1, vec3 dp2, vec2 oc, vec2 od, vec4 aT) {
538
- float determinant = oc.x * od.y - oc.y * od.x;
539
- vec3 t = aT.xyz;
535
+ mat2x3 ez(vec3 normal, vec3 dp1, vec3 dp2, vec2 oM, vec2 oN, vec4 aS) {
536
+ float determinant = oM.x * oN.y - oM.y * oN.x;
537
+ vec3 t = aS.xyz;
540
538
  vec3 b = vec3(0.0);
541
539
 
542
- float qC = abs(aT.w) > 1.5 ? 0.0 : aT.w;
540
+ float rw = abs(aS.w) > 1.5 ? 0.0 : aS.w;
543
541
  if (abs(determinant) > 1e-12) {
544
- vec3 dt = (dp1 * od.y - dp2 * oc.y) / determinant;
545
- vec3 db = (dp2 * oc.x - dp1 * od.x) / determinant;
542
+ vec3 dt = (dp1 * oN.y - dp2 * oM.y) / determinant;
543
+ vec3 db = (dp2 * oM.x - dp1 * oN.x) / determinant;
546
544
  if (dot(t, t) < 1e-8) { t = dt; }
547
- if (qC == 0.0) { qC = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
545
+ if (rw == 0.0) { rw = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
548
546
  }
549
547
  t -= normal * dot(normal, t);
550
548
  if (dot(t, t) < 1e-8) {
551
549
  float ik = (normal.z >= 0.0 ? 1.0 : -1.0);
552
- float dW = -1.0 / (ik + normal.z);
553
- float xy = normal.x * normal.y * dW;
554
- t = vec3(1.0 + ik * normal.x * normal.x * dW, ik * xy, -ik * normal.x);
555
- b = vec3(xy, ik + normal.y * normal.y * dW, -normal.y);
550
+ float cv = -1.0 / (ik + normal.z);
551
+ float xy = normal.x * normal.y * cv;
552
+ t = vec3(1.0 + ik * normal.x * normal.x * cv, ik * xy, -ik * normal.x);
553
+ b = vec3(xy, ik + normal.y * normal.y * cv, -normal.y);
556
554
  }
557
555
  else { t = normalize(t); b = normalize(cross(normal, t)); }
558
- return mat2x3(t, b * (qC < 0.0 ? -1.0 : 1.0));
556
+ return mat2x3(t, b * (rw < 0.0 ? -1.0 : 1.0));
559
557
  }
560
558
 
561
- void ht(inout ad si, fB tri, vec3 barycentric, ivec3 index) {
559
+ void hn(inout SurfaceInteraction si, fw tri, vec3 barycentric, ivec3 index) {
562
560
  si.hit = true;
563
561
  si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
564
- ivec2 i0 = gR(index.x, vertexColumns);
565
- ivec2 i1 = gR(index.y, vertexColumns);
566
- ivec2 i2 = gR(index.z, vertexColumns);
562
+ ivec2 i0 = gM(index.x, vertexColumns);
563
+ ivec2 i1 = gM(index.y, vertexColumns);
564
+ ivec2 i2 = gM(index.z, vertexColumns);
567
565
  si.vertexColor = vec3(1.0);
568
566
  #ifdef USE_VERTEX_COLOR
569
567
  si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
@@ -582,14 +580,14 @@ si.vertexNormal = normal;
582
580
 
583
581
 
584
582
  vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
585
- vec3 km = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
583
+ vec3 kw = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
586
584
  float a = dot(n2 - n0, tri.p0 - tri.p2);
587
585
  float b = dot(n2 - n1, tri.p1 - tri.p2);
588
586
  float c = dot(n1 - n0, tri.p1 - tri.p0);
589
587
  float h = a * barycentric.x * (barycentric.x - 1.0)
590
588
  + (a + b + c) * barycentric.x * barycentric.y
591
589
  + b * barycentric.y * (barycentric.y - 1.0);
592
- if (dot(km, geometricNormal) > 0.0) {
590
+ if (dot(kw, geometricNormal) > 0.0) {
593
591
  float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
594
592
  float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
595
593
  float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -607,7 +605,7 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
607
605
  h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
608
606
  h = min(-min(min(h0, h1), h2), h * 0.5);
609
607
  }
610
- si.shadowOffset = km * h;
608
+ si.shadowOffset = kw * h;
611
609
 
612
610
 
613
611
  ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
@@ -615,7 +613,7 @@ ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
615
613
  ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
616
614
 
617
615
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
618
- si.materialIndex = fm(m0, m1, m2, barycentric);
616
+ si.materialIndex = fh(m0, m1, m2, barycentric);
619
617
  }
620
618
 
621
619
  vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
@@ -626,80 +624,80 @@ vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
626
624
  vec2 secondaryUv0 = texelFetch(uv1Buffer, i0, 0).xy;
627
625
  vec2 secondaryUv1 = texelFetch(uv1Buffer, i1, 0).xy;
628
626
  vec2 secondaryUv2 = texelFetch(uv1Buffer, i2, 0).xy;
629
- vec2 cX = barycentric.x * secondaryUv0
627
+ vec2 cQ = barycentric.x * secondaryUv0
630
628
  + barycentric.y * secondaryUv1
631
629
  + barycentric.z * secondaryUv2;
632
630
 
633
- vec4 lL = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
634
- int uvProjection = int(lL.r);
631
+ vec4 mb = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
632
+ int uvProjection = int(mb.r);
635
633
  if (uvProjection > 0) {
636
- uv = gI(uvProjection, si.position, normal, lL.zw);
637
- cX = uv;
634
+ uv = gE(uvProjection, si.position, normal, mb.zw);
635
+ cQ = uv;
638
636
  } else {
639
- uv *= lL.zw;
640
- cX *= lL.zw;
637
+ uv *= mb.zw;
638
+ cQ *= mb.zw;
641
639
  }
642
640
  #else
643
641
  vec2 uv = vec2(0.0);
644
- vec2 cX = vec2(0.0);
642
+ vec2 cQ = vec2(0.0);
645
643
  #endif
646
644
 
647
645
  #ifdef USE_COAT_NORMAL_FRAMES
648
646
  si.coatNormal = normal;
649
647
  #ifdef NUM_COAT_NORMAL_MAPS
650
- float oU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
648
+ float pH = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
651
649
  #endif
652
650
  #endif
653
651
  vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
654
- float tm = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
655
- if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || tm != 0.0
652
+ float uQ = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
653
+ if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || uQ != 0.0
656
654
  #ifdef USE_COAT_NORMAL_FRAMES
657
655
  || fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
658
656
  #endif
659
657
  ) {
660
658
  vec3 dp1 = tri.p0 - tri.p2;
661
659
  vec3 dp2 = tri.p1 - tri.p2;
662
- vec4 aT = vec4(0.0);
660
+ vec4 aS = vec4(0.0);
663
661
  #ifdef USE_TANGENT
664
- aT = barycentric.x * texelFetch(tangentBuffer, i0, 0)
662
+ aS = barycentric.x * texelFetch(tangentBuffer, i0, 0)
665
663
  + barycentric.y * texelFetch(tangentBuffer, i1, 0)
666
664
  + barycentric.z * texelFetch(tangentBuffer, i2, 0);
667
665
  #endif
668
- mat2x3 eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
669
- si.geometryTangent = eS[0];
670
- si.geometryBitangent = eS[1];
671
- mat2x3 fZ = eS;
666
+ mat2x3 eL = ez(normal, dp1, dp2, uv0-uv2, uv1-uv2, aS);
667
+ si.geometryTangent = eL[0];
668
+ si.geometryBitangent = eL[1];
669
+ mat2x3 fX = eL;
672
670
  #ifdef NUM_ANISOTROPY_MAPS
673
671
  if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
674
672
  vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
675
673
  vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
676
674
  vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
677
- fZ = eE(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
675
+ fX = ez(normal, dp1, dp2, a-c, b-c, (aS.w == 0.0 ? vec4(0.0) : aS));
678
676
  }
679
677
  #endif
680
- si.directionTangent = fZ[0];
681
- si.directionBitangent = fZ[1];
678
+ si.directionTangent = fX[0];
679
+ si.directionBitangent = fX[1];
682
680
  #if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
683
- if (oU >= 0.0) {
684
- int kC = int(oU);
685
- mat2x3 mh = eS;
686
- if (mapUvChannel[kC] > 0.5) {
681
+ if (pH >= 0.0) {
682
+ int kP = int(pH);
683
+ mat2x3 mG = eL;
684
+ if (mapUvChannel[kP] > 0.5) {
687
685
  vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
688
686
  vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
689
687
  vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
690
- mh = eE(normal, dp1, dp2, a-c, b-c,
691
- aT.w == 0.0 ? vec4(0.0) : aT);
688
+ mG = ez(normal, dp1, dp2, a-c, b-c,
689
+ aS.w == 0.0 ? vec4(0.0) : aS);
692
690
  }
693
- vec3 decoded = sampleMap(kC, getMapUvSet(kC, uv, cX)).rgb * 2.0 - 1.0;
694
- vec3 mapped = mh[0] * decoded.x * directionMaterial.z
695
- + mh[1] * decoded.y * directionMaterial.w + normal * decoded.z;
691
+ vec3 decoded = sampleMap(kP, getMapUvSet(kP, uv, cQ)).rgb * 2.0 - 1.0;
692
+ vec3 mapped = mG[0] * decoded.x * directionMaterial.z
693
+ + mG[1] * decoded.y * directionMaterial.w + normal * decoded.z;
696
694
  if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
697
695
  }
698
696
  #endif
699
697
  }
700
698
 
701
699
  si.uv = uv;
702
- si.uv1 = cX;
700
+ si.uv1 = cQ;
703
701
 
704
702
  #ifdef USE_TANGENT
705
703
  vec3 t0 = texelFetch(tangentBuffer, i0, 0).xyz;
@@ -710,52 +708,52 @@ si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z *
710
708
  #if defined(NUM_NORMAL_MAPS)
711
709
  vec3 dp1 = tri.p0 - tri.p2;
712
710
  vec3 dp2 = tri.p1 - tri.p2;
713
- vec2 oc = uv0 - uv2;
714
- vec2 od = uv1 - uv2;
715
- si.normal = ol(
716
- si.materialIndex, uv, normal, dp1, dp2, oc, od
711
+ vec2 oM = uv0 - uv2;
712
+ vec2 oN = uv1 - uv2;
713
+ si.normal = oS(
714
+ si.materialIndex, uv, normal, dp1, dp2, oM, oN
717
715
  );
718
716
  #else
719
717
  si.normal = normal;
720
718
  #endif
721
719
  }
722
720
 
723
- struct eC {
721
+ struct ev {
724
722
  float t;
725
723
  vec3 barycentric;
726
724
  };
727
725
 
728
- vec4 dp(int i) {
729
- return kG(bvhBuffer, i, bvhColumns);
726
+ vec4 fetchBVH(int i) {
727
+ return fetchData(bvhBuffer, i, bvhColumns);
730
728
  }
731
729
 
732
- vec4 bv(int i) {
733
- return kG(instancesBuffer, i, instancesColumns);
730
+ vec4 fetchIns(int i) {
731
+ return fetchData(instancesBuffer, i, instancesColumns);
734
732
  }
735
733
 
736
734
 
737
735
 
738
- uint qT(uint value) {
736
+ uint rT(uint value) {
739
737
  value -= (value >> 1u) & 0x55555555u;
740
738
  value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
741
739
  value = (value + (value >> 4u)) & 0x0f0f0f0fu;
742
740
  return (value * 0x01010101u) >> 24u;
743
741
  }
744
742
 
745
- vec4 fc(uint lU) {
743
+ vec4 eX(uint mo) {
746
744
  return vec4(
747
- float(lU & 0xffu),
748
- float((lU >> 8u) & 0xffu),
749
- float((lU >> 16u) & 0xffu),
750
- float(lU >> 24u)
745
+ float(mo & 0xffu),
746
+ float((mo >> 8u) & 0xffu),
747
+ float((mo >> 16u) & 0xffu),
748
+ float(mo >> 24u)
751
749
  ) / 255.0;
752
750
  }
753
751
 
754
752
 
755
753
 
756
754
 
757
- eC fM(vec3 o, vec3 d, fB tri, int ey, vec3 gQ, float tMax) {
758
- eC ti;
755
+ ev fM(vec3 o, vec3 d, fw tri, int dZ, vec3 gH, float tMax) {
756
+ ev ti;
759
757
 
760
758
 
761
759
  vec3 p0t = tri.p0 - o;
@@ -763,20 +761,20 @@ vec3 p1t = tri.p1 - o;
763
761
  vec3 p2t = tri.p2 - o;
764
762
 
765
763
 
766
- if (ey == 0) {
764
+ if (dZ == 0) {
767
765
  p0t = p0t.yzx;
768
766
  p1t = p1t.yzx;
769
767
  p2t = p2t.yzx;
770
- } else if (ey == 1) {
768
+ } else if (dZ == 1) {
771
769
  p0t = p0t.zxy;
772
770
  p1t = p1t.zxy;
773
771
  p2t = p2t.zxy;
774
772
  }
775
773
 
776
774
 
777
- p0t.xy += gQ.xy * p0t.z;
778
- p1t.xy += gQ.xy * p1t.z;
779
- p2t.xy += gQ.xy * p2t.z;
775
+ p0t.xy += gH.xy * p0t.z;
776
+ p1t.xy += gH.xy * p1t.z;
777
+ p2t.xy += gH.xy * p2t.z;
780
778
 
781
779
 
782
780
  vec3 e = vec3(
@@ -786,9 +784,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
786
784
  );
787
785
 
788
786
  #ifdef DEPTH_QUERY_MODE
789
- vec3 rE = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
787
+ vec3 sB = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
790
788
  + abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
791
- e = mix(e, vec3(0.0), lessThanEqual(abs(e), rE * 1e-6));
789
+ e = mix(e, vec3(0.0), lessThanEqual(abs(e), sB * 1e-6));
792
790
  #endif
793
791
 
794
792
 
@@ -801,19 +799,19 @@ float det = e.x + e.y + e.z;
801
799
  if (det == 0.0) return ti;
802
800
  #endif
803
801
 
804
- p0t.z *= gQ.z;
805
- p1t.z *= gQ.z;
806
- p2t.z *= gQ.z;
807
- float rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
802
+ p0t.z *= gH.z;
803
+ p1t.z *= gH.z;
804
+ p2t.z *= gH.z;
805
+ float sp = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
808
806
 
809
807
 
810
- if (abs(rn) > abs(tMax * det)) {
808
+ if (abs(sp) > abs(tMax * det)) {
811
809
  return ti;
812
810
  }
813
811
 
814
- float sw = 1. / det;
815
- ti.t = rn * sw;
816
- ti.barycentric = e * sw;
812
+ float tP = 1. / det;
813
+ ti.t = sp * tP;
814
+ ti.barycentric = e * tP;
817
815
 
818
816
  return ti;
819
817
  }
@@ -824,18 +822,18 @@ vec3 max;
824
822
  };
825
823
 
826
824
 
827
- vec3 fb(vec3 d) {
825
+ vec3 eW(vec3 d) {
828
826
  #ifdef DEPTH_QUERY_MODE
829
- vec3 ap = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
830
- return 1.0 / ap;
827
+ vec3 ah = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
828
+ return 1.0 / ah;
831
829
  #else
832
830
  return 1.0 / d;
833
831
  #endif
834
832
  }
835
833
 
836
- vec3 eZ(vec3 gE, vec3 o) {
834
+ vec3 eU(vec3 gb, vec3 o) {
837
835
  #ifdef DEPTH_QUERY_MODE
838
- return abs(gE) * max(vec3(1.0), abs(o)) * 1e-6;
836
+ return abs(gb) * max(vec3(1.0), abs(o)) * 1e-6;
839
837
  #else
840
838
  return vec3(0.0);
841
839
  #endif
@@ -843,21 +841,21 @@ return vec3(0.0);
843
841
 
844
842
 
845
843
 
846
- float cM(vec3 o, vec3 d, vec3 vK, vec3 vJ, float tMax) {
844
+ float cH(vec3 o, vec3 d, vec3 xU, vec3 xT, float tMax) {
847
845
  #ifdef DEPTH_QUERY_MODE
848
- vec3 gE = fb(d);
849
- vec3 uR = (vK - o) * gE;
850
- vec3 uS = (vJ - o) * gE;
851
- vec3 bJ = eZ(gE, o);
846
+ vec3 gb = eW(d);
847
+ vec3 xg = (xU - o) * gb;
848
+ vec3 xh = (xT - o) * gb;
849
+ vec3 padding = eU(gb, o);
852
850
  #else
853
- vec3 uR = (vK - o) / d;
854
- vec3 uS = (vJ - o) / d;
855
- vec3 bJ = vec3(0.0);
851
+ vec3 xg = (xU - o) / d;
852
+ vec3 xh = (xT - o) / d;
853
+ vec3 padding = vec3(0.0);
856
854
  #endif
857
- vec3 mK = min(uR, uS) - bJ;
858
- vec3 rU = max(uR, uS) + bJ;
859
- float t0 = max(mK.x, max(mK.y, mK.z));
860
- float t1 = min(rU.x, min(rU.y, rU.z));
855
+ vec3 ns = min(xg, xh) - padding;
856
+ vec3 sW = max(xg, xh) + padding;
857
+ float t0 = max(ns.x, max(ns.y, ns.z));
858
+ float t1 = min(sW.x, min(sW.y, sW.z));
861
859
 
862
860
  return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
863
861
  }
@@ -866,12 +864,12 @@ int maxDimension(vec3 v) {
866
864
  return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
867
865
  }
868
866
 
869
- vec3 mu(vec3 d, int ey) {
867
+ vec3 mU(vec3 d, int dZ) {
870
868
 
871
869
 
872
- if (ey == 0) {
870
+ if (dZ == 0) {
873
871
  return vec3(-d.y, -d.z, 1.0) / d.x;
874
- } else if (ey == 1) {
872
+ } else if (dZ == 1) {
875
873
  return vec3(-d.z, -d.x, 1.0) / d.y;
876
874
  } else {
877
875
  return vec3(-d.x, -d.y, 1.0) / d.z;
@@ -879,50 +877,50 @@ return vec3(-d.x, -d.y, 1.0) / d.z;
879
877
  }
880
878
 
881
879
 
882
- void cZ(in Ray ray, inout ad si, bool doubleSided) {
880
+ void intersectScene(in Ray ray, inout SurfaceInteraction si, bool doubleSided) {
883
881
  si.hit = false;
884
882
 
885
883
  if (isEmptyScene) {
886
884
  return;
887
885
  }
888
886
 
889
- int ey = maxDimension(abs(ray.d));
890
- vec3 gQ = mu(ray.d, ey);
891
- int ao;
887
+ int dZ = maxDimension(abs(ray.d));
888
+ vec3 gH = mU(ray.d, dZ);
889
+ int am;
892
890
 
893
891
  ${getBVHTraverseCode(glsl `
894
892
  si.triangleIndex = triangleIndex;
895
- lB = tri;
896
- hB = faceNormal;
897
- aB = hit.barycentric;
898
- hw = index;
899
- rb = true;
900
- ao = cf;
893
+ lR = tri;
894
+ hz = faceNormal;
895
+ aw = hit.barycentric;
896
+ hr = index;
897
+ sd = true;
898
+ am = bK;
901
899
  `)}
902
900
 
903
- if (rb) {
904
- si.instanceIndex = ao;
905
- si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
901
+ if (sd) {
902
+ si.instanceIndex = am;
903
+ si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
906
904
 
907
- ht(si, lB, aB, hw);
905
+ hn(si, lR, aw, hr);
908
906
  mat4 l2w = mat4(
909
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
910
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
911
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 7),
912
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 8)
907
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
908
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
909
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
910
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
913
911
  );
914
912
  mat4 w2l = mat4(
915
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 1),
916
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 2),
917
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 3),
918
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 4)
913
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
914
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
915
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
916
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
919
917
  );
920
- mat3 aD = transpose(mat3(w2l));
921
- si.faceNormal = normalize(aD * hB);
922
- si.vertexNormal = normalize(aD * si.vertexNormal);
923
- si.normal = normalize(aD * si.normal);
918
+ mat3 aG = transpose(mat3(w2l));
919
+ si.faceNormal = normalize(aG * hz);
920
+ si.vertexNormal = normalize(aG * si.vertexNormal);
921
+ si.normal = normalize(aG * si.normal);
924
922
  #ifdef USE_COAT_NORMAL_FRAMES
925
- si.coatNormal = normalize(aD * si.coatNormal);
923
+ si.coatNormal = normalize(aG * si.coatNormal);
926
924
  #endif
927
925
  #ifdef USE_TANGENT
928
926
  if (dot(si.tangent, si.tangent) > 0.0) {
@@ -939,7 +937,7 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
939
937
  }
940
938
 
941
939
 
942
- void iM(in Ray ray, inout ad si, int instanceIndex, float maxDistance) {
940
+ void intersectSceneBevel(in Ray ray, inout SurfaceInteraction si, int instanceIndex, float maxDistance) {
943
941
  si.hit = false;
944
942
 
945
943
  if (isEmptyScene) {
@@ -947,46 +945,46 @@ return;
947
945
  }
948
946
 
949
947
  bool doubleSided = true;
950
- int ey = maxDimension(abs(ray.d));
951
- vec3 gQ = mu(ray.d, ey);
952
- int ao;
948
+ int dZ = maxDimension(abs(ray.d));
949
+ vec3 gH = mU(ray.d, dZ);
950
+ int am;
953
951
 
954
952
  ${getBVHTraverseCode(glsl `
955
953
  si.triangleIndex = triangleIndex;
956
- lB = tri;
957
- hB = faceNormal;
958
- aB = hit.barycentric;
959
- hw = index;
960
- rb = true;
961
- ao = cf;
954
+ lR = tri;
955
+ hz = faceNormal;
956
+ aw = hit.barycentric;
957
+ hr = index;
958
+ sd = true;
959
+ am = bK;
962
960
  `, glsl `
963
- if (cf != instanceIndex) {
961
+ if (bK != instanceIndex) {
964
962
  continue;
965
963
  }
966
964
  `, 'maxDistance')}
967
965
 
968
- if (rb) {
969
- si.instanceIndex = ao;
970
- si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
971
- ht(si, lB, aB, hw);
966
+ if (sd) {
967
+ si.instanceIndex = am;
968
+ si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
969
+ hn(si, lR, aw, hr);
972
970
  mat4 l2w = mat4(
973
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
974
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
975
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 7),
976
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 8)
971
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
972
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
973
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
974
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
977
975
  );
978
976
  mat4 w2l = mat4(
979
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 1),
980
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 2),
981
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 3),
982
- bv(ao * ${INSTANCE_VEC4_STRIDE} + 4)
977
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
978
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
979
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
980
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
983
981
  );
984
- mat3 aD = transpose(mat3(w2l));
985
- si.faceNormal = normalize(aD * hB);
986
- si.vertexNormal = normalize(aD * si.vertexNormal);
987
- si.normal = normalize(aD * si.normal);
982
+ mat3 aG = transpose(mat3(w2l));
983
+ si.faceNormal = normalize(aG * hz);
984
+ si.vertexNormal = normalize(aG * si.vertexNormal);
985
+ si.normal = normalize(aG * si.normal);
988
986
  #ifdef USE_COAT_NORMAL_FRAMES
989
- si.coatNormal = normalize(aD * si.coatNormal);
987
+ si.coatNormal = normalize(aG * si.coatNormal);
990
988
  #endif
991
989
  #ifdef USE_TANGENT
992
990
  if (dot(si.tangent, si.tangent) > 0.0) {
@@ -1002,35 +1000,35 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
1002
1000
  }
1003
1001
  }
1004
1002
 
1005
- bool ex(in Ray ray, float lightDistance, int jL) {
1003
+ bool intersectSceneShadow(in Ray ray, float lightDistance, int jR) {
1006
1004
 
1007
1005
  if (isEmptyScene) {
1008
1006
  return false;
1009
1007
  }
1010
1008
 
1011
1009
  bool doubleSided = true;
1012
- int ey = maxDimension(abs(ray.d));
1013
- vec3 gQ = mu(ray.d, ey);
1010
+ int dZ = maxDimension(abs(ray.d));
1011
+ vec3 gH = mU(ray.d, dZ);
1014
1012
 
1015
1013
  ${getBVHTraverseCode(glsl `
1016
1014
 
1017
1015
 
1018
- bool jt = true;
1016
+ bool jA = true;
1019
1017
  vec3 barycentric = hit.barycentric;
1020
1018
  vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
1021
1019
 
1022
- if (jt) {
1020
+ if (jA) {
1023
1021
  #ifdef HAS_ALPHA
1024
- int materialIndex = int(ae(floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)).x);
1025
- ivec2 i0 = gR(index.x, vertexColumns);
1026
- ivec2 i1 = gR(index.y, vertexColumns);
1027
- ivec2 i2 = gR(index.z, vertexColumns);
1022
+ int materialIndex = int(af(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)).x);
1023
+ ivec2 i0 = gM(index.x, vertexColumns);
1024
+ ivec2 i1 = gM(index.y, vertexColumns);
1025
+ ivec2 i2 = gM(index.z, vertexColumns);
1028
1026
  ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
1029
1027
  ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
1030
1028
  ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
1031
1029
 
1032
1030
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
1033
- materialIndex = fm(m0, m1, m2, barycentric);
1031
+ materialIndex = fh(m0, m1, m2, barycentric);
1034
1032
  }
1035
1033
 
1036
1034
  int ii = materialIndex * MAT_DATA_SIZE;
@@ -1044,12 +1042,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1044
1042
  vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1045
1043
  vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
1046
1044
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1047
- vec4 lL = fetchMatData(ii + MAT_ROW_UV);
1048
- int uvProjection = int(lL.r);
1045
+ vec4 mb = fetchMatData(ii + MAT_ROW_UV);
1046
+ int uvProjection = int(mb.r);
1049
1047
  if (uvProjection > 0) {
1050
- uv = gI(uvProjection, position, hB, lL.zw);
1048
+ uv = gE(uvProjection, position, hz, mb.zw);
1051
1049
  } else {
1052
- uv *= lL.zw;
1050
+ uv *= mb.zw;
1053
1051
  }
1054
1052
 
1055
1053
  alpha *= sampleMap(diffuseMapIndex, uv).a;
@@ -1063,32 +1061,32 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1063
1061
  vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1064
1062
  vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
1065
1063
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1066
- vec4 lL = fetchMatData(ii + MAT_ROW_UV);
1067
- int uvProjection = int(lL.r);
1064
+ vec4 mb = fetchMatData(ii + MAT_ROW_UV);
1065
+ int uvProjection = int(mb.r);
1068
1066
  if (uvProjection > 0) {
1069
- uv = gI(uvProjection, position, hB, lL.zw);
1067
+ uv = gE(uvProjection, position, hz, mb.zw);
1070
1068
  } else {
1071
- uv *= lL.zw;
1069
+ uv *= mb.zw;
1072
1070
  }
1073
1071
  alpha *= sampleMap(alphaMapIndex, uv).g;
1074
1072
  }
1075
1073
  #endif
1076
1074
  float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
1077
- alpha = lr(
1075
+ alpha = lJ(
1078
1076
  alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
1079
1077
  );
1080
- if (eo(0u) > alpha) {
1078
+ if (ek(0u) > alpha) {
1081
1079
 
1082
1080
  tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1083
- jt = false;
1081
+ jA = false;
1084
1082
  }
1085
1083
  #endif
1086
1084
  }
1087
- if (jt) {
1085
+ if (jA) {
1088
1086
  return true;
1089
1087
  }
1090
1088
  `, glsl `
1091
- if (triangleIndex == jL) {
1089
+ if (triangleIndex == jR) {
1092
1090
  continue;
1093
1091
  }
1094
1092
  `, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}