@meimu/mutracer 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -0,0 +1,55 @@
1
+ import { Box3 } from './Box3.js';
2
+ import MeshState from '../scene/MeshState.js';
3
+ import Geometry from '../scene/Geometry.js';
4
+ import { mat4, vec3 } from '../math.js';
5
+ import { PackedMeshInstances, type MeshInstances } from './meshInstances.js';
6
+ import { type TLASInstance } from './bvhAccel.js';
7
+ import { getBvhBounds } from './geometryBvhBounds.js';
8
+ export declare function computeBounds(_geometry: Geometry, m: mat4.Mat4Array, bvhBounds: [vec3.Vec3Array, vec3.Vec3Array], result?: Box3, p?: Float32Array<ArrayBufferLike>): Box3;
9
+ export interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {
10
+ mesh: M;
11
+ geometry: Geometry;
12
+ blasIndex: number;
13
+ materialIndices: number[];
14
+ displacementScale: number;
15
+ bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];
16
+ }
17
+ export declare function updateMeshInstanceTransforms<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], current?: MeshInstances, dirtyIndices?: ReadonlySet<number>): PackedMeshInstances | TLASInstance[];
18
+ /** Dirty slots shared by Web refits and native range uploads. */
19
+ export declare function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances): Set<number>;
20
+ export declare function prepareSceneMeshes<M extends MeshState>(meshes: M[], prepareGeometry: (mesh: M) => {
21
+ geometry: Geometry;
22
+ displacementScale: number;
23
+ }, boundsForGeometry?: typeof getBvhBounds, softwareBvhs?: boolean): {
24
+ geometry: Geometry;
25
+ geometries: Geometry[];
26
+ geometryRegions: Map<Geometry, {
27
+ vertexOffset: number;
28
+ indexOffset: number;
29
+ materialIndices: number[];
30
+ }>;
31
+ geometryStates: Map<Geometry, {
32
+ topologyVersion: number;
33
+ indices: Uint16Array<ArrayBufferLike> | Uint32Array<ArrayBufferLike> | Uint16Array<ArrayBufferLike> | Uint32Array<ArrayBufferLike>;
34
+ indexCount: number;
35
+ }>;
36
+ instances: MeshInstances;
37
+ materials: M["materials"];
38
+ instanceBindings: PreparedMeshInstanceBinding<M>[];
39
+ emissiveBindings: {
40
+ mesh: M;
41
+ geometry: Geometry;
42
+ materialIndices: number[];
43
+ }[];
44
+ blases: {
45
+ bvh: import("./bvhAccel.js").FlattendBVH;
46
+ verticesCount: number;
47
+ trainglesCount: number;
48
+ }[];
49
+ };
50
+ export declare function mergeGeometry(geometries: Geometry[], globalMaterialIndicesMap: number[][], regions: Map<Geometry, {
51
+ vertexOffset: number;
52
+ indexOffset: number;
53
+ materialIndices: number[];
54
+ }>, webgl?: boolean): Geometry;
55
+ export declare function computeGeometryNormals(geometry: Geometry): void;
@@ -0,0 +1,360 @@
1
+ import { matrixStorage } from '../math/storage.js';
2
+ import { Box3 } from './Box3.js';
3
+ import Geometry, { Attribute } from '../scene/Geometry.js';
4
+ import { vec3 } from '../math.js';
5
+ import { meshInstanceCount, meshInstanceTransform, PackedMeshInstances } from './meshInstances.js';
6
+ import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';
7
+ import { packMaterialIndexAndWeightToInt, writeMaterialIndices } from './materialIndices.js';
8
+ import { colorLuminance } from './lightSampling.js';
9
+ import { getBvhBounds } from './geometryBvhBounds.js';
10
+ import { attributeLength, attributeValue } from '../scene/attributeData.js';
11
+ import { read } from '../math/access.js';
12
+ import { hasGeneratedVertexTangents } from '../util/geometry.js';
13
+ // Platform adapters prepare displacement/BLAS inputs; assembly is shared by both hosts.
14
+ export function computeBounds(_geometry, m, bvhBounds, result = makeBounds(), p = vec3.create()) {
15
+ const matrix = matrixStorage(m), lower = matrixStorage(bvhBounds[0]), upper = matrixStorage(bvhBounds[1]);
16
+ const { min, max } = result;
17
+ vec3.set(min, Infinity, Infinity, Infinity);
18
+ vec3.set(max, -Infinity, -Infinity, -Infinity);
19
+ // Transforming the eight BLAS AABB corners is exact for an affine transform
20
+ // and independent of mesh vertex count. The previous rotated path scanned
21
+ // every vertex on every instance update.
22
+ for (let corner = 0; corner < 8; corner++) {
23
+ vec3.set(p, (corner & 1 ? upper[0] : lower[0]), (corner & 2 ? upper[1] : lower[1]), (corner & 4 ? upper[2] : lower[2]));
24
+ vec3.transformMat4(p, p, matrix);
25
+ if (!finiteValues(p))
26
+ continue;
27
+ vec3.min(min, min, p);
28
+ vec3.max(max, max, p);
29
+ }
30
+ return result;
31
+ }
32
+ export function updateMeshInstanceTransforms(bindings, current, dirtyIndices) {
33
+ // Dirty indices are packed source slots, as consumed by refitTLAS. Preserve
34
+ // the previous candidate until membership and GPU validation have succeeded.
35
+ if (current && !Array.isArray(current) && dirtyIndices && current.bindingSlots.length === bindings.length &&
36
+ current.bindingSlots.every((slots, i) => slots.length === meshInstanceCount(bindings[i].mesh))) {
37
+ const next = current.copy(), matrix = new Float64Array(16);
38
+ const boundsScratch = makeBounds(), pointScratch = vec3.create();
39
+ let membershipChanged = false;
40
+ const parents = new Map();
41
+ for (const index of dirtyIndices) {
42
+ const binding = bindings[current.bindingIndices[index]];
43
+ const local = current.localIndices[index];
44
+ if (!binding || local >= meshInstanceCount(binding.mesh)) {
45
+ membershipChanged = true;
46
+ break;
47
+ }
48
+ let parent = parents.get(binding.mesh);
49
+ if (!parent) {
50
+ parent = matrixStorage(binding.mesh.transform);
51
+ parents.set(binding.mesh, parent);
52
+ }
53
+ meshInstanceTransform(binding.mesh, local, matrix, parent);
54
+ const bounds = computeBounds(binding.geometry, matrix, binding.bvhBounds, boundsScratch, pointScratch);
55
+ if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) {
56
+ membershipChanged = true;
57
+ break;
58
+ }
59
+ next.transforms.set(matrix, index * 16);
60
+ next.bounds.set(bounds.min, index * 6);
61
+ next.bounds.set(bounds.max, index * 6 + 3);
62
+ }
63
+ if (!membershipChanged)
64
+ return next;
65
+ }
66
+ if (bindings.some(binding => binding.mesh.instanceData != null)) {
67
+ const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));
68
+ const matrix = new Float64Array(16);
69
+ const boundsScratch = makeBounds(), pointScratch = vec3.create();
70
+ let sourceIndex = 0;
71
+ for (let bindingIndex = 0; bindingIndex < bindings.length; bindingIndex++) {
72
+ const binding = bindings[bindingIndex];
73
+ const slots = [];
74
+ packed.bindingSlots.push(slots);
75
+ const { mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale } = binding;
76
+ const parent = matrixStorage(mesh.transform);
77
+ for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {
78
+ meshInstanceTransform(mesh, i, matrix, parent);
79
+ const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);
80
+ if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix))
81
+ continue;
82
+ const index = packed.length++;
83
+ packed.sourceIndices[index] = sourceIndex;
84
+ packed.bindingIndices[index] = bindingIndex;
85
+ packed.localIndices[index] = i;
86
+ slots.push(index);
87
+ packed.transforms.set(matrix, index * 16);
88
+ packed.bounds.set(bounds.min, index * 6);
89
+ packed.bounds.set(bounds.max, index * 6 + 3);
90
+ packed.blasIndices[index] = blasIndex;
91
+ packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);
92
+ packed.displacement[index] = displacementScale;
93
+ const colors = mesh.instanceData?.colors;
94
+ for (let k = 0; k < 3; k++)
95
+ packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;
96
+ }
97
+ }
98
+ return packed;
99
+ }
100
+ const update = ({ mesh, geometry, blasIndex, materialIndices, displacementScale, bvhBounds }) => ({
101
+ bounds: computeBounds(geometry, mesh.transform, bvhBounds),
102
+ blasIndex,
103
+ transform: matrixStorage(mesh.transform),
104
+ materialsIndices: materialIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
105
+ displacementScale
106
+ });
107
+ if (!current || !dirtyIndices || !Array.isArray(current))
108
+ return bindings.map(update);
109
+ const next = current.slice();
110
+ dirtyIndices.forEach((index) => {
111
+ const binding = bindings[index];
112
+ if (binding)
113
+ next[index] = update(binding);
114
+ });
115
+ return next;
116
+ }
117
+ /** Dirty slots shared by Web refits and native range uploads. */
118
+ export function dirtyPreparedInstanceIndices(bindings, meshes, instances) {
119
+ const dirty = new Set();
120
+ for (let i = 0; i < bindings.length; i++) {
121
+ if (!meshes.has(bindings[i].mesh))
122
+ continue;
123
+ if (!Array.isArray(instances)) {
124
+ for (const slot of instances.bindingSlots[i] ?? [])
125
+ dirty.add(slot);
126
+ }
127
+ else
128
+ dirty.add(i);
129
+ }
130
+ return dirty;
131
+ }
132
+ export function prepareSceneMeshes(meshes, prepareGeometry, boundsForGeometry = getBvhBounds, softwareBvhs = true) {
133
+ const materialIndexMap = new Map();
134
+ const geometryIndexMap = new Map();
135
+ const geometryBounds = new Map();
136
+ const geometries = [];
137
+ const materials = [];
138
+ const globalMaterialIndicesMap = [];
139
+ const emissiveBindings = [];
140
+ const instanceBindings = [];
141
+ const instances = meshes
142
+ .filter((mesh) => mesh.geometry.position?.array.length > 0)
143
+ .map((mesh) => {
144
+ let { geometry, displacementScale } = prepareGeometry(mesh);
145
+ let cachedBounds = geometryBounds.get(geometry);
146
+ if (!cachedBounds) {
147
+ const rawBounds = boundsForGeometry(geometry);
148
+ cachedBounds = [matrixStorage(rawBounds[0]), matrixStorage(rawBounds[1])];
149
+ geometryBounds.set(geometry, cachedBounds);
150
+ }
151
+ // Instances share the scan, while retained updates keep independent arrays.
152
+ const bvhBounds = [cachedBounds[0].slice(), cachedBounds[1].slice()];
153
+ const bounds = computeBounds(geometry, mesh.transform, bvhBounds);
154
+ let geoIdx = geometryIndexMap.get(geometry);
155
+ const materialsIndices = mesh.materials.map((material) => {
156
+ const key = material;
157
+ if (!materialIndexMap.has(key)) {
158
+ materialIndexMap.set(key, materials.length);
159
+ materials.push(material);
160
+ }
161
+ return materialIndexMap.get(key);
162
+ });
163
+ // Explicit vertex indices are global after merging. Batches with a
164
+ // different material table need their own vertex region, even when the
165
+ // table contains just one material. Equal tables can share the region.
166
+ if (geoIdx != null && geometry.materialIndex &&
167
+ (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||
168
+ materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx][i]))) {
169
+ const bvh = getGeometryBvh(geometry);
170
+ geometry = new Geometry(geometry);
171
+ setGeometryBvh(geometry, bvh);
172
+ geoIdx = undefined;
173
+ }
174
+ if (geoIdx == null) {
175
+ geoIdx = geometries.length;
176
+ geometryIndexMap.set(geometry, geometries.length);
177
+ geometries.push(geometry);
178
+ // Same number with geometries.
179
+ globalMaterialIndicesMap.push(materialsIndices);
180
+ }
181
+ const instance = {
182
+ bounds,
183
+ blasIndex: geoIdx,
184
+ transform: matrixStorage(mesh.transform),
185
+ materialsIndices: materialsIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
186
+ displacementScale
187
+ };
188
+ if (mesh.instanceData == null && (!finiteValues(bounds.min) ||
189
+ !finiteValues(bounds.max) ||
190
+ !finiteValues(mesh.transform))) {
191
+ return undefined;
192
+ }
193
+ if (mesh.materials.some((material) => !material.unlit && !material.shadowCatcher &&
194
+ colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8)) {
195
+ emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });
196
+ }
197
+ instanceBindings.push({
198
+ mesh,
199
+ geometry,
200
+ blasIndex: geoIdx,
201
+ materialIndices: materialsIndices,
202
+ displacementScale,
203
+ bvhBounds
204
+ });
205
+ return instance;
206
+ })
207
+ .filter((instance) => instance != null);
208
+ const geometryRegions = new Map();
209
+ const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);
210
+ return {
211
+ geometry,
212
+ geometries,
213
+ geometryRegions,
214
+ geometryStates: new Map(instanceBindings.map(binding => {
215
+ const source = binding.mesh.geometry;
216
+ return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,
217
+ indexCount: source.indexArray.length }];
218
+ })),
219
+ instances: (meshes.some(mesh => mesh.instanceData != null) ? updateMeshInstanceTransforms(instanceBindings) : instances),
220
+ materials,
221
+ instanceBindings,
222
+ emissiveBindings,
223
+ blases: softwareBvhs ? geometries.map((geo) => ({
224
+ bvh: getGeometryBvh(geo),
225
+ verticesCount: geo.vertexCount,
226
+ trainglesCount: geo.indexArray.length / 3
227
+ })) : []
228
+ };
229
+ }
230
+ export function mergeGeometry(geometries, globalMaterialIndicesMap, regions, webgl = false) {
231
+ const totalVertexCount = geometries.reduce((sum, geo) => sum + geo.vertexCount, 0);
232
+ const totalIndexCount = geometries.reduce((sum, geo) => sum + geo.indexArray.length, 0);
233
+ const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
234
+ const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
235
+ const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
236
+ const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
237
+ const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
238
+ const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
239
+ // The flat WebGL buffer keeps its existing XYZ tangents and optional-attribute
240
+ // selection; instanced preparation uses XYZW tangents and independent channels.
241
+ const firstOptional = webgl ? geometries.find(geo => geo.color || geo.tangent) : undefined;
242
+ const hasColor = webgl ? !!firstOptional?.color : geometries.some(geo => geo.color);
243
+ const hasTangent = webgl ? !firstOptional?.color && !!firstOptional?.tangent : geometries.some(geo => geo.tangent);
244
+ const tangentSize = webgl ? 3 : 4;
245
+ const mergedGeometry = new Geometry({
246
+ position: positionAttrib,
247
+ normal: normalAttrib,
248
+ uv: uvAttrib,
249
+ uv1: uv1Attrib,
250
+ materialIndex: materialIndexAttrib,
251
+ color: hasColor
252
+ ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)
253
+ : undefined,
254
+ tangent: hasTangent
255
+ ? new Attribute(new Float32Array(tangentSize * totalVertexCount), tangentSize)
256
+ : undefined,
257
+ indices: indexAttrib
258
+ });
259
+ let currentVertex = 0;
260
+ let currentIndex = 0;
261
+ geometries.forEach((geometry, idx) => {
262
+ const vertexCount = geometry.vertexCount;
263
+ const globalMaterialIndex = globalMaterialIndicesMap[idx];
264
+ regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });
265
+ positionAttrib.array.set(geometry.position.array, currentVertex * 3);
266
+ normalAttrib.array.set(geometry.normal.array, currentVertex * 3);
267
+ if (geometry.uv) {
268
+ uvAttrib.array.set(geometry.uv.array, currentVertex * 2);
269
+ }
270
+ uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
271
+ if (mergedGeometry.color && geometry.color) {
272
+ mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);
273
+ }
274
+ if (mergedGeometry.tangent && geometry.tangent) {
275
+ const source = geometry.tangent;
276
+ if (webgl) {
277
+ mergedGeometry.tangent.array.set(source.array, currentVertex * tangentSize);
278
+ }
279
+ else
280
+ for (let v = 0; v < vertexCount; v++) {
281
+ for (let c = 0; c < 4; c++)
282
+ mergedGeometry.tangent.array[(currentVertex + v) * 4 + c] =
283
+ c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;
284
+ }
285
+ }
286
+ writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, webgl);
287
+ const meshIndices = geometry.indexArray;
288
+ for (let i = 0; i < attributeLength(meshIndices); i++) {
289
+ indexAttrib.array[currentIndex + i] = currentVertex + attributeValue(meshIndices, i);
290
+ }
291
+ currentVertex += vertexCount;
292
+ currentIndex += attributeLength(meshIndices);
293
+ });
294
+ return mergedGeometry;
295
+ }
296
+ export function computeGeometryNormals(geometry) {
297
+ const indices = geometry.indexArray;
298
+ const positions = geometry.position.array;
299
+ geometry.normal = new Attribute(new Float32Array(positions.length), 3);
300
+ const normals = geometry.normal.array;
301
+ const p1 = vec3.create();
302
+ const p2 = vec3.create();
303
+ const p3 = vec3.create();
304
+ const v21 = vec3.create();
305
+ const v32 = vec3.create();
306
+ const n = vec3.create();
307
+ const len = indices
308
+ ? indices.length
309
+ : geometry.vertexCount;
310
+ let i1, i2, i3;
311
+ for (let f = 0; f < len;) {
312
+ if (indices) {
313
+ i1 = attributeValue(indices, f++);
314
+ i2 = attributeValue(indices, f++);
315
+ i3 = attributeValue(indices, f++);
316
+ }
317
+ else {
318
+ i1 = f++;
319
+ i2 = f++;
320
+ i3 = f++;
321
+ }
322
+ vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
323
+ vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
324
+ vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
325
+ vec3.sub(v21, p1, p2);
326
+ vec3.sub(v32, p2, p3);
327
+ vec3.cross(n, v21, v32);
328
+ // Already be weighted by the triangle area
329
+ for (let i = 0; i < 3; i++) {
330
+ normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
331
+ normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
332
+ normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
333
+ }
334
+ }
335
+ for (let i = 0; i < normals.length;) {
336
+ vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
337
+ vec3.normalize(n, n);
338
+ normals[i++] = n[0];
339
+ normals[i++] = n[1];
340
+ normals[i++] = n[2];
341
+ }
342
+ }
343
+ function finiteValues(values) {
344
+ if (values instanceof Float32Array)
345
+ return finiteStorage(values);
346
+ if (values instanceof Float64Array)
347
+ return finiteStorage(values);
348
+ return finiteStorage(values);
349
+ }
350
+ function finiteStorage(values) {
351
+ const length = values.length;
352
+ for (let i = 0; i < length; i++)
353
+ if (!Number.isFinite(read(values, i)))
354
+ return false;
355
+ return true;
356
+ }
357
+ function makeBounds() {
358
+ return new Box3();
359
+ }
360
+ //# sourceMappingURL=scenePreparation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenePreparation.js","sourceRoot":"","sources":["../../src/renderer/scenePreparation.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { Box3 } from './Box3.js';\nimport MeshState from '../scene/MeshState.js';\nimport MaterialState from '../scene/MaterialState.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { packMaterialIndexAndWeightToInt, writeMaterialIndices } from './materialIndices.js';\nimport { type TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport { getBvhBounds } from './geometryBvhBounds.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { read } from '../math/access.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\n\n// Platform adapters prepare displacement/BLAS inputs; assembly is shared by both hosts.\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result: Box3 = makeBounds(),\n p = vec3.create()\n) {\n const matrix = matrixStorage(m), lower = matrixStorage(bvhBounds[0]), upper = matrixStorage(bvhBounds[1]);\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n (corner & 1 ? upper[0] : lower[0]),\n (corner & 2 ? upper[1] : lower[1]),\n (corner & 4 ? upper[2] : lower[2])\n );\n vec3.transformMat4(p, p, matrix);\n if (!finiteValues(p)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {\n mesh: M;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms<M extends MeshState>(\n bindings: PreparedMeshInstanceBinding<M>[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n // Dirty indices are packed source slots, as consumed by refitTLAS. Preserve\n // the previous candidate until membership and GPU validation have succeeded.\n if (current && !Array.isArray(current) && dirtyIndices && current.bindingSlots.length === bindings.length &&\n current.bindingSlots.every((slots, i) => slots.length === meshInstanceCount(bindings[i].mesh))) {\n const next = current.copy(), matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let membershipChanged = false;\n const parents = new Map<M, Float64Array>();\n for (const index of dirtyIndices) {\n const binding = bindings[current.bindingIndices[index]];\n const local = current.localIndices[index];\n if (!binding || local >= meshInstanceCount(binding.mesh)) {membershipChanged = true; break;}\n let parent = parents.get(binding.mesh);\n if (!parent) { parent = matrixStorage(binding.mesh.transform); parents.set(binding.mesh, parent); }\n meshInstanceTransform(binding.mesh, local, matrix, parent);\n const bounds = computeBounds(binding.geometry, matrix, binding.bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) {membershipChanged = true; break;}\n next.transforms.set(matrix, index * 16); next.bounds.set(bounds.min, index * 6); next.bounds.set(bounds.max, index * 6 + 3);\n }\n if (!membershipChanged) return next;\n }\n if (bindings.some(binding => binding.mesh.instanceData != null)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let sourceIndex = 0;\n for (let bindingIndex = 0; bindingIndex < bindings.length; bindingIndex++) {\n const binding = bindings[bindingIndex];\n const slots: number[] = []; packed.bindingSlots.push(slots);\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n const parent = matrixStorage(mesh.transform);\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix, parent);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex; packed.bindingIndices[index] = bindingIndex; packed.localIndices[index] = i; slots.push(index);\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh.instanceData?.colors;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding<M>\n ): TLASInstance =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices || !Array.isArray(current)) return bindings.map(update);\n const next = current.slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\n\n/** Dirty slots shared by Web refits and native range uploads. */\nexport function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances) {\n const dirty = new Set<number>();\n for (let i = 0; i < bindings.length; i++) {\n if (!meshes.has(bindings[i].mesh)) continue;\n if (!Array.isArray(instances)) {\n for (const slot of instances.bindingSlots[i] ?? []) dirty.add(slot);\n } else dirty.add(i);\n }\n return dirty;\n}\n\nexport function prepareSceneMeshes<M extends MeshState>(meshes: M[],\n prepareGeometry: (mesh: M) => {geometry: Geometry; displacementScale: number},\n boundsForGeometry = getBvhBounds, softwareBvhs = true) {\n const materialIndexMap = new Map<MaterialState, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometryBounds = new Map<Geometry, [Float64Array, Float64Array]>();\n const geometries: Geometry[] = [];\n const materials: M['materials'] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: M;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding<M>[] = [];\n\n\n const instances: TLASInstance[] = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareGeometry(mesh);\n let cachedBounds = geometryBounds.get(geometry);\n if (!cachedBounds) {\n const rawBounds = boundsForGeometry(geometry);\n cachedBounds = [matrixStorage(rawBounds[0]), matrixStorage(rawBounds[1])];\n geometryBounds.set(geometry, cachedBounds);\n }\n // Instances share the scan, while retained updates keep independent arrays.\n const bvhBounds: [Float64Array, Float64Array] = [cachedBounds[0].slice(), cachedBounds[1].slice()];\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance: TLASInstance = {\n bounds,\n blasIndex: geoIdx!,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (mesh.instanceData == null && (\n !finiteValues(bounds.min) ||\n !finiteValues(bounds.max) ||\n !finiteValues(mesh.transform)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indexArray.length }];\n })),\n instances: (meshes.some(mesh => mesh.instanceData != null) ? updateMeshInstanceTransforms(instanceBindings) : instances) as MeshInstances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: softwareBvhs ? geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indexArray.length / 3\n })) : []\n };\n}\n\nexport function mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>,\n webgl = false\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indexArray.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n // The flat WebGL buffer keeps its existing XYZ tangents and optional-attribute\n // selection; instanced preparation uses XYZW tangents and independent channels.\n const firstOptional = webgl ? geometries.find(geo => geo.color || geo.tangent) : undefined;\n const hasColor = webgl ? !!firstOptional?.color : geometries.some(geo => geo.color);\n const hasTangent = webgl ? !firstOptional?.color && !!firstOptional?.tangent : geometries.some(geo => geo.tangent);\n const tangentSize = webgl ? 3 : 4;\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(tangentSize * totalVertexCount), tangentSize)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (mergedGeometry.color && geometry.color) {\n mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);\n }\n if (mergedGeometry.tangent && geometry.tangent) {\n const source = geometry.tangent;\n if (webgl) {\n mergedGeometry.tangent.array.set(source.array, currentVertex * tangentSize);\n } else for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, webgl);\n\n const meshIndices = geometry.indexArray;\n for (let i = 0; i < attributeLength(meshIndices); i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + attributeValue(meshIndices, i);\n }\n currentVertex += vertexCount;\n currentIndex += attributeLength(meshIndices);\n });\n\n return mergedGeometry;\n}\n\nexport function computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = attributeValue(indices, f++);\n i2 = attributeValue(indices, f++);\n i3 = attributeValue(indices, f++);\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n\nfunction finiteValues(values: Float32Array | Float64Array | number[]): boolean {\n if (values instanceof Float32Array) return finiteStorage(values);\n if (values instanceof Float64Array) return finiteStorage(values);\n return finiteStorage(values);\n}\nfunction finiteStorage<T extends Float32Array | Float64Array | number[]>(values: T): boolean {\n const length = values.length;\n for (let i = 0; i < length; i++) if (!Number.isFinite(read(values, i))) return false;\n return true;\n}\n\nfunction makeBounds(): Box3 {\n return new Box3();\n}\n"]}
@@ -4,18 +4,18 @@ export function scratchWGSLFunctions(textures, samplers, scratch = false) {
4
4
  fn ${name}Region() -> vec2u {
5
5
  return ${scratch ? `imageRegions[${index}].xy` : `textureDimensions(${name})`};
6
6
  }
7
- fn load_${name}(fQ: vec2i, level: i32) -> vec4f {
8
- ${scratch ? `if (any(fQ < vec2i(0)) || any(fQ >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}
9
- return textureLoad(${name}, fQ, level);
7
+ fn load_${name}(pixel: vec2i, level: i32) -> vec4f {
8
+ ${scratch ? `if (any(pixel < vec2i(0)) || any(pixel >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}
9
+ return textureLoad(${name}, pixel, level);
10
10
  }
11
11
  ${samplers.map(sampler => /* wgsl */ `
12
- fn sample_${name}_${sampler}(fH: vec2f) -> vec4f {
12
+ fn sample_${name}_${sampler}(coord: vec2f) -> vec4f {
13
13
  ${scratch ? /* wgsl */ `
14
- let kc = textureDimensions(${name});
15
- if (all(kc == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, fH, 0.0); }
16
- let fQ = clamp(fH * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
17
- return textureSampleLevel(${name}, ${sampler}, fQ / vec2f(kc), 0.0);`
18
- : `return textureSample(${name}, ${sampler}, fH);`}
14
+ let kk = textureDimensions(${name});
15
+ if (all(kk == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }
16
+ let pixel = clamp(coord * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
17
+ return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(kk), 0.0);`
18
+ : `return textureSample(${name}, ${sampler}, coord);`}
19
19
  }`).join('')}`).join('');
20
20
  }
21
21
  export function scratchGLSLFunctions(textures, scratch = false) {
@@ -23,17 +23,17 @@ export function scratchGLSLFunctions(textures, scratch = false) {
23
23
  ivec2 ${name}Region() {
24
24
  return ${scratch ? `${name}RegionSize` : `textureSize(${name}, 0)`};
25
25
  }
26
- vec4 load_${name}(ivec2 fQ, int level) {
27
- ${scratch ? `if (any(lessThan(fQ, ivec2(0))) || any(greaterThanEqual(fQ, ${name}Region()))) return vec4(0.0);` : ''}
28
- return texelFetch(${name}, fQ, level);
26
+ vec4 load_${name}(ivec2 pixel, int level) {
27
+ ${scratch ? `if (any(lessThan(pixel, ivec2(0))) || any(greaterThanEqual(pixel, ${name}Region()))) return vec4(0.0);` : ''}
28
+ return texelFetch(${name}, pixel, level);
29
29
  }
30
- vec4 sample_${name}(vec2 fH) {
30
+ vec4 sample_${name}(vec2 coord) {
31
31
  ${scratch ? /* glsl */ `
32
- ivec2 kc = textureSize(${name}, 0);
33
- if (all(equal(kc, ${name}Region()))) return texture(${name}, fH);
34
- vec2 fQ = clamp(fH * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
35
- return texture(${name}, fQ / vec2(kc));`
36
- : `return texture(${name}, fH);`}
32
+ ivec2 kk = textureSize(${name}, 0);
33
+ if (all(equal(kk, ${name}Region()))) return texture(${name}, coord);
34
+ vec2 pixel = clamp(coord * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
35
+ return texture(${name}, pixel / vec2(kk));`
36
+ : `return texture(${name}, coord);`}
37
37
  }`).join('');
38
38
  }
39
39
  //# sourceMappingURL=scratchSampling.js.map
@@ -1 +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"]}
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,mDAAmD,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;kCACtD,IAAI,gCAAgC,IAAI;4BAC9C,IAAI,KAAK,OAAO,4BAAsC;QAClF,CAAC,CAAC,wBAAwB,IAAI,KAAK,OAAO,WAAW;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,qEAAqE,IAAI,+BAA+B,CAAC,CAAC,CAAC,EAAE;oBACrG,IAAI;;cAEZ,IAAI;EACd,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;yBACY,IAAI;oBACT,IAAI,8BAA8B,IAAI;kCAClC,IAAI,8BAA8B,IAAI;iBACvD,IAAI,sBAAgC;QACrD,CAAC,CAAC,kBAAkB,IAAI,WAAW;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"]}
@@ -20,6 +20,7 @@ export declare class Shader {
20
20
  export interface FragmentShaderOptions {
21
21
  name?: string;
22
22
  outputs?: string[];
23
+ outputTypes?: Record<string, 'vec4' | 'uvec4'>;
23
24
  defines?: Record<string, ShaderDefineValue>;
24
25
  uniforms?: Record<string, ShaderUniform>;
25
26
  includes?: ShaderMixin[];
@@ -28,6 +29,7 @@ export interface FragmentShaderOptions {
28
29
  export declare class FragmentShader<TDefines extends Record<string, ShaderDefineValue> = Record<string, ShaderDefineValue>, TUniforms extends Record<string, ShaderUniform> = Record<string, ShaderUniform>> {
29
30
  readonly name: string;
30
31
  readonly outputs: string[];
32
+ readonly outputTypes: Record<string, 'vec4' | 'uvec4'>;
31
33
  readonly defines: TDefines;
32
34
  readonly uniforms: TUniforms;
33
35
  readonly functions: Array<(name?: string) => string>;
@@ -23,6 +23,7 @@ export class Shader {
23
23
  export class FragmentShader {
24
24
  name;
25
25
  outputs;
26
+ outputTypes;
26
27
  defines;
27
28
  uniforms;
28
29
  functions;
@@ -32,6 +33,7 @@ export class FragmentShader {
32
33
  const includes = options.includes || [];
33
34
  this.name = options.name || '';
34
35
  this.outputs = options.outputs || ['color'];
36
+ this.outputTypes = options.outputTypes ?? {};
35
37
  this.defines = Object.assign({}, ...includes.map((item) => item.defines), options.defines || {});
36
38
  this.uniforms = Object.assign({}, ...includes.map((item) => item.uniforms), options.uniforms || {});
37
39
  this.functions = includes.flatMap((item) => item.functions || []);
@@ -1 +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"]}
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;AAYD,MAAM,OAAO,cAAc;IAUhB,IAAI,CAAS;IACb,OAAO,CAAW;IAClB,WAAW,CAAmC;IAC9C,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,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7C,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 outputTypes?: Record<string, 'vec4' | 'uvec4'>;\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 outputTypes: Record<string, 'vec4' | 'uvec4'>;\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.outputTypes = options.outputTypes ?? {};\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"]}