@meimu/mutracer 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1,12 +1,11 @@
1
- import { readMeshInstance } from './meshInstances.js';
2
- // Bounding volume hierarchies of scene geometry (BLAS) and mesh instances
3
- // (TLAS), built with the binned SAH builder in ./binnedSahBvh and written
4
- // directly in the BVH2 layout read by the traversal shaders.
5
- import { Attribute } from '../scene/Geometry.js';
1
+ import { readMeshInstance, meshInstancesLength } from './packedMeshInstances.js';
6
2
  import { mat4, vec3 } from '../math.js';
7
3
  import { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';
8
- const vec3Min = vec3.min;
9
- const vec3Max = vec3.max;
4
+ import { read, write } from '../math/access.js';
5
+ import { attributeLength, attributeValue, indexStorage } from '../scene/attributeData.js';
6
+ import { Box3 } from './Box3.js';
7
+ import { quantizeDisplacementRange } from './displacementRange.js';
8
+ export { Box3 } from './Box3.js';
10
9
  export const INSTANCE_VEC4_STRIDE = 10;
11
10
  export const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;
12
11
  const BLAS_LAYOUT_SHIFT = 30;
@@ -23,17 +22,9 @@ function encodeBlasOffset(offset, layout) {
23
22
  }
24
23
  return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;
25
24
  }
26
- export class Box3 {
27
- min;
28
- max;
29
- constructor() {
30
- this.min = [Infinity, Infinity, Infinity];
31
- this.max = [-Infinity, -Infinity, -Infinity];
32
- }
33
- }
34
25
  function unionBounds(bounds, a, b) {
35
- vec3Min(bounds.min, a.min, b.min);
36
- vec3Max(bounds.max, a.max, b.max);
26
+ vec3.min(bounds.min, a.min, b.min);
27
+ vec3.max(bounds.max, a.max, b.max);
37
28
  return bounds;
38
29
  }
39
30
  // Keep a bounded specialization range for unusually deep hierarchies while
@@ -139,16 +130,17 @@ export function emptyBLAS() {
139
130
  */
140
131
  export function buildBLAS(geometry, displacementScale = 0, trianglesDisplacement) {
141
132
  const position = geometry.position;
142
- const indices = geometry.indices?.array;
143
- if (!position || !indices || !Attribute.getCount(position)) {
133
+ const indexAttribute = geometry.indices;
134
+ if (!position || !indexAttribute || !position.array.length) {
144
135
  return emptyBvh(false);
145
136
  }
137
+ const indices = indexStorage(indexAttribute.array);
146
138
  const positions = position.array;
147
139
  const stride = position.itemSize;
148
140
  const normal = trianglesDisplacement ? geometry.normal : undefined;
149
141
  const normals = normal?.array;
150
142
  const normalStride = normal?.itemSize ?? 0;
151
- const triangleCount = Math.floor(indices.length / 3);
143
+ const triangleCount = Math.floor(attributeLength(indices) / 3);
152
144
  const aabbs = new Float32Array(triangleCount * 6);
153
145
  const triangles = new Uint32Array(triangleCount);
154
146
  let count = 0;
@@ -162,7 +154,7 @@ export function buildBLAS(geometry, displacementScale = 0, trianglesDisplacement
162
154
  maxHeight = displacementScale;
163
155
  }
164
156
  }
165
- if (triangleBounds(positions, stride, normals, normalStride, indices[t * 3], indices[t * 3 + 1], indices[t * 3 + 2], minHeight, maxHeight, aabbs, count * 6)) {
157
+ if (triangleBounds(positions, stride, normals, normalStride, attributeValue(indices, t * 3), attributeValue(indices, t * 3 + 1), attributeValue(indices, t * 3 + 2), minHeight, maxHeight, aabbs, count * 6)) {
166
158
  triangles[count++] = t;
167
159
  }
168
160
  }
@@ -175,6 +167,7 @@ export function buildBLAS(geometry, displacementScale = 0, trianglesDisplacement
175
167
  const floats = new Float32Array(buffer);
176
168
  const ints = new Int32Array(buffer);
177
169
  let buildSurfaceArea = 0;
170
+ const triangleIds = [];
178
171
  for (let k = 0; k < order.length; k++) {
179
172
  const node = order[k];
180
173
  const o = offsets[node] * 4, b = node * 6;
@@ -197,9 +190,11 @@ export function buildBLAS(geometry, displacementScale = 0, trianglesDisplacement
197
190
  for (let i = 0; i < prims; i++) {
198
191
  const t = triangles[primIndices[leftFirst[node] + i]];
199
192
  const e = o + 8 + i * 4;
200
- ints[e] = indices[t * 3];
201
- ints[e + 1] = indices[t * 3 + 1];
202
- ints[e + 2] = indices[t * 3 + 2];
193
+ if (trianglesDisplacement)
194
+ triangleIds.push(e / 4, t);
195
+ ints[e] = attributeValue(indices, t * 3);
196
+ ints[e + 1] = attributeValue(indices, t * 3 + 1);
197
+ ints[e + 2] = attributeValue(indices, t * 3 + 2);
203
198
  // Pack minH, maxH to one channel.
204
199
  ints[e + 3] = trianglesDisplacement
205
200
  ? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])
@@ -208,6 +203,7 @@ export function buildBLAS(geometry, displacementScale = 0, trianglesDisplacement
208
203
  }
209
204
  return {
210
205
  builder: 'builtin',
206
+ triangleIds: trianglesDisplacement ? new Uint32Array(triangleIds) : undefined,
211
207
  buildSurfaceArea,
212
208
  maxDepth,
213
209
  maxLeafPrimitives,
@@ -235,16 +231,22 @@ function instanceBounds(instance, out, o) {
235
231
  const displacementScale = instance.displacementScale;
236
232
  if (displacementScale) {
237
233
  const m = instance.transform;
238
- padX = Math.max(0, displacementScale * Math.hypot(m[0], m[1], m[2]));
239
- padY = Math.max(0, displacementScale * Math.hypot(m[4], m[5], m[6]));
240
- padZ = Math.max(0, displacementScale * Math.hypot(m[8], m[9], m[10]));
234
+ padX = Math.max(0, displacementScale * Math.hypot(read(m, 0), read(m, 1), read(m, 2)));
235
+ padY = Math.max(0, displacementScale * Math.hypot(read(m, 4), read(m, 5), read(m, 6)));
236
+ padZ = Math.max(0, displacementScale * Math.hypot(read(m, 8), read(m, 9), read(m, 10)));
241
237
  }
242
- out[o] = min[0] - padX;
243
- out[o + 1] = min[1] - padY;
244
- out[o + 2] = min[2] - padZ;
245
- out[o + 3] = max[0] + padX;
246
- out[o + 4] = max[1] + padY;
247
- out[o + 5] = max[2] + padZ;
238
+ out[o] = read(min, 0) - padX;
239
+ out[o + 1] = read(min, 1) - padY;
240
+ out[o + 2] = read(min, 2) - padZ;
241
+ out[o + 3] = read(max, 0) + padX;
242
+ out[o + 4] = read(max, 1) + padY;
243
+ out[o + 5] = read(max, 2) + padZ;
244
+ }
245
+ function writeInstanceColor(output, offset, instance) {
246
+ const color = instance.color;
247
+ output[offset] = color ? color[0] : 1;
248
+ output[offset + 1] = color ? color[1] : 1;
249
+ output[offset + 2] = color ? color[2] : 1;
248
250
  }
249
251
  function writeInstanceRecord(instanceInts, instanceFloats, targetIndex, instance, placement) {
250
252
  const offset = targetIndex * INSTANCE_WORD_STRIDE;
@@ -252,13 +254,36 @@ function writeInstanceRecord(instanceInts, instanceFloats, targetIndex, instance
252
254
  instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];
253
255
  instanceInts[offset + 2] = instance.materialsIndices[0] || 0;
254
256
  instanceFloats[offset + 3] = instance.displacementScale || 0;
255
- instanceFloats.set(instance.color ?? [1, 1, 1], offset + 36);
257
+ writeInstanceColor(instanceFloats, offset + 36, instance);
256
258
  instanceFloats[offset + 39] = 0;
257
- const inverse = mat4.invert(mat4.create(), instance.transform);
259
+ const inverse = mat4.invert(new Float64Array(16), instance.transform);
258
260
  for (let i = 0; i < 16; i++) {
259
261
  instanceFloats[offset + 4 + i] = inverse[i];
260
- instanceFloats[offset + 20 + i] = instance.transform[i];
262
+ instanceFloats[offset + 20 + i] = read(instance.transform, i);
263
+ }
264
+ }
265
+ // Hardware adapters use the same instance/material/matrix packing without a
266
+ // software hierarchy. Offsets are primitive offsets in their indexed geometry.
267
+ export function packLinearInstances(instances, primitiveOffsets, vertexOffsets) {
268
+ const buffer = new ArrayBuffer(meshInstancesLength(instances) * INSTANCE_WORD_STRIDE * 4);
269
+ const words = new Int32Array(buffer), floats = new Float32Array(buffer);
270
+ const placement = { blasOffsets: primitiveOffsets, vertexOffsets,
271
+ layouts: primitiveOffsets.map(() => 'bvh2') };
272
+ for (let i = 0; i < meshInstancesLength(instances); i++) {
273
+ writeInstanceRecord(words, floats, i, readMeshInstance(instances, i), placement);
261
274
  }
275
+ return buffer;
276
+ }
277
+ /** Repack only selected source-order instance slots for hardware adapters. */
278
+ export function refitLinearInstances(buffer, instances, primitiveOffsets, vertexOffsets, dirty) {
279
+ const words = new Int32Array(buffer), floats = new Float32Array(buffer);
280
+ const placement = { blasOffsets: primitiveOffsets, vertexOffsets, layouts: primitiveOffsets.map(() => 'bvh2') };
281
+ const ranges = [];
282
+ for (const index of dirty) {
283
+ writeInstanceRecord(words, floats, index, readMeshInstance(instances, index), placement);
284
+ ranges.push({ offset: index * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });
285
+ }
286
+ return mergeRefitRanges(ranges);
262
287
  }
263
288
  /**
264
289
  * Builds a BVH2 TLAS over the instances. Leaves store
@@ -266,20 +291,20 @@ function writeInstanceRecord(instanceInts, instanceFloats, targetIndex, instance
266
291
  * are written in leaf order to instancesBuffer.
267
292
  */
268
293
  export function buildTLAS(instances, blases) {
269
- if (!instances.length)
294
+ if (!meshInstancesLength(instances))
270
295
  return emptyBvh(true);
271
296
  const placement = getBlasPlacement(blases);
272
- const aabbs = new Float32Array(instances.length * 6);
273
- for (let i = 0; i < instances.length; i++) {
297
+ const aabbs = new Float32Array(meshInstancesLength(instances) * 6);
298
+ for (let i = 0; i < meshInstancesLength(instances); i++) {
274
299
  instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);
275
300
  }
276
- const bvh = buildBinnedSahBvh(aabbs, instances.length);
301
+ const bvh = buildBinnedSahBvh(aabbs, meshInstancesLength(instances));
277
302
  const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);
278
303
  const { bounds, leftFirst, primCount, primIndices } = bvh;
279
304
  const buffer = new ArrayBuffer(vec4Count * 16);
280
305
  const floats = new Float32Array(buffer);
281
306
  const ints = new Int32Array(buffer);
282
- const instancesBuffer = new ArrayBuffer(instances.length * INSTANCE_WORD_STRIDE * 4);
307
+ const instancesBuffer = new ArrayBuffer(meshInstancesLength(instances) * INSTANCE_WORD_STRIDE * 4);
283
308
  const instanceInts = new Int32Array(instancesBuffer);
284
309
  const instanceFloats = new Float32Array(instancesBuffer);
285
310
  let target = 0;
@@ -320,6 +345,47 @@ export function buildTLAS(instances, blases) {
320
345
  instancesBuffer
321
346
  };
322
347
  }
348
+ /** Bounds transport for a platform BVH builder; same padding as buildTLAS. */
349
+ export function meshInstanceBounds(instances) {
350
+ const bounds = new Float32Array(meshInstancesLength(instances) * 6);
351
+ for (let i = 0; i < meshInstancesLength(instances); i++)
352
+ instanceBounds(readMeshInstance(instances, i), bounds, i * 6);
353
+ return bounds;
354
+ }
355
+ /** Pack a platform-built BVH2 hierarchy whose leaf x lane holds source indices. */
356
+ export function packBuiltTLAS(instances, blases, hierarchy) {
357
+ const count = meshInstancesLength(instances);
358
+ if (!count)
359
+ return emptyBvh(true);
360
+ const placement = getBlasPlacement(blases), words = new Int32Array(hierarchy.buffer);
361
+ const instancesBuffer = new ArrayBuffer(count * INSTANCE_WORD_STRIDE * 4);
362
+ const instanceInts = new Int32Array(instancesBuffer), instanceFloats = new Float32Array(instancesBuffer);
363
+ const stack = [0];
364
+ let target = 0;
365
+ while (stack.length) {
366
+ const node = stack.pop(), o = node * 4, child = words[o + 3];
367
+ if (child >= 0) {
368
+ stack.push(child);
369
+ stack.push(node + 2);
370
+ continue;
371
+ }
372
+ for (let i = 0; i < -child; i++) {
373
+ const e = o + 8 + i * 4, source = words[e];
374
+ if (source < 0 || source >= count || target >= count)
375
+ throw new Error('Invalid platform TLAS instance');
376
+ const instance = readMeshInstance(instances, source);
377
+ words[e] = target;
378
+ words[e + 1] = placement.blasOffsets[instance.blasIndex];
379
+ words[e + 2] = source;
380
+ words[e + 3] = 0;
381
+ writeInstanceRecord(instanceInts, instanceFloats, target++, instance, placement);
382
+ }
383
+ }
384
+ if (target !== count)
385
+ throw new Error('Platform TLAS instance count mismatch');
386
+ hierarchy.instancesBuffer = instancesBuffer;
387
+ return hierarchy;
388
+ }
323
389
  const tlasRefitMetadata = new WeakMap();
324
390
  function getTLASRefitMetadata(flattened, ints) {
325
391
  const cached = tlasRefitMetadata.get(flattened);
@@ -369,11 +435,19 @@ export function mergeRefitRanges(ranges) {
369
435
  previous.size = Math.max(previous.size, range.offset + range.size - previous.offset);
370
436
  }
371
437
  else {
372
- merged.push({ ...range });
438
+ merged.push({ offset: range.offset, size: range.size });
373
439
  }
374
440
  }
375
441
  return merged;
376
442
  }
443
+ /** A transactional candidate shares immutable refit topology metadata. */
444
+ export function copyTLASForRefit(flattened) {
445
+ const next = { ...flattened, buffer: flattened.buffer.slice(0), instancesBuffer: flattened.instancesBuffer?.slice(0) };
446
+ if (flattened.buffer.byteLength && flattened.instancesBuffer) {
447
+ tlasRefitMetadata.set(next, getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer)));
448
+ }
449
+ return next;
450
+ }
377
451
  export function refitTLAS(flattened, instances, blases, dirtySourceIndices) {
378
452
  if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {
379
453
  return { tlasRanges: [], instanceRanges: [] };
@@ -389,21 +463,21 @@ export function refitTLAS(flattened, instances, blases, dirtySourceIndices) {
389
463
  }
390
464
  function addInstanceBounds(bounds, instance) {
391
465
  instanceBounds(instance, scratch, 0);
392
- bounds.min[0] = Math.min(bounds.min[0], scratch[0]);
393
- bounds.min[1] = Math.min(bounds.min[1], scratch[1]);
394
- bounds.min[2] = Math.min(bounds.min[2], scratch[2]);
395
- bounds.max[0] = Math.max(bounds.max[0], scratch[3]);
396
- bounds.max[1] = Math.max(bounds.max[1], scratch[4]);
397
- bounds.max[2] = Math.max(bounds.max[2], scratch[5]);
466
+ write(bounds.min, 0, Math.min(read(bounds.min, 0), scratch[0]));
467
+ write(bounds.min, 1, Math.min(read(bounds.min, 1), scratch[1]));
468
+ write(bounds.min, 2, Math.min(read(bounds.min, 2), scratch[2]));
469
+ write(bounds.max, 0, Math.max(read(bounds.max, 0), scratch[3]));
470
+ write(bounds.max, 1, Math.max(read(bounds.max, 1), scratch[4]));
471
+ write(bounds.max, 2, Math.max(read(bounds.max, 2), scratch[5]));
398
472
  }
399
473
  function writeNodeBounds(index, bounds) {
400
474
  const base = index * 4;
401
- floats[base] = bounds.min[0];
402
- floats[base + 1] = bounds.min[1];
403
- floats[base + 2] = bounds.min[2];
404
- floats[base + 4] = bounds.max[0];
405
- floats[base + 5] = bounds.max[1];
406
- floats[base + 6] = bounds.max[2];
475
+ floats[base] = read(bounds.min, 0);
476
+ floats[base + 1] = read(bounds.min, 1);
477
+ floats[base + 2] = read(bounds.min, 2);
478
+ floats[base + 4] = read(bounds.max, 0);
479
+ floats[base + 5] = read(bounds.max, 1);
480
+ floats[base + 6] = read(bounds.max, 2);
407
481
  }
408
482
  function readNodeBounds(index) {
409
483
  const base = index * 4;
@@ -543,13 +617,26 @@ function getBlasRefitData(buffer) {
543
617
  return data;
544
618
  }
545
619
  /** Refit a BVH2 BLAS after vertex deformation, preserving topology. */
546
- export function refitBLAS(flattened, geometry) {
620
+ export function refitBLAS(flattened, geometry, displacement) {
547
621
  if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {
548
622
  return false;
549
623
  }
550
624
  const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);
551
625
  const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);
552
626
  const positions = geometry.position.array, stride = geometry.position.itemSize;
627
+ const sourceTriangles = new Int32Array(displacement ? floats.length / 4 : 0).fill(-1);
628
+ const prism = new Float32Array(6);
629
+ if (displacement) {
630
+ // Leaf source IDs remain distinct even for duplicate index triples.
631
+ // Refuse old caches without this metadata before mutating their bounds.
632
+ const triangleIds = flattened.triangleIds;
633
+ if (!(triangleIds instanceof Uint32Array))
634
+ return false;
635
+ for (let i = 0; i < triangleIds.length; i += 2) {
636
+ const record = Number(triangleIds[i]);
637
+ sourceTriangles[record] = triangleIds[i + 1];
638
+ }
639
+ }
553
640
  if (flattened.buildSurfaceArea == null) {
554
641
  let area = 0;
555
642
  for (const index of postorder) {
@@ -573,6 +660,25 @@ export function refitBLAS(flattened, geometry) {
573
660
  maxY = Math.max(floats[left + 5], floats[right + 5]);
574
661
  maxZ = Math.max(floats[left + 6], floats[right + 6]);
575
662
  }
663
+ else if (displacement) {
664
+ for (let i = 0; i < -child; i++) {
665
+ const record = base + 8 + i * 4;
666
+ const ia = ints[record], ib = ints[record + 1], ic = ints[record + 2];
667
+ const triangle = sourceTriangles[record / 4];
668
+ if (triangle < 0)
669
+ return false;
670
+ const minimum = displacement.ranges[triangle * 2], maximum = displacement.ranges[triangle * 2 + 1];
671
+ if (!triangleBounds(positions, stride, displacement.normal, 3, ia, ib, ic, minimum * displacement.scale, maximum * displacement.scale, prism, 0))
672
+ return false;
673
+ ints[record + 3] = flattened.builder === 'tinybvh' ? quantizeDisplacementRange(minimum, maximum) : packH(minimum, maximum);
674
+ minX = Math.min(minX, prism[0]);
675
+ minY = Math.min(minY, prism[1]);
676
+ minZ = Math.min(minZ, prism[2]);
677
+ maxX = Math.max(maxX, prism[3]);
678
+ maxY = Math.max(maxY, prism[4]);
679
+ maxZ = Math.max(maxZ, prism[5]);
680
+ }
681
+ }
576
682
  else {
577
683
  const start = offsets[index], end = start + 1 + vertices[start];
578
684
  for (let i = start + 1; i < end; i++) {
@@ -606,16 +712,20 @@ export function updateTLASInstanceColors(flattened, instances, dirty) {
606
712
  const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));
607
713
  const floats = new Float32Array(flattened.instancesBuffer);
608
714
  const ranges = [];
609
- for (const source of dirty)
610
- for (const leaf of metadata.leavesBySource.get(source) ?? []) {
715
+ for (const source of dirty) {
716
+ const leaves = metadata.leavesBySource.get(source);
717
+ if (!leaves)
718
+ continue;
719
+ for (const leaf of leaves) {
611
720
  for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {
612
721
  if (entry.source !== source)
613
722
  continue;
614
723
  const offset = entry.target * INSTANCE_WORD_STRIDE + 36;
615
- floats.set(readMeshInstance(instances, source).color ?? [1, 1, 1], offset);
724
+ writeInstanceColor(floats, offset, readMeshInstance(instances, source));
616
725
  ranges.push({ offset: offset * 4, size: 16 });
617
726
  }
618
727
  }
728
+ }
619
729
  return mergeRefitRanges(ranges);
620
730
  }
621
731
  //# sourceMappingURL=bvhAccel.js.map