@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
@@ -1 +1 @@
1
- {"version":3,"file":"materialEmission.js","sourceRoot":"","sources":["../../src/renderer/materialEmission.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAyB;IACxD,MAAM,QAAQ,GAAa;QACzB,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB;QACtD,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB;QACtD,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB;KACvD,CAAC;IACF,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,QAAQ,CAAC,aAAa;QAAE,OAAO,QAAQ,CAAC;IACpH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACpD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport type { ColorRGB } from '../types.js';\n\n/** Normal-incidence, single-passage coat absorption for surface emission.\n * coatColor is squared transmittance; emission crosses the coat once.\n * With coatWeightMap, this is raw emission and the conservative light proposal;\n * the shader applies the UV-dependent absorption exactly once.\n * Keep this shared by material packing and both emissive-distribution paths.\n */\nexport function materialEmission(material: OpenPBRMaterial): ColorRGB {\n const emission: ColorRGB = [\n material.emissionColor[0] * material.emissionLuminance,\n material.emissionColor[1] * material.emissionLuminance,\n material.emissionColor[2] * material.emissionLuminance\n ];\n if (material.unlit || material.shadowCatcher || material.coatWeight <= 0 || material.coatWeightMap) return emission;\n const coatWeight = Math.min(material.coatWeight, 1);\n for (let channel = 0; channel < 3; channel++) {\n emission[channel] *= 1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[channel], 0)) - 1);\n }\n return emission;\n}\n"]}
1
+ {"version":3,"file":"materialEmission.js","sourceRoot":"","sources":["../../src/renderer/materialEmission.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,MAAM,QAAQ,GAAa;QACzB,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB;QACtD,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB;QACtD,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB;KACvD,CAAC;IACF,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,QAAQ,CAAC,aAAa;QAAE,OAAO,QAAQ,CAAC;IACpH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnG,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type MaterialState from '../scene/MaterialState.js';\nimport type { ColorRGB } from '../types.js';\n\n/** Normal-incidence, single-passage coat absorption for surface emission.\n * coatColor is squared transmittance; emission crosses the coat once.\n * With coatWeightMap, this is raw emission and the conservative light proposal;\n * the shader applies the UV-dependent absorption exactly once.\n * Keep this shared by material packing and both emissive-distribution paths.\n */\nexport function materialEmission(material: MaterialState): ColorRGB {\n const emission: ColorRGB = [\n material.emissionColor[0] * material.emissionLuminance,\n material.emissionColor[1] * material.emissionLuminance,\n material.emissionColor[2] * material.emissionLuminance\n ];\n if (material.unlit || material.shadowCatcher || material.coatWeight <= 0 || material.coatWeightMap) return emission;\n const coatWeight = Math.min(material.coatWeight, 1);\n emission[0] = emission[0] * (1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[0], 0)) - 1));\n emission[1] = emission[1] * (1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[1], 0)) - 1));\n emission[2] = emission[2] * (1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[2], 0)) - 1));\n return emission;\n}\n"]}
@@ -1,102 +1,3 @@
1
- import type { BufferData } from './MaterialTable.js';
2
- type FieldType = 'f32' | 'vec2f' | 'vec3f';
3
- export interface MaterialLayoutField {
4
- name: string;
5
- source: keyof BufferData | null;
6
- type: FieldType;
7
- reserved: boolean;
8
- }
9
- export declare const MATERIAL_LAYOUT: readonly [{
10
- readonly name: "COLOR";
11
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
12
- }, {
13
- readonly name: "ROUGHNESS_NORMAL";
14
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
15
- }, {
16
- readonly name: "METALLIC_MAPS";
17
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
18
- }, {
19
- readonly name: "EMISSION";
20
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
21
- }, {
22
- readonly name: "IOR_TRANSMISSION";
23
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
24
- }, {
25
- readonly name: "MISC";
26
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
27
- }, {
28
- readonly name: "LAYER_MAPS";
29
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
30
- }, {
31
- readonly name: "UV";
32
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
33
- }, {
34
- readonly name: "DISPLACEMENT";
35
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
36
- }, {
37
- readonly name: "ALPHA_FILM";
38
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
39
- }, {
40
- readonly name: "BASE_CONTROLS";
41
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
42
- }, {
43
- readonly name: "SPECULAR_FUZZ";
44
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
45
- }, {
46
- readonly name: "TRANSMISSION_COLOR";
47
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
48
- }, {
49
- readonly name: "TRANSMISSION_SCATTER";
50
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
51
- }, {
52
- readonly name: "SUBSURFACE";
53
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
54
- }, {
55
- readonly name: "FUZZ";
56
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
57
- }, {
58
- readonly name: "COAT";
59
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
60
- }, {
61
- readonly name: "COAT_CONTROLS";
62
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
63
- }, {
64
- readonly name: "FILM_DISPERSION";
65
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
66
- }, {
67
- readonly name: "SUBSURFACE_RADIUS";
68
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
69
- }, {
70
- readonly name: "MEDIUM_EXTINCTION";
71
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
72
- }, {
73
- readonly name: "MEDIUM_SCATTERING";
74
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField];
75
- }, {
76
- readonly name: "STANDALONE_MAPS";
77
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
78
- }, {
79
- readonly name: "ALPHA";
80
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
81
- }, {
82
- readonly name: "DIRECTION_NORMAL";
83
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
84
- }, {
85
- readonly name: "FILM_TEXTURE";
86
- readonly fields: readonly [MaterialLayoutField, MaterialLayoutField, MaterialLayoutField, MaterialLayoutField];
87
- }];
88
- export declare const MATERIAL_ROW_COUNT: 26;
89
- export declare const MATERIAL_FLOAT_COUNT: number;
90
- export declare function materialLayoutFields(): {
91
- row: number;
92
- component: number;
93
- offset: number;
94
- name: string;
95
- source: keyof BufferData | null;
96
- type: FieldType;
97
- reserved: boolean;
98
- }[];
1
+ import type { BufferData } from './materialBufferData.js';
2
+ export * from './materialLayoutSchema.js';
99
3
  export declare function packMaterialBuffer(data: BufferData): Float32Array;
100
- export declare function materialBufferWgsl(): string;
101
- export declare function materialRowsGlsl(): string;
102
- export {};
@@ -1,159 +1,117 @@
1
- function field(name, source, type, reserved = false) {
2
- return { name, source, type, reserved };
3
- }
4
- export const MATERIAL_LAYOUT = [
5
- { name: 'COLOR', fields: [
6
- field('color', 'color', 'vec3f'),
7
- field('matType', 'type', 'f32')
8
- ] },
9
- { name: 'ROUGHNESS_NORMAL', fields: [
10
- field('roughness', 'roughness', 'f32'),
11
- field('normalMapIndex', 'normalMapIndex', 'f32'),
12
- field('normalMapScale', 'normalScale', 'vec2f')
13
- ] },
14
- { name: 'METALLIC_MAPS', fields: [
15
- field('metallic', 'metallic', 'f32'),
16
- field('anisotropy', 'anisotropy', 'f32'),
17
- field('diffuseMapIndex', 'diffuseMapIndex', 'f32'),
18
- field('mrtMapIndex', 'metallicRoughnessMapIndex', 'f32')
19
- ] },
20
- { name: 'EMISSION', fields: [
21
- field('emission', 'emission', 'vec3f'),
22
- field('emissiveMapIndex', 'emissiveMapIndex', 'f32')
23
- ] },
24
- { name: 'IOR_TRANSMISSION', fields: [
25
- field('ior', 'ior', 'f32'),
26
- field('transmission', 'transmission', 'f32'),
27
- field('mediumType', 'mediumType', 'f32', true),
28
- field('thin', 'thin', 'f32')
29
- ] },
30
- { name: 'MISC', fields: [
31
- field('bevel', 'bevelSize', 'f32'),
32
- field('dispersion', 'dispersion', 'f32'),
33
- field('thinFilmThickness', 'thinFilmThickness', 'f32'),
34
- field('mapAlphaUsage', 'mapAlphaUsage', 'f32')
35
- ] },
36
- { name: 'LAYER_MAPS', fields: [
37
- field('coatWeightMapIndex', 'coatWeightMapIndex', 'f32'),
38
- field('coatRoughnessMapIndex', 'coatRoughnessMapIndex', 'f32'),
39
- field('coatNormalMapIndex', 'coatNormalMapIndex', 'f32'),
40
- field('fuzzColorMapIndex', 'fuzzColorMapIndex', 'f32')
41
- ] },
42
- { name: 'UV', fields: [
43
- field('uvProjection', 'uvProjection', 'f32'),
44
- field('displacementMapIndex', 'displacementMapIndex', 'f32'),
45
- field('uvScale', 'uvScale', 'vec2f')
46
- ] },
47
- { name: 'DISPLACEMENT', fields: [
48
- field('displacementStepSize', 'displacementStepSize', 'f32'),
49
- // Reuses zero padding: default bias preserves historical bytes and stride.
50
- field('displacementBias', 'displacementBias', 'f32'),
51
- field('displacementUvProjection', 'displacementUvProjection', 'f32'),
52
- field('displacementUvProjectionScale', 'displacementUvProjectionScale', 'f32')
53
- ] },
54
- { name: 'ALPHA_FILM', fields: [
55
- field('alpha', 'alpha', 'f32'),
56
- field('thinFilmMapIndex', 'thinFilmMapIndex', 'f32'),
57
- field('thinFilmIor', 'thinFilmIor', 'f32'),
58
- field('transmissionMapIndex', 'transmissionMapIndex', 'f32')
59
- ] },
60
- { name: 'BASE_CONTROLS', fields: [
61
- field('baseWeight', 'baseWeight', 'f32'),
62
- field('baseDiffuseRoughness', 'baseDiffuseRoughness', 'f32'),
63
- field('specularWeight', 'specularWeight', 'f32'),
64
- field('subsurfaceWeight', 'subsurfaceWeight', 'f32')
65
- ] },
66
- { name: 'SPECULAR_FUZZ', fields: [
67
- field('specularColor', 'specularColor', 'vec3f'),
68
- field('fuzzWeight', 'fuzzWeight', 'f32')
69
- ] },
70
- { name: 'TRANSMISSION_COLOR', fields: [
71
- field('transmissionColor', 'transmissionColor', 'vec3f'),
72
- field('transmissionDepth', 'transmissionDepth', 'f32')
73
- ] },
74
- { name: 'TRANSMISSION_SCATTER', fields: [
75
- field('transmissionScatter', 'transmissionScatter', 'vec3f'),
76
- field('transmissionScatterAnisotropy', 'transmissionScatterAnisotropy', 'f32')
77
- ] },
78
- { name: 'SUBSURFACE', fields: [
79
- field('subsurfaceColor', 'subsurfaceColor', 'vec3f'),
80
- field('subsurfaceRadius', 'subsurfaceRadius', 'f32')
81
- ] },
82
- { name: 'FUZZ', fields: [
83
- field('fuzzColor', 'fuzzColor', 'vec3f'),
84
- field('fuzzRoughness', 'fuzzRoughness', 'f32')
85
- ] },
86
- { name: 'COAT', fields: [
87
- field('coatColor', 'coatColor', 'vec3f'),
88
- field('coatWeight', 'coatWeight', 'f32')
89
- ] },
90
- { name: 'COAT_CONTROLS', fields: [
91
- field('coatRoughness', 'coatRoughness', 'f32'),
92
- field('coatAnisotropy', 'coatAnisotropy', 'f32'),
93
- field('coatIor', 'coatIor', 'f32'),
94
- field('coatDarkening', 'coatDarkening', 'f32')
95
- ] },
96
- { name: 'FILM_DISPERSION', fields: [
97
- field('thinFilmWeight', 'thinFilmWeight', 'f32'),
98
- field('dispersionAbbeNumber', 'dispersionAbbeNumber', 'f32'),
99
- field('subsurfaceScatterAnisotropy', 'subsurfaceScatterAnisotropy', 'f32'),
100
- field('fuzzRoughnessMapIndex', 'fuzzRoughnessMapIndex', 'f32')
101
- ] },
102
- { name: 'SUBSURFACE_RADIUS', fields: [
103
- field('subsurfaceRadiusScale', 'subsurfaceRadiusScale', 'vec3f'),
104
- field('specularWeightMapIndex', 'specularWeightMapIndex', 'f32')
105
- ] },
106
- { name: 'MEDIUM_EXTINCTION', fields: [
107
- field('mediumExtinction', 'mediumExtinction', 'vec3f'),
108
- field('mediumAnisotropy', 'mediumAnisotropy', 'f32')
109
- ] },
110
- { name: 'MEDIUM_SCATTERING', fields: [
111
- field('mediumScattering', 'mediumScattering', 'vec3f'),
112
- field('specularColorMapIndex', 'specularColorMapIndex', 'f32')
113
- ] },
114
- { name: 'STANDALONE_MAPS', fields: [
115
- field('roughnessMapIndex', 'roughnessMapIndex', 'f32'),
116
- field('metalnessMapIndex', 'metalnessMapIndex', 'f32'),
117
- field('alphaMapIndex', 'alphaMapIndex', 'f32'),
118
- field('alphaCutoff', 'alphaCutoff', 'f32')
119
- ] },
120
- { name: 'ALPHA', fields: [
121
- field('_padding1', null, 'f32', true),
122
- field('_padding2', null, 'f32', true),
123
- field('doubleSided', 'doubleSided', 'f32'),
124
- field('alphaMode', 'alphaMode', 'f32')
125
- ] },
126
- // Reserve the approved direction/normal inputs for C1 steps two and three.
127
- { name: 'DIRECTION_NORMAL', fields: [
128
- field('anisotropyMapIndex', 'anisotropyMapIndex', 'f32'),
129
- field('specularAnisotropyRotation', 'specularAnisotropyRotation', 'f32'),
130
- field('coatNormalScale', 'coatNormalScale', 'vec2f')
131
- ] },
132
- { name: 'FILM_TEXTURE', fields: [
133
- field('coatAnisotropyRotation', 'coatAnisotropyRotation', 'f32'),
134
- field('specularAnisotropyModel', 'specularAnisotropyModel', 'f32'),
135
- field('thinFilmThicknessMinimum', 'thinFilmThicknessMinimum', 'f32'),
136
- field('thinFilmMapChannel', 'thinFilmMapChannel', 'f32')
137
- ] },
138
- ];
139
- export const MATERIAL_ROW_COUNT = MATERIAL_LAYOUT.length;
140
- export const MATERIAL_FLOAT_COUNT = MATERIAL_ROW_COUNT * 4;
1
+ import { materialLayoutFields, MATERIAL_FLOAT_COUNT } from './materialLayoutSchema.js';
2
+ export * from './materialLayoutSchema.js';
141
3
  const components = { f32: 1, vec2f: 2, vec3f: 3 };
142
- export function materialLayoutFields() {
143
- return MATERIAL_LAYOUT.flatMap((row, rowIndex) => {
144
- let component = 0;
145
- return row.fields.map(field => {
146
- const offset = rowIndex * 16 + component * 4;
147
- component += components[field.type];
148
- return { ...field, row: rowIndex, component: offset % 16 / 4, offset };
149
- });
150
- });
4
+ function flattenColors(values) {
5
+ const result = [];
6
+ if (!values)
7
+ return result;
8
+ for (const value of values) {
9
+ const array = value;
10
+ for (let i = 0; i < array.length; i++)
11
+ result.push(array[i]);
12
+ }
13
+ return result;
14
+ }
15
+ function flattenVectors(values) {
16
+ const result = [];
17
+ if (!values)
18
+ return result;
19
+ for (const value of values) {
20
+ // Array.flat leaves typed arrays intact; Number then converts each as one
21
+ // entry. Preserve that existing behavior, including non-finite conversion.
22
+ if (value instanceof Float32Array) {
23
+ result.push(value.length === 0 ? 0 : value.length === 1 ? value[0] : NaN);
24
+ }
25
+ else {
26
+ for (let i = 0; i < value.length; i++)
27
+ result.push(value[i]);
28
+ }
29
+ }
30
+ return result;
151
31
  }
152
32
  export function packMaterialBuffer(data) {
33
+ const values = {
34
+ color: flattenColors(data.color),
35
+ type: data.type?.flat() ?? [],
36
+ roughness: data.roughness?.flat() ?? [],
37
+ normalMapIndex: data.normalMapIndex?.flat() ?? [],
38
+ normalScale: flattenVectors(data.normalScale),
39
+ metallic: data.metallic?.flat() ?? [],
40
+ anisotropy: data.anisotropy?.flat() ?? [],
41
+ diffuseMapIndex: data.diffuseMapIndex?.flat() ?? [],
42
+ metallicRoughnessMapIndex: data.metallicRoughnessMapIndex?.flat() ?? [],
43
+ emission: flattenColors(data.emission),
44
+ emissiveMapIndex: data.emissiveMapIndex?.flat() ?? [],
45
+ ior: data.ior?.flat() ?? [],
46
+ transmission: data.transmission?.flat() ?? [],
47
+ mediumType: data.mediumType?.flat() ?? [],
48
+ thin: data.thin?.flat() ?? [],
49
+ bevelSize: data.bevelSize?.flat() ?? [],
50
+ dispersion: data.dispersion?.flat() ?? [],
51
+ thinFilmThickness: data.thinFilmThickness?.flat() ?? [],
52
+ mapAlphaUsage: data.mapAlphaUsage?.flat() ?? [],
53
+ coatWeightMapIndex: data.coatWeightMapIndex?.flat() ?? [],
54
+ coatRoughnessMapIndex: data.coatRoughnessMapIndex?.flat() ?? [],
55
+ coatNormalMapIndex: data.coatNormalMapIndex?.flat() ?? [],
56
+ fuzzColorMapIndex: data.fuzzColorMapIndex?.flat() ?? [],
57
+ uvProjection: data.uvProjection?.flat() ?? [],
58
+ displacementMapIndex: data.displacementMapIndex?.flat() ?? [],
59
+ uvScale: flattenVectors(data.uvScale),
60
+ displacementStepSize: data.displacementStepSize?.flat() ?? [],
61
+ displacementBias: data.displacementBias?.flat() ?? [],
62
+ displacementUvProjection: data.displacementUvProjection?.flat() ?? [],
63
+ displacementUvProjectionScale: data.displacementUvProjectionScale?.flat() ?? [],
64
+ alpha: data.alpha?.flat() ?? [],
65
+ thinFilmMapIndex: data.thinFilmMapIndex?.flat() ?? [],
66
+ thinFilmIor: data.thinFilmIor?.flat() ?? [],
67
+ transmissionMapIndex: data.transmissionMapIndex?.flat() ?? [],
68
+ baseWeight: data.baseWeight?.flat() ?? [],
69
+ baseDiffuseRoughness: data.baseDiffuseRoughness?.flat() ?? [],
70
+ specularWeight: data.specularWeight?.flat() ?? [],
71
+ subsurfaceWeight: data.subsurfaceWeight?.flat() ?? [],
72
+ specularColor: flattenColors(data.specularColor),
73
+ fuzzWeight: data.fuzzWeight?.flat() ?? [],
74
+ transmissionColor: flattenColors(data.transmissionColor),
75
+ transmissionDepth: data.transmissionDepth?.flat() ?? [],
76
+ transmissionScatter: flattenColors(data.transmissionScatter),
77
+ transmissionScatterAnisotropy: data.transmissionScatterAnisotropy?.flat() ?? [],
78
+ subsurfaceColor: flattenColors(data.subsurfaceColor),
79
+ subsurfaceRadius: data.subsurfaceRadius?.flat() ?? [],
80
+ fuzzColor: flattenColors(data.fuzzColor),
81
+ fuzzRoughness: data.fuzzRoughness?.flat() ?? [],
82
+ coatColor: flattenColors(data.coatColor),
83
+ coatWeight: data.coatWeight?.flat() ?? [],
84
+ coatRoughness: data.coatRoughness?.flat() ?? [],
85
+ coatAnisotropy: data.coatAnisotropy?.flat() ?? [],
86
+ coatIor: data.coatIor?.flat() ?? [],
87
+ coatDarkening: data.coatDarkening?.flat() ?? [],
88
+ thinFilmWeight: data.thinFilmWeight?.flat() ?? [],
89
+ dispersionAbbeNumber: data.dispersionAbbeNumber?.flat() ?? [],
90
+ subsurfaceScatterAnisotropy: data.subsurfaceScatterAnisotropy?.flat() ?? [],
91
+ fuzzRoughnessMapIndex: data.fuzzRoughnessMapIndex?.flat() ?? [],
92
+ subsurfaceRadiusScale: flattenColors(data.subsurfaceRadiusScale),
93
+ specularWeightMapIndex: data.specularWeightMapIndex?.flat() ?? [],
94
+ mediumExtinction: flattenColors(data.mediumExtinction),
95
+ mediumAnisotropy: data.mediumAnisotropy?.flat() ?? [],
96
+ mediumScattering: flattenColors(data.mediumScattering),
97
+ specularColorMapIndex: data.specularColorMapIndex?.flat() ?? [],
98
+ roughnessMapIndex: data.roughnessMapIndex?.flat() ?? [],
99
+ metalnessMapIndex: data.metalnessMapIndex?.flat() ?? [],
100
+ alphaMapIndex: data.alphaMapIndex?.flat() ?? [],
101
+ alphaCutoff: data.alphaCutoff?.flat() ?? [],
102
+ doubleSided: data.doubleSided?.flat() ?? [],
103
+ alphaMode: data.alphaMode?.flat() ?? [],
104
+ anisotropyMapIndex: data.anisotropyMapIndex?.flat() ?? [],
105
+ specularAnisotropyRotation: data.specularAnisotropyRotation?.flat() ?? [],
106
+ coatNormalScale: flattenVectors(data.coatNormalScale),
107
+ coatAnisotropyRotation: data.coatAnisotropyRotation?.flat() ?? [],
108
+ specularAnisotropyModel: data.specularAnisotropyModel?.flat() ?? [],
109
+ thinFilmThicknessMinimum: data.thinFilmThicknessMinimum?.flat() ?? [],
110
+ thinFilmMapChannel: data.thinFilmMapChannel?.flat() ?? [],
111
+ };
153
112
  const fields = materialLayoutFields().map(field => ({
154
- ...field,
155
- // Flatten exactly as the legacy interleave did (including missing indices).
156
- values: field.source === null ? data.type.map(() => 0) : data[field.source]?.flat() ?? []
113
+ type: field.type, offset: field.offset,
114
+ values: field.source === null ? data.type.map(() => 0) : values[field.source] ?? []
157
115
  }));
158
116
  const packed = new Float32Array(data.type.length * MATERIAL_FLOAT_COUNT);
159
117
  for (let material = 0; material < data.type.length; material++) {
@@ -167,24 +125,4 @@ export function packMaterialBuffer(data) {
167
125
  }
168
126
  return packed;
169
127
  }
170
- export function materialBufferWgsl() {
171
- let end = 0;
172
- const declarations = materialLayoutFields().map(field => {
173
- const alignment = field.type === 'vec3f' ? 16 : components[field.type] * 4;
174
- const aligned = Math.ceil(end / alignment) * alignment;
175
- if (aligned !== field.offset)
176
- throw new Error(`Misaligned material field: ${field.name}`);
177
- end = aligned + components[field.type] * 4;
178
- return ` ${field.name}: ${field.type},`;
179
- });
180
- if (Math.ceil(end / 16) * 16 !== MATERIAL_ROW_COUNT * 16) {
181
- throw new Error('Invalid material buffer size');
182
- }
183
- return `struct MaterialBuffer {\n${declarations.join('\n')}\n};`;
184
- }
185
- export function materialRowsGlsl() {
186
- return [`const int MAT_DATA_SIZE = ${MATERIAL_ROW_COUNT};`,
187
- ...MATERIAL_LAYOUT.map((row, index) => `const int MAT_ROW_${row.name} = ${index};`)
188
- ].join('\n');
189
- }
190
128
  //# sourceMappingURL=materialLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"materialLayout.js","sourceRoot":"","sources":["../../src/renderer/materialLayout.ts"],"names":[],"mappings":"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","sourcesContent":["import type { vec2 } from '../math.js';\nimport type { BufferData } from './MaterialTable.js';\n\n// Internal GPU contract. Each row occupies one vec4 (16 bytes). Reserved fields\n// retain their legacy sources/zero bytes; reuse requires an intentional migration.\ntype FieldType = 'f32' | 'vec2f' | 'vec3f';\ntype Source<T extends FieldType> = {\n [K in keyof BufferData]: BufferData[K] extends (T extends 'f32' ? number[] :\n T extends 'vec2f' ? vec2.Vec2Array[] : [number, number, number][]) ? K : never\n}[keyof BufferData];\nexport interface MaterialLayoutField {\n name: string;\n source: keyof BufferData | null;\n type: FieldType;\n reserved: boolean;\n}\nfunction field<T extends FieldType>(name: string, source: Source<T> | null,\n type: T, reserved = false): MaterialLayoutField {\n return { name, source, type, reserved };\n}\n\nexport const MATERIAL_LAYOUT = [\n { name: 'COLOR', fields: [\n field('color', 'color', 'vec3f'),\n field('matType', 'type', 'f32')\n ] },\n { name: 'ROUGHNESS_NORMAL', fields: [\n field('roughness', 'roughness', 'f32'),\n field('normalMapIndex', 'normalMapIndex', 'f32'),\n field('normalMapScale', 'normalScale', 'vec2f')\n ] },\n { name: 'METALLIC_MAPS', fields: [\n field('metallic', 'metallic', 'f32'),\n field('anisotropy', 'anisotropy', 'f32'),\n field('diffuseMapIndex', 'diffuseMapIndex', 'f32'),\n field('mrtMapIndex', 'metallicRoughnessMapIndex', 'f32')\n ] },\n { name: 'EMISSION', fields: [\n field('emission', 'emission', 'vec3f'),\n field('emissiveMapIndex', 'emissiveMapIndex', 'f32')\n ] },\n { name: 'IOR_TRANSMISSION', fields: [\n field('ior', 'ior', 'f32'),\n field('transmission', 'transmission', 'f32'),\n field('mediumType', 'mediumType', 'f32', true),\n field('thin', 'thin', 'f32')\n ] },\n { name: 'MISC', fields: [\n field('bevel', 'bevelSize', 'f32'),\n field('dispersion', 'dispersion', 'f32'),\n field('thinFilmThickness', 'thinFilmThickness', 'f32'),\n field('mapAlphaUsage', 'mapAlphaUsage', 'f32')\n ] },\n { name: 'LAYER_MAPS', fields: [\n field('coatWeightMapIndex', 'coatWeightMapIndex', 'f32'),\n field('coatRoughnessMapIndex', 'coatRoughnessMapIndex', 'f32'),\n field('coatNormalMapIndex', 'coatNormalMapIndex', 'f32'),\n field('fuzzColorMapIndex', 'fuzzColorMapIndex', 'f32')\n ] },\n { name: 'UV', fields: [\n field('uvProjection', 'uvProjection', 'f32'),\n field('displacementMapIndex', 'displacementMapIndex', 'f32'),\n field('uvScale', 'uvScale', 'vec2f')\n ] },\n { name: 'DISPLACEMENT', fields: [\n field('displacementStepSize', 'displacementStepSize', 'f32'),\n // Reuses zero padding: default bias preserves historical bytes and stride.\n field('displacementBias', 'displacementBias', 'f32'),\n field('displacementUvProjection', 'displacementUvProjection', 'f32'),\n field('displacementUvProjectionScale', 'displacementUvProjectionScale', 'f32')\n ] },\n { name: 'ALPHA_FILM', fields: [\n field('alpha', 'alpha', 'f32'),\n field('thinFilmMapIndex', 'thinFilmMapIndex', 'f32'),\n field('thinFilmIor', 'thinFilmIor', 'f32'),\n field('transmissionMapIndex', 'transmissionMapIndex', 'f32')\n ] },\n { name: 'BASE_CONTROLS', fields: [\n field('baseWeight', 'baseWeight', 'f32'),\n field('baseDiffuseRoughness', 'baseDiffuseRoughness', 'f32'),\n field('specularWeight', 'specularWeight', 'f32'),\n field('subsurfaceWeight', 'subsurfaceWeight', 'f32')\n ] },\n { name: 'SPECULAR_FUZZ', fields: [\n field('specularColor', 'specularColor', 'vec3f'),\n field('fuzzWeight', 'fuzzWeight', 'f32')\n ] },\n { name: 'TRANSMISSION_COLOR', fields: [\n field('transmissionColor', 'transmissionColor', 'vec3f'),\n field('transmissionDepth', 'transmissionDepth', 'f32')\n ] },\n { name: 'TRANSMISSION_SCATTER', fields: [\n field('transmissionScatter', 'transmissionScatter', 'vec3f'),\n field('transmissionScatterAnisotropy', 'transmissionScatterAnisotropy', 'f32')\n ] },\n { name: 'SUBSURFACE', fields: [\n field('subsurfaceColor', 'subsurfaceColor', 'vec3f'),\n field('subsurfaceRadius', 'subsurfaceRadius', 'f32')\n ] },\n { name: 'FUZZ', fields: [\n field('fuzzColor', 'fuzzColor', 'vec3f'),\n field('fuzzRoughness', 'fuzzRoughness', 'f32')\n ] },\n { name: 'COAT', fields: [\n field('coatColor', 'coatColor', 'vec3f'),\n field('coatWeight', 'coatWeight', 'f32')\n ] },\n { name: 'COAT_CONTROLS', fields: [\n field('coatRoughness', 'coatRoughness', 'f32'),\n field('coatAnisotropy', 'coatAnisotropy', 'f32'),\n field('coatIor', 'coatIor', 'f32'),\n field('coatDarkening', 'coatDarkening', 'f32')\n ] },\n { name: 'FILM_DISPERSION', fields: [\n field('thinFilmWeight', 'thinFilmWeight', 'f32'),\n field('dispersionAbbeNumber', 'dispersionAbbeNumber', 'f32'),\n field('subsurfaceScatterAnisotropy', 'subsurfaceScatterAnisotropy', 'f32'),\n field('fuzzRoughnessMapIndex', 'fuzzRoughnessMapIndex', 'f32')\n ] },\n { name: 'SUBSURFACE_RADIUS', fields: [\n field('subsurfaceRadiusScale', 'subsurfaceRadiusScale', 'vec3f'),\n field('specularWeightMapIndex', 'specularWeightMapIndex', 'f32')\n ] },\n { name: 'MEDIUM_EXTINCTION', fields: [\n field('mediumExtinction', 'mediumExtinction', 'vec3f'),\n field('mediumAnisotropy', 'mediumAnisotropy', 'f32')\n ] },\n { name: 'MEDIUM_SCATTERING', fields: [\n field('mediumScattering', 'mediumScattering', 'vec3f'),\n field('specularColorMapIndex', 'specularColorMapIndex', 'f32')\n ] },\n { name: 'STANDALONE_MAPS', fields: [\n field('roughnessMapIndex', 'roughnessMapIndex', 'f32'),\n field('metalnessMapIndex', 'metalnessMapIndex', 'f32'),\n field('alphaMapIndex', 'alphaMapIndex', 'f32'),\n field('alphaCutoff', 'alphaCutoff', 'f32')\n ] },\n { name: 'ALPHA', fields: [\n field('_padding1', null, 'f32', true),\n field('_padding2', null, 'f32', true),\n field('doubleSided', 'doubleSided', 'f32'),\n field('alphaMode', 'alphaMode', 'f32')\n ] },\n // Reserve the approved direction/normal inputs for C1 steps two and three.\n { name: 'DIRECTION_NORMAL', fields: [\n field('anisotropyMapIndex', 'anisotropyMapIndex', 'f32'),\n field('specularAnisotropyRotation', 'specularAnisotropyRotation', 'f32'),\n field('coatNormalScale', 'coatNormalScale', 'vec2f')\n ] },\n { name: 'FILM_TEXTURE', fields: [\n field('coatAnisotropyRotation', 'coatAnisotropyRotation', 'f32'),\n field('specularAnisotropyModel', 'specularAnisotropyModel', 'f32'),\n field('thinFilmThicknessMinimum', 'thinFilmThicknessMinimum', 'f32'),\n field('thinFilmMapChannel', 'thinFilmMapChannel', 'f32')\n ] },\n] as const;\n\nexport const MATERIAL_ROW_COUNT = MATERIAL_LAYOUT.length;\nexport const MATERIAL_FLOAT_COUNT = MATERIAL_ROW_COUNT * 4;\nconst components = { f32: 1, vec2f: 2, vec3f: 3 } as const;\nexport function materialLayoutFields() {\n return MATERIAL_LAYOUT.flatMap((row, rowIndex) => {\n let component = 0;\n return row.fields.map(field => {\n const offset = rowIndex * 16 + component * 4;\n component += components[field.type];\n return { ...field, row: rowIndex, component: offset % 16 / 4, offset };\n });\n });\n}\n\nexport function packMaterialBuffer(data: BufferData): Float32Array {\n const fields = materialLayoutFields().map(field => ({\n ...field,\n // Flatten exactly as the legacy interleave did (including missing indices).\n values: field.source === null ? data.type.map(() => 0) : data[field.source]?.flat() ?? []\n }));\n const packed = new Float32Array(data.type.length * MATERIAL_FLOAT_COUNT);\n for (let material = 0; material < data.type.length; material++) {\n for (const field of fields) {\n const width = components[field.type];\n for (let c = 0; c < width; c++) {\n packed[material * MATERIAL_FLOAT_COUNT + field.offset / 4 + c] =\n Number(field.values[material * width + c] ?? -1);\n }\n }\n }\n return packed;\n}\n\nexport function materialBufferWgsl(): string {\n let end = 0;\n const declarations = materialLayoutFields().map(field => {\n const alignment = field.type === 'vec3f' ? 16 : components[field.type] * 4;\n const aligned = Math.ceil(end / alignment) * alignment;\n if (aligned !== field.offset) throw new Error(`Misaligned material field: ${field.name}`);\n end = aligned + components[field.type] * 4;\n return ` ${field.name}: ${field.type},`;\n });\n if (Math.ceil(end / 16) * 16 !== MATERIAL_ROW_COUNT * 16) {\n throw new Error('Invalid material buffer size');\n }\n return `struct MaterialBuffer {\\n${declarations.join('\\n')}\\n};`;\n}\n\nexport function materialRowsGlsl(): string {\n return [`const int MAT_DATA_SIZE = ${MATERIAL_ROW_COUNT};`,\n ...MATERIAL_LAYOUT.map((row, index) => `const int MAT_ROW_${row.name} = ${index};`)\n ].join('\\n');\n}\n"]}
1
+ {"version":3,"file":"materialLayout.js","sourceRoot":"","sources":["../../src/renderer/materialLayout.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BufferData } from './materialBufferData.js';\nimport type { ColorRGB } from '../types.js';\nimport type { vec2 } from '../math.js';\nimport { materialLayoutFields, MATERIAL_FLOAT_COUNT } from './materialLayoutSchema.js';\nexport * from './materialLayoutSchema.js';\nconst components = { f32: 1, vec2f: 2, vec3f: 3 } as const;\n\nfunction flattenColors(values: ColorRGB[] | undefined): number[] {\n const result: number[] = [];\n if (!values) return result;\n for (const value of values) {\n const array = value as readonly number[];\n for (let i = 0; i < array.length; i++) result.push(array[i]);\n }\n return result;\n}\nfunction flattenVectors(values: vec2.Vec2Array[] | undefined): number[] {\n const result: number[] = [];\n if (!values) return result;\n for (const value of values) {\n // Array.flat leaves typed arrays intact; Number then converts each as one\n // entry. Preserve that existing behavior, including non-finite conversion.\n if (value instanceof Float32Array) {\n result.push(value.length === 0 ? 0 : value.length === 1 ? value[0] : NaN);\n } else {\n for (let i = 0; i < value.length; i++) result.push(value[i]);\n }\n }\n return result;\n}\n\nexport function packMaterialBuffer(data: BufferData): Float32Array {\n const values: Record<string, number[]> = {\n color: flattenColors(data.color),\n type: data.type?.flat() ?? [],\n roughness: data.roughness?.flat() ?? [],\n normalMapIndex: data.normalMapIndex?.flat() ?? [],\n normalScale: flattenVectors(data.normalScale),\n metallic: data.metallic?.flat() ?? [],\n anisotropy: data.anisotropy?.flat() ?? [],\n diffuseMapIndex: data.diffuseMapIndex?.flat() ?? [],\n metallicRoughnessMapIndex: data.metallicRoughnessMapIndex?.flat() ?? [],\n emission: flattenColors(data.emission),\n emissiveMapIndex: data.emissiveMapIndex?.flat() ?? [],\n ior: data.ior?.flat() ?? [],\n transmission: data.transmission?.flat() ?? [],\n mediumType: data.mediumType?.flat() ?? [],\n thin: data.thin?.flat() ?? [],\n bevelSize: data.bevelSize?.flat() ?? [],\n dispersion: data.dispersion?.flat() ?? [],\n thinFilmThickness: data.thinFilmThickness?.flat() ?? [],\n mapAlphaUsage: data.mapAlphaUsage?.flat() ?? [],\n coatWeightMapIndex: data.coatWeightMapIndex?.flat() ?? [],\n coatRoughnessMapIndex: data.coatRoughnessMapIndex?.flat() ?? [],\n coatNormalMapIndex: data.coatNormalMapIndex?.flat() ?? [],\n fuzzColorMapIndex: data.fuzzColorMapIndex?.flat() ?? [],\n uvProjection: data.uvProjection?.flat() ?? [],\n displacementMapIndex: data.displacementMapIndex?.flat() ?? [],\n uvScale: flattenVectors(data.uvScale),\n displacementStepSize: data.displacementStepSize?.flat() ?? [],\n displacementBias: data.displacementBias?.flat() ?? [],\n displacementUvProjection: data.displacementUvProjection?.flat() ?? [],\n displacementUvProjectionScale: data.displacementUvProjectionScale?.flat() ?? [],\n alpha: data.alpha?.flat() ?? [],\n thinFilmMapIndex: data.thinFilmMapIndex?.flat() ?? [],\n thinFilmIor: data.thinFilmIor?.flat() ?? [],\n transmissionMapIndex: data.transmissionMapIndex?.flat() ?? [],\n baseWeight: data.baseWeight?.flat() ?? [],\n baseDiffuseRoughness: data.baseDiffuseRoughness?.flat() ?? [],\n specularWeight: data.specularWeight?.flat() ?? [],\n subsurfaceWeight: data.subsurfaceWeight?.flat() ?? [],\n specularColor: flattenColors(data.specularColor),\n fuzzWeight: data.fuzzWeight?.flat() ?? [],\n transmissionColor: flattenColors(data.transmissionColor),\n transmissionDepth: data.transmissionDepth?.flat() ?? [],\n transmissionScatter: flattenColors(data.transmissionScatter),\n transmissionScatterAnisotropy: data.transmissionScatterAnisotropy?.flat() ?? [],\n subsurfaceColor: flattenColors(data.subsurfaceColor),\n subsurfaceRadius: data.subsurfaceRadius?.flat() ?? [],\n fuzzColor: flattenColors(data.fuzzColor),\n fuzzRoughness: data.fuzzRoughness?.flat() ?? [],\n coatColor: flattenColors(data.coatColor),\n coatWeight: data.coatWeight?.flat() ?? [],\n coatRoughness: data.coatRoughness?.flat() ?? [],\n coatAnisotropy: data.coatAnisotropy?.flat() ?? [],\n coatIor: data.coatIor?.flat() ?? [],\n coatDarkening: data.coatDarkening?.flat() ?? [],\n thinFilmWeight: data.thinFilmWeight?.flat() ?? [],\n dispersionAbbeNumber: data.dispersionAbbeNumber?.flat() ?? [],\n subsurfaceScatterAnisotropy: data.subsurfaceScatterAnisotropy?.flat() ?? [],\n fuzzRoughnessMapIndex: data.fuzzRoughnessMapIndex?.flat() ?? [],\n subsurfaceRadiusScale: flattenColors(data.subsurfaceRadiusScale),\n specularWeightMapIndex: data.specularWeightMapIndex?.flat() ?? [],\n mediumExtinction: flattenColors(data.mediumExtinction),\n mediumAnisotropy: data.mediumAnisotropy?.flat() ?? [],\n mediumScattering: flattenColors(data.mediumScattering),\n specularColorMapIndex: data.specularColorMapIndex?.flat() ?? [],\n roughnessMapIndex: data.roughnessMapIndex?.flat() ?? [],\n metalnessMapIndex: data.metalnessMapIndex?.flat() ?? [],\n alphaMapIndex: data.alphaMapIndex?.flat() ?? [],\n alphaCutoff: data.alphaCutoff?.flat() ?? [],\n doubleSided: data.doubleSided?.flat() ?? [],\n alphaMode: data.alphaMode?.flat() ?? [],\n anisotropyMapIndex: data.anisotropyMapIndex?.flat() ?? [],\n specularAnisotropyRotation: data.specularAnisotropyRotation?.flat() ?? [],\n coatNormalScale: flattenVectors(data.coatNormalScale),\n coatAnisotropyRotation: data.coatAnisotropyRotation?.flat() ?? [],\n specularAnisotropyModel: data.specularAnisotropyModel?.flat() ?? [],\n thinFilmThicknessMinimum: data.thinFilmThicknessMinimum?.flat() ?? [],\n thinFilmMapChannel: data.thinFilmMapChannel?.flat() ?? [],\n };\n const fields = materialLayoutFields().map(field => ({\n type: field.type, offset: field.offset,\n values: field.source === null ? data.type.map(() => 0) : values[field.source] ?? []\n }));\n const packed = new Float32Array(data.type.length * MATERIAL_FLOAT_COUNT);\n for (let material = 0; material < data.type.length; material++) {\n for (const field of fields) {\n const width = components[field.type];\n for (let c = 0; c < width; c++) {\n packed[material * MATERIAL_FLOAT_COUNT + field.offset / 4 + c] =\n Number(field.values[material * width + c] ?? -1);\n }\n }\n }\n return packed;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { BufferData } from './materialBufferData.js';
2
+ type FieldType = 'f32' | 'vec2f' | 'vec3f';
3
+ export interface MaterialLayoutField {
4
+ name: string;
5
+ source: keyof BufferData | null;
6
+ type: FieldType;
7
+ reserved: boolean;
8
+ }
9
+ export declare const MATERIAL_LAYOUT: readonly {
10
+ readonly name: string;
11
+ readonly fields: readonly MaterialLayoutField[];
12
+ }[];
13
+ export declare const MATERIAL_ROW_COUNT: number;
14
+ export declare const MATERIAL_FLOAT_COUNT: number;
15
+ export declare function materialLayoutFields(): {
16
+ name: string;
17
+ source: keyof BufferData | null;
18
+ type: FieldType;
19
+ reserved: boolean;
20
+ row: number;
21
+ component: number;
22
+ offset: number;
23
+ }[];
24
+ export declare function materialBufferWgsl(): string;
25
+ export declare function materialRowsGlsl(): string;
26
+ export {};