@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,158 +1,17 @@
1
+ import { isProceduralSkyImage } from '../scene/skyParameters.js';
2
+ import { prepareSceneMeshes, computeGeometryNormals } from './scenePreparation.js';
1
3
  import InstancedMesh from '../scene/InstancedMesh.js';
2
- import { meshInstanceCount, meshInstanceTransform, PackedMeshInstances } from './meshInstances.js';
4
+ import { meshInstanceCount } from './meshInstances.js';
3
5
  import { createCanvas } from '../util/canvas.js';
4
- import { packMaterialIndexAndWeightToInt } from './materialIndices.js';
5
6
  import { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches } from './geometryBvh.js';
6
- import { writeMaterialIndices } from './materialIndices.js';
7
- import { vec2, vec3 } from '../math.js';
8
- import Geometry, { Attribute } from '../scene/Geometry.js';
7
+ import { displacementBaseGeometry, computeDisplacementMinmax, computeTrianglesDisplacementRange, conservativeTrianglesDisplacementRange } from './displacementPreparation.js';
8
+ export { sphericalProjectionTriangle, triplanarProjectionTriangle } from './displacementPreparation.js';
9
+ import Geometry from '../scene/Geometry.js';
9
10
  import { buildBLAS } from './bvhAccel.js';
10
- import { colorLuminance } from './lightSampling.js';
11
11
  import { isTextureDataSource } from '../scene/Texture.js';
12
- import { generateVertexTangents, hasGeneratedVertexTangents } from '../util/geometry.js';
13
- function computeGeometryBounds(geometry) {
14
- const min = vec3.fromValues(Infinity, Infinity, Infinity);
15
- const max = vec3.fromValues(-Infinity, -Infinity, -Infinity);
16
- const positions = geometry.position.array;
17
- const stride = geometry.position.itemSize;
18
- for (let offset = 0; offset + 2 < positions.length; offset += stride) {
19
- const x = positions[offset];
20
- const y = positions[offset + 1];
21
- const z = positions[offset + 2];
22
- if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {
23
- continue;
24
- }
25
- min[0] = Math.min(min[0], x);
26
- min[1] = Math.min(min[1], y);
27
- min[2] = Math.min(min[2], z);
28
- max[0] = Math.max(max[0], x);
29
- max[1] = Math.max(max[1], y);
30
- max[2] = Math.max(max[2], z);
31
- }
32
- return [min, max];
33
- }
34
- export function getBvhBounds(geometry) {
35
- const bvh = getGeometryBvh(geometry);
36
- const floats = new Float32Array(bvh.buffer);
37
- if (bvh.layout === 'bvh4') {
38
- return [
39
- [floats[0], floats[1], floats[2]],
40
- [
41
- floats[0] + floats[3],
42
- floats[1] + floats[4],
43
- floats[2] + floats[5]
44
- ]
45
- ];
46
- }
47
- if (bvh.layout === 'bvh-gpu') {
48
- const words = new Uint32Array(bvh.buffer);
49
- if (words[11] === 0) {
50
- return [
51
- [
52
- Math.min(floats[0], floats[8]),
53
- Math.min(floats[1], floats[9]),
54
- Math.min(floats[2], floats[10])
55
- ],
56
- [
57
- Math.max(floats[4], floats[12]),
58
- Math.max(floats[5], floats[13]),
59
- Math.max(floats[6], floats[14])
60
- ]
61
- ];
62
- }
63
- // A single-leaf BVH_GPU node does not store its own bounds.
64
- return computeGeometryBounds(geometry);
65
- }
66
- if (bvh.layout === 'cwbvh') {
67
- const words = new Uint32Array(bvh.buffer);
68
- const header = words[3];
69
- const signedByte = (value) => (value << 24) >> 24;
70
- const scale = [
71
- 2 ** signedByte(header),
72
- 2 ** signedByte(header >> 8),
73
- 2 ** signedByte(header >> 16)
74
- ];
75
- const min = [floats[0], floats[1], floats[2]];
76
- const max = [...min];
77
- for (let slot = 0; slot < 8; slot++) {
78
- const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;
79
- if (!meta)
80
- continue;
81
- const shift = (slot & 3) * 8;
82
- const half = slot >> 2;
83
- max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);
84
- max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);
85
- max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);
86
- }
87
- return [min, max];
88
- }
89
- return [
90
- [floats[0], floats[1], floats[2]],
91
- [floats[4], floats[5], floats[6]]
92
- ];
93
- }
94
- export function computeBounds(_geometry, m, bvhBounds, result = { min: vec3.create(), max: vec3.create() }, p = vec3.create()) {
95
- const { min, max } = result;
96
- vec3.set(min, Infinity, Infinity, Infinity);
97
- vec3.set(max, -Infinity, -Infinity, -Infinity);
98
- // Transforming the eight BLAS AABB corners is exact for an affine transform
99
- // and independent of mesh vertex count. The previous rotated path scanned
100
- // every vertex on every instance update.
101
- for (let corner = 0; corner < 8; corner++) {
102
- vec3.set(p, bvhBounds[(corner >> 0) & 1][0], bvhBounds[(corner >> 1) & 1][1], bvhBounds[(corner >> 2) & 1][2]);
103
- vec3.transformMat4(p, p, m);
104
- if (!p.every(isFinite))
105
- continue;
106
- vec3.min(min, min, p);
107
- vec3.max(max, max, p);
108
- }
109
- return result;
110
- }
111
- export function updateMeshInstanceTransforms(bindings, current, dirtyIndices) {
112
- if (bindings.some(binding => binding.mesh instanceof InstancedMesh)) {
113
- const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));
114
- const matrix = Array(16).fill(0);
115
- const boundsScratch = { min: vec3.create(), max: vec3.create() }, pointScratch = vec3.create();
116
- let sourceIndex = 0;
117
- for (const binding of bindings) {
118
- const { mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale } = binding;
119
- for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {
120
- meshInstanceTransform(mesh, i, matrix);
121
- const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);
122
- if (!bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite) || !matrix.every(Number.isFinite))
123
- continue;
124
- const index = packed.length++;
125
- packed.sourceIndices[index] = sourceIndex;
126
- packed.transforms.set(matrix, index * 16);
127
- packed.bounds.set(bounds.min, index * 6);
128
- packed.bounds.set(bounds.max, index * 6 + 3);
129
- packed.blasIndices[index] = blasIndex;
130
- packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);
131
- packed.displacement[index] = displacementScale;
132
- const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;
133
- for (let k = 0; k < 3; k++)
134
- packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;
135
- }
136
- }
137
- return packed;
138
- }
139
- const update = ({ mesh, geometry, blasIndex, materialIndices, displacementScale, bvhBounds }) => ({
140
- bounds: computeBounds(geometry, mesh.transform, bvhBounds),
141
- blasIndex,
142
- transform: mesh.transform,
143
- materialsIndices: materialIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
144
- displacementScale
145
- });
146
- if (!current || !dirtyIndices)
147
- return bindings.map(update);
148
- const next = current.slice();
149
- dirtyIndices.forEach((index) => {
150
- const binding = bindings[index];
151
- if (binding)
152
- next[index] = update(binding);
153
- });
154
- return next;
155
- }
12
+ import { generateVertexTangents } from '../util/geometry.js';
13
+ export { getBvhBounds } from './geometryBvhBounds.js';
14
+ export { computeBounds, updateMeshInstanceTransforms } from './scenePreparation.js';
156
15
  /** Returns the first material used for CPU displacement. */
157
16
  export function getMeshDisplacementMaterial(mesh) {
158
17
  return mesh.materials[0];
@@ -186,7 +45,6 @@ export function getDisplacementTextureDataCacheKey(texture) {
186
45
  image.height
187
46
  ].join('|');
188
47
  }
189
- const detailedProjectiveRangeTriangleLimit = 100_000;
190
48
  const displacementMinmaxCache = new Map();
191
49
  export function getPreparedMeshGeometryCacheKey(mesh) {
192
50
  const source = mesh.geometry;
@@ -238,8 +96,6 @@ export function getPreparedMeshGeometry(mesh) {
238
96
  }
239
97
  export function computeMinmaxCPU(_geometry, heightImage) {
240
98
  const w = heightImage.width;
241
- const minmaxData = [];
242
- const maxMipLevel = Math.log2(w);
243
99
  let heightPixels;
244
100
  let sourceChannels;
245
101
  let normalizeHeight;
@@ -259,157 +115,17 @@ export function computeMinmaxCPU(_geometry, heightImage) {
259
115
  throw new Error('The displacement texture is not CPU-readable.');
260
116
  canvas.width = w;
261
117
  canvas.height = w;
118
+ if (isProceduralSkyImage(heightImage))
119
+ throw new Error('ProceduralSky is only supported as an environment or background.');
262
120
  ctx.drawImage(heightImage, 0, 0, w, w);
263
121
  heightPixels = ctx.getImageData(0, 0, w, w).data;
264
122
  sourceChannels = 4;
265
123
  normalizeHeight = (value) => value;
266
124
  }
267
- let mipmapSize = w;
268
- for (let lod = 0; lod <= maxMipLevel; lod++) {
269
- const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];
270
- const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);
271
- minmaxData.push(minmax);
272
- const channels = lod === 0 ? sourceChannels : 2;
273
- for (let y = 0; y < mipmapSize; y++) {
274
- for (let x = 0; x < mipmapSize; x++) {
275
- const yx = y * mipmapSize + x;
276
- const idx = yx * channels;
277
- let min = 0;
278
- let max = 0;
279
- if (lod == 0) {
280
- min = normalizeHeight(heightPixels[idx]);
281
- max = min;
282
- if (y < mipmapSize - 1 && x < mipmapSize - 1) {
283
- const h = normalizeHeight(heightPixels[idx + (mipmapSize + 1) * channels]);
284
- min = Math.min(min, h);
285
- max = Math.max(max, h);
286
- }
287
- if (y < mipmapSize - 1) {
288
- const h = normalizeHeight(heightPixels[idx + mipmapSize * channels]);
289
- min = Math.min(min, h);
290
- max = Math.max(max, h);
291
- }
292
- if (x < mipmapSize - 1) {
293
- const h = normalizeHeight(heightPixels[idx + channels]);
294
- min = Math.min(min, h);
295
- max = Math.max(max, h);
296
- }
297
- }
298
- else {
299
- const x2 = x * 2;
300
- const y2 = y * 2;
301
- const prevMipmapSize = mipmapSize * 2;
302
- const idx2 = (y2 * prevMipmapSize + x2) * channels;
303
- const idx2_0 = idx2;
304
- const idx2_1 = idx2 + channels;
305
- const idx2_2 = idx2 + prevMipmapSize * channels;
306
- const idx2_3 = idx2 + prevMipmapSize * channels + channels;
307
- min = Math.min(prevMinmaxData[idx2_0], prevMinmaxData[idx2_1], prevMinmaxData[idx2_2], prevMinmaxData[idx2_3]);
308
- max = Math.max(prevMinmaxData[idx2_0 + 1], prevMinmaxData[idx2_1 + 1], prevMinmaxData[idx2_2 + 1], prevMinmaxData[idx2_3 + 1]);
309
- }
310
- minmax[yx * 2] = min;
311
- minmax[yx * 2 + 1] = max;
312
- }
313
- }
314
- mipmapSize = mipmapSize / 2;
315
- }
316
- return minmaxData;
317
- }
318
- function sphericalProjection(n, uv) {
319
- const theta = Math.atan2(n[0], n[2]) / (2.0 * Math.PI) + 0.5;
320
- const phi = Math.acos(n[1]) / Math.PI;
321
- vec2.set(uv, theta, 1.0 - phi);
322
- }
323
- export function sphericalProjectionTriangle(na, nb, nc, uvA, uvB, uvC) {
324
- sphericalProjection(na, uvA);
325
- sphericalProjection(nb, uvB);
326
- sphericalProjection(nc, uvC);
327
- let onSeam = false;
328
- for (let i = 0; i < 2; i++) {
329
- if (Math.abs(uvA[i] - uvB[i]) > 0.5 ||
330
- Math.abs(uvA[i] - uvC[i]) > 0.5 ||
331
- Math.abs(uvB[i] - uvC[i]) > 0.5) {
332
- const maxU = Math.max(uvA[i], uvB[i], uvC[i]);
333
- if (maxU - uvA[i] > 0.5) {
334
- uvA[i] += 1.0;
335
- onSeam = true;
336
- }
337
- if (maxU - uvB[i] > 0.5) {
338
- uvB[i] += 1.0;
339
- onSeam = true;
340
- }
341
- if (maxU - uvC[i] > 0.5) {
342
- uvC[i] += 1.0;
343
- onSeam = true;
344
- }
345
- }
346
- }
347
- return onSeam;
348
- }
349
- function getMaxAxisIndex(n) {
350
- const x = Math.abs(n[0]);
351
- const y = Math.abs(n[1]);
352
- const z = Math.abs(n[2]);
353
- return x > y && x > z ? 0 : y > z ? 1 : 2;
354
- }
355
- export function triplanarProjectionTriangle(a, b, c, na, nb, nc, uvA, uvB, uvC) {
356
- const tmpMaxX = Math.max(Math.abs(na[0]), Math.abs(nb[0]), Math.abs(nc[0]));
357
- const tmpMaxY = Math.max(Math.abs(na[1]), Math.abs(nb[1]), Math.abs(nc[1]));
358
- const tmpMaxZ = Math.max(Math.abs(na[2]), Math.abs(nb[2]), Math.abs(nc[2]));
359
- if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {
360
- // yz
361
- vec2.set(uvA, a[1], a[2]);
362
- vec2.set(uvB, b[1], b[2]);
363
- vec2.set(uvC, c[1], c[2]);
364
- }
365
- else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {
366
- // xz
367
- vec2.set(uvA, a[0], a[2]);
368
- vec2.set(uvB, b[0], b[2]);
369
- vec2.set(uvC, c[0], c[2]);
370
- }
371
- else {
372
- // xy
373
- vec2.set(uvA, a[0], a[1]);
374
- vec2.set(uvB, b[0], b[1]);
375
- vec2.set(uvC, c[0], c[1]);
376
- }
377
- }
378
- function findRoots(triAabbMinP, triAabbMaxP, maxDepth, roots) {
379
- let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);
380
- let size = Math.max(d[0], d[1]);
381
- let startMipLevel = maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;
382
- if (!isFinite(startMipLevel)) {
383
- startMipLevel = maxDepth;
384
- }
385
- startMipLevel = Math.max(startMipLevel, 0);
386
- let rootCount = 0;
387
- while (true) {
388
- const mipSize = Math.pow(2.0, maxDepth - startMipLevel);
389
- const minTexelX = Math.floor(mipSize * triAabbMinP[0]);
390
- const minTexelY = Math.floor(mipSize * triAabbMinP[1]);
391
- const maxTexelX = Math.floor(mipSize * triAabbMaxP[0]);
392
- const maxTexelY = Math.floor(mipSize * triAabbMaxP[1]);
393
- if ((maxTexelX - minTexelX < 2 &&
394
- maxTexelY - minTexelY < 2 &&
395
- startMipLevel >= 0) ||
396
- startMipLevel >= maxDepth) {
397
- for (let y = minTexelY; y <= maxTexelY; y++) {
398
- for (let x = minTexelX; x <= maxTexelX; x++) {
399
- if (rootCount < roots.length) {
400
- vec3.set(roots[rootCount], Math.floor(x), Math.floor(y), startMipLevel);
401
- rootCount++;
402
- }
403
- }
404
- }
405
- break;
406
- }
407
- startMipLevel++;
408
- }
409
- return rootCount;
125
+ return computeDisplacementMinmax(w, sourceChannels, index => normalizeHeight(heightPixels[index]));
410
126
  }
411
127
  export function getTrianglesDisplacementRange(geometry, heightTexture, material) {
412
- const indices = geometry.indices.array;
128
+ const indices = geometry.indexArray;
413
129
  const uvs = geometry.uv?.array;
414
130
  const uvProjection = material.displacementUvProjection;
415
131
  if (!heightTexture)
@@ -423,16 +139,10 @@ export function getTrianglesDisplacementRange(geometry, heightTexture, material)
423
139
  return;
424
140
  }
425
141
  const triangleCount = indices.length / 3;
426
- if (triangleCount >= detailedProjectiveRangeTriangleLimit) {
427
- // A conservative full-height prism is much cheaper to prepare for dense
428
- // source meshes and remains intersection-safe. Per-triangle UV min/max is
429
- // retained for smaller meshes where tighter BVH nodes matter more.
430
- const conservative = new Float32Array(triangleCount * 2);
431
- for (let triangle = 0; triangle < triangleCount; triangle++) {
432
- conservative[triangle * 2 + 1] = 1;
433
- }
142
+ // Dense meshes retain the shared conservative full-height prism path.
143
+ const conservative = conservativeTrianglesDisplacementRange(triangleCount);
144
+ if (conservative)
434
145
  return conservative;
435
- }
436
146
  const minmaxCacheKey = getDisplacementTextureDataCacheKey(heightTexture);
437
147
  let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);
438
148
  if (!minmaxData) {
@@ -442,127 +152,7 @@ export function getTrianglesDisplacementRange(geometry, heightTexture, material)
442
152
  }
443
153
  displacementMinmaxCache.set(minmaxCacheKey, minmaxData);
444
154
  }
445
- const maxDepth = Math.log2(heightImage.width);
446
- const trianglesDisplacementRange = new Float32Array((indices.length / 3) * 2);
447
- const normal = geometry.normal.array;
448
- const position = geometry.position.array;
449
- const uv1 = vec2.create();
450
- const uv2 = vec2.create();
451
- const uv3 = vec2.create();
452
- const p1 = vec3.create();
453
- const p2 = vec3.create();
454
- const p3 = vec3.create();
455
- const n1 = vec3.create();
456
- const n2 = vec3.create();
457
- const n3 = vec3.create();
458
- const isTriplanar = uvProjection === 'triplanar';
459
- const isSpherical = uvProjection === 'spherical';
460
- const isCylindrical = uvProjection === 'cylindrical';
461
- const uvScale = material.displacementUvProjectionScale;
462
- const minUv = vec2.create();
463
- const maxUv = vec2.create();
464
- const roots = [];
465
- for (let i = 0; i < 100; i++) {
466
- roots.push([0, 0, 0]);
467
- }
468
- for (let i = 0; i < indices.length; i += 3) {
469
- const i1 = indices[i];
470
- const i2 = indices[i + 1];
471
- const i3 = indices[i + 2];
472
- const i1_2 = i1 * 2;
473
- const i2_2 = i2 * 2;
474
- const i3_2 = i3 * 2;
475
- const i1_3 = i1 * 3;
476
- const i2_3 = i2 * 3;
477
- const i3_3 = i3 * 3;
478
- if (uvs) {
479
- vec2.set(uv1, uvs[i1_2], uvs[i1_2 + 1]);
480
- vec2.set(uv2, uvs[i2_2], uvs[i2_2 + 1]);
481
- vec2.set(uv3, uvs[i3_2], uvs[i3_2 + 1]);
482
- }
483
- else {
484
- vec2.set(uv1, 0, 0);
485
- vec2.set(uv2, 0, 0);
486
- vec2.set(uv3, 0, 0);
487
- }
488
- let onSeam = false;
489
- if (isTriplanar || isSpherical || isCylindrical) {
490
- vec3.set(n1, normal[i1_3], normal[i1_3 + 1], normal[i1_3 + 2]);
491
- vec3.set(n2, normal[i2_3], normal[i2_3 + 1], normal[i2_3 + 2]);
492
- vec3.set(n3, normal[i3_3], normal[i3_3 + 1], normal[i3_3 + 2]);
493
- vec3.normalize(n1, n1);
494
- vec3.normalize(n2, n2);
495
- vec3.normalize(n3, n3);
496
- if (isTriplanar || isSpherical || isCylindrical) {
497
- vec3.set(p1, position[i1_3], position[i1_3 + 1], position[i1_3 + 2]);
498
- vec3.set(p2, position[i2_3], position[i2_3 + 1], position[i2_3 + 2]);
499
- vec3.set(p3, position[i3_3], position[i3_3 + 1], position[i3_3 + 2]);
500
- }
501
- if (isTriplanar) {
502
- // Is on the seam. Needs full prism to avoid empty seams.
503
- const xMaxIndex = getMaxAxisIndex(n1);
504
- const yMaxIndex = getMaxAxisIndex(n2);
505
- const zMaxIndex = getMaxAxisIndex(n3);
506
- if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {
507
- onSeam = true;
508
- }
509
- /* prettier-ignore */
510
- triplanarProjectionTriangle(p1, p2, p3, n1, n2, n3, uv1, uv2, uv3);
511
- }
512
- else if (isSpherical) {
513
- vec3.normalize(p1, p1);
514
- vec3.normalize(p2, p2);
515
- vec3.normalize(p3, p3);
516
- onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);
517
- }
518
- else {
519
- const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;
520
- const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;
521
- const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;
522
- vec2.set(uv1, u1, p1[1]);
523
- vec2.set(uv2, u2, p2[1]);
524
- vec2.set(uv3, u3, p3[1]);
525
- onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;
526
- }
527
- }
528
- vec2.scale(uv1, uv1, uvScale);
529
- vec2.scale(uv2, uv2, uvScale);
530
- vec2.scale(uv3, uv3, uvScale);
531
- // TODO PDM don't have zero area triangle issue.
532
- let minHeight = Infinity;
533
- let maxHeight = -Infinity;
534
- if (onSeam) {
535
- minHeight = 0.0;
536
- maxHeight = 255.0;
537
- }
538
- else {
539
- vec2.copy(maxUv, uv1);
540
- vec2.copy(minUv, uv1);
541
- vec2.min(minUv, minUv, uv2);
542
- vec2.min(minUv, minUv, uv3);
543
- vec2.max(maxUv, maxUv, uv2);
544
- vec2.max(maxUv, maxUv, uv3);
545
- const rootCount = findRoots(minUv, maxUv, maxDepth, roots);
546
- for (let k = 0; k < rootCount; k++) {
547
- const mipLevel = roots[k][2];
548
- const mipSize = Math.pow(2, maxDepth - mipLevel);
549
- const minmax = minmaxData[mipLevel];
550
- const x = ((roots[k][0] % mipSize) + mipSize) % mipSize;
551
- let y = ((roots[k][1] % mipSize) + mipSize) % mipSize;
552
- if (isFlipY) {
553
- y = mipSize - y - 1;
554
- }
555
- const idx = (y * mipSize + x) * 2;
556
- minHeight = Math.min(minHeight, minmax[idx]);
557
- maxHeight = Math.max(maxHeight, minmax[idx + 1]);
558
- }
559
- }
560
- // TODO this will cause flat surface optimization fail.
561
- // But not adding bias will leads to small gap between flat surface and displaced surface.
562
- trianglesDisplacementRange[(i / 3) * 2] = Math.max((Math.floor(minHeight) - 4) / 255, 0);
563
- trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min((Math.ceil(maxHeight) + 4) / 255, 1);
564
- }
565
- return trianglesDisplacementRange;
155
+ return computeTrianglesDisplacementRange(geometry, minmaxData, heightImage.width, isFlipY, material);
566
156
  }
567
157
  const warnedDirectionGeometry = new WeakSet();
568
158
  /** Prepare auto-generated source attributes before the renderer captures array identities. */
@@ -600,21 +190,7 @@ export function getMeshBlasInput(mesh) {
600
190
  // attributes for texture coordinates and shading. This same input works for
601
191
  // built-in, TinyBVH and Worker builds; the shader offsets its base identically.
602
192
  const bias = heightMap ? getMeshDisplacementMaterial(mesh).displacementBias : 0;
603
- if (bias !== 0) {
604
- const positions = geometry.position.array.slice();
605
- const normals = geometry.normal.array;
606
- for (let vertex = 0; vertex < geometry.vertexCount; vertex++) {
607
- const p = vertex * geometry.position.itemSize, n = vertex * geometry.normal.itemSize;
608
- const length = Math.hypot(normals[n], normals[n + 1], normals[n + 2]);
609
- if (length > 0) {
610
- for (let axis = 0; axis < 3; axis++)
611
- positions[p + axis] += normals[n + axis] / length * bias;
612
- }
613
- }
614
- return { geometry: new Geometry({ ...geometry, position: new Attribute(positions, geometry.position.itemSize) }),
615
- displacementScale, trianglesDisplacement };
616
- }
617
- return { geometry, displacementScale, trianglesDisplacement };
193
+ return { geometry: displacementBaseGeometry(geometry, bias), displacementScale, trianglesDisplacement };
618
194
  }
619
195
  /** Whether a static mesh still needs a BLAS before it can be rendered. */
620
196
  export function meshNeedsStaticBvh(mesh, config) {
@@ -656,210 +232,13 @@ function prepareMeshGeometryBvh(mesh, displacement = true) {
656
232
  return { geometry, displacementScale };
657
233
  }
658
234
  export function updateMeshInstances(meshes, options = {}) {
659
- const materialIndexMap = new Map();
660
- const geometryIndexMap = new Map();
661
- const geometries = [];
662
- const materials = [];
663
- const globalMaterialIndicesMap = [];
664
- const emissiveBindings = [];
665
- const instanceBindings = [];
666
- const instances = meshes
667
- .filter((mesh) => mesh.geometry.position?.array.length > 0)
668
- .map((mesh) => {
669
- let { geometry, displacementScale } = prepareMeshGeometryBvh(mesh, options.displacement !== false);
670
- const bvhBounds = getBvhBounds(geometry);
671
- const bounds = computeBounds(geometry, mesh.transform, bvhBounds);
672
- let geoIdx = geometryIndexMap.get(geometry);
673
- const materialsIndices = mesh.materials.map((material) => {
674
- const key = material;
675
- if (!materialIndexMap.has(key)) {
676
- materialIndexMap.set(key, materials.length);
677
- materials.push(material);
678
- }
679
- return materialIndexMap.get(key);
680
- });
681
- // Explicit vertex indices are global after merging. Batches with a
682
- // different material table need their own vertex region, even when the
683
- // table contains just one material. Equal tables can share the region.
684
- if (geoIdx != null && geometry.materialIndex &&
685
- (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||
686
- materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx][i]))) {
687
- const bvh = getGeometryBvh(geometry);
688
- geometry = new Geometry(geometry);
689
- setGeometryBvh(geometry, bvh);
690
- geoIdx = undefined;
691
- }
692
- if (geoIdx == null) {
693
- geoIdx = geometries.length;
694
- geometryIndexMap.set(geometry, geometries.length);
695
- geometries.push(geometry);
696
- // Same number with geometries.
697
- globalMaterialIndicesMap.push(materialsIndices);
698
- }
699
- const instance = {
700
- bounds,
701
- blasIndex: geoIdx,
702
- transform: mesh.transform,
703
- materialsIndices: materialsIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
704
- displacementScale
705
- };
706
- if (!(mesh instanceof InstancedMesh) && (!bounds.min.every(isFinite) ||
707
- !bounds.max.every(isFinite) ||
708
- !mesh.transform.every(isFinite))) {
709
- return undefined;
710
- }
711
- if (mesh.materials.some((material) => !material.unlit && !material.shadowCatcher &&
712
- colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8)) {
713
- emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });
714
- }
715
- instanceBindings.push({
716
- mesh,
717
- geometry,
718
- blasIndex: geoIdx,
719
- materialIndices: materialsIndices,
720
- displacementScale,
721
- bvhBounds
722
- });
723
- return instance;
724
- })
725
- .filter((instance) => instance != null);
726
- const geometryRegions = new Map();
727
- const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);
728
- return {
729
- geometry,
730
- geometries,
731
- geometryRegions,
732
- geometryStates: new Map(instanceBindings.map(binding => {
733
- const source = binding.mesh.geometry;
734
- return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,
735
- indexCount: source.indices.array.length }];
736
- })),
737
- instances: meshes.some(mesh => mesh instanceof InstancedMesh) ? updateMeshInstanceTransforms(instanceBindings) : instances,
738
- materials,
739
- instanceBindings,
740
- emissiveBindings,
741
- blases: geometries.map((geo) => ({
742
- bvh: getGeometryBvh(geo),
743
- verticesCount: geo.vertexCount,
744
- trainglesCount: geo.indices.array.length / 3
745
- }))
746
- };
747
- }
748
- function mergeGeometry(geometries, globalMaterialIndicesMap, regions) {
749
- const totalVertexCount = geometries.reduce((sum, geo) => sum + geo.vertexCount, 0);
750
- const totalIndexCount = geometries.reduce((sum, geo) => sum + geo.indices.array.length, 0);
751
- const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
752
- const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
753
- const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
754
- const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
755
- const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
756
- const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
757
- const hasColor = geometries.some((geo) => geo.color);
758
- const hasTangent = geometries.some((geo) => geo.tangent);
759
- const mergedGeometry = new Geometry({
760
- position: positionAttrib,
761
- normal: normalAttrib,
762
- uv: uvAttrib,
763
- uv1: uv1Attrib,
764
- materialIndex: materialIndexAttrib,
765
- color: hasColor
766
- ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)
767
- : undefined,
768
- tangent: hasTangent
769
- ? new Attribute(new Float32Array(4 * totalVertexCount), 4)
770
- : undefined,
771
- indices: indexAttrib
772
- });
773
- let currentVertex = 0;
774
- let currentIndex = 0;
775
- geometries.forEach((geometry, idx) => {
776
- const vertexCount = geometry.vertexCount;
777
- const globalMaterialIndex = globalMaterialIndicesMap[idx];
778
- regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });
779
- positionAttrib.array.set(geometry.position.array, currentVertex * 3);
780
- normalAttrib.array.set(geometry.normal.array, currentVertex * 3);
781
- if (geometry.uv) {
782
- uvAttrib.array.set(geometry.uv.array, currentVertex * 2);
783
- }
784
- uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
785
- if (geometry.color) {
786
- mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);
787
- }
788
- if (geometry.tangent) {
789
- const source = geometry.tangent;
790
- for (let v = 0; v < vertexCount; v++) {
791
- for (let c = 0; c < 4; c++)
792
- mergedGeometry.tangent.array[(currentVertex + v) * 4 + c] =
793
- c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;
794
- }
795
- }
796
- writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex);
797
- const meshIndices = geometry.indices.array;
798
- for (let i = 0; i < meshIndices.length; i++) {
799
- indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];
800
- }
801
- currentVertex += vertexCount;
802
- currentIndex += meshIndices.length;
803
- });
804
- return mergedGeometry;
805
- }
806
- function computeGeometryNormals(geometry) {
807
- const indices = geometry.indices;
808
- const positions = geometry.position.array;
809
- geometry.normal = new Attribute(new Float32Array(positions.length), 3);
810
- const normals = geometry.normal.array;
811
- const p1 = vec3.create();
812
- const p2 = vec3.create();
813
- const p3 = vec3.create();
814
- const v21 = vec3.create();
815
- const v32 = vec3.create();
816
- const n = vec3.create();
817
- const len = indices
818
- ? indices.array.length
819
- : geometry.vertexCount;
820
- let i1, i2, i3;
821
- for (let f = 0; f < len;) {
822
- if (indices) {
823
- i1 = indices.array[f++];
824
- i2 = indices.array[f++];
825
- i3 = indices.array[f++];
826
- }
827
- else {
828
- i1 = f++;
829
- i2 = f++;
830
- i3 = f++;
831
- }
832
- vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
833
- vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
834
- vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
835
- vec3.sub(v21, p1, p2);
836
- vec3.sub(v32, p2, p3);
837
- vec3.cross(n, v21, v32);
838
- // Already be weighted by the triangle area
839
- for (let i = 0; i < 3; i++) {
840
- normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
841
- normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
842
- normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
843
- }
844
- }
845
- for (let i = 0; i < normals.length;) {
846
- vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
847
- vec3.normalize(n, n);
848
- normals[i++] = n[0];
849
- normals[i++] = n[1];
850
- normals[i++] = n[2];
851
- }
852
- }
853
- /** Batch records are regenerated together; refit all numeric source slots. */
854
- export function dirtyMeshInstanceIndices(bindings, meshes, instances) {
855
- if (instances instanceof PackedMeshInstances)
856
- return new Set(Array.from({ length: instances.length }, (_, i) => i));
857
- return new Set(bindings.flatMap((binding, i) => meshes.has(binding.mesh) ? [i] : []));
235
+ return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false));
858
236
  }
237
+ export { dirtyPreparedInstanceIndices as dirtyMeshInstanceIndices } from './scenePreparation.js';
859
238
  /** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */
860
239
  export function updateMeshInstanceColors(bindings, instances, meshes) {
861
240
  const dirty = new Set();
862
- if (!(instances instanceof PackedMeshInstances))
241
+ if (Array.isArray(instances))
863
242
  return dirty;
864
243
  let sourceStart = 0, packedIndex = 0;
865
244
  for (const { mesh } of bindings) {