@meimu/mutracer 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ import { prepareSceneLightSampling } from './sceneAssembly.js';
2
+ /** Alias probabilities are stored as numeric texels; indices retain their bit representation. */
3
+ export function prepareWebGLLightSampling(lights, triangles, environmentPower) {
4
+ const lighting = prepareSceneLightSampling(lights, triangles, environmentPower, 4096);
5
+ const pmfOffset = lighting.emissiveTexels + lighting.choiceCount;
6
+ const data = new Float32Array(Math.max(1, pmfOffset + lighting.choiceCount) * 4);
7
+ data.set(lighting.lightData.subarray(0, pmfOffset * 4));
8
+ const words = new Int32Array(data.buffer);
9
+ for (let i = 0; i < lighting.choiceCount; i++) {
10
+ const type = words[(lighting.emissiveTexels + i) * 4 + 2], source = words[(lighting.emissiveTexels + i) * 4 + 3];
11
+ data[(pmfOffset + i) * 4] = type === 1 ? lighting.environmentPmf : type === 2 ? lighting.analyticPmfs[source] : triangles[source].selectionPmf;
12
+ }
13
+ return { ...lighting, data, pmfOffset };
14
+ }
15
+ //# sourceMappingURL=webglLightSampling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webglLightSampling.js","sourceRoot":"","sources":["../../src/renderer/webglLightSampling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAG7D,iGAAiG;AACjG,MAAM,UAAU,yBAAyB,CAAC,MAA4B,EAAE,SAA6B,EAAE,gBAAwB;IAC7H,MAAM,QAAQ,GAAC,yBAAyB,CAAC,MAAM,EAAC,SAAS,EAAC,gBAAgB,EAAC,IAAI,CAAC,CAAC;IACjF,MAAM,SAAS,GAAC,QAAQ,CAAC,cAAc,GAAC,QAAQ,CAAC,WAAW,CAAC;IAC7D,MAAM,IAAI,GAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,SAAS,GAAC,QAAQ,CAAC,WAAW,CAAC,GAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAC,SAAS,GAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,QAAQ,CAAC,WAAW,EAAC,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,cAAc,GAAC,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC,EAAC,MAAM,GAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,cAAc,GAAC,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,CAAC,SAAS,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,IAAI,KAAG,CAAC,CAAA,CAAC,CAAA,QAAQ,CAAC,cAAc,CAAA,CAAC,CAAA,IAAI,KAAG,CAAC,CAAA,CAAC,CAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,SAAS,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC;IAC/H,CAAC;IACD,OAAO,EAAC,GAAG,QAAQ,EAAC,IAAI,EAAC,SAAS,EAAC,CAAC;AACtC,CAAC","sourcesContent":["import {prepareSceneLightSampling} from './sceneAssembly.js';\nimport type {EmissiveTriangle} from './lightSampling.js';\nimport type {AnalyticLightState} from '../scene/lightState.js';\n/** Alias probabilities are stored as numeric texels; indices retain their bit representation. */\nexport function prepareWebGLLightSampling(lights: AnalyticLightState[], triangles: EmissiveTriangle[], environmentPower: number) {\n const lighting=prepareSceneLightSampling(lights,triangles,environmentPower,4096);\n const pmfOffset=lighting.emissiveTexels+lighting.choiceCount;\n const data=new Float32Array(Math.max(1,pmfOffset+lighting.choiceCount)*4);\n data.set(lighting.lightData.subarray(0,pmfOffset*4));\n const words=new Int32Array(data.buffer);\n for(let i=0;i<lighting.choiceCount;i++) {\n const type=words[(lighting.emissiveTexels+i)*4+2],source=words[(lighting.emissiveTexels+i)*4+3];\n data[(pmfOffset+i)*4]=type===1?lighting.environmentPmf:type===2?lighting.analyticPmfs[source]:triangles[source].selectionPmf;\n }\n return {...lighting,data,pmfOffset};\n}\n"]}
@@ -0,0 +1,26 @@
1
+ export interface ResourceTable {
2
+ readonly size: number;
3
+ update(slot: number, resource: GPUTextureView | GPUSampler): void;
4
+ destroy(): void;
5
+ }
6
+ export interface BindlessSupport {
7
+ feature: GPUFeatureName;
8
+ enable: string;
9
+ }
10
+ export interface MaterialTextureSelection {
11
+ requested: 'atlas' | 'auto';
12
+ support?: BindlessSupport;
13
+ fallbackReason?: string;
14
+ }
15
+ export declare const RESOURCE_TABLE_LIMIT = 65536;
16
+ export declare const FIRST_TEXTURE_SLOT = 10;
17
+ export declare function resourceTableFeature(features: Pick<GPUSupportedFeatures, 'has'>): BindlessSupport | undefined;
18
+ export declare function bindlessLimitReason(device: GPUDevice, count?: number): string | undefined;
19
+ export declare function createResourceTable(device: GPUDevice, size: number): ResourceTable;
20
+ export declare function setResourceTable(pass: GPUComputePassEncoder, table: ResourceTable): void;
21
+ export declare function resourceTableLayout(descriptor: GPUPipelineLayoutDescriptor): {
22
+ usesResourceTable: boolean;
23
+ bindGroupLayouts: Iterable<GPUBindGroupLayout>;
24
+ label?: string;
25
+ };
26
+ export declare function probeBindless(device: GPUDevice, support: BindlessSupport): Promise<string | undefined>;
@@ -0,0 +1,95 @@
1
+ export const RESOURCE_TABLE_LIMIT = 65536;
2
+ export const FIRST_TEXTURE_SLOT = 10;
3
+ export function resourceTableFeature(features) {
4
+ for (const [feature, enable] of [
5
+ ['sampling-resource-table', 'resource_table'],
6
+ ['chromium-experimental-sampling-resource-table', 'chromium_experimental_resource_table']
7
+ ])
8
+ if (features.has(feature))
9
+ return { feature: feature, enable };
10
+ }
11
+ export function bindlessLimitReason(device, count = 0) {
12
+ if (device.limits.maxStorageBuffersPerShaderStage < 9)
13
+ return 'Bindless textures require 9 storage buffers per shader stage.';
14
+ if (count + FIRST_TEXTURE_SLOT > RESOURCE_TABLE_LIMIT)
15
+ return 'Scene exceeds resource-table slot capacity.';
16
+ const bytes = Math.max(1, count) * 48;
17
+ if (bytes > device.limits.maxStorageBufferBindingSize || bytes > device.limits.maxBufferSize)
18
+ return 'Texture metadata exceeds device buffer limits.';
19
+ }
20
+ export function createResourceTable(device, size) {
21
+ return device.createResourceTable({ size, label: 'Material textures' });
22
+ }
23
+ export function setResourceTable(pass, table) {
24
+ pass.setResourceTable(table);
25
+ }
26
+ export function resourceTableLayout(descriptor) {
27
+ return { ...descriptor, usesResourceTable: true };
28
+ }
29
+ const probes = new WeakMap();
30
+ export function probeBindless(device, support) {
31
+ let pending = probes.get(device);
32
+ if (!pending) {
33
+ pending = runProbe(device, support);
34
+ probes.set(device, pending);
35
+ }
36
+ return pending;
37
+ }
38
+ async function runProbe(device, support) {
39
+ const reason = bindlessLimitReason(device);
40
+ if (reason)
41
+ return reason;
42
+ if (typeof device.createResourceTable !== 'function')
43
+ return 'Resource-table API is unavailable.';
44
+ let table;
45
+ const textures = [];
46
+ const buffers = [];
47
+ device.pushErrorScope('validation');
48
+ let failure;
49
+ try {
50
+ table = createResourceTable(device, 3);
51
+ for (let i = 0; i < 2; i++) {
52
+ const texture = device.createTexture({ size: [1, 1], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST });
53
+ textures.push(texture);
54
+ device.queue.writeTexture({ texture }, new Uint8Array(i ? [0, 255, 0, 255] : [255, 0, 0, 255]), { bytesPerRow: 4 }, [1, 1]);
55
+ table.update(i, texture.createView());
56
+ }
57
+ table.update(2, device.createSampler({ minFilter: 'linear', magFilter: 'linear' }));
58
+ const module = device.createShaderModule({ code: `enable ${support.enable};
59
+ @group(0) @binding(0) var<storage, read_write> result: array<vec4f>;
60
+ @compute @workgroup_size(2) fn main(@builtin(local_invocation_index) index: u32) {
61
+ let tex = getResource<texture_2d<f32>>(index);
62
+ let samp = getResource<sampler>(2);
63
+ result[index] = textureSampleLevel(tex, samp, vec2f(0.5), 0.0);
64
+ }` });
65
+ const pipeline = await device.createComputePipelineAsync({ layout: 'auto', compute: { module } });
66
+ const output = device.createBuffer({ size: 32, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC });
67
+ const readback = device.createBuffer({ size: 32, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });
68
+ buffers.push(output, readback);
69
+ const group = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [{ binding: 0, resource: { buffer: output } }] });
70
+ const encoder = device.createCommandEncoder(), pass = encoder.beginComputePass();
71
+ pass.setPipeline(pipeline);
72
+ setResourceTable(pass, table);
73
+ pass.setBindGroup(0, group);
74
+ pass.dispatchWorkgroups(1);
75
+ pass.end();
76
+ encoder.copyBufferToBuffer(output, 0, readback, 0, 32);
77
+ device.queue.submit([encoder.finish()]);
78
+ await readback.mapAsync(GPUMapMode.READ);
79
+ const actual = new Float32Array(readback.getMappedRange());
80
+ if ([1, 0, 0, 1, 0, 1, 0, 1].some((value, i) => actual[i] !== value))
81
+ failure = 'Resource-table sampling probe returned incorrect pixels.';
82
+ readback.unmap();
83
+ }
84
+ catch (error) {
85
+ failure = error instanceof Error ? error.message : String(error);
86
+ }
87
+ finally {
88
+ table?.destroy();
89
+ textures.forEach(t => t.destroy());
90
+ buffers.forEach(b => b.destroy());
91
+ }
92
+ const error = await device.popErrorScope();
93
+ return failure ?? error?.message;
94
+ }
95
+ //# sourceMappingURL=wgpuBindless.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuBindless.js","sourceRoot":"","sources":["../../src/renderer/wgpuBindless.ts"],"names":[],"mappings":"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","sourcesContent":["// Browser-only experimental API boundary. Keep native/shared WGSL types unchanged.\nexport interface ResourceTable {\n readonly size: number;\n update(slot: number, resource: GPUTextureView | GPUSampler): void;\n destroy(): void;\n}\nexport interface BindlessSupport { feature: GPUFeatureName; enable: string; }\nexport interface MaterialTextureSelection {\n requested: 'atlas' | 'auto';\n support?: BindlessSupport;\n fallbackReason?: string;\n}\ntype TableDevice = GPUDevice & {createResourceTable(descriptor: {size: number; label?: string}): ResourceTable};\ntype TablePass = GPUComputePassEncoder & {setResourceTable(table: ResourceTable): void};\nexport const RESOURCE_TABLE_LIMIT = 65536;\nexport const FIRST_TEXTURE_SLOT = 10;\nexport function resourceTableFeature(features: Pick<GPUSupportedFeatures, 'has'>): BindlessSupport | undefined {\n for (const [feature, enable] of [\n ['sampling-resource-table', 'resource_table'],\n ['chromium-experimental-sampling-resource-table', 'chromium_experimental_resource_table']\n ]) if (features.has(feature as GPUFeatureName)) return {feature: feature as GPUFeatureName, enable};\n}\nexport function bindlessLimitReason(device: GPUDevice, count = 0): string | undefined {\n if (device.limits.maxStorageBuffersPerShaderStage < 9) return 'Bindless textures require 9 storage buffers per shader stage.';\n if (count + FIRST_TEXTURE_SLOT > RESOURCE_TABLE_LIMIT) return 'Scene exceeds resource-table slot capacity.';\n const bytes = Math.max(1, count) * 48;\n if (bytes > device.limits.maxStorageBufferBindingSize || bytes > device.limits.maxBufferSize) return 'Texture metadata exceeds device buffer limits.';\n}\nexport function createResourceTable(device: GPUDevice, size: number): ResourceTable {\n return (device as TableDevice).createResourceTable({size, label: 'Material textures'});\n}\nexport function setResourceTable(pass: GPUComputePassEncoder, table: ResourceTable) {\n (pass as TablePass).setResourceTable(table);\n}\nexport function resourceTableLayout(descriptor: GPUPipelineLayoutDescriptor) {\n return {...descriptor, usesResourceTable: true};\n}\nconst probes = new WeakMap<GPUDevice, Promise<string | undefined>>();\nexport function probeBindless(device: GPUDevice, support: BindlessSupport): Promise<string | undefined> {\n let pending = probes.get(device);\n if (!pending) { pending = runProbe(device, support); probes.set(device, pending); }\n return pending;\n}\nasync function runProbe(device: GPUDevice, support: BindlessSupport): Promise<string | undefined> {\n const reason = bindlessLimitReason(device);\n if (reason) return reason;\n if (typeof (device as TableDevice).createResourceTable !== 'function') return 'Resource-table API is unavailable.';\n let table: ResourceTable | undefined;\n const textures: GPUTexture[] = [];\n const buffers: GPUBuffer[] = [];\n device.pushErrorScope('validation');\n let failure: string | undefined;\n try {\n table = createResourceTable(device, 3);\n for (let i = 0; i < 2; i++) {\n const texture = device.createTexture({size: [1, 1], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST});\n textures.push(texture);\n device.queue.writeTexture({texture}, new Uint8Array(i ? [0,255,0,255] : [255,0,0,255]), {bytesPerRow: 4}, [1,1]);\n table.update(i, texture.createView());\n }\n table.update(2, device.createSampler({minFilter: 'linear', magFilter: 'linear'}));\n const module = device.createShaderModule({code: `enable ${support.enable};\n@group(0) @binding(0) var<storage, read_write> result: array<vec4f>;\n@compute @workgroup_size(2) fn main(@builtin(local_invocation_index) index: u32) {\n let tex = getResource<texture_2d<f32>>(index);\n let samp = getResource<sampler>(2);\n result[index] = textureSampleLevel(tex, samp, vec2f(0.5), 0.0);\n}`});\n const pipeline = await device.createComputePipelineAsync({layout: 'auto', compute: {module}});\n const output = device.createBuffer({size: 32, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC});\n const readback = device.createBuffer({size: 32, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});\n buffers.push(output, readback);\n const group = device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries: [{binding: 0, resource: {buffer: output}}]});\n const encoder = device.createCommandEncoder(), pass = encoder.beginComputePass();\n pass.setPipeline(pipeline); setResourceTable(pass, table); pass.setBindGroup(0, group); pass.dispatchWorkgroups(1); pass.end();\n encoder.copyBufferToBuffer(output, 0, readback, 0, 32); device.queue.submit([encoder.finish()]);\n await readback.mapAsync(GPUMapMode.READ);\n const actual = new Float32Array(readback.getMappedRange());\n if ([1,0,0,1,0,1,0,1].some((value, i) => actual[i] !== value)) failure = 'Resource-table sampling probe returned incorrect pixels.';\n readback.unmap();\n } catch (error) { failure = error instanceof Error ? error.message : String(error); }\n finally { table?.destroy(); textures.forEach(t => t.destroy()); buffers.forEach(b => b.destroy()); }\n const error = await device.popErrorScope();\n return failure ?? error?.message;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function bindlessShaderSource(source: string, enable: string): string;
2
+ export declare function bindlessBindGroupLayouts(): GPUBindGroupLayoutDescriptor[];
@@ -0,0 +1,51 @@
1
+ import { rayTraceBindGroupLayouts } from './sceneLayoutSchema.js';
2
+ // Browser-only adaptation of the shared generator. Fail clearly if its sampling
3
+ // boundary changes during native refactoring, instead of silently mixing layouts.
4
+ export function bindlessShaderSource(source, enable) {
5
+ const start = source.indexOf('fn decodeMapColor(');
6
+ const end = source.indexOf('fn getMaterialEmission(', start);
7
+ const declarations = /@group\(1\) @binding\(0\) var mapSampler: sampler;[\s\S]*?@group\(1\) @binding\(3\) var<uniform> mapInfo: array<vec4f, NUM_MAPS \* 3>;/;
8
+ if (start < 0 || end < start || !declarations.test(source))
9
+ throw new Error('Shared shader material sampling boundary changed.');
10
+ return `enable ${enable};\n` + (source.slice(0, start) + sampling + source.slice(end)).replace(declarations, metadata)
11
+ .replace(/mapInfo\[([^\]\n]+) \+ NUM_MAPS \* 2\]\.x > 0\.5/g, 'materialTextureInfo[$1].resources.z != 0u')
12
+ .replace(/@group\((\d)\) @binding\((\d+)\)/g, (declaration, group, binding) => {
13
+ const index = Number(group);
14
+ return index === 0 ? declaration : `@group(${index === 1 ? 0 : index - 1}) @binding(${Number(binding) + (index === 1 ? 4 : 0)})`;
15
+ });
16
+ }
17
+ export function bindlessBindGroupLayouts() {
18
+ const layouts = rayTraceBindGroupLayouts().map((layout, group) => group !== 1 ? layout : {
19
+ ...layout, entries: Array.from(layout.entries).filter(e => e.binding !== 0 && e.binding !== 1).map(e => e.binding === 3 ? { binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'read-only-storage' } } : e)
20
+ });
21
+ // Resource tables consume one of maxBindGroups. Merge scene + textures so
22
+ // the browser optional path still fits a device exposing four groups.
23
+ return [{ label: 'Bindless scene', entries: [
24
+ ...layouts[0].entries, ...Array.from(layouts[1].entries).map(e => ({ ...e, binding: e.binding + 4 }))
25
+ ] }, layouts[2], layouts[3]];
26
+ }
27
+ const metadata = /* wgsl */ `struct MaterialTextureInfo {
28
+ uvTransform: vec4f,
29
+ resources: vec4u,
30
+ extent: vec4u,
31
+ };
32
+ @group(1) @binding(3) var<storage, read> materialTextureInfo: array<MaterialTextureInfo>;`;
33
+ const sampling = /* wgsl */ `fn decodeMapColor(idx: i32, c: vec3f) -> vec3f {
34
+ if (materialTextureInfo[idx].resources.w != 0u) { return c; }
35
+ return mq(c);
36
+ }
37
+ fn af(val: i32) -> vec2f {
38
+ return vec2f(f32(val >> 8), f32(val & 0xff) / 255.0);
39
+ }
40
+ fn jv(idx: i32) -> vec2f { return vec2f(materialTextureInfo[idx].extent.xy); }
41
+ fn getMapUvSet(idx: i32, uv: vec2f, uv1: vec2f) -> vec2f {
42
+ return select(uv, uv1, materialTextureInfo[idx].resources.z != 0u);
43
+ }
44
+ fn sampleMap(idx: i32, uv: vec2f) -> vec4f {
45
+ let info = materialTextureInfo[idx];
46
+ let tex = getResource<texture_2d<f32>>(info.resources.x);
47
+ let samp = getResource<sampler>(info.resources.y);
48
+ return textureSampleLevel(tex, samp, uv * info.uvTransform.xy + info.uvTransform.zw, 0.0);
49
+ }
50
+ `;
51
+ //# sourceMappingURL=wgpuBindlessSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuBindlessSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuBindlessSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAEhE,gFAAgF;AAChF,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,MAAc;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,wIAAwI,CAAC;IAC9J,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACjI,OAAO,UAAU,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;SACnH,OAAO,CAAC,mDAAmD,EAAE,2CAA2C,CAAC;SACzG,OAAO,CAAC,mCAAmC,EAAE,CAAC,WAAW,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;QAC5F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACnI,CAAC,CAAC,CAAC;AACP,CAAC;AACD,MAAM,UAAU,wBAAwB;IACtC,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACvF,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACrG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAC,IAAI,EAAE,mBAA4B,EAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACxH,CAAC,CAAC;IACH,0EAA0E;IAC1E,sEAAsE;IACtE,OAAO,CAAC,EAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE;gBACzC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,EAAC,CAAC,CAAC;aACpG,EAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AACD,MAAM,QAAQ,GAAG,UAAU,CAAC;;;;;0FAK8D,CAAC;AAC3F,MAAM,QAAQ,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;CAiB3B,CAAC","sourcesContent":["import {rayTraceBindGroupLayouts} from './sceneLayoutSchema.js';\n\n// Browser-only adaptation of the shared generator. Fail clearly if its sampling\n// boundary changes during native refactoring, instead of silently mixing layouts.\nexport function bindlessShaderSource(source: string, enable: string) {\n const start = source.indexOf('fn decodeMapColor(');\n const end = source.indexOf('fn getMaterialEmission(', start);\n const declarations = /@group\\(1\\) @binding\\(0\\) var mapSampler: sampler;[\\s\\S]*?@group\\(1\\) @binding\\(3\\) var<uniform> mapInfo: array<vec4f, NUM_MAPS \\* 3>;/;\n if (start < 0 || end < start || !declarations.test(source)) throw new Error('Shared shader material sampling boundary changed.');\n return `enable ${enable};\\n` + (source.slice(0, start) + sampling + source.slice(end)).replace(declarations, metadata)\n .replace(/mapInfo\\[([^\\]\\n]+) \\+ NUM_MAPS \\* 2\\]\\.x > 0\\.5/g, 'materialTextureInfo[$1].resources.z != 0u')\n .replace(/@group\\((\\d)\\) @binding\\((\\d+)\\)/g, (declaration, group: string, binding: string) => {\n const index = Number(group);\n return index === 0 ? declaration : `@group(${index === 1 ? 0 : index - 1}) @binding(${Number(binding) + (index === 1 ? 4 : 0)})`;\n });\n}\nexport function bindlessBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n const layouts = rayTraceBindGroupLayouts().map((layout, group) => group !== 1 ? layout : {\n ...layout, entries: Array.from(layout.entries).filter(e => e.binding !== 0 && e.binding !== 1).map(e =>\n e.binding === 3 ? {binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: {type: 'read-only-storage' as const}} : e)\n });\n // Resource tables consume one of maxBindGroups. Merge scene + textures so\n // the browser optional path still fits a device exposing four groups.\n return [{label: 'Bindless scene', entries: [\n ...layouts[0].entries, ...Array.from(layouts[1].entries).map(e => ({...e, binding: e.binding + 4}))\n ]}, layouts[2], layouts[3]];\n}\nconst metadata = /* wgsl */ `struct MaterialTextureInfo {\n uvTransform: vec4f,\n resources: vec4u,\n extent: vec4u,\n};\n@group(1) @binding(3) var<storage, read> materialTextureInfo: array<MaterialTextureInfo>;`;\nconst sampling = /* wgsl */ `fn decodeMapColor(idx: i32, c: vec3f) -> vec3f {\n if (materialTextureInfo[idx].resources.w != 0u) { return c; }\n return sRGBToLinear(c);\n}\nfn unpackMaterialIndex(val: i32) -> vec2f {\n return vec2f(f32(val >> 8), f32(val & 0xff) / 255.0);\n}\nfn getMapSize(idx: i32) -> vec2f { return vec2f(materialTextureInfo[idx].extent.xy); }\nfn getMapUvSet(idx: i32, uv: vec2f, uv1: vec2f) -> vec2f {\n return select(uv, uv1, materialTextureInfo[idx].resources.z != 0u);\n}\nfn sampleMap(idx: i32, uv: vec2f) -> vec4f {\n let info = materialTextureInfo[idx];\n let tex = getResource<texture_2d<f32>>(info.resources.x);\n let samp = getResource<sampler>(info.resources.y);\n return textureSampleLevel(tex, samp, uv * info.uvTransform.xy + info.uvTransform.zw, 0.0);\n}\n`;\n"]}
@@ -0,0 +1,4 @@
1
+ import type MaterialState from '../scene/MaterialState.js';
2
+ import type Geometry from '../scene/Geometry.js';
3
+ import type MaterialData from './MaterialData.js';
4
+ export declare function wgpuMaterialConstants(materials: MaterialState[], materialData: Pick<MaterialData, 'defines' | 'bufferData'>, mergedGeometry: Geometry, bevelSamples: number, previousNumMaps?: number): Record<string, boolean | number>;
@@ -0,0 +1,52 @@
1
+ import { resolveMaterialAlphaMode } from '../scene/MaterialState.js';
2
+ import { materialUsesMedium } from './materialParams.js';
3
+ import { materialTextureFeatures } from './materialTextureSlots.js';
4
+ import { MATERIAL_SHADER_CAPABILITIES } from './shaderCapabilities.js';
5
+ // Same feature decisions for browser pipeline updates and native scene commits.
6
+ export function wgpuMaterialConstants(materials, materialData, mergedGeometry, bevelSamples, previousNumMaps = 0) {
7
+ const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);
8
+ const SPECTRAL = materials.some((m) => m.transmissionDispersionScale > 0);
9
+ const HAS_MEDIUM = materials.some(materialUsesMedium);
10
+ // Retain the atlas uniform capacity when a stage/material is removed.
11
+ // Shrinking the array would rebuild every pipeline again on the next edit.
12
+ const NUM_MAPS = Math.max(Math.ceil(+materialData.defines.NUM_MAPS / 10) * 10, Number(previousNumMaps ?? 0), 20);
13
+ // Either layer's map requires independent normals, including a smooth
14
+ // coat over a mapped base. Unmapped materials retain the shared path.
15
+ const USE_COAT_NORMAL_FRAMES = materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap));
16
+ return {
17
+ MATERIAL_CAPABILITIES: (materials.some(m => m.transmissionWeight !== 0 || !!m.map && m.mapAlphaUsage === 'transmission')
18
+ ? MATERIAL_SHADER_CAPABILITIES.transmission : 0) |
19
+ (materials.some(m => m.baseMetalness !== 0) ? MATERIAL_SHADER_CAPABILITIES.metal : 0),
20
+ // Match the atlas UV selector. Keep the second set when any texture
21
+ // needs it; material/texture edits already rebuild these constants.
22
+ USE_UV1: materialData.bufferData.mapUvChannel.some(channel => channel > 0.5),
23
+ // Isotropic OpenPBR constructs its own basis. Normal mapping uses
24
+ // triangle UV differentials rather than this vertex tangent.
25
+ USE_TANGENT: mergedGeometry.tangent != null &&
26
+ materials.some(material => material.specularAnisotropy > 0 || material.coatAnisotropy > 0 || (!!material.coatNormalMap && material.coatWeight > 0)),
27
+ USE_COAT_NORMAL_FRAMES,
28
+ USE_ANISOTROPY_DIRECTIONS: USE_COAT_NORMAL_FRAMES || materials.some(m => m.specularAnisotropy > 0 && (m.specularAnisotropyModel === 'gltf' || !!m.anisotropyMap || m.specularAnisotropyRotation !== 0) ||
29
+ m.coatAnisotropy > 0 && m.coatAnisotropyRotation !== 0),
30
+ HAS_MEDIUM,
31
+ HAS_SHADOW_CATCHER: materials.some(m => m.shadowCatcher),
32
+ HAS_THIN_FILM: materials.some((material) => material.thinFilmWeight > 0),
33
+ HAS_COAT: materials.some((material) => material.coatWeight > 0),
34
+ HAS_FUZZ: materials.some((material) => material.fuzzWeight > 0),
35
+ HAS_SUBSURFACE: materials.some((material) => material.subsurfaceWeight > 0),
36
+ HAS_BEVEL,
37
+ HAS_ALPHA_MASK: materials.some((m) => resolveMaterialAlphaMode(m) === 'mask'),
38
+ HAS_ALPHA_BLEND: materials.some((m) => resolveMaterialAlphaMode(m) === 'blend'),
39
+ HAS_ALPHA: materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque'),
40
+ SPECTRAL,
41
+ BEVEL_SAMPLES: bevelSamples,
42
+ USE_RR: true,
43
+ // Match WebGL: defer roulette for multiple-scattering SSS paths.
44
+ RR_MAX: HAS_MEDIUM ? 12 : 2,
45
+ NUM_UNIFORM_LIGHTS: 64,
46
+ ...materialData.defines,
47
+ NUM_MAPS,
48
+ ...materialTextureFeatures(materialData.defines),
49
+ USE_NORMAL_MAPS: +materialData.defines.NUM_NORMAL_MAPS > 0
50
+ };
51
+ }
52
+ //# sourceMappingURL=wgpuMaterialConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuMaterialConstants.js","sourceRoot":"","sources":["../../src/renderer/wgpuMaterialConstants.ts"],"names":[],"mappings":"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","sourcesContent":["import type MaterialState from '../scene/MaterialState.js';\nimport { resolveMaterialAlphaMode } from '../scene/MaterialState.js';\nimport type Geometry from '../scene/Geometry.js';\nimport type MaterialData from './MaterialData.js';\nimport { materialUsesMedium } from './materialParams.js';\nimport { materialTextureFeatures } from './materialTextureSlots.js';\nimport {MATERIAL_SHADER_CAPABILITIES} from './shaderCapabilities.js';\n\n// Same feature decisions for browser pipeline updates and native scene commits.\nexport function wgpuMaterialConstants(materials: MaterialState[], materialData: Pick<MaterialData, 'defines' | 'bufferData'>, mergedGeometry: Geometry,\n bevelSamples: number, previousNumMaps = 0): Record<string, boolean | number> {\n const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);\n const SPECTRAL =\n materials.some((m) => m.transmissionDispersionScale > 0);\n const HAS_MEDIUM = materials.some(materialUsesMedium);\n // Retain the atlas uniform capacity when a stage/material is removed.\n // Shrinking the array would rebuild every pipeline again on the next edit.\n const NUM_MAPS = Math.max(\n Math.ceil(+materialData.defines.NUM_MAPS / 10) * 10,\n Number(previousNumMaps ?? 0),\n 20\n );\n\n // Either layer's map requires independent normals, including a smooth\n // coat over a mapped base. Unmapped materials retain the shared path.\n const USE_COAT_NORMAL_FRAMES = materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap));\n\n return {\n MATERIAL_CAPABILITIES:\n (materials.some(m => m.transmissionWeight !== 0 || !!m.map && m.mapAlphaUsage === 'transmission')\n ? MATERIAL_SHADER_CAPABILITIES.transmission : 0) |\n (materials.some(m => m.baseMetalness !== 0) ? MATERIAL_SHADER_CAPABILITIES.metal : 0),\n // Match the atlas UV selector. Keep the second set when any texture\n // needs it; material/texture edits already rebuild these constants.\n USE_UV1: materialData.bufferData.mapUvChannel.some(channel => channel > 0.5),\n // Isotropic OpenPBR constructs its own basis. Normal mapping uses\n // triangle UV differentials rather than this vertex tangent.\n USE_TANGENT: mergedGeometry.tangent != null &&\n materials.some(material => material.specularAnisotropy > 0 || material.coatAnisotropy > 0 || (!!material.coatNormalMap && material.coatWeight > 0)),\n\n USE_COAT_NORMAL_FRAMES,\n USE_ANISOTROPY_DIRECTIONS: USE_COAT_NORMAL_FRAMES || materials.some(m =>\n m.specularAnisotropy > 0 && (m.specularAnisotropyModel === 'gltf' || !!m.anisotropyMap || m.specularAnisotropyRotation !== 0) ||\n m.coatAnisotropy > 0 && m.coatAnisotropyRotation !== 0),\n HAS_MEDIUM,\n HAS_SHADOW_CATCHER: materials.some(m => m.shadowCatcher),\n HAS_THIN_FILM: materials.some((material) => material.thinFilmWeight > 0),\n HAS_COAT: materials.some((material) => material.coatWeight > 0),\n HAS_FUZZ: materials.some((material) => material.fuzzWeight > 0),\n HAS_SUBSURFACE: materials.some((material) => material.subsurfaceWeight > 0),\n HAS_BEVEL,\n HAS_ALPHA_MASK: materials.some(\n (m) => resolveMaterialAlphaMode(m) === 'mask'\n ),\n HAS_ALPHA_BLEND: materials.some(\n (m) => resolveMaterialAlphaMode(m) === 'blend'\n ),\n HAS_ALPHA: materials.some(\n (m) => resolveMaterialAlphaMode(m) !== 'opaque'\n ),\n\n SPECTRAL,\n BEVEL_SAMPLES: bevelSamples,\n\n USE_RR: true,\n // Match WebGL: defer roulette for multiple-scattering SSS paths.\n RR_MAX: HAS_MEDIUM ? 12 : 2,\n\n NUM_UNIFORM_LIGHTS: 64,\n\n ...materialData.defines,\n\n NUM_MAPS,\n ...materialTextureFeatures(materialData.defines),\n USE_NORMAL_MAPS: +materialData.defines.NUM_NORMAL_MAPS > 0\n };\n\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';
2
+ export declare const WGPU_SCENE_BUFFER_MIN_BYTES = 200;
3
+ export declare function makeRayTraceUniform(): {
4
+ buffer: ArrayBuffer;
5
+ views: {
6
+ outputSize: Float32Array<ArrayBuffer>;
7
+ sampleCount: Float32Array<ArrayBuffer>;
8
+ scaleOffset: Float32Array<ArrayBuffer>;
9
+ lightsCount: Int32Array<ArrayBuffer>;
10
+ transmissiveOutputAlphaMin: Float32Array<ArrayBuffer>;
11
+ jitter: Float32Array<ArrayBuffer>;
12
+ backgroundColor: Float32Array<ArrayBuffer>;
13
+ groundedBackgroundParams: Float32Array<ArrayBuffer>;
14
+ groundedBackgroundCenter: Float32Array<ArrayBuffer>;
15
+ blasOffset: Int32Array<ArrayBuffer>;
16
+ isEmpty: Int32Array<ArrayBuffer>;
17
+ bevel: Int32Array<ArrayBuffer>;
18
+ dispersionWavelengths: Int32Array<ArrayBuffer>;
19
+ envLightPmf: Float32Array<ArrayBuffer>;
20
+ lightChoiceCount: Int32Array<ArrayBuffer>;
21
+ lightWeightTotal: Float32Array<ArrayBuffer>;
22
+ lightSamplingTextureWidth: Int32Array<ArrayBuffer>;
23
+ lightChoiceTexelOffset: Int32Array<ArrayBuffer>;
24
+ bounces: Int32Array<ArrayBuffer>;
25
+ varianceMoments: Int32Array<ArrayBuffer>;
26
+ adaptiveSampling: Int32Array<ArrayBuffer>;
27
+ clamping: Float32Array<ArrayBuffer>;
28
+ directLightCandidates: Int32Array<ArrayBuffer>;
29
+ backgroundFlags: Int32Array<ArrayBuffer>;
30
+ loopUnrollGuard: Uint32Array<ArrayBuffer>;
31
+ sceneFeatureFlags: Uint32Array<ArrayBuffer>;
32
+ sequenceSeed: Uint32Array<ArrayBuffer>;
33
+ zSobolLogSPP: Uint32Array<ArrayBuffer>;
34
+ sampleSequenceOffset: Uint32Array<ArrayBuffer>;
35
+ shadowCatcherChoiceOffset: Int32Array<ArrayBuffer>;
36
+ shadowCatcherChoiceCount: Int32Array<ArrayBuffer>;
37
+ environmentRotation: Float32Array<ArrayBuffer>;
38
+ backgroundMapTransform: Float32Array<ArrayBuffer>;
39
+ backgroundMapRotation: Float32Array<ArrayBuffer>;
40
+ };
41
+ };
42
+ export declare function packWgpuAnalyticLights(lights: AnalyticLight[], texturesIndices: number[], selectionPmfs: number[], iesProfileTexelOffset: (index: number) => number | undefined): Float32Array<ArrayBuffer>;
@@ -0,0 +1,125 @@
1
+ import { matrixStorage } from '../math/storage.js';
2
+ import { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';
3
+ import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';
4
+ import { read } from '../math/access.js';
5
+ export const WGPU_SCENE_BUFFER_MIN_BYTES = 200;
6
+ const FIXED_LIGHT_COUNT = 64;
7
+ const PIXELS_PER_LIGHT = 6;
8
+ export function makeRayTraceUniform() {
9
+ // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html
10
+ const RayTraceUniformValues = new ArrayBuffer(320);
11
+ const RayTraceUniformViews = {
12
+ outputSize: new Float32Array(RayTraceUniformValues, 0, 2),
13
+ sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),
14
+ scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),
15
+ lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),
16
+ transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),
17
+ jitter: new Float32Array(RayTraceUniformValues, 40, 2),
18
+ backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),
19
+ groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),
20
+ groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),
21
+ blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),
22
+ isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),
23
+ bevel: new Int32Array(RayTraceUniformValues, 96, 1),
24
+ dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),
25
+ envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),
26
+ lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),
27
+ lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),
28
+ lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),
29
+ lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),
30
+ bounces: new Int32Array(RayTraceUniformValues, 124, 1),
31
+ varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),
32
+ adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),
33
+ clamping: new Float32Array(RayTraceUniformValues, 136, 1),
34
+ directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),
35
+ backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),
36
+ loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),
37
+ sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),
38
+ sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),
39
+ zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),
40
+ sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),
41
+ // Shadow-catcher light table, relative to lightChoiceTexelOffset.
42
+ shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),
43
+ shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),
44
+ environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),
45
+ backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),
46
+ backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)
47
+ };
48
+ // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for
49
+ // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.
50
+ RayTraceUniformViews.loopUnrollGuard[0] = 4;
51
+ RayTraceUniformViews.environmentRotation.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
52
+ RayTraceUniformViews.backgroundMapRotation.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
53
+ RayTraceUniformViews.backgroundMapTransform.set([1, 0, 1, 0]);
54
+ RayTraceUniformViews.bevel[0] = 1;
55
+ RayTraceUniformViews.dispersionWavelengths[0] = 3;
56
+ return {
57
+ buffer: RayTraceUniformValues,
58
+ views: RayTraceUniformViews
59
+ };
60
+ }
61
+ export function packWgpuAnalyticLights(lights, texturesIndices, selectionPmfs, iesProfileTexelOffset) {
62
+ validateSceneLights(lights);
63
+ const numLights = lights.length;
64
+ if (numLights > FIXED_LIGHT_COUNT) {
65
+ console.warn(`Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`);
66
+ }
67
+ const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);
68
+ function packVec3(idx, v) {
69
+ for (let i = 0; i < 3; i++) {
70
+ data[i + idx * 4] = read(v, i);
71
+ }
72
+ }
73
+ const lightTypeConstants = {
74
+ DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,
75
+ SphereLight: CONSTANT_SPHERE_LIGHT,
76
+ RectLight: CONSTANT_RECT_LIGHT,
77
+ SpotLight: CONSTANT_SPOT_LIGHT
78
+ };
79
+ for (let i = 0; i < numLights; i++) {
80
+ const light = lights[i];
81
+ const matrix = matrixStorage(light.transform);
82
+ const color = light.color;
83
+ const intensity = light.intensity;
84
+ const off = i * PIXELS_PER_LIGHT;
85
+ packVec3(off, [matrix[12], matrix[13], matrix[14]]);
86
+ data[off * 4 + 3] = lightTypeConstants[light.type];
87
+ // emission
88
+ const emissionScale = light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;
89
+ packVec3(off + 1, [
90
+ color[0] * emissionScale,
91
+ color[1] * emissionScale,
92
+ color[2] * emissionScale
93
+ ]);
94
+ if (light.type === 'RectLight') {
95
+ data[(off + 1) * 4 + 3] = getRectLightArea(light);
96
+ packVec3(off + 2, getRectLightUOrV(light, 0));
97
+ data[(off + 2) * 4 + 3] = light.spread;
98
+ packVec3(off + 3, getRectLightUOrV(light, 1));
99
+ }
100
+ else if (light.type === 'SphereLight') {
101
+ data[(off + 1) * 4 + 3] = getSphereLightArea(light);
102
+ data[(off + 2) * 4 + 3] = light.radius;
103
+ }
104
+ else if (light.type === 'SpotLight') {
105
+ data[(off + 1) * 4 + 3] = getSpotLightArea(light);
106
+ packVec3(off + 2, getLightDirection(light));
107
+ data[(off + 2) * 4 + 3] = light.radius;
108
+ packVec3(off + 3, [
109
+ Math.cos((light.outerAngle * Math.PI) / 180),
110
+ Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),
111
+ 0
112
+ ]);
113
+ }
114
+ else if (light.type === 'DirectionalLight') {
115
+ packVec3(off + 2, getLightDirection(light));
116
+ }
117
+ data[(off + 3) * 4 + 3] = light.type === 'SpotLight'
118
+ ? iesProfileTexelOffset(i) ?? -1
119
+ : texturesIndices[i] ?? -1;
120
+ data[(off + 4) * 4] = selectionPmfs[i] ?? 0;
121
+ packVec3(off + 5, getRigidLightFrame(light).x);
122
+ }
123
+ return data;
124
+ }
125
+ //# sourceMappingURL=wgpuSceneUniform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuSceneUniform.js","sourceRoot":"","sources":["../../src/renderer/wgpuSceneUniform.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type {ReadonlyMathArray} from '../math/types.js';\nimport { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read } from '../math/access.js';\nexport const WGPU_SCENE_BUFFER_MIN_BYTES = 200;\nconst FIXED_LIGHT_COUNT = 64;\nconst PIXELS_PER_LIGHT = 6;\n\nexport function makeRayTraceUniform() {\n // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html\n const RayTraceUniformValues = new ArrayBuffer(320);\n const RayTraceUniformViews = {\n outputSize: new Float32Array(RayTraceUniformValues, 0, 2),\n sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),\n scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),\n lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),\n transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),\n jitter: new Float32Array(RayTraceUniformValues, 40, 2),\n backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),\n groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),\n groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),\n blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),\n isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),\n bevel: new Int32Array(RayTraceUniformValues, 96, 1),\n dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),\n envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),\n lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),\n lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),\n lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),\n lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),\n bounces: new Int32Array(RayTraceUniformValues, 124, 1),\n varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),\n adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),\n clamping: new Float32Array(RayTraceUniformValues, 136, 1),\n directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),\n backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),\n loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),\n sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),\n sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),\n zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),\n sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),\n shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),\n environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),\n backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),\n backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)\n };\n // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for\n // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.\n RayTraceUniformViews.loopUnrollGuard[0] = 4;\n RayTraceUniformViews.environmentRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapTransform.set([1,0,1,0]);\n RayTraceUniformViews.bevel[0] = 1;\n RayTraceUniformViews.dispersionWavelengths[0] = 3;\n return {\n buffer: RayTraceUniformValues,\n views: RayTraceUniformViews\n };\n}\nexport function packWgpuAnalyticLights(\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: number[],\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n if (numLights > FIXED_LIGHT_COUNT) {\n console.warn(\n `Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`\n );\n }\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3<T extends ReadonlyMathArray>(idx: number, v: T) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n const lightTypeConstants = {\n DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,\n SphereLight: CONSTANT_SPHERE_LIGHT,\n RectLight: CONSTANT_RECT_LIGHT,\n SpotLight: CONSTANT_SPOT_LIGHT\n };\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const matrix = matrixStorage(light.transform);\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [matrix[12], matrix[13], matrix[14]]\n );\n data[off * 4 + 3] = lightTypeConstants[light.type];\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n if (light.type === 'RectLight') {\n data[(off + 1) * 4 + 3] = getRectLightArea(light);\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n } else if (light.type === 'SphereLight') {\n data[(off + 1) * 4 + 3] = getSphereLightArea(light);\n data[(off + 2) * 4 + 3] = light.radius;\n } else if (light.type === 'SpotLight') {\n data[(off + 1) * 4 + 3] = getSpotLightArea(light);\n packVec3(off + 2, getLightDirection(light));\n data[(off + 2) * 4 + 3] = light.radius;\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n }\n data[(off + 3) * 4 + 3] = light.type === 'SpotLight'\n ? iesProfileTexelOffset(i) ?? -1\n : texturesIndices[i] ?? -1;\n data[(off + 4) * 4] = selectionPmfs[i] ?? 0;\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import { type RayTraceInputHooks } from './wgsl/rayTrace.compute.js';
2
+ export interface WGPUShaderFeatures {
3
+ hasDisplacement: boolean;
4
+ debugGroup?: number;
5
+ /** Invocation block edge; the native host matches dispatch to this value. Default 8. */
6
+ workgroupSize?: number;
7
+ lightTracing?: boolean;
8
+ photonMapping?: boolean;
9
+ photonMaxDepth?: number;
10
+ photonDirectSubset?: boolean;
11
+ hasAlpha: boolean;
12
+ hasSceneAlpha: boolean;
13
+ hasAnisotropyDirections: boolean;
14
+ hasCoatNormals: boolean;
15
+ blasLayoutMask: number;
16
+ /** Environment presence changes background/MIS semantics independently of packed material data. */
17
+ dynamicEnvironment?: boolean;
18
+ }
19
+ export declare const WGPU_SHADER_DEFINE_KEYS: string[];
20
+ export declare function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>): string[];
21
+ export declare function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake?: boolean): string;
22
+ export declare function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake?: boolean, sceneIntersections?: string, pathDiagnostic?: boolean, inputHooks?: RayTraceInputHooks): string;
@@ -0,0 +1,33 @@
1
+ import { researchTransport } from './researchTransport.js';
2
+ import rayTraceCompute from './wgsl/rayTrace.compute.js';
3
+ import { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';
4
+ import { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';
5
+ export const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];
6
+ const constantsNotUsed = [
7
+ ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',
8
+ 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',
9
+ 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'
10
+ ];
11
+ export function wgpuPipelineConstantKeys(constants) {
12
+ return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));
13
+ }
14
+ export function wgpuShaderPreamble(constants, bake = false) {
15
+ const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\n');
16
+ const keys = wgpuPipelineConstantKeys(constants);
17
+ const constantsCode = keys.map(key => {
18
+ const value = constants[key];
19
+ return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;
20
+ }).join('\n');
21
+ return `\n${defineCode}\n${constantsCode}\n`;
22
+ }
23
+ export function wgpuShaderSource(constants, features, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
24
+ constants = researchTransport()?.constants(constants, features) ?? constants;
25
+ return wgpuShaderPreamble(constants, bake) + rayTraceCompute({
26
+ ...features,
27
+ spectral: bake ? Boolean(constants.SPECTRAL) : undefined,
28
+ sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,
29
+ materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,
30
+ lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined
31
+ }, sceneIntersections, pathDiagnostic, inputHooks);
32
+ }
33
+ //# sourceMappingURL=wgpuShaderSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"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","sourcesContent":["import {researchTransport} from './researchTransport.js';\nimport rayTraceCompute, {type RayTraceInputHooks} from './wgsl/rayTrace.compute.js';\nimport { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';\nimport { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';\n\nexport interface WGPUShaderFeatures {\n hasDisplacement: boolean;\n debugGroup?: number;\n /** Invocation block edge; the native host matches dispatch to this value. Default 8. */\n workgroupSize?:number;\n lightTracing?: boolean;\n photonMapping?:boolean;\n photonMaxDepth?:number;\n photonDirectSubset?:boolean;\n hasAlpha: boolean;\n hasSceneAlpha: boolean;\n hasAnisotropyDirections: boolean;\n hasCoatNormals: boolean;\n blasLayoutMask: number;\n /** Environment presence changes background/MIS semantics independently of packed material data. */\n dynamicEnvironment?: boolean;\n}\nexport const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];\nconst constantsNotUsed = [\n ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',\n 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',\n 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'\n];\nexport function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>) {\n return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));\n}\nexport function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake = false): string {\n const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\\n');\n const keys = wgpuPipelineConstantKeys(constants);\n const constantsCode = keys.map(key => {\n const value = constants[key];\n return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;\n }).join('\\n');\n return `\\n${defineCode}\\n${constantsCode}\\n`;\n}\nexport function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks?: RayTraceInputHooks): string {\n constants = researchTransport()?.constants(constants, features) ?? constants;\n return wgpuShaderPreamble(constants, bake) + rayTraceCompute({\n ...features,\n spectral: bake ? Boolean(constants.SPECTRAL) : undefined,\n sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,\n materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,\n lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined\n }, sceneIntersections, pathDiagnostic, inputHooks);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function aovDisplayShader(format: 'rgba16float' | 'rgba8unorm'): string;