@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,111 +1,24 @@
1
- import { type MaterialTextureIndex } from './materialTextureSlots.js';
2
- import { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';
3
- import { vec2 } from '../math.js';
1
+ import type { MaterialTableOptions, TextureAtlasStats } from './textureAtlas.js';
4
2
  import { Texture2DArray as WebGLTexture2DArray } from './webgl.js';
5
- import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
6
- import { ColorRGB } from '../types.js';
7
- import Texture from '../scene/Texture.js';
8
- import { SceneLight } from '../scene/Scene.js';
9
- export declare const DEFAULT_MAX_TEXTURE_ARRAY_BYTES: number;
10
- export interface MaterialTableOptions {
11
- maxTextureArrayBytes?: number;
12
- maxTextureArrayLayers?: number;
13
- maxTextureDimension2D?: number;
14
- }
15
- export interface TextureAtlasStats {
16
- estimatedBytes: number;
17
- height: number;
18
- layers: number;
19
- packTimeMs: number;
20
- scale: number;
21
- sourcePixels: number;
22
- textureCount: number;
23
- width: number;
24
- }
25
- export declare function materialUsesMedium(material: OpenPBRMaterial): boolean;
26
- export declare const uvProjectionConstants: {
27
- none: number;
28
- spherical: number;
29
- cylindrical: number;
30
- triplanar: number;
31
- };
32
- export interface BufferData extends Record<MaterialTextureIndex, number[]> {
33
- color: ColorRGB[];
34
- roughness: number[];
35
- metallic: number[];
36
- emission: ColorRGB[];
37
- ior: number[];
38
- transmission: number[];
39
- dispersion: number[];
40
- thinFilmThickness: number[];
41
- thinFilmThicknessMinimum: number[];
42
- thinFilmMapChannel: number[];
43
- thinFilmIor: number[];
44
- anisotropy: number[];
45
- thin: number[];
46
- doubleSided: number[];
47
- bevelSize: number[];
48
- mapAlphaUsage: number[];
49
- normalScale: vec2.Vec2Array[];
50
- type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];
51
- mapInfo: number[];
52
- mapTransform: number[];
53
- mapWrap: number[];
54
- mapUvChannel: number[];
55
- mapColorLinear: number[];
56
- mediumType: number[];
57
- specularAnisotropyModel: number[];
58
- specularAnisotropyRotation: number[];
59
- coatAnisotropyRotation: number[];
60
- coatNormalScale: vec2.Vec2Array[];
61
- uvProjection: number[];
62
- uvScale: vec2.Vec2Array[];
63
- displacementUvProjection: number[];
64
- displacementUvProjectionScale: number[];
65
- displacementStepSize: number[];
66
- displacementBias: number[];
67
- alpha: number[];
68
- alphaMode: number[];
69
- alphaCutoff: number[];
70
- baseWeight: number[];
71
- baseDiffuseRoughness: number[];
72
- specularWeight: number[];
73
- specularColor: ColorRGB[];
74
- transmissionColor: ColorRGB[];
75
- transmissionDepth: number[];
76
- transmissionScatter: ColorRGB[];
77
- transmissionScatterAnisotropy: number[];
78
- subsurfaceWeight: number[];
79
- subsurfaceColor: ColorRGB[];
80
- subsurfaceRadius: number[];
81
- subsurfaceRadiusScale: ColorRGB[];
82
- subsurfaceScatterAnisotropy: number[];
83
- fuzzWeight: number[];
84
- fuzzColor: ColorRGB[];
85
- fuzzRoughness: number[];
86
- coatWeight: number[];
87
- coatColor: ColorRGB[];
88
- coatRoughness: number[];
89
- coatAnisotropy: number[];
90
- coatIor: number[];
91
- coatDarkening: number[];
92
- thinFilmWeight: number[];
93
- dispersionAbbeNumber: number[];
94
- mediumExtinction: ColorRGB[];
95
- mediumScattering: ColorRGB[];
96
- mediumAnisotropy: number[];
97
- }
3
+ import type OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
4
+ import type Texture from '../scene/Texture.js';
5
+ import type { SceneLight } from '../scene/Scene.js';
6
+ export { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './textureAtlas.js';
7
+ export type { MaterialTableOptions, TextureAtlasStats } from './textureAtlas.js';
8
+ export { materialUsesMedium } from './materialParams.js';
9
+ export { uvProjectionConstants } from './materialConstants.js';
10
+ export type { BufferData } from './materialBufferData.js';
11
+ import type { BufferData } from './materialBufferData.js';
98
12
  declare class MaterialTable {
99
13
  texture: WebGLTexture2DArray | undefined;
100
14
  textureAtlasStats: TextureAtlasStats;
101
- defines: Record<string, string | number>;
15
+ defines: Record<string, number>;
102
16
  bufferData: BufferData;
103
17
  private _matBufferTex;
104
18
  private _materialBufferColumnsLog;
105
19
  private _displacementMaps;
106
20
  private _lightTexturesIndices;
107
21
  constructor(materials: OpenPBRMaterial[], lights: SceneLight[], options?: MaterialTableOptions);
108
- private _packParams;
109
22
  /** Repack parameters with the same material slots and unchanged texture metadata. */
110
23
  repackParams(materials: OpenPBRMaterial[]): void;
111
24
  getBufferArray(): Float32Array<ArrayBufferLike>;
@@ -1,106 +1,19 @@
1
- import { specularAnisotropyModelIndex, finiteAnisotropySource } from '../scene/anisotropyParameters.js';
2
- import { finiteFilmThickness, thinFilmMapChannelIndex } from '../scene/thinFilmParameters.js';
3
- import { MATERIAL_TEXTURE_NAMES, MATERIAL_TEXTURE_SLOTS } from './materialTextureSlots.js';
1
+ import { isProceduralSkyImage } from '../scene/skyParameters.js';
2
+ import MaterialData from './MaterialData.js';
4
3
  import { packMaterialBuffer } from './materialLayout.js';
4
+ import { repackMaterialParams } from './materialParams.js';
5
+ import { writeAtlasPixel, writeRawAtlasPlacement } from './textureAtlasPixels.js';
5
6
  import { float16Bits } from './float16.js';
6
7
  import { createCanvas } from '../util/canvas.js';
7
- import { mapAlphaUsageConstants } from './materialConstants.js';
8
8
  // Portions adapted from ray-tracing-renderer@0.10.15
9
9
  // (https://github.com/hoverinc/ray-tracing-renderer).
10
10
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
11
- import { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';
12
- import { materialEmission } from './materialEmission.js';
13
11
  import { Texture2DArray as WebGLTexture2DArray, constants, Texture2D } from './webgl.js';
14
- import { materialAlphaModeConstants, resolveMaterialAlphaMode } from '../scene/OpenPBRMaterial.js';
15
- import { mergeTexturesFromMaterials } from './texturesFromMaterials.js';
16
- import { isTextureDataSource, textureWrapIndex } from '../scene/Texture.js';
12
+ import { isTextureDataSource } from '../scene/Texture.js';
17
13
  import { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';
18
- export const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;
19
- export function materialUsesMedium(material) {
20
- return !material.thinWalled && ((material.transmissionWeight > 0 && material.transmissionDepth > 0) ||
21
- material.subsurfaceWeight > 0);
22
- }
23
- export const uvProjectionConstants = {
24
- none: 0,
25
- spherical: 1,
26
- cylindrical: 2,
27
- triplanar: 3
28
- };
29
- /**
30
- * Packs material textures into a small 2D-array atlas.
31
- *
32
- * The input rectangles are sorted from tallest/largest to smallest, then
33
- * placed with a shelf allocator. Each atlas layer contains horizontal shelves;
34
- * a texture is inserted into the first shelf with enough remaining width, or a
35
- * new shelf is opened below the existing ones. A new array layer is allocated
36
- * only when none of the current layers has enough room.
37
- *
38
- * `makeTextureArray` first tries this packing at full resolution. If the result
39
- * exceeds the adapter layer limit or the configured memory budget, it performs
40
- * a binary search for the largest uniform scale that fits. This preserves full
41
- * resolution whenever packing alone is sufficient and degrades predictably on
42
- * constrained hardware.
43
- *
44
- * The returned placements keep the original logical texture indices. Shaders
45
- * use per-texture atlas metadata instead of treating the logical index as the
46
- * physical array layer.
47
- */
48
- function packTextureAtlas(textures, pageSize, scale) {
49
- const pages = [];
50
- const placements = new Array(textures.length);
51
- const items = textures
52
- .map((texture, index) => ({
53
- height: Math.max(1, Math.floor(texture.image.height * scale)),
54
- index,
55
- width: Math.max(1, Math.floor(texture.image.width * scale))
56
- }))
57
- .sort((a, b) => b.height - a.height || b.width - a.width);
58
- for (const item of items) {
59
- let placement;
60
- for (let layer = 0; layer < pages.length && !placement; layer++) {
61
- const page = pages[layer];
62
- for (const shelf of page.shelves) {
63
- if (item.height <= shelf.height &&
64
- shelf.x + item.width <= pageSize) {
65
- placement = {
66
- ...item,
67
- layer,
68
- x: shelf.x,
69
- y: shelf.y
70
- };
71
- shelf.x += item.width;
72
- break;
73
- }
74
- }
75
- if (!placement && page.nextY + item.height <= pageSize) {
76
- placement = {
77
- ...item,
78
- layer,
79
- x: 0,
80
- y: page.nextY
81
- };
82
- page.shelves.push({
83
- height: item.height,
84
- x: item.width,
85
- y: page.nextY
86
- });
87
- page.nextY += item.height;
88
- }
89
- }
90
- if (!placement) {
91
- const layer = pages.length;
92
- placement = { ...item, layer, x: 0, y: 0 };
93
- pages.push({
94
- nextY: item.height,
95
- placements: [],
96
- shelves: [{ height: item.height, x: item.width, y: 0 }]
97
- });
98
- }
99
- pages[placement.layer].placements.push(placement);
100
- placements[item.index] = placement;
101
- }
102
- return { pages, placements };
103
- }
14
+ export { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './textureAtlas.js';
15
+ export { materialUsesMedium } from './materialParams.js';
16
+ export { uvProjectionConstants } from './materialConstants.js';
104
17
  function createAtlasCanvas(width, height) {
105
18
  return createCanvas(width, height);
106
19
  }
@@ -118,34 +31,14 @@ function createDataAtlasPage(width, height, page, textures, floatStorage) {
118
31
  drawAtlasImage(context, placement, textures[placement.index]);
119
32
  const pixels = context.getImageData(0, 0, width, height).data;
120
33
  for (let i = 0; i < pixels.length; i++)
121
- data[i] = floatStorage ? float16Bits(pixels[i] / 255) : pixels[i];
34
+ writeAtlasPixel(data, i, floatStorage ? float16Bits(pixels[i] / 255) : pixels[i]);
122
35
  }
123
36
  for (const placement of page.placements) {
124
37
  const texture = textures[placement.index];
125
38
  const source = texture.image;
126
39
  if (!isTextureDataSource(source))
127
40
  continue;
128
- const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;
129
- if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {
130
- throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');
131
- }
132
- if (source.data.length !== source.width * source.height * 4) {
133
- throw new Error('Material texture RGBA source length does not match its dimensions.');
134
- }
135
- for (let y = 0; y < placement.height; y++) {
136
- let sourceY = Math.min(source.height - 1, Math.floor(((y + 0.5) * source.height) / placement.height));
137
- if (texture.flipY)
138
- sourceY = source.height - 1 - sourceY;
139
- for (let x = 0; x < placement.width; x++) {
140
- const sourceX = Math.min(source.width - 1, Math.floor(((x + 0.5) * source.width) / placement.width));
141
- const sourceOffset = (sourceY * source.width + sourceX) * 4;
142
- const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;
143
- for (let c = 0; c < 4; c++) {
144
- const value = source.data[sourceOffset + c];
145
- data[targetOffset + c] = floatStorage ? float16Bits(bytes ? value / 255 : value) : value;
146
- }
147
- }
148
- }
41
+ writeRawAtlasPlacement(data, width, placement, { image: source, flipY: texture.flipY }, floatStorage);
149
42
  }
150
43
  return { data, width, height };
151
44
  }
@@ -161,15 +54,10 @@ function drawAtlasImage(context, placement, texture) {
161
54
  context.drawImage(texture.image, placement.x, placement.y, placement.width, placement.height);
162
55
  }
163
56
  }
164
- function makeTextureArray(textures, sRGB = false, options = {}) {
57
+ function makeTextureArray(textures, plan, sRGB = false) {
165
58
  const packStart = performance.now();
166
59
  if (!textures.length) {
167
60
  return {
168
- mapInfo: [],
169
- mapTransform: [],
170
- mapUvChannel: [],
171
- mapColorLinear: [],
172
- mapWrap: [],
173
61
  stats: {
174
62
  estimatedBytes: 0,
175
63
  height: 1,
@@ -192,54 +80,9 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
192
80
  })
193
81
  };
194
82
  }
195
- const dataBacked = textures.some((texture) => isTextureDataSource(texture.image));
196
- const mapColorLinear = textures.map(texture => {
197
- const image = texture.image;
198
- return Number(texture.colorSpace ? texture.colorSpace === 'linear' : isTextureDataSource(image) &&
199
- !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
200
- });
201
- // Storage precision depends on the pixels, independently of their transfer function.
202
- const floatStorage = textures.some(({ image }) => isTextureDataSource(image) &&
203
- !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
204
- const bytesPerPixel = floatStorage ? 8 : 4;
205
- const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;
206
- const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;
207
- const maxTextureArrayBytes = options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;
208
- const sourcePixels = textures.reduce((sum, texture) => sum + texture.image.width * texture.image.height, 0);
209
- const maxSourceDimension = textures.reduce((max, texture) => Math.max(max, texture.image.width, texture.image.height), 1);
210
- const maxPageSizeFromBudget = Math.max(1, Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel)));
211
- const pageSize = Math.max(1, Math.floor(Math.min(maxSourceDimension, maxTextureDimension2D, maxPageSizeFromBudget)));
212
- const pageBytes = pageSize * pageSize * bytesPerPixel;
213
- const maxPageCount = Math.max(1, Math.min(maxTextureArrayLayers, Math.floor(maxTextureArrayBytes / pageBytes)));
214
- const maxScale = Math.min(1, pageSize / maxSourceDimension);
215
- let packed = packTextureAtlas(textures, pageSize, maxScale);
216
- let scale = maxScale;
217
- if (packed.pages.length > maxPageCount) {
218
- let low = 0;
219
- let high = maxScale;
220
- let bestPacked;
221
- let bestScale = 0;
222
- for (let i = 0; i < 14; i++) {
223
- const candidateScale = (low + high) / 2;
224
- const candidate = packTextureAtlas(textures, pageSize, candidateScale);
225
- if (candidate.pages.length <= maxPageCount) {
226
- low = candidateScale;
227
- bestScale = candidateScale;
228
- bestPacked = candidate;
229
- }
230
- else {
231
- high = candidateScale;
232
- }
233
- }
234
- if (!bestPacked) {
235
- throw new Error(`Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`);
236
- }
237
- packed = bestPacked;
238
- scale = bestScale;
239
- }
240
- const atlasWidth = Math.max(1, ...packed.placements.map((placement) => placement.x + placement.width));
241
- const atlasHeight = Math.max(1, ...packed.placements.map((placement) => placement.y + placement.height));
242
- const pages = packed.pages.map((page) => {
83
+ const dataBacked = textures.some(texture => isTextureDataSource(texture.image));
84
+ const atlasWidth = plan.width, atlasHeight = plan.height, floatStorage = plan.floatStorage;
85
+ const pages = plan.pages.map((page) => {
243
86
  if (dataBacked) {
244
87
  return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);
245
88
  }
@@ -252,22 +95,8 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
252
95
  drawAtlasImage(context, placement, textures[placement.index]);
253
96
  return canvas;
254
97
  });
255
- if (scale < 0.999) {
256
- console.warn(`Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`);
257
- }
258
- // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].
259
- // Packing layer and X offset into one float keeps the shader metadata to one
260
- // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.
261
- const mapInfo = packed.placements.flatMap((placement) => {
262
- const offsetX = (placement.x + 0.5) / atlasWidth;
263
- const offsetY = (placement.y + 0.5) / atlasHeight;
264
- return [
265
- Math.max(placement.width - 1, 0) / atlasWidth,
266
- Math.max(placement.height - 1, 0) / atlasHeight,
267
- placement.layer + offsetX,
268
- offsetY
269
- ];
270
- });
98
+ if (plan.stats.scale < 0.999)
99
+ console.warn(`Texture atlas downscaled to ${(plan.stats.scale * 100).toFixed(1)}% to fit the GPU budget.`);
271
100
  const texture = new WebGLTexture2DArray({
272
101
  width: atlasWidth,
273
102
  height: atlasHeight,
@@ -281,114 +110,7 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
281
110
  wrapS: constants.CLAMP_TO_EDGE,
282
111
  wrapT: constants.CLAMP_TO_EDGE
283
112
  });
284
- return {
285
- texture,
286
- mapInfo,
287
- mapTransform: textures.flatMap((texture) => [
288
- texture.uvScale[0],
289
- texture.uvScale[1],
290
- texture.uvOffset[0],
291
- texture.uvOffset[1]
292
- ]),
293
- mapUvChannel: textures.map((texture) => texture.uvChannel),
294
- mapWrap: textures.flatMap(texture => [textureWrapIndex(texture.wrapS), textureWrapIndex(texture.wrapT)]),
295
- mapColorLinear,
296
- stats: {
297
- estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,
298
- height: atlasHeight,
299
- layers: pages.length,
300
- packTimeMs: performance.now() - packStart,
301
- scale,
302
- sourcePixels,
303
- textureCount: textures.length,
304
- width: atlasWidth
305
- }
306
- };
307
- }
308
- function clampColor(color, fallback = 0) {
309
- return [0, 1, 2].map((channel) => {
310
- const value = Number(color[channel]);
311
- return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;
312
- });
313
- }
314
- function emptyOpenPbrMedium() {
315
- return {
316
- anisotropy: 0,
317
- extinction: [0, 0, 0],
318
- scattering: [0, 0, 0]
319
- };
320
- }
321
- function transmissionMedium(material) {
322
- const weight = Math.min(1, Math.max(0, material.transmissionWeight));
323
- const depth = Math.max(0, material.transmissionDepth);
324
- if (weight <= 0 || depth <= 0 || material.thinWalled)
325
- return undefined;
326
- const color = clampColor(material.transmissionColor, 1);
327
- const scatterColor = clampColor(material.transmissionScatter);
328
- const extinction = color.map((channel) => Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth));
329
- const scattering = scatterColor.map((channel, index) => extinction[index] * channel);
330
- return {
331
- anisotropy: Math.min(0.999, Math.max(-0.999, material.transmissionScatterAnisotropy)),
332
- extinction,
333
- scattering
334
- };
335
- }
336
- function subsurfaceMedium(material) {
337
- const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));
338
- if (weight <= 0 || material.thinWalled)
339
- return undefined;
340
- // OpenPBR's radius is the extinction mean free path. The van de Hulst
341
- // mapping converts the artist-facing multiple-scattering color to a
342
- // single-scattering albedo while compensating for phase anisotropy.
343
- const radius = Math.max(material.subsurfaceRadius, 1e-3);
344
- const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);
345
- const color = clampColor(material.subsurfaceColor);
346
- const anisotropy = Math.min(0.999, Math.max(-0.999, material.subsurfaceAnisotropy));
347
- const extinction = radiusScale.map((scale) => 1 / Math.max(radius * scale, 1e-3));
348
- const scattering = color.map((channel, index) => {
349
- const s = 4.09712 + 4.20863 * channel - Math.sqrt(9.59217 + 41.6808 * channel + 17.7126 * channel * channel);
350
- const sSquared = s * s;
351
- const albedo = Math.min(1, Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared)));
352
- return extinction[index] * albedo;
353
- });
354
- return { anisotropy, extinction, scattering };
355
- }
356
- function combineOpenPbrMedia(material, transmission, subsurface) {
357
- const transmissionFraction = transmission
358
- ? Math.min(1, Math.max(0, material.transmissionWeight))
359
- : 0;
360
- const subsurfaceFraction = subsurface
361
- ? (1 - transmissionFraction)
362
- * Math.min(1, Math.max(0, material.subsurfaceWeight))
363
- : 0;
364
- const total = transmissionFraction + subsurfaceFraction;
365
- if (total <= 0)
366
- return undefined;
367
- const transmissionWeight = transmissionFraction / total;
368
- const subsurfaceWeight = subsurfaceFraction / total;
369
- const extinction = [0, 1, 2].map((channel) => {
370
- const transmissionAbsorption = transmission
371
- ? transmission.extinction[channel] - transmission.scattering[channel]
372
- : 0;
373
- const subsurfaceAbsorption = subsurface
374
- ? subsurface.extinction[channel] - subsurface.scattering[channel]
375
- : 0;
376
- const absorption = transmissionAbsorption * transmissionWeight
377
- + subsurfaceAbsorption * subsurfaceWeight;
378
- const scattering = (transmission?.scattering[channel] || 0)
379
- * transmissionWeight
380
- + (subsurface?.scattering[channel] || 0) * subsurfaceWeight;
381
- return Math.max(0, absorption + scattering);
382
- });
383
- const scattering = [0, 1, 2].map((channel) => (transmission?.scattering[channel] || 0) * transmissionWeight
384
- + (subsurface?.scattering[channel] || 0) * subsurfaceWeight);
385
- const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight
386
- + (subsurface?.anisotropy || 0) * subsurfaceWeight;
387
- return { anisotropy, extinction, scattering };
388
- }
389
- function openPbrMedium(material) {
390
- const volume = combineOpenPbrMedia(material, transmissionMedium(material), subsurfaceMedium(material));
391
- return volume ?? emptyOpenPbrMedium();
113
+ return { texture, stats: { ...plan.stats, packTimeMs: performance.now() - packStart } };
392
114
  }
393
115
  class MaterialTable {
394
116
  texture;
@@ -400,128 +122,28 @@ class MaterialTable {
400
122
  _displacementMaps = [];
401
123
  _lightTexturesIndices = [];
402
124
  constructor(materials, lights, options = {}) {
403
- const maps = mergeTexturesFromMaterials(materials, MATERIAL_TEXTURE_NAMES);
404
- this._displacementMaps =
405
- maps.indices.displacementMap
406
- .map((idx) => {
407
- return maps.textures[idx];
408
- })
409
- .filter((a) => !!a);
410
- const bufferData = this._packParams(materials);
411
- const allTextures = maps.textures.slice();
412
- const lightTexturesIndices = [];
413
- for (let i = 0; i < lights.length; i++) {
414
- const light = lights[i];
415
- if (light.type === 'RectLight' && light.texture) {
416
- lightTexturesIndices.push(allTextures.length);
417
- allTextures.push(light.texture);
418
- }
419
- else {
420
- lightTexturesIndices.push(-1);
421
- }
422
- }
423
- const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, mapWrap, stats, texture } = makeTextureArray(allTextures, false, options);
125
+ const packStart = performance.now();
126
+ const data = new MaterialData(materials, lights.map(light => light.type === 'RectLight' ? light.texture : undefined), texture => {
127
+ const image = texture.image;
128
+ return Number(texture.colorSpace ? texture.colorSpace === 'linear' : isTextureDataSource(image) && !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
129
+ }, options, texture => {
130
+ const image = texture.image;
131
+ return isTextureDataSource(image) && !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray);
132
+ });
133
+ if (data.textures.some(texture => isProceduralSkyImage(texture.image)))
134
+ throw new Error('ProceduralSky is only supported as an environment or background.');
135
+ const { texture, stats } = makeTextureArray(data.textures, data.atlas);
424
136
  this.texture = texture;
425
- this.textureAtlasStats = stats;
426
- bufferData.mapInfo = mapInfo;
427
- bufferData.mapTransform = mapTransform;
428
- bufferData.mapWrap = mapWrap;
429
- bufferData.mapUvChannel = mapUvChannel;
430
- bufferData.mapColorLinear = mapColorLinear;
431
- for (const slot of MATERIAL_TEXTURE_SLOTS) {
432
- bufferData[slot.index] = maps.indices[slot.property];
433
- }
434
- this.bufferData = bufferData;
435
- this._lightTexturesIndices = lightTexturesIndices;
436
- function countMaps(indices) {
437
- return indices.filter((idx) => idx >= 0).length;
438
- }
439
- this.defines = {
440
- NUM_MAPS: allTextures.length,
441
- ...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define
442
- ? [[slot.define, countMaps(maps.indices[slot.property])]] : []))
443
- };
137
+ this.textureAtlasStats = { ...stats, packTimeMs: performance.now() - packStart };
138
+ this.bufferData = data.bufferData;
139
+ this.defines = data.defines;
140
+ this._displacementMaps = data.displacementMaps;
141
+ this._lightTexturesIndices = data.lightTexturesIndices;
444
142
  this._updateBuffer();
445
143
  }
446
- _packParams(materials) {
447
- const media = materials.map(openPbrMedium);
448
- return {
449
- color: materials.map((m) => m.baseColor.slice(0, 3)),
450
- roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),
451
- emission: materials.map(materialEmission),
452
- metallic: materials.map((m) => m.baseMetalness),
453
- ior: materials.map((m) => m.specularIor),
454
- dispersion: materials.map((m) => m.transmissionDispersionScale),
455
- thin: materials.map((m) => +m.thinWalled),
456
- bevelSize: materials.map((m) => m.bevelSize),
457
- transmission: materials.map((m) => m.transmissionWeight),
458
- anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),
459
- specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),
460
- thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),
461
- thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),
462
- thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),
463
- thinFilmIor: materials.map((m) => m.thinFilmIor),
464
- normalScale: materials.map((m) => m.normalScale),
465
- mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),
466
- type: materials.map((m) => {
467
- if (m.shadowCatcher) {
468
- return ShadowCatcherMaterial;
469
- }
470
- if (m.unlit) {
471
- return UnlitMaterial;
472
- }
473
- // Standard material
474
- return 0;
475
- }),
476
- // Retain mediumType until both legacy readers are migrated; the
477
- // direction and coat-normal inputs are reserved for later C1 steps.
478
- mediumType: materials.map((m) => Number(materialUsesMedium(m))),
479
- specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),
480
- coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),
481
- coatNormalScale: materials.map(m => m.coatNormalScale),
482
- uvProjection: materials.map((m) => uvProjectionConstants[m.uvProjection] || 0),
483
- uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),
484
- displacementUvProjection: materials.map((m) => uvProjectionConstants[m.displacementUvProjection] || 0),
485
- displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),
486
- displacementBias: materials.map((m) => m.displacementBias),
487
- displacementStepSize: materials.map((m) => Number.isFinite(m.displacementStepSize) && m.displacementStepSize > 0 ? m.displacementStepSize : 0),
488
- // Alpha
489
- alpha: materials.map((m) => m.opacity),
490
- alphaMode: materials.map((m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]),
491
- alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),
492
- doubleSided: materials.map((m) => Number(m.doubleSided)),
493
- baseWeight: materials.map((m) => m.baseWeight),
494
- baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),
495
- specularWeight: materials.map((m) => m.specularWeight),
496
- specularColor: materials.map((m) => clampColor(m.specularColor, 1)),
497
- transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),
498
- transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),
499
- transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),
500
- transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),
501
- subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),
502
- subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),
503
- subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),
504
- subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),
505
- subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),
506
- fuzzWeight: materials.map((m) => m.fuzzWeight),
507
- fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),
508
- fuzzRoughness: materials.map((m) => m.fuzzRoughness),
509
- coatWeight: materials.map((m) => m.coatWeight),
510
- coatColor: materials.map((m) => clampColor(m.coatColor, 1)),
511
- coatRoughness: materials.map((m) => m.coatRoughness),
512
- coatAnisotropy: materials.map((m) => m.coatAnisotropy),
513
- coatIor: materials.map((m) => m.coatIor),
514
- coatDarkening: materials.map((m) => m.coatDarkening),
515
- thinFilmWeight: materials.map((m) => m.thinFilmWeight),
516
- dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),
517
- mediumExtinction: media.map((medium) => medium.extinction),
518
- mediumScattering: media.map((medium) => medium.scattering),
519
- mediumAnisotropy: media.map((medium) => medium.anisotropy),
520
- };
521
- }
522
144
  /** Repack parameters with the same material slots and unchanged texture metadata. */
523
145
  repackParams(materials) {
524
- Object.assign(this.bufferData, this._packParams(materials));
146
+ repackMaterialParams(this.bufferData, materials);
525
147
  this._updateBuffer();
526
148
  }
527
149
  getBufferArray() {