@meimu/mutracer 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +195 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14352 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +144 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +273 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +121 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +256 -0
  35. package/lib/Render.js +671 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +76 -0
  38. package/lib/RenderLoop.js +204 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1446 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +121 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +619 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +100 -0
  511. package/lib/util/fromTHREE.js +1063 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,550 @@
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';
4
+ import { packMaterialBuffer } from './materialLayout.js';
5
+ import { float16Bits } from './float16.js';
6
+ import { createCanvas } from '../util/canvas.js';
7
+ import { mapAlphaUsageConstants } from './materialConstants.js';
8
+ // Portions adapted from ray-tracing-renderer@0.10.15
9
+ // (https://github.com/hoverinc/ray-tracing-renderer).
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
+ 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 } from '../scene/Texture.js';
17
+ 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
+ }
104
+ function createAtlasCanvas(width, height) {
105
+ return createCanvas(width, height);
106
+ }
107
+ function createDataAtlasPage(width, height, page, textures, floatStorage) {
108
+ const data = floatStorage ? new Uint16Array(width * height * 4) : new Uint8Array(width * height * 4);
109
+ // Retain the same Canvas composition for DOM layers, including straight-alpha
110
+ // readback. Raw sources never pass through Canvas or its color conversion.
111
+ const domPlacements = page.placements.filter(p => !isTextureDataSource(textures[p.index].image));
112
+ if (domPlacements.length) {
113
+ const canvas = createAtlasCanvas(width, height);
114
+ const context = canvas.getContext('2d');
115
+ if (!context)
116
+ throw new Error('Unable to create a canvas for the texture atlas.');
117
+ for (const placement of domPlacements)
118
+ drawAtlasImage(context, placement, textures[placement.index]);
119
+ const pixels = context.getImageData(0, 0, width, height).data;
120
+ for (let i = 0; i < pixels.length; i++)
121
+ data[i] = floatStorage ? float16Bits(pixels[i] / 255) : pixels[i];
122
+ }
123
+ for (const placement of page.placements) {
124
+ const texture = textures[placement.index];
125
+ const source = texture.image;
126
+ if (!isTextureDataSource(source))
127
+ 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
+ }
149
+ }
150
+ return { data, width, height };
151
+ }
152
+ function drawAtlasImage(context, placement, texture) {
153
+ if (texture.flipY) {
154
+ context.save();
155
+ context.translate(placement.x, placement.y + placement.height);
156
+ context.scale(1, -1);
157
+ context.drawImage(texture.image, 0, 0, placement.width, placement.height);
158
+ context.restore();
159
+ }
160
+ else {
161
+ context.drawImage(texture.image, placement.x, placement.y, placement.width, placement.height);
162
+ }
163
+ }
164
+ function makeTextureArray(textures, sRGB = false, options = {}) {
165
+ const packStart = performance.now();
166
+ if (!textures.length) {
167
+ return {
168
+ mapInfo: [],
169
+ mapTransform: [],
170
+ mapUvChannel: [],
171
+ mapColorLinear: [],
172
+ stats: {
173
+ estimatedBytes: 0,
174
+ height: 1,
175
+ layers: 0,
176
+ packTimeMs: performance.now() - packStart,
177
+ scale: 1,
178
+ sourcePixels: 0,
179
+ textureCount: 0,
180
+ width: 1
181
+ },
182
+ texture: new WebGLTexture2DArray({
183
+ width: 1,
184
+ height: 1,
185
+ sRGB,
186
+ source: [],
187
+ minFilter: constants.LINEAR,
188
+ magFilter: constants.LINEAR,
189
+ wrapS: constants.CLAMP_TO_EDGE,
190
+ wrapT: constants.CLAMP_TO_EDGE
191
+ })
192
+ };
193
+ }
194
+ const dataBacked = textures.some((texture) => isTextureDataSource(texture.image));
195
+ const mapColorLinear = textures.map(texture => {
196
+ const image = texture.image;
197
+ return Number(isTextureDataSource(image) &&
198
+ !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
199
+ });
200
+ const floatStorage = mapColorLinear.some(Boolean);
201
+ const bytesPerPixel = floatStorage ? 8 : 4;
202
+ const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;
203
+ const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;
204
+ const maxTextureArrayBytes = options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;
205
+ const sourcePixels = textures.reduce((sum, texture) => sum + texture.image.width * texture.image.height, 0);
206
+ const maxSourceDimension = textures.reduce((max, texture) => Math.max(max, texture.image.width, texture.image.height), 1);
207
+ const maxPageSizeFromBudget = Math.max(1, Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel)));
208
+ const pageSize = Math.max(1, Math.floor(Math.min(maxSourceDimension, maxTextureDimension2D, maxPageSizeFromBudget)));
209
+ const pageBytes = pageSize * pageSize * bytesPerPixel;
210
+ const maxPageCount = Math.max(1, Math.min(maxTextureArrayLayers, Math.floor(maxTextureArrayBytes / pageBytes)));
211
+ const maxScale = Math.min(1, pageSize / maxSourceDimension);
212
+ let packed = packTextureAtlas(textures, pageSize, maxScale);
213
+ let scale = maxScale;
214
+ if (packed.pages.length > maxPageCount) {
215
+ let low = 0;
216
+ let high = maxScale;
217
+ let bestPacked;
218
+ let bestScale = 0;
219
+ for (let i = 0; i < 14; i++) {
220
+ const candidateScale = (low + high) / 2;
221
+ const candidate = packTextureAtlas(textures, pageSize, candidateScale);
222
+ if (candidate.pages.length <= maxPageCount) {
223
+ low = candidateScale;
224
+ bestScale = candidateScale;
225
+ bestPacked = candidate;
226
+ }
227
+ else {
228
+ high = candidateScale;
229
+ }
230
+ }
231
+ if (!bestPacked) {
232
+ throw new Error(`Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`);
233
+ }
234
+ packed = bestPacked;
235
+ scale = bestScale;
236
+ }
237
+ const atlasWidth = Math.max(1, ...packed.placements.map((placement) => placement.x + placement.width));
238
+ const atlasHeight = Math.max(1, ...packed.placements.map((placement) => placement.y + placement.height));
239
+ const pages = packed.pages.map((page) => {
240
+ if (dataBacked) {
241
+ return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);
242
+ }
243
+ const canvas = createAtlasCanvas(atlasWidth, atlasHeight);
244
+ const context = canvas.getContext('2d');
245
+ if (!context) {
246
+ throw new Error('Unable to create a canvas for the texture atlas.');
247
+ }
248
+ for (const placement of page.placements)
249
+ drawAtlasImage(context, placement, textures[placement.index]);
250
+ return canvas;
251
+ });
252
+ if (scale < 0.999) {
253
+ console.warn(`Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`);
254
+ }
255
+ // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].
256
+ // Packing layer and X offset into one float keeps the shader metadata to one
257
+ // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.
258
+ const mapInfo = packed.placements.flatMap((placement) => {
259
+ const offsetX = (placement.x + 0.5) / atlasWidth;
260
+ const offsetY = (placement.y + 0.5) / atlasHeight;
261
+ return [
262
+ Math.max(placement.width - 1, 0) / atlasWidth,
263
+ Math.max(placement.height - 1, 0) / atlasHeight,
264
+ placement.layer + offsetX,
265
+ offsetY
266
+ ];
267
+ });
268
+ const texture = new WebGLTexture2DArray({
269
+ width: atlasWidth,
270
+ height: atlasHeight,
271
+ sRGB,
272
+ type: floatStorage ? constants.HALF_FLOAT : constants.UNSIGNED_BYTE,
273
+ source: pages,
274
+ flipY: false,
275
+ flipYArray: pages.map(() => false),
276
+ minFilter: constants.LINEAR,
277
+ magFilter: constants.LINEAR,
278
+ wrapS: constants.CLAMP_TO_EDGE,
279
+ wrapT: constants.CLAMP_TO_EDGE
280
+ });
281
+ return {
282
+ texture,
283
+ mapInfo,
284
+ mapTransform: textures.flatMap((texture) => [
285
+ texture.uvScale[0],
286
+ texture.uvScale[1],
287
+ texture.uvOffset[0],
288
+ texture.uvOffset[1]
289
+ ]),
290
+ mapUvChannel: textures.map((texture) => texture.uvChannel),
291
+ mapColorLinear,
292
+ stats: {
293
+ estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,
294
+ height: atlasHeight,
295
+ layers: pages.length,
296
+ packTimeMs: performance.now() - packStart,
297
+ scale,
298
+ sourcePixels,
299
+ textureCount: textures.length,
300
+ width: atlasWidth
301
+ }
302
+ };
303
+ }
304
+ function clampColor(color, fallback = 0) {
305
+ return [0, 1, 2].map((channel) => {
306
+ const value = Number(color[channel]);
307
+ return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;
308
+ });
309
+ }
310
+ function emptyOpenPbrMedium() {
311
+ return {
312
+ anisotropy: 0,
313
+ extinction: [0, 0, 0],
314
+ scattering: [0, 0, 0]
315
+ };
316
+ }
317
+ function transmissionMedium(material) {
318
+ const weight = Math.min(1, Math.max(0, material.transmissionWeight));
319
+ const depth = Math.max(0, material.transmissionDepth);
320
+ if (weight <= 0 || depth <= 0 || material.thinWalled)
321
+ return undefined;
322
+ const color = clampColor(material.transmissionColor, 1);
323
+ const scatterColor = clampColor(material.transmissionScatter);
324
+ const extinction = color.map((channel) => Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth));
325
+ const scattering = scatterColor.map((channel, index) => extinction[index] * channel);
326
+ return {
327
+ anisotropy: Math.min(0.999, Math.max(-0.999, material.transmissionScatterAnisotropy)),
328
+ extinction,
329
+ scattering
330
+ };
331
+ }
332
+ function subsurfaceMedium(material) {
333
+ const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));
334
+ if (weight <= 0 || material.thinWalled)
335
+ return undefined;
336
+ // OpenPBR's radius is the extinction mean free path. The van de Hulst
337
+ // mapping converts the artist-facing multiple-scattering color to a
338
+ // single-scattering albedo while compensating for phase anisotropy.
339
+ const radius = Math.max(material.subsurfaceRadius, 1e-3);
340
+ const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);
341
+ const color = clampColor(material.subsurfaceColor);
342
+ const anisotropy = Math.min(0.999, Math.max(-0.999, material.subsurfaceAnisotropy));
343
+ const extinction = radiusScale.map((scale) => 1 / Math.max(radius * scale, 1e-3));
344
+ const scattering = color.map((channel, index) => {
345
+ const s = 4.09712 + 4.20863 * channel - Math.sqrt(9.59217 + 41.6808 * channel + 17.7126 * channel * channel);
346
+ const sSquared = s * s;
347
+ const albedo = Math.min(1, Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared)));
348
+ return extinction[index] * albedo;
349
+ });
350
+ return { anisotropy, extinction, scattering };
351
+ }
352
+ function combineOpenPbrMedia(material, transmission, subsurface) {
353
+ const transmissionFraction = transmission
354
+ ? Math.min(1, Math.max(0, material.transmissionWeight))
355
+ : 0;
356
+ const subsurfaceFraction = subsurface
357
+ ? (1 - transmissionFraction)
358
+ * Math.min(1, Math.max(0, material.subsurfaceWeight))
359
+ : 0;
360
+ const total = transmissionFraction + subsurfaceFraction;
361
+ if (total <= 0)
362
+ return undefined;
363
+ const transmissionWeight = transmissionFraction / total;
364
+ const subsurfaceWeight = subsurfaceFraction / total;
365
+ const extinction = [0, 1, 2].map((channel) => {
366
+ const transmissionAbsorption = transmission
367
+ ? transmission.extinction[channel] - transmission.scattering[channel]
368
+ : 0;
369
+ const subsurfaceAbsorption = subsurface
370
+ ? subsurface.extinction[channel] - subsurface.scattering[channel]
371
+ : 0;
372
+ const absorption = transmissionAbsorption * transmissionWeight
373
+ + subsurfaceAbsorption * subsurfaceWeight;
374
+ const scattering = (transmission?.scattering[channel] || 0)
375
+ * transmissionWeight
376
+ + (subsurface?.scattering[channel] || 0) * subsurfaceWeight;
377
+ return Math.max(0, absorption + scattering);
378
+ });
379
+ const scattering = [0, 1, 2].map((channel) => (transmission?.scattering[channel] || 0) * transmissionWeight
380
+ + (subsurface?.scattering[channel] || 0) * subsurfaceWeight);
381
+ const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight
382
+ + (subsurface?.anisotropy || 0) * subsurfaceWeight;
383
+ return { anisotropy, extinction, scattering };
384
+ }
385
+ function openPbrMedium(material) {
386
+ const volume = combineOpenPbrMedia(material, transmissionMedium(material), subsurfaceMedium(material));
387
+ return volume ?? emptyOpenPbrMedium();
388
+ }
389
+ class MaterialTable {
390
+ texture;
391
+ textureAtlasStats;
392
+ defines = {};
393
+ bufferData;
394
+ _matBufferTex = new Texture2D(commonNearestFloatProps);
395
+ _materialBufferColumnsLog = 0;
396
+ _displacementMaps = [];
397
+ _lightTexturesIndices = [];
398
+ constructor(materials, lights, options = {}) {
399
+ const maps = mergeTexturesFromMaterials(materials, MATERIAL_TEXTURE_NAMES);
400
+ this._displacementMaps =
401
+ maps.indices.displacementMap
402
+ .map((idx) => {
403
+ return maps.textures[idx];
404
+ })
405
+ .filter((a) => !!a);
406
+ const bufferData = this._packParams(materials);
407
+ const allTextures = maps.textures.slice();
408
+ const lightTexturesIndices = [];
409
+ for (let i = 0; i < lights.length; i++) {
410
+ const light = lights[i];
411
+ if (light.type === 'RectLight' && light.texture) {
412
+ lightTexturesIndices.push(allTextures.length);
413
+ allTextures.push(light.texture);
414
+ }
415
+ else {
416
+ lightTexturesIndices.push(-1);
417
+ }
418
+ }
419
+ const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, stats, texture } = makeTextureArray(allTextures, false, options);
420
+ this.texture = texture;
421
+ this.textureAtlasStats = stats;
422
+ bufferData.mapInfo = mapInfo;
423
+ bufferData.mapTransform = mapTransform;
424
+ bufferData.mapUvChannel = mapUvChannel;
425
+ bufferData.mapColorLinear = mapColorLinear;
426
+ for (const slot of MATERIAL_TEXTURE_SLOTS) {
427
+ bufferData[slot.index] = maps.indices[slot.property];
428
+ }
429
+ this.bufferData = bufferData;
430
+ this._lightTexturesIndices = lightTexturesIndices;
431
+ function countMaps(indices) {
432
+ return indices.filter((idx) => idx >= 0).length;
433
+ }
434
+ this.defines = {
435
+ NUM_MAPS: allTextures.length,
436
+ ...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define
437
+ ? [[slot.define, countMaps(maps.indices[slot.property])]] : []))
438
+ };
439
+ this._updateBuffer();
440
+ }
441
+ _packParams(materials) {
442
+ const media = materials.map(openPbrMedium);
443
+ return {
444
+ color: materials.map((m) => m.baseColor.slice(0, 3)),
445
+ roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),
446
+ emission: materials.map(materialEmission),
447
+ metallic: materials.map((m) => m.baseMetalness),
448
+ ior: materials.map((m) => m.specularIor),
449
+ dispersion: materials.map((m) => m.transmissionDispersionScale),
450
+ thin: materials.map((m) => +m.thinWalled),
451
+ bevelSize: materials.map((m) => m.bevelSize),
452
+ transmission: materials.map((m) => m.transmissionWeight),
453
+ anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),
454
+ specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),
455
+ thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),
456
+ thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),
457
+ thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),
458
+ thinFilmIor: materials.map((m) => m.thinFilmIor),
459
+ normalScale: materials.map((m) => m.normalScale),
460
+ mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),
461
+ type: materials.map((m) => {
462
+ if (m.shadowCatcher) {
463
+ return ShadowCatcherMaterial;
464
+ }
465
+ if (m.unlit) {
466
+ return UnlitMaterial;
467
+ }
468
+ // Standard material
469
+ return 0;
470
+ }),
471
+ // Retain mediumType until both legacy readers are migrated; the
472
+ // direction and coat-normal inputs are reserved for later C1 steps.
473
+ mediumType: materials.map((m) => Number(materialUsesMedium(m))),
474
+ specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),
475
+ coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),
476
+ coatNormalScale: materials.map(m => m.coatNormalScale),
477
+ uvProjection: materials.map((m) => uvProjectionConstants[m.uvProjection] || 0),
478
+ uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),
479
+ displacementUvProjection: materials.map((m) => uvProjectionConstants[m.displacementUvProjection] || 0),
480
+ displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),
481
+ displacementStepSize: materials.map((m) => m.displacementStepSize || 0.01),
482
+ // Alpha
483
+ alpha: materials.map((m) => m.opacity),
484
+ alphaMode: materials.map((m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]),
485
+ alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),
486
+ doubleSided: materials.map((m) => Number(m.doubleSided)),
487
+ baseWeight: materials.map((m) => m.baseWeight),
488
+ baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),
489
+ specularWeight: materials.map((m) => m.specularWeight),
490
+ specularColor: materials.map((m) => clampColor(m.specularColor, 1)),
491
+ transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),
492
+ transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),
493
+ transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),
494
+ transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),
495
+ subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),
496
+ subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),
497
+ subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),
498
+ subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),
499
+ subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),
500
+ fuzzWeight: materials.map((m) => m.fuzzWeight),
501
+ fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),
502
+ fuzzRoughness: materials.map((m) => m.fuzzRoughness),
503
+ coatWeight: materials.map((m) => m.coatWeight),
504
+ coatColor: materials.map((m) => clampColor(m.coatColor, 1)),
505
+ coatRoughness: materials.map((m) => m.coatRoughness),
506
+ coatAnisotropy: materials.map((m) => m.coatAnisotropy),
507
+ coatIor: materials.map((m) => m.coatIor),
508
+ coatDarkening: materials.map((m) => m.coatDarkening),
509
+ thinFilmWeight: materials.map((m) => m.thinFilmWeight),
510
+ dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),
511
+ mediumExtinction: media.map((medium) => medium.extinction),
512
+ mediumScattering: media.map((medium) => medium.scattering),
513
+ mediumAnisotropy: media.map((medium) => medium.anisotropy),
514
+ };
515
+ }
516
+ /** Repack parameters with the same material slots and unchanged texture metadata. */
517
+ repackParams(materials) {
518
+ Object.assign(this.bufferData, this._packParams(materials));
519
+ this._updateBuffer();
520
+ }
521
+ getBufferArray() {
522
+ return packMaterialBuffer(this.bufferData);
523
+ }
524
+ getDisplacementMaps() {
525
+ return this._displacementMaps;
526
+ }
527
+ getLightTexturesIndices() {
528
+ return this._lightTexturesIndices;
529
+ }
530
+ _updateBuffer() {
531
+ this._materialBufferColumnsLog = setDataTexture(this._matBufferTex, this.getBufferArray(), 4).columnsLog;
532
+ }
533
+ setToPass(pass) {
534
+ pass.setUniform('map', this.texture || null);
535
+ pass.setUniform('mapInfo', this.bufferData.mapInfo);
536
+ pass.setUniform('mapTransform', this.bufferData.mapTransform);
537
+ pass.setUniform('mapUvChannel', this.bufferData.mapUvChannel);
538
+ pass.setUniform('mapColorLinear', this.bufferData.mapColorLinear);
539
+ pass.setUniforms({
540
+ materialBuffer: this._matBufferTex,
541
+ materialBufferColumns: this._materialBufferColumnsLog
542
+ });
543
+ }
544
+ dispose(gl) {
545
+ this.texture?.dispose(gl);
546
+ this._matBufferTex.dispose(gl);
547
+ }
548
+ }
549
+ export default MaterialTable;
550
+ //# sourceMappingURL=MaterialTable.js.map