@meimu/mutracer 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +195 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14352 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +144 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +273 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +121 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +256 -0
  35. package/lib/Render.js +671 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +76 -0
  38. package/lib/RenderLoop.js +204 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1446 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +121 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +619 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +100 -0
  511. package/lib/util/fromTHREE.js +1063 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,232 @@
1
+ import { openPbrSchema } from '../scene/openPbrSchema.js';
2
+ import { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';
3
+ export { materialParametersEqual } from './materialComparison.generated.js';
4
+ import InstancedMesh from '../scene/InstancedMesh.js';
5
+ import { materialTextureKeys } from '../scene/OpenPBRMaterial.js';
6
+ import Texture from '../scene/Texture.js';
7
+ /** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */
8
+ export function snapshotFields(object) {
9
+ const values = [object];
10
+ for (const key of Object.keys(object)) {
11
+ const value = object[key];
12
+ values.push(key);
13
+ if (value instanceof Texture)
14
+ values.push(...snapshotTexture(value));
15
+ else if (Array.isArray(value) || ArrayBuffer.isView(value)) {
16
+ values.push(...Array.from(value));
17
+ }
18
+ else
19
+ values.push(value);
20
+ }
21
+ return values;
22
+ }
23
+ function snapshotTexture(texture) {
24
+ return texture ? [texture, texture.version, texture.image, texture.flipY,
25
+ texture.uvScale, texture.uvOffset, texture.uvChannel] : [undefined];
26
+ }
27
+ export function snapshotsEqual(a, b) {
28
+ return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));
29
+ }
30
+ function backgroundSnapshot(background) {
31
+ if (background instanceof Texture)
32
+ return snapshotTexture(background);
33
+ if (Array.isArray(background))
34
+ return [background, ...background];
35
+ return background ? snapshotFields(background) : [undefined];
36
+ }
37
+ function captureMaterialTextures(material, out) {
38
+ let i = 0;
39
+ for (const key of materialTextureKeys) {
40
+ const texture = material[key];
41
+ if (typeof texture === 'number')
42
+ continue;
43
+ if (!texture) {
44
+ out[i++] = undefined;
45
+ continue;
46
+ }
47
+ out[i++] = texture;
48
+ out[i++] = texture.version;
49
+ out[i++] = texture.image;
50
+ out[i++] = texture.flipY;
51
+ out[i++] = texture.uvScale;
52
+ out[i++] = texture.uvOffset;
53
+ out[i++] = texture.uvChannel;
54
+ }
55
+ out.length = i;
56
+ }
57
+ // Texture references and metadata have their own snapshot.
58
+ const parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);
59
+ export function snapshotMaterialParameters(material, previous) {
60
+ return parameterKeys.map((key, index) => {
61
+ const value = material[key];
62
+ if (Array.isArray(value) || ArrayBuffer.isView(value)) {
63
+ const array = value, prior = previous?.[index];
64
+ if (Array.isArray(prior) && prior.length === array.length) {
65
+ let equal = true;
66
+ for (let i = 0; i < array.length; i++)
67
+ if (!Object.is(array[i], prior[i])) {
68
+ equal = false;
69
+ break;
70
+ }
71
+ if (equal)
72
+ return prior;
73
+ }
74
+ return Array.from(array);
75
+ }
76
+ return value;
77
+ });
78
+ }
79
+ const geometryAttributes = ['position', 'normal', 'tangent', 'uv', 'uv1', 'color', 'indices', 'materialIndex'];
80
+ function captureGeometryStorage(geometry, out) {
81
+ let i = 0;
82
+ for (const key of geometryAttributes) {
83
+ const attribute = geometry[key];
84
+ out[i++] = attribute?.array;
85
+ out[i++] = attribute?.array.length;
86
+ out[i++] = attribute?.itemSize;
87
+ }
88
+ }
89
+ function geometryStorageMatches(geometry, storage) {
90
+ let i = 0;
91
+ for (const key of geometryAttributes) {
92
+ const attribute = geometry[key];
93
+ if (storage[i++] !== attribute?.array || storage[i++] !== attribute?.array.length || storage[i++] !== attribute?.itemSize)
94
+ return false;
95
+ }
96
+ return true;
97
+ }
98
+ /** Detects edits without accepting them until the pipeline has received the scene. */
99
+ export class SceneChangeDetector {
100
+ _snapshot;
101
+ _pending;
102
+ _spare;
103
+ _seen = new Set();
104
+ detect(scene) {
105
+ const old = this._snapshot;
106
+ let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;
107
+ const transforms = [];
108
+ const colors = [];
109
+ const geometries = new Set();
110
+ const materials = [];
111
+ const seen = this._seen;
112
+ seen.clear();
113
+ for (let i = 0; i < scene.meshes.length; i++) {
114
+ const mesh = scene.meshes[i];
115
+ const prev = old?.meshes[i];
116
+ let instanceChanged = false;
117
+ if (mesh instanceof InstancedMesh) {
118
+ mesh.validate();
119
+ if (prev?.instanceCount !== mesh.count)
120
+ full = true;
121
+ if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors))
122
+ colors.push(mesh);
123
+ if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {
124
+ transforms.push(mesh);
125
+ instanceChanged = true;
126
+ }
127
+ }
128
+ if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||
129
+ prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||
130
+ prev.materials.some((m, k) => m !== mesh.materials[k]))
131
+ full = true;
132
+ if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version)
133
+ geometries.add(mesh.geometry);
134
+ if (prev?.mesh === mesh) {
135
+ for (let k = 0; k < 16; k++) {
136
+ if (!Object.is(mesh.transform[k], old.matrices[i * 16 + k])) {
137
+ if (!instanceChanged)
138
+ transforms.push(mesh);
139
+ break;
140
+ }
141
+ }
142
+ }
143
+ for (const material of mesh.materials) {
144
+ if (seen.has(material))
145
+ continue;
146
+ seen.add(material);
147
+ const prior = old?.materials.get(material);
148
+ if (!prior || !materialParametersEqual(material, prior.values) ||
149
+ materialTexturesChanged(material, prior.textures))
150
+ materials.push(material);
151
+ }
152
+ }
153
+ const lights = scene.lights.map(snapshotFields);
154
+ const background = backgroundSnapshot(scene.background);
155
+ const changes = {
156
+ meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',
157
+ transforms, colors, materials, geometries: [...geometries],
158
+ lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||
159
+ lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),
160
+ background: !old || !snapshotsEqual(background, old.background)
161
+ };
162
+ if (changes.meshes !== 'none' || changes.lights || changes.background) {
163
+ // Write into the other buffer: detect never mutates committed state.
164
+ // Repeated detects without commit overwrite the same pending buffer.
165
+ let next = this._spare;
166
+ if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {
167
+ next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),
168
+ materials: new Map(), lightList: scene.lights, lights: [], background: [] };
169
+ this._spare = next;
170
+ }
171
+ scene.meshes.forEach((mesh, i) => {
172
+ let item = next.meshes[i];
173
+ if (!item) {
174
+ item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],
175
+ materials: [] };
176
+ next.meshes[i] = item;
177
+ }
178
+ item.mesh = mesh;
179
+ item.geometry = mesh.geometry;
180
+ item.version = mesh.geometry.version;
181
+ item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;
182
+ item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;
183
+ item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;
184
+ item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;
185
+ item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;
186
+ item.dynamic = mesh.geometry.dynamic;
187
+ captureGeometryStorage(mesh.geometry, item.storage);
188
+ item.materials.length = mesh.materials.length;
189
+ for (let k = 0; k < mesh.materials.length; k++)
190
+ item.materials[k] = mesh.materials[k];
191
+ next.matrices.set(mesh.transform, i * 16);
192
+ });
193
+ for (const material of next.materials.keys())
194
+ if (!seen.has(material))
195
+ next.materials.delete(material);
196
+ const changedMaterials = new Set(materials);
197
+ for (const material of seen) {
198
+ const previous = old?.materials.get(material);
199
+ if (previous && !changedMaterials.has(material)) {
200
+ next.materials.set(material, previous);
201
+ }
202
+ else {
203
+ // Never overwrite a shared committed entry. The other buffer's
204
+ // retired entry can reuse its texture storage; parameter arrays and
205
+ // their reused vector snapshots remain immutable after capture.
206
+ let item = next.materials.get(material);
207
+ if (!item || item === previous)
208
+ item = { values: [], textures: [] };
209
+ item.values = snapshotMaterialParameters(material, previous?.values);
210
+ captureMaterialTextures(material, item.textures);
211
+ next.materials.set(material, item);
212
+ }
213
+ }
214
+ next.lightList = scene.lights;
215
+ next.lights = lights;
216
+ next.background = background;
217
+ this._pending = next;
218
+ }
219
+ else
220
+ this._pending = old;
221
+ return changes;
222
+ }
223
+ commit() {
224
+ if (this._pending && this._pending !== this._snapshot) {
225
+ this._spare = this._snapshot;
226
+ this._snapshot = this._pending;
227
+ }
228
+ this._pending = undefined;
229
+ }
230
+ reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }
231
+ }
232
+ //# sourceMappingURL=sceneChangeDetector.js.map
@@ -0,0 +1 @@
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;AAa1C,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,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACxE,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;IAC/B,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;AAED,MAAM,kBAAkB,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,CAAU,CAAC;AACxH,SAAS,sBAAsB,CAAC,QAAkB,EAAE,GAAc;IAChE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;QAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,CAAC;IAClG,CAAC;AACH,CAAC;AACD,SAAS,sBAAsB,CAAC,QAAkB,EAAE,OAAkB;IACpE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,QAAQ;YAAE,OAAO,KAAK,CAAC;IAC1I,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAyBD,sFAAsF;AACtF,MAAM,OAAO,mBAAmB;IACtB,SAAS,CAAY;IACrB,QAAQ,CAAY;IACpB,MAAM,CAAY;IAClB,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,MAAM,CAAC,KAAY;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3B,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9F,MAAM,UAAU,GAAW,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAY,CAAC;QACvC,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,IAAI,IAAI,YAAY,aAAa,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC,KAAK;oBAAE,IAAI,GAAG,IAAI,CAAC;gBACpD,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChI,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5H,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAAC,eAAe,GAAG,IAAI,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;gBAChE,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;gBACjJ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAAE,IAAI,GAAG,IAAI,CAAC;YACtE,IAAI,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9G,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7D,IAAI,CAAC,eAAe;4BAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5C,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnB,MAAM,KAAK,GAAG,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;oBAC5D,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,OAAO,GAAiB;YAC5B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;YAC1H,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC;YAC1D,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM;gBACnF,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC;SAChE,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACtE,qEAAqE;YACrE,qEAAqE;YACrE,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC1F,IAAI,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;oBAC/F,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;gBAC9E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC/B,IAAI,IAAI,GAAG,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;wBACjH,SAAS,EAAE,EAAE,EAAE,CAAC;oBAClB,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBACzB,CAAC;gBACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACtF,IAAI,CAAC,eAAe,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1F,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnF,IAAI,CAAC,cAAc,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9E,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5E,IAAI,CAAC,kBAAkB,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC1F,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;oBAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtF,IAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvG,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,+DAA+D;oBAC/D,oEAAoE;oBACpE,gEAAgE;oBAChE,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACxC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;wBAAE,IAAI,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;oBACpE,IAAI,CAAC,MAAM,GAAG,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;oBACrE,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;YAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAClF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;;YAAM,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IACD,KAAK,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CAC1F","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] : [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;\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"]}
@@ -0,0 +1,14 @@
1
+ import { SceneLight } from '../scene/Scene.js';
2
+ import { EnvironmentMapSource } from './envMapDistribution.js';
3
+ /** Synthesized environment data is retained across analytic-light edits. */
4
+ export declare class SceneEnvironmentCache {
5
+ private _snapshot;
6
+ private _image?;
7
+ update(lights: readonly SceneLight[]): EnvironmentMapSource | undefined;
8
+ }
9
+ /** Captures values before callers mutate a RectLight or its Texture in place. */
10
+ export declare class RectLightTextureTracker {
11
+ private _snapshot;
12
+ private _hadTexture;
13
+ update(lights: readonly SceneLight[]): boolean;
14
+ }
@@ -0,0 +1,34 @@
1
+ import { snapshotFields, snapshotsEqual } from './sceneChangeDetector.js';
2
+ import { generateEnvMapFromSceneComponents } from './envMapCreation.js';
3
+ /** Synthesized environment data is retained across analytic-light edits. */
4
+ export class SceneEnvironmentCache {
5
+ _snapshot = [];
6
+ _image;
7
+ update(lights) {
8
+ const ambient = lights.filter(light => light.type === 'AmbientLight');
9
+ const environment = lights.filter(light => light.type === 'EnvironmentLight');
10
+ const next = [...ambient, ...environment].map(snapshotFields);
11
+ if (next.length !== this._snapshot.length ||
12
+ next.some((value, i) => !snapshotsEqual(value, this._snapshot[i]))) {
13
+ this._image = next.length ? generateEnvMapFromSceneComponents(ambient, environment) : undefined;
14
+ this._snapshot = next;
15
+ }
16
+ return this._image;
17
+ }
18
+ }
19
+ /** Captures values before callers mutate a RectLight or its Texture in place. */
20
+ export class RectLightTextureTracker {
21
+ _snapshot = [];
22
+ _hadTexture = false;
23
+ update(lights) {
24
+ const textures = lights.map(light => light.type === 'RectLight' ? light.texture : undefined);
25
+ const next = textures.flatMap(texture => texture ? [texture, texture.version, texture.image,
26
+ texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel] : [undefined]);
27
+ const hasTexture = textures.some((texture) => !!texture);
28
+ const changed = (this._hadTexture || hasTexture) && !snapshotsEqual(next, this._snapshot);
29
+ this._snapshot = next;
30
+ this._hadTexture = hasTexture;
31
+ return changed;
32
+ }
33
+ }
34
+ //# sourceMappingURL=sceneLightChanges.js.map
@@ -0,0 +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,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9D,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,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5F,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 const next = [...ambient, ...environment].map(snapshotFields);\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] : [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"]}
@@ -0,0 +1,3 @@
1
+ /** Generate sampling wrappers; shader callers always use these explicit names. */
2
+ export declare function scratchWGSLFunctions(textures: readonly string[], samplers: readonly string[], scratch?: boolean): string;
3
+ export declare function scratchGLSLFunctions(textures: readonly string[], scratch?: boolean): string;
@@ -0,0 +1,39 @@
1
+ /** Generate sampling wrappers; shader callers always use these explicit names. */
2
+ export function scratchWGSLFunctions(textures, samplers, scratch = false) {
3
+ return textures.map((name, index) => /* wgsl */ `
4
+ fn ${name}Region() -> vec2u {
5
+ return ${scratch ? `imageRegions[${index}].xy` : `textureDimensions(${name})`};
6
+ }
7
+ fn load_${name}(fM: vec2i, level: i32) -> vec4f {
8
+ ${scratch ? `if (any(fM < vec2i(0)) || any(fM >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}
9
+ return textureLoad(${name}, fM, level);
10
+ }
11
+ ${samplers.map(sampler => /* wgsl */ `
12
+ fn sample_${name}_${sampler}(fD: vec2f) -> vec4f {
13
+ ${scratch ? /* wgsl */ `
14
+ let jT = textureDimensions(${name});
15
+ if (all(jT == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, fD, 0.0); }
16
+ let fM = clamp(fD * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
17
+ return textureSampleLevel(${name}, ${sampler}, fM / vec2f(jT), 0.0);`
18
+ : `return textureSample(${name}, ${sampler}, fD);`}
19
+ }`).join('')}`).join('');
20
+ }
21
+ export function scratchGLSLFunctions(textures, scratch = false) {
22
+ return textures.map(name => /* glsl */ `
23
+ ivec2 ${name}Region() {
24
+ return ${scratch ? `${name}RegionSize` : `textureSize(${name}, 0)`};
25
+ }
26
+ vec4 load_${name}(ivec2 fM, int level) {
27
+ ${scratch ? `if (any(lessThan(fM, ivec2(0))) || any(greaterThanEqual(fM, ${name}Region()))) return vec4(0.0);` : ''}
28
+ return texelFetch(${name}, fM, level);
29
+ }
30
+ vec4 sample_${name}(vec2 fD) {
31
+ ${scratch ? /* glsl */ `
32
+ ivec2 jT = textureSize(${name}, 0);
33
+ if (all(equal(jT, ${name}Region()))) return texture(${name}, fD);
34
+ vec2 fM = clamp(fD * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
35
+ return texture(${name}, fM / vec2(jT));`
36
+ : `return texture(${name}, fD);`}
37
+ }`).join('');
38
+ }
39
+ //# sourceMappingURL=scratchSampling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scratchSampling.js","sourceRoot":"","sources":["../../src/renderer/scratchSampling.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAClC,QAA2B,EAC3B,QAA2B,EAC3B,OAAO,GAAG,KAAK;IAEf,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC;KAC7C,IAAI;SACE,OAAO,CAAC,CAAC,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,IAAI,GAAG;;UAErE,IAAI;EACV,OAAO,CAAC,CAAC,CAAC,6CAAmD,IAAI,oCAAoC,CAAC,CAAC,CAAC,EAAE;qBACvF,IAAI;;EAEzB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC;YACzB,IAAI,IAAI,OAAO;EACvB,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;6BACgB,IAAI;gBACjB,IAAI,0CAA0C,IAAI,KAAK,OAAO;4BACtD,IAAI,gCAAgC,IAAI;4BAC9C,IAAI,KAAK,OAAO,yBAAsC;QAClF,CAAC,CAAC,wBAAwB,IAAI,KAAK,OAAO,QAAW;EACrD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA2B,EAAE,OAAO,GAAG,KAAK;IAC/E,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC;QACjC,IAAI;SACD,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,eAAe,IAAI,MAAM;;YAExD,IAAI;EACZ,OAAO,CAAC,CAAC,CAAC,+DAAqE,IAAI,+BAA+B,CAAC,CAAC,CAAC,EAAE;oBACrG,IAAI;;cAEZ,IAAI;EACd,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;yBACY,IAAI;oBACT,IAAI,8BAA8B,IAAI;4BAClC,IAAI,8BAA8B,IAAI;iBACvD,IAAI,mBAAgC;QACrD,CAAC,CAAC,kBAAkB,IAAI,QAAW;EACnC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC","sourcesContent":["/** Generate sampling wrappers; shader callers always use these explicit names. */\nexport function scratchWGSLFunctions(\n textures: readonly string[],\n samplers: readonly string[],\n scratch = false\n) {\n return textures.map((name, index) => /* wgsl */ `\nfn ${name}Region() -> vec2u {\n return ${scratch ? `imageRegions[${index}].xy` : `textureDimensions(${name})`};\n}\nfn load_${name}(pixel: vec2i, level: i32) -> vec4f {\n ${scratch ? `if (any(pixel < vec2i(0)) || any(pixel >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}\n return textureLoad(${name}, pixel, level);\n}\n${samplers.map(sampler => /* wgsl */ `\nfn sample_${name}_${sampler}(coord: vec2f) -> vec4f {\n ${scratch ? /* wgsl */ `\n let physicalSize = textureDimensions(${name});\n if (all(physicalSize == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }\n let pixel = clamp(coord * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));\n return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(physicalSize), 0.0);`\n : `return textureSample(${name}, ${sampler}, coord);`}\n}`).join('')}`).join('');\n}\n\nexport function scratchGLSLFunctions(textures: readonly string[], scratch = false) {\n return textures.map(name => /* glsl */ `\nivec2 ${name}Region() {\n return ${scratch ? `${name}RegionSize` : `textureSize(${name}, 0)`};\n}\nvec4 load_${name}(ivec2 pixel, int level) {\n ${scratch ? `if (any(lessThan(pixel, ivec2(0))) || any(greaterThanEqual(pixel, ${name}Region()))) return vec4(0.0);` : ''}\n return texelFetch(${name}, pixel, level);\n}\nvec4 sample_${name}(vec2 coord) {\n ${scratch ? /* glsl */ `\n ivec2 physicalSize = textureSize(${name}, 0);\n if (all(equal(physicalSize, ${name}Region()))) return texture(${name}, coord);\n vec2 pixel = clamp(coord * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));\n return texture(${name}, pixel / vec2(physicalSize));`\n : `return texture(${name}, coord);`}\n}`).join('');\n}\n"]}
@@ -0,0 +1,37 @@
1
+ export type ShaderDefineValue = string | number | boolean | null;
2
+ export interface ShaderUniform<T = unknown> {
3
+ type: string;
4
+ value?: T;
5
+ len?: string | number;
6
+ array?: boolean;
7
+ }
8
+ export interface ShaderMixin {
9
+ defines: Record<string, ShaderDefineValue>;
10
+ uniforms: Record<string, ShaderUniform>;
11
+ main: string;
12
+ functions?: Array<(name?: string) => string>;
13
+ }
14
+ export declare function glsl(strings: TemplateStringsArray, ...values: unknown[]): string;
15
+ export declare function createShaderMixin(options: Partial<ShaderMixin> | string): ShaderMixin;
16
+ export declare class Shader {
17
+ static uniform<T>(type: string, value?: T): ShaderUniform<T>;
18
+ static arrayUniform<T>(type: string, len: string | number, value?: T): ShaderUniform<T>;
19
+ }
20
+ export interface FragmentShaderOptions {
21
+ name?: string;
22
+ outputs?: string[];
23
+ defines?: Record<string, ShaderDefineValue>;
24
+ uniforms?: Record<string, ShaderUniform>;
25
+ includes?: ShaderMixin[];
26
+ main: string;
27
+ }
28
+ export declare class FragmentShader<TDefines extends Record<string, ShaderDefineValue> = Record<string, ShaderDefineValue>, TUniforms extends Record<string, ShaderUniform> = Record<string, ShaderUniform>> {
29
+ readonly name: string;
30
+ readonly outputs: string[];
31
+ readonly defines: TDefines;
32
+ readonly uniforms: TUniforms;
33
+ readonly functions: Array<(name?: string) => string>;
34
+ readonly main: string;
35
+ parallelCompile: boolean;
36
+ constructor(options: FragmentShaderOptions);
37
+ }
@@ -0,0 +1,41 @@
1
+ export function glsl(strings, ...values) {
2
+ return strings.reduce((result, part, index) => result + (index ? String(values[index - 1] ?? '') : '') + part, '');
3
+ }
4
+ export function createShaderMixin(options) {
5
+ if (typeof options === 'string') {
6
+ options = { main: options };
7
+ }
8
+ return {
9
+ defines: options.defines || {},
10
+ uniforms: options.uniforms || {},
11
+ main: options.main || '',
12
+ functions: options.functions || []
13
+ };
14
+ }
15
+ export class Shader {
16
+ static uniform(type, value) {
17
+ return { type, value };
18
+ }
19
+ static arrayUniform(type, len, value) {
20
+ return { type, len, value, array: true };
21
+ }
22
+ }
23
+ export class FragmentShader {
24
+ name;
25
+ outputs;
26
+ defines;
27
+ uniforms;
28
+ functions;
29
+ main;
30
+ parallelCompile = false;
31
+ constructor(options) {
32
+ const includes = options.includes || [];
33
+ this.name = options.name || '';
34
+ this.outputs = options.outputs || ['color'];
35
+ this.defines = Object.assign({}, ...includes.map((item) => item.defines), options.defines || {});
36
+ this.uniforms = Object.assign({}, ...includes.map((item) => item.uniforms), options.uniforms || {});
37
+ this.functions = includes.flatMap((item) => item.functions || []);
38
+ this.main = options.main;
39
+ }
40
+ }
41
+ //# sourceMappingURL=shader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader.js","sourceRoot":"","sources":["../../src/renderer/shader.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,IAAI,CAAC,OAA6B,EAAE,GAAG,MAAiB;IACtE,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CACtB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAChE,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAsC;IAEtC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,MAAM;IACjB,MAAM,CAAC,OAAO,CAAI,IAAY,EAAE,KAAS;QACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,IAAY,EACZ,GAAoB,EACpB,KAAS;QAET,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;CACF;AAWD,MAAM,OAAO,cAAc;IAUhB,IAAI,CAAS;IACb,OAAO,CAAW;IAClB,OAAO,CAAW;IAClB,QAAQ,CAAY;IACpB,SAAS,CAAmC;IAC5C,IAAI,CAAS;IACtB,eAAe,GAAG,KAAK,CAAC;IAExB,YAAY,OAA8B;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAC1B,EAAE,EACF,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EACvC,OAAO,CAAC,OAAO,IAAI,EAAE,CACV,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC3B,EAAE,EACF,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxC,OAAO,CAAC,QAAQ,IAAI,EAAE,CACV,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF","sourcesContent":["export type ShaderDefineValue = string | number | boolean | null;\n\nexport interface ShaderUniform<T = unknown> {\n type: string;\n value?: T;\n len?: string | number;\n array?: boolean;\n}\n\nexport interface ShaderMixin {\n defines: Record<string, ShaderDefineValue>;\n uniforms: Record<string, ShaderUniform>;\n main: string;\n functions?: Array<(name?: string) => string>;\n}\n\nexport function glsl(strings: TemplateStringsArray, ...values: unknown[]) {\n return strings.reduce(\n (result, part, index) =>\n result + (index ? String(values[index - 1] ?? '') : '') + part,\n ''\n );\n}\n\nexport function createShaderMixin(\n options: Partial<ShaderMixin> | string\n): ShaderMixin {\n if (typeof options === 'string') {\n options = { main: options };\n }\n return {\n defines: options.defines || {},\n uniforms: options.uniforms || {},\n main: options.main || '',\n functions: options.functions || []\n };\n}\n\nexport class Shader {\n static uniform<T>(type: string, value?: T): ShaderUniform<T> {\n return { type, value };\n }\n\n static arrayUniform<T>(\n type: string,\n len: string | number,\n value?: T\n ): ShaderUniform<T> {\n return { type, len, value, array: true };\n }\n}\n\nexport interface FragmentShaderOptions {\n name?: string;\n outputs?: string[];\n defines?: Record<string, ShaderDefineValue>;\n uniforms?: Record<string, ShaderUniform>;\n includes?: ShaderMixin[];\n main: string;\n}\n\nexport class FragmentShader<\n TDefines extends Record<string, ShaderDefineValue> = Record<\n string,\n ShaderDefineValue\n >,\n TUniforms extends Record<string, ShaderUniform> = Record<\n string,\n ShaderUniform\n >\n> {\n readonly name: string;\n readonly outputs: string[];\n readonly defines: TDefines;\n readonly uniforms: TUniforms;\n readonly functions: Array<(name?: string) => string>;\n readonly main: string;\n parallelCompile = false;\n\n constructor(options: FragmentShaderOptions) {\n const includes = options.includes || [];\n this.name = options.name || '';\n this.outputs = options.outputs || ['color'];\n this.defines = Object.assign(\n {},\n ...includes.map((item) => item.defines),\n options.defines || {}\n ) as TDefines;\n this.uniforms = Object.assign(\n {},\n ...includes.map((item) => item.uniforms),\n options.uniforms || {}\n ) as TUniforms;\n this.functions = includes.flatMap((item) => item.functions || []);\n this.main = options.main;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { type BvhBuildConfig } from './geometryBvh.js';
2
+ import type Mesh from '../scene/Mesh.js';
3
+ import type { TinyBvhLayout } from '../tinybvh/TinyBvhBuilder.js';
4
+ import { BvhWorkerPool } from './bvhWorkerClient.js';
5
+ export interface StaticBvhPreparationOptions {
6
+ config?: BvhBuildConfig;
7
+ builder: 'builtin' | 'tinybvh';
8
+ layout: TinyBvhLayout;
9
+ spatialSplits: boolean;
10
+ useWorker: boolean;
11
+ workerPool?: BvhWorkerPool;
12
+ isCancelled?: () => boolean;
13
+ rebuild: boolean;
14
+ onProgress?: (progress: number) => void;
15
+ }
16
+ export interface StaticBvhPreparationResult {
17
+ geometryCount: number;
18
+ bvhTimeMs: number;
19
+ failedMeshes: Mesh[];
20
+ workerUnavailable: boolean;
21
+ tinyBvhUnavailable: boolean;
22
+ }
23
+ /** Build static BLASes once per target geometry, preserving old BVHs until writeback. */
24
+ export declare function prepareStaticBvhs(meshes: readonly Mesh[], options: StaticBvhPreparationOptions): Promise<StaticBvhPreparationResult>;
@@ -0,0 +1,116 @@
1
+ import { setGeometryBvh } from './geometryBvh.js';
2
+ import { buildBLAS } from './bvhAccel.js';
3
+ import { buildBvhInWorker, BvhWorkerPool, BvhWorkerUnavailableError, BvhWorkerDisposedError } from './bvhWorkerClient.js';
4
+ import { captureMeshBlasSnapshot, getMeshBlasInput, getPreparedMeshGeometry, meshNeedsStaticBvh, meshBlasSnapshotIsCurrent } from './prepareMeshBVH.js';
5
+ /** Build static BLASes once per target geometry, preserving old BVHs until writeback. */
6
+ export async function prepareStaticBvhs(meshes, options) {
7
+ const result = {
8
+ geometryCount: 0, bvhTimeMs: 0, failedMeshes: [],
9
+ workerUnavailable: false, tinyBvhUnavailable: false
10
+ };
11
+ const jobs = new Map();
12
+ for (const mesh of meshes) {
13
+ if (!mesh.geometry.position?.array.length || mesh.geometry.dynamic)
14
+ continue;
15
+ const target = getPreparedMeshGeometry(mesh);
16
+ if (jobs.has(target) || (!meshNeedsStaticBvh(mesh, options.config ?? options) && !options.rebuild))
17
+ continue;
18
+ try {
19
+ jobs.set(target, { mesh, snapshot: captureMeshBlasSnapshot(mesh, target) });
20
+ }
21
+ catch {
22
+ result.failedMeshes.push(mesh);
23
+ }
24
+ }
25
+ const pool = options.useWorker ? options.workerPool ?? new BvhWorkerPool(1) : undefined;
26
+ async function build(input, builder, useWorker) {
27
+ const { geometry, displacementScale, trianglesDisplacement } = input;
28
+ let bvh;
29
+ if (useWorker) {
30
+ bvh = await buildBvhInWorker(geometry, displacementScale, trianglesDisplacement, builder, builder === 'tinybvh' ? options.layout : 'bvh2', options.spatialSplits, pool);
31
+ }
32
+ else if (builder === 'tinybvh') {
33
+ const { buildTinyBvh } = await import('../tinybvh/TinyBvhBuilder.js');
34
+ bvh = await buildTinyBvh(geometry, displacementScale, trianglesDisplacement, options.layout, options.spatialSplits);
35
+ }
36
+ else {
37
+ const start = performance.now();
38
+ bvh = { ...buildBLAS(geometry, displacementScale, trianglesDisplacement),
39
+ bvhTimeMs: performance.now() - start };
40
+ }
41
+ if (builder === 'tinybvh' && (bvh.builder !== 'tinybvh' || !bvh.buffer.byteLength)) {
42
+ throw new Error('TinyBVH did not build every scene geometry.');
43
+ }
44
+ result.bvhTimeMs += bvh.bvhTimeMs ?? 0;
45
+ return bvh;
46
+ }
47
+ async function buildWithFallback(input) {
48
+ let builder = options.builder;
49
+ let useWorker = options.useWorker && !result.workerUnavailable;
50
+ for (;;) {
51
+ if (options.isCancelled?.())
52
+ throw new BvhWorkerDisposedError();
53
+ try {
54
+ return await build(input, builder, useWorker);
55
+ }
56
+ catch (error) {
57
+ if (error instanceof BvhWorkerDisposedError)
58
+ throw error;
59
+ if (error instanceof BvhWorkerUnavailableError && useWorker) {
60
+ result.workerUnavailable = true;
61
+ useWorker = false;
62
+ }
63
+ else if (builder === 'tinybvh') {
64
+ result.tinyBvhUnavailable = true;
65
+ builder = 'builtin';
66
+ useWorker = options.useWorker && !result.workerUnavailable;
67
+ }
68
+ else {
69
+ throw error;
70
+ }
71
+ }
72
+ }
73
+ }
74
+ let completed = 0;
75
+ // Large BLASes start first to reduce the tail. Only active lanes prepare
76
+ // attributes/displacement inputs and submit geometry to Workers.
77
+ const pending = [...jobs].sort(([a], [b]) => (b.indices?.array.length ?? 0) - (a.indices?.array.length ?? 0));
78
+ let next = 0;
79
+ async function runLane() {
80
+ while (next < pending.length && !options.isCancelled?.()) {
81
+ const [target, { mesh, snapshot }] = pending[next++];
82
+ try {
83
+ if (!meshBlasSnapshotIsCurrent(mesh, target, snapshot))
84
+ continue;
85
+ const input = getMeshBlasInput(mesh);
86
+ const bvh = await buildWithFallback(input);
87
+ if (!options.isCancelled?.() && meshBlasSnapshotIsCurrent(mesh, target, snapshot)) {
88
+ setGeometryBvh(target, bvh, options.config ?? options);
89
+ result.geometryCount++;
90
+ }
91
+ }
92
+ catch (error) {
93
+ if (!(error instanceof BvhWorkerDisposedError))
94
+ result.failedMeshes.push(mesh);
95
+ }
96
+ finally {
97
+ if (!options.isCancelled?.()) {
98
+ // A loading-screen callback must not stop a lane and strand jobs.
99
+ try {
100
+ options.onProgress?.(++completed / jobs.size);
101
+ }
102
+ catch { /* Keep building. */ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ try {
108
+ await Promise.allSettled(Array.from({ length: Math.min(pool?.size ?? 1, jobs.size) }, runLane));
109
+ }
110
+ finally {
111
+ if (!options.workerPool)
112
+ pool?.dispose();
113
+ }
114
+ return result;
115
+ }
116
+ //# sourceMappingURL=staticBvhPreparation.js.map