@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aov.js","sourceRoot":"","sources":["../../src/renderer/aov.ts"],"names":[],"mappings":"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","sourcesContent":["/** Optional primary-surface outputs, separate from beauty and OIDN guides. */\nexport type AovKind = 'depth' | 'position' | 'roughness' | 'diffuseAlbedo' | 'specularAlbedo' | 'id' | 'motion';\nexport const AOV_KINDS: readonly AovKind[] = ['depth', 'position', 'roughness', 'diffuseAlbedo', 'specularAlbedo', 'id', 'motion'];\nexport const AOV_BACKGROUND_ID = 0xffffffff;\n// Four vec4 lanes for accumulated geometry/reflectance; two for center ID/motion.\n// Depth and roughness share a lane; coverage is position.w.\nexport const AOV_LAYOUT = {accumulatedBytes: 64, centerBytes: 32,\n depthRoughness: 0, position: 4, diffuseAlbedo: 8, specularAlbedo: 12,\n id: 0, motion: 4} as const;\nlet nextId = 0;\nexport function allocateAovId(): number {\n if (nextId >= AOV_BACKGROUND_ID) throw new RangeError('AOV ID space exhausted');\n return nextId++;\n}\nexport function validateAovId(value: number): number {\n if (!Number.isInteger(value) || value < 0 || value >= AOV_BACKGROUND_ID) throw new RangeError('AOV ID must be uint32 excluding 0xFFFFFFFF');\n return value;\n}\nexport function aovMask(kinds: readonly AovKind[]): number {\n let mask = 0;\n for (const kind of kinds) {\n const index = AOV_KINDS.indexOf(kind);\n if (index < 0) throw new RangeError(`Unknown AOV: ${kind}`);\n mask |= 1 << index;\n }\n return mask;\n}\nexport interface AovInstanceSnapshot {\n object: number; instance: number; topology: number; vertices: number;\n transform: Float32Array;\n}\nexport interface AovFrameSnapshot {\n width: number; height: number; projection: string;\n cameraEye?: Float32Array; cameraForward?: Float32Array;\n viewProjection: Float32Array; instances: readonly AovInstanceSnapshot[];\n}\n/** Per-render history; camera pose and rigid transforms may change without resetting. */\nexport class AovHistory {\n private frame?: AovFrameSnapshot;\n private instances=new Map<string,AovInstanceSnapshot>();\n clear() { this.frame = undefined; this.instances.clear(); }\n previous(next: AovFrameSnapshot): AovFrameSnapshot | undefined {\n const old = this.frame;\n return old && old.width === next.width && old.height === next.height && old.projection === next.projection ? old : undefined;\n }\n match(next: AovFrameSnapshot, instance: AovInstanceSnapshot): AovInstanceSnapshot | undefined {\n const old = this.previous(next) ? this.instances.get(`${instance.object}:${instance.instance}`) : undefined;\n return old && old.topology === instance.topology && old.vertices === instance.vertices ? old : undefined;\n }\n accept(frame: AovFrameSnapshot) {\n this.frame = {...frame, cameraEye: frame.cameraEye?.slice(), cameraForward: frame.cameraForward?.slice(), viewProjection: frame.viewProjection.slice(),\n instances: frame.instances.map(i => ({...i, transform: i.transform.slice()}))};\n this.instances.clear();\n for (const instance of this.frame.instances) this.instances.set(`${instance.object}:${instance.instance}`,instance);\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { type AovKind } from './aov.js';
2
+ /** ID lane to visualize. Default object. */
3
+ export type AovIdComponent = 'object' | 'instance' | 'material' | 'primitive';
4
+ export interface AovDisplayOptions {
5
+ depthRange: readonly [number, number];
6
+ positionScale: number;
7
+ motionScale: number;
8
+ idComponent: AovIdComponent;
9
+ }
10
+ export declare const DEFAULT_AOV_DISPLAY: AovDisplayOptions;
11
+ export declare const AOV_ID_COMPONENTS: readonly AovIdComponent[];
12
+ export declare function displayAovKind(channel: string): AovKind | undefined;
13
+ export declare function validateAovDisplay(options: AovDisplayOptions): void;
14
+ export declare function packAovDisplay(width: number, height: number, samples: number, kind: AovKind, options: AovDisplayOptions, linear: boolean): Uint32Array<ArrayBuffer>;
@@ -0,0 +1,32 @@
1
+ import { AOV_KINDS } from './aov.js';
2
+ export const DEFAULT_AOV_DISPLAY = {
3
+ depthRange: [0, 10], positionScale: 1, motionScale: 16, idComponent: 'object'
4
+ };
5
+ export const AOV_ID_COMPONENTS = ['object', 'instance', 'material', 'primitive'];
6
+ export function displayAovKind(channel) {
7
+ return AOV_KINDS.find(kind => kind === channel);
8
+ }
9
+ export function validateAovDisplay(options) {
10
+ const range = options.depthRange;
11
+ if (!Array.isArray(range) || range.length !== 2 || !range.every(Number.isFinite) || range[0] < 0 || range[1] <= range[0])
12
+ throw new RangeError('aovDepthRange requires 0 <= near < far');
13
+ if (!range.map(Math.fround).every(Number.isFinite) || Math.fround(range[1]) <= Math.fround(range[0]))
14
+ throw new RangeError('aovDepthRange must remain finite and increasing in float32');
15
+ for (const scale of [options.positionScale, options.motionScale]) {
16
+ if (!Number.isFinite(scale) || !Number.isFinite(Math.fround(scale)) || Math.fround(scale) <= 0) {
17
+ throw new RangeError('AOV display scales must be finite and positive in float32');
18
+ }
19
+ }
20
+ if (!AOV_ID_COMPONENTS.includes(options.idComponent))
21
+ throw new RangeError('Unknown AOV ID component');
22
+ }
23
+ export function packAovDisplay(width, height, samples, kind, options, linear) {
24
+ validateAovDisplay(options);
25
+ const words = new Uint32Array(12), floats = new Float32Array(words.buffer);
26
+ words.set([width, height, samples, AOV_KINDS.indexOf(kind)]);
27
+ floats.set([...options.depthRange, options.positionScale, options.motionScale], 4);
28
+ words[8] = AOV_ID_COMPONENTS.indexOf(options.idComponent);
29
+ words[9] = +linear;
30
+ return words;
31
+ }
32
+ //# sourceMappingURL=aovDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovDisplay.js","sourceRoot":"","sources":["../../src/renderer/aovDisplay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,UAAU,CAAC;AASnD,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ;CAC9E,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAA8B,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAC5G,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAClD,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QACtH,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClG,MAAM,IAAI,UAAU,CAAC,4DAA4D,CAAC,CAAC;IACrF,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;AACrD,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,MAAc,EAAE,OAAe,EAAE,IAAa,EAAE,OAA0B,EAAE,MAAe;IACvI,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3E,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IACnB,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { AOV_KINDS, type AovKind } from './aov.js';\n/** ID lane to visualize. Default object. */\nexport type AovIdComponent = 'object' | 'instance' | 'material' | 'primitive';\nexport interface AovDisplayOptions {\n depthRange: readonly [number, number];\n positionScale: number;\n motionScale: number;\n idComponent: AovIdComponent;\n}\nexport const DEFAULT_AOV_DISPLAY: AovDisplayOptions = {\n depthRange: [0, 10], positionScale: 1, motionScale: 16, idComponent: 'object'\n};\nexport const AOV_ID_COMPONENTS: readonly AovIdComponent[] = ['object', 'instance', 'material', 'primitive'];\nexport function displayAovKind(channel: string): AovKind | undefined {\n return AOV_KINDS.find(kind => kind === channel);\n}\nexport function validateAovDisplay(options: AovDisplayOptions) {\n const range = options.depthRange;\n if (!Array.isArray(range) || range.length !== 2 || !range.every(Number.isFinite) || range[0] < 0 || range[1] <= range[0])\n throw new RangeError('aovDepthRange requires 0 <= near < far');\n if (!range.map(Math.fround).every(Number.isFinite) || Math.fround(range[1]) <= Math.fround(range[0]))\n throw new RangeError('aovDepthRange must remain finite and increasing in float32');\n for (const scale of [options.positionScale, options.motionScale]) {\n if (!Number.isFinite(scale) || !Number.isFinite(Math.fround(scale)) || Math.fround(scale) <= 0) {\n throw new RangeError('AOV display scales must be finite and positive in float32');\n }\n }\n if (!AOV_ID_COMPONENTS.includes(options.idComponent))\n throw new RangeError('Unknown AOV ID component');\n}\nexport function packAovDisplay(width: number, height: number, samples: number, kind: AovKind, options: AovDisplayOptions, linear: boolean) {\n validateAovDisplay(options);\n const words = new Uint32Array(12), floats = new Float32Array(words.buffer);\n words.set([width, height, samples, AOV_KINDS.indexOf(kind)]);\n floats.set([...options.depthRange, options.positionScale, options.motionScale], 4);\n words[8] = AOV_ID_COMPONENTS.indexOf(options.idComponent);\n words[9] = +linear;\n return words;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type Camera from '../scene/Camera.js';
2
+ import type MeshState from '../scene/MeshState.js';
3
+ import type MaterialState from '../scene/MaterialState.js';
4
+ import type Geometry from '../scene/Geometry.js';
5
+ import { AovHistory, type AovFrameSnapshot } from './aov.js';
6
+ import { type MeshInstances } from './packedMeshInstances.js';
7
+ import type { FlattendBVH, BLASInstance } from './bvhAccel.js';
8
+ import type { PreparedMeshInstanceBinding } from './scenePreparation.js';
9
+ export interface AovSceneSource {
10
+ instances: MeshInstances;
11
+ instanceBindings: PreparedMeshInstanceBinding<MeshState>[];
12
+ materials: MaterialState[];
13
+ geometries: Geometry[];
14
+ blases: BLASInstance[];
15
+ }
16
+ /** Source instance index for each GPU instance, including TLAS leaf reordering. */
17
+ export declare function aovInstanceOrder(tlas: FlattendBVH): Uint32Array;
18
+ export declare function packAovScene(source: AovSceneSource, tlas: FlattendBVH, camera: Camera, width: number, height: number, history: AovHistory, primitiveIds?: Uint32Array, includePrimitives?: boolean): {
19
+ words: Uint32Array;
20
+ frame: AovFrameSnapshot;
21
+ };
@@ -0,0 +1,139 @@
1
+ import { mat4 } from '../math.js';
2
+ import { validateAovId } from './aov.js';
3
+ import { PackedMeshInstances, readMeshInstance } from './packedMeshInstances.js';
4
+ const geometryIds = new WeakMap();
5
+ let nextGeometry = 1;
6
+ function geometryId(geometry) {
7
+ let id = geometryIds.get(geometry);
8
+ if (id === undefined) {
9
+ id = nextGeometry++;
10
+ geometryIds.set(geometry, id);
11
+ }
12
+ return id;
13
+ }
14
+ /** Source instance index for each GPU instance, including TLAS leaf reordering. */
15
+ export function aovInstanceOrder(tlas) {
16
+ const u = new Uint32Array(tlas.buffer), i = new Int32Array(tlas.buffer);
17
+ const order = new Uint32Array((tlas.instancesBuffer?.byteLength ?? 0) / 160);
18
+ // Native indexed HWRT stores instances linearly and has no software TLAS.
19
+ if (!tlas.buffer.byteLength) {
20
+ for (let i = 0; i < order.length; i++)
21
+ order[i] = i;
22
+ return order;
23
+ }
24
+ function visit(node) {
25
+ const o = node * 4, count = i[o + 3];
26
+ if (count >= 0) {
27
+ visit(node + 2);
28
+ visit(count);
29
+ }
30
+ else
31
+ for (let k = 0; k < -count; k++)
32
+ order[u[o + 8 + k * 4]] = u[o + 10 + k * 4];
33
+ }
34
+ if (order.length)
35
+ visit(0);
36
+ return order;
37
+ }
38
+ export function packAovScene(source, tlas, camera, width, height, history, primitiveIds, includePrimitives = true) {
39
+ const order = aovInstanceOrder(tlas);
40
+ const instances = source.instances;
41
+ const frame = { width, height,
42
+ projection: JSON.stringify(Array.from(camera.getProjectionMatrix(width / height))),
43
+ viewProjection: new Float32Array(16), instances: [] };
44
+ const view = mat4.create();
45
+ mat4.invert(view, camera.transform);
46
+ mat4.mul(frame.viewProjection, camera.getProjectionMatrix(width / height), view);
47
+ const eye = new Float32Array([camera.transform[12], camera.transform[13], camera.transform[14], 1]);
48
+ const length = Math.hypot(camera.transform[8], camera.transform[9], camera.transform[10]);
49
+ const forward = new Float32Array([-camera.transform[8] / length, -camera.transform[9] / length, -camera.transform[10] / length, 0]);
50
+ frame.cameraEye = eye;
51
+ frame.cameraForward = forward;
52
+ const records = [];
53
+ for (let gpuIndex = 0; gpuIndex < order.length; gpuIndex++) {
54
+ const index = order[gpuIndex];
55
+ const binding = source.instanceBindings[instances instanceof PackedMeshInstances ? instances.bindingIndices[index] : index];
56
+ const mesh = binding.mesh, geometry = mesh.geometry;
57
+ records.push({ object: validateAovId(mesh.aovId), instance: instances instanceof PackedMeshInstances ? instances.localIndices[index] : 0,
58
+ topology: geometryId(geometry) + geometry.topologyVersion * 0x100000000,
59
+ vertices: geometry.version, transform: new Float32Array(readMeshInstance(instances, index).transform) });
60
+ }
61
+ frame.instances = records;
62
+ const materialOffset = 52 + order.length * 24;
63
+ const primitiveOffset = materialOffset + source.materials.length;
64
+ const primitiveCount = primitiveIds?.length ?? tlas.buffer.byteLength / 16 + source.blases.reduce((n, b) => n + b.bvh.buffer.byteLength / 16, 0);
65
+ // Web targets keep the primitive tail resident; only pack the small
66
+ // camera/instance/material prefix when their cached primitive map is supplied.
67
+ const words = new Uint32Array(primitiveOffset + (includePrimitives ? primitiveCount : 0)), floats = new Float32Array(words.buffer);
68
+ const previous = history.previous(frame);
69
+ if (previous)
70
+ floats.set(previous.viewProjection);
71
+ words[16] = materialOffset;
72
+ words[17] = primitiveOffset;
73
+ const projection = new Float32Array(Array.from(camera.getProjectionMatrix(width / height)));
74
+ let projectionHash = 2166136261;
75
+ for (const word of new Uint32Array(projection.buffer))
76
+ projectionHash = Math.imul(projectionHash ^ word, 16777619) >>> 0;
77
+ words[18] = projectionHash;
78
+ floats.set(frame.viewProjection, 20);
79
+ floats.set(eye, 36);
80
+ floats.set(forward, 40);
81
+ if (previous?.cameraEye && previous.cameraForward) {
82
+ floats.set(previous.cameraEye, 44);
83
+ floats.set(previous.cameraForward, 48);
84
+ }
85
+ const objectIds = new Set();
86
+ for (const binding of source.instanceBindings) {
87
+ const id = validateAovId(binding.mesh.aovId);
88
+ if (objectIds.has(id))
89
+ throw new Error('AOV object IDs must be unique');
90
+ objectIds.add(id);
91
+ }
92
+ records.forEach((record, index) => {
93
+ const o = 52 + index * 24;
94
+ words[o] = record.object;
95
+ words[o + 1] = record.instance;
96
+ const old = history.match(frame, record), inverse = mat4.create();
97
+ if (old && mat4.invert(inverse, record.transform)) {
98
+ const reprojection = mat4.create();
99
+ mat4.mul(reprojection, old.transform, inverse);
100
+ floats.set(Array.from(reprojection), o + 4);
101
+ words[o + 2] = 1;
102
+ }
103
+ });
104
+ const materialIds = new Set();
105
+ source.materials.forEach((material, index) => {
106
+ const id = validateAovId(material.aovId);
107
+ if (materialIds.has(id))
108
+ throw new Error('AOV material IDs must be unique');
109
+ materialIds.add(id);
110
+ words[materialOffset + index] = id;
111
+ });
112
+ if (!includePrimitives)
113
+ return { words, frame };
114
+ words.fill(0xffffffff, primitiveOffset);
115
+ if (primitiveIds) {
116
+ words.set(primitiveIds, primitiveOffset);
117
+ return { words, frame };
118
+ }
119
+ let base = tlas.buffer.byteLength / 16;
120
+ source.blases.forEach((blas, index) => {
121
+ const bvh = new Uint32Array(blas.bvh.buffer), indices = source.geometries[index].indexArray;
122
+ const triangles = new Map();
123
+ for (let t = 0; t < indices.length / 3; t++)
124
+ triangles.set(`${indices[t * 3]},${indices[t * 3 + 1]},${indices[t * 3 + 2]}`, t);
125
+ for (let record = 0; record < bvh.length / 4; record++) {
126
+ const t = triangles.get(`${bvh[record * 4]},${bvh[record * 4 + 1]},${bvh[record * 4 + 2]}`);
127
+ if (t !== undefined)
128
+ words[primitiveOffset + base + record] = t;
129
+ }
130
+ // Explicit builder metadata disambiguates duplicate index triples.
131
+ const ids = blas.bvh.triangleIds;
132
+ if (ids)
133
+ for (let i = 0; i < ids.length; i += 2)
134
+ words[primitiveOffset + base + ids[i]] = ids[i + 1];
135
+ base += bvh.length / 4;
136
+ });
137
+ return { words, frame };
138
+ }
139
+ //# sourceMappingURL=aovScene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovScene.js","sourceRoot":"","sources":["../../src/renderer/aovScene.ts"],"names":[],"mappings":"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","sourcesContent":["import {mat4} from '../math.js';\nimport type Camera from '../scene/Camera.js';\nimport type MeshState from '../scene/MeshState.js';\nimport type MaterialState from '../scene/MaterialState.js';\nimport type Geometry from '../scene/Geometry.js';\nimport {AovHistory, validateAovId, type AovFrameSnapshot, type AovInstanceSnapshot} from './aov.js';\nimport {PackedMeshInstances, readMeshInstance, type MeshInstances} from './packedMeshInstances.js';\nimport type {FlattendBVH, BLASInstance} from './bvhAccel.js';\nimport type {PreparedMeshInstanceBinding} from './scenePreparation.js';\nconst geometryIds = new WeakMap<Geometry, number>();\nlet nextGeometry = 1;\nfunction geometryId(geometry: Geometry) {\n let id = geometryIds.get(geometry);\n if (id === undefined) { id = nextGeometry++; geometryIds.set(geometry, id); }\n return id;\n}\nexport interface AovSceneSource {\n instances: MeshInstances;\n instanceBindings: PreparedMeshInstanceBinding<MeshState>[];\n materials: MaterialState[];\n geometries: Geometry[];\n blases: BLASInstance[];\n}\n/** Source instance index for each GPU instance, including TLAS leaf reordering. */\nexport function aovInstanceOrder(tlas: FlattendBVH): Uint32Array {\n const u = new Uint32Array(tlas.buffer), i = new Int32Array(tlas.buffer);\n const order = new Uint32Array((tlas.instancesBuffer?.byteLength ?? 0) / 160);\n // Native indexed HWRT stores instances linearly and has no software TLAS.\n if (!tlas.buffer.byteLength) { for(let i=0;i<order.length;i++)order[i]=i; return order; }\n function visit(node: number) {\n const o = node * 4, count = i[o + 3];\n if (count >= 0) { visit(node + 2); visit(count); }\n else for (let k = 0; k < -count; k++) order[u[o + 8 + k * 4]] = u[o + 10 + k * 4];\n }\n if (order.length) visit(0);\n return order;\n}\nexport function packAovScene(source: AovSceneSource, tlas: FlattendBVH, camera: Camera,\n width: number, height: number, history: AovHistory, primitiveIds?: Uint32Array, includePrimitives = true): {words: Uint32Array; frame: AovFrameSnapshot} {\n const order = aovInstanceOrder(tlas);\n const instances = source.instances;\n const frame: AovFrameSnapshot = {width, height,\n projection: JSON.stringify(Array.from(camera.getProjectionMatrix(width / height))),\n viewProjection: new Float32Array(16), instances: []};\n const view = mat4.create(); mat4.invert(view, camera.transform);\n mat4.mul(frame.viewProjection, camera.getProjectionMatrix(width / height), view);\n const eye = new Float32Array([camera.transform[12],camera.transform[13],camera.transform[14],1]);\n const length = Math.hypot(camera.transform[8],camera.transform[9],camera.transform[10]);\n const forward = new Float32Array([-camera.transform[8]/length,-camera.transform[9]/length,-camera.transform[10]/length,0]);\n frame.cameraEye=eye; frame.cameraForward=forward;\n const records: AovInstanceSnapshot[] = [];\n for (let gpuIndex = 0; gpuIndex < order.length; gpuIndex++) {\n const index = order[gpuIndex];\n const binding = source.instanceBindings[instances instanceof PackedMeshInstances ? instances.bindingIndices[index] : index];\n const mesh = binding.mesh, geometry = mesh.geometry;\n records.push({object: validateAovId(mesh.aovId), instance: instances instanceof PackedMeshInstances ? instances.localIndices[index] : 0,\n topology: geometryId(geometry) + geometry.topologyVersion * 0x100000000,\n vertices: geometry.version, transform: new Float32Array(readMeshInstance(instances, index).transform)});\n }\n frame.instances = records;\n const materialOffset = 52 + order.length * 24;\n const primitiveOffset = materialOffset + source.materials.length;\n const primitiveCount = primitiveIds?.length ?? tlas.buffer.byteLength / 16 + source.blases.reduce((n, b) => n + b.bvh.buffer.byteLength / 16, 0);\n // Web targets keep the primitive tail resident; only pack the small\n // camera/instance/material prefix when their cached primitive map is supplied.\n const words = new Uint32Array(primitiveOffset + (includePrimitives ? primitiveCount : 0)), floats = new Float32Array(words.buffer);\n const previous = history.previous(frame);\n if (previous) floats.set(previous.viewProjection);\n words[16] = materialOffset; words[17] = primitiveOffset;\n const projection = new Float32Array(Array.from(camera.getProjectionMatrix(width/height)));\n let projectionHash=2166136261;\n for (const word of new Uint32Array(projection.buffer)) projectionHash=Math.imul(projectionHash^word,16777619)>>>0;\n words[18]=projectionHash;\n floats.set(frame.viewProjection,20);\n floats.set(eye,36);floats.set(forward,40);\n if(previous?.cameraEye && previous.cameraForward){floats.set(previous.cameraEye,44);floats.set(previous.cameraForward,48);}\n const objectIds = new Set<number>();\n for (const binding of source.instanceBindings) {\n const id = validateAovId(binding.mesh.aovId);\n if (objectIds.has(id)) throw new Error('AOV object IDs must be unique');\n objectIds.add(id);\n }\n records.forEach((record, index) => {\n const o = 52 + index * 24;\n words[o] = record.object; words[o + 1] = record.instance;\n const old = history.match(frame, record), inverse = mat4.create();\n if (old && mat4.invert(inverse, record.transform)) {\n const reprojection = mat4.create(); mat4.mul(reprojection, old.transform, inverse);\n floats.set(Array.from(reprojection), o + 4); words[o + 2] = 1;\n }\n });\n const materialIds = new Set<number>();\n source.materials.forEach((material, index) => {\n const id = validateAovId(material.aovId);\n if (materialIds.has(id)) throw new Error('AOV material IDs must be unique');\n materialIds.add(id); words[materialOffset + index] = id;\n });\n if (!includePrimitives) return {words, frame};\n words.fill(0xffffffff, primitiveOffset);\n if(primitiveIds){words.set(primitiveIds,primitiveOffset);return {words,frame};}\n let base = tlas.buffer.byteLength / 16;\n source.blases.forEach((blas, index) => {\n const bvh = new Uint32Array(blas.bvh.buffer), indices = source.geometries[index].indexArray;\n const triangles = new Map<string, number>();\n for (let t = 0; t < indices.length / 3; t++) triangles.set(`${indices[t*3]},${indices[t*3+1]},${indices[t*3+2]}`, t);\n for (let record = 0; record < bvh.length / 4; record++) {\n const t = triangles.get(`${bvh[record*4]},${bvh[record*4+1]},${bvh[record*4+2]}`);\n if (t !== undefined) words[primitiveOffset + base + record] = t;\n }\n // Explicit builder metadata disambiguates duplicate index triples.\n const ids = blas.bvh.triangleIds;\n if (ids) for (let i = 0; i < ids.length; i += 2) words[primitiveOffset + base + ids[i]] = ids[i+1];\n base += bvh.length / 4;\n });\n return {words, frame};\n}\n"]}
@@ -187,7 +187,8 @@ export function buildBinnedSahBvh(aabbs, count) {
187
187
  src++;
188
188
  }
189
189
  else {
190
- primIndices[src] = primIndices[--j];
190
+ // Explicit numeric expression also supports scriptc typed-array stores.
191
+ primIndices[src + 0] = primIndices[--j];
191
192
  primIndices[j] = p;
192
193
  }
193
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"binnedSahBvh.js","sourceRoot":"","sources":["../../src/renderer/binnedSahBvh.ts"],"names":[],"mappings":"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","sourcesContent":["// Binned SAH BVH builder ported from TinyBVH's reference builder\n// (`BVH::Build( nodeIdx, depth )` in tiny_bvh.h at commit\n// 0e4584287823252cf83f0e9cd072848bec5f79c5, https://github.com/jbikker/tinybvh).\n// Copyright (c) 2024-2026 Jacco Bikker / Breda University of Applied Sciences.\n// MIT License, see src/tinybvh/LICENSE.\n//\n// Like the reference, it bins primitive centroids into 8 bins on all three\n// axes, sweeps the bins for the lowest surface area heuristic cost and stops\n// splitting when a leaf is cheaper (C_INT = C_TRAV = 1). Siblings are stored\n// next to each other: an interior node's children are leftFirst and\n// leftFirst + 1. Unlike the reference, node 1 is not left unused, the task\n// stack grows instead of turning a node into a leaf after 512 entries, and\n// arithmetic is float64: near-equal split costs can resolve differently from\n// TinyBVH's float32, giving trees of the same quality that are not\n// byte-identical.\n\nconst BINS = 8;\nconst C_INT = 1;\nconst C_TRAV = 1;\nconst FAR = 1e30;\n\nexport interface BinnedSahBvh {\n nodeCount: number;\n /** Per node: min x, y, z, max x, y, z. */\n bounds: Float32Array;\n /** Interior node: index of the left child. Leaf: first slot in primIndices. */\n leftFirst: Uint32Array;\n /** Primitive count of a leaf; 0 for interior nodes. */\n primCount: Uint32Array;\n /** Primitive indices referenced by leaves. */\n primIndices: Uint32Array;\n}\n\n// Scratch shared by all builds; the builder is synchronous.\nconst binMin = new Float64Array(3 * BINS * 3);\nconst binMax = new Float64Array(3 * BINS * 3);\nconst binCount = new Uint32Array(3 * BINS);\n// Per split position: half area times primitive count of each side.\nconst leftCost = new Float64Array(BINS - 1);\nconst rightCost = new Float64Array(BINS - 1);\n\n/**\n * Bin of a centroid along one axis. Binning and partitioning both use this,\n * so every primitive ends up on the side whose bounds include its bin.\n */\nfunction binOf(center: number, nodeMin: number, scale: number) {\n const bin = ((center - nodeMin) * scale) | 0;\n return bin < 0 ? 0 : bin > BINS - 1 ? BINS - 1 : bin;\n}\n\nfunction growBin(\n o: number,\n minX: number, minY: number, minZ: number,\n maxX: number, maxY: number, maxZ: number\n) {\n binMin[o] = Math.min(binMin[o], minX);\n binMin[o + 1] = Math.min(binMin[o + 1], minY);\n binMin[o + 2] = Math.min(binMin[o + 2], minZ);\n binMax[o] = Math.max(binMax[o], maxX);\n binMax[o + 1] = Math.max(binMax[o + 1], maxY);\n binMax[o + 2] = Math.max(binMax[o + 2], maxZ);\n}\n\n/**\n * Builds a binary BVH over axis-aligned boxes.\n * @param aabbs min x, y, z, max x, y, z for each primitive.\n * @param count number of primitives in `aabbs`.\n */\nexport function buildBinnedSahBvh(aabbs: Float32Array, count: number): BinnedSahBvh {\n const capacity = Math.max(1, count * 2 - 1);\n const bounds = new Float32Array(capacity * 6);\n const leftFirst = new Uint32Array(capacity);\n const primCount = new Uint32Array(capacity);\n const primIndices = new Uint32Array(count);\n if (count === 0) {\n return { nodeCount: 0, bounds, leftFirst, primCount, primIndices };\n }\n\n const centers = new Float32Array(count * 3);\n let rootMinX = FAR, rootMinY = FAR, rootMinZ = FAR;\n let rootMaxX = -FAR, rootMaxY = -FAR, rootMaxZ = -FAR;\n for (let i = 0; i < count; i++) {\n const b = i * 6, c = i * 3;\n const minX = aabbs[b], minY = aabbs[b + 1], minZ = aabbs[b + 2];\n const maxX = aabbs[b + 3], maxY = aabbs[b + 4], maxZ = aabbs[b + 5];\n centers[c] = (minX + maxX) * 0.5;\n centers[c + 1] = (minY + maxY) * 0.5;\n centers[c + 2] = (minZ + maxZ) * 0.5;\n if (minX < rootMinX) rootMinX = minX;\n if (minY < rootMinY) rootMinY = minY;\n if (minZ < rootMinZ) rootMinZ = minZ;\n if (maxX > rootMaxX) rootMaxX = maxX;\n if (maxY > rootMaxY) rootMaxY = maxY;\n if (maxZ > rootMaxZ) rootMaxZ = maxZ;\n primIndices[i] = i;\n }\n bounds[0] = rootMinX; bounds[1] = rootMinY; bounds[2] = rootMinZ;\n bounds[3] = rootMaxX; bounds[4] = rootMaxY; bounds[5] = rootMaxZ;\n leftFirst[0] = 0;\n primCount[0] = count;\n\n const minDimX = (rootMaxX - rootMinX) * 1e-20;\n const minDimY = (rootMaxY - rootMinY) * 1e-20;\n const minDimZ = (rootMaxZ - rootMinZ) * 1e-20;\n\n let newNode = 1;\n const tasks: number[] = [];\n let nodeIndex = 0;\n while (true) {\n while (true) {\n const nb = nodeIndex * 6;\n const nMinX = bounds[nb], nMinY = bounds[nb + 1], nMinZ = bounds[nb + 2];\n const extentX = bounds[nb + 3] - nMinX;\n const extentY = bounds[nb + 4] - nMinY;\n const extentZ = bounds[nb + 5] - nMinZ;\n const area = extentX * extentY + extentY * extentZ + extentZ * extentX;\n if (area === 0) break; // can't split an infinitely small node.\n\n const first = leftFirst[nodeIndex];\n const nodePrims = primCount[nodeIndex];\n // Every split of a single primitive leaves one side empty.\n if (nodePrims === 1) break;\n const scaleX = extentX > minDimX ? BINS / extentX : 0;\n const scaleY = extentY > minDimY ? BINS / extentY : 0;\n const scaleZ = extentZ > minDimZ ? BINS / extentZ : 0;\n\n for (let i = 0; i < 3 * BINS * 3; i++) {\n binMin[i] = FAR;\n binMax[i] = -FAR;\n }\n binCount.fill(0);\n for (let i = first, end = first + nodePrims; i < end; i++) {\n const p = primIndices[i];\n const c = p * 3, b = p * 6;\n const minX = aabbs[b], minY = aabbs[b + 1], minZ = aabbs[b + 2];\n const maxX = aabbs[b + 3], maxY = aabbs[b + 4], maxZ = aabbs[b + 5];\n // Axis a, bin i: bounds at ((a * BINS) + i) * 3.\n const bx = binOf(centers[c], nMinX, scaleX);\n const by = BINS + binOf(centers[c + 1], nMinY, scaleY);\n const bz = 2 * BINS + binOf(centers[c + 2], nMinZ, scaleZ);\n binCount[bx]++; binCount[by]++; binCount[bz]++;\n growBin(bx * 3, minX, minY, minZ, maxX, maxY, maxZ);\n growBin(by * 3, minX, minY, minZ, maxX, maxY, maxZ);\n growBin(bz * 3, minX, minY, minZ, maxX, maxY, maxZ);\n }\n\n // Sweep the bins of each axis for the lowest split cost.\n let splitCost = FAR;\n let bestAxis = 0, bestPos = 0;\n for (let axis = 0; axis < 3; axis++) {\n const extent = axis === 0 ? extentX : axis === 1 ? extentY : extentZ;\n const minDim = axis === 0 ? minDimX : axis === 1 ? minDimY : minDimZ;\n if (!(extent > minDim)) continue;\n let lMinX = FAR, lMinY = FAR, lMinZ = FAR, lMaxX = -FAR, lMaxY = -FAR, lMaxZ = -FAR;\n let rMinX = FAR, rMinY = FAR, rMinZ = FAR, rMaxX = -FAR, rMaxY = -FAR, rMaxZ = -FAR;\n let leftN = 0, rightN = 0;\n for (let i = 0; i < BINS - 1; i++) {\n const l = (axis * BINS + i) * 3;\n const r = (axis * BINS + BINS - 1 - i) * 3;\n lMinX = Math.min(lMinX, binMin[l]); lMinY = Math.min(lMinY, binMin[l + 1]); lMinZ = Math.min(lMinZ, binMin[l + 2]);\n lMaxX = Math.max(lMaxX, binMax[l]); lMaxY = Math.max(lMaxY, binMax[l + 1]); lMaxZ = Math.max(lMaxZ, binMax[l + 2]);\n rMinX = Math.min(rMinX, binMin[r]); rMinY = Math.min(rMinY, binMin[r + 1]); rMinZ = Math.min(rMinZ, binMin[r + 2]);\n rMaxX = Math.max(rMaxX, binMax[r]); rMaxY = Math.max(rMaxY, binMax[r + 1]); rMaxZ = Math.max(rMaxZ, binMax[r + 2]);\n leftN += binCount[axis * BINS + i];\n rightN += binCount[axis * BINS + BINS - 1 - i];\n const lx = lMaxX - lMinX, ly = lMaxY - lMinY, lz = lMaxZ - lMinZ;\n const rx = rMaxX - rMinX, ry = rMaxY - rMinY, rz = rMaxZ - rMinZ;\n leftCost[i] = leftN === 0 ? FAR : (lx * ly + ly * lz + lz * lx) * leftN;\n rightCost[BINS - 2 - i] = rightN === 0 ? FAR : (rx * ry + ry * rz + rz * rx) * rightN;\n }\n for (let i = 0; i < BINS - 1; i++) {\n const cost = leftCost[i] + rightCost[i];\n if (cost < splitCost) {\n splitCost = cost;\n bestAxis = axis;\n bestPos = i;\n }\n }\n }\n splitCost = C_TRAV + C_INT * splitCost / area;\n // Not splitting is better (also stops on non-finite bounds).\n if (!(splitCost < nodePrims * C_INT)) break;\n\n // In-place partition by the chosen bin.\n const scale = bestAxis === 0 ? scaleX : bestAxis === 1 ? scaleY : scaleZ;\n const nMin = bestAxis === 0 ? nMinX : bestAxis === 1 ? nMinY : nMinZ;\n let j = first + nodePrims, src = first;\n for (let i = 0; i < nodePrims; i++) {\n const p = primIndices[src];\n if (binOf(centers[p * 3 + bestAxis], nMin, scale) <= bestPos) {\n src++;\n } else {\n primIndices[src] = primIndices[--j];\n primIndices[j] = p;\n }\n }\n const leftPrims = src - first;\n const rightPrims = nodePrims - leftPrims;\n if (leftPrims === 0 || rightPrims === 0) break; // should not happen.\n\n const n = newNode;\n newNode += 2;\n // Child bounds are the unions of the bins on each side of the split.\n const leftBase = n * 6, rightBase = leftBase + 6;\n for (let k = 0; k < 3; k++) {\n bounds[leftBase + k] = bounds[rightBase + k] = FAR;\n bounds[leftBase + 3 + k] = bounds[rightBase + 3 + k] = -FAR;\n }\n for (let i = 0; i < BINS; i++) {\n const o = (bestAxis * BINS + i) * 3;\n const base = i <= bestPos ? leftBase : rightBase;\n for (let k = 0; k < 3; k++) {\n if (binMin[o + k] < bounds[base + k]) bounds[base + k] = binMin[o + k];\n if (binMax[o + k] > bounds[base + 3 + k]) bounds[base + 3 + k] = binMax[o + k];\n }\n }\n leftFirst[n] = first; primCount[n] = leftPrims;\n leftFirst[n + 1] = j; primCount[n + 1] = rightPrims;\n leftFirst[nodeIndex] = n; primCount[nodeIndex] = 0;\n tasks.push(n + 1);\n nodeIndex = n;\n }\n if (!tasks.length) break;\n nodeIndex = tasks.pop()!;\n }\n\n return { nodeCount: newNode, bounds, leftFirst, primCount, primIndices };\n}\n\nexport interface Bvh2Layout {\n /** Node indices in depth-first order (node, left subtree, right subtree). */\n order: Uint32Array;\n /** Offset of each node in vec4 units: 2 per node plus 1 per leaf primitive. */\n offsets: Uint32Array;\n vec4Count: number;\n maxDepth: number;\n maxLeafPrimitives: number;\n}\n\n/**\n * Places nodes in the depth-first BVH2 layout read by the traversal shaders:\n * the left child follows its parent and leaf primitives follow their leaf.\n */\nexport function layoutBvh2(bvh: BinnedSahBvh): Bvh2Layout {\n const { nodeCount, leftFirst, primCount } = bvh;\n const order = new Uint32Array(nodeCount);\n const offsets = new Uint32Array(nodeCount);\n let vec4Count = 0, maxDepth = 0, maxLeafPrimitives = 0;\n if (!nodeCount) return { order, offsets, vec4Count, maxDepth, maxLeafPrimitives };\n const stack: number[] = [0, 1];\n let written = 0;\n while (stack.length) {\n const depth = stack.pop()!;\n const node = stack.pop()!;\n order[written++] = node;\n offsets[node] = vec4Count;\n if (depth > maxDepth) maxDepth = depth;\n const prims = primCount[node];\n vec4Count += 2 + prims;\n if (prims) {\n if (prims > maxLeafPrimitives) maxLeafPrimitives = prims;\n } else {\n stack.push(leftFirst[node] + 1, depth + 1, leftFirst[node], depth + 1);\n }\n }\n return { order, offsets, vec4Count, maxDepth, maxLeafPrimitives };\n}\n"]}
1
+ {"version":3,"file":"binnedSahBvh.js","sourceRoot":"","sources":["../../src/renderer/binnedSahBvh.ts"],"names":[],"mappings":"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","sourcesContent":["// Binned SAH BVH builder ported from TinyBVH's reference builder\n// (`BVH::Build( nodeIdx, depth )` in tiny_bvh.h at commit\n// 0e4584287823252cf83f0e9cd072848bec5f79c5, https://github.com/jbikker/tinybvh).\n// Copyright (c) 2024-2026 Jacco Bikker / Breda University of Applied Sciences.\n// MIT License, see src/tinybvh/LICENSE.\n//\n// Like the reference, it bins primitive centroids into 8 bins on all three\n// axes, sweeps the bins for the lowest surface area heuristic cost and stops\n// splitting when a leaf is cheaper (C_INT = C_TRAV = 1). Siblings are stored\n// next to each other: an interior node's children are leftFirst and\n// leftFirst + 1. Unlike the reference, node 1 is not left unused, the task\n// stack grows instead of turning a node into a leaf after 512 entries, and\n// arithmetic is float64: near-equal split costs can resolve differently from\n// TinyBVH's float32, giving trees of the same quality that are not\n// byte-identical.\n\nconst BINS = 8;\nconst C_INT = 1;\nconst C_TRAV = 1;\nconst FAR = 1e30;\n\nexport interface BinnedSahBvh {\n nodeCount: number;\n /** Per node: min x, y, z, max x, y, z. */\n bounds: Float32Array;\n /** Interior node: index of the left child. Leaf: first slot in primIndices. */\n leftFirst: Uint32Array;\n /** Primitive count of a leaf; 0 for interior nodes. */\n primCount: Uint32Array;\n /** Primitive indices referenced by leaves. */\n primIndices: Uint32Array;\n}\n\n// Scratch shared by all builds; the builder is synchronous.\nconst binMin = new Float64Array(3 * BINS * 3);\nconst binMax = new Float64Array(3 * BINS * 3);\nconst binCount = new Uint32Array(3 * BINS);\n// Per split position: half area times primitive count of each side.\nconst leftCost = new Float64Array(BINS - 1);\nconst rightCost = new Float64Array(BINS - 1);\n\n/**\n * Bin of a centroid along one axis. Binning and partitioning both use this,\n * so every primitive ends up on the side whose bounds include its bin.\n */\nfunction binOf(center: number, nodeMin: number, scale: number) {\n const bin = ((center - nodeMin) * scale) | 0;\n return bin < 0 ? 0 : bin > BINS - 1 ? BINS - 1 : bin;\n}\n\nfunction growBin(\n o: number,\n minX: number, minY: number, minZ: number,\n maxX: number, maxY: number, maxZ: number\n) {\n binMin[o] = Math.min(binMin[o], minX);\n binMin[o + 1] = Math.min(binMin[o + 1], minY);\n binMin[o + 2] = Math.min(binMin[o + 2], minZ);\n binMax[o] = Math.max(binMax[o], maxX);\n binMax[o + 1] = Math.max(binMax[o + 1], maxY);\n binMax[o + 2] = Math.max(binMax[o + 2], maxZ);\n}\n\n/**\n * Builds a binary BVH over axis-aligned boxes.\n * @param aabbs min x, y, z, max x, y, z for each primitive.\n * @param count number of primitives in `aabbs`.\n */\nexport function buildBinnedSahBvh(aabbs: Float32Array, count: number): BinnedSahBvh {\n const capacity = Math.max(1, count * 2 - 1);\n const bounds = new Float32Array(capacity * 6);\n const leftFirst = new Uint32Array(capacity);\n const primCount = new Uint32Array(capacity);\n const primIndices = new Uint32Array(count);\n if (count === 0) {\n return { nodeCount: 0, bounds, leftFirst, primCount, primIndices };\n }\n\n const centers = new Float32Array(count * 3);\n let rootMinX = FAR, rootMinY = FAR, rootMinZ = FAR;\n let rootMaxX = -FAR, rootMaxY = -FAR, rootMaxZ = -FAR;\n for (let i = 0; i < count; i++) {\n const b = i * 6, c = i * 3;\n const minX = aabbs[b], minY = aabbs[b + 1], minZ = aabbs[b + 2];\n const maxX = aabbs[b + 3], maxY = aabbs[b + 4], maxZ = aabbs[b + 5];\n centers[c] = (minX + maxX) * 0.5;\n centers[c + 1] = (minY + maxY) * 0.5;\n centers[c + 2] = (minZ + maxZ) * 0.5;\n if (minX < rootMinX) rootMinX = minX;\n if (minY < rootMinY) rootMinY = minY;\n if (minZ < rootMinZ) rootMinZ = minZ;\n if (maxX > rootMaxX) rootMaxX = maxX;\n if (maxY > rootMaxY) rootMaxY = maxY;\n if (maxZ > rootMaxZ) rootMaxZ = maxZ;\n primIndices[i] = i;\n }\n bounds[0] = rootMinX; bounds[1] = rootMinY; bounds[2] = rootMinZ;\n bounds[3] = rootMaxX; bounds[4] = rootMaxY; bounds[5] = rootMaxZ;\n leftFirst[0] = 0;\n primCount[0] = count;\n\n const minDimX = (rootMaxX - rootMinX) * 1e-20;\n const minDimY = (rootMaxY - rootMinY) * 1e-20;\n const minDimZ = (rootMaxZ - rootMinZ) * 1e-20;\n\n let newNode = 1;\n const tasks: number[] = [];\n let nodeIndex = 0;\n while (true) {\n while (true) {\n const nb = nodeIndex * 6;\n const nMinX = bounds[nb], nMinY = bounds[nb + 1], nMinZ = bounds[nb + 2];\n const extentX = bounds[nb + 3] - nMinX;\n const extentY = bounds[nb + 4] - nMinY;\n const extentZ = bounds[nb + 5] - nMinZ;\n const area = extentX * extentY + extentY * extentZ + extentZ * extentX;\n if (area === 0) break; // can't split an infinitely small node.\n\n const first = leftFirst[nodeIndex];\n const nodePrims = primCount[nodeIndex];\n // Every split of a single primitive leaves one side empty.\n if (nodePrims === 1) break;\n const scaleX = extentX > minDimX ? BINS / extentX : 0;\n const scaleY = extentY > minDimY ? BINS / extentY : 0;\n const scaleZ = extentZ > minDimZ ? BINS / extentZ : 0;\n\n for (let i = 0; i < 3 * BINS * 3; i++) {\n binMin[i] = FAR;\n binMax[i] = -FAR;\n }\n binCount.fill(0);\n for (let i = first, end = first + nodePrims; i < end; i++) {\n const p = primIndices[i];\n const c = p * 3, b = p * 6;\n const minX = aabbs[b], minY = aabbs[b + 1], minZ = aabbs[b + 2];\n const maxX = aabbs[b + 3], maxY = aabbs[b + 4], maxZ = aabbs[b + 5];\n // Axis a, bin i: bounds at ((a * BINS) + i) * 3.\n const bx = binOf(centers[c], nMinX, scaleX);\n const by = BINS + binOf(centers[c + 1], nMinY, scaleY);\n const bz = 2 * BINS + binOf(centers[c + 2], nMinZ, scaleZ);\n binCount[bx]++; binCount[by]++; binCount[bz]++;\n growBin(bx * 3, minX, minY, minZ, maxX, maxY, maxZ);\n growBin(by * 3, minX, minY, minZ, maxX, maxY, maxZ);\n growBin(bz * 3, minX, minY, minZ, maxX, maxY, maxZ);\n }\n\n // Sweep the bins of each axis for the lowest split cost.\n let splitCost = FAR;\n let bestAxis = 0, bestPos = 0;\n for (let axis = 0; axis < 3; axis++) {\n const extent = axis === 0 ? extentX : axis === 1 ? extentY : extentZ;\n const minDim = axis === 0 ? minDimX : axis === 1 ? minDimY : minDimZ;\n if (!(extent > minDim)) continue;\n let lMinX = FAR, lMinY = FAR, lMinZ = FAR, lMaxX = -FAR, lMaxY = -FAR, lMaxZ = -FAR;\n let rMinX = FAR, rMinY = FAR, rMinZ = FAR, rMaxX = -FAR, rMaxY = -FAR, rMaxZ = -FAR;\n let leftN = 0, rightN = 0;\n for (let i = 0; i < BINS - 1; i++) {\n const l = (axis * BINS + i) * 3;\n const r = (axis * BINS + BINS - 1 - i) * 3;\n lMinX = Math.min(lMinX, binMin[l]); lMinY = Math.min(lMinY, binMin[l + 1]); lMinZ = Math.min(lMinZ, binMin[l + 2]);\n lMaxX = Math.max(lMaxX, binMax[l]); lMaxY = Math.max(lMaxY, binMax[l + 1]); lMaxZ = Math.max(lMaxZ, binMax[l + 2]);\n rMinX = Math.min(rMinX, binMin[r]); rMinY = Math.min(rMinY, binMin[r + 1]); rMinZ = Math.min(rMinZ, binMin[r + 2]);\n rMaxX = Math.max(rMaxX, binMax[r]); rMaxY = Math.max(rMaxY, binMax[r + 1]); rMaxZ = Math.max(rMaxZ, binMax[r + 2]);\n leftN += binCount[axis * BINS + i];\n rightN += binCount[axis * BINS + BINS - 1 - i];\n const lx = lMaxX - lMinX, ly = lMaxY - lMinY, lz = lMaxZ - lMinZ;\n const rx = rMaxX - rMinX, ry = rMaxY - rMinY, rz = rMaxZ - rMinZ;\n leftCost[i] = leftN === 0 ? FAR : (lx * ly + ly * lz + lz * lx) * leftN;\n rightCost[BINS - 2 - i] = rightN === 0 ? FAR : (rx * ry + ry * rz + rz * rx) * rightN;\n }\n for (let i = 0; i < BINS - 1; i++) {\n const cost = leftCost[i] + rightCost[i];\n if (cost < splitCost) {\n splitCost = cost;\n bestAxis = axis;\n bestPos = i;\n }\n }\n }\n splitCost = C_TRAV + C_INT * splitCost / area;\n // Not splitting is better (also stops on non-finite bounds).\n if (!(splitCost < nodePrims * C_INT)) break;\n\n // In-place partition by the chosen bin.\n const scale = bestAxis === 0 ? scaleX : bestAxis === 1 ? scaleY : scaleZ;\n const nMin = bestAxis === 0 ? nMinX : bestAxis === 1 ? nMinY : nMinZ;\n let j = first + nodePrims, src = first;\n for (let i = 0; i < nodePrims; i++) {\n const p = primIndices[src];\n if (binOf(centers[p * 3 + bestAxis], nMin, scale) <= bestPos) {\n src++;\n } else {\n // Explicit numeric expression also supports scriptc typed-array stores.\n primIndices[src + 0] = primIndices[--j];\n primIndices[j] = p;\n }\n }\n const leftPrims = src - first;\n const rightPrims = nodePrims - leftPrims;\n if (leftPrims === 0 || rightPrims === 0) break; // should not happen.\n\n const n = newNode;\n newNode += 2;\n // Child bounds are the unions of the bins on each side of the split.\n const leftBase = n * 6, rightBase = leftBase + 6;\n for (let k = 0; k < 3; k++) {\n bounds[leftBase + k] = bounds[rightBase + k] = FAR;\n bounds[leftBase + 3 + k] = bounds[rightBase + 3 + k] = -FAR;\n }\n for (let i = 0; i < BINS; i++) {\n const o = (bestAxis * BINS + i) * 3;\n const base = i <= bestPos ? leftBase : rightBase;\n for (let k = 0; k < 3; k++) {\n if (binMin[o + k] < bounds[base + k]) bounds[base + k] = binMin[o + k];\n if (binMax[o + k] > bounds[base + 3 + k]) bounds[base + 3 + k] = binMax[o + k];\n }\n }\n leftFirst[n] = first; primCount[n] = leftPrims;\n leftFirst[n + 1] = j; primCount[n + 1] = rightPrims;\n leftFirst[nodeIndex] = n; primCount[nodeIndex] = 0;\n tasks.push(n + 1);\n nodeIndex = n;\n }\n if (!tasks.length) break;\n nodeIndex = tasks.pop()!;\n }\n\n return { nodeCount: newNode, bounds, leftFirst, primCount, primIndices };\n}\n\nexport interface Bvh2Layout {\n /** Node indices in depth-first order (node, left subtree, right subtree). */\n order: Uint32Array;\n /** Offset of each node in vec4 units: 2 per node plus 1 per leaf primitive. */\n offsets: Uint32Array;\n vec4Count: number;\n maxDepth: number;\n maxLeafPrimitives: number;\n}\n\n/**\n * Places nodes in the depth-first BVH2 layout read by the traversal shaders:\n * the left child follows its parent and leaf primitives follow their leaf.\n */\nexport function layoutBvh2(bvh: BinnedSahBvh): Bvh2Layout {\n const { nodeCount, leftFirst, primCount } = bvh;\n const order = new Uint32Array(nodeCount);\n const offsets = new Uint32Array(nodeCount);\n let vec4Count = 0, maxDepth = 0, maxLeafPrimitives = 0;\n if (!nodeCount) return { order, offsets, vec4Count, maxDepth, maxLeafPrimitives };\n const stack: number[] = [0, 1];\n let written = 0;\n while (stack.length) {\n const depth = stack.pop()!;\n const node = stack.pop()!;\n order[written++] = node;\n offsets[node] = vec4Count;\n if (depth > maxDepth) maxDepth = depth;\n const prims = primCount[node];\n vec4Count += 2 + prims;\n if (prims) {\n if (prims > maxLeafPrimitives) maxLeafPrimitives = prims;\n } else {\n stack.push(leftFirst[node] + 1, depth + 1, leftFirst[node], depth + 1);\n }\n }\n return { order, offsets, vec4Count, maxDepth, maxLeafPrimitives };\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { type MeshInstances } from './meshInstances.js';
1
+ import { type MeshInstances } from './packedMeshInstances.js';
2
2
  import Geometry from '../scene/Geometry.js';
3
- import { vec3 } from '../math.js';
4
- import { Mat4Array } from '../math.js';
3
+ import { Box3 } from './Box3.js';
4
+ export { Box3 } from './Box3.js';
5
5
  export declare const INSTANCE_VEC4_STRIDE = 10;
6
6
  export declare const INSTANCE_WORD_STRIDE: number;
7
7
  export type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';
@@ -13,19 +13,16 @@ export interface FlattendBVH {
13
13
  /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */
14
14
  maxLeafPrimitives?: number;
15
15
  buffer: ArrayBuffer;
16
+ /** Source triangle IDs, (record, source triangle) pairs. */
17
+ triangleIds?: Uint32Array;
16
18
  /** Precomputed data without a layout field uses the legacy BVH2 layout. */
17
19
  layout?: BvhLayout;
18
20
  instancesBuffer?: ArrayBuffer;
19
21
  }
20
- export declare class Box3 {
21
- min: vec3.Vec3Array;
22
- max: vec3.Vec3Array;
23
- constructor();
24
- }
25
22
  export interface TLASInstance {
26
23
  blasIndex: number;
27
24
  bounds: Box3;
28
- transform: Mat4Array;
25
+ transform: Float64Array;
29
26
  materialsIndices: number[];
30
27
  displacementScale?: number;
31
28
  color?: [number, number, number];
@@ -57,12 +54,19 @@ export declare function emptyBLAS(): FlattendBVH;
57
54
  * displacement prisms along the vertex normals and store the packed ranges.
58
55
  */
59
56
  export declare function buildBLAS(geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>, displacementScale?: number, trianglesDisplacement?: Float32Array): FlattendBVH;
57
+ export declare function packLinearInstances(instances: MeshInstances, primitiveOffsets: number[], vertexOffsets: number[]): ArrayBuffer;
58
+ /** Repack only selected source-order instance slots for hardware adapters. */
59
+ export declare function refitLinearInstances(buffer: ArrayBuffer, instances: MeshInstances, primitiveOffsets: number[], vertexOffsets: number[], dirty: ReadonlySet<number>): TLASRefitRange[];
60
60
  /**
61
61
  * Builds a BVH2 TLAS over the instances. Leaves store
62
62
  * (instance record, BLAS offset, source instance index, 0); instance records
63
63
  * are written in leaf order to instancesBuffer.
64
64
  */
65
65
  export declare function buildTLAS(instances: MeshInstances, blases: BLASInstance[]): FlattendBVH;
66
+ /** Bounds transport for a platform BVH builder; same padding as buildTLAS. */
67
+ export declare function meshInstanceBounds(instances: MeshInstances): Float32Array;
68
+ /** Pack a platform-built BVH2 hierarchy whose leaf x lane holds source indices. */
69
+ export declare function packBuiltTLAS(instances: MeshInstances, blases: BLASInstance[], hierarchy: FlattendBVH): FlattendBVH;
66
70
  export interface TLASRefitRange {
67
71
  offset: number;
68
72
  size: number;
@@ -72,10 +76,16 @@ export interface TLASRefitResult {
72
76
  instanceRanges: TLASRefitRange[];
73
77
  }
74
78
  export declare function mergeRefitRanges(ranges: TLASRefitRange[]): TLASRefitRange[];
79
+ /** A transactional candidate shares immutable refit topology metadata. */
80
+ export declare function copyTLASForRefit(flattened: FlattendBVH): FlattendBVH;
75
81
  export declare function refitTLAS(flattened: FlattendBVH, instances: MeshInstances, blases: BLASInstance[], dirtySourceIndices?: ReadonlySet<number>): TLASRefitResult;
76
82
  /** Dynamic BLASes rebuild when their total node surface area doubles. */
77
83
  export declare const DYNAMIC_BLAS_REBUILD_RATIO = 2;
78
84
  /** Refit a BVH2 BLAS after vertex deformation, preserving topology. */
79
- export declare function refitBLAS(flattened: FlattendBVH, geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>): boolean;
85
+ export declare function refitBLAS(flattened: FlattendBVH, geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>, displacement?: {
86
+ normal: Float32Array;
87
+ scale: number;
88
+ ranges: Float32Array;
89
+ }): boolean;
80
90
  /** Writes only instance colors; TLAS topology and bounds remain untouched. */
81
91
  export declare function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[];