@meimu/mutracer 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1,5 +1,6 @@
1
+ import { matrixStorage } from '../math/storage.js';
1
2
  import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';
2
- import { writeMaterialIndices } from './materialIndices.js';
3
+ import { mergeGeometry, computeGeometryNormals } from './scenePreparation.js';
3
4
  // Portions adapted from ray-tracing-renderer@0.10.15
4
5
  // (https://github.com/hoverinc/ray-tracing-renderer).
5
6
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
@@ -7,28 +8,21 @@ import { mat3, vec3 } from '../math.js';
7
8
  import Geometry, { Attribute } from '../scene/Geometry.js';
8
9
  import { getMaterialHashKey, resetMaterialTextureId } from '../scene/OpenPBRMaterial.js';
9
10
  export function mergeMeshesToGeometry(meshes) {
10
- let vertexCount = 0;
11
- let indexCount = 0;
12
11
  const geometryAndMaterialIndex = [];
13
12
  const materialIndexMap = new Map();
14
13
  const materials = [];
15
14
  resetMaterialTextureId();
16
15
  for (const mesh of meshes) {
16
+ const parent = matrixStorage(mesh.transform);
17
17
  for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {
18
18
  let geometry = mesh.geometry;
19
- const index = geometry.indices;
20
- if (!index) {
21
- addFlatGeometryIndices(geometry);
22
- }
23
- geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));
19
+ geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, new Float64Array(16), parent));
24
20
  if (!geometry.normal) {
25
21
  computeGeometryNormals(geometry);
26
22
  }
27
23
  else {
28
24
  vec3.forEach(geometry.normal.array, 3, 0, undefined, vec3.normalize, undefined);
29
25
  }
30
- vertexCount += Attribute.getCount(geometry.position);
31
- indexCount += Attribute.getCount(geometry.indices);
32
26
  const materialIndices = mesh.materials.map((material) => {
33
27
  const key = getMaterialHashKey(material);
34
28
  let materialIndex = materialIndexMap.get(key);
@@ -45,101 +39,13 @@ export function mergeMeshesToGeometry(meshes) {
45
39
  });
46
40
  }
47
41
  }
48
- const geometry = mergeGeometry(geometryAndMaterialIndex, vertexCount, indexCount);
42
+ const geometry = mergeGeometry(geometryAndMaterialIndex.map(({ geometry }) => geometry), geometryAndMaterialIndex.map(({ materialIndex }) => materialIndex), new Map(), true);
49
43
  return {
50
44
  geometry,
51
45
  // TODO compress materials. Reuse materials with same props.
52
46
  materials
53
47
  };
54
48
  }
55
- function mergeGeometry(geometryAndMaterialIndex, totalVertexCount, totalIndexCount) {
56
- const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
57
- const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
58
- const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
59
- const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
60
- const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
61
- const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
62
- const mergedGeometry = new Geometry({
63
- position: positionAttrib,
64
- normal: normalAttrib,
65
- uv: uvAttrib,
66
- uv1: uv1Attrib,
67
- materialIndex: materialIndexAttrib,
68
- // color: colorAttrib,
69
- indices: indexAttrib
70
- });
71
- let currentVertex = 0;
72
- let currentIndex = 0;
73
- let currentMesh = 1;
74
- for (const { geometry } of geometryAndMaterialIndex) {
75
- if (geometry.color) {
76
- mergedGeometry.color = new Attribute(new Float32Array(3 * totalVertexCount), 3);
77
- break;
78
- }
79
- if (geometry.tangent) {
80
- mergedGeometry.tangent = new Attribute(new Float32Array(3 * totalVertexCount), 3);
81
- break;
82
- }
83
- }
84
- for (const { geometry, materialIndex: globalMaterialIndex } of geometryAndMaterialIndex) {
85
- const vertexCount = Attribute.getCount(geometry.position);
86
- ['position', 'normal', 'uv'].forEach((attr) => {
87
- if (!geometry[attr]) {
88
- if (attr == 'normal' || attr === 'position') {
89
- console.error('Geometry must have at least position and normal attributes.');
90
- }
91
- return;
92
- }
93
- mergedGeometry[attr].array.set(geometry[attr].array, currentVertex * geometry[attr].itemSize);
94
- });
95
- uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
96
- if (mergedGeometry.color) {
97
- const itemSize = 3;
98
- if (geometry.color) {
99
- mergedGeometry.color.array.set(geometry.color.array, currentVertex * itemSize);
100
- }
101
- else {
102
- // Set to white
103
- for (let i = 0; i < vertexCount * itemSize; i++) {
104
- mergedGeometry.color.array[currentVertex * itemSize + i] = 1;
105
- }
106
- }
107
- }
108
- if (mergedGeometry.tangent) {
109
- const itemSize = 3;
110
- if (geometry.tangent) {
111
- mergedGeometry.tangent.array.set(geometry.tangent.array, currentVertex * itemSize);
112
- }
113
- else {
114
- for (let i = 0; i < vertexCount * itemSize; i++) {
115
- mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;
116
- }
117
- }
118
- }
119
- const meshIndices = geometry.indices.array;
120
- for (let i = 0; i < meshIndices.length; i++) {
121
- indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];
122
- }
123
- writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);
124
- currentVertex += vertexCount;
125
- currentIndex += meshIndices.length;
126
- currentMesh++;
127
- }
128
- return mergedGeometry;
129
- }
130
- function addFlatGeometryIndices(geometry) {
131
- const position = geometry.position;
132
- if (!position) {
133
- console.warn('No position attribute');
134
- return;
135
- }
136
- const index = new Uint32Array(Attribute.getCount(position));
137
- for (let i = 0; i < index.length; i++) {
138
- index[i] = i;
139
- }
140
- geometry.indices = new Attribute(index, 1);
141
- return geometry;
142
- }
143
49
  function transformGeometry(geometry, matrix) {
144
50
  const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {
145
51
  position: geometry.position.array,
@@ -149,7 +55,7 @@ function transformGeometry(geometry, matrix) {
149
55
  color: geometry.color && geometry.color.array,
150
56
  tangent: geometry.tangent && geometry.tangent.array,
151
57
  materialIndex: geometry.materialIndex && geometry.materialIndex.array,
152
- indices: geometry.indices.array
58
+ indices: geometry.indexArray
153
59
  };
154
60
  const newGeometry = new Geometry({
155
61
  position: new Attribute(
@@ -186,51 +92,4 @@ function transformGeometry(geometry, matrix) {
186
92
  }
187
93
  return newGeometry;
188
94
  }
189
- function computeGeometryNormals(geometry) {
190
- const indices = geometry.indices;
191
- const positions = geometry.position.array;
192
- geometry.normal = new Attribute(new Float32Array(positions.length), 3);
193
- const normals = geometry.normal.array;
194
- const p1 = vec3.create();
195
- const p2 = vec3.create();
196
- const p3 = vec3.create();
197
- const v21 = vec3.create();
198
- const v32 = vec3.create();
199
- const n = vec3.create();
200
- const len = indices
201
- ? indices.array.length
202
- : geometry.vertexCount;
203
- let i1, i2, i3;
204
- for (let f = 0; f < len;) {
205
- if (indices) {
206
- i1 = indices.array[f++];
207
- i2 = indices.array[f++];
208
- i3 = indices.array[f++];
209
- }
210
- else {
211
- i1 = f++;
212
- i2 = f++;
213
- i3 = f++;
214
- }
215
- vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
216
- vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
217
- vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
218
- vec3.sub(v21, p1, p2);
219
- vec3.sub(v32, p2, p3);
220
- vec3.cross(n, v21, v32);
221
- // Already be weighted by the triangle area
222
- for (let i = 0; i < 3; i++) {
223
- normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
224
- normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
225
- normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
226
- }
227
- }
228
- for (let i = 0; i < normals.length;) {
229
- vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
230
- vec3.normalize(n, n);
231
- normals[i++] = n[0];
232
- normals[i++] = n[1];
233
- normals[i++] = n[2];
234
- }
235
- }
236
95
  //# sourceMappingURL=mergeMeshesToGeometry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mergeMeshesToGeometry.js","sourceRoot":"","sources":["../../src/renderer/mergeMeshesToGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { writeMaterialIndices } from './materialIndices.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { mat3, mat4, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, {\n getMaterialHashKey,\n resetMaterialTextureId\n} from '../scene/OpenPBRMaterial.js';\n\nexport interface InternalMergedMesh {\n geometry: Geometry;\n materials: OpenPBRMaterial[];\n}\n\nexport function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh {\n let vertexCount = 0;\n let indexCount = 0;\n\n const geometryAndMaterialIndex = [];\n const materialIndexMap = new Map<string, number>();\n const materials: OpenPBRMaterial[] = [];\n\n resetMaterialTextureId();\n\n for (const mesh of meshes) {\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n let geometry = mesh.geometry;\n\n const index = geometry.indices;\n if (!index) {\n addFlatGeometryIndices(geometry);\n }\n\n geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));\n\n if (!geometry.normal) {\n computeGeometryNormals(geometry);\n } else {\n vec3.forEach(\n geometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.normalize,\n undefined\n );\n }\n\n vertexCount += Attribute.getCount(geometry.position);\n indexCount += Attribute.getCount(geometry.indices);\n\n const materialIndices = mesh.materials.map((material) => {\n const key = getMaterialHashKey(material);\n let materialIndex = materialIndexMap.get(key);\n if (materialIndex === undefined) {\n materialIndex = materialIndexMap.size;\n materialIndexMap.set(key, materialIndex);\n materials.push(material);\n }\n return materialIndex;\n });\n\n geometryAndMaterialIndex.push({\n geometry,\n materialIndex: materialIndices\n });\n }\n }\n\n const geometry = mergeGeometry(\n geometryAndMaterialIndex,\n vertexCount,\n indexCount\n );\n\n return {\n geometry,\n // TODO compress materials. Reuse materials with same props.\n materials\n };\n}\n\nfunction mergeGeometry(\n geometryAndMaterialIndex: {\n geometry: Geometry;\n materialIndex: number[];\n }[],\n totalVertexCount: number,\n totalIndexCount: number\n) {\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n // color: colorAttrib,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n let currentMesh = 1;\n\n for (const { geometry } of geometryAndMaterialIndex) {\n if (geometry.color) {\n mergedGeometry.color = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n if (geometry.tangent) {\n mergedGeometry.tangent = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n }\n\n for (const {\n geometry,\n materialIndex: globalMaterialIndex\n } of geometryAndMaterialIndex) {\n const vertexCount = Attribute.getCount(geometry.position);\n\n (['position', 'normal', 'uv'] as const).forEach((attr) => {\n if (!geometry[attr]) {\n if (attr == 'normal' || attr === 'position') {\n console.error(\n 'Geometry must have at least position and normal attributes.'\n );\n }\n return;\n }\n mergedGeometry[attr]!.array.set(\n geometry[attr]!.array,\n currentVertex * geometry[attr]!.itemSize\n );\n });\n\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n\n if (mergedGeometry.color) {\n const itemSize = 3;\n if (geometry.color) {\n mergedGeometry.color.array.set(\n geometry.color.array,\n currentVertex * itemSize\n );\n } else {\n // Set to white\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.color.array[currentVertex * itemSize + i] = 1;\n }\n }\n }\n if (mergedGeometry.tangent) {\n const itemSize = 3;\n if (geometry.tangent) {\n mergedGeometry.tangent.array.set(\n geometry.tangent.array,\n currentVertex * itemSize\n );\n } else {\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;\n }\n }\n }\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);\n\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n currentMesh++;\n }\n\n return mergedGeometry;\n}\n\nfunction addFlatGeometryIndices(geometry: Geometry) {\n const position = geometry.position;\n\n if (!position) {\n console.warn('No position attribute');\n return;\n }\n\n const index = new Uint32Array(Attribute.getCount(position));\n\n for (let i = 0; i < index.length; i++) {\n index[i] = i;\n }\n\n geometry.indices = new Attribute(index, 1);\n\n return geometry;\n}\n\nfunction transformGeometry(geometry: Geometry, matrix: mat4.Mat4Array) {\n const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {\n position: geometry.position.array,\n normal: geometry.normal.array,\n uv: geometry.uv && geometry.uv.array,\n uv1: geometry.uv1 && geometry.uv1.array,\n color: geometry.color && geometry.color.array,\n tangent: geometry.tangent && geometry.tangent.array,\n materialIndex: geometry.materialIndex && geometry.materialIndex.array,\n indices: geometry.indices.array\n };\n const newGeometry = new Geometry({\n position: new Attribute(\n // TODO only copy when necessary\n new Float32Array(position),\n geometry.position.itemSize\n ),\n normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),\n // No need to clone uv\n uv: uv && new Attribute(uv, geometry.uv!.itemSize),\n uv1: uv1 && new Attribute(uv1, geometry.uv1!.itemSize),\n color: color && new Attribute(color, geometry.color!.itemSize),\n tangent:\n tangent &&\n new Attribute(new Float32Array(tangent), geometry.tangent!.itemSize),\n materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex!.itemSize),\n indices: indices && new Attribute(indices, geometry.indices.itemSize)\n });\n\n // Normal Matrix\n let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);\n if (normalMatrix == null) {\n // If matrix has NaN value. normalMatrix may be null.\n // Create an identity one.\n // TODO remove scale information\n normalMatrix = mat3.create();\n }\n\n vec3.forEach(\n newGeometry.position.array,\n 3,\n 0,\n undefined,\n vec3.transformMat4,\n matrix\n );\n\n if (newGeometry.normal) {\n vec3.forEach(\n newGeometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);\n }\n if (newGeometry.tangent) {\n vec3.forEach(\n newGeometry.tangent.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n // Try not to normalize the tangent.\n // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.\n // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);\n }\n return newGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\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\n ? indices.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[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"]}
1
+ {"version":3,"file":"mergeMeshesToGeometry.js","sourceRoot":"","sources":["../../src/renderer/mergeMeshesToGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { mergeGeometry, computeGeometryNormals } from './scenePreparation.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { mat3, mat4, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, {\n getMaterialHashKey,\n resetMaterialTextureId\n} from '../scene/OpenPBRMaterial.js';\n\nexport interface InternalMergedMesh {\n geometry: Geometry;\n materials: OpenPBRMaterial[];\n}\n\nexport function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh {\n const geometryAndMaterialIndex = [];\n const materialIndexMap = new Map<string, number>();\n const materials: OpenPBRMaterial[] = [];\n\n resetMaterialTextureId();\n\n for (const mesh of meshes) {\n const parent = matrixStorage(mesh.transform);\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n let geometry = mesh.geometry;\n\n geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, new Float64Array(16), parent));\n\n if (!geometry.normal) {\n computeGeometryNormals(geometry);\n } else {\n vec3.forEach(\n geometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.normalize,\n undefined\n );\n }\n\n const materialIndices = mesh.materials.map((material) => {\n const key = getMaterialHashKey(material);\n let materialIndex = materialIndexMap.get(key);\n if (materialIndex === undefined) {\n materialIndex = materialIndexMap.size;\n materialIndexMap.set(key, materialIndex);\n materials.push(material);\n }\n return materialIndex;\n });\n\n geometryAndMaterialIndex.push({\n geometry,\n materialIndex: materialIndices\n });\n }\n }\n\n const geometry = mergeGeometry(\n geometryAndMaterialIndex.map(({geometry}) => geometry),\n geometryAndMaterialIndex.map(({materialIndex}) => materialIndex),\n new Map(),\n true\n );\n\n return {\n geometry,\n // TODO compress materials. Reuse materials with same props.\n materials\n };\n}\n\nfunction transformGeometry(geometry: Geometry, matrix: mat4.Mat4Array) {\n const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {\n position: geometry.position.array,\n normal: geometry.normal.array,\n uv: geometry.uv && geometry.uv.array,\n uv1: geometry.uv1 && geometry.uv1.array,\n color: geometry.color && geometry.color.array,\n tangent: geometry.tangent && geometry.tangent.array,\n materialIndex: geometry.materialIndex && geometry.materialIndex.array,\n indices: geometry.indexArray\n };\n const newGeometry = new Geometry({\n position: new Attribute(\n // TODO only copy when necessary\n new Float32Array(position),\n geometry.position.itemSize\n ),\n normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),\n // No need to clone uv\n uv: uv && new Attribute(uv, geometry.uv!.itemSize),\n uv1: uv1 && new Attribute(uv1, geometry.uv1!.itemSize),\n color: color && new Attribute(color, geometry.color!.itemSize),\n tangent:\n tangent &&\n new Attribute(new Float32Array(tangent), geometry.tangent!.itemSize),\n materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex!.itemSize),\n indices: indices && new Attribute(indices, geometry.indices.itemSize)\n });\n\n // Normal Matrix\n let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);\n if (normalMatrix == null) {\n // If matrix has NaN value. normalMatrix may be null.\n // Create an identity one.\n // TODO remove scale information\n normalMatrix = mat3.create();\n }\n\n vec3.forEach(\n newGeometry.position.array,\n 3,\n 0,\n undefined,\n vec3.transformMat4,\n matrix\n );\n\n if (newGeometry.normal) {\n vec3.forEach(\n newGeometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);\n }\n if (newGeometry.tangent) {\n vec3.forEach(\n newGeometry.tangent.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n // Try not to normalize the tangent.\n // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.\n // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);\n }\n return newGeometry;\n}\n"]}
@@ -1,23 +1,6 @@
1
- import Mesh from '../scene/Mesh.js';
1
+ import type MeshState from '../scene/MeshState.js';
2
2
  import { mat4 } from '../math.js';
3
- import type { TLASInstance } from './bvhAccel.js';
4
- export declare function meshInstanceCount(mesh: Mesh): number;
3
+ export declare function meshInstanceCount(mesh: MeshState): number;
5
4
  /** Writes a world matrix without allocating per-instance Mesh objects or views. */
6
- export declare function meshInstanceTransform(mesh: Mesh, index: number, out: mat4.Mat4Array): mat4.Mat4Array;
7
- /** CPU instance records in numeric storage; one reusable synchronous read view. */
8
- export declare class PackedMeshInstances {
9
- length: number;
10
- readonly transforms: Float64Array;
11
- readonly colors: Float32Array;
12
- readonly bounds: Float32Array;
13
- readonly blasIndices: Uint32Array;
14
- readonly materials: Int32Array;
15
- readonly displacement: Float64Array;
16
- readonly sourceIndices: Uint32Array;
17
- private readonly view;
18
- constructor(capacity: number);
19
- read(index: number): TLASInstance;
20
- }
21
- export type MeshInstances = TLASInstance[] | PackedMeshInstances;
22
- export declare function readMeshInstance(instances: MeshInstances, index: number): TLASInstance;
23
- export declare function sameInstanceMembership(a: MeshInstances, b: MeshInstances): boolean;
5
+ export declare function meshInstanceTransform<T extends mat4.Mat4Array>(mesh: MeshState, index: number, out: T, parent?: Float64Array<ArrayBufferLike>): T;
6
+ export { PackedMeshInstances, readMeshInstance, sameInstanceMembership, type MeshInstances } from './packedMeshInstances.js';
@@ -1,66 +1,20 @@
1
- import InstancedMesh from '../scene/InstancedMesh.js';
1
+ import { matrixStorage } from '../math/storage.js';
2
+ import { read, write } from '../math/access.js';
2
3
  import { mat4 } from '../math.js';
3
- export function meshInstanceCount(mesh) { return mesh instanceof InstancedMesh ? mesh.count : 1; }
4
+ export function meshInstanceCount(mesh) { return mesh.instanceData?.count ?? 1; }
4
5
  /** Writes a world matrix without allocating per-instance Mesh objects or views. */
5
- export function meshInstanceTransform(mesh, index, out) {
6
- if (!(mesh instanceof InstancedMesh))
7
- return mat4.copy(out, mesh.transform);
8
- const local = mesh.transforms, offset = index * 16, parent = mesh.transform;
6
+ export function meshInstanceTransform(mesh, index, out, parent = matrixStorage(mesh.transform)) {
7
+ const instances = mesh.instanceData;
8
+ if (!instances)
9
+ return mat4.copy(out, parent);
10
+ const local = instances.transforms, offset = index * 16;
9
11
  for (let column = 0; column < 4; column++) {
10
12
  const o = offset + column * 4;
11
13
  const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];
12
14
  for (let row = 0; row < 4; row++)
13
- out[column * 4 + row] = parent[row] * x + parent[row + 4] * y + parent[row + 8] * z + parent[row + 12] * w;
15
+ write(out, column * 4 + row, read(parent, row) * x + read(parent, row + 4) * y + read(parent, row + 8) * z + read(parent, row + 12) * w);
14
16
  }
15
17
  return out;
16
18
  }
17
- /** CPU instance records in numeric storage; one reusable synchronous read view. */
18
- export class PackedMeshInstances {
19
- length = 0;
20
- transforms;
21
- colors;
22
- bounds;
23
- blasIndices;
24
- materials;
25
- displacement;
26
- sourceIndices;
27
- view = { blasIndex: 0, bounds: { min: [0, 0, 0], max: [0, 0, 0] }, transform: Array(16).fill(0), materialsIndices: [0], color: [1, 1, 1] };
28
- constructor(capacity) {
29
- this.colors = new Float32Array(capacity * 3);
30
- this.transforms = new Float64Array(capacity * 16);
31
- this.bounds = new Float32Array(capacity * 6);
32
- this.blasIndices = new Uint32Array(capacity);
33
- this.materials = new Int32Array(capacity);
34
- this.displacement = new Float64Array(capacity);
35
- this.sourceIndices = new Uint32Array(capacity);
36
- }
37
- read(index) {
38
- const v = this.view;
39
- v.blasIndex = this.blasIndices[index];
40
- v.materialsIndices[0] = this.materials[index];
41
- v.displacementScale = this.displacement[index];
42
- for (let i = 0; i < 16; i++)
43
- v.transform[i] = this.transforms[index * 16 + i];
44
- for (let i = 0; i < 3; i++)
45
- v.color[i] = this.colors[index * 3 + i];
46
- for (let i = 0; i < 3; i++) {
47
- v.bounds.min[i] = this.bounds[index * 6 + i];
48
- v.bounds.max[i] = this.bounds[index * 6 + i + 3];
49
- }
50
- return v;
51
- }
52
- }
53
- export function readMeshInstance(instances, index) {
54
- return instances instanceof PackedMeshInstances ? instances.read(index) : instances[index];
55
- }
56
- export function sameInstanceMembership(a, b) {
57
- if (a.length !== b.length)
58
- return false;
59
- if (a instanceof PackedMeshInstances && b instanceof PackedMeshInstances) {
60
- for (let i = 0; i < a.length; i++)
61
- if (a.sourceIndices[i] !== b.sourceIndices[i])
62
- return false;
63
- }
64
- return true;
65
- }
19
+ export { PackedMeshInstances, readMeshInstance, sameInstanceMembership } from './packedMeshInstances.js';
66
20
  //# sourceMappingURL=meshInstances.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meshInstances.js","sourceRoot":"","sources":["../../src/renderer/meshInstances.ts"],"names":[],"mappings":"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","sourcesContent":["import Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { mat4 } from '../math.js';\nimport type { TLASInstance } from './bvhAccel.js';\n\nexport function meshInstanceCount(mesh: Mesh) { return mesh instanceof InstancedMesh ? mesh.count : 1; }\n/** Writes a world matrix without allocating per-instance Mesh objects or views. */\nexport function meshInstanceTransform(mesh: Mesh, index: number, out: mat4.Mat4Array): mat4.Mat4Array {\n if (!(mesh instanceof InstancedMesh)) return mat4.copy(out, mesh.transform);\n const local = mesh.transforms, offset = index * 16, parent = mesh.transform;\n for (let column = 0; column < 4; column++) {\n const o = offset + column * 4;\n const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];\n for (let row = 0; row < 4; row++) out[column * 4 + row] = parent[row] * x + parent[row + 4] * y + parent[row + 8] * z + parent[row + 12] * w;\n }\n return out;\n}\n\n/** CPU instance records in numeric storage; one reusable synchronous read view. */\nexport class PackedMeshInstances {\n length = 0;\n readonly transforms: Float64Array;\n readonly colors: Float32Array;\n readonly bounds: Float32Array;\n readonly blasIndices: Uint32Array;\n readonly materials: Int32Array;\n readonly displacement: Float64Array;\n readonly sourceIndices: Uint32Array;\n private readonly view: TLASInstance = {blasIndex: 0, bounds: {min: [0,0,0], max: [0,0,0]}, transform: Array(16).fill(0), materialsIndices: [0], color: [1,1,1]};\n constructor(capacity: number) {\n this.colors = new Float32Array(capacity * 3);\n this.transforms = new Float64Array(capacity * 16); this.bounds = new Float32Array(capacity * 6);\n this.blasIndices = new Uint32Array(capacity); this.materials = new Int32Array(capacity); this.displacement = new Float64Array(capacity); this.sourceIndices = new Uint32Array(capacity);\n }\n read(index: number): TLASInstance {\n const v = this.view;\n v.blasIndex = this.blasIndices[index]; v.materialsIndices[0] = this.materials[index]; v.displacementScale = this.displacement[index];\n for (let i = 0; i < 16; i++) v.transform[i] = this.transforms[index * 16 + i];\n for (let i = 0; i < 3; i++) v.color![i] = this.colors[index * 3 + i];\n for (let i = 0; i < 3; i++) {v.bounds.min[i] = this.bounds[index * 6 + i]; v.bounds.max[i] = this.bounds[index * 6 + i + 3];}\n return v;\n }\n}\nexport type MeshInstances = TLASInstance[] | PackedMeshInstances;\nexport function readMeshInstance(instances: MeshInstances, index: number) {\n return instances instanceof PackedMeshInstances ? instances.read(index) : instances[index];\n}\n\nexport function sameInstanceMembership(a: MeshInstances, b: MeshInstances) {\n if (a.length !== b.length) return false;\n if (a instanceof PackedMeshInstances && b instanceof PackedMeshInstances) {\n for (let i = 0; i < a.length; i++) if (a.sourceIndices[i] !== b.sourceIndices[i]) return false;\n }\n return true;\n}\n"]}
1
+ {"version":3,"file":"meshInstances.js","sourceRoot":"","sources":["../../src/renderer/meshInstances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,UAAU,iBAAiB,CAAC,IAAe,IAAI,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5F,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAA2B,IAAe,EAAE,KAAa,EAAE,GAAM,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IAC5I,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,EAAE,CAAC;IACxD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE;YAAE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7K,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAsB,MAAM,0BAA0B,CAAC","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type MeshState from '../scene/MeshState.js';\nimport { read, write } from '../math/access.js';\nimport { mat4 } from '../math.js';\n\nexport function meshInstanceCount(mesh: MeshState) { return mesh.instanceData?.count ?? 1; }\n/** Writes a world matrix without allocating per-instance Mesh objects or views. */\nexport function meshInstanceTransform<T extends mat4.Mat4Array>(mesh: MeshState, index: number, out: T, parent = matrixStorage(mesh.transform)): T {\n const instances = mesh.instanceData;\n if (!instances) return mat4.copy(out, parent);\n const local = instances.transforms, offset = index * 16;\n for (let column = 0; column < 4; column++) {\n const o = offset + column * 4;\n const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];\n for (let row = 0; row < 4; row++) write(out, column * 4 + row, read(parent, row) * x + read(parent, row + 4) * y + read(parent, row + 8) * z + read(parent, row + 12) * w);\n }\n return out;\n}\n\nexport { PackedMeshInstances, readMeshInstance, sameInstanceMembership, type MeshInstances } from './packedMeshInstances.js';\n"]}
@@ -1,5 +1,5 @@
1
1
  /// <reference types="@webgpu/types" preserve="true" />
2
- import { type UNet } from 'oidn-web';
2
+ import { type UNet } from 'oidn-webgpu';
3
3
  import type Engine from '../Engine.js';
4
4
  import type { OIDNDenoiserOptions } from '../Render.js';
5
5
  export interface OIDNAuxiliaryDenoisers {
@@ -11,7 +11,7 @@ export interface OIDNAuxiliaryDenoisers {
11
11
  export type OIDNDenoiser = UNet & {
12
12
  /** Optional RT auxiliary filters used before a clean-aux beauty model. */
13
13
  auxiliaryDenoisers?: OIDNAuxiliaryDenoisers;
14
- /** Optional shape preparation supported by newer oidn-web runtimes. */
14
+ /** Optional shape preparation supported by newer oidn-webgpu runtimes. */
15
15
  prepareForImage?: (width: number, height: number, options?: {
16
16
  tileOverlap?: number;
17
17
  }) => Promise<void>;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="@webgpu/types" preserve="true" />
2
- import { initUNetFromBuffer } from 'oidn-web';
2
+ import { initUNetFromBuffer } from 'oidn-webgpu';
3
3
  import { resolveOIDNModelUrl, resolveOIDNAuxiliaryModelUrls, DEFAULT_OIDN_WEIGHTS_BASE_URL, OIDN_WEIGHTS_PACKAGE } from '../oidn.js';
4
4
  async function fetchOIDNWeights(url, signal) {
5
5
  const response = await fetch(String(url), { signal });
@@ -1 +1 @@
1
- {"version":3,"file":"oidnNetwork.js","sourceRoot":"","sources":["../../src/renderer/oidnNetwork.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\nimport { initUNetFromBuffer, type UNet } from 'oidn-web';\nimport type Engine from '../Engine.js';\nimport type { OIDNDenoiserOptions } from '../Render.js';\nimport {\n resolveOIDNModelUrl, resolveOIDNAuxiliaryModelUrls, DEFAULT_OIDN_WEIGHTS_BASE_URL,\n OIDN_WEIGHTS_PACKAGE\n} from '../oidn.js';\nimport type {\n OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer,\n OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls\n} from '../oidn.js';\n\nexport interface OIDNAuxiliaryDenoisers {\n /** Loaded albedo prefilter; supplied by the clean-aux loader. */\n albedo: OIDNDenoiser;\n /** Loaded normal prefilter; supplied by the clean-aux loader. */\n normal: OIDNDenoiser;\n}\nexport type OIDNDenoiser = UNet & {\n /** Optional RT auxiliary filters used before a clean-aux beauty model. */\n auxiliaryDenoisers?: OIDNAuxiliaryDenoisers;\n /** Optional shape preparation supported by newer oidn-web runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n};\n\ninterface OIDNLoadOptions {\n /** Maximum OIDN tile size. By default oidn-web chooses the tile size. */\n maxTileSize?: number;\n /** Optional signal used while downloading the weights. */\n signal?: AbortSignal;\n /** OIDN execution engine. `webnn` enables the experimental WebNN FP16 path. */\n engine?: OIDNEngine;\n /** Native WGSL precision. `auto` uses FP16 when shader-f16 is available. */\n precision?: OIDNPrecision;\n /** Adaptive tile controller settings, or false for fixed tiles. */\n dynamicTile?: OIDNDynamicTileSetting;\n}\n\ninterface InitializeOIDNOptions extends OIDNLoadOptions {\n /** Packaged model to load. Defaults to the standard model. */\n model?: OIDNModel;\n /** Override directory for all weights. Defaults to bundled standard/small assets and the oidn-weights CDN for large networks. */\n weightsBaseUrl?: string | URL;\n /** Override the packaged albedo/normal prefilter weights for a clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\ninterface CustomOIDNModelOptions extends OIDNLoadOptions {\n /** Whether the custom model consumes albedo and normal guides. Defaults to true. */\n aux?: boolean;\n /** Whether the custom model consumes HDR color. Defaults to true. */\n hdr?: boolean;\n /** HDR encoding expected by the weights. OIDN's RT models use PU. */\n hdrTransfer?: OIDNHDRTransfer;\n /** Optional albedo/normal filters to run before the custom clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\nasync function fetchOIDNWeights(url: string | URL, signal?: AbortSignal) {\n const response = await fetch(String(url), { signal });\n if (!response.ok) {\n throw new Error(\n `Failed to load OIDN weights from ${url}: ${response.status} ${response.statusText}`\n );\n }\n const buffer = await response.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n if (bytes[0] !== 0xD7 || bytes[1] !== 0x41) {\n throw new Error(`Invalid OIDN TZA weights from ${url}: expected magic D7 41 (received non-TZA content).`);\n }\n return buffer;\n}\n\n/**\n * Loads an HDR OIDN model with albedo/normal guides on the engine's WebGPU\n * device and returns it without attaching it to a render.\n */\nasync function loadOIDN(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {},\n fetchWeights = fetchOIDNWeights\n): Promise<OIDNDenoiser> {\n await engine.init();\n const device = engine.device;\n if (engine.backend !== 'webgpu' || !device) {\n throw new Error('OIDN requires a WebGPU engine.');\n }\n\n const auxiliaryUrls = options.auxiliaryModelUrls;\n const weightBuffers = await Promise.all([\n engine._getWeights(String(weightsUrl), () => fetchWeights(weightsUrl, options.signal)),\n ...(auxiliaryUrls\n ? [\n engine._getWeights(String(auxiliaryUrls.albedo), () => fetchWeights(auxiliaryUrls.albedo, options.signal)),\n engine._getWeights(String(auxiliaryUrls.normal), () => fetchWeights(auxiliaryUrls.normal, options.signal))\n ]\n : [])\n ]);\n const backend = { device };\n const runtimeOptions = {\n hdrTransfer: options.hdrTransfer ?? 'pu',\n maxTileSize: options.maxTileSize,\n engine: options.engine,\n precision: options.precision,\n dynamicTile: options.dynamicTile\n };\n let denoiser: OIDNDenoiser | undefined;\n let albedoDenoiser: OIDNDenoiser | undefined;\n try {\n denoiser = await initUNetFromBuffer(weightBuffers[0], backend, {\n aux: options.aux ?? true,\n hdr: options.hdr ?? true,\n ...runtimeOptions\n });\n if (auxiliaryUrls) {\n // Auxiliary RT networks are color-only three-channel UNets. The render\n // pipeline supplies their feature-specific transfer functions.\n albedoDenoiser = await initUNetFromBuffer(weightBuffers[1], backend, {\n aux: false,\n hdr: false,\n ...runtimeOptions\n });\n const normalDenoiser = await initUNetFromBuffer(\n weightBuffers[2],\n backend,\n {\n aux: false,\n hdr: false,\n ...runtimeOptions\n }\n );\n denoiser.auxiliaryDenoisers = {\n albedo: albedoDenoiser,\n normal: normalDenoiser\n };\n }\n } catch (error) {\n albedoDenoiser?.dispose();\n denoiser?.dispose();\n throw error;\n }\n return denoiser;\n}\n\n/** Loads an explicit HDR network URL; download failures never fall back to a CDN. */\nfunction initializeOIDNFromURL(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {}\n): Promise<OIDNDenoiser> {\n return loadOIDN(engine, weightsUrl, options);\n}\n\nlet warnedBundledWeights = false;\n\n/** Loads one of the packaged OIDN models. */\nfunction initializeOIDN(\n engine: Engine,\n options: InitializeOIDNOptions = {}\n) {\n const {\n model = 'standard',\n weightsBaseUrl,\n auxiliaryModelUrls,\n ...loadOptions\n } = options;\n const mainUrl = resolveOIDNModelUrl(model, weightsBaseUrl);\n const defaultBundled = weightsBaseUrl === undefined && model !== 'cleanAuxLarge';\n const defaultLarge = new Set<string>(weightsBaseUrl === undefined && model === 'cleanAuxLarge'\n ? [mainUrl, ...(!auxiliaryModelUrls ? Object.values(resolveOIDNAuxiliaryModelUrls()).map(String) : [])]\n : []);\n const fetchWeights = async (url: string | URL, signal?: AbortSignal) => {\n try {\n return await fetchOIDNWeights(url, signal);\n } catch (error) {\n if (signal?.aborted) throw error;\n if (defaultBundled && String(url) === mainUrl) {\n if (!warnedBundledWeights) {\n warnedBundledWeights = true;\n console.warn('Bundled OIDN weights failed to load; falling back to jsDelivr. In Vite development add optimizeDeps: { exclude: [\"@meimu/mutracer\"] }, or pass weightsBaseUrl to self-host the weights.', error);\n }\n return fetchOIDNWeights(resolveOIDNModelUrl(model, DEFAULT_OIDN_WEIGHTS_BASE_URL), signal);\n }\n if (defaultLarge.has(String(url))) {\n throw new Error(`Failed to load ${OIDN_WEIGHTS_PACKAGE} network from ${url}. Self-host node_modules/oidn-weights/*.tza and pass weightsBaseUrl. ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }\n };\n return loadOIDN(\n engine,\n mainUrl,\n {\n ...loadOptions,\n auxiliaryModelUrls:\n auxiliaryModelUrls ?? (model === 'cleanAuxLarge'\n ? resolveOIDNAuxiliaryModelUrls(weightsBaseUrl) : undefined)\n },\n fetchWeights\n );\n}\n\n/** Internal lazy loader; both public OIDN option branches use this path. */\nexport function loadOIDNNetwork(engine: Engine, options: Readonly<OIDNDenoiserOptions>): Promise<OIDNDenoiser> {\n if (options.weightsUrl !== undefined) return initializeOIDNFromURL(engine, options.weightsUrl, options);\n return initializeOIDN(engine, options);\n}\n"]}
1
+ {"version":3,"file":"oidnNetwork.js","sourceRoot":"","sources":["../../src/renderer/oidnNetwork.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\nimport { initUNetFromBuffer, type UNet } from 'oidn-webgpu';\nimport type Engine from '../Engine.js';\nimport type { OIDNDenoiserOptions } from '../Render.js';\nimport {\n resolveOIDNModelUrl, resolveOIDNAuxiliaryModelUrls, DEFAULT_OIDN_WEIGHTS_BASE_URL,\n OIDN_WEIGHTS_PACKAGE\n} from '../oidn.js';\nimport type {\n OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer,\n OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls\n} from '../oidn.js';\n\nexport interface OIDNAuxiliaryDenoisers {\n /** Loaded albedo prefilter; supplied by the clean-aux loader. */\n albedo: OIDNDenoiser;\n /** Loaded normal prefilter; supplied by the clean-aux loader. */\n normal: OIDNDenoiser;\n}\nexport type OIDNDenoiser = UNet & {\n /** Optional RT auxiliary filters used before a clean-aux beauty model. */\n auxiliaryDenoisers?: OIDNAuxiliaryDenoisers;\n /** Optional shape preparation supported by newer oidn-webgpu runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n};\n\ninterface OIDNLoadOptions {\n /** Maximum OIDN tile size. By default oidn-webgpu chooses the tile size. */\n maxTileSize?: number;\n /** Optional signal used while downloading the weights. */\n signal?: AbortSignal;\n /** OIDN execution engine. `webnn` enables the experimental WebNN FP16 path. */\n engine?: OIDNEngine;\n /** Native WGSL precision. `auto` uses FP16 when shader-f16 is available. */\n precision?: OIDNPrecision;\n /** Adaptive tile controller settings, or false for fixed tiles. */\n dynamicTile?: OIDNDynamicTileSetting;\n}\n\ninterface InitializeOIDNOptions extends OIDNLoadOptions {\n /** Packaged model to load. Defaults to the standard model. */\n model?: OIDNModel;\n /** Override directory for all weights. Defaults to bundled standard/small assets and the oidn-weights CDN for large networks. */\n weightsBaseUrl?: string | URL;\n /** Override the packaged albedo/normal prefilter weights for a clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\ninterface CustomOIDNModelOptions extends OIDNLoadOptions {\n /** Whether the custom model consumes albedo and normal guides. Defaults to true. */\n aux?: boolean;\n /** Whether the custom model consumes HDR color. Defaults to true. */\n hdr?: boolean;\n /** HDR encoding expected by the weights. OIDN's RT models use PU. */\n hdrTransfer?: OIDNHDRTransfer;\n /** Optional albedo/normal filters to run before the custom clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\nasync function fetchOIDNWeights(url: string | URL, signal?: AbortSignal) {\n const response = await fetch(String(url), { signal });\n if (!response.ok) {\n throw new Error(\n `Failed to load OIDN weights from ${url}: ${response.status} ${response.statusText}`\n );\n }\n const buffer = await response.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n if (bytes[0] !== 0xD7 || bytes[1] !== 0x41) {\n throw new Error(`Invalid OIDN TZA weights from ${url}: expected magic D7 41 (received non-TZA content).`);\n }\n return buffer;\n}\n\n/**\n * Loads an HDR OIDN model with albedo/normal guides on the engine's WebGPU\n * device and returns it without attaching it to a render.\n */\nasync function loadOIDN(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {},\n fetchWeights = fetchOIDNWeights\n): Promise<OIDNDenoiser> {\n await engine.init();\n const device = engine.device;\n if (engine.backend !== 'webgpu' || !device) {\n throw new Error('OIDN requires a WebGPU engine.');\n }\n\n const auxiliaryUrls = options.auxiliaryModelUrls;\n const weightBuffers = await Promise.all([\n engine._getWeights(String(weightsUrl), () => fetchWeights(weightsUrl, options.signal)),\n ...(auxiliaryUrls\n ? [\n engine._getWeights(String(auxiliaryUrls.albedo), () => fetchWeights(auxiliaryUrls.albedo, options.signal)),\n engine._getWeights(String(auxiliaryUrls.normal), () => fetchWeights(auxiliaryUrls.normal, options.signal))\n ]\n : [])\n ]);\n const backend = { device };\n const runtimeOptions = {\n hdrTransfer: options.hdrTransfer ?? 'pu',\n maxTileSize: options.maxTileSize,\n engine: options.engine,\n precision: options.precision,\n dynamicTile: options.dynamicTile\n };\n let denoiser: OIDNDenoiser | undefined;\n let albedoDenoiser: OIDNDenoiser | undefined;\n try {\n denoiser = await initUNetFromBuffer(weightBuffers[0], backend, {\n aux: options.aux ?? true,\n hdr: options.hdr ?? true,\n ...runtimeOptions\n });\n if (auxiliaryUrls) {\n // Auxiliary RT networks are color-only three-channel UNets. The render\n // pipeline supplies their feature-specific transfer functions.\n albedoDenoiser = await initUNetFromBuffer(weightBuffers[1], backend, {\n aux: false,\n hdr: false,\n ...runtimeOptions\n });\n const normalDenoiser = await initUNetFromBuffer(\n weightBuffers[2],\n backend,\n {\n aux: false,\n hdr: false,\n ...runtimeOptions\n }\n );\n denoiser.auxiliaryDenoisers = {\n albedo: albedoDenoiser,\n normal: normalDenoiser\n };\n }\n } catch (error) {\n albedoDenoiser?.dispose();\n denoiser?.dispose();\n throw error;\n }\n return denoiser;\n}\n\n/** Loads an explicit HDR network URL; download failures never fall back to a CDN. */\nfunction initializeOIDNFromURL(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {}\n): Promise<OIDNDenoiser> {\n return loadOIDN(engine, weightsUrl, options);\n}\n\nlet warnedBundledWeights = false;\n\n/** Loads one of the packaged OIDN models. */\nfunction initializeOIDN(\n engine: Engine,\n options: InitializeOIDNOptions = {}\n) {\n const {\n model = 'standard',\n weightsBaseUrl,\n auxiliaryModelUrls,\n ...loadOptions\n } = options;\n const mainUrl = resolveOIDNModelUrl(model, weightsBaseUrl);\n const defaultBundled = weightsBaseUrl === undefined && model !== 'cleanAuxLarge';\n const defaultLarge = new Set<string>(weightsBaseUrl === undefined && model === 'cleanAuxLarge'\n ? [mainUrl, ...(!auxiliaryModelUrls ? Object.values(resolveOIDNAuxiliaryModelUrls()).map(String) : [])]\n : []);\n const fetchWeights = async (url: string | URL, signal?: AbortSignal) => {\n try {\n return await fetchOIDNWeights(url, signal);\n } catch (error) {\n if (signal?.aborted) throw error;\n if (defaultBundled && String(url) === mainUrl) {\n if (!warnedBundledWeights) {\n warnedBundledWeights = true;\n console.warn('Bundled OIDN weights failed to load; falling back to jsDelivr. In Vite development add optimizeDeps: { exclude: [\"@meimu/mutracer\"] }, or pass weightsBaseUrl to self-host the weights.', error);\n }\n return fetchOIDNWeights(resolveOIDNModelUrl(model, DEFAULT_OIDN_WEIGHTS_BASE_URL), signal);\n }\n if (defaultLarge.has(String(url))) {\n throw new Error(`Failed to load ${OIDN_WEIGHTS_PACKAGE} network from ${url}. Self-host node_modules/oidn-weights/*.tza and pass weightsBaseUrl. ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }\n };\n return loadOIDN(\n engine,\n mainUrl,\n {\n ...loadOptions,\n auxiliaryModelUrls:\n auxiliaryModelUrls ?? (model === 'cleanAuxLarge'\n ? resolveOIDNAuxiliaryModelUrls(weightsBaseUrl) : undefined)\n },\n fetchWeights\n );\n}\n\n/** Internal lazy loader; both public OIDN option branches use this path. */\nexport function loadOIDNNetwork(engine: Engine, options: Readonly<OIDNDenoiserOptions>): Promise<OIDNDenoiser> {\n if (options.weightsUrl !== undefined) return initializeOIDNFromURL(engine, options.weightsUrl, options);\n return initializeOIDN(engine, options);\n}\n"]}