@meimu/mutracer 0.1.4 → 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 (529) 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 +10421 -8363
  6. package/docs/api.md +202 -11
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +18 -27
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +19 -10
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +41 -3
  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 -548
  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 +83 -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 +437 -435
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  209. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
  210. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
  211. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  212. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  213. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
  214. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  215. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  216. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
  217. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  218. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  219. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  220. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  221. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  222. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  223. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  224. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  225. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  226. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  227. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  228. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  229. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  230. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  231. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  232. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  233. package/lib/renderer/lightConstants.d.ts +10 -0
  234. package/lib/renderer/lightConstants.js +11 -0
  235. package/lib/renderer/lightConstants.js.map +1 -0
  236. package/lib/renderer/lightCore.d.ts +12 -0
  237. package/lib/renderer/lightCore.js +13 -0
  238. package/lib/renderer/lightCore.js.map +1 -0
  239. package/lib/renderer/lightSampling.d.ts +20 -17
  240. package/lib/renderer/lightSampling.js +123 -56
  241. package/lib/renderer/lightSampling.js.map +1 -1
  242. package/lib/renderer/lightsData.d.ts +21 -0
  243. package/lib/renderer/lightsData.js +192 -0
  244. package/lib/renderer/lightsData.js.map +1 -0
  245. package/lib/renderer/lightsUtil.d.ts +3 -26
  246. package/lib/renderer/lightsUtil.js +3 -153
  247. package/lib/renderer/lightsUtil.js.map +1 -1
  248. package/lib/renderer/materialBufferData.d.ts +70 -0
  249. package/lib/renderer/materialBufferData.js +2 -0
  250. package/lib/renderer/materialBufferData.js.map +1 -0
  251. package/lib/renderer/materialConstants.d.ts +11 -0
  252. package/lib/renderer/materialConstants.js +11 -0
  253. package/lib/renderer/materialConstants.js.map +1 -1
  254. package/lib/renderer/materialCore.d.ts +8 -0
  255. package/lib/renderer/materialCore.js +9 -0
  256. package/lib/renderer/materialCore.js.map +1 -0
  257. package/lib/renderer/materialEmission.d.ts +2 -2
  258. package/lib/renderer/materialEmission.js +3 -3
  259. package/lib/renderer/materialEmission.js.map +1 -1
  260. package/lib/renderer/materialLayout.d.ts +2 -101
  261. package/lib/renderer/materialLayout.js +110 -172
  262. package/lib/renderer/materialLayout.js.map +1 -1
  263. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  264. package/lib/renderer/materialLayoutSchema.js +172 -0
  265. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  266. package/lib/renderer/materialParams.d.ts +69 -0
  267. package/lib/renderer/materialParams.js +272 -0
  268. package/lib/renderer/materialParams.js.map +1 -0
  269. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  270. package/lib/renderer/materialTextureSlots.js +21 -8
  271. package/lib/renderer/materialTextureSlots.js.map +1 -1
  272. package/lib/renderer/materialTextures.d.ts +6 -0
  273. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  274. package/lib/renderer/materialTextures.js.map +1 -0
  275. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  276. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  277. package/lib/renderer/meshInstances.d.ts +4 -21
  278. package/lib/renderer/meshInstances.js +10 -56
  279. package/lib/renderer/meshInstances.js.map +1 -1
  280. package/lib/renderer/oidnNetwork.d.ts +2 -2
  281. package/lib/renderer/oidnNetwork.js +1 -1
  282. package/lib/renderer/oidnNetwork.js.map +1 -1
  283. package/lib/renderer/openPbrEnergyLut.js +850 -846
  284. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  285. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  286. package/lib/renderer/ownedDenoiser.js +2 -0
  287. package/lib/renderer/ownedDenoiser.js.map +1 -0
  288. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  289. package/lib/renderer/packedMeshInstances.js +80 -0
  290. package/lib/renderer/packedMeshInstances.js.map +1 -0
  291. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  292. package/lib/renderer/prepareMeshBVH.js +21 -642
  293. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  294. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  295. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  296. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  297. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  298. package/lib/renderer/progressiveScheduler.js +3 -0
  299. package/lib/renderer/progressiveScheduler.js.map +1 -1
  300. package/lib/renderer/renderPipeline.d.ts +3 -1
  301. package/lib/renderer/renderPipeline.js.map +1 -1
  302. package/lib/renderer/renderingLimits.d.ts +9 -0
  303. package/lib/renderer/renderingLimits.js +18 -0
  304. package/lib/renderer/renderingLimits.js.map +1 -0
  305. package/lib/renderer/sceneAssembly.d.ts +73 -0
  306. package/lib/renderer/sceneAssembly.js +109 -0
  307. package/lib/renderer/sceneAssembly.js.map +1 -0
  308. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  309. package/lib/renderer/sceneChangeCore.js +307 -0
  310. package/lib/renderer/sceneChangeCore.js.map +1 -0
  311. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  312. package/lib/renderer/sceneChangeDetector.js +24 -150
  313. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  314. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  315. package/lib/renderer/sceneLayoutSchema.js +111 -0
  316. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  317. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  318. package/lib/renderer/sceneLightChanges.js.map +1 -1
  319. package/lib/renderer/scenePreparation.d.ts +55 -0
  320. package/lib/renderer/scenePreparation.js +360 -0
  321. package/lib/renderer/scenePreparation.js.map +1 -0
  322. package/lib/renderer/scratchSampling.js +18 -18
  323. package/lib/renderer/scratchSampling.js.map +1 -1
  324. package/lib/renderer/shader.d.ts +2 -0
  325. package/lib/renderer/shader.js +2 -0
  326. package/lib/renderer/shader.js.map +1 -1
  327. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  328. package/lib/renderer/shaderCapabilities.js +55 -0
  329. package/lib/renderer/shaderCapabilities.js.map +1 -0
  330. package/lib/renderer/shaderCapacity.d.ts +2 -0
  331. package/lib/renderer/shaderCapacity.js +5 -0
  332. package/lib/renderer/shaderCapacity.js.map +1 -0
  333. package/lib/renderer/skyModel.d.ts +9 -0
  334. package/lib/renderer/skyModel.js +10 -0
  335. package/lib/renderer/skyModel.js.map +1 -0
  336. package/lib/renderer/textureAtlas.d.ts +60 -0
  337. package/lib/renderer/textureAtlas.js +145 -0
  338. package/lib/renderer/textureAtlas.js.map +1 -0
  339. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  340. package/lib/renderer/textureAtlasPixels.js +68 -0
  341. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  342. package/lib/renderer/util.d.ts +1 -1
  343. package/lib/renderer/util.js.map +1 -1
  344. package/lib/renderer/webgl.d.ts +9 -2
  345. package/lib/renderer/webgl.js +54 -9
  346. package/lib/renderer/webgl.js.map +1 -1
  347. package/lib/renderer/wgpuBindless.d.ts +26 -0
  348. package/lib/renderer/wgpuBindless.js +95 -0
  349. package/lib/renderer/wgpuBindless.js.map +1 -0
  350. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  351. package/lib/renderer/wgpuBindlessSource.js +51 -0
  352. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  353. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  354. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  355. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  356. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  357. package/lib/renderer/wgpuSceneUniform.js +125 -0
  358. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  359. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  360. package/lib/renderer/wgpuShaderSource.js +31 -0
  361. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  362. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  363. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  364. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  367. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  369. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  370. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  372. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  373. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  375. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  376. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  378. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  379. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  381. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  382. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  383. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  384. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  385. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  386. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  388. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
  389. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  390. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  391. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  393. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
  394. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  395. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  396. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  397. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  398. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  399. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  400. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  401. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  403. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  404. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  406. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  408. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  409. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  410. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  411. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  412. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  413. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  415. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  416. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  418. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  419. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  420. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  421. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  422. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  423. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  424. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  425. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  426. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  427. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  428. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  430. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  431. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  432. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  433. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  434. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  435. package/lib/scene/Camera.js +7 -3
  436. package/lib/scene/Camera.js.map +1 -1
  437. package/lib/scene/EnvironmentLight.d.ts +5 -9
  438. package/lib/scene/EnvironmentLight.js +4 -14
  439. package/lib/scene/EnvironmentLight.js.map +1 -1
  440. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  441. package/lib/scene/EnvironmentLightState.js +19 -0
  442. package/lib/scene/EnvironmentLightState.js.map +1 -0
  443. package/lib/scene/Geometry.d.ts +12 -6
  444. package/lib/scene/Geometry.js +37 -13
  445. package/lib/scene/Geometry.js.map +1 -1
  446. package/lib/scene/InstanceState.d.ts +39 -0
  447. package/lib/scene/InstanceState.js +77 -0
  448. package/lib/scene/InstanceState.js.map +1 -0
  449. package/lib/scene/InstancedMesh.d.ts +1 -1
  450. package/lib/scene/InstancedMesh.js +3 -0
  451. package/lib/scene/InstancedMesh.js.map +1 -1
  452. package/lib/scene/MaterialState.d.ts +209 -0
  453. package/lib/scene/MaterialState.js +231 -0
  454. package/lib/scene/MaterialState.js.map +1 -0
  455. package/lib/scene/Mesh.d.ts +4 -6
  456. package/lib/scene/Mesh.js +3 -11
  457. package/lib/scene/Mesh.js.map +1 -1
  458. package/lib/scene/MeshState.d.ts +20 -0
  459. package/lib/scene/MeshState.js +35 -0
  460. package/lib/scene/MeshState.js.map +1 -0
  461. package/lib/scene/OpenPBRMaterial.d.ts +7 -169
  462. package/lib/scene/OpenPBRMaterial.js +5 -223
  463. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  464. package/lib/scene/PixelTexture.d.ts +6 -0
  465. package/lib/scene/PixelTexture.js +10 -0
  466. package/lib/scene/PixelTexture.js.map +1 -0
  467. package/lib/scene/ProceduralSky.d.ts +24 -0
  468. package/lib/scene/ProceduralSky.js +40 -0
  469. package/lib/scene/ProceduralSky.js.map +1 -0
  470. package/lib/scene/RectLight.d.ts +2 -13
  471. package/lib/scene/RectLight.js +3 -21
  472. package/lib/scene/RectLight.js.map +1 -1
  473. package/lib/scene/RectLightState.d.ts +31 -0
  474. package/lib/scene/RectLightState.js +26 -0
  475. package/lib/scene/RectLightState.js.map +1 -0
  476. package/lib/scene/Scene.d.ts +15 -4
  477. package/lib/scene/Scene.js.map +1 -1
  478. package/lib/scene/SceneNode.js +7 -6
  479. package/lib/scene/SceneNode.js.map +1 -1
  480. package/lib/scene/Texture.d.ts +10 -41
  481. package/lib/scene/Texture.js +4 -33
  482. package/lib/scene/Texture.js.map +1 -1
  483. package/lib/scene/TextureState.d.ts +35 -0
  484. package/lib/scene/TextureState.js +35 -0
  485. package/lib/scene/TextureState.js.map +1 -0
  486. package/lib/scene/attributeData.d.ts +4 -0
  487. package/lib/scene/attributeData.js +10 -0
  488. package/lib/scene/attributeData.js.map +1 -0
  489. package/lib/scene/lightState.d.ts +8 -0
  490. package/lib/scene/lightState.js +2 -0
  491. package/lib/scene/lightState.js.map +1 -0
  492. package/lib/scene/openPbrSchema.d.ts +7 -12
  493. package/lib/scene/openPbrSchema.js +273 -28
  494. package/lib/scene/openPbrSchema.js.map +1 -1
  495. package/lib/scene/skyParameters.d.ts +20 -0
  496. package/lib/scene/skyParameters.js +28 -0
  497. package/lib/scene/skyParameters.js.map +1 -0
  498. package/lib/scene/textureData.d.ts +9 -0
  499. package/lib/scene/textureData.js +2 -0
  500. package/lib/scene/textureData.js.map +1 -0
  501. package/lib/scene/texturePixels.d.ts +6 -0
  502. package/lib/scene/texturePixels.js +10 -0
  503. package/lib/scene/texturePixels.js.map +1 -0
  504. package/lib/settings/display.d.ts +33 -0
  505. package/lib/settings/display.js +7 -0
  506. package/lib/settings/display.js.map +1 -1
  507. package/lib/settings/render.d.ts +25 -3
  508. package/lib/settings/render.js +3 -1
  509. package/lib/settings/render.js.map +1 -1
  510. package/lib/tinybvh/tinybvh.wasm +0 -0
  511. package/lib/util/commonGeometry.js +7 -7
  512. package/lib/util/commonGeometry.js.map +1 -1
  513. package/lib/util/fromTHREE.d.ts +4 -1
  514. package/lib/util/fromTHREE.js +18 -5
  515. package/lib/util/fromTHREE.js.map +1 -1
  516. package/lib/util/geometry.js +42 -29
  517. package/lib/util/geometry.js.map +1 -1
  518. package/lib/util/loadRGBE.js +3 -4
  519. package/lib/util/loadRGBE.js.map +1 -1
  520. package/lib/util/studioLighting.d.ts +18 -0
  521. package/lib/util/studioLighting.js +36 -0
  522. package/lib/util/studioLighting.js.map +1 -0
  523. package/lib/version.d.ts +1 -1
  524. package/lib/version.js +1 -1
  525. package/lib/version.js.map +1 -1
  526. package/llms.txt +4 -0
  527. package/package.json +31 -5
  528. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  529. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -4,6 +4,7 @@ export { materialParametersEqual } from './materialComparison.generated.js';
4
4
  import InstancedMesh from '../scene/InstancedMesh.js';
5
5
  import { materialTextureKeys } from '../scene/OpenPBRMaterial.js';
6
6
  import Texture from '../scene/Texture.js';
7
+ import { SceneChangeTracker } from './sceneChangeCore.js';
7
8
  /** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */
8
9
  export function snapshotFields(object) {
9
10
  const values = [object];
@@ -79,157 +80,30 @@ export function snapshotMaterialParameters(material, previous) {
79
80
  return value;
80
81
  });
81
82
  }
82
- const geometryAttributes = ['position', 'normal', 'tangent', 'uv', 'uv1', 'color', 'indices', 'materialIndex'];
83
- function captureGeometryStorage(geometry, out) {
84
- let i = 0;
85
- for (const key of geometryAttributes) {
86
- const attribute = geometry[key];
87
- out[i++] = attribute?.array;
88
- out[i++] = attribute?.array.length;
89
- out[i++] = attribute?.itemSize;
90
- }
91
- }
92
- function geometryStorageMatches(geometry, storage) {
93
- let i = 0;
94
- for (const key of geometryAttributes) {
95
- const attribute = geometry[key];
96
- if (storage[i++] !== attribute?.array || storage[i++] !== attribute?.array.length || storage[i++] !== attribute?.itemSize)
97
- return false;
98
- }
99
- return true;
100
- }
83
+ // Web values may be loosely typed JS; the generated comparisons keep their
84
+ // Object.is and array semantics. Detection rules live in sceneChangeCore.
85
+ const webAdapter = {
86
+ validateMesh: mesh => { if (mesh instanceof InstancedMesh)
87
+ mesh.validate(); },
88
+ captureMaterial: (material, previous, retired) => {
89
+ const item = retired ?? { aovId: material.aovId, values: [], textures: [] };
90
+ item.aovId = material.aovId;
91
+ item.values = snapshotMaterialParameters(material, previous?.values);
92
+ captureMaterialTextures(material, item.textures);
93
+ return item;
94
+ },
95
+ materialMatches: (material, snapshot) => material.aovId === snapshot.aovId && materialParametersEqual(material, snapshot.values) &&
96
+ !materialTexturesChanged(material, snapshot.textures),
97
+ captureLight: light => snapshotFields(light),
98
+ lightsEqual: snapshotsEqual,
99
+ captureBackground: backgroundSnapshot,
100
+ backgroundsEqual: snapshotsEqual
101
+ };
101
102
  /** Detects edits without accepting them until the pipeline has received the scene. */
102
103
  export class SceneChangeDetector {
103
- _snapshot;
104
- _pending;
105
- _spare;
106
- _seen = new Set();
107
- detect(scene) {
108
- const old = this._snapshot;
109
- let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;
110
- const transforms = [];
111
- const colors = [];
112
- const geometries = new Set();
113
- const materials = [];
114
- const seen = this._seen;
115
- seen.clear();
116
- for (let i = 0; i < scene.meshes.length; i++) {
117
- const mesh = scene.meshes[i];
118
- const prev = old?.meshes[i];
119
- let instanceChanged = false;
120
- if (mesh instanceof InstancedMesh) {
121
- mesh.validate();
122
- if (prev?.instanceCount !== mesh.count)
123
- full = true;
124
- if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors))
125
- colors.push(mesh);
126
- if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {
127
- transforms.push(mesh);
128
- instanceChanged = true;
129
- }
130
- }
131
- if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||
132
- prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||
133
- prev.materials.some((m, k) => m !== mesh.materials[k]))
134
- full = true;
135
- if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version)
136
- geometries.add(mesh.geometry);
137
- if (prev?.mesh === mesh) {
138
- for (let k = 0; k < 16; k++) {
139
- if (!Object.is(mesh.transform[k], old.matrices[i * 16 + k])) {
140
- if (!instanceChanged)
141
- transforms.push(mesh);
142
- break;
143
- }
144
- }
145
- }
146
- for (const material of mesh.materials) {
147
- if (seen.has(material))
148
- continue;
149
- seen.add(material);
150
- const prior = old?.materials.get(material);
151
- if (!prior || !materialParametersEqual(material, prior.values) ||
152
- materialTexturesChanged(material, prior.textures))
153
- materials.push(material);
154
- }
155
- }
156
- const lights = scene.lights.map(snapshotFields);
157
- const background = backgroundSnapshot(scene.background);
158
- const changes = {
159
- meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',
160
- transforms, colors, materials, geometries: [...geometries],
161
- lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||
162
- lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),
163
- background: !old || !snapshotsEqual(background, old.background)
164
- };
165
- if (changes.meshes !== 'none' || changes.lights || changes.background) {
166
- // Write into the other buffer: detect never mutates committed state.
167
- // Repeated detects without commit overwrite the same pending buffer.
168
- let next = this._spare;
169
- if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {
170
- next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),
171
- materials: new Map(), lightList: scene.lights, lights: [], background: [] };
172
- this._spare = next;
173
- }
174
- scene.meshes.forEach((mesh, i) => {
175
- let item = next.meshes[i];
176
- if (!item) {
177
- item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],
178
- materials: [] };
179
- next.meshes[i] = item;
180
- }
181
- item.mesh = mesh;
182
- item.geometry = mesh.geometry;
183
- item.version = mesh.geometry.version;
184
- item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;
185
- item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;
186
- item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;
187
- item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;
188
- item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;
189
- item.dynamic = mesh.geometry.dynamic;
190
- captureGeometryStorage(mesh.geometry, item.storage);
191
- item.materials.length = mesh.materials.length;
192
- for (let k = 0; k < mesh.materials.length; k++)
193
- item.materials[k] = mesh.materials[k];
194
- next.matrices.set(mesh.transform, i * 16);
195
- });
196
- for (const material of next.materials.keys())
197
- if (!seen.has(material))
198
- next.materials.delete(material);
199
- const changedMaterials = new Set(materials);
200
- for (const material of seen) {
201
- const previous = old?.materials.get(material);
202
- if (previous && !changedMaterials.has(material)) {
203
- next.materials.set(material, previous);
204
- }
205
- else {
206
- // Never overwrite a shared committed entry. The other buffer's
207
- // retired entry can reuse its texture storage; parameter arrays and
208
- // their reused vector snapshots remain immutable after capture.
209
- let item = next.materials.get(material);
210
- if (!item || item === previous)
211
- item = { values: [], textures: [] };
212
- item.values = snapshotMaterialParameters(material, previous?.values);
213
- captureMaterialTextures(material, item.textures);
214
- next.materials.set(material, item);
215
- }
216
- }
217
- next.lightList = scene.lights;
218
- next.lights = lights;
219
- next.background = background;
220
- this._pending = next;
221
- }
222
- else
223
- this._pending = old;
224
- return changes;
225
- }
226
- commit() {
227
- if (this._pending && this._pending !== this._snapshot) {
228
- this._spare = this._snapshot;
229
- this._snapshot = this._pending;
230
- }
231
- this._pending = undefined;
232
- }
233
- reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }
104
+ _tracker = new SceneChangeTracker(webAdapter);
105
+ detect(scene) { return this._tracker.detect(scene); }
106
+ commit() { this._tracker.commit(); }
107
+ reset() { this._tracker.reset(); }
234
108
  }
235
109
  //# sourceMappingURL=sceneChangeDetector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sceneChangeDetector.js","sourceRoot":"","sources":["../../src/renderer/sceneChangeDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { openPbrSchema } from '../scene/openPbrSchema.js';\nimport { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';\nexport { materialParametersEqual } from './materialComparison.generated.js';\nimport Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Geometry from '../scene/Geometry.js';\nimport OpenPBRMaterial, { materialTextureKeys } from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\nimport { Scene, SceneBackground } from '../scene/Scene.js';\n\nexport interface SceneChanges {\n meshes: 'none' | 'incremental' | 'full';\n transforms: Mesh[];\n colors: InstancedMesh[];\n geometries: Geometry[];\n materials: OpenPBRMaterial[];\n lights: boolean;\n background: boolean;\n}\n\n/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */\nexport function snapshotFields(object: object): unknown[] {\n const values: unknown[] = [object];\n for (const key of Object.keys(object)) {\n const value = (object as Record<string, unknown>)[key];\n values.push(key);\n if (value instanceof Texture) values.push(...snapshotTexture(value));\n else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n values.push(...Array.from(value as ArrayLike<number>));\n } else values.push(value);\n }\n return values;\n}\n\nfunction snapshotTexture(texture: Texture | undefined): unknown[] {\n return texture ? [texture, texture.version, texture.image, texture.flipY,\n texture.uvScale, texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined];\n}\n\nexport function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]) {\n return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n}\n\nfunction backgroundSnapshot(background: SceneBackground | undefined) {\n if (background instanceof Texture) return snapshotTexture(background);\n if (Array.isArray(background)) return [background, ...background];\n return background ? snapshotFields(background) : [undefined];\n}\n\nfunction captureMaterialTextures(material: OpenPBRMaterial, out: unknown[]) {\n let i = 0;\n for (const key of materialTextureKeys) {\n const texture = material[key];\n if (typeof texture === 'number') continue;\n if (!texture) { out[i++] = undefined; continue; }\n out[i++] = texture; out[i++] = texture.version; out[i++] = texture.image;\n out[i++] = texture.flipY; out[i++] = texture.uvScale; out[i++] = texture.uvOffset;\n out[i++] = texture.uvChannel; out[i++] = texture.wrapS; out[i++] = texture.wrapT; out[i++] = texture.colorSpace;\n }\n out.length = i;\n}\n\n// Texture references and metadata have their own snapshot.\nconst parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);\n\nexport function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]) {\n return parameterKeys.map((key, index) => {\n const value = material[key];\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n const array = value as ArrayLike<number>, prior = previous?.[index];\n if (Array.isArray(prior) && prior.length === array.length) {\n let equal = true;\n for (let i = 0; i < array.length; i++) if (!Object.is(array[i], prior[i])) { equal = false; break; }\n if (equal) return prior;\n }\n return Array.from(array);\n }\n return value;\n });\n}\n\nconst geometryAttributes = ['position', 'normal', 'tangent', 'uv', 'uv1', 'color', 'indices', 'materialIndex'] as const;\nfunction captureGeometryStorage(geometry: Geometry, out: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n out[i++] = attribute?.array; out[i++] = attribute?.array.length; out[i++] = attribute?.itemSize;\n }\n}\nfunction geometryStorageMatches(geometry: Geometry, storage: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n if (storage[i++] !== attribute?.array || storage[i++] !== attribute?.array.length || storage[i++] !== attribute?.itemSize) return false;\n }\n return true;\n}\n\ninterface MeshSnapshot {\n mesh: Mesh;\n geometry: Mesh['geometry'];\n version: number;\n instanceVersion?: number;\n instanceCount?: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion?: number;\n dynamic: boolean;\n storage: unknown[];\n materials: OpenPBRMaterial[];\n}\ninterface Snapshot {\n meshList: Mesh[];\n meshes: MeshSnapshot[];\n matrices: Float64Array;\n materials: Map<OpenPBRMaterial, { values: readonly unknown[]; textures: unknown[] }>;\n lightList: Scene['lights'];\n lights: unknown[][];\n background: unknown[];\n}\n\n/** Detects edits without accepting them until the pipeline has received the scene. */\nexport class SceneChangeDetector {\n private _snapshot?: Snapshot;\n private _pending?: Snapshot;\n private _spare?: Snapshot;\n private _seen = new Set<OpenPBRMaterial>();\n detect(scene: Scene): SceneChanges {\n const old = this._snapshot;\n let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;\n const transforms: Mesh[] = [];\n const colors: InstancedMesh[] = [];\n const geometries = new Set<Geometry>();\n const materials: OpenPBRMaterial[] = [];\n const seen = this._seen;\n seen.clear();\n for (let i = 0; i < scene.meshes.length; i++) {\n const mesh = scene.meshes[i];\n const prev = old?.meshes[i];\n let instanceChanged = false;\n if (mesh instanceof InstancedMesh) {\n mesh.validate();\n if (prev?.instanceCount !== mesh.count) full = true;\n if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors)) colors.push(mesh);\n if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {\n transforms.push(mesh); instanceChanged = true;\n }\n }\n if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||\n prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||\n prev.materials.some((m, k) => m !== mesh.materials[k])) full = true;\n if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version) geometries.add(mesh.geometry);\n if (prev?.mesh === mesh) {\n for (let k = 0; k < 16; k++) {\n if (!Object.is(mesh.transform[k], old!.matrices[i * 16 + k])) {\n if (!instanceChanged) transforms.push(mesh);\n break;\n }\n }\n }\n for (const material of mesh.materials) {\n if (seen.has(material)) continue;\n seen.add(material);\n const prior = old?.materials.get(material);\n if (!prior || !materialParametersEqual(material, prior.values) ||\n materialTexturesChanged(material, prior.textures)) materials.push(material);\n }\n }\n const lights = scene.lights.map(snapshotFields);\n const background = backgroundSnapshot(scene.background);\n const changes: SceneChanges = {\n meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',\n transforms, colors, materials, geometries: [...geometries],\n lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||\n lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),\n background: !old || !snapshotsEqual(background, old.background)\n };\n if (changes.meshes !== 'none' || changes.lights || changes.background) {\n // Write into the other buffer: detect never mutates committed state.\n // Repeated detects without commit overwrite the same pending buffer.\n let next = this._spare;\n if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {\n next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),\n materials: new Map(), lightList: scene.lights, lights: [], background: [] };\n this._spare = next;\n }\n scene.meshes.forEach((mesh, i) => {\n let item = next!.meshes[i];\n if (!item) {\n item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],\n materials: [] };\n next!.meshes[i] = item;\n }\n item.mesh = mesh; item.geometry = mesh.geometry; item.version = mesh.geometry.version;\n item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;\n item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;\n item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;\n item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;\n item.dynamic = mesh.geometry.dynamic; captureGeometryStorage(mesh.geometry, item.storage);\n item.materials.length = mesh.materials.length;\n for (let k = 0; k < mesh.materials.length; k++) item.materials[k] = mesh.materials[k];\n next!.matrices.set(mesh.transform, i * 16);\n });\n for (const material of next.materials.keys()) if (!seen.has(material)) next.materials.delete(material);\n const changedMaterials = new Set(materials);\n for (const material of seen) {\n const previous = old?.materials.get(material);\n if (previous && !changedMaterials.has(material)) {\n next.materials.set(material, previous);\n } else {\n // Never overwrite a shared committed entry. The other buffer's\n // retired entry can reuse its texture storage; parameter arrays and\n // their reused vector snapshots remain immutable after capture.\n let item = next.materials.get(material);\n if (!item || item === previous) item = { values: [], textures: [] };\n item.values = snapshotMaterialParameters(material, previous?.values);\n captureMaterialTextures(material, item.textures);\n next.materials.set(material, item);\n }\n }\n next.lightList = scene.lights; next.lights = lights; next.background = background;\n this._pending = next;\n } else this._pending = old;\n return changes;\n }\n\n commit() {\n if (this._pending && this._pending !== this._snapshot) {\n this._spare = this._snapshot;\n this._snapshot = this._pending;\n }\n this._pending = undefined;\n }\n reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }\n}\n"]}
1
+ {"version":3,"file":"sceneChangeDetector.js","sourceRoot":"","sources":["../../src/renderer/sceneChangeDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACrG,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,OAAO,aAAa,MAAM,2BAA2B,CAAC;AAEtD,OAAwB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,OAAO,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAA6B,MAAM,sBAAsB,CAAC;AAYrF,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,MAAM,GAAc,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAI,MAAkC,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,KAAK,YAAY,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;aAChE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAA0B,CAAC,CAAC,CAAC;QACzD,CAAC;;YAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,OAA4B;IACnD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;QACtE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC1H,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAqB,EAAE,CAAqB;IACzE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAuC;IACjE,IAAI,UAAU,YAAY,OAAO;QAAE,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,UAAU,EAAE,GAAG,UAAU,CAAC,CAAC;IAClE,OAAO,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAyB,EAAE,GAAc;IACxE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;YAAC,SAAS;QAAC,CAAC;QACjD,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QACzE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClF,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAClH,CAAC;IACD,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,2DAA2D;AAC3D,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEtG,MAAM,UAAU,0BAA0B,CAAC,QAAyB,EAAE,QAA6B;IACjG,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,KAA0B,EAAE,KAAK,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1D,IAAI,KAAK,GAAG,IAAI,CAAC;gBACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;oBAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAC,KAAK,GAAG,KAAK,CAAC;wBAAC,MAAM;oBAAC,CAAC;gBACpG,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAID,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,UAAU,GAA8F;IAC5G,YAAY,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,YAAY,aAAa;QAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7E,eAAe,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC5E,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,0BAA0B,CAAC,QAA2B,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxF,uBAAuB,CAAC,QAA2B,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,eAAe,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,uBAAuB,CAAC,QAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC;QACjJ,CAAC,uBAAuB,CAAC,QAA2B,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC1E,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;IAC5C,WAAW,EAAE,cAAc;IAC3B,iBAAiB,EAAE,kBAAkB;IACrC,gBAAgB,EAAE,cAAc;CACjC,CAAC;AAEF,sFAAsF;AACtF,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,CAAC,KAAY,IAAkB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAiB,CAAC,CAAC,CAAC;IAC1F,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACnC","sourcesContent":["import { openPbrSchema } from '../scene/openPbrSchema.js';\nimport { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';\nexport { materialParametersEqual } from './materialComparison.generated.js';\nimport Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport type Geometry from '../scene/Geometry.js';\nimport OpenPBRMaterial, { materialTextureKeys } from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\nimport type { Scene, SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { SceneChangeTracker, type SceneSnapshotAdapter } from './sceneChangeCore.js';\n\nexport interface SceneChanges {\n meshes: 'none' | 'incremental' | 'full';\n transforms: Mesh[];\n colors: InstancedMesh[];\n geometries: Geometry[];\n materials: OpenPBRMaterial[];\n lights: boolean;\n background: boolean;\n}\n\n/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */\nexport function snapshotFields(object: object): unknown[] {\n const values: unknown[] = [object];\n for (const key of Object.keys(object)) {\n const value = (object as Record<string, unknown>)[key];\n values.push(key);\n if (value instanceof Texture) values.push(...snapshotTexture(value));\n else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n values.push(...Array.from(value as ArrayLike<number>));\n } else values.push(value);\n }\n return values;\n}\n\nfunction snapshotTexture(texture: Texture | undefined): unknown[] {\n return texture ? [texture, texture.version, texture.image, texture.flipY,\n texture.uvScale, texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined];\n}\n\nexport function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]) {\n return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n}\n\nfunction backgroundSnapshot(background: SceneBackground | undefined) {\n if (background instanceof Texture) return snapshotTexture(background);\n if (Array.isArray(background)) return [background, ...background];\n return background ? snapshotFields(background) : [undefined];\n}\n\nfunction captureMaterialTextures(material: OpenPBRMaterial, out: unknown[]) {\n let i = 0;\n for (const key of materialTextureKeys) {\n const texture = material[key];\n if (typeof texture === 'number') continue;\n if (!texture) { out[i++] = undefined; continue; }\n out[i++] = texture; out[i++] = texture.version; out[i++] = texture.image;\n out[i++] = texture.flipY; out[i++] = texture.uvScale; out[i++] = texture.uvOffset;\n out[i++] = texture.uvChannel; out[i++] = texture.wrapS; out[i++] = texture.wrapT; out[i++] = texture.colorSpace;\n }\n out.length = i;\n}\n\n// Texture references and metadata have their own snapshot.\nconst parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);\n\nexport function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]) {\n return parameterKeys.map((key, index) => {\n const value = material[key];\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n const array = value as ArrayLike<number>, prior = previous?.[index];\n if (Array.isArray(prior) && prior.length === array.length) {\n let equal = true;\n for (let i = 0; i < array.length; i++) if (!Object.is(array[i], prior[i])) { equal = false; break; }\n if (equal) return prior;\n }\n return Array.from(array);\n }\n return value;\n });\n}\n\ninterface MaterialSnapshot { aovId: number; values: readonly unknown[]; textures: unknown[]; }\n\n// Web values may be loosely typed JS; the generated comparisons keep their\n// Object.is and array semantics. Detection rules live in sceneChangeCore.\nconst webAdapter: SceneSnapshotAdapter<SceneLight, SceneBackground, MaterialSnapshot, unknown[], unknown[]> = {\n validateMesh: mesh => { if (mesh instanceof InstancedMesh) mesh.validate(); },\n captureMaterial: (material, previous, retired) => {\n const item = retired ?? { aovId: material.aovId, values: [], textures: [] };\n item.aovId = material.aovId;\n item.values = snapshotMaterialParameters(material as OpenPBRMaterial, previous?.values);\n captureMaterialTextures(material as OpenPBRMaterial, item.textures);\n return item;\n },\n materialMatches: (material, snapshot) => material.aovId === snapshot.aovId && materialParametersEqual(material as OpenPBRMaterial, snapshot.values) &&\n !materialTexturesChanged(material as OpenPBRMaterial, snapshot.textures),\n captureLight: light => snapshotFields(light),\n lightsEqual: snapshotsEqual,\n captureBackground: backgroundSnapshot,\n backgroundsEqual: snapshotsEqual\n};\n\n/** Detects edits without accepting them until the pipeline has received the scene. */\nexport class SceneChangeDetector {\n private _tracker = new SceneChangeTracker(webAdapter);\n detect(scene: Scene): SceneChanges { return this._tracker.detect(scene) as SceneChanges; }\n commit() { this._tracker.commit(); }\n reset() { this._tracker.reset(); }\n}\n"]}
@@ -0,0 +1,118 @@
1
+ export declare const WORD_BYTES = 4;
2
+ export declare const protocolVersions: {
3
+ SCENE: number;
4
+ RESOURCE_PACKET: number;
5
+ RESOURCE_WRITES: number;
6
+ GEOMETRY_KERNELS: number;
7
+ };
8
+ export declare function sceneRecords(): {
9
+ HEADER: Record<string, number>;
10
+ GEOMETRY: Record<string, number>;
11
+ MESH: Record<string, number>;
12
+ MATERIAL: Record<string, number>;
13
+ TEXTURE: Record<string, number>;
14
+ LIGHT: Record<string, number>;
15
+ CAMERA: Record<string, number>;
16
+ BATCH: Record<string, number>;
17
+ EXTENSION: Record<string, number>;
18
+ SETTINGS: Record<string, number>;
19
+ WRITE_ENTRY: Record<string, number>;
20
+ GEOMETRY_KERNEL_HEADER: Record<string, number>;
21
+ GEOMETRY_KERNEL_ENTRY: Record<string, number>;
22
+ PACKET_HEADER: Record<string, number>;
23
+ PACKET_ENTRY: Record<string, number>;
24
+ };
25
+ export declare const resourceIds: {
26
+ AS_CHANGED_BLASES: number;
27
+ BVH: number;
28
+ INSTANCES: number;
29
+ ATTRIBUTES: number;
30
+ MATERIALS: number;
31
+ MAP_INFO: number;
32
+ CAMERA: number;
33
+ TRACE_UNIFORM: number;
34
+ LIGHT_UNIFORM: number;
35
+ COLOR: number;
36
+ NORMAL: number;
37
+ ALBEDO: number;
38
+ SHADOW_CATCHER: number;
39
+ ATLAS: number;
40
+ ENVIRONMENT: number;
41
+ ENVIRONMENT_CDF: number;
42
+ BACKGROUND: number;
43
+ LIGHT_SAMPLING: number;
44
+ ENERGY_LUT: number;
45
+ DISPLACEMENT: number;
46
+ SOFTWARE_SHADER: number;
47
+ METADATA: number;
48
+ HWRT_SHADER: number;
49
+ HIT_SHADER: number;
50
+ INDICES: number;
51
+ SOFTWARE_PATH_SHADER: number;
52
+ HWRT_PATH_SHADER: number;
53
+ DISPLACEMENT_BOUNDS: number;
54
+ SOFTWARE_HIT_SHADER: number;
55
+ PRIMITIVE_IDS: number;
56
+ AS_POSITIONS: number;
57
+ AS_INDICES: number;
58
+ PATH_EVENTS: number;
59
+ PATH_PARAMETERS: number;
60
+ QUERY_COUNTS: number;
61
+ SOFTWARE_FRAME_SHADER: number;
62
+ HWRT_FRAME_SHADER: number;
63
+ };
64
+ export declare const packetKinds: {
65
+ BUFFER: number;
66
+ TEXTURE: number;
67
+ WGSL: number;
68
+ METADATA: number;
69
+ };
70
+ export declare const samplerIds: {
71
+ MATERIAL: number;
72
+ };
73
+ export declare const textureFormats: {
74
+ RGBA8_UNORM: number;
75
+ RGBA16_FLOAT: number;
76
+ RGBA32_FLOAT: number;
77
+ R32_FLOAT: number;
78
+ RG32_FLOAT: number;
79
+ };
80
+ export declare const textureFormatInfo: {
81
+ id: number;
82
+ name: string;
83
+ bytes: number;
84
+ }[];
85
+ export declare const rounding: {
86
+ rangeScale: number;
87
+ rangeShift: number;
88
+ rangeEpsilon: number;
89
+ float32Product: boolean;
90
+ float32Difference: boolean;
91
+ };
92
+ interface BindingSchema {
93
+ name: string;
94
+ resource: number;
95
+ kind: 'buffer' | 'texture' | 'sampler';
96
+ layout: GPUBindGroupLayoutEntry;
97
+ }
98
+ export declare const bindGroups: {
99
+ name: string;
100
+ label: string;
101
+ bindings: BindingSchema[];
102
+ }[];
103
+ export declare const hwrtBindings: {
104
+ ACCELERATION: number;
105
+ INDICES: number;
106
+ DIAGNOSTIC: number;
107
+ PATH_PARAMETERS: number;
108
+ };
109
+ export declare function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[];
110
+ export declare function rayTraceUniformOffsets(): {
111
+ [k: string]: number;
112
+ };
113
+ export declare const uniformSizes: {
114
+ CAMERA_BYTES: number;
115
+ LIGHT_BYTES: number;
116
+ };
117
+ export declare const framePixelFields: readonly [readonly ["noisyColor", "noisy_color", "vec4f", "Linear HDR radiance, alpha 1."], readonly ["normalRoughness", "normal_roughness", "vec4f", "Oriented world shading normal xyz, specular roughness w."], readonly ["positionDepth", "position_depth", "vec4f", "World position xyz, linear camera-forward depth w."], readonly ["geometricNormal", "geometric_normal", "vec4f", "Original unflipped geometric normal xyz, zero w."], readonly ["baseColorMetalness", "base_color_metalness", "vec4f", "Resolved base color; not a directional diffuse reflectance."], readonly ["transmission", "transmission", "vec4f", "Transmission color RGB, transmission weight w."], readonly ["roughnessIor", "roughness_ior", "vec4f", "Roughness xy, incident IOR z and transmitted IOR w."], readonly ["absorption", "absorption", "vec4f", "Medium extinction RGB and medium type w."], readonly ["identity", "identity", "vec4u", "Publication-local instance/primitive indices, thin-wall flag, validity."], readonly ["barycentricsFace", "barycentrics_face", "vec4f", "Barycentrics xy, front-face boolean z, resolved material index w."], readonly ["unclampedRadiance", "unclamped_radiance", "vec4f", "Radiance before per-sample clamping, alpha 1."], readonly ["rngState", "rng_state", "vec4u", "Final RNG words for reproducibility, opaque to consumers."], readonly ["rngDimensions", "rng_dimensions", "vec4u", "Counter, bounce, sample index and seed."], readonly ["diffuseAlbedo", "diffuse_albedo", "vec4f", "Directional reflectance RGB, zero w; REFLECTANCE validity is required."], readonly ["specularAlbedo", "specular_albedo", "vec4f", "Directional reflectance RGB, zero w; REFLECTANCE validity is required."]];
118
+ export {};
@@ -0,0 +1,111 @@
1
+ import { makeRayTraceUniform } from './wgpuSceneUniform.js';
2
+ const field = (name, words = 1) => [name, words];
3
+ function record(fields) {
4
+ let words = 0;
5
+ const offsets = {};
6
+ for (const [name, length] of fields) {
7
+ offsets[name] = words;
8
+ words += length;
9
+ }
10
+ offsets.WORDS = words;
11
+ return offsets;
12
+ }
13
+ // One source for native wire records, resource identities and shared WebGPU
14
+ // bindings. Descriptor offsets are u32 words; uniform offsets are bytes.
15
+ export const WORD_BYTES = 4;
16
+ export const protocolVersions = { SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, GEOMETRY_KERNELS: 1 };
17
+ export function sceneRecords() {
18
+ return {
19
+ HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),
20
+ field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),
21
+ field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),
22
+ field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),
23
+ field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),
24
+ GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),
25
+ field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),
26
+ MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),
27
+ MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),
28
+ field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),
29
+ field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),
30
+ field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),
31
+ TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),
32
+ field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),
33
+ LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),
34
+ field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),
35
+ CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),
36
+ field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),
37
+ field('RESERVED', 3), field('TRANSFORM', 16)]),
38
+ BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),
39
+ EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),
40
+ SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),
41
+ field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),
42
+ field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS')]),
43
+ WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),
44
+ GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),
45
+ GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),
46
+ PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),
47
+ PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])
48
+ };
49
+ }
50
+ export const resourceIds = {
51
+ AS_CHANGED_BLASES: 53,
52
+ BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,
53
+ COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,
54
+ BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,
55
+ HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,
56
+ DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,
57
+ PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,
58
+ SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55
59
+ };
60
+ export const packetKinds = { BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3 };
61
+ export const samplerIds = { MATERIAL: 40 };
62
+ export const textureFormats = { RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4 };
63
+ export const textureFormatInfo = [
64
+ { id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4 }, { id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8 }, { id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16 },
65
+ { id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4 }, { id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8 }
66
+ ];
67
+ export const rounding = { rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true };
68
+ const buffer = (name, resource, binding, type) => ({ name, resource, kind: 'buffer', layout: { binding, visibility: 4, buffer: { type } } });
69
+ const texture = (name, resource, binding, array = false, filter = false) => ({ name, resource, kind: 'texture', layout: { binding, visibility: 4, texture: { viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float' } } });
70
+ export const bindGroups = [
71
+ { name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),
72
+ buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')] },
73
+ { name: 'TEXTURES', label: 'Textures', bindings: [
74
+ { name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: { binding: 0, visibility: 4, sampler: {} } },
75
+ texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),
76
+ texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),
77
+ texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)
78
+ ] },
79
+ { name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')] },
80
+ { name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')] }
81
+ ];
82
+ export const hwrtBindings = { ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8 };
83
+ export function rayTraceBindGroupLayouts() {
84
+ return bindGroups.map(group => ({ label: group.label, entries: group.bindings.map(binding => binding.layout) }));
85
+ }
86
+ export function rayTraceUniformOffsets() {
87
+ const uniform = makeRayTraceUniform();
88
+ const rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) => [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));
89
+ rayTraceUniform.BYTES = uniform.buffer.byteLength;
90
+ return rayTraceUniform;
91
+ }
92
+ export const uniformSizes = { CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES };
93
+ // The primary-surface ABI, shared by the trace hook, resolve shader and Rust.
94
+ export const framePixelFields = [
95
+ ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],
96
+ ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],
97
+ ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],
98
+ ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],
99
+ ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],
100
+ ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],
101
+ ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],
102
+ ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],
103
+ ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],
104
+ ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],
105
+ ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],
106
+ ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],
107
+ ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],
108
+ ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],
109
+ ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],
110
+ ];
111
+ //# sourceMappingURL=sceneLayoutSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneLayoutSchema.js","sourceRoot":"","sources":["../../src/renderer/sceneLayoutSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {makeRayTraceUniform} from './wgpuSceneUniform.js';\n\ntype Field = readonly [string, number];\nconst field = (name: string, words = 1): Field => [name, words];\nfunction record(fields: Field[]): Record<string, number> {\n let words = 0;\n const offsets: Record<string, number> = {};\n for (const [name, length] of fields) { offsets[name] = words; words += length; }\n offsets.WORDS = words;\n return offsets;\n}\n\n// One source for native wire records, resource identities and shared WebGPU\n// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.\nexport const WORD_BYTES = 4;\nexport const protocolVersions = {SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, GEOMETRY_KERNELS: 1};\nexport function sceneRecords() { return {\n HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),\n field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),\n field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),\n field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),\n field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),\n GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),\n field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),\n MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),\n MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),\n field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),\n field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),\n field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),\n TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),\n field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),\n LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),\n field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),\n CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),\n field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),\n field('RESERVED', 3), field('TRANSFORM', 16)]),\n BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),\n EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),\n SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),\n field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),\n field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS')]),\n WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),\n GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),\n GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),\n PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),\n PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])\n};\n}\nexport const resourceIds = {\n AS_CHANGED_BLASES: 53,\n BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,\n COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,\n BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,\n HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,\n DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,\n PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,\n SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55\n};\nexport const packetKinds = {BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3};\nexport const samplerIds = {MATERIAL: 40};\nexport const textureFormats = {RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4};\nexport const textureFormatInfo = [\n {id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4}, {id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8}, {id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16},\n {id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4}, {id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8}\n];\nexport const rounding = {rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true};\n\ninterface BindingSchema {name: string; resource: number; kind: 'buffer' | 'texture' | 'sampler'; layout: GPUBindGroupLayoutEntry}\nconst buffer = (name: string, resource: number, binding: number, type: GPUBufferBindingType): BindingSchema =>\n ({name, resource, kind: 'buffer', layout: {binding, visibility: 4, buffer: {type}}});\nconst texture = (name: string, resource: number, binding: number, array = false, filter = false): BindingSchema =>\n ({name, resource, kind: 'texture', layout: {binding, visibility: 4, texture: {viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float'}}});\nexport const bindGroups = [\n {name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),\n buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')]},\n {name: 'TEXTURES', label: 'Textures', bindings: [\n {name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: {binding: 0, visibility: 4, sampler: {}}} as BindingSchema,\n texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),\n texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),\n texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)]},\n {name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')]},\n {name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')]}\n];\nexport const hwrtBindings = {ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8};\nexport function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n return bindGroups.map(group => ({label: group.label, entries: group.bindings.map(binding => binding.layout)}));\n}\n\nexport function rayTraceUniformOffsets() {\nconst uniform = makeRayTraceUniform();\nconst rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) =>\n [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));\nrayTraceUniform.BYTES = uniform.buffer.byteLength;\nreturn rayTraceUniform;\n}\nexport const uniformSizes = {CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES};\n\n// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.\nexport const framePixelFields = [\n ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],\n ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],\n ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],\n ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],\n ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],\n ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],\n ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],\n ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],\n ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],\n ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],\n ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],\n ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],\n ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],\n ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n] as const;\n"]}
@@ -1,10 +1,10 @@
1
- import { SceneLight } from '../scene/Scene.js';
2
- import { EnvironmentMapSource } from './envMapDistribution.js';
1
+ import type { SceneLight } from '../scene/Scene.js';
2
+ import type { EnvironmentSource } from './envMapDistribution.js';
3
3
  /** Synthesized environment data is retained across analytic-light edits. */
4
4
  export declare class SceneEnvironmentCache {
5
5
  private _snapshot;
6
6
  private _image?;
7
- update(lights: readonly SceneLight[]): EnvironmentMapSource | undefined;
7
+ update(lights: readonly SceneLight[]): EnvironmentSource | undefined;
8
8
  }
9
9
  /** Captures values before callers mutate a RectLight or its Texture in place. */
10
10
  export declare class RectLightTextureTracker {
@@ -1 +1 @@
1
- {"version":3,"file":"sceneLightChanges.js","sourceRoot":"","sources":["../../src/renderer/sceneLightChanges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAIxE,4EAA4E;AAC5E,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAgB,EAAE,CAAC;IAC5B,MAAM,CAAwB;IACtC,MAAM,CAAC,MAA6B;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC9E,+EAA+E;QAC/E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACvE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,uBAAuB;IAC1B,SAAS,GAAc,EAAE,CAAC;IAC1B,WAAW,GAAG,KAAK,CAAC;IAC5B,MAAM,CAAC,MAA6B;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK;YACzF,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAsB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["import { SceneLight } from '../scene/Scene.js';\nimport { snapshotFields, snapshotsEqual } from './sceneChangeDetector.js';\nimport { generateEnvMapFromSceneComponents } from './envMapCreation.js';\nimport { EnvironmentMapSource } from './envMapDistribution.js';\nimport Texture from '../scene/Texture.js';\n\n/** Synthesized environment data is retained across analytic-light edits. */\nexport class SceneEnvironmentCache {\n private _snapshot: unknown[][] = [];\n private _image?: EnvironmentMapSource;\n update(lights: readonly SceneLight[]) {\n const ambient = lights.filter(light => light.type === 'AmbientLight');\n const environment = lights.filter(light => light.type === 'EnvironmentLight');\n // Orientation changes only the shader directions, not the radiance or its CDF.\n const next = [...ambient.map(snapshotFields), ...environment.map(light =>\n [light, light.map, light.map.image, light.map.version, light.map.source, light.intensity])];\n if (next.length !== this._snapshot.length ||\n next.some((value, i) => !snapshotsEqual(value, this._snapshot[i]))) {\n this._image = next.length ? generateEnvMapFromSceneComponents(ambient, environment) : undefined;\n this._snapshot = next;\n }\n return this._image;\n }\n}\n\n/** Captures values before callers mutate a RectLight or its Texture in place. */\nexport class RectLightTextureTracker {\n private _snapshot: unknown[] = [];\n private _hadTexture = false;\n update(lights: readonly SceneLight[]) {\n const textures = lights.map(light => light.type === 'RectLight' ? light.texture : undefined);\n const next = textures.flatMap(texture => texture ? [texture, texture.version, texture.image,\n texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined]);\n const hasTexture = textures.some((texture): texture is Texture => !!texture);\n const changed = (this._hadTexture || hasTexture) && !snapshotsEqual(next, this._snapshot);\n this._snapshot = next;\n this._hadTexture = hasTexture;\n return changed;\n }\n}\n"]}
1
+ {"version":3,"file":"sceneLightChanges.js","sourceRoot":"","sources":["../../src/renderer/sceneLightChanges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAIxE,4EAA4E;AAC5E,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAgB,EAAE,CAAC;IAC5B,MAAM,CAAqB;IACnC,MAAM,CAAC,MAA6B;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC9E,+EAA+E;QAC/E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACvE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,uBAAuB;IAC1B,SAAS,GAAc,EAAE,CAAC;IAC1B,WAAW,GAAG,KAAK,CAAC;IAC5B,MAAM,CAAC,MAA6B;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK;YACzF,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAsB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["import type { SceneLight } from '../scene/Scene.js';\nimport { snapshotFields, snapshotsEqual } from './sceneChangeDetector.js';\nimport { generateEnvMapFromSceneComponents } from './envMapCreation.js';\nimport type { EnvironmentSource } from './envMapDistribution.js';\nimport Texture from '../scene/Texture.js';\n\n/** Synthesized environment data is retained across analytic-light edits. */\nexport class SceneEnvironmentCache {\n private _snapshot: unknown[][] = [];\n private _image?: EnvironmentSource;\n update(lights: readonly SceneLight[]) {\n const ambient = lights.filter(light => light.type === 'AmbientLight');\n const environment = lights.filter(light => light.type === 'EnvironmentLight');\n // Orientation changes only the shader directions, not the radiance or its CDF.\n const next = [...ambient.map(snapshotFields), ...environment.map(light =>\n [light, light.map, light.map.image, light.map.version, light.map.source, light.intensity])];\n if (next.length !== this._snapshot.length ||\n next.some((value, i) => !snapshotsEqual(value, this._snapshot[i]))) {\n this._image = next.length ? generateEnvMapFromSceneComponents(ambient, environment) : undefined;\n this._snapshot = next;\n }\n return this._image;\n }\n}\n\n/** Captures values before callers mutate a RectLight or its Texture in place. */\nexport class RectLightTextureTracker {\n private _snapshot: unknown[] = [];\n private _hadTexture = false;\n update(lights: readonly SceneLight[]) {\n const textures = lights.map(light => light.type === 'RectLight' ? light.texture : undefined);\n const next = textures.flatMap(texture => texture ? [texture, texture.version, texture.image,\n texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined]);\n const hasTexture = textures.some((texture): texture is Texture => !!texture);\n const changed = (this._hadTexture || hasTexture) && !snapshotsEqual(next, this._snapshot);\n this._snapshot = next;\n this._hadTexture = hasTexture;\n return changed;\n }\n}\n"]}