@meimu/mutracer 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +240 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14360 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +160 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +274 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +123 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +265 -0
  35. package/lib/Render.js +742 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +79 -0
  38. package/lib/RenderLoop.js +236 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1448 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +126 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +623 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +927 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +105 -0
  511. package/lib/util/fromTHREE.js +1111 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,26 @@
1
+ import type { Scene } from '../scene/Scene.js';
2
+ import type { TraceSettings } from './renderPipeline.js';
3
+ import type { RenderPasses } from './RenderingPipeline.js';
4
+ /** Backend-owned execution and outputs of one resident accumulation. */
5
+ export interface TargetPipeline extends RenderPasses {
6
+ activate(): void;
7
+ invalidateDenoisedOutput(): void;
8
+ /** Refreshes backend timing after structural scene changes; optional without GPU timestamps. */
9
+ invalidateTiming?(): void;
10
+ configure(settings: TraceSettings): void;
11
+ synchronizeBackground(background: Scene['background']): void;
12
+ canCompleteSampleWithin(timeBudgetMs: number): boolean;
13
+ present(): void;
14
+ readPresentation(): Promise<{
15
+ width: number;
16
+ height: number;
17
+ data: Float32Array;
18
+ }>;
19
+ readonly presentationComplete: boolean;
20
+ readonly presentationDenoised: boolean;
21
+ getMemory(): {
22
+ width: number;
23
+ height: number;
24
+ bytes: number;
25
+ };
26
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=accumulationTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accumulationTarget.js","sourceRoot":"","sources":["../../src/renderer/accumulationTarget.ts"],"names":[],"mappings":"","sourcesContent":["import type { Scene } from '../scene/Scene.js';\nimport type { TraceSettings } from './renderPipeline.js';\nimport type { RenderPasses } from './RenderingPipeline.js';\n\n/** Backend-owned execution and outputs of one resident accumulation. */\nexport interface TargetPipeline extends RenderPasses {\n activate(): void;\n invalidateDenoisedOutput(): void;\n /** Refreshes backend timing after structural scene changes; optional without GPU timestamps. */\n invalidateTiming?(): void;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n canCompleteSampleWithin(timeBudgetMs: number): boolean;\n present(): void;\n readPresentation(): Promise<{width: number; height: number; data: Float32Array}>;\n readonly presentationComplete: boolean;\n readonly presentationDenoised: boolean;\n getMemory(): {width: number; height: number; bytes: number};\n}\n"]}
@@ -0,0 +1,31 @@
1
+ export interface BinnedSahBvh {
2
+ nodeCount: number;
3
+ /** Per node: min x, y, z, max x, y, z. */
4
+ bounds: Float32Array;
5
+ /** Interior node: index of the left child. Leaf: first slot in primIndices. */
6
+ leftFirst: Uint32Array;
7
+ /** Primitive count of a leaf; 0 for interior nodes. */
8
+ primCount: Uint32Array;
9
+ /** Primitive indices referenced by leaves. */
10
+ primIndices: Uint32Array;
11
+ }
12
+ /**
13
+ * Builds a binary BVH over axis-aligned boxes.
14
+ * @param aabbs min x, y, z, max x, y, z for each primitive.
15
+ * @param count number of primitives in `aabbs`.
16
+ */
17
+ export declare function buildBinnedSahBvh(aabbs: Float32Array, count: number): BinnedSahBvh;
18
+ export interface Bvh2Layout {
19
+ /** Node indices in depth-first order (node, left subtree, right subtree). */
20
+ order: Uint32Array;
21
+ /** Offset of each node in vec4 units: 2 per node plus 1 per leaf primitive. */
22
+ offsets: Uint32Array;
23
+ vec4Count: number;
24
+ maxDepth: number;
25
+ maxLeafPrimitives: number;
26
+ }
27
+ /**
28
+ * Places nodes in the depth-first BVH2 layout read by the traversal shaders:
29
+ * the left child follows its parent and leaf primitives follow their leaf.
30
+ */
31
+ export declare function layoutBvh2(bvh: BinnedSahBvh): Bvh2Layout;
@@ -0,0 +1,263 @@
1
+ // Binned SAH BVH builder ported from TinyBVH's reference builder
2
+ // (`BVH::Build( nodeIdx, depth )` in tiny_bvh.h at commit
3
+ // 0e4584287823252cf83f0e9cd072848bec5f79c5, https://github.com/jbikker/tinybvh).
4
+ // Copyright (c) 2024-2026 Jacco Bikker / Breda University of Applied Sciences.
5
+ // MIT License, see src/tinybvh/LICENSE.
6
+ //
7
+ // Like the reference, it bins primitive centroids into 8 bins on all three
8
+ // axes, sweeps the bins for the lowest surface area heuristic cost and stops
9
+ // splitting when a leaf is cheaper (C_INT = C_TRAV = 1). Siblings are stored
10
+ // next to each other: an interior node's children are leftFirst and
11
+ // leftFirst + 1. Unlike the reference, node 1 is not left unused, the task
12
+ // stack grows instead of turning a node into a leaf after 512 entries, and
13
+ // arithmetic is float64: near-equal split costs can resolve differently from
14
+ // TinyBVH's float32, giving trees of the same quality that are not
15
+ // byte-identical.
16
+ const BINS = 8;
17
+ const C_INT = 1;
18
+ const C_TRAV = 1;
19
+ const FAR = 1e30;
20
+ // Scratch shared by all builds; the builder is synchronous.
21
+ const binMin = new Float64Array(3 * BINS * 3);
22
+ const binMax = new Float64Array(3 * BINS * 3);
23
+ const binCount = new Uint32Array(3 * BINS);
24
+ // Per split position: half area times primitive count of each side.
25
+ const leftCost = new Float64Array(BINS - 1);
26
+ const rightCost = new Float64Array(BINS - 1);
27
+ /**
28
+ * Bin of a centroid along one axis. Binning and partitioning both use this,
29
+ * so every primitive ends up on the side whose bounds include its bin.
30
+ */
31
+ function binOf(center, nodeMin, scale) {
32
+ const bin = ((center - nodeMin) * scale) | 0;
33
+ return bin < 0 ? 0 : bin > BINS - 1 ? BINS - 1 : bin;
34
+ }
35
+ function growBin(o, minX, minY, minZ, maxX, maxY, maxZ) {
36
+ binMin[o] = Math.min(binMin[o], minX);
37
+ binMin[o + 1] = Math.min(binMin[o + 1], minY);
38
+ binMin[o + 2] = Math.min(binMin[o + 2], minZ);
39
+ binMax[o] = Math.max(binMax[o], maxX);
40
+ binMax[o + 1] = Math.max(binMax[o + 1], maxY);
41
+ binMax[o + 2] = Math.max(binMax[o + 2], maxZ);
42
+ }
43
+ /**
44
+ * Builds a binary BVH over axis-aligned boxes.
45
+ * @param aabbs min x, y, z, max x, y, z for each primitive.
46
+ * @param count number of primitives in `aabbs`.
47
+ */
48
+ export function buildBinnedSahBvh(aabbs, count) {
49
+ const capacity = Math.max(1, count * 2 - 1);
50
+ const bounds = new Float32Array(capacity * 6);
51
+ const leftFirst = new Uint32Array(capacity);
52
+ const primCount = new Uint32Array(capacity);
53
+ const primIndices = new Uint32Array(count);
54
+ if (count === 0) {
55
+ return { nodeCount: 0, bounds, leftFirst, primCount, primIndices };
56
+ }
57
+ const centers = new Float32Array(count * 3);
58
+ let rootMinX = FAR, rootMinY = FAR, rootMinZ = FAR;
59
+ let rootMaxX = -FAR, rootMaxY = -FAR, rootMaxZ = -FAR;
60
+ for (let i = 0; i < count; i++) {
61
+ const b = i * 6, c = i * 3;
62
+ const minX = aabbs[b], minY = aabbs[b + 1], minZ = aabbs[b + 2];
63
+ const maxX = aabbs[b + 3], maxY = aabbs[b + 4], maxZ = aabbs[b + 5];
64
+ centers[c] = (minX + maxX) * 0.5;
65
+ centers[c + 1] = (minY + maxY) * 0.5;
66
+ centers[c + 2] = (minZ + maxZ) * 0.5;
67
+ if (minX < rootMinX)
68
+ rootMinX = minX;
69
+ if (minY < rootMinY)
70
+ rootMinY = minY;
71
+ if (minZ < rootMinZ)
72
+ rootMinZ = minZ;
73
+ if (maxX > rootMaxX)
74
+ rootMaxX = maxX;
75
+ if (maxY > rootMaxY)
76
+ rootMaxY = maxY;
77
+ if (maxZ > rootMaxZ)
78
+ rootMaxZ = maxZ;
79
+ primIndices[i] = i;
80
+ }
81
+ bounds[0] = rootMinX;
82
+ bounds[1] = rootMinY;
83
+ bounds[2] = rootMinZ;
84
+ bounds[3] = rootMaxX;
85
+ bounds[4] = rootMaxY;
86
+ bounds[5] = rootMaxZ;
87
+ leftFirst[0] = 0;
88
+ primCount[0] = count;
89
+ const minDimX = (rootMaxX - rootMinX) * 1e-20;
90
+ const minDimY = (rootMaxY - rootMinY) * 1e-20;
91
+ const minDimZ = (rootMaxZ - rootMinZ) * 1e-20;
92
+ let newNode = 1;
93
+ const tasks = [];
94
+ let nodeIndex = 0;
95
+ while (true) {
96
+ while (true) {
97
+ const nb = nodeIndex * 6;
98
+ const nMinX = bounds[nb], nMinY = bounds[nb + 1], nMinZ = bounds[nb + 2];
99
+ const extentX = bounds[nb + 3] - nMinX;
100
+ const extentY = bounds[nb + 4] - nMinY;
101
+ const extentZ = bounds[nb + 5] - nMinZ;
102
+ const area = extentX * extentY + extentY * extentZ + extentZ * extentX;
103
+ if (area === 0)
104
+ break; // can't split an infinitely small node.
105
+ const first = leftFirst[nodeIndex];
106
+ const nodePrims = primCount[nodeIndex];
107
+ // Every split of a single primitive leaves one side empty.
108
+ if (nodePrims === 1)
109
+ break;
110
+ const scaleX = extentX > minDimX ? BINS / extentX : 0;
111
+ const scaleY = extentY > minDimY ? BINS / extentY : 0;
112
+ const scaleZ = extentZ > minDimZ ? BINS / extentZ : 0;
113
+ for (let i = 0; i < 3 * BINS * 3; i++) {
114
+ binMin[i] = FAR;
115
+ binMax[i] = -FAR;
116
+ }
117
+ binCount.fill(0);
118
+ for (let i = first, end = first + nodePrims; i < end; i++) {
119
+ const p = primIndices[i];
120
+ const c = p * 3, b = p * 6;
121
+ const minX = aabbs[b], minY = aabbs[b + 1], minZ = aabbs[b + 2];
122
+ const maxX = aabbs[b + 3], maxY = aabbs[b + 4], maxZ = aabbs[b + 5];
123
+ // Axis a, bin i: bounds at ((a * BINS) + i) * 3.
124
+ const bx = binOf(centers[c], nMinX, scaleX);
125
+ const by = BINS + binOf(centers[c + 1], nMinY, scaleY);
126
+ const bz = 2 * BINS + binOf(centers[c + 2], nMinZ, scaleZ);
127
+ binCount[bx]++;
128
+ binCount[by]++;
129
+ binCount[bz]++;
130
+ growBin(bx * 3, minX, minY, minZ, maxX, maxY, maxZ);
131
+ growBin(by * 3, minX, minY, minZ, maxX, maxY, maxZ);
132
+ growBin(bz * 3, minX, minY, minZ, maxX, maxY, maxZ);
133
+ }
134
+ // Sweep the bins of each axis for the lowest split cost.
135
+ let splitCost = FAR;
136
+ let bestAxis = 0, bestPos = 0;
137
+ for (let axis = 0; axis < 3; axis++) {
138
+ const extent = axis === 0 ? extentX : axis === 1 ? extentY : extentZ;
139
+ const minDim = axis === 0 ? minDimX : axis === 1 ? minDimY : minDimZ;
140
+ if (!(extent > minDim))
141
+ continue;
142
+ let lMinX = FAR, lMinY = FAR, lMinZ = FAR, lMaxX = -FAR, lMaxY = -FAR, lMaxZ = -FAR;
143
+ let rMinX = FAR, rMinY = FAR, rMinZ = FAR, rMaxX = -FAR, rMaxY = -FAR, rMaxZ = -FAR;
144
+ let leftN = 0, rightN = 0;
145
+ for (let i = 0; i < BINS - 1; i++) {
146
+ const l = (axis * BINS + i) * 3;
147
+ const r = (axis * BINS + BINS - 1 - i) * 3;
148
+ lMinX = Math.min(lMinX, binMin[l]);
149
+ lMinY = Math.min(lMinY, binMin[l + 1]);
150
+ lMinZ = Math.min(lMinZ, binMin[l + 2]);
151
+ lMaxX = Math.max(lMaxX, binMax[l]);
152
+ lMaxY = Math.max(lMaxY, binMax[l + 1]);
153
+ lMaxZ = Math.max(lMaxZ, binMax[l + 2]);
154
+ rMinX = Math.min(rMinX, binMin[r]);
155
+ rMinY = Math.min(rMinY, binMin[r + 1]);
156
+ rMinZ = Math.min(rMinZ, binMin[r + 2]);
157
+ rMaxX = Math.max(rMaxX, binMax[r]);
158
+ rMaxY = Math.max(rMaxY, binMax[r + 1]);
159
+ rMaxZ = Math.max(rMaxZ, binMax[r + 2]);
160
+ leftN += binCount[axis * BINS + i];
161
+ rightN += binCount[axis * BINS + BINS - 1 - i];
162
+ const lx = lMaxX - lMinX, ly = lMaxY - lMinY, lz = lMaxZ - lMinZ;
163
+ const rx = rMaxX - rMinX, ry = rMaxY - rMinY, rz = rMaxZ - rMinZ;
164
+ leftCost[i] = leftN === 0 ? FAR : (lx * ly + ly * lz + lz * lx) * leftN;
165
+ rightCost[BINS - 2 - i] = rightN === 0 ? FAR : (rx * ry + ry * rz + rz * rx) * rightN;
166
+ }
167
+ for (let i = 0; i < BINS - 1; i++) {
168
+ const cost = leftCost[i] + rightCost[i];
169
+ if (cost < splitCost) {
170
+ splitCost = cost;
171
+ bestAxis = axis;
172
+ bestPos = i;
173
+ }
174
+ }
175
+ }
176
+ splitCost = C_TRAV + C_INT * splitCost / area;
177
+ // Not splitting is better (also stops on non-finite bounds).
178
+ if (!(splitCost < nodePrims * C_INT))
179
+ break;
180
+ // In-place partition by the chosen bin.
181
+ const scale = bestAxis === 0 ? scaleX : bestAxis === 1 ? scaleY : scaleZ;
182
+ const nMin = bestAxis === 0 ? nMinX : bestAxis === 1 ? nMinY : nMinZ;
183
+ let j = first + nodePrims, src = first;
184
+ for (let i = 0; i < nodePrims; i++) {
185
+ const p = primIndices[src];
186
+ if (binOf(centers[p * 3 + bestAxis], nMin, scale) <= bestPos) {
187
+ src++;
188
+ }
189
+ else {
190
+ primIndices[src] = primIndices[--j];
191
+ primIndices[j] = p;
192
+ }
193
+ }
194
+ const leftPrims = src - first;
195
+ const rightPrims = nodePrims - leftPrims;
196
+ if (leftPrims === 0 || rightPrims === 0)
197
+ break; // should not happen.
198
+ const n = newNode;
199
+ newNode += 2;
200
+ // Child bounds are the unions of the bins on each side of the split.
201
+ const leftBase = n * 6, rightBase = leftBase + 6;
202
+ for (let k = 0; k < 3; k++) {
203
+ bounds[leftBase + k] = bounds[rightBase + k] = FAR;
204
+ bounds[leftBase + 3 + k] = bounds[rightBase + 3 + k] = -FAR;
205
+ }
206
+ for (let i = 0; i < BINS; i++) {
207
+ const o = (bestAxis * BINS + i) * 3;
208
+ const base = i <= bestPos ? leftBase : rightBase;
209
+ for (let k = 0; k < 3; k++) {
210
+ if (binMin[o + k] < bounds[base + k])
211
+ bounds[base + k] = binMin[o + k];
212
+ if (binMax[o + k] > bounds[base + 3 + k])
213
+ bounds[base + 3 + k] = binMax[o + k];
214
+ }
215
+ }
216
+ leftFirst[n] = first;
217
+ primCount[n] = leftPrims;
218
+ leftFirst[n + 1] = j;
219
+ primCount[n + 1] = rightPrims;
220
+ leftFirst[nodeIndex] = n;
221
+ primCount[nodeIndex] = 0;
222
+ tasks.push(n + 1);
223
+ nodeIndex = n;
224
+ }
225
+ if (!tasks.length)
226
+ break;
227
+ nodeIndex = tasks.pop();
228
+ }
229
+ return { nodeCount: newNode, bounds, leftFirst, primCount, primIndices };
230
+ }
231
+ /**
232
+ * Places nodes in the depth-first BVH2 layout read by the traversal shaders:
233
+ * the left child follows its parent and leaf primitives follow their leaf.
234
+ */
235
+ export function layoutBvh2(bvh) {
236
+ const { nodeCount, leftFirst, primCount } = bvh;
237
+ const order = new Uint32Array(nodeCount);
238
+ const offsets = new Uint32Array(nodeCount);
239
+ let vec4Count = 0, maxDepth = 0, maxLeafPrimitives = 0;
240
+ if (!nodeCount)
241
+ return { order, offsets, vec4Count, maxDepth, maxLeafPrimitives };
242
+ const stack = [0, 1];
243
+ let written = 0;
244
+ while (stack.length) {
245
+ const depth = stack.pop();
246
+ const node = stack.pop();
247
+ order[written++] = node;
248
+ offsets[node] = vec4Count;
249
+ if (depth > maxDepth)
250
+ maxDepth = depth;
251
+ const prims = primCount[node];
252
+ vec4Count += 2 + prims;
253
+ if (prims) {
254
+ if (prims > maxLeafPrimitives)
255
+ maxLeafPrimitives = prims;
256
+ }
257
+ else {
258
+ stack.push(leftFirst[node] + 1, depth + 1, leftFirst[node], depth + 1);
259
+ }
260
+ }
261
+ return { order, offsets, vec4Count, maxDepth, maxLeafPrimitives };
262
+ }
263
+ //# sourceMappingURL=binnedSahBvh.js.map
@@ -0,0 +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"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { executeBvhBuild } from './bvhWorkerBuild.js';
2
+ const scope = self;
3
+ // Serialize builds to reuse TinyBVH's WASM instance and bound working memory.
4
+ let queue = Promise.resolve();
5
+ scope.onmessage = ({ data }) => {
6
+ queue = queue.then(async () => {
7
+ try {
8
+ const bvh = await executeBvhBuild(data);
9
+ scope.postMessage({ id: data.id, bvh }, [bvh.buffer]);
10
+ }
11
+ catch (error) {
12
+ scope.postMessage({ id: data.id, error: error instanceof Error ? error.message : String(error) });
13
+ }
14
+ });
15
+ };
16
+ //# sourceMappingURL=bvh.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvh.worker.js","sourceRoot":"","sources":["../../src/renderer/bvh.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,MAAM,KAAK,GAAG,IAGb,CAAC;AACF,8EAA8E;AAC9E,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AAC9B,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IAC7B,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { executeBvhBuild } from './bvhWorkerBuild.js';\nimport type { BvhBuildRequest, BvhBuildResponse } from './bvhWorkerClient.js';\n\nconst scope = self as unknown as {\n onmessage: (event: MessageEvent<BvhBuildRequest>) => void;\n postMessage: (response: BvhBuildResponse, transfers?: Transferable[]) => void;\n};\n// Serialize builds to reuse TinyBVH's WASM instance and bound working memory.\nlet queue = Promise.resolve();\nscope.onmessage = ({ data }) => {\n queue = queue.then(async () => {\n try {\n const bvh = await executeBvhBuild(data);\n scope.postMessage({ id: data.id, bvh }, [bvh.buffer]);\n } catch (error) {\n scope.postMessage({ id: data.id, error: error instanceof Error ? error.message : String(error) });\n }\n });\n};\n"]}
@@ -0,0 +1,81 @@
1
+ import { type MeshInstances } from './meshInstances.js';
2
+ import Geometry from '../scene/Geometry.js';
3
+ import { vec3 } from '../math.js';
4
+ import { Mat4Array } from '../math.js';
5
+ export declare const INSTANCE_VEC4_STRIDE = 10;
6
+ export declare const INSTANCE_WORD_STRIDE: number;
7
+ export type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';
8
+ export interface FlattendBVH {
9
+ /** CPU builder that produced the GPU traversal data. */
10
+ builder?: 'builtin' | 'tinybvh';
11
+ buildSurfaceArea?: number;
12
+ maxDepth: number;
13
+ /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */
14
+ maxLeafPrimitives?: number;
15
+ buffer: ArrayBuffer;
16
+ /** Precomputed data without a layout field uses the legacy BVH2 layout. */
17
+ layout?: BvhLayout;
18
+ instancesBuffer?: ArrayBuffer;
19
+ }
20
+ export declare class Box3 {
21
+ min: vec3.Vec3Array;
22
+ max: vec3.Vec3Array;
23
+ constructor();
24
+ }
25
+ export interface TLASInstance {
26
+ blasIndex: number;
27
+ bounds: Box3;
28
+ transform: Mat4Array;
29
+ materialsIndices: number[];
30
+ displacementScale?: number;
31
+ color?: [number, number, number];
32
+ }
33
+ export interface BLASInstance {
34
+ bvh: FlattendBVH;
35
+ trainglesCount: number;
36
+ verticesCount: number;
37
+ }
38
+ export declare const MAX_TRAVERSAL_STACK_SIZE = 64;
39
+ export interface TraversalStackSizes {
40
+ tlas: number;
41
+ blas: number;
42
+ }
43
+ /**
44
+ * Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.
45
+ * A TLAS leaf is consumed in place, so its instance fan-out no longer needs
46
+ * pending stack entries. TinyBVH converted layouts store their exact stack
47
+ * requirement in maxDepth; BVH2 stores its tree depth.
48
+ */
49
+ export declare function getTraversalStackSizes(tlas: FlattendBVH, blases: readonly BLASInstance[]): TraversalStackSizes;
50
+ export declare function concatBLASBuffers(blases: BLASInstance[]): ArrayBuffer;
51
+ /** BLAS without triangles. */
52
+ export declare function emptyBLAS(): FlattendBVH;
53
+ /**
54
+ * Builds a BVH2 BLAS over the geometry's triangles. Triangles with
55
+ * non-finite bounds are skipped. With per-triangle displacement ranges
56
+ * (min, max pairs scaled by displacementScale), leaves bound the
57
+ * displacement prisms along the vertex normals and store the packed ranges.
58
+ */
59
+ export declare function buildBLAS(geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>, displacementScale?: number, trianglesDisplacement?: Float32Array): FlattendBVH;
60
+ /**
61
+ * Builds a BVH2 TLAS over the instances. Leaves store
62
+ * (instance record, BLAS offset, source instance index, 0); instance records
63
+ * are written in leaf order to instancesBuffer.
64
+ */
65
+ export declare function buildTLAS(instances: MeshInstances, blases: BLASInstance[]): FlattendBVH;
66
+ export interface TLASRefitRange {
67
+ offset: number;
68
+ size: number;
69
+ }
70
+ export interface TLASRefitResult {
71
+ tlasRanges: TLASRefitRange[];
72
+ instanceRanges: TLASRefitRange[];
73
+ }
74
+ export declare function mergeRefitRanges(ranges: TLASRefitRange[]): TLASRefitRange[];
75
+ export declare function refitTLAS(flattened: FlattendBVH, instances: MeshInstances, blases: BLASInstance[], dirtySourceIndices?: ReadonlySet<number>): TLASRefitResult;
76
+ /** Dynamic BLASes rebuild when their total node surface area doubles. */
77
+ export declare const DYNAMIC_BLAS_REBUILD_RATIO = 2;
78
+ /** 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;
80
+ /** Writes only instance colors; TLAS topology and bounds remain untouched. */
81
+ export declare function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[];