@meimu/mutracer 0.0.0-stage → 0.1.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 (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +195 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14352 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +144 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +273 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +121 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +256 -0
  35. package/lib/Render.js +671 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +76 -0
  38. package/lib/RenderLoop.js +204 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1446 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +121 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +619 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +100 -0
  511. package/lib/util/fromTHREE.js +1063 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromTHREE.js","sourceRoot":"","sources":["../../src/util/fromTHREE.ts"],"names":[],"mappings":"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","sourcesContent":["import { specularAnisotropyModelIndex } from '../scene/anisotropyParameters.js';\nimport { normalizeMaterialParams } from '../scene/openPbrSchema.js';\nimport { thinFilmMapChannelIndex } from '../scene/thinFilmParameters.js';\nimport { snapshotMaterialParameters, materialParametersEqual } from '../renderer/sceneChangeDetector.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Sync from '../Sync.js';\nimport type Engine from '../Engine.js';\nimport { markDeformedGeometry } from '../scene/geometryChanges.js';\nimport type * as THREE from 'three';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, { getMaterialHashKey, materialKeys } from '../scene/OpenPBRMaterial.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Texture from '../scene/Texture.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport AmbientLight from '../scene/AmbientLight.js';\nimport EnvironmentLight from '../scene/EnvironmentLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport IESProfile from '../scene/IESProfile.js';\nimport Camera from '../scene/Camera.js';\nimport { ColorRGB, ColorRGBA } from '../types.js';\nimport { GroundedSkyboxBackground, Scene, SceneLight } from '../scene/Scene.js';\nimport { mat4 } from '../math.js';\nimport { generateVertexNormals, updateBoundingBox, updateDynamicTangents } from './geometry.js';\nimport { THREEDeformation, isDeformingMesh } from './threeDeformation.js';\nimport { snapshotsEqual, snapshotFields } from '../renderer/sceneChangeDetector.js';\n\ninterface TextureRecord {\n texture: Texture;\n state: unknown[];\n}\ntype TextureStore = WeakMap<THREE.Texture, TextureRecord>;\n\nfunction convertTexture(\n threeTexture: THREE.Texture | null | undefined,\n textureStore: TextureStore\n) {\n if (!threeTexture) return;\n const state = [threeTexture.version, threeTexture.image, threeTexture.flipY,\n threeTexture.repeat.x, threeTexture.repeat.y, threeTexture.offset.x,\n threeTexture.offset.y, threeTexture.channel];\n const cached = textureStore.get(threeTexture);\n if (cached && snapshotsEqual(cached.state, state)) return cached.texture;\n const image = threeTexture.image as Texture['image'];\n const texture = cached?.texture ?? new Texture(image);\n texture.image = image;\n texture.source = threeTexture;\n texture.flipY = threeTexture.flipY;\n texture.uvScale = [threeTexture.repeat.x, threeTexture.repeat.y];\n texture.uvOffset = [threeTexture.offset.x, threeTexture.offset.y];\n texture.uvChannel = threeTexture.channel === 1 ? 1 : 0;\n if (cached) texture.markUpdated();\n else texture.version = threeTexture.version;\n textureStore.set(threeTexture, { texture, state });\n return texture;\n}\n\nfunction halfFloatToFloat(value: number) {\n const sign = value & 0x8000 ? -1 : 1;\n const exponent = (value >> 10) & 0x1f;\n const fraction = value & 0x03ff;\n if (exponent === 0) {\n return sign * Math.pow(2, -14) * (fraction / 0x400);\n }\n if (exponent === 0x1f) {\n return fraction ? NaN : sign * Infinity;\n }\n return sign * Math.pow(2, exponent - 15) * (1 + fraction / 0x400);\n}\n\nfunction convertDataTexture(threeTexture: THREE.DataTexture | null | undefined, textureStore: TextureStore) {\n if (!threeTexture?.image?.data || !threeTexture.image.width || !threeTexture.image.height) return;\n const previous = textureStore.get(threeTexture);\n const texture = convertTexture(threeTexture, textureStore)!;\n if (previous?.state === textureStore.get(threeTexture)?.state) return texture;\n const source = threeTexture.image.data as ArrayBufferView;\n const data = source instanceof Uint16Array\n ? Float32Array.from(source, halfFloatToFloat)\n : source instanceof Float32Array || source instanceof Uint8Array || source instanceof Int32Array\n ? source : Float32Array.from(source as unknown as ArrayLike<number>);\n texture.image = { data, width: threeTexture.image.width, height: threeTexture.image.height };\n return texture;\n}\n\nfunction convertMaterial(\n threeMaterial: THREE.Material,\n textureCache: TextureStore\n) {\n const material = new OpenPBRMaterial();\n if (threeMaterial.userData.mutracerShadowCatcher === true) {\n material.shadowCatcher = true;\n return material;\n }\n if ((threeMaterial as THREE.MeshBasicMaterial).isMeshBasicMaterial) {\n const basic = threeMaterial as THREE.MeshBasicMaterial;\n // GLTFLoader represents KHR_materials_unlit as MeshBasicMaterial. Keep its\n // base-color texture's alpha while displaying RGB without scene lighting.\n material.unlit = true;\n material.baseWeight = 0;\n material.specularWeight = 0;\n material.baseColor = basic.color.toArray() as ColorRGB;\n material.emissionColor = material.baseColor;\n material.emissionLuminance = 1;\n material.map = convertTexture(basic.map, textureCache);\n material.emissiveMap = material.map;\n material.alphaMap = convertTexture(basic.alphaMap, textureCache);\n material.geometryOpacity = basic.opacity;\n material.alphaCutoff = Math.max(0, basic.alphaTest);\n material.alphaMode = basic.alphaTest > 0\n ? 'mask'\n : basic.transparent || basic.opacity < 1 || !!basic.alphaMap\n ? 'blend'\n : 'opaque';\n material.mapAlphaUsage = material.alphaMode === 'opaque'\n ? \"opaque\"\n : \"alpha\";\n material.doubleSided = basic.side === 2;\n return material;\n }\n const standardMaterial = threeMaterial as THREE.MeshStandardMaterial;\n material.baseColor = standardMaterial.color.toArray() as ColorRGB;\n material.emissionColor =\n standardMaterial.emissive &&\n (standardMaterial.emissive.toArray() as ColorRGB);\n material.specularRoughness = standardMaterial.roughness;\n material.baseMetalness = standardMaterial.metalness;\n material.emissionLuminance = standardMaterial.emissiveIntensity;\n\n material.normalScale =\n standardMaterial.normalScale && standardMaterial.normalScale.toArray();\n\n const materialUvProjection = standardMaterial.userData\n .mutracerUvProjection;\n if (\n materialUvProjection === 'triplanar' ||\n materialUvProjection === 'spherical' ||\n materialUvProjection === 'cylindrical' ||\n materialUvProjection === 'none'\n ) {\n material.uvProjection = materialUvProjection;\n }\n const materialUvScale = standardMaterial.userData.mutracerUvProjectionScale;\n if (Array.isArray(materialUvScale) && materialUvScale.length >= 2) {\n const referenceLength = Math.max(\n Number(standardMaterial.userData.mutracerUvReferenceLength) || 1,\n 0.000001\n );\n const scaleX = Math.max(\n Number(materialUvScale[0]) || 0.000001,\n 0.000001\n );\n const scaleY = Math.max(\n Number(materialUvScale[1]) || 0.000001,\n 0.000001\n );\n material.uvProjectionScale = material.uvProjection === 'triplanar'\n ? [scaleX / referenceLength, scaleY / referenceLength]\n : material.uvProjection === 'cylindrical'\n ? [scaleX, scaleY / referenceLength]\n : [scaleX, scaleY];\n }\n\n material.map = convertTexture(standardMaterial.map, textureCache);\n material.alphaMap = convertTexture(standardMaterial.alphaMap, textureCache);\n material.alphaCutoff = Math.max(\n 0,\n Number.isFinite(standardMaterial.alphaTest) ? standardMaterial.alphaTest : 0\n );\n material.emissiveMap = convertTexture(\n standardMaterial.emissiveMap,\n textureCache\n );\n material.normalMap = convertTexture(standardMaterial.normalMap, textureCache);\n material.displacementMap = convertTexture(\n standardMaterial.displacementMap,\n textureCache\n );\n const displacementScale = Number(standardMaterial.displacementScale);\n material.displacementScale = Number.isFinite(displacementScale)\n ? displacementScale\n : material.displacementScale;\n const displacementStepSize = Number(\n standardMaterial.userData.mutracerDisplacementStepSize\n );\n if (Number.isFinite(displacementStepSize)) {\n material.displacementStepSize = Math.max(0.000001, displacementStepSize);\n }\n const uvProjection = standardMaterial.userData\n .mutracerDisplacementUvProjection;\n if (\n uvProjection === 'triplanar' ||\n uvProjection === 'spherical' ||\n uvProjection === 'cylindrical' ||\n uvProjection === 'none'\n ) {\n material.displacementUvProjection = uvProjection;\n }\n const displacementUvProjectionScale = Number(\n standardMaterial.userData.mutracerDisplacementUvProjectionScale\n );\n if (Number.isFinite(displacementUvProjectionScale)) {\n material.displacementUvProjectionScale = Math.max(displacementUvProjectionScale, 0.000001);\n }\n if (\n standardMaterial.roughnessMap &&\n standardMaterial.roughnessMap === standardMaterial.metalnessMap\n ) {\n material.metallicRoughnessMap = convertTexture(\n standardMaterial.roughnessMap,\n textureCache\n );\n } else {\n material.roughnessMap = convertTexture(\n standardMaterial.roughnessMap,\n textureCache\n );\n material.metalnessMap = convertTexture(\n standardMaterial.metalnessMap,\n textureCache\n );\n }\n const physicalMaterial = standardMaterial as THREE.MeshPhysicalMaterial;\n if (physicalMaterial.type === 'MeshPhysicalMaterial') {\n material.transmissionWeight = physicalMaterial.transmission;\n material.transmissionMap = convertTexture(\n physicalMaterial.transmissionMap,\n textureCache\n );\n material.specularIor = physicalMaterial.ior;\n material.specularWeight = physicalMaterial.specularIntensity;\n if (physicalMaterial.specularColor) {\n material.specularColor =\n physicalMaterial.specularColor.toArray() as ColorRGB;\n }\n material.coatWeightMap = convertTexture(physicalMaterial.clearcoatMap, textureCache);\n material.coatRoughnessMap = convertTexture(physicalMaterial.clearcoatRoughnessMap, textureCache);\n material.coatNormalMap = convertTexture(physicalMaterial.clearcoatNormalMap, textureCache);\n material.coatNormalScale = physicalMaterial.clearcoatNormalScale.toArray();\n material.fuzzColorMap = convertTexture(physicalMaterial.sheenColorMap, textureCache);\n material.fuzzRoughnessMap = convertTexture(physicalMaterial.sheenRoughnessMap, textureCache);\n material.specularWeightMap = convertTexture(physicalMaterial.specularIntensityMap, textureCache);\n material.specularColorMap = convertTexture(physicalMaterial.specularColorMap, textureCache);\n material.coatWeight = physicalMaterial.clearcoat;\n material.coatRoughness = physicalMaterial.clearcoatRoughness;\n // MeshPhysicalMaterial's clearcoat BRDF uses the fixed dielectric F0\n // for IOR 1.5. Match that in the OpenPBR path representation; explicit\n // mutracerOpenPBR metadata below may provide a different coat IOR.\n material.coatIor = 1.5;\n // Three.js/glTF clearcoat does not model internal-reflection darkening.\n material.coatDarkening = 0;\n material.fuzzWeight = physicalMaterial.sheen;\n material.fuzzRoughness = physicalMaterial.sheenRoughness;\n if (physicalMaterial.sheenColor) {\n material.fuzzColor = physicalMaterial.sheenColor.toArray() as ColorRGB;\n }\n if (physicalMaterial.attenuationColor) {\n material.transmissionColor =\n physicalMaterial.attenuationColor.toArray() as ColorRGB;\n }\n if (Number.isFinite(physicalMaterial.attenuationDistance)) {\n material.transmissionDepth = Math.max(\n 0,\n physicalMaterial.attenuationDistance\n );\n }\n }\n const dispersion = Number(physicalMaterial.dispersion);\n material.transmissionDispersionScale = Number.isFinite(dispersion)\n ? Math.min(1, Math.max(0, dispersion))\n : 0;\n const realtimeIridescence = physicalMaterial as THREE.MeshPhysicalMaterial & {\n iridescence?: number;\n iridescenceIOR?: number;\n iridescenceThicknessRange?: number[];\n iridescenceThicknessMap?: THREE.Texture | null;\n };\n material.thinFilmThickness = Math.min(\n 20,\n Math.max(\n 0,\n (realtimeIridescence.iridescenceThicknessRange?.[1] ?? 500) / 1000\n )\n );\n material.thinFilmWeight = Math.min(\n 1, Math.max(0, realtimeIridescence.iridescence ?? 0)\n );\n material.thinFilmIor = Math.min(\n 2.5, Math.max(1, realtimeIridescence.iridescenceIOR ?? 1.4)\n );\n const nativeThinFilmMap = standardMaterial.userData.mutracerThinFilmMap as THREE.Texture | undefined;\n const thinFilmMap =\n (standardMaterial.userData\n .mutracerThinFilmMap as THREE.Texture | undefined) ??\n realtimeIridescence.iridescenceThicknessMap ??\n undefined;\n if (thinFilmMap) {\n material.thinFilmMap = convertTexture(thinFilmMap, textureCache);\n if (!nativeThinFilmMap) {\n material.thinFilmThicknessMinimum = Math.min(20, Math.max(0,\n (realtimeIridescence.iridescenceThicknessRange?.[0] ?? 0) / 1000));\n material.thinFilmMapChannel = 'g';\n }\n }\n const anisotropy = Number(physicalMaterial.anisotropy);\n material.specularRoughnessAnisotropy = Number.isFinite(anisotropy)\n ? Math.min(1, Math.max(0, anisotropy))\n : 0;\n if (physicalMaterial.isMeshPhysicalMaterial) {\n material.specularAnisotropyModel = 'gltf';\n material.anisotropyMap = convertTexture(physicalMaterial.anisotropyMap, textureCache);\n const rotation = Number(physicalMaterial.anisotropyRotation);\n material.specularAnisotropyRotation = Number.isFinite(rotation) ? rotation : 0;\n }\n const sourceOpenPbr = standardMaterial.userData.mutracerOpenPBR as Record<string, unknown> | undefined;\n const openPbr = sourceOpenPbr ? normalizeMaterialParams(sourceOpenPbr) : undefined;\n const finite = (\n value: unknown,\n fallback: number,\n minimum = 0,\n maximum = 1\n ) => {\n const number = Number(value);\n return Number.isFinite(number)\n ? Math.min(maximum, Math.max(minimum, number))\n : fallback;\n };\n const color = (value: unknown, fallback: ColorRGB) => {\n const components = value as ArrayLike<number> | undefined;\n return components && components.length >= 3\n ? ([\n finite(components[0], fallback[0]),\n finite(components[1], fallback[1]),\n finite(components[2], fallback[2])\n ] as ColorRGB)\n : fallback;\n };\n if (openPbr) {\n if (openPbr.specularAnisotropyModel !== undefined) {\n specularAnisotropyModelIndex(openPbr.specularAnisotropyModel);\n material.specularAnisotropyModel = openPbr.specularAnisotropyModel as 'openpbr' | 'gltf';\n }\n if (openPbr.specularAnisotropy !== undefined && openPbr.specularAnisotropyModel !== 'gltf') {\n material.specularAnisotropyModel = 'openpbr';\n material.anisotropyMap = undefined;\n material.specularAnisotropyRotation = 0;\n }\n // Only supported Texture inputs are accepted; arbitrary metadata objects\n // must never enter the atlas as textures. Explicit null clears an import.\n for (const name of ['coatWeightMap', 'coatRoughnessMap', 'fuzzColorMap',\n 'fuzzRoughnessMap', 'specularWeightMap', 'specularColorMap', 'anisotropyMap', 'coatNormalMap'] as const) {\n const texture = openPbr[name];\n if (texture === null) material[name] = undefined;\n else if (texture instanceof Texture) material[name] = texture;\n else if (texture && (texture as THREE.Texture).isTexture &&\n typeof (texture as THREE.Texture).clone === 'function') {\n material[name] = convertTexture(texture as THREE.Texture, textureCache);\n }\n }\n material.specularAnisotropyRotation = finite(openPbr.specularAnisotropyRotation, material.specularAnisotropyRotation, -Infinity, Infinity);\n material.coatAnisotropyRotation = finite(openPbr.coatAnisotropyRotation, material.coatAnisotropyRotation, -Infinity, Infinity);\n const coatScale = openPbr.coatNormalScale as ArrayLike<number> | undefined;\n if (coatScale && coatScale.length >= 2) {\n material.coatNormalScale = [\n finite(coatScale[0], material.coatNormalScale[0], -Infinity, Infinity),\n finite(coatScale[1], material.coatNormalScale[1], -Infinity, Infinity)\n ];\n }\n material.baseWeight = finite(openPbr.baseWeight, material.baseWeight);\n material.baseDiffuseRoughness = finite(\n openPbr.baseDiffuseRoughness,\n material.baseDiffuseRoughness\n );\n material.specularWeight = finite(\n openPbr.specularWeight,\n material.specularWeight\n );\n material.specularColor = color(\n openPbr.specularColor,\n material.specularColor\n );\n material.transmissionScatter = color(\n openPbr.transmissionScatter,\n material.transmissionScatter\n );\n material.transmissionScatterAnisotropy = finite(\n openPbr.transmissionScatterAnisotropy,\n material.transmissionScatterAnisotropy,\n -0.95,\n 0.95\n );\n material.transmissionDispersionScale = finite(\n openPbr.transmissionDispersionScale,\n material.transmissionDispersionScale\n );\n material.transmissionDispersionAbbeNumber = finite(\n openPbr.transmissionDispersionAbbeNumber,\n material.transmissionDispersionAbbeNumber,\n 1,\n 100\n );\n material.subsurfaceWeight = finite(\n openPbr.subsurfaceWeight,\n material.subsurfaceWeight\n );\n material.subsurfaceColor = color(\n openPbr.subsurfaceColor,\n material.subsurfaceColor\n );\n material.subsurfaceRadius = finite(\n openPbr.subsurfaceRadius,\n material.subsurfaceRadius,\n 0,\n Infinity\n );\n material.subsurfaceRadiusScale = color(\n openPbr.subsurfaceRadiusScale,\n material.subsurfaceRadiusScale\n );\n material.subsurfaceScatterAnisotropy = finite(\n openPbr.subsurfaceAnisotropy,\n material.subsurfaceAnisotropy,\n -0.95,\n 0.95\n );\n material.coatWeight = finite(openPbr.coatWeight, material.coatWeight);\n material.coatColor = color(openPbr.coatColor, material.coatColor);\n material.coatRoughness = finite(\n openPbr.coatRoughness,\n material.coatRoughness\n );\n material.coatRoughnessAnisotropy = finite(\n openPbr.coatAnisotropy,\n material.coatAnisotropy\n );\n material.coatIor = finite(openPbr.coatIor, material.coatIor, 1, 2.5);\n material.coatDarkening = finite(\n openPbr.coatDarkening,\n material.coatDarkening\n );\n material.fuzzWeight = finite(openPbr.fuzzWeight, material.fuzzWeight);\n material.fuzzColor = color(openPbr.fuzzColor, material.fuzzColor);\n material.fuzzRoughness = finite(\n openPbr.fuzzRoughness,\n material.fuzzRoughness\n );\n if ('thinWalled' in openPbr) {\n material.geometryThinWalled = openPbr.thinWalled === true;\n }\n material.thinFilmWeight = finite(\n openPbr.thinFilmWeight,\n material.thinFilmWeight\n );\n material.thinFilmThickness = finite(\n openPbr.thinFilmThickness,\n material.thinFilmThickness,\n 0,\n 20\n );\n material.thinFilmThicknessMinimum = finite(\n openPbr.thinFilmThicknessMinimum, material.thinFilmThicknessMinimum, 0, 20\n );\n if (openPbr.thinFilmMapChannel !== undefined) {\n material.thinFilmMapChannel = ['r', 'g', 'b', 'a'][thinFilmMapChannelIndex(openPbr.thinFilmMapChannel)] as OpenPBRMaterial['thinFilmMapChannel'];\n }\n if (openPbr.thinFilmMap instanceof Texture) material.thinFilmMap = openPbr.thinFilmMap;\n else if (openPbr.thinFilmMap && (openPbr.thinFilmMap as THREE.Texture).isTexture) {\n material.thinFilmMap = convertTexture(openPbr.thinFilmMap as THREE.Texture, textureCache);\n }\n material.thinFilmIor = finite(\n openPbr.thinFilmIor,\n material.thinFilmIor,\n 1,\n 2.5\n );\n }\n material.geometryOpacity = standardMaterial.opacity;\n // THREE.DoubleSide is the numeric enum value 2. Keep this module's Three.js\n // import type-only while preserving the source material's culling semantics.\n material.doubleSided = standardMaterial.side === 2;\n if (openPbr) {\n material.specularRoughnessAnisotropy = finite(openPbr.specularAnisotropy, material.specularRoughnessAnisotropy);\n material.geometryOpacity = finite(openPbr.opacity, material.geometryOpacity);\n }\n const bevelSize = Number(standardMaterial.userData.mutracerBevelSize);\n material.bevelSize = Number.isFinite(bevelSize) ? Math.max(0, bevelSize) : 0;\n material.mapAlphaUsage =\n standardMaterial.transparent ||\n !!standardMaterial.alphaMap ||\n standardMaterial.alphaTest > 0\n ? \"alpha\"\n : \"opaque\";\n material.alphaMode = standardMaterial.alphaTest > 0\n ? 'mask'\n : standardMaterial.transparent ||\n material.geometryOpacity < 1 ||\n !!standardMaterial.alphaMap\n ? 'blend'\n : 'opaque';\n\n return material;\n}\n\nfunction copyFloatAttribute(\n attribute: THREE.BufferAttribute | THREE.InterleavedBufferAttribute,\n itemSize = attribute.itemSize\n) {\n const result = new Float32Array(attribute.count * itemSize);\n if (attribute.array instanceof Float32Array && !attribute.normalized) {\n const interleaved = attribute as THREE.InterleavedBufferAttribute;\n if (!interleaved.isInterleavedBufferAttribute && itemSize === attribute.itemSize) {\n result.set(attribute.array.subarray(0, result.length));\n } else {\n const stride = interleaved.isInterleavedBufferAttribute\n ? interleaved.data.stride : attribute.itemSize;\n const offset = interleaved.isInterleavedBufferAttribute ? interleaved.offset : 0;\n for (let index = 0; index < attribute.count; index++) {\n const sourceOffset = index * stride + offset;\n const targetOffset = index * itemSize;\n for (let component = 0; component < itemSize; component++) {\n result[targetOffset + component] = attribute.array[sourceOffset + component];\n }\n }\n }\n return result;\n }\n // Getters preserve normalized integer and Float16BufferAttribute decoding.\n const getters = [\n attribute.getX,\n attribute.getY,\n attribute.getZ,\n attribute.getW\n ];\n for (let index = 0; index < attribute.count; index++) {\n for (let component = 0; component < itemSize; component++) {\n result[index * itemSize + component] = getters[component].call(\n attribute,\n index\n );\n }\n }\n return result;\n}\n\nfunction convertGeometry(\n threeGeometry: THREE.BufferGeometry,\n drawRange?: { start: number; count: number }\n): Geometry | null {\n const positionAttrb = threeGeometry.getAttribute('position');\n const normalAttrb = threeGeometry.getAttribute('normal');\n const tangentAttrb = threeGeometry.getAttribute('tangent');\n const uvAttrb = threeGeometry.getAttribute('uv');\n const uv1Attrb = threeGeometry.getAttribute('uv1');\n const indexAttrb = threeGeometry.getIndex();\n const sourceCount = indexAttrb ? indexAttrb.array.length : positionAttrb.count;\n // Match Array.slice range handling without expanding the complete index stream.\n const clampOffset = (offset: number) => {\n const integer = Math.trunc(offset) || 0;\n return integer < 0 ? Math.max(sourceCount + integer, 0) : Math.min(integer, sourceCount);\n };\n const start = drawRange ? clampOffset(drawRange.start) : 0;\n const end = drawRange ? clampOffset(drawRange.start + drawRange.count) : sourceCount;\n let indexCount = Math.max(end - start, 0);\n // WebGL's TRIANGLES draw mode ignores an incomplete final primitive. Keep\n // path tracing on the same index stream so valid BufferGeometry with a\n // dangling one or two elements cannot produce invalid BLAS input.\n indexCount -= indexCount % 3;\n if (indexCount === 0) return null;\n const indices = new Uint32Array(indexCount);\n if (indexAttrb) {\n indices.set(indexAttrb.array.subarray(start, start + indexCount));\n } else {\n for (let index = 0; index < indexCount; index++) indices[index] = start + index;\n }\n const geometry = new Geometry({\n position: new Attribute(\n copyFloatAttribute(positionAttrb),\n positionAttrb.itemSize\n ),\n normal:\n normalAttrb &&\n new Attribute(copyFloatAttribute(normalAttrb), normalAttrb.itemSize),\n tangent: tangentAttrb && new Attribute(\n copyFloatAttribute(tangentAttrb, Math.min(4, tangentAttrb.itemSize)),\n Math.min(4, tangentAttrb.itemSize)\n ),\n uv: uvAttrb && new Attribute(copyFloatAttribute(uvAttrb), uvAttrb.itemSize),\n uv1:\n uv1Attrb &&\n new Attribute(copyFloatAttribute(uv1Attrb), uv1Attrb.itemSize),\n indices: new Attribute(indices, 1)\n });\n if (!geometry.normal) {\n generateVertexNormals(geometry);\n }\n updateBoundingBox(geometry);\n return geometry;\n}\n\n/** Options for one-shot conversion and persistent Three.js synchronization. */\nexport interface FromTHREESceneOptions {\n /** Custom material conversion. Default undefined uses built-in conversion; returning null skips every mesh using this material. THREESync invokes once per source material identity/version, so the result cannot depend on a particular mesh. Returned materials are caller-owned; engine.update detects parameter edits. */\n convertMaterial?(material: THREE.Material): OpenPBRMaterial | null | undefined;\n /** Custom light conversion. Default undefined uses built-in conversion; returning null skips this light. THREESync invokes once per source light identity and numeric userData.mutracerVersion (default undefined, never rerun). Returned lights are retained by identity and remain caller-owned. */\n convertLight?(light: THREE.Light): SceneLight | null | undefined;\n /** Receives each converted visible mesh/group on every update. Default: no callback. */\n onMeshConverted?(\n mesh: Mesh | InstancedMesh,\n source: THREE.Mesh,\n group: { start: number; count: number; materialIndex?: number },\n groupIndex: number\n ): void;\n}\n\ninterface MaterialVariant {\n material: OpenPBRMaterial;\n parameters: unknown[];\n hash?: string;\n base?: OpenPBRMaterial;\n autoUvProjection: boolean;\n autoDisplacementUvProjection: boolean;\n}\ninterface GeometryEntry { state: unknown[]; groups: Map<string, Geometry>; checkedAt: number }\ninterface ConversionStore {\n updateId: number;\n textures: TextureStore;\n materials: WeakMap<THREE.Material, { material: OpenPBRMaterial; hash: string }>;\n materialHooks: WeakMap<THREE.Material, {version: number; value: OpenPBRMaterial | null | undefined}>;\n lightHooks: WeakMap<THREE.Light, {version: number | undefined; value: SceneLight | null | undefined}>;\n geometries: WeakMap<THREE.BufferGeometry, GeometryEntry>;\n deformedGeometries: WeakMap<THREE.Mesh, GeometryEntry>;\n deformations: WeakMap<THREE.Mesh, THREEDeformation>;\n poseChanged: boolean;\n meshes: WeakMap<THREE.Mesh, Map<number, Mesh>>;\n lights: WeakMap<THREE.Object3D | THREE.Texture, SceneLight>;\n instanceMeshes: WeakMap<THREE.Mesh, Map<number, InstancedMesh>>;\n // Automatic-projection variants, pruned each update.\n projectionVariants: Map<THREE.Material, Map<string, MaterialVariant>>;\n warned: WeakSet<THREE.Object3D>;\n background?: Scene['background'];\n}\nfunction createConversionStore(): ConversionStore {\n return { updateId: 0, textures: new WeakMap(), materials: new WeakMap(), geometries: new WeakMap(),\n materialHooks: new WeakMap(), lightHooks: new WeakMap(),\n poseChanged: false, meshes: new WeakMap(), lights: new WeakMap(), deformedGeometries: new WeakMap(), deformations: new WeakMap(),\n instanceMeshes: new WeakMap(), projectionVariants: new Map(), warned: new WeakSet() };\n}\nconst geometryAttributeNames = ['position', 'normal', 'tangent', 'uv', 'uv1', 'index'] as const;\nfunction geometryState(geometry: THREE.BufferGeometry, deformation: boolean) {\n const state: unknown[] = [];\n for (let i = 0; i < geometryAttributeNames.length; i++) {\n const name = geometryAttributeNames[i];\n const attribute = name === 'index' ? geometry.index : geometry.getAttribute(name);\n if (!attribute) { state.push(undefined); continue; }\n const interleaved = attribute as THREE.InterleavedBufferAttribute;\n const buffer = interleaved.isInterleavedBufferAttribute ? interleaved.data : attribute as THREE.BufferAttribute;\n state.push(attribute, buffer, deformation && i < 3 ? undefined : buffer.version, buffer.array, attribute.count, attribute.itemSize,\n attribute.normalized, interleaved.offset, interleaved.data?.stride);\n }\n return state;\n}\n/** Compare cached fields directly; unchanged geometry creates no snapshot arrays. */\nfunction geometryStateMatches(geometry: THREE.BufferGeometry, state: readonly unknown[], deformation: boolean) {\n let field = 0;\n for (let i = 0; i < geometryAttributeNames.length; i++) {\n const name = geometryAttributeNames[i];\n const attribute = name === 'index' ? geometry.index : geometry.getAttribute(name);\n if (!attribute) {\n if (state[field++] !== undefined) return false;\n continue;\n }\n const interleaved = attribute as THREE.InterleavedBufferAttribute;\n const buffer = interleaved.isInterleavedBufferAttribute ? interleaved.data : attribute as THREE.BufferAttribute;\n if (state[field++] !== attribute || state[field++] !== buffer ||\n !Object.is(state[field++], deformation && i < 3 ? undefined : buffer.version) ||\n state[field++] !== buffer.array || !Object.is(state[field++], attribute.count) ||\n !Object.is(state[field++], attribute.itemSize) || !Object.is(state[field++], attribute.normalized) ||\n !Object.is(state[field++], interleaved.offset) || !Object.is(state[field++], interleaved.data?.stride)) return false;\n }\n return field === state.length;\n}\nfunction retainLight(store: ConversionStore, source: THREE.Object3D | THREE.Texture, value: SceneLight) {\n const cached = store.lights.get(source);\n if (!cached || cached.type !== value.type) {\n store.lights.set(source, value);\n return value;\n }\n // Matrix and color arrays are retained when unchanged; light identity always is.\n for (const key of Object.keys(value)) {\n const previous = (cached as unknown as Record<string, unknown>)[key];\n const next = (value as unknown as Record<string, unknown>)[key];\n if (Array.isArray(previous) && Array.isArray(next) && snapshotsEqual(previous, next)) continue;\n (cached as unknown as Record<string, unknown>)[key] = next;\n }\n return cached;\n}\n\n/**\n * Converts a Three.js scene into a MuTracer {@link Scene}: meshes with\n * `MeshStandardMaterial` / `MeshPhysicalMaterial` (mapped to OpenPBR),\n * directional, ambient, rect-area, point and spot lights, and the scene\n * background / environment. Calls `scene.updateMatrixWorld()` and creates fresh objects on every call.\n * CPU-evaluates skinning/morph targets and batches InstancedMesh instances\n * with shared geometry, native colors and cached projection material variants. Unsupported batched\n * or instanced deformation falls back to an ordinary mesh with a warning.\n * For animation and editing, use {@link THREESync}.\n *\n * Renderer-specific material settings can be supplied through\n * `material.userData`, e.g. `userData.mutracerShadowCatcher = true` or\n * `userData.mutracerOpenPBR = { ... }` for OpenPBR inputs without a Three.js\n * equivalent.\n */\nexport function fromTHREEScene(\n scene: THREE.Scene,\n options: FromTHREESceneOptions = {}\n) : Scene {\n return convertScene(scene, options, createConversionStore());\n}\n\nfunction convertScene(scene: THREE.Scene, options: FromTHREESceneOptions, store: ConversionStore): Scene {\n const updateId = ++store.updateId;\n const meshes: Mesh[] = [];\n const lights: SceneLight[] = [];\n const textureCache = store.textures;\n const convertedMaterials = new Set<THREE.Material>();\n const baseHashes = new Map<OpenPBRMaterial, string>();\n function refreshVariant(entry: MaterialVariant, base: OpenPBRMaterial) {\n let hash = baseHashes.get(base);\n if (hash === undefined) { hash = getMaterialHashKey(base); baseHashes.set(base, hash); }\n if (entry.base === base && entry.hash === hash && materialParametersEqual(base, entry.parameters)) return;\n for (const field of materialKeys) (entry.material as unknown as Record<string, unknown>)[field] = base[field];\n if (entry.autoUvProjection) entry.material.uvProjection = 'triplanar';\n if (entry.autoDisplacementUvProjection) entry.material.displacementUvProjection = 'triplanar';\n entry.parameters = snapshotMaterialParameters(base); entry.hash = hash; entry.base = base;\n }\n function materialVariant(source: THREE.Material, base: OpenPBRMaterial,\n autoUvProjection: boolean, autoDisplacementUvProjection: boolean) {\n if (!autoUvProjection && !autoDisplacementUvProjection) return base;\n let variants = store.projectionVariants.get(source);\n if (!variants) { variants = new Map(); store.projectionVariants.set(source, variants); }\n const key = `${+autoUvProjection}:${+autoDisplacementUvProjection}`;\n let variant = variants.get(key);\n if (!variant) {\n variant = { material: new OpenPBRMaterial(), parameters: [],\n autoUvProjection, autoDisplacementUvProjection };\n variants.set(key, variant);\n }\n refreshVariant(variant, base);\n return variant.material;\n }\n\n function materialHook(source: THREE.Material) {\n if (!options.convertMaterial) return undefined;\n let entry = store.materialHooks.get(source);\n if (!entry || entry.version !== source.version) {\n entry = {version: source.version, value: options.convertMaterial(source)};\n store.materialHooks.set(source, entry);\n }\n return entry.value;\n }\n function lightHook(source: THREE.Light) {\n if (!options.convertLight) return undefined;\n // Three.js Light has no built-in version; applications revise it through userData.\n const revision = source.userData.mutracerVersion;\n const version = typeof revision === 'number' ? revision : undefined;\n let entry = store.lightHooks.get(source);\n if (!entry || entry.version !== version) {\n entry = {version, value: options.convertLight(source)};\n store.lightHooks.set(source, entry);\n }\n return entry.value;\n }\n function resolveMaterial(source: THREE.Material) {\n const custom = materialHook(source);\n if (custom !== undefined) return custom;\n const cached = store.materials.get(source);\n if (convertedMaterials.has(source)) return cached!.material;\n const converted = convertMaterial(source, textureCache);\n const hash = getMaterialHashKey(converted);\n let material = converted;\n if (cached) {\n if (cached.hash !== hash) {\n for (const key of materialKeys) (cached.material as unknown as Record<string, unknown>)[key] = converted[key];\n cached.hash = hash;\n }\n material = cached.material;\n } else store.materials.set(source, {material, hash});\n convertedMaterials.add(source);\n return material;\n }\n\n function isMesh(node: THREE.Object3D): node is THREE.Mesh {\n return (node as THREE.Mesh).isMesh;\n }\n function isDirectionalLight(\n node: THREE.Object3D\n ): node is THREE.DirectionalLight {\n return (node as THREE.DirectionalLight).isDirectionalLight;\n }\n function isAmbientLight(node: THREE.Object3D): node is THREE.AmbientLight {\n return (node as THREE.AmbientLight).isAmbientLight;\n }\n function isRectAreaLight(node: THREE.Object3D): node is THREE.RectAreaLight {\n return (node as THREE.RectAreaLight).isRectAreaLight;\n }\n function isPointLight(node: THREE.Object3D): node is THREE.PointLight {\n return node.type === 'PointLight';\n }\n function isSpotLight(node: THREE.Object3D): node is THREE.SpotLight {\n return node.type === 'SpotLight';\n }\n scene.updateMatrixWorld(true);\n scene.traverseVisible((child) => {\n if ((child as THREE.Light).isLight) {\n const custom = lightHook(child as THREE.Light);\n if (custom !== undefined) {\n if (custom !== null) lights.push(custom);\n return;\n }\n }\n if (isMesh(child)) {\n if (child.userData.viewerEnvironment) return;\n // Viewer-only proxy geometry is already represented by its source mesh.\n if (child.userData.viewerRealtimeDisplacement) return;\n const childMaterials = Array.isArray(child.material)\n ? child.material\n : [child.material];\n // A null result rejects the source mesh, including all of its groups/instances.\n if (childMaterials.some(material => materialHook(material) === null)) return;\n if (!child.geometry) {\n console.warn(child, 'must have a geometry property');\n } else if (\n childMaterials.some(\n (material) =>\n materialHook(material) === undefined &&\n !(material as THREE.MeshStandardMaterial).isMeshStandardMaterial &&\n !(material as THREE.MeshBasicMaterial).isMeshBasicMaterial &&\n material.userData.mutracerShadowCatcher !== true\n )\n ) {\n console.warn(\n child,\n 'must use MeshStandardMaterial or MeshBasicMaterial in order to be rendered.'\n );\n } else {\n const instanced = child as THREE.InstancedMesh;\n const unsupported = (child as THREE.Mesh & { isBatchedMesh?: boolean }).isBatchedMesh ||\n instanced.isInstancedMesh && (!!instanced.morphTexture || (child as THREE.SkinnedMesh).isSkinnedMesh);\n if (unsupported && !store.warned.has(child)) {\n console.warn('MuTracer: BatchedMesh, instanced morph targets and skinned instancing are not supported; converting as an ordinary mesh.', child);\n store.warned.add(child);\n }\n const expand = instanced.isInstancedMesh && !unsupported;\n let deformation: THREEDeformation | undefined;\n let deformed = false;\n if (!unsupported && isDeformingMesh(child)) {\n deformation = store.deformations.get(child);\n if (!deformation?.matches(child.geometry)) {\n deformation = new THREEDeformation(child.geometry); store.deformations.set(child, deformation);\n store.deformedGeometries.delete(child);\n }\n deformed = deformation.update(child);\n store.poseChanged ||= deformed;\n }\n const threeMaterials = childMaterials;\n const groups =\n threeMaterials.length > 1 && child.geometry.groups.length\n ? child.geometry.groups\n : [{ start: 0, count: Infinity, materialIndex: 0 }];\n // Shared static geometry is checked once per update, before its groups.\n // Deforming meshes keep independent entries for their evaluated geometry.\n let entry = deformation ? store.deformedGeometries.get(child) : store.geometries.get(child.geometry);\n if (!entry || entry.checkedAt !== updateId) {\n if (!entry || !geometryStateMatches(child.geometry, entry.state, !!deformation)) {\n entry = { state: geometryState(child.geometry, !!deformation), groups: new Map(), checkedAt: updateId };\n if (deformation) store.deformedGeometries.set(child, entry);\n else store.geometries.set(child.geometry, entry);\n }\n entry.checkedAt = updateId;\n }\n const geometryEntry = entry;\n groups.forEach((group, groupIndex) => {\n const count = Number.isFinite(group.count)\n ? group.count\n : (child.geometry.getIndex()?.count ??\n child.geometry.getAttribute('position').count);\n const geometryKey = `${group.start}:${count}`;\n let geometry = geometryEntry.groups.get(geometryKey);\n const newGeometry = !geometry;\n if (!geometry) {\n const converted = convertGeometry(child.geometry, { start: group.start, count });\n if (!converted) return;\n geometry = converted;\n geometryEntry.groups.set(geometryKey, geometry);\n }\n if (deformation && (deformed || newGeometry)) {\n geometry.dynamic = true;\n geometry.position.array.set(deformation.position);\n if (deformation.normal) geometry.normal.array.set(deformation.normal);\n if (deformation.tangent && geometry.tangent) geometry.tangent.array.set(deformation.tangent);\n if (!child.geometry.getAttribute('tangent')) updateDynamicTangents(geometry);\n updateBoundingBox(geometry);\n if (!newGeometry) markDeformedGeometry(geometry);\n }\n const sourceMaterial = threeMaterials[group.materialIndex ?? 0];\n let material = resolveMaterial(sourceMaterial)!;\n const baseMaterial = material;\n const autoUvProjection = !geometry.uv && baseMaterial.uvProjection === 'none' &&\n !!(baseMaterial.map || baseMaterial.normalMap || baseMaterial.emissiveMap || baseMaterial.metallicRoughnessMap ||\n baseMaterial.roughnessMap || baseMaterial.metalnessMap || baseMaterial.thinFilmMap ||\n baseMaterial.coatWeightMap || baseMaterial.coatRoughnessMap || baseMaterial.fuzzColorMap ||\n baseMaterial.fuzzRoughnessMap || baseMaterial.specularWeightMap || baseMaterial.specularColorMap || baseMaterial.anisotropyMap || baseMaterial.coatNormalMap);\n const autoDisplacementUvProjection = !geometry.uv && !!baseMaterial.displacementMap &&\n baseMaterial.displacementUvProjection === 'none';\n const instanceCount = expand ? instanced.count : 1;\n if (expand) {\n let batchesByGroup = store.instanceMeshes.get(child);\n if (!batchesByGroup) { batchesByGroup = new Map(); store.instanceMeshes.set(child, batchesByGroup); }\n const variant = materialVariant(sourceMaterial, baseMaterial, autoUvProjection, autoDisplacementUvProjection);\n let batch = batchesByGroup.get(groupIndex);\n if (!batch) {\n batch = new InstancedMesh(geometry, variant, {count: instanceCount});\n batch.transform = child.matrixWorld.elements.slice() as mat4.Mat4Array;\n batchesByGroup.set(groupIndex, batch);\n }\n batch.geometry = geometry;\n if (batch.materials[0] !== variant) batch.materials = [variant];\n let changed = batch.count !== instanceCount;\n if (batch.transforms.length < instanceCount * 16) {\n batch.transforms = new Float32Array(instanceCount * 16); changed = true;\n }\n // Grow colors before count validation in either notification method.\n const sourceColors = instanced.instanceColor;\n let colorsChanged = false;\n if (sourceColors) {\n if (!batch.colors || batch.colors.length < instanceCount * 3) batch.colors = new Float32Array(instanceCount * 3);\n for (let i = 0; i < instanceCount; i++) {\n for (let k = 0; k < 3; k++) {\n const value = Math.fround(k === 0 ? sourceColors.getX(i) : k === 1 ? sourceColors.getY(i) : sourceColors.getZ(i));\n if (!Object.is(batch.colors[i * 3 + k], value)) { batch.colors[i * 3 + k] = value; colorsChanged = true; }\n }\n }\n } else batch.colors = undefined;\n batch.count = instanceCount;\n const matrices = instanced.instanceMatrix;\n for (let i = 0; i < instanceCount; i++) for (let k = 0; k < 16; k++) {\n const value = Math.fround(matrices.array[i * matrices.itemSize + k]);\n if (!Object.is(batch.transforms[i * 16 + k], value)) { batch.transforms[i * 16 + k] = value; changed = true; }\n }\n for (let i = 0; i < 16; i++) batch.transform[i] = child.matrixWorld.elements[i];\n if (changed) batch.markTransformsUpdated();\n if (colorsChanged) batch.markColorsUpdated();\n batch.name = child.name || `Mesh ${meshes.length + 1}${groups.length > 1 ? `.${groupIndex + 1}` : ''}`;\n if (instanceCount > 0) { meshes.push(batch); options.onMeshConverted?.(batch, child, group, groupIndex); }\n } else {\n material = materialVariant(sourceMaterial, baseMaterial, autoUvProjection, autoDisplacementUvProjection);\n let meshGroups = store.meshes.get(child);\n if (!meshGroups) { meshGroups = new Map(); store.meshes.set(child, meshGroups); }\n let mesh = meshGroups.get(groupIndex);\n if (!mesh) {\n mesh = new Mesh(geometry, material);\n mesh.transform = child.matrixWorld.elements.slice() as mat4.Mat4Array;\n meshGroups.set(groupIndex, mesh);\n }\n mesh.geometry = geometry;\n if (mesh.materials[0] !== material) mesh.materials = [material];\n mesh.name = child.name || `Mesh ${meshes.length + 1}${groups.length > 1 ? `.${groupIndex + 1}` : ''}`;\n for (let i = 0; i < 16; i++) mesh.transform[i] = child.matrixWorld.elements[i];\n meshes.push(mesh); options.onMeshConverted?.(mesh, child, group, groupIndex);\n }\n });\n }\n } else if (isDirectionalLight(child)) {\n const light = new DirectionalLight({color: child.color.toArray() as ColorRGB, intensity: child.intensity});\n light.transform = Array.from(light.transform);\n light.position = child.getWorldPosition(child.position.clone()).toArray();\n light.lookAt(child.target.getWorldPosition(child.target.position.clone()).toArray());\n lights.push(retainLight(store, child, light));\n } else if (isRectAreaLight(child)) {\n const worldMatrix = child.matrixWorld.clone();\n // Shear decomposition can return a non-unit quaternion. The size below\n // carries scale; this approximated rectangle's sampling frame is rigid.\n const worldRotation = child.getWorldQuaternion(child.quaternion.clone()).normalize();\n const worldPosition = child.getWorldPosition(child.position.clone());\n const elements = worldMatrix.elements;\n const widthScale = Math.hypot(elements[0], elements[1], elements[2]);\n const heightScale = Math.hypot(elements[4], elements[5], elements[6]);\n const light = new RectLight({\n size: [child.width * widthScale, child.height * heightScale],\n color: child.color.toArray() as ColorRGB,\n intensity: child.intensity\n });\n worldMatrix.compose(worldPosition, worldRotation, child.scale.clone().set(1, 1, 1));\n light.transform = worldMatrix.elements.slice() as mat4.Mat4Array;\n lights.push(retainLight(store, child, light));\n } else if (isSpotLight(child)) {\n const worldPosition = child.getWorldPosition(child.position.clone());\n const worldTarget = child.target.getWorldPosition(\n child.target.position.clone()\n );\n const outerAngle = (child.angle * 180) / Math.PI;\n const profile = child.userData.mutracerIesProfile;\n if (profile != null && !(profile instanceof IESProfile)) {\n throw new Error(\n `THREE.SpotLight \"${child.name || '<unnamed>'}\" has an invalid mutracerIesProfile`\n );\n }\n const light = new SpotLight({\n color: child.color.toArray() as ColorRGB,\n intensity: child.intensity,\n radius: child.userData.mutracerRadius ?? 0.01,\n innerAngle: outerAngle * (1 - child.penumbra),\n outerAngle,\n iesProfile: profile\n });\n light.transform = Array.from(light.transform);\n light.position = worldPosition.toArray();\n light.lookAt(worldTarget.toArray());\n const rotation = -(child.userData.mutracerIesRotation ?? 0) * Math.PI / 180;\n if (rotation) mat4.rotateZ(light.transform, light.transform, rotation);\n lights.push(retainLight(store, child, light));\n } else if (isPointLight(child)) {\n const world = child.matrixWorld.elements;\n const position: [number, number, number] = [\n world[12],\n world[13],\n world[14]\n ];\n lights.push(retainLight(store, child,\n Object.assign(new SphereLight({\n color: child.color.toArray() as ColorRGB,\n intensity: child.intensity,\n radius: child.userData.mutracerRadius ?? 0.25\n }), { transform: [1,0,0,0, 0,1,0,0, 0,0,1,0, ...position,1] })\n ));\n } else if (isAmbientLight(child)) {\n lights.push(retainLight(store, child,\n new AmbientLight({color: child.color.toArray() as ColorRGB, intensity: child.intensity})\n ));\n }\n });\n\n const threeEnvironment = scene.environment as THREE.DataTexture | null;\n const environmentMap = convertDataTexture(threeEnvironment, textureCache);\n const environmentLight = threeEnvironment && environmentMap\n ? retainLight(store, threeEnvironment, new EnvironmentLight({map: environmentMap})) as EnvironmentLight\n : undefined;\n if (environmentLight) lights.push(environmentLight);\n\n const grounded = scene.userData.mutracerGroundedSkybox as\n | {\n texture: THREE.DataTexture;\n height: number;\n radius: number;\n groundHeight?: number;\n center?: [number, number];\n }\n | undefined;\n const groundedTexture = grounded && convertDataTexture(grounded.texture, textureCache);\n const hideEnvironmentBackground =\n scene.userData.mutracerHiddenBackground === true;\n let background: GroundedSkyboxBackground | ColorRGBA | Texture | undefined =\n hideEnvironmentBackground\n ? [0, 0, 0, 0]\n : grounded && groundedTexture\n ? {\n type: 'GroundedSkybox',\n map: groundedTexture,\n height: grounded.height,\n radius: grounded.radius,\n groundHeight: grounded.groundHeight,\n center: grounded.center\n }\n : scene.background\n ? (scene.background as THREE.Color).isColor\n ? ([...(scene.background as THREE.Color).toArray(), 1] as ColorRGBA)\n : scene.background === scene.environment && environmentLight\n ? environmentLight.map\n : convertDataTexture(scene.background as THREE.DataTexture, textureCache)\n : undefined;\n\n const oldBackground = store.background;\n if (Array.isArray(background) && Array.isArray(oldBackground) && snapshotsEqual(background, oldBackground)) {\n background = oldBackground;\n } else if (background && oldBackground && !Array.isArray(background) && !Array.isArray(oldBackground)\n && !(background instanceof Texture) && !(oldBackground instanceof Texture)) {\n // Compare by values, ignoring the newly constructed wrapper's identity.\n if (snapshotsEqual(snapshotFields(background).slice(1), snapshotFields(oldBackground).slice(1))) background = oldBackground;\n else { Object.assign(oldBackground, background); background = oldBackground; }\n }\n store.background = background;\n // Inspect the final converted meshes, including onMeshConverted overrides.\n // Iterate across source materials so removed/hidden objects are pruned too.\n const usedMaterials = new Set(meshes.flatMap(mesh => mesh.materials));\n for (const [source, variants] of store.projectionVariants) {\n for (const [key, variant] of variants) if (!usedMaterials.has(variant.material)) variants.delete(key);\n if (!variants.size) store.projectionVariants.delete(source);\n }\n return {\n background,\n meshes,\n lights\n };\n}\n\n/** Structural control interface; no Three.js imports are needed in core APIs. */\nexport interface THREEControls {\n update(deltaTime?: number): boolean | void;\n addEventListener(type: 'start' | 'end', listener: () => void): void;\n removeEventListener(type: 'start' | 'end', listener: () => void): void;\n target?: THREE.Vector3;\n enableDamping?: boolean;\n autoRotate?: boolean;\n enabled?: boolean;\n}\n/** Three.js sources synchronized on each tick. */\nexport interface THREESyncOptions extends FromTHREESceneOptions {\n /** Scene source. Default undefined (engine.scene is untouched). */ scene?: THREE.Scene;\n /** Camera source. Default undefined (engine.camera is untouched). */ camera?: THREE.PerspectiveCamera | THREE.OrthographicCamera;\n /** Camera controls. Default undefined. */ controls?: THREEControls;\n /** Call controls.update during synchronization. Default true. */ updateControls?: boolean;\n}\n/**\n * Keeps one MuTracer scene in sync with a Three.js scene, reusing unchanged objects.\n * Skinning/morph targets run on the CPU with per-source-mesh dynamic geometry.\n * InstancedMesh retains its prefix on count changes and shares geometry/BLAS;\n * Instance colors use native batch storage; automatic UV-less projections\n * share cached material variants per source material. Source edits refresh variants; unused variants\n * are removed after each update.\n */\nexport class THREESync extends Sync {\n /** Retained converted scene; absent when no scene source was supplied. */\n readonly scene: Scene | undefined;\n /** Retained converted camera; absent until the first camera update. */\n private _camera?: Camera;\n private _store = createConversionStore();\n private _disposed = false;\n private _started = false;\n private _cameraState: unknown[] = [];\n private _lastUpdate?: number;\n private _start = () => {this._started = true; this.setActive(true);};\n private _end = () => {this._started = false;};\n /** Subscribes to controls without converting sources or modifying the engine. */\n constructor(engine: Engine, private _options: THREESyncOptions = {}) {\n super(engine);\n if (_options.scene) this.scene = {meshes: [], lights: []};\n _options.controls?.addEventListener('start', this._start);\n _options.controls?.addEventListener('end', this._end);\n }\n /** Updates controls, world matrices, retained instances and camera before engine.update. */\n update(): void {\n if (this._disposed) throw new Error('THREESync has been disposed');\n const now = performance.now(), controls = this._options.controls, sourceCamera = this._options.camera;\n const dt = this._lastUpdate === undefined ? 0 : Math.min(.1, Math.max(0, (now - this._lastUpdate) / 1000));\n this._lastUpdate = now;\n let moving = false, settled = false;\n if (controls && this._options.updateControls !== false) {\n const position = sourceCamera?.position.clone(), zoom = sourceCamera?.zoom;\n moving = !!controls.update(dt);\n if (moving && !this._started && !controls.autoRotate && controls.enableDamping && position && sourceCamera && controls.target) {\n const step = position.distanceTo(sourceCamera.position);\n const zoomStep = Math.abs(Math.log(sourceCamera.zoom / zoom!));\n if (step < 5e-4 * sourceCamera.position.distanceTo(controls.target) && zoomStep < 5e-4) {\n controls.enableDamping = false;\n try {controls.update(0);} finally {controls.enableDamping = true;}\n moving = false; settled = true;\n }\n }\n }\n this._store.poseChanged = false;\n if (this._options.scene && this.scene) {\n const next = convertScene(this._options.scene, this._options, this._store);\n if (!snapshotsEqual(this.scene.meshes, next.meshes)) this.scene.meshes = next.meshes;\n if (!snapshotsEqual(this.scene.lights, next.lights)) this.scene.lights = next.lights;\n this.scene.background = next.background;\n this.engine.scene = this.scene;\n }\n let cameraChanged = false;\n if (sourceCamera) {\n sourceCamera.updateWorldMatrix(true, false);\n const next = fromTHREECamera(sourceCamera);\n const state = snapshotFields(next).slice(1);\n cameraChanged = this._cameraState.length > 0 && !snapshotsEqual(state, this._cameraState);\n this._cameraState = state;\n if (!this._camera) this._camera = next; else this._camera.copy(next);\n this.engine.camera = this._camera;\n }\n this.setActive(this._started || moving || this._store.poseChanged || (cameraChanged && !settled));\n }\n /** Removes control subscriptions and caches. The last converted objects remain usable. */\n dispose(): void {\n if (this._disposed) return;\n this._options.controls?.removeEventListener('start', this._start);\n this._options.controls?.removeEventListener('end', this._end);\n this._store = createConversionStore(); this._disposed = true; super.dispose();\n }\n}\n\n/** Lens settings for {@link fromTHREECamera}. */\nexport interface FromTHREECameraOptions {\n /** Lens f-number; `0` disables depth of field. Default `0`. */\n fStop?: number;\n /**\n * Distance to the plane in focus in scene units. Default: the perspective\n * camera's `focus` (Three.js default `10`), otherwise `10`.\n */\n focusDistance?: number;\n /** Length of one scene unit in metres. Default `1`. */\n metersPerUnit?: number;\n}\n\n/**\n * Converts a Three.js perspective or orthographic camera. A perspective\n * camera's `focus` and film height (`filmGauge` and `aspect`) become\n * `focusDistance` and `sensorHeight`.\n */\nexport function fromTHREECamera(\n threeCamera: THREE.PerspectiveCamera | THREE.OrthographicCamera,\n options: FromTHREECameraOptions = {}\n) {\n const camera = (threeCamera as THREE.PerspectiveCamera).fov\n ? new Camera({projection: 'perspective', fov: (threeCamera as THREE.PerspectiveCamera).fov, aspect: (threeCamera as THREE.PerspectiveCamera).aspect, near: (threeCamera as THREE.PerspectiveCamera).near, far: (threeCamera as THREE.PerspectiveCamera).far})\n : new Camera({projection: 'orthographic', left: (threeCamera as THREE.OrthographicCamera).left, right: (threeCamera as THREE.OrthographicCamera).right, bottom: (threeCamera as THREE.OrthographicCamera).bottom, top: (threeCamera as THREE.OrthographicCamera).top, near: (threeCamera as THREE.OrthographicCamera).near, far: (threeCamera as THREE.OrthographicCamera).far});\n threeCamera.updateWorldMatrix(true, false);\n camera.zoom = threeCamera.zoom;\n camera.transform =\n threeCamera.matrixWorld.elements.slice() as mat4.Mat4Array;\n const perspective = threeCamera as THREE.PerspectiveCamera;\n if (perspective.isPerspectiveCamera) {\n if (perspective.focus > 0) camera.focusDistance = perspective.focus;\n const filmHeight = perspective.getFilmHeight();\n if (filmHeight > 0) camera.sensorHeight = filmHeight;\n }\n if (options.fStop !== undefined) camera.fStop = options.fStop;\n if (options.focusDistance !== undefined) {\n camera.focusDistance = options.focusDistance;\n }\n if (options.metersPerUnit !== undefined) {\n camera.metersPerUnit = options.metersPerUnit;\n }\n return camera;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import Geometry from '../scene/Geometry.js';
2
+ /** Computes smooth, area-weighted vertex normals into `geometry.normal`. */
3
+ export declare function generateVertexNormals(geometry: Geometry): void;
4
+ /**
5
+ * Splits indexed vertices where incident faces exceed the requested dihedral
6
+ * angle, then generates normals for the resulting smoothing groups. This is
7
+ * useful after displacement because a single indexed vertex cannot represent
8
+ * both sides of a hard edge with different normals.
9
+ */
10
+ export declare function generateCreasedVertexNormals(geometry: Geometry, creaseAngleDegrees?: number): void;
11
+ /** Generate a UV-aligned tangent for meshes that do not provide one. */
12
+ export declare function generateVertexTangents(geometry: Geometry): void;
13
+ export declare function updateBoundingBox(geometry: Geometry): void;
@@ -0,0 +1,292 @@
1
+ import { vec3 } from '../math.js';
2
+ import { Attribute } from '../scene/Geometry.js';
3
+ /** Computes smooth, area-weighted vertex normals into `geometry.normal`. */
4
+ export function generateVertexNormals(geometry) {
5
+ if (!geometry.vertexCount) {
6
+ return;
7
+ }
8
+ const indices = geometry.indices?.array;
9
+ const positions = geometry.position.array;
10
+ const normals = new Float32Array(positions.length);
11
+ geometry.normal = new Attribute(normals, 3);
12
+ const p1 = vec3.create();
13
+ const p2 = vec3.create();
14
+ const p3 = vec3.create();
15
+ const v21 = vec3.create();
16
+ const v32 = vec3.create();
17
+ const n = vec3.create();
18
+ const len = indices ? indices.length : geometry.vertexCount;
19
+ let i1, i2, i3;
20
+ for (let f = 0; f < len;) {
21
+ if (indices) {
22
+ i1 = indices[f++];
23
+ i2 = indices[f++];
24
+ i3 = indices[f++];
25
+ }
26
+ else {
27
+ i1 = f++;
28
+ i2 = f++;
29
+ i3 = f++;
30
+ }
31
+ vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
32
+ vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
33
+ vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
34
+ vec3.sub(v21, p1, p2);
35
+ vec3.sub(v32, p2, p3);
36
+ vec3.cross(n, v21, v32);
37
+ // Already be weighted by the triangle area
38
+ for (let i = 0; i < 3; i++) {
39
+ normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
40
+ normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
41
+ normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
42
+ }
43
+ }
44
+ for (let i = 0; i < normals.length;) {
45
+ vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
46
+ vec3.normalize(n, n);
47
+ normals[i++] = n[0];
48
+ normals[i++] = n[1];
49
+ normals[i++] = n[2];
50
+ }
51
+ }
52
+ /**
53
+ * Splits indexed vertices where incident faces exceed the requested dihedral
54
+ * angle, then generates normals for the resulting smoothing groups. This is
55
+ * useful after displacement because a single indexed vertex cannot represent
56
+ * both sides of a hard edge with different normals.
57
+ */
58
+ export function generateCreasedVertexNormals(geometry, creaseAngleDegrees = 180) {
59
+ const indices = geometry.indices?.array;
60
+ const positions = geometry.position?.array;
61
+ if (!indices || !positions || !indices.length || !positions.length) {
62
+ generateVertexNormals(geometry);
63
+ return;
64
+ }
65
+ const creaseAngle = Math.min(Math.max(creaseAngleDegrees, 0), 180);
66
+ if (creaseAngle >= 179.999) {
67
+ generateVertexNormals(geometry);
68
+ return;
69
+ }
70
+ const originalVertexCount = geometry.vertexCount;
71
+ const groups = Array.from({ length: originalVertexCount }, () => []);
72
+ const generatedIndices = new Uint32Array(indices.length);
73
+ const generatedPositions = Array.from(positions);
74
+ const generatedUvs = geometry.uv ? Array.from(geometry.uv.array) : undefined;
75
+ const generatedColors = geometry.color
76
+ ? Array.from(geometry.color.array)
77
+ : undefined;
78
+ const generatedMaterialIndices = geometry.materialIndex
79
+ ? Array.from(geometry.materialIndex.array)
80
+ : undefined;
81
+ let generatedVertexCount = originalVertexCount;
82
+ const cosineThreshold = Math.cos((creaseAngle * Math.PI) / 180);
83
+ const duplicateAttribute = (target, sourceIndex, itemSize) => {
84
+ if (!target)
85
+ return;
86
+ const offset = sourceIndex * itemSize;
87
+ for (let component = 0; component < itemSize; component++) {
88
+ target.push(target[offset + component]);
89
+ }
90
+ };
91
+ for (let offset = 0; offset + 2 < indices.length; offset += 3) {
92
+ const i0 = indices[offset];
93
+ const i1 = indices[offset + 1];
94
+ const i2 = indices[offset + 2];
95
+ const ax = positions[i1 * 3] - positions[i0 * 3];
96
+ const ay = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];
97
+ const az = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];
98
+ const bx = positions[i2 * 3] - positions[i0 * 3];
99
+ const by = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];
100
+ const bz = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];
101
+ const faceX = ay * bz - az * by;
102
+ const faceY = az * bx - ax * bz;
103
+ const faceZ = ax * by - ay * bx;
104
+ const faceLength = Math.hypot(faceX, faceY, faceZ);
105
+ const unitX = faceLength > 1e-12 ? faceX / faceLength : 0;
106
+ const unitY = faceLength > 1e-12 ? faceY / faceLength : 0;
107
+ const unitZ = faceLength > 1e-12 ? faceZ / faceLength : 1;
108
+ [i0, i1, i2].forEach((sourceIndex, corner) => {
109
+ const vertexGroups = groups[sourceIndex];
110
+ let selected;
111
+ let selectedDot = -Infinity;
112
+ for (const group of vertexGroups) {
113
+ const groupLength = Math.hypot(group.sumX, group.sumY, group.sumZ);
114
+ const dot = groupLength > 1e-12
115
+ ? (unitX * group.sumX + unitY * group.sumY + unitZ * group.sumZ) /
116
+ groupLength
117
+ : 1;
118
+ if (dot >= cosineThreshold && dot > selectedDot) {
119
+ selected = group;
120
+ selectedDot = dot;
121
+ }
122
+ }
123
+ if (!selected) {
124
+ const vertexIndex = vertexGroups.length === 0
125
+ ? sourceIndex
126
+ : generatedVertexCount++;
127
+ if (vertexIndex !== sourceIndex) {
128
+ duplicateAttribute(generatedPositions, sourceIndex, 3);
129
+ duplicateAttribute(generatedUvs, sourceIndex, geometry.uv?.itemSize ?? 2);
130
+ duplicateAttribute(generatedColors, sourceIndex, geometry.color?.itemSize ?? 3);
131
+ duplicateAttribute(generatedMaterialIndices, sourceIndex, geometry.materialIndex?.itemSize ?? 1);
132
+ }
133
+ selected = {
134
+ vertexIndex,
135
+ sumX: 0,
136
+ sumY: 0,
137
+ sumZ: 0
138
+ };
139
+ vertexGroups.push(selected);
140
+ }
141
+ selected.sumX += faceX;
142
+ selected.sumY += faceY;
143
+ selected.sumZ += faceZ;
144
+ generatedIndices[offset + corner] = selected.vertexIndex;
145
+ });
146
+ }
147
+ geometry.position = new Attribute(new Float32Array(generatedPositions), 3);
148
+ geometry.indices = new Attribute(generatedIndices, 1);
149
+ geometry.uv = generatedUvs
150
+ ? new Attribute(new Float32Array(generatedUvs), geometry.uv.itemSize)
151
+ : undefined;
152
+ geometry.color = generatedColors
153
+ ? new Attribute(new Float32Array(generatedColors), geometry.color.itemSize)
154
+ : undefined;
155
+ geometry.materialIndex = generatedMaterialIndices
156
+ ? new Attribute(new Int32Array(generatedMaterialIndices), geometry.materialIndex.itemSize)
157
+ : undefined;
158
+ geometry.tangent = undefined;
159
+ generateVertexNormals(geometry);
160
+ }
161
+ const generatedVertexTangents = new WeakSet();
162
+ /** @internal Distinguishes derivative fallback from an authored XYZ tangent. */
163
+ export function hasGeneratedVertexTangents(geometry) {
164
+ return !!geometry.tangent && generatedVertexTangents.has(geometry.tangent);
165
+ }
166
+ /** Generate a UV-aligned tangent for meshes that do not provide one. */
167
+ export function generateVertexTangents(geometry) {
168
+ if (!geometry.position || !geometry.uv || !geometry.normal)
169
+ return;
170
+ const count = geometry.vertexCount;
171
+ if (!count)
172
+ return;
173
+ const tangents = new Float32Array(count * 3);
174
+ computeVertexTangents(geometry, new Float32Array(count * 3), tangents);
175
+ geometry.tangent = new Attribute(tangents, 3);
176
+ generatedVertexTangents.add(geometry.tangent);
177
+ }
178
+ const dynamicTangentScratch = new WeakMap();
179
+ /** @internal Refreshes generated tangents while retaining the attribute and scratch arrays. */
180
+ export function updateDynamicTangents(geometry) {
181
+ if (!geometry.position || !geometry.uv || !geometry.normal)
182
+ return;
183
+ const count = geometry.vertexCount;
184
+ if (!count)
185
+ return;
186
+ let accumulated = dynamicTangentScratch.get(geometry);
187
+ if (accumulated?.length !== count * 3) {
188
+ accumulated = new Float32Array(count * 3);
189
+ dynamicTangentScratch.set(geometry, accumulated);
190
+ }
191
+ if (geometry.tangent?.array.length !== count * 3)
192
+ geometry.tangent = new Attribute(new Float32Array(count * 3), 3);
193
+ computeVertexTangents(geometry, accumulated, geometry.tangent.array);
194
+ generatedVertexTangents.add(geometry.tangent);
195
+ }
196
+ function computeVertexTangents(geometry, accumulated, tangents) {
197
+ const uvs = geometry.uv?.array;
198
+ const normals = geometry.normal?.array;
199
+ const positions = geometry.position?.array;
200
+ if (!uvs || !normals || !positions || !geometry.vertexCount) {
201
+ return;
202
+ }
203
+ const vertexCount = geometry.vertexCount;
204
+ accumulated.fill(0);
205
+ const indices = geometry.indices?.array;
206
+ const count = indices?.length ?? vertexCount;
207
+ for (let offset = 0; offset + 2 < count; offset += 3) {
208
+ const i0 = indices ? indices[offset] : offset;
209
+ const i1 = indices ? indices[offset + 1] : offset + 1;
210
+ const i2 = indices ? indices[offset + 2] : offset + 2;
211
+ const x1 = positions[i1 * 3] - positions[i0 * 3];
212
+ const y1 = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];
213
+ const z1 = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];
214
+ const x2 = positions[i2 * 3] - positions[i0 * 3];
215
+ const y2 = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];
216
+ const z2 = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];
217
+ const s1 = uvs[i1 * 2] - uvs[i0 * 2];
218
+ const t1 = uvs[i1 * 2 + 1] - uvs[i0 * 2 + 1];
219
+ const s2 = uvs[i2 * 2] - uvs[i0 * 2];
220
+ const t2 = uvs[i2 * 2 + 1] - uvs[i0 * 2 + 1];
221
+ const determinant = s1 * t2 - s2 * t1;
222
+ if (Math.abs(determinant) < 1e-12)
223
+ continue;
224
+ const inverse = 1 / determinant;
225
+ const tx = (x1 * t2 - x2 * t1) * inverse;
226
+ const ty = (y1 * t2 - y2 * t1) * inverse;
227
+ const tz = (z1 * t2 - z2 * t1) * inverse;
228
+ for (let corner = 0; corner < 3; corner++) {
229
+ const index = corner === 0 ? i0 : corner === 1 ? i1 : i2;
230
+ accumulated[index * 3] += tx;
231
+ accumulated[index * 3 + 1] += ty;
232
+ accumulated[index * 3 + 2] += tz;
233
+ }
234
+ }
235
+ for (let index = 0; index < vertexCount; index++) {
236
+ const base = index * 3;
237
+ const nx = normals[base];
238
+ const ny = normals[base + 1];
239
+ const nz = normals[base + 2];
240
+ const projection = accumulated[base] * nx
241
+ + accumulated[base + 1] * ny
242
+ + accumulated[base + 2] * nz;
243
+ let tx = accumulated[base] - nx * projection;
244
+ let ty = accumulated[base + 1] - ny * projection;
245
+ let tz = accumulated[base + 2] - nz * projection;
246
+ const length = Math.hypot(tx, ty, tz);
247
+ if (length > 1e-8) {
248
+ tx /= length;
249
+ ty /= length;
250
+ tz /= length;
251
+ }
252
+ else {
253
+ tx = ty = tz = 0;
254
+ }
255
+ tangents[base] = tx;
256
+ tangents[base + 1] = ty;
257
+ tangents[base + 2] = tz;
258
+ }
259
+ }
260
+ export function updateBoundingBox(geometry) {
261
+ const posArr = geometry.position.array;
262
+ const min = geometry.boundingBox.min;
263
+ const max = geometry.boundingBox.max;
264
+ if (posArr && posArr.length) {
265
+ vec3.set(min, posArr[0], posArr[1], posArr[2]);
266
+ vec3.set(max, posArr[0], posArr[1], posArr[2]);
267
+ for (let i = 3; i < posArr.length;) {
268
+ const x = posArr[i++];
269
+ const y = posArr[i++];
270
+ const z = posArr[i++];
271
+ if (x < min[0]) {
272
+ min[0] = x;
273
+ }
274
+ if (y < min[1]) {
275
+ min[1] = y;
276
+ }
277
+ if (z < min[2]) {
278
+ min[2] = z;
279
+ }
280
+ if (x > max[0]) {
281
+ max[0] = x;
282
+ }
283
+ if (y > max[1]) {
284
+ max[1] = y;
285
+ }
286
+ if (z > max[2]) {
287
+ max[2] = z;
288
+ }
289
+ }
290
+ }
291
+ }
292
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/util/geometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\n\n/** Computes smooth, area-weighted vertex normals into `geometry.normal`. */\nexport function generateVertexNormals(geometry: Geometry) {\n if (!geometry.vertexCount) {\n return;\n }\n\n const indices = geometry.indices?.array;\n const positions = geometry.position.array!;\n const normals = new Float32Array(positions.length);\n geometry.normal = new Attribute(normals, 3);\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices ? indices.length : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices[f++];\n i2 = indices[f++];\n i3 = indices[f++];\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/**\n * Splits indexed vertices where incident faces exceed the requested dihedral\n * angle, then generates normals for the resulting smoothing groups. This is\n * useful after displacement because a single indexed vertex cannot represent\n * both sides of a hard edge with different normals.\n */\nexport function generateCreasedVertexNormals(\n geometry: Geometry,\n creaseAngleDegrees = 180\n) {\n const indices = geometry.indices?.array;\n const positions = geometry.position?.array;\n if (!indices || !positions || !indices.length || !positions.length) {\n generateVertexNormals(geometry);\n return;\n }\n const creaseAngle = Math.min(Math.max(creaseAngleDegrees, 0), 180);\n if (creaseAngle >= 179.999) {\n generateVertexNormals(geometry);\n return;\n }\n\n interface NormalGroup {\n vertexIndex: number;\n sumX: number;\n sumY: number;\n sumZ: number;\n }\n const originalVertexCount = geometry.vertexCount;\n const groups = Array.from(\n { length: originalVertexCount },\n () => [] as NormalGroup[]\n );\n const generatedIndices = new Uint32Array(indices.length);\n const generatedPositions = Array.from(positions);\n const generatedUvs = geometry.uv ? Array.from(geometry.uv.array) : undefined;\n const generatedColors = geometry.color\n ? Array.from(geometry.color.array)\n : undefined;\n const generatedMaterialIndices = geometry.materialIndex\n ? Array.from(geometry.materialIndex.array)\n : undefined;\n let generatedVertexCount = originalVertexCount;\n const cosineThreshold = Math.cos((creaseAngle * Math.PI) / 180);\n\n const duplicateAttribute = (\n target: number[] | undefined,\n sourceIndex: number,\n itemSize: number\n ) => {\n if (!target) return;\n const offset = sourceIndex * itemSize;\n for (let component = 0; component < itemSize; component++) {\n target.push(target[offset + component]);\n }\n };\n\n for (let offset = 0; offset + 2 < indices.length; offset += 3) {\n const i0 = indices[offset];\n const i1 = indices[offset + 1];\n const i2 = indices[offset + 2];\n const ax = positions[i1 * 3] - positions[i0 * 3];\n const ay = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];\n const az = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];\n const bx = positions[i2 * 3] - positions[i0 * 3];\n const by = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];\n const bz = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];\n const faceX = ay * bz - az * by;\n const faceY = az * bx - ax * bz;\n const faceZ = ax * by - ay * bx;\n const faceLength = Math.hypot(faceX, faceY, faceZ);\n const unitX = faceLength > 1e-12 ? faceX / faceLength : 0;\n const unitY = faceLength > 1e-12 ? faceY / faceLength : 0;\n const unitZ = faceLength > 1e-12 ? faceZ / faceLength : 1;\n\n [i0, i1, i2].forEach((sourceIndex, corner) => {\n const vertexGroups = groups[sourceIndex];\n let selected: NormalGroup | undefined;\n let selectedDot = -Infinity;\n for (const group of vertexGroups) {\n const groupLength = Math.hypot(group.sumX, group.sumY, group.sumZ);\n const dot = groupLength > 1e-12\n ? (unitX * group.sumX + unitY * group.sumY + unitZ * group.sumZ) /\n groupLength\n : 1;\n if (dot >= cosineThreshold && dot > selectedDot) {\n selected = group;\n selectedDot = dot;\n }\n }\n if (!selected) {\n const vertexIndex = vertexGroups.length === 0\n ? sourceIndex\n : generatedVertexCount++;\n if (vertexIndex !== sourceIndex) {\n duplicateAttribute(generatedPositions, sourceIndex, 3);\n duplicateAttribute(\n generatedUvs,\n sourceIndex,\n geometry.uv?.itemSize ?? 2\n );\n duplicateAttribute(\n generatedColors,\n sourceIndex,\n geometry.color?.itemSize ?? 3\n );\n duplicateAttribute(\n generatedMaterialIndices,\n sourceIndex,\n geometry.materialIndex?.itemSize ?? 1\n );\n }\n selected = {\n vertexIndex,\n sumX: 0,\n sumY: 0,\n sumZ: 0\n };\n vertexGroups.push(selected);\n }\n selected.sumX += faceX;\n selected.sumY += faceY;\n selected.sumZ += faceZ;\n generatedIndices[offset + corner] = selected.vertexIndex;\n });\n }\n\n geometry.position = new Attribute(new Float32Array(generatedPositions), 3);\n geometry.indices = new Attribute(generatedIndices, 1);\n geometry.uv = generatedUvs\n ? new Attribute(new Float32Array(generatedUvs), geometry.uv!.itemSize)\n : undefined;\n geometry.color = generatedColors\n ? new Attribute(new Float32Array(generatedColors), geometry.color!.itemSize)\n : undefined;\n geometry.materialIndex = generatedMaterialIndices\n ? new Attribute(\n new Int32Array(generatedMaterialIndices),\n geometry.materialIndex!.itemSize\n )\n : undefined;\n geometry.tangent = undefined;\n generateVertexNormals(geometry);\n}\n\nconst generatedVertexTangents = new WeakSet<Attribute<Float32Array>>();\n/** @internal Distinguishes derivative fallback from an authored XYZ tangent. */\nexport function hasGeneratedVertexTangents(geometry: Geometry) {\n return !!geometry.tangent && generatedVertexTangents.has(geometry.tangent);\n}\n\n/** Generate a UV-aligned tangent for meshes that do not provide one. */\nexport function generateVertexTangents(geometry: Geometry) {\n if (!geometry.position || !geometry.uv || !geometry.normal) return;\n const count = geometry.vertexCount;\n if (!count) return;\n const tangents = new Float32Array(count * 3);\n computeVertexTangents(geometry, new Float32Array(count * 3), tangents);\n geometry.tangent = new Attribute(tangents, 3);\n generatedVertexTangents.add(geometry.tangent);\n}\n\nconst dynamicTangentScratch = new WeakMap<Geometry, Float32Array>();\n/** @internal Refreshes generated tangents while retaining the attribute and scratch arrays. */\nexport function updateDynamicTangents(geometry: Geometry) {\n if (!geometry.position || !geometry.uv || !geometry.normal) return;\n const count = geometry.vertexCount;\n if (!count) return;\n let accumulated = dynamicTangentScratch.get(geometry);\n if (accumulated?.length !== count * 3) {\n accumulated = new Float32Array(count * 3); dynamicTangentScratch.set(geometry, accumulated);\n }\n if (geometry.tangent?.array.length !== count * 3) geometry.tangent = new Attribute(new Float32Array(count * 3), 3);\n computeVertexTangents(geometry, accumulated, geometry.tangent.array);\n generatedVertexTangents.add(geometry.tangent);\n}\n\nfunction computeVertexTangents(geometry: Geometry, accumulated: Float32Array, tangents: Float32Array) {\n const uvs = geometry.uv?.array;\n const normals = geometry.normal?.array;\n const positions = geometry.position?.array;\n if (!uvs || !normals || !positions || !geometry.vertexCount) {\n return;\n }\n\n const vertexCount = geometry.vertexCount;\n accumulated.fill(0);\n const indices = geometry.indices?.array;\n const count = indices?.length ?? vertexCount;\n\n for (let offset = 0; offset + 2 < count; offset += 3) {\n const i0 = indices ? indices[offset] : offset;\n const i1 = indices ? indices[offset + 1] : offset + 1;\n const i2 = indices ? indices[offset + 2] : offset + 2;\n const x1 = positions[i1 * 3] - positions[i0 * 3];\n const y1 = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];\n const z1 = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];\n const x2 = positions[i2 * 3] - positions[i0 * 3];\n const y2 = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];\n const z2 = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];\n const s1 = uvs[i1 * 2] - uvs[i0 * 2];\n const t1 = uvs[i1 * 2 + 1] - uvs[i0 * 2 + 1];\n const s2 = uvs[i2 * 2] - uvs[i0 * 2];\n const t2 = uvs[i2 * 2 + 1] - uvs[i0 * 2 + 1];\n const determinant = s1 * t2 - s2 * t1;\n if (Math.abs(determinant) < 1e-12) continue;\n const inverse = 1 / determinant;\n const tx = (x1 * t2 - x2 * t1) * inverse;\n const ty = (y1 * t2 - y2 * t1) * inverse;\n const tz = (z1 * t2 - z2 * t1) * inverse;\n for (let corner = 0; corner < 3; corner++) {\n const index = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n accumulated[index * 3] += tx;\n accumulated[index * 3 + 1] += ty;\n accumulated[index * 3 + 2] += tz;\n }\n }\n\n\n for (let index = 0; index < vertexCount; index++) {\n const base = index * 3;\n const nx = normals[base];\n const ny = normals[base + 1];\n const nz = normals[base + 2];\n const projection = accumulated[base] * nx\n + accumulated[base + 1] * ny\n + accumulated[base + 2] * nz;\n let tx = accumulated[base] - nx * projection;\n let ty = accumulated[base + 1] - ny * projection;\n let tz = accumulated[base + 2] - nz * projection;\n const length = Math.hypot(tx, ty, tz);\n if (length > 1e-8) {\n tx /= length;\n ty /= length;\n tz /= length;\n } else {\n tx = ty = tz = 0;\n }\n tangents[base] = tx;\n tangents[base + 1] = ty;\n tangents[base + 2] = tz;\n }\n\n}\n\nexport function updateBoundingBox(geometry: Geometry) {\n const posArr = geometry.position.array;\n const min = geometry.boundingBox.min;\n const max = geometry.boundingBox.max;\n if (posArr && posArr.length) {\n vec3.set(min, posArr[0], posArr[1], posArr[2]);\n vec3.set(max, posArr[0], posArr[1], posArr[2]);\n for (let i = 3; i < posArr.length; ) {\n const x = posArr[i++];\n const y = posArr[i++];\n const z = posArr[i++];\n if (x < min[0]) {\n min[0] = x;\n }\n if (y < min[1]) {\n min[1] = y;\n }\n if (z < min[2]) {\n min[2] = z;\n }\n\n if (x > max[0]) {\n max[0] = x;\n }\n if (y > max[1]) {\n max[1] = y;\n }\n if (z > max[2]) {\n max[2] = z;\n }\n }\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import Texture from '../scene/Texture.js';
2
+ export declare function parseRGBE(arrayBuffer: ArrayBuffer, exposure?: number): Texture | undefined;
3
+ /**
4
+ * Loads a Radiance `.hdr` (RGBE) image as a linear float {@link Texture},
5
+ * e.g. for an {@link EnvironmentLight}. `exposure` scales the values.
6
+ */
7
+ export declare function loadRGBE(url: string, exposure?: number): Promise<Texture | undefined>;