@meimu/mutracer 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10421 -8363
  6. package/docs/api.md +202 -11
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +18 -27
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +19 -10
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +41 -3
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -548
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +83 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +437 -435
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  209. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
  210. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
  211. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  212. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  213. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
  214. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  215. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  216. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
  217. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  218. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  219. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  220. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  221. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  222. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  223. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  224. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  225. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  226. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  227. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  228. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  229. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  230. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  231. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  232. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  233. package/lib/renderer/lightConstants.d.ts +10 -0
  234. package/lib/renderer/lightConstants.js +11 -0
  235. package/lib/renderer/lightConstants.js.map +1 -0
  236. package/lib/renderer/lightCore.d.ts +12 -0
  237. package/lib/renderer/lightCore.js +13 -0
  238. package/lib/renderer/lightCore.js.map +1 -0
  239. package/lib/renderer/lightSampling.d.ts +20 -17
  240. package/lib/renderer/lightSampling.js +123 -56
  241. package/lib/renderer/lightSampling.js.map +1 -1
  242. package/lib/renderer/lightsData.d.ts +21 -0
  243. package/lib/renderer/lightsData.js +192 -0
  244. package/lib/renderer/lightsData.js.map +1 -0
  245. package/lib/renderer/lightsUtil.d.ts +3 -26
  246. package/lib/renderer/lightsUtil.js +3 -153
  247. package/lib/renderer/lightsUtil.js.map +1 -1
  248. package/lib/renderer/materialBufferData.d.ts +70 -0
  249. package/lib/renderer/materialBufferData.js +2 -0
  250. package/lib/renderer/materialBufferData.js.map +1 -0
  251. package/lib/renderer/materialConstants.d.ts +11 -0
  252. package/lib/renderer/materialConstants.js +11 -0
  253. package/lib/renderer/materialConstants.js.map +1 -1
  254. package/lib/renderer/materialCore.d.ts +8 -0
  255. package/lib/renderer/materialCore.js +9 -0
  256. package/lib/renderer/materialCore.js.map +1 -0
  257. package/lib/renderer/materialEmission.d.ts +2 -2
  258. package/lib/renderer/materialEmission.js +3 -3
  259. package/lib/renderer/materialEmission.js.map +1 -1
  260. package/lib/renderer/materialLayout.d.ts +2 -101
  261. package/lib/renderer/materialLayout.js +110 -172
  262. package/lib/renderer/materialLayout.js.map +1 -1
  263. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  264. package/lib/renderer/materialLayoutSchema.js +172 -0
  265. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  266. package/lib/renderer/materialParams.d.ts +69 -0
  267. package/lib/renderer/materialParams.js +272 -0
  268. package/lib/renderer/materialParams.js.map +1 -0
  269. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  270. package/lib/renderer/materialTextureSlots.js +21 -8
  271. package/lib/renderer/materialTextureSlots.js.map +1 -1
  272. package/lib/renderer/materialTextures.d.ts +6 -0
  273. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  274. package/lib/renderer/materialTextures.js.map +1 -0
  275. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  276. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  277. package/lib/renderer/meshInstances.d.ts +4 -21
  278. package/lib/renderer/meshInstances.js +10 -56
  279. package/lib/renderer/meshInstances.js.map +1 -1
  280. package/lib/renderer/oidnNetwork.d.ts +2 -2
  281. package/lib/renderer/oidnNetwork.js +1 -1
  282. package/lib/renderer/oidnNetwork.js.map +1 -1
  283. package/lib/renderer/openPbrEnergyLut.js +850 -846
  284. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  285. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  286. package/lib/renderer/ownedDenoiser.js +2 -0
  287. package/lib/renderer/ownedDenoiser.js.map +1 -0
  288. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  289. package/lib/renderer/packedMeshInstances.js +80 -0
  290. package/lib/renderer/packedMeshInstances.js.map +1 -0
  291. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  292. package/lib/renderer/prepareMeshBVH.js +21 -642
  293. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  294. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  295. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  296. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  297. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  298. package/lib/renderer/progressiveScheduler.js +3 -0
  299. package/lib/renderer/progressiveScheduler.js.map +1 -1
  300. package/lib/renderer/renderPipeline.d.ts +3 -1
  301. package/lib/renderer/renderPipeline.js.map +1 -1
  302. package/lib/renderer/renderingLimits.d.ts +9 -0
  303. package/lib/renderer/renderingLimits.js +18 -0
  304. package/lib/renderer/renderingLimits.js.map +1 -0
  305. package/lib/renderer/sceneAssembly.d.ts +73 -0
  306. package/lib/renderer/sceneAssembly.js +109 -0
  307. package/lib/renderer/sceneAssembly.js.map +1 -0
  308. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  309. package/lib/renderer/sceneChangeCore.js +307 -0
  310. package/lib/renderer/sceneChangeCore.js.map +1 -0
  311. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  312. package/lib/renderer/sceneChangeDetector.js +24 -150
  313. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  314. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  315. package/lib/renderer/sceneLayoutSchema.js +111 -0
  316. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  317. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  318. package/lib/renderer/sceneLightChanges.js.map +1 -1
  319. package/lib/renderer/scenePreparation.d.ts +55 -0
  320. package/lib/renderer/scenePreparation.js +360 -0
  321. package/lib/renderer/scenePreparation.js.map +1 -0
  322. package/lib/renderer/scratchSampling.js +18 -18
  323. package/lib/renderer/scratchSampling.js.map +1 -1
  324. package/lib/renderer/shader.d.ts +2 -0
  325. package/lib/renderer/shader.js +2 -0
  326. package/lib/renderer/shader.js.map +1 -1
  327. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  328. package/lib/renderer/shaderCapabilities.js +55 -0
  329. package/lib/renderer/shaderCapabilities.js.map +1 -0
  330. package/lib/renderer/shaderCapacity.d.ts +2 -0
  331. package/lib/renderer/shaderCapacity.js +5 -0
  332. package/lib/renderer/shaderCapacity.js.map +1 -0
  333. package/lib/renderer/skyModel.d.ts +9 -0
  334. package/lib/renderer/skyModel.js +10 -0
  335. package/lib/renderer/skyModel.js.map +1 -0
  336. package/lib/renderer/textureAtlas.d.ts +60 -0
  337. package/lib/renderer/textureAtlas.js +145 -0
  338. package/lib/renderer/textureAtlas.js.map +1 -0
  339. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  340. package/lib/renderer/textureAtlasPixels.js +68 -0
  341. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  342. package/lib/renderer/util.d.ts +1 -1
  343. package/lib/renderer/util.js.map +1 -1
  344. package/lib/renderer/webgl.d.ts +9 -2
  345. package/lib/renderer/webgl.js +54 -9
  346. package/lib/renderer/webgl.js.map +1 -1
  347. package/lib/renderer/wgpuBindless.d.ts +26 -0
  348. package/lib/renderer/wgpuBindless.js +95 -0
  349. package/lib/renderer/wgpuBindless.js.map +1 -0
  350. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  351. package/lib/renderer/wgpuBindlessSource.js +51 -0
  352. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  353. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  354. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  355. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  356. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  357. package/lib/renderer/wgpuSceneUniform.js +125 -0
  358. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  359. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  360. package/lib/renderer/wgpuShaderSource.js +31 -0
  361. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  362. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  363. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  364. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  367. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  369. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  370. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  372. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  373. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  375. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  376. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  378. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  379. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  381. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  382. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  383. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  384. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  385. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  386. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  388. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
  389. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  390. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  391. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  393. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
  394. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  395. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  396. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  397. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  398. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  399. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  400. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  401. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  403. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  404. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  406. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  408. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  409. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  410. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  411. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  412. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  413. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  415. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  416. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  418. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  419. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  420. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  421. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  422. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  423. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  424. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  425. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  426. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  427. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  428. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  430. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  431. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  432. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  433. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  434. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  435. package/lib/scene/Camera.js +7 -3
  436. package/lib/scene/Camera.js.map +1 -1
  437. package/lib/scene/EnvironmentLight.d.ts +5 -9
  438. package/lib/scene/EnvironmentLight.js +4 -14
  439. package/lib/scene/EnvironmentLight.js.map +1 -1
  440. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  441. package/lib/scene/EnvironmentLightState.js +19 -0
  442. package/lib/scene/EnvironmentLightState.js.map +1 -0
  443. package/lib/scene/Geometry.d.ts +12 -6
  444. package/lib/scene/Geometry.js +37 -13
  445. package/lib/scene/Geometry.js.map +1 -1
  446. package/lib/scene/InstanceState.d.ts +39 -0
  447. package/lib/scene/InstanceState.js +77 -0
  448. package/lib/scene/InstanceState.js.map +1 -0
  449. package/lib/scene/InstancedMesh.d.ts +1 -1
  450. package/lib/scene/InstancedMesh.js +3 -0
  451. package/lib/scene/InstancedMesh.js.map +1 -1
  452. package/lib/scene/MaterialState.d.ts +209 -0
  453. package/lib/scene/MaterialState.js +231 -0
  454. package/lib/scene/MaterialState.js.map +1 -0
  455. package/lib/scene/Mesh.d.ts +4 -6
  456. package/lib/scene/Mesh.js +3 -11
  457. package/lib/scene/Mesh.js.map +1 -1
  458. package/lib/scene/MeshState.d.ts +20 -0
  459. package/lib/scene/MeshState.js +35 -0
  460. package/lib/scene/MeshState.js.map +1 -0
  461. package/lib/scene/OpenPBRMaterial.d.ts +7 -169
  462. package/lib/scene/OpenPBRMaterial.js +5 -223
  463. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  464. package/lib/scene/PixelTexture.d.ts +6 -0
  465. package/lib/scene/PixelTexture.js +10 -0
  466. package/lib/scene/PixelTexture.js.map +1 -0
  467. package/lib/scene/ProceduralSky.d.ts +24 -0
  468. package/lib/scene/ProceduralSky.js +40 -0
  469. package/lib/scene/ProceduralSky.js.map +1 -0
  470. package/lib/scene/RectLight.d.ts +2 -13
  471. package/lib/scene/RectLight.js +3 -21
  472. package/lib/scene/RectLight.js.map +1 -1
  473. package/lib/scene/RectLightState.d.ts +31 -0
  474. package/lib/scene/RectLightState.js +26 -0
  475. package/lib/scene/RectLightState.js.map +1 -0
  476. package/lib/scene/Scene.d.ts +15 -4
  477. package/lib/scene/Scene.js.map +1 -1
  478. package/lib/scene/SceneNode.js +7 -6
  479. package/lib/scene/SceneNode.js.map +1 -1
  480. package/lib/scene/Texture.d.ts +10 -41
  481. package/lib/scene/Texture.js +4 -33
  482. package/lib/scene/Texture.js.map +1 -1
  483. package/lib/scene/TextureState.d.ts +35 -0
  484. package/lib/scene/TextureState.js +35 -0
  485. package/lib/scene/TextureState.js.map +1 -0
  486. package/lib/scene/attributeData.d.ts +4 -0
  487. package/lib/scene/attributeData.js +10 -0
  488. package/lib/scene/attributeData.js.map +1 -0
  489. package/lib/scene/lightState.d.ts +8 -0
  490. package/lib/scene/lightState.js +2 -0
  491. package/lib/scene/lightState.js.map +1 -0
  492. package/lib/scene/openPbrSchema.d.ts +7 -12
  493. package/lib/scene/openPbrSchema.js +273 -28
  494. package/lib/scene/openPbrSchema.js.map +1 -1
  495. package/lib/scene/skyParameters.d.ts +20 -0
  496. package/lib/scene/skyParameters.js +28 -0
  497. package/lib/scene/skyParameters.js.map +1 -0
  498. package/lib/scene/textureData.d.ts +9 -0
  499. package/lib/scene/textureData.js +2 -0
  500. package/lib/scene/textureData.js.map +1 -0
  501. package/lib/scene/texturePixels.d.ts +6 -0
  502. package/lib/scene/texturePixels.js +10 -0
  503. package/lib/scene/texturePixels.js.map +1 -0
  504. package/lib/settings/display.d.ts +33 -0
  505. package/lib/settings/display.js +7 -0
  506. package/lib/settings/display.js.map +1 -1
  507. package/lib/settings/render.d.ts +25 -3
  508. package/lib/settings/render.js +3 -1
  509. package/lib/settings/render.js.map +1 -1
  510. package/lib/tinybvh/tinybvh.wasm +0 -0
  511. package/lib/util/commonGeometry.js +7 -7
  512. package/lib/util/commonGeometry.js.map +1 -1
  513. package/lib/util/fromTHREE.d.ts +4 -1
  514. package/lib/util/fromTHREE.js +18 -5
  515. package/lib/util/fromTHREE.js.map +1 -1
  516. package/lib/util/geometry.js +42 -29
  517. package/lib/util/geometry.js.map +1 -1
  518. package/lib/util/loadRGBE.js +3 -4
  519. package/lib/util/loadRGBE.js.map +1 -1
  520. package/lib/util/studioLighting.d.ts +18 -0
  521. package/lib/util/studioLighting.js +36 -0
  522. package/lib/util/studioLighting.js.map +1 -0
  523. package/lib/version.d.ts +1 -1
  524. package/lib/version.js +1 -1
  525. package/lib/version.js.map +1 -1
  526. package/llms.txt +4 -0
  527. package/package.json +31 -5
  528. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  529. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -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}(fP: vec2i, level: i32) -> vec4f {
8
- ${scratch ? `if (any(fP < vec2i(0)) || any(fP >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}
9
- return textureLoad(${name}, fP, 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}(fG: 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}, fG, 0.0); }
16
- let fP = clamp(fG * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
17
- return textureSampleLevel(${name}, ${sampler}, fP / vec2f(kc), 0.0);`
18
- : `return textureSample(${name}, ${sampler}, fG);`}
14
+ let kH = textureDimensions(${name});
15
+ if (all(kH == ${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(kH), 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 fP, int level) {
27
- ${scratch ? `if (any(lessThan(fP, ivec2(0))) || any(greaterThanEqual(fP, ${name}Region()))) return vec4(0.0);` : ''}
28
- return texelFetch(${name}, fP, 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 fG) {
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}, fG);
34
- vec2 fP = clamp(fG * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
35
- return texture(${name}, fP / vec2(kc));`
36
- : `return texture(${name}, fG);`}
32
+ ivec2 kH = textureSize(${name}, 0);
33
+ if (all(equal(kH, ${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(kH));`
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"]}