@meimu/mutracer 0.1.5 → 0.2.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 (526) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10407 -8353
  6. package/docs/api.md +200 -10
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +1 -1
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +14 -5
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +11 -6
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -550
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +82 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +429 -429
  206. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +144 -144
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  208. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +801 -801
  209. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  210. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  211. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +49 -49
  212. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  213. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  214. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +102 -102
  215. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  216. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  217. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  218. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  219. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  220. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  221. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  222. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  223. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  224. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  225. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  226. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  227. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  228. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  229. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  230. package/lib/renderer/lightConstants.d.ts +10 -0
  231. package/lib/renderer/lightConstants.js +11 -0
  232. package/lib/renderer/lightConstants.js.map +1 -0
  233. package/lib/renderer/lightCore.d.ts +12 -0
  234. package/lib/renderer/lightCore.js +13 -0
  235. package/lib/renderer/lightCore.js.map +1 -0
  236. package/lib/renderer/lightSampling.d.ts +20 -17
  237. package/lib/renderer/lightSampling.js +123 -56
  238. package/lib/renderer/lightSampling.js.map +1 -1
  239. package/lib/renderer/lightsData.d.ts +21 -0
  240. package/lib/renderer/lightsData.js +192 -0
  241. package/lib/renderer/lightsData.js.map +1 -0
  242. package/lib/renderer/lightsUtil.d.ts +3 -26
  243. package/lib/renderer/lightsUtil.js +3 -153
  244. package/lib/renderer/lightsUtil.js.map +1 -1
  245. package/lib/renderer/materialBufferData.d.ts +70 -0
  246. package/lib/renderer/materialBufferData.js +2 -0
  247. package/lib/renderer/materialBufferData.js.map +1 -0
  248. package/lib/renderer/materialConstants.d.ts +11 -0
  249. package/lib/renderer/materialConstants.js +11 -0
  250. package/lib/renderer/materialConstants.js.map +1 -1
  251. package/lib/renderer/materialCore.d.ts +8 -0
  252. package/lib/renderer/materialCore.js +9 -0
  253. package/lib/renderer/materialCore.js.map +1 -0
  254. package/lib/renderer/materialEmission.d.ts +2 -2
  255. package/lib/renderer/materialEmission.js +3 -3
  256. package/lib/renderer/materialEmission.js.map +1 -1
  257. package/lib/renderer/materialLayout.d.ts +2 -101
  258. package/lib/renderer/materialLayout.js +110 -172
  259. package/lib/renderer/materialLayout.js.map +1 -1
  260. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  261. package/lib/renderer/materialLayoutSchema.js +172 -0
  262. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  263. package/lib/renderer/materialParams.d.ts +69 -0
  264. package/lib/renderer/materialParams.js +272 -0
  265. package/lib/renderer/materialParams.js.map +1 -0
  266. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  267. package/lib/renderer/materialTextureSlots.js +21 -8
  268. package/lib/renderer/materialTextureSlots.js.map +1 -1
  269. package/lib/renderer/materialTextures.d.ts +6 -0
  270. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  271. package/lib/renderer/materialTextures.js.map +1 -0
  272. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  273. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  274. package/lib/renderer/meshInstances.d.ts +4 -21
  275. package/lib/renderer/meshInstances.js +10 -56
  276. package/lib/renderer/meshInstances.js.map +1 -1
  277. package/lib/renderer/oidnNetwork.d.ts +2 -2
  278. package/lib/renderer/oidnNetwork.js +1 -1
  279. package/lib/renderer/oidnNetwork.js.map +1 -1
  280. package/lib/renderer/openPbrEnergyLut.js +850 -846
  281. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  282. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  283. package/lib/renderer/ownedDenoiser.js +2 -0
  284. package/lib/renderer/ownedDenoiser.js.map +1 -0
  285. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  286. package/lib/renderer/packedMeshInstances.js +80 -0
  287. package/lib/renderer/packedMeshInstances.js.map +1 -0
  288. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  289. package/lib/renderer/prepareMeshBVH.js +21 -642
  290. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  291. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  292. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  293. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  294. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  295. package/lib/renderer/progressiveScheduler.js +3 -0
  296. package/lib/renderer/progressiveScheduler.js.map +1 -1
  297. package/lib/renderer/renderPipeline.d.ts +3 -1
  298. package/lib/renderer/renderPipeline.js.map +1 -1
  299. package/lib/renderer/renderingLimits.d.ts +9 -0
  300. package/lib/renderer/renderingLimits.js +18 -0
  301. package/lib/renderer/renderingLimits.js.map +1 -0
  302. package/lib/renderer/sceneAssembly.d.ts +73 -0
  303. package/lib/renderer/sceneAssembly.js +109 -0
  304. package/lib/renderer/sceneAssembly.js.map +1 -0
  305. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  306. package/lib/renderer/sceneChangeCore.js +307 -0
  307. package/lib/renderer/sceneChangeCore.js.map +1 -0
  308. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  309. package/lib/renderer/sceneChangeDetector.js +24 -150
  310. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  311. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  312. package/lib/renderer/sceneLayoutSchema.js +111 -0
  313. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  314. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  315. package/lib/renderer/sceneLightChanges.js.map +1 -1
  316. package/lib/renderer/scenePreparation.d.ts +55 -0
  317. package/lib/renderer/scenePreparation.js +360 -0
  318. package/lib/renderer/scenePreparation.js.map +1 -0
  319. package/lib/renderer/scratchSampling.js +18 -18
  320. package/lib/renderer/scratchSampling.js.map +1 -1
  321. package/lib/renderer/shader.d.ts +2 -0
  322. package/lib/renderer/shader.js +2 -0
  323. package/lib/renderer/shader.js.map +1 -1
  324. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  325. package/lib/renderer/shaderCapabilities.js +55 -0
  326. package/lib/renderer/shaderCapabilities.js.map +1 -0
  327. package/lib/renderer/shaderCapacity.d.ts +2 -0
  328. package/lib/renderer/shaderCapacity.js +5 -0
  329. package/lib/renderer/shaderCapacity.js.map +1 -0
  330. package/lib/renderer/skyModel.d.ts +9 -0
  331. package/lib/renderer/skyModel.js +10 -0
  332. package/lib/renderer/skyModel.js.map +1 -0
  333. package/lib/renderer/textureAtlas.d.ts +60 -0
  334. package/lib/renderer/textureAtlas.js +145 -0
  335. package/lib/renderer/textureAtlas.js.map +1 -0
  336. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  337. package/lib/renderer/textureAtlasPixels.js +68 -0
  338. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  339. package/lib/renderer/util.d.ts +1 -1
  340. package/lib/renderer/util.js.map +1 -1
  341. package/lib/renderer/webgl.d.ts +9 -2
  342. package/lib/renderer/webgl.js +54 -9
  343. package/lib/renderer/webgl.js.map +1 -1
  344. package/lib/renderer/wgpuBindless.d.ts +26 -0
  345. package/lib/renderer/wgpuBindless.js +95 -0
  346. package/lib/renderer/wgpuBindless.js.map +1 -0
  347. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  348. package/lib/renderer/wgpuBindlessSource.js +51 -0
  349. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  350. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  351. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  352. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  353. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  354. package/lib/renderer/wgpuSceneUniform.js +125 -0
  355. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  356. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  357. package/lib/renderer/wgpuShaderSource.js +31 -0
  358. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  359. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  360. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  361. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  362. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  363. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  364. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  367. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  369. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  370. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  372. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  373. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  375. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  376. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  378. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  379. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  381. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  382. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  383. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  384. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  385. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +742 -705
  386. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  388. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  389. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  390. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +84 -82
  391. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  393. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  394. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  395. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  396. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  397. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  398. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  399. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  400. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  401. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  403. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  404. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  406. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  408. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  409. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  410. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  411. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  412. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  413. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  415. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  416. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  418. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  419. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  420. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  421. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  422. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  423. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  424. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  425. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  426. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  427. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  428. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  429. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  430. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  431. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  432. package/lib/scene/Camera.js +7 -3
  433. package/lib/scene/Camera.js.map +1 -1
  434. package/lib/scene/EnvironmentLight.d.ts +5 -9
  435. package/lib/scene/EnvironmentLight.js +4 -14
  436. package/lib/scene/EnvironmentLight.js.map +1 -1
  437. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  438. package/lib/scene/EnvironmentLightState.js +19 -0
  439. package/lib/scene/EnvironmentLightState.js.map +1 -0
  440. package/lib/scene/Geometry.d.ts +12 -6
  441. package/lib/scene/Geometry.js +37 -13
  442. package/lib/scene/Geometry.js.map +1 -1
  443. package/lib/scene/InstanceState.d.ts +39 -0
  444. package/lib/scene/InstanceState.js +77 -0
  445. package/lib/scene/InstanceState.js.map +1 -0
  446. package/lib/scene/InstancedMesh.d.ts +1 -1
  447. package/lib/scene/InstancedMesh.js +3 -0
  448. package/lib/scene/InstancedMesh.js.map +1 -1
  449. package/lib/scene/MaterialState.d.ts +209 -0
  450. package/lib/scene/MaterialState.js +231 -0
  451. package/lib/scene/MaterialState.js.map +1 -0
  452. package/lib/scene/Mesh.d.ts +4 -6
  453. package/lib/scene/Mesh.js +3 -11
  454. package/lib/scene/Mesh.js.map +1 -1
  455. package/lib/scene/MeshState.d.ts +20 -0
  456. package/lib/scene/MeshState.js +35 -0
  457. package/lib/scene/MeshState.js.map +1 -0
  458. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  459. package/lib/scene/OpenPBRMaterial.js +5 -223
  460. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  461. package/lib/scene/PixelTexture.d.ts +6 -0
  462. package/lib/scene/PixelTexture.js +10 -0
  463. package/lib/scene/PixelTexture.js.map +1 -0
  464. package/lib/scene/ProceduralSky.d.ts +24 -0
  465. package/lib/scene/ProceduralSky.js +40 -0
  466. package/lib/scene/ProceduralSky.js.map +1 -0
  467. package/lib/scene/RectLight.d.ts +2 -13
  468. package/lib/scene/RectLight.js +3 -21
  469. package/lib/scene/RectLight.js.map +1 -1
  470. package/lib/scene/RectLightState.d.ts +31 -0
  471. package/lib/scene/RectLightState.js +26 -0
  472. package/lib/scene/RectLightState.js.map +1 -0
  473. package/lib/scene/Scene.d.ts +15 -4
  474. package/lib/scene/Scene.js.map +1 -1
  475. package/lib/scene/SceneNode.js +7 -6
  476. package/lib/scene/SceneNode.js.map +1 -1
  477. package/lib/scene/Texture.d.ts +10 -41
  478. package/lib/scene/Texture.js +4 -33
  479. package/lib/scene/Texture.js.map +1 -1
  480. package/lib/scene/TextureState.d.ts +35 -0
  481. package/lib/scene/TextureState.js +35 -0
  482. package/lib/scene/TextureState.js.map +1 -0
  483. package/lib/scene/attributeData.d.ts +4 -0
  484. package/lib/scene/attributeData.js +10 -0
  485. package/lib/scene/attributeData.js.map +1 -0
  486. package/lib/scene/lightState.d.ts +8 -0
  487. package/lib/scene/lightState.js +2 -0
  488. package/lib/scene/lightState.js.map +1 -0
  489. package/lib/scene/openPbrSchema.d.ts +7 -12
  490. package/lib/scene/openPbrSchema.js +273 -28
  491. package/lib/scene/openPbrSchema.js.map +1 -1
  492. package/lib/scene/skyParameters.d.ts +20 -0
  493. package/lib/scene/skyParameters.js +28 -0
  494. package/lib/scene/skyParameters.js.map +1 -0
  495. package/lib/scene/textureData.d.ts +9 -0
  496. package/lib/scene/textureData.js +2 -0
  497. package/lib/scene/textureData.js.map +1 -0
  498. package/lib/scene/texturePixels.d.ts +6 -0
  499. package/lib/scene/texturePixels.js +10 -0
  500. package/lib/scene/texturePixels.js.map +1 -0
  501. package/lib/settings/display.d.ts +33 -0
  502. package/lib/settings/display.js +7 -0
  503. package/lib/settings/display.js.map +1 -1
  504. package/lib/settings/render.d.ts +25 -3
  505. package/lib/settings/render.js +3 -1
  506. package/lib/settings/render.js.map +1 -1
  507. package/lib/tinybvh/tinybvh.wasm +0 -0
  508. package/lib/util/commonGeometry.js +7 -7
  509. package/lib/util/commonGeometry.js.map +1 -1
  510. package/lib/util/fromTHREE.d.ts +4 -1
  511. package/lib/util/fromTHREE.js +18 -5
  512. package/lib/util/fromTHREE.js.map +1 -1
  513. package/lib/util/geometry.js +42 -29
  514. package/lib/util/geometry.js.map +1 -1
  515. package/lib/util/loadRGBE.js +3 -4
  516. package/lib/util/loadRGBE.js.map +1 -1
  517. package/lib/util/studioLighting.d.ts +18 -0
  518. package/lib/util/studioLighting.js +36 -0
  519. package/lib/util/studioLighting.js.map +1 -0
  520. package/lib/version.d.ts +1 -1
  521. package/lib/version.js +1 -1
  522. package/lib/version.js.map +1 -1
  523. package/llms.txt +4 -0
  524. package/package.json +31 -5
  525. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  526. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ export declare const MATERIAL_SHADER_CAPABILITIES: {
2
+ readonly transmission: 1;
3
+ readonly metal: 2;
4
+ };
5
+ export declare const LIGHT_SHADER_CAPABILITIES: {
6
+ readonly SphereLight: 1;
7
+ readonly RectLight: 2;
8
+ readonly SpotLight: 4;
9
+ readonly DirectionalLight: 8;
10
+ readonly emissive: 16;
11
+ };
12
+ export declare const ALL_MATERIAL_SHADER_CAPABILITIES = 3;
13
+ export declare const ALL_LIGHT_SHADER_CAPABILITIES = 31;
14
+ export declare function lightShaderCapabilities(types: readonly string[], emissiveCount: number): number;
15
+ export declare function updateSceneShaderCapabilities(constants: Record<string, boolean | number>): void;
16
+ export interface ShaderCapabilities {
17
+ SCENE_CAPABILITIES: number;
18
+ MATERIAL_CAPABILITIES: number;
19
+ LIGHT_CAPABILITIES: number;
20
+ }
21
+ export declare function shaderCapabilitiesInclude(supported: ShaderCapabilities, required: ShaderCapabilities): boolean;
22
+ /** Retain support, not the scene's active flags. Commit only after compilation succeeds. */
23
+ export declare function retainedShaderCapabilities(constants: Record<string, boolean | number>, previous?: ShaderCapabilities): ShaderCapabilities;
@@ -0,0 +1,55 @@
1
+ import { wgpuSceneFeatureFlags, WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';
2
+ export const MATERIAL_SHADER_CAPABILITIES = { transmission: 1, metal: 2 };
3
+ export const LIGHT_SHADER_CAPABILITIES = {
4
+ SphereLight: 1, RectLight: 2, SpotLight: 4, DirectionalLight: 8, emissive: 16
5
+ };
6
+ export const ALL_MATERIAL_SHADER_CAPABILITIES = 3;
7
+ export const ALL_LIGHT_SHADER_CAPABILITIES = 31;
8
+ export function lightShaderCapabilities(types, emissiveCount) {
9
+ let mask = emissiveCount > 0 ? LIGHT_SHADER_CAPABILITIES.emissive : 0;
10
+ for (const type of types) {
11
+ switch (type) {
12
+ case 'SphereLight':
13
+ mask |= LIGHT_SHADER_CAPABILITIES.SphereLight;
14
+ break;
15
+ case 'RectLight':
16
+ mask |= LIGHT_SHADER_CAPABILITIES.RectLight;
17
+ break;
18
+ case 'SpotLight':
19
+ mask |= LIGHT_SHADER_CAPABILITIES.SpotLight;
20
+ break;
21
+ case 'DirectionalLight':
22
+ mask |= LIGHT_SHADER_CAPABILITIES.DirectionalLight;
23
+ break;
24
+ }
25
+ }
26
+ return mask;
27
+ }
28
+ export function updateSceneShaderCapabilities(constants) {
29
+ constants.SCENE_CAPABILITIES = wgpuSceneFeatureFlags(constants);
30
+ }
31
+ export function shaderCapabilitiesInclude(supported, required) {
32
+ return (supported.SCENE_CAPABILITIES & required.SCENE_CAPABILITIES) === required.SCENE_CAPABILITIES &&
33
+ (supported.MATERIAL_CAPABILITIES & required.MATERIAL_CAPABILITIES) === required.MATERIAL_CAPABILITIES &&
34
+ (supported.LIGHT_CAPABILITIES & required.LIGHT_CAPABILITIES) === required.LIGHT_CAPABILITIES;
35
+ }
36
+ /** Retain support, not the scene's active flags. Commit only after compilation succeeds. */
37
+ export function retainedShaderCapabilities(constants, previous) {
38
+ let scene = wgpuSceneFeatureFlags(constants) | (previous?.SCENE_CAPABILITIES ?? 0);
39
+ // Metalness is a continuous base-material edit, including the first change
40
+ // from a dielectric to a metal. Keep that support in every base variant.
41
+ const material = MATERIAL_SHADER_CAPABILITIES.metal |
42
+ Number(constants.MATERIAL_CAPABILITIES ?? 0) | (previous?.MATERIAL_CAPABILITIES ?? 0);
43
+ const commonSurface = WGPU_SCENE_FEATURE_BITS.HAS_COAT | WGPU_SCENE_FEATURE_BITS.HAS_FUZZ;
44
+ // Activate this small group on first use, keeping a plain scene's initial
45
+ // pipeline lean. Thin film, media, dispersion and alpha remain independent.
46
+ if ((scene & commonSurface) !== 0) {
47
+ scene |= commonSurface;
48
+ }
49
+ return {
50
+ SCENE_CAPABILITIES: scene,
51
+ MATERIAL_CAPABILITIES: material,
52
+ LIGHT_CAPABILITIES: Number(constants.LIGHT_CAPABILITIES ?? 0) | (previous?.LIGHT_CAPABILITIES ?? 0)
53
+ };
54
+ }
55
+ //# sourceMappingURL=shaderCapabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaderCapabilities.js","sourceRoot":"","sources":["../../src/renderer/shaderCapabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAE,uBAAuB,EAAC,MAAM,wBAAwB,CAAC;AAEtF,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAU,CAAC;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;CACrE,CAAC;AACX,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEhD,MAAM,UAAU,uBAAuB,CAAC,KAAwB,EAAE,aAAqB;IACrF,IAAI,IAAI,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,aAAa;gBAAE,IAAI,IAAI,yBAAyB,CAAC,WAAW,CAAC;gBAAC,MAAM;YACzE,KAAK,WAAW;gBAAE,IAAI,IAAI,yBAAyB,CAAC,SAAS,CAAC;gBAAC,MAAM;YACrE,KAAK,WAAW;gBAAE,IAAI,IAAI,yBAAyB,CAAC,SAAS,CAAC;gBAAC,MAAM;YACrE,KAAK,kBAAkB;gBAAE,IAAI,IAAI,yBAAyB,CAAC,gBAAgB,CAAC;gBAAC,MAAM;QACrF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,SAA2C;IACvF,SAAS,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAClE,CAAC;AAQD,MAAM,UAAU,yBAAyB,CAAC,SAA6B,EAAE,QAA4B;IACnG,OAAO,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,kBAAkB;QACjG,CAAC,SAAS,CAAC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC,KAAK,QAAQ,CAAC,qBAAqB;QACrG,CAAC,SAAS,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,kBAAkB,CAAC;AACjG,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,0BAA0B,CAAC,SAA2C,EAAE,QAA6B;IACnH,IAAI,KAAK,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,IAAI,CAAC,CAAC,CAAC;IACnF,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,QAAQ,GAAG,4BAA4B,CAAC,KAAK;QACjD,MAAM,CAAC,SAAS,CAAC,qBAAqB,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,qBAAqB,IAAI,CAAC,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC;IAC1F,0EAA0E;IAC1E,4EAA4E;IAC5E,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,IAAI,aAAa,CAAC;IACzB,CAAC;IACD,OAAO;QACL,kBAAkB,EAAE,KAAK;QACzB,qBAAqB,EAAE,QAAQ;QAC/B,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,IAAI,CAAC,CAAC;KACpG,CAAC;AACJ,CAAC","sourcesContent":["import {wgpuSceneFeatureFlags, WGPU_SCENE_FEATURE_BITS} from './WGPUSceneFeatures.js';\n\nexport const MATERIAL_SHADER_CAPABILITIES = {transmission: 1, metal: 2} as const;\nexport const LIGHT_SHADER_CAPABILITIES = {\n SphereLight: 1, RectLight: 2, SpotLight: 4, DirectionalLight: 8, emissive: 16\n} as const;\nexport const ALL_MATERIAL_SHADER_CAPABILITIES = 3;\nexport const ALL_LIGHT_SHADER_CAPABILITIES = 31;\n\nexport function lightShaderCapabilities(types: readonly string[], emissiveCount: number) {\n let mask = emissiveCount > 0 ? LIGHT_SHADER_CAPABILITIES.emissive : 0;\n for (const type of types) {\n switch (type) {\n case 'SphereLight': mask |= LIGHT_SHADER_CAPABILITIES.SphereLight; break;\n case 'RectLight': mask |= LIGHT_SHADER_CAPABILITIES.RectLight; break;\n case 'SpotLight': mask |= LIGHT_SHADER_CAPABILITIES.SpotLight; break;\n case 'DirectionalLight': mask |= LIGHT_SHADER_CAPABILITIES.DirectionalLight; break;\n }\n }\n return mask;\n}\n\nexport function updateSceneShaderCapabilities(constants: Record<string, boolean | number>) {\n constants.SCENE_CAPABILITIES = wgpuSceneFeatureFlags(constants);\n}\n\nexport interface ShaderCapabilities {\n SCENE_CAPABILITIES: number;\n MATERIAL_CAPABILITIES: number;\n LIGHT_CAPABILITIES: number;\n}\n\nexport function shaderCapabilitiesInclude(supported: ShaderCapabilities, required: ShaderCapabilities) {\n return (supported.SCENE_CAPABILITIES & required.SCENE_CAPABILITIES) === required.SCENE_CAPABILITIES &&\n (supported.MATERIAL_CAPABILITIES & required.MATERIAL_CAPABILITIES) === required.MATERIAL_CAPABILITIES &&\n (supported.LIGHT_CAPABILITIES & required.LIGHT_CAPABILITIES) === required.LIGHT_CAPABILITIES;\n}\n\n/** Retain support, not the scene's active flags. Commit only after compilation succeeds. */\nexport function retainedShaderCapabilities(constants: Record<string, boolean | number>, previous?: ShaderCapabilities): ShaderCapabilities {\n let scene = wgpuSceneFeatureFlags(constants) | (previous?.SCENE_CAPABILITIES ?? 0);\n // Metalness is a continuous base-material edit, including the first change\n // from a dielectric to a metal. Keep that support in every base variant.\n const material = MATERIAL_SHADER_CAPABILITIES.metal |\n Number(constants.MATERIAL_CAPABILITIES ?? 0) | (previous?.MATERIAL_CAPABILITIES ?? 0);\n const commonSurface = WGPU_SCENE_FEATURE_BITS.HAS_COAT | WGPU_SCENE_FEATURE_BITS.HAS_FUZZ;\n // Activate this small group on first use, keeping a plain scene's initial\n // pipeline lean. Thin film, media, dispersion and alpha remain independent.\n if ((scene & commonSurface) !== 0) {\n scene |= commonSurface;\n }\n return {\n SCENE_CAPABILITIES: scene,\n MATERIAL_CAPABILITIES: material,\n LIGHT_CAPABILITIES: Number(constants.LIGHT_CAPABILITIES ?? 0) | (previous?.LIGHT_CAPABILITIES ?? 0)\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ /** Grow in coarse buckets; scene edits must not shrink a compiled stack. */
2
+ export declare function retainedShaderCapacity(required: number, previous?: number, minimum?: number): number;
@@ -0,0 +1,5 @@
1
+ /** Grow in coarse buckets; scene edits must not shrink a compiled stack. */
2
+ export function retainedShaderCapacity(required, previous = 0, minimum = 8) {
3
+ return Math.max(previous, minimum, 2 ** Math.ceil(Math.log2(Math.max(1, required))));
4
+ }
5
+ //# sourceMappingURL=shaderCapacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaderCapacity.js","sourceRoot":"","sources":["../../src/renderer/shaderCapacity.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;IAChF,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC","sourcesContent":["/** Grow in coarse buckets; scene edits must not shrink a compiled stack. */\nexport function retainedShaderCapacity(required: number, previous = 0, minimum = 8) {\n return Math.max(previous, minimum, 2 ** Math.ceil(Math.log2(Math.max(1, required))));\n}\n\n"]}
@@ -0,0 +1,9 @@
1
+ /** Apparent sun radius in degrees; larger than the real 0.27° so the disk reads at map resolution. */
2
+ export declare const SUN_RADIUS = 0.4;
3
+ /** Aerosol density relative to a very clean atmosphere (optical depth about 0.005). */
4
+ export declare const TURBIDITY = 5;
5
+ export declare const GROUND_ALBEDO: number[];
6
+ /** Sun plus sky irradiance on a horizontal plane with the sun at 33°. */
7
+ export declare const ILLUMINANCE: number;
8
+ /** Horizontal illuminance of this atmosphere for unit solar irradiance and a 33° sun. */
9
+ export declare const REFERENCE_ILLUMINANCE = 0.488;
@@ -0,0 +1,10 @@
1
+ /** Apparent sun radius in degrees; larger than the real 0.27° so the disk reads at map resolution. */
2
+ export const SUN_RADIUS = 0.4;
3
+ /** Aerosol density relative to a very clean atmosphere (optical depth about 0.005). */
4
+ export const TURBIDITY = 5;
5
+ export const GROUND_ALBEDO = [0.2, 0.18, 0.15];
6
+ /** Sun plus sky irradiance on a horizontal plane with the sun at 33°. */
7
+ export const ILLUMINANCE = Math.PI;
8
+ /** Horizontal illuminance of this atmosphere for unit solar irradiance and a 33° sun. */
9
+ export const REFERENCE_ILLUMINANCE = 0.488;
10
+ //# sourceMappingURL=skyModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skyModel.js","sourceRoot":"","sources":["../../src/renderer/skyModel.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAC9B,uFAAuF;AACvF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/C,yEAAyE;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC;AACnC,yFAAyF;AACzF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC","sourcesContent":["/** Apparent sun radius in degrees; larger than the real 0.27° so the disk reads at map resolution. */\nexport const SUN_RADIUS = 0.4;\n/** Aerosol density relative to a very clean atmosphere (optical depth about 0.005). */\nexport const TURBIDITY = 5;\nexport const GROUND_ALBEDO = [0.2, 0.18, 0.15];\n/** Sun plus sky irradiance on a horizontal plane with the sun at 33°. */\nexport const ILLUMINANCE = Math.PI;\n/** Horizontal illuminance of this atmosphere for unit solar irradiance and a 33° sun. */\nexport const REFERENCE_ILLUMINANCE = 0.488;\n\n"]}
@@ -0,0 +1,60 @@
1
+ import type TextureState from '../scene/TextureState.js';
2
+ export declare const DEFAULT_MAX_TEXTURE_ARRAY_BYTES: number;
3
+ export interface MaterialTableOptions {
4
+ maxTextureArrayBytes?: number;
5
+ maxTextureArrayLayers?: number;
6
+ maxTextureDimension2D?: number;
7
+ }
8
+ export interface TextureAtlasStats {
9
+ estimatedBytes: number;
10
+ height: number;
11
+ layers: number;
12
+ packTimeMs: number;
13
+ scale: number;
14
+ sourcePixels: number;
15
+ textureCount: number;
16
+ width: number;
17
+ }
18
+ export interface AtlasPlacement {
19
+ height: number;
20
+ index: number;
21
+ layer: number;
22
+ width: number;
23
+ x: number;
24
+ y: number;
25
+ }
26
+ interface AtlasShelf {
27
+ height: number;
28
+ x: number;
29
+ y: number;
30
+ }
31
+ interface AtlasPage {
32
+ nextY: number;
33
+ placements: AtlasPlacement[];
34
+ shelves: AtlasShelf[];
35
+ }
36
+ export declare function planTextureAtlas(textures: TextureState[], mapColorLinear: number[], options?: MaterialTableOptions, floatStorage?: boolean): {
37
+ pages: AtlasPage[];
38
+ placements: AtlasPlacement[];
39
+ width: number;
40
+ height: number;
41
+ floatStorage: boolean;
42
+ bytesPerPixel: number;
43
+ mapInfo: number[];
44
+ mapTransform: number[];
45
+ mapWrap: number[];
46
+ mapUvChannel: number[];
47
+ mapColorLinear: number[];
48
+ stats: {
49
+ estimatedBytes: number;
50
+ height: number;
51
+ layers: number;
52
+ packTimeMs: number;
53
+ scale: number;
54
+ sourcePixels: number;
55
+ textureCount: number;
56
+ width: number;
57
+ };
58
+ };
59
+ export type TextureAtlasPlan = ReturnType<typeof planTextureAtlas>;
60
+ export {};
@@ -0,0 +1,145 @@
1
+ import { textureWrapIndex } from '../scene/TextureState.js';
2
+ export const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;
3
+ /**
4
+ * Packs material textures into a small 2D-array atlas.
5
+ *
6
+ * The input rectangles are sorted from tallest/largest to smallest, then
7
+ * placed with a shelf allocator. Each atlas layer contains horizontal shelves;
8
+ * a texture is inserted into the first shelf with enough remaining width, or a
9
+ * new shelf is opened below the existing ones. A new array layer is allocated
10
+ * only when none of the current layers has enough room.
11
+ *
12
+ * `makeTextureArray` first tries this packing at full resolution. If the result
13
+ * exceeds the adapter layer limit or the configured memory budget, it performs
14
+ * a binary search for the largest uniform scale that fits. This preserves full
15
+ * resolution whenever packing alone is sufficient and degrades predictably on
16
+ * constrained hardware.
17
+ *
18
+ * The returned placements keep the original logical texture indices. Shaders
19
+ * use per-texture atlas metadata instead of treating the logical index as the
20
+ * physical array layer.
21
+ */
22
+ function packTextureAtlas(textures, pageSize, scale) {
23
+ const pages = [];
24
+ const placements = new Array(textures.length);
25
+ const items = textures
26
+ .map((texture, index) => ({
27
+ height: Math.max(1, Math.floor(texture.image.height * scale)),
28
+ index,
29
+ width: Math.max(1, Math.floor(texture.image.width * scale))
30
+ }))
31
+ .sort((a, b) => b.height - a.height || b.width - a.width);
32
+ for (const item of items) {
33
+ let placement;
34
+ for (let layer = 0; layer < pages.length && !placement; layer++) {
35
+ const page = pages[layer];
36
+ for (const shelf of page.shelves) {
37
+ if (item.height <= shelf.height &&
38
+ shelf.x + item.width <= pageSize) {
39
+ placement = {
40
+ height: item.height, index: item.index, width: item.width,
41
+ layer,
42
+ x: shelf.x,
43
+ y: shelf.y
44
+ };
45
+ shelf.x += item.width;
46
+ break;
47
+ }
48
+ }
49
+ if (!placement && page.nextY + item.height <= pageSize) {
50
+ placement = {
51
+ height: item.height, index: item.index, width: item.width,
52
+ layer,
53
+ x: 0,
54
+ y: page.nextY
55
+ };
56
+ page.shelves.push({
57
+ height: item.height,
58
+ x: item.width,
59
+ y: page.nextY
60
+ });
61
+ page.nextY += item.height;
62
+ }
63
+ }
64
+ if (!placement) {
65
+ const layer = pages.length;
66
+ placement = { height: item.height, index: item.index, width: item.width, layer, x: 0, y: 0 };
67
+ pages.push({
68
+ nextY: item.height,
69
+ placements: [],
70
+ shelves: [{ height: item.height, x: item.width, y: 0 }]
71
+ });
72
+ }
73
+ pages[placement.layer].placements.push(placement);
74
+ placements[item.index] = placement;
75
+ }
76
+ return { pages, placements };
77
+ }
78
+ export function planTextureAtlas(textures, mapColorLinear, options = {}, floatStorage = mapColorLinear.some(value => !!value)) {
79
+ const bytesPerPixel = floatStorage ? 8 : 4;
80
+ if (!textures.length)
81
+ return { pages: [], placements: [],
82
+ width: 1, height: 1, floatStorage, bytesPerPixel, mapInfo: [],
83
+ mapTransform: [], mapWrap: [], mapUvChannel: [], mapColorLinear,
84
+ stats: { estimatedBytes: 0, height: 1, layers: 0, packTimeMs: 0, scale: 1,
85
+ sourcePixels: 0, textureCount: 0, width: 1 } };
86
+ const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;
87
+ const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;
88
+ const maxTextureArrayBytes = options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;
89
+ const sourcePixels = textures.reduce((sum, texture) => sum + texture.image.width * texture.image.height, 0);
90
+ const maxSourceDimension = textures.reduce((max, texture) => Math.max(max, texture.image.width, texture.image.height), 1);
91
+ const maxPageSizeFromBudget = Math.max(1, Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel)));
92
+ const pageSize = Math.max(1, Math.floor(Math.min(maxSourceDimension, maxTextureDimension2D, maxPageSizeFromBudget)));
93
+ const pageBytes = pageSize * pageSize * bytesPerPixel;
94
+ const maxPageCount = Math.max(1, Math.min(maxTextureArrayLayers, Math.floor(maxTextureArrayBytes / pageBytes)));
95
+ const maxScale = Math.min(1, pageSize / maxSourceDimension);
96
+ let packed = packTextureAtlas(textures, pageSize, maxScale);
97
+ let scale = maxScale;
98
+ if (packed.pages.length > maxPageCount) {
99
+ let low = 0;
100
+ let high = maxScale;
101
+ let bestPacked;
102
+ let bestScale = 0;
103
+ for (let i = 0; i < 14; i++) {
104
+ const candidateScale = (low + high) / 2;
105
+ const candidate = packTextureAtlas(textures, pageSize, candidateScale);
106
+ if (candidate.pages.length <= maxPageCount) {
107
+ low = candidateScale;
108
+ bestScale = candidateScale;
109
+ bestPacked = candidate;
110
+ }
111
+ else {
112
+ high = candidateScale;
113
+ }
114
+ }
115
+ if (!bestPacked) {
116
+ throw new Error(`Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`);
117
+ }
118
+ packed = bestPacked;
119
+ scale = bestScale;
120
+ }
121
+ const atlasWidth = packed.placements.reduce((max, placement) => Math.max(max, placement.x + placement.width), 1);
122
+ const atlasHeight = packed.placements.reduce((max, placement) => Math.max(max, placement.y + placement.height), 1);
123
+ // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].
124
+ // Packing layer and X offset into one float keeps the shader metadata to one
125
+ // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.
126
+ const mapInfo = packed.placements.flatMap((placement) => {
127
+ const offsetX = (placement.x + 0.5) / atlasWidth;
128
+ const offsetY = (placement.y + 0.5) / atlasHeight;
129
+ return [
130
+ Math.max(placement.width - 1, 0) / atlasWidth,
131
+ Math.max(placement.height - 1, 0) / atlasHeight,
132
+ placement.layer + offsetX,
133
+ offsetY
134
+ ];
135
+ });
136
+ return { pages: packed.pages, placements: packed.placements, width: atlasWidth, height: atlasHeight,
137
+ floatStorage, bytesPerPixel, mapInfo,
138
+ mapTransform: textures.flatMap(texture => [texture.uvScale[0], texture.uvScale[1], texture.uvOffset[0], texture.uvOffset[1]]),
139
+ mapWrap: textures.flatMap(texture => [textureWrapIndex(texture.wrapS), textureWrapIndex(texture.wrapT)]),
140
+ mapUvChannel: textures.map(texture => texture.uvChannel), mapColorLinear,
141
+ stats: { estimatedBytes: atlasWidth * atlasHeight * packed.pages.length * bytesPerPixel,
142
+ height: atlasHeight, layers: packed.pages.length, packTimeMs: 0, scale, sourcePixels,
143
+ textureCount: textures.length, width: atlasWidth } };
144
+ }
145
+ //# sourceMappingURL=textureAtlas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textureAtlas.js","sourceRoot":"","sources":["../../src/renderer/textureAtlas.ts"],"names":[],"mappings":"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","sourcesContent":["import type TextureState from '../scene/TextureState.js';\nimport { textureWrapIndex } from '../scene/TextureState.js';\n\nexport const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;\n\nexport interface MaterialTableOptions {\n maxTextureArrayBytes?: number;\n maxTextureArrayLayers?: number;\n maxTextureDimension2D?: number;\n}\n\nexport interface TextureAtlasStats {\n estimatedBytes: number;\n height: number;\n layers: number;\n packTimeMs: number;\n scale: number;\n sourcePixels: number;\n textureCount: number;\n width: number;\n}\n\nexport interface AtlasPlacement {\n height: number;\n index: number;\n layer: number;\n width: number;\n x: number;\n y: number;\n}\n\ninterface AtlasShelf {\n height: number;\n x: number;\n y: number;\n}\n\ninterface AtlasPage {\n nextY: number;\n placements: AtlasPlacement[];\n shelves: AtlasShelf[];\n}\n\n/**\n * Packs material textures into a small 2D-array atlas.\n *\n * The input rectangles are sorted from tallest/largest to smallest, then\n * placed with a shelf allocator. Each atlas layer contains horizontal shelves;\n * a texture is inserted into the first shelf with enough remaining width, or a\n * new shelf is opened below the existing ones. A new array layer is allocated\n * only when none of the current layers has enough room.\n *\n * `makeTextureArray` first tries this packing at full resolution. If the result\n * exceeds the adapter layer limit or the configured memory budget, it performs\n * a binary search for the largest uniform scale that fits. This preserves full\n * resolution whenever packing alone is sufficient and degrades predictably on\n * constrained hardware.\n *\n * The returned placements keep the original logical texture indices. Shaders\n * use per-texture atlas metadata instead of treating the logical index as the\n * physical array layer.\n */\nfunction packTextureAtlas(\n textures: TextureState[],\n pageSize: number,\n scale: number\n) {\n const pages: AtlasPage[] = [];\n const placements = new Array<AtlasPlacement>(textures.length);\n const items = textures\n .map((texture, index) => ({\n height: Math.max(1, Math.floor(texture.image.height * scale)),\n index,\n width: Math.max(1, Math.floor(texture.image.width * scale))\n }))\n .sort((a, b) => b.height - a.height || b.width - a.width);\n\n for (const item of items) {\n let placement: AtlasPlacement | undefined;\n for (let layer = 0; layer < pages.length && !placement; layer++) {\n const page = pages[layer];\n for (const shelf of page.shelves) {\n if (\n item.height <= shelf.height &&\n shelf.x + item.width <= pageSize\n ) {\n placement = {\n height: item.height, index: item.index, width: item.width,\n layer,\n x: shelf.x,\n y: shelf.y\n };\n shelf.x += item.width;\n break;\n }\n }\n if (!placement && page.nextY + item.height <= pageSize) {\n placement = {\n height: item.height, index: item.index, width: item.width,\n layer,\n x: 0,\n y: page.nextY\n };\n page.shelves.push({\n height: item.height,\n x: item.width,\n y: page.nextY\n });\n page.nextY += item.height;\n }\n }\n\n if (!placement) {\n const layer = pages.length;\n placement = { height: item.height, index: item.index, width: item.width, layer, x: 0, y: 0 };\n pages.push({\n nextY: item.height,\n placements: [],\n shelves: [{ height: item.height, x: item.width, y: 0 }]\n });\n }\n pages[placement.layer].placements.push(placement);\n placements[item.index] = placement;\n }\n\n return { pages, placements };\n}\n\n\nexport function planTextureAtlas(textures: TextureState[], mapColorLinear: number[], options: MaterialTableOptions = {},\n floatStorage = mapColorLinear.some(value => !!value)) {\n const bytesPerPixel = floatStorage ? 8 : 4;\n if (!textures.length) return { pages: [] as AtlasPage[], placements: [] as AtlasPlacement[],\n width: 1, height: 1, floatStorage, bytesPerPixel, mapInfo: [] as number[],\n mapTransform: [] as number[], mapWrap: [] as number[], mapUvChannel: [] as number[], mapColorLinear,\n stats: {estimatedBytes: 0, height: 1, layers: 0, packTimeMs: 0, scale: 1,\n sourcePixels: 0, textureCount: 0, width: 1} };\n const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;\n const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;\n const maxTextureArrayBytes =\n options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n const sourcePixels = textures.reduce(\n (sum, texture) => sum + texture.image.width * texture.image.height,\n 0\n );\n const maxSourceDimension = textures.reduce(\n (max, texture) =>\n Math.max(max, texture.image.width, texture.image.height),\n 1\n );\n const maxPageSizeFromBudget = Math.max(\n 1,\n Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel))\n );\n const pageSize = Math.max(\n 1,\n Math.floor(\n Math.min(\n maxSourceDimension,\n maxTextureDimension2D,\n maxPageSizeFromBudget\n )\n )\n );\n const pageBytes = pageSize * pageSize * bytesPerPixel;\n const maxPageCount = Math.max(\n 1,\n Math.min(\n maxTextureArrayLayers,\n Math.floor(maxTextureArrayBytes / pageBytes)\n )\n );\n const maxScale = Math.min(1, pageSize / maxSourceDimension);\n let packed = packTextureAtlas(textures, pageSize, maxScale);\n let scale = maxScale;\n\n if (packed.pages.length > maxPageCount) {\n let low = 0;\n let high = maxScale;\n let bestPacked: ReturnType<typeof packTextureAtlas> | undefined;\n let bestScale = 0;\n for (let i = 0; i < 14; i++) {\n const candidateScale = (low + high) / 2;\n const candidate = packTextureAtlas(\n textures,\n pageSize,\n candidateScale\n );\n if (candidate.pages.length <= maxPageCount) {\n low = candidateScale;\n bestScale = candidateScale;\n bestPacked = candidate;\n } else {\n high = candidateScale;\n }\n }\n if (!bestPacked) {\n throw new Error(\n `Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`\n );\n }\n packed = bestPacked;\n scale = bestScale;\n }\n\n const atlasWidth = packed.placements.reduce((max, placement) => Math.max(max, placement.x + placement.width), 1);\n const atlasHeight = packed.placements.reduce((max, placement) => Math.max(max, placement.y + placement.height), 1);\n // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].\n // Packing layer and X offset into one float keeps the shader metadata to one\n // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.\n const mapInfo = packed.placements.flatMap((placement) => {\n const offsetX = (placement.x + 0.5) / atlasWidth;\n const offsetY = (placement.y + 0.5) / atlasHeight;\n return [\n Math.max(placement.width - 1, 0) / atlasWidth,\n Math.max(placement.height - 1, 0) / atlasHeight,\n placement.layer + offsetX,\n offsetY\n ];\n });\n\n return { pages: packed.pages, placements: packed.placements, width: atlasWidth, height: atlasHeight,\n floatStorage, bytesPerPixel, mapInfo,\n mapTransform: textures.flatMap(texture => [texture.uvScale[0], texture.uvScale[1], texture.uvOffset[0], texture.uvOffset[1]]),\n mapWrap: textures.flatMap(texture => [textureWrapIndex(texture.wrapS), textureWrapIndex(texture.wrapT)]),\n mapUvChannel: textures.map(texture => texture.uvChannel), mapColorLinear,\n stats: { estimatedBytes: atlasWidth * atlasHeight * packed.pages.length * bytesPerPixel,\n height: atlasHeight, layers: packed.pages.length, packTimeMs: 0, scale, sourcePixels,\n textureCount: textures.length, width: atlasWidth } };\n}\nexport type TextureAtlasPlan = ReturnType<typeof planTextureAtlas>;\n"]}
@@ -0,0 +1,7 @@
1
+ import type { TextureDataSource } from '../scene/textureData.js';
2
+ import type { AtlasPlacement } from './textureAtlas.js';
3
+ export declare function writeAtlasPixel(data: Uint16Array | Uint8Array, index: number, value: number): void;
4
+ export declare function writeRawAtlasPlacement(data: Uint16Array | Uint8Array, width: number, placement: AtlasPlacement, texture: {
5
+ image: TextureDataSource;
6
+ flipY: boolean;
7
+ }, floatStorage: boolean): void;
@@ -0,0 +1,68 @@
1
+ import { pixelLength, pixelValue } from '../scene/texturePixels.js';
2
+ import { float16Bits } from './float16.js';
3
+ export function writeAtlasPixel(data, index, value) {
4
+ data[index] = value;
5
+ }
6
+ export function writeRawAtlasPlacement(data, width, placement, texture, floatStorage) {
7
+ const source = texture.image;
8
+ const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;
9
+ if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {
10
+ throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');
11
+ }
12
+ // A row copy is identical to nearest-neighbour sampling at unit scale. Keep
13
+ // the scalar path for aliases: its left-to-right overwrite order is observable.
14
+ if (!floatStorage && data instanceof Uint8Array && placement.width === source.width && placement.height === source.height) {
15
+ if (source.data instanceof Uint8Array) {
16
+ if (copyAtlasRows(data, width, placement, source.data, source.width, source.height, texture.flipY))
17
+ return;
18
+ }
19
+ if (source.data instanceof Uint8ClampedArray) {
20
+ if (copyAtlasRows(data, width, placement, source.data, source.width, source.height, texture.flipY))
21
+ return;
22
+ }
23
+ }
24
+ if (data instanceof Uint16Array)
25
+ return writeAtlasSource(data, width, placement, texture, floatStorage);
26
+ return writeAtlasSource(data, width, placement, texture, floatStorage);
27
+ }
28
+ function copyAtlasRows(data, width, placement, source, sourceWidth, sourceHeight, flipY) {
29
+ if (pixelLength(source) !== sourceWidth * sourceHeight * 4)
30
+ throw new Error('Material texture RGBA source length does not match its dimensions.');
31
+ if (source.buffer === data.buffer)
32
+ return false;
33
+ const rowBytes = sourceWidth * 4;
34
+ for (let y = 0; y < placement.height; y++) {
35
+ const sourceY = flipY ? sourceHeight - y - 1 : y;
36
+ data.set(source.subarray(sourceY * rowBytes, (sourceY + 1) * rowBytes), ((placement.y + y) * width + placement.x) * 4);
37
+ }
38
+ return true;
39
+ }
40
+ function writeAtlasSource(data, width, placement, texture, floatStorage) {
41
+ const source = texture.image;
42
+ if (source.data instanceof Uint8Array)
43
+ return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 255);
44
+ if (source.data instanceof Uint8ClampedArray)
45
+ return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 255);
46
+ if (source.data instanceof Float32Array)
47
+ return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 1);
48
+ return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 1);
49
+ }
50
+ function writeAtlasKernel(data, width, placement, source, sourceWidth, sourceHeight, flipY, floatStorage, scale) {
51
+ if (pixelLength(source) !== sourceWidth * sourceHeight * 4)
52
+ throw new Error('Material texture RGBA source length does not match its dimensions.');
53
+ for (let y = 0; y < placement.height; y++) {
54
+ let sourceY = Math.min(sourceHeight - 1, Math.floor(((y + 0.5) * sourceHeight) / placement.height));
55
+ if (flipY)
56
+ sourceY = sourceHeight - 1 - sourceY;
57
+ for (let x = 0; x < placement.width; x++) {
58
+ const sourceX = Math.min(sourceWidth - 1, Math.floor(((x + 0.5) * sourceWidth) / placement.width));
59
+ const sourceOffset = (sourceY * sourceWidth + sourceX) * 4;
60
+ const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;
61
+ for (let c = 0; c < 4; c++) {
62
+ const value = pixelValue(source, sourceOffset + c);
63
+ writeAtlasPixel(data, targetOffset + c, floatStorage ? float16Bits(value / scale) : value);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=textureAtlasPixels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textureAtlasPixels.js","sourceRoot":"","sources":["../../src/renderer/textureAtlasPixels.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TextureDataSource } from '../scene/textureData.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.js';\nimport type { AtlasPlacement } from './textureAtlas.js';\nimport { float16Bits } from './float16.js';\n\nexport function writeAtlasPixel(data: Uint16Array | Uint8Array, index: number, value: number) {\n data[index] = value;\n}\nexport function writeRawAtlasPlacement(data: Uint16Array | Uint8Array, width: number,\n placement: AtlasPlacement, texture: {image: TextureDataSource; flipY: boolean}, floatStorage: boolean) {\n const source = texture.image;\n const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;\n if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {\n throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');\n }\n // A row copy is identical to nearest-neighbour sampling at unit scale. Keep\n // the scalar path for aliases: its left-to-right overwrite order is observable.\n if (!floatStorage && data instanceof Uint8Array && placement.width === source.width && placement.height === source.height) {\n if (source.data instanceof Uint8Array) {\n if (copyAtlasRows(data, width, placement, source.data, source.width, source.height, texture.flipY)) return;\n }\n if (source.data instanceof Uint8ClampedArray) {\n if (copyAtlasRows(data, width, placement, source.data, source.width, source.height, texture.flipY)) return;\n }\n }\n if (data instanceof Uint16Array) return writeAtlasSource(data, width, placement, texture, floatStorage);\n return writeAtlasSource(data, width, placement, texture, floatStorage);\n}\n\nfunction copyAtlasRows<S extends Uint8Array | Uint8ClampedArray>(data: Uint8Array, width: number,\n placement: AtlasPlacement, source: S, sourceWidth: number, sourceHeight: number, flipY: boolean) {\n if (pixelLength(source) !== sourceWidth * sourceHeight * 4) throw new Error('Material texture RGBA source length does not match its dimensions.');\n if (source.buffer === data.buffer) return false;\n const rowBytes = sourceWidth * 4;\n for (let y = 0; y < placement.height; y++) {\n const sourceY = flipY ? sourceHeight - y - 1 : y;\n data.set(source.subarray(sourceY * rowBytes, (sourceY + 1) * rowBytes), ((placement.y + y) * width + placement.x) * 4);\n }\n return true;\n}\n\nfunction writeAtlasSource<D extends Uint16Array | Uint8Array>(data: D, width: number,\n placement: AtlasPlacement, texture: {image: TextureDataSource; flipY: boolean}, floatStorage: boolean) {\n const source = texture.image;\n if (source.data instanceof Uint8Array) return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 255);\n if (source.data instanceof Uint8ClampedArray) return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 255);\n if (source.data instanceof Float32Array) return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 1);\n return writeAtlasKernel(data, width, placement, source.data, source.width, source.height, texture.flipY, floatStorage, 1);\n}\n\nfunction writeAtlasKernel<D extends Uint16Array | Uint8Array, S extends TextureDataSource['data']>(\n data: D, width: number, placement: AtlasPlacement, source: S,\n sourceWidth: number, sourceHeight: number, flipY: boolean, floatStorage: boolean, scale: number) {\n if (pixelLength(source) !== sourceWidth * sourceHeight * 4) throw new Error('Material texture RGBA source length does not match its dimensions.');\n for (let y = 0; y < placement.height; y++) {\n let sourceY = Math.min(sourceHeight - 1, Math.floor(((y + 0.5) * sourceHeight) / placement.height));\n if (flipY) sourceY = sourceHeight - 1 - sourceY;\n for (let x = 0; x < placement.width; x++) {\n const sourceX = Math.min(sourceWidth - 1, Math.floor(((x + 0.5) * sourceWidth) / placement.width));\n const sourceOffset = (sourceY * sourceWidth + sourceX) * 4;\n const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;\n for (let c = 0; c < 4; c++) {\n const value = pixelValue(source, sourceOffset + c);\n writeAtlasPixel(data, targetOffset + c, floatStorage ? float16Bits(value / scale) : value);\n }\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { WritableArrayLike } from '../types.js';
1
+ import type { WritableArrayLike } from '../types.js';
2
2
  export declare function clamp(x: number, min: number, max: number): number;
3
3
  export declare function shuffle(arr: WritableArrayLike<number>, rand: () => number): WritableArrayLike<number>;
4
4
  export declare function numberArraysEqual(a: ArrayLike<number>, b: ArrayLike<number>, eps?: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/renderer/util.ts"],"names":[],"mappings":"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","sourcesContent":["import {createCanvas} from '../util/canvas.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { WritableArrayLike } from '../types.js';\n\nexport function clamp(x: number, min: number, max: number) {\n return Math.min(Math.max(x, min), max);\n}\n\nexport function shuffle(arr: WritableArrayLike<number>, rand: () => number) {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(rand() * (i + 1));\n const x = arr[i];\n arr[i] = arr[j];\n arr[j] = x;\n }\n return arr;\n}\n\nexport function numberArraysEqual(\n a: ArrayLike<number>,\n b: ArrayLike<number>,\n eps = 1e-4\n) {\n for (let i = 0; i < a.length; i++) {\n if (Math.abs(a[i] - b[i]) > eps) {\n return false;\n }\n }\n\n return true;\n}\nexport const isMac =\n typeof navigator !== 'undefined' && navigator.userAgent.match('Macintosh');\n\nlet cachedIntelMac: boolean | undefined;\n\n/** Detect the WebGL workaround platform only when the WebGL backend needs it. */\nexport function isIntelMac() {\n if (cachedIntelMac !== undefined) return cachedIntelMac;\n cachedIntelMac = false;\n if (isMac) {\n try {\n const ctx = createCanvas().getContext('webgl') as WebGLRenderingContext | null;\n const d = ctx && ctx.getExtension('WEBGL_debug_renderer_info');\n const g = (d && ctx.getParameter(d.UNMASKED_RENDERER_WEBGL)) || '';\n if (!(g.match(/Apple M/) || g.match(/Apple GPU/))) cachedIntelMac = true;\n } catch (e) {}\n }\n return cachedIntelMac;\n}\n\n/** Lowest resolution scale interactive preview adapts down to. */\nexport const MIN_PREVIEW_SCALE = 0.125;\n\n/**\n * Next interactive-preview resolution scale from a preview frame time measured\n * at `measuredScale`. Tracing and denoising cost grow with the pixel count\n * (scale²), so the scale follows the square root of the time ratio. Steps are\n * 1/16 (1/128 below 0.25); a change of less than 15% from `currentScale` keeps\n * it, because every resolution change restarts sampling.\n */\nexport function nextPreviewScale(\n measuredScale: number,\n frameTimeMs: number,\n targetTimeMs: number,\n maxScale: number,\n currentScale = measuredScale,\n minScale = MIN_PREVIEW_SCALE\n) {\n const raw = measuredScale * Math.sqrt(targetTimeMs / Math.max(frameTimeMs, 0.1));\n const steps = raw < 0.25 ? 128 : 16;\n const next = clamp(Math.round(raw * steps) / steps, minScale, Math.max(minScale, maxScale));\n return Math.abs(Math.log(next / currentScale)) >= Math.log(1.15) ? next : currentScale;\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/renderer/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAO/C,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW;IACvD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAA8B,EAAE,IAAkB;IACxE,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,CAAoB,EACpB,CAAoB,EACpB,GAAG,GAAG,IAAI;IAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,CAAC,MAAM,KAAK,GAChB,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAE7E,IAAI,cAAmC,CAAC;AAExC,iFAAiF;AACjF,MAAM,UAAU,UAAU;IACxB,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC;IACxD,cAAc,GAAG,KAAK,CAAC;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,UAAU,CAAC,OAAO,CAAiC,CAAC;YAC/E,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC;YAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAAE,cAAc,GAAG,IAAI,CAAC;QAC3E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;IAChB,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,aAAqB,EACrB,WAAmB,EACnB,YAAoB,EACpB,QAAgB,EAChB,YAAY,GAAG,aAAa,EAC5B,QAAQ,GAAG,iBAAiB;IAE5B,MAAM,GAAG,GAAG,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;AACzF,CAAC","sourcesContent":["import {createCanvas} from '../util/canvas.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport type { WritableArrayLike } from '../types.js';\n\nexport function clamp(x: number, min: number, max: number) {\n return Math.min(Math.max(x, min), max);\n}\n\nexport function shuffle(arr: WritableArrayLike<number>, rand: () => number) {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(rand() * (i + 1));\n const x = arr[i];\n arr[i] = arr[j];\n arr[j] = x;\n }\n return arr;\n}\n\nexport function numberArraysEqual(\n a: ArrayLike<number>,\n b: ArrayLike<number>,\n eps = 1e-4\n) {\n for (let i = 0; i < a.length; i++) {\n if (Math.abs(a[i] - b[i]) > eps) {\n return false;\n }\n }\n\n return true;\n}\nexport const isMac =\n typeof navigator !== 'undefined' && navigator.userAgent.match('Macintosh');\n\nlet cachedIntelMac: boolean | undefined;\n\n/** Detect the WebGL workaround platform only when the WebGL backend needs it. */\nexport function isIntelMac() {\n if (cachedIntelMac !== undefined) return cachedIntelMac;\n cachedIntelMac = false;\n if (isMac) {\n try {\n const ctx = createCanvas().getContext('webgl') as WebGLRenderingContext | null;\n const d = ctx && ctx.getExtension('WEBGL_debug_renderer_info');\n const g = (d && ctx.getParameter(d.UNMASKED_RENDERER_WEBGL)) || '';\n if (!(g.match(/Apple M/) || g.match(/Apple GPU/))) cachedIntelMac = true;\n } catch (e) {}\n }\n return cachedIntelMac;\n}\n\n/** Lowest resolution scale interactive preview adapts down to. */\nexport const MIN_PREVIEW_SCALE = 0.125;\n\n/**\n * Next interactive-preview resolution scale from a preview frame time measured\n * at `measuredScale`. Tracing and denoising cost grow with the pixel count\n * (scale²), so the scale follows the square root of the time ratio. Steps are\n * 1/16 (1/128 below 0.25); a change of less than 15% from `currentScale` keeps\n * it, because every resolution change restarts sampling.\n */\nexport function nextPreviewScale(\n measuredScale: number,\n frameTimeMs: number,\n targetTimeMs: number,\n maxScale: number,\n currentScale = measuredScale,\n minScale = MIN_PREVIEW_SCALE\n) {\n const raw = measuredScale * Math.sqrt(targetTimeMs / Math.max(frameTimeMs, 0.1));\n const steps = raw < 0.25 ? 128 : 16;\n const next = clamp(Math.round(raw * steps) / steps, minScale, Math.max(minScale, maxScale));\n return Math.abs(Math.log(next / currentScale)) >= Math.log(1.15) ? next : currentScale;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { ShaderCompilationDiagnostics } from './RenderingPipeline.js';
2
- import { FragmentShader, ShaderDefineValue, ShaderUniform } from './shader.js';
2
+ import { FragmentShader, type ShaderDefineValue, type ShaderUniform } from './shader.js';
3
3
  export { FragmentShader, Shader, createShaderMixin, glsl } from './shader.js';
4
4
  export declare const constants: {
5
5
  readonly FLOAT: 5126;
@@ -66,6 +66,10 @@ export declare class Texture2D {
66
66
  protected _ensureTexture(gl: WebGL2RenderingContext): void;
67
67
  protected _bindAndConfigure(gl: WebGL2RenderingContext): void;
68
68
  protected _format(gl: WebGL2RenderingContext, channels?: number): {
69
+ type: 5125;
70
+ format: 36249;
71
+ internalFormat: 36208;
72
+ } | {
69
73
  type: number;
70
74
  format: 6408 | 6403 | 33319 | 6407;
71
75
  internalFormat: 33326 | 33328 | 34837 | 34836 | 33325 | 33327 | 34843 | 34842 | 35907 | 32856;
@@ -92,7 +96,7 @@ export declare class WebGLProgramBindings {
92
96
  setDefine(name: string, value: ShaderDefineValue): void;
93
97
  deleteDefine(name: string): void;
94
98
  getProgram(renderer: WebGLDevice): WebGLProgram;
95
- bind(renderer: WebGLDevice): void;
99
+ bind(renderer: WebGLDevice): boolean;
96
100
  }
97
101
  export interface RendererOptions extends WebGLContextAttributes {
98
102
  canvas: HTMLCanvasElement | OffscreenCanvas;
@@ -107,10 +111,13 @@ export declare class WebGLDevice {
107
111
  private _viewportStack;
108
112
  private _programs;
109
113
  private _parallel?;
114
+ private _pendingPrograms;
115
+ private _programErrors;
110
116
  private _compilationStart;
111
117
  private _compilationRecords;
112
118
  constructor(options: RendererOptions);
113
119
  createProgram(shader: FragmentShader, defines: Record<string, ShaderDefineValue>): WebGLProgram;
120
+ isProgramCompiled(program: WebGLProgram): boolean;
114
121
  /** Cumulative program compilation measurements used by preparation progress. */
115
122
  getShaderCompilationDiagnostics(): ShaderCompilationDiagnostics;
116
123
  isAllProgramCompiled(): boolean;