@meimu/mutracer 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +195 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14352 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +144 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +273 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +121 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +256 -0
  35. package/lib/Render.js +671 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +76 -0
  38. package/lib/RenderLoop.js +204 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1446 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +121 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +619 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +100 -0
  511. package/lib/util/fromTHREE.js +1063 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,219 @@
1
+ import { MATERIAL_TEXTURE_NAMES } from '../scene/materialTextureNames.js';
2
+ export { MATERIAL_TEXTURE_NAMES };
3
+ import { MATERIAL_LAYOUT, materialLayoutFields } from './materialLayout.js';
4
+ // Internal slots only. Order is the legacy atlas/index contract. Color spaces
5
+ // describe decoding at the sample site; textures share the same stored atlas.
6
+ const slots = [
7
+ {
8
+ property: 'map', index: 'diffuseMapIndex',
9
+ target: 'baseColor/alpha/transmissionWeight', channel: 'rgb/a',
10
+ colorSpace: 'srgb', operation: 'custom',
11
+ define: 'NUM_DIFFUSE_MAPS', feature: 'USE_DIFFUSE_MAPS', featureBit: 2 ** 1,
12
+ sampling: 'manual'
13
+ },
14
+ {
15
+ property: 'alphaMap', index: 'alphaMapIndex',
16
+ target: 'alpha', channel: 'g',
17
+ colorSpace: 'linear', operation: 'multiply',
18
+ define: 'NUM_ALPHA_MAPS', feature: 'USE_ALPHA_MAPS', featureBit: 2 ** 2,
19
+ sampling: 'multiply'
20
+ },
21
+ {
22
+ property: 'normalMap', index: 'normalMapIndex',
23
+ target: 'normal', channel: 'rgb',
24
+ colorSpace: 'linear', operation: 'custom',
25
+ define: 'NUM_NORMAL_MAPS', feature: 'USE_NORMAL_MAPS', featureBit: 2 ** 9,
26
+ sampling: 'manual'
27
+ },
28
+ {
29
+ property: 'emissiveMap', index: 'emissiveMapIndex',
30
+ target: 'emission', channel: 'rgb',
31
+ colorSpace: 'srgb', operation: 'custom',
32
+ define: 'NUM_EMISSIVE_MAPS', feature: 'USE_EMISSIVE_MAPS', featureBit: 2 ** 7,
33
+ sampling: 'manual'
34
+ },
35
+ {
36
+ property: 'metallicRoughnessMap', index: 'metallicRoughnessMapIndex',
37
+ target: 'baseMetalness/specularRoughness', channel: 'b/g',
38
+ colorSpace: 'linear', operation: 'custom',
39
+ define: 'NUM_METALLIC_ROUGHNESS_MAPS', feature: 'USE_METALLIC_ROUGHNESS_MAPS', featureBit: 2 ** 3,
40
+ sampling: 'manual'
41
+ },
42
+ {
43
+ property: 'roughnessMap', index: 'roughnessMapIndex',
44
+ target: 'specularRoughness', channel: 'g',
45
+ colorSpace: 'linear', operation: 'multiply',
46
+ define: 'NUM_ROUGHNESS_MAPS', feature: 'USE_ROUGHNESS_MAPS', featureBit: 2 ** 4,
47
+ sampling: 'multiply'
48
+ },
49
+ {
50
+ property: 'metalnessMap', index: 'metalnessMapIndex',
51
+ target: 'baseMetalness', channel: 'b',
52
+ colorSpace: 'linear', operation: 'multiply',
53
+ define: 'NUM_METALNESS_MAPS', feature: 'USE_METALNESS_MAPS', featureBit: 2 ** 5,
54
+ sampling: 'multiply'
55
+ },
56
+ {
57
+ property: 'transmissionMap', index: 'transmissionMapIndex',
58
+ target: 'transmissionWeight', channel: 'r',
59
+ colorSpace: 'linear', operation: 'multiply',
60
+ define: 'NUM_TRANSMISSION_MAPS', feature: 'USE_TRANSMISSION_MAPS', featureBit: 2 ** 6,
61
+ sampling: 'multiply'
62
+ },
63
+ {
64
+ property: 'thinFilmMap', index: 'thinFilmMapIndex',
65
+ target: 'thinFilmThickness', channel: 'per-material',
66
+ colorSpace: 'linear', operation: 'custom',
67
+ define: 'NUM_THIN_FILM_MAPS', feature: 'USE_THIN_FILM_MAPS', featureBit: 2 ** 8,
68
+ sampling: 'manual'
69
+ },
70
+ {
71
+ property: 'displacementMap', index: 'displacementMapIndex',
72
+ target: 'displacement', channel: 'r',
73
+ colorSpace: 'linear', operation: 'custom',
74
+ define: null, feature: null, featureBit: 0,
75
+ sampling: 'manual'
76
+ },
77
+ {
78
+ property: 'coatWeightMap', index: 'coatWeightMapIndex',
79
+ target: 'coatWeight', channel: 'r',
80
+ colorSpace: 'linear', operation: 'multiply',
81
+ define: 'NUM_COAT_WEIGHT_MAPS', feature: 'USE_COAT_WEIGHT_MAPS', featureBit: 2 ** 15,
82
+ sampling: 'multiply'
83
+ },
84
+ {
85
+ property: 'coatRoughnessMap', index: 'coatRoughnessMapIndex',
86
+ target: 'coatRoughness', channel: 'g',
87
+ colorSpace: 'linear', operation: 'multiply',
88
+ define: 'NUM_COAT_ROUGHNESS_MAPS', feature: 'USE_COAT_ROUGHNESS_MAPS', featureBit: 2 ** 16,
89
+ sampling: 'multiply'
90
+ },
91
+ {
92
+ property: 'fuzzColorMap', index: 'fuzzColorMapIndex',
93
+ target: 'fuzzColor', channel: 'rgb',
94
+ colorSpace: 'srgb', operation: 'multiply',
95
+ define: 'NUM_FUZZ_COLOR_MAPS', feature: 'USE_FUZZ_COLOR_MAPS', featureBit: 2 ** 18,
96
+ sampling: 'multiply'
97
+ },
98
+ {
99
+ property: 'fuzzRoughnessMap', index: 'fuzzRoughnessMapIndex',
100
+ target: 'fuzzRoughness', channel: 'a',
101
+ colorSpace: 'linear', operation: 'multiply',
102
+ define: 'NUM_FUZZ_ROUGHNESS_MAPS', feature: 'USE_FUZZ_ROUGHNESS_MAPS', featureBit: 2 ** 19,
103
+ sampling: 'multiply'
104
+ },
105
+ {
106
+ property: 'specularWeightMap', index: 'specularWeightMapIndex',
107
+ target: 'specularWeight', channel: 'a',
108
+ colorSpace: 'linear', operation: 'multiply',
109
+ define: 'NUM_SPECULAR_WEIGHT_MAPS', feature: 'USE_SPECULAR_WEIGHT_MAPS', featureBit: 2 ** 20,
110
+ sampling: 'multiply'
111
+ },
112
+ {
113
+ property: 'specularColorMap', index: 'specularColorMapIndex',
114
+ target: 'specularColor', channel: 'rgb',
115
+ colorSpace: 'srgb', operation: 'multiply',
116
+ define: 'NUM_SPECULAR_COLOR_MAPS', feature: 'USE_SPECULAR_COLOR_MAPS', featureBit: 2 ** 21,
117
+ sampling: 'multiply'
118
+ },
119
+ {
120
+ property: 'anisotropyMap', index: 'anisotropyMapIndex',
121
+ target: 'specularAnisotropy/direction', channel: 'rg/b',
122
+ colorSpace: 'linear', operation: 'custom',
123
+ define: 'NUM_ANISOTROPY_MAPS', feature: 'USE_ANISOTROPY_MAPS', featureBit: 2 ** 22,
124
+ sampling: 'manual'
125
+ },
126
+ {
127
+ property: 'coatNormalMap', index: 'coatNormalMapIndex',
128
+ target: 'coatNormal', channel: 'rgb',
129
+ colorSpace: 'linear', operation: 'custom',
130
+ define: 'NUM_COAT_NORMAL_MAPS', feature: 'USE_COAT_NORMAL_MAPS', featureBit: 2 ** 17,
131
+ sampling: 'manual'
132
+ },
133
+ ];
134
+ const textureNamesMatch = true;
135
+ void textureNamesMatch;
136
+ export const MATERIAL_TEXTURE_SLOTS = slots.map(slot => {
137
+ const field = materialLayoutFields().find(field => field.source === slot.index);
138
+ if (!field)
139
+ throw new Error(`Missing packed texture index: ${slot.property}`);
140
+ return { ...slot, packed: {
141
+ row: field.row, component: field.component, wgslField: field.name,
142
+ glslRow: `MAT_ROW_${MATERIAL_LAYOUT[field.row].name}`,
143
+ glslComponent: 'xyzw'[field.component]
144
+ } };
145
+ });
146
+ export const MATERIAL_TEXTURE_FEATURE_BITS = Object.fromEntries(slots.flatMap(slot => slot.feature
147
+ ? [[slot.feature, slot.featureBit]] : []));
148
+ export const MATERIAL_TEXTURE_DEFINES = slots.flatMap(slot => slot.define ? [slot.define] : []);
149
+ export function materialTextureFeatures(defines) {
150
+ return Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.feature && slot.define
151
+ ? [[slot.feature, +defines[slot.define] > 0]] : []));
152
+ }
153
+ // Call at each original sample site: alpha resolution and combined maps must
154
+ // keep their existing order. The scalar factors use raw linear channels; film ranges resolve explicitly.
155
+ export function simpleTextureSample(property, backend) {
156
+ const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === property);
157
+ if (!slot || slot.sampling !== 'multiply')
158
+ throw new Error(`Handwritten texture slot: ${property}`);
159
+ const index = slot.index;
160
+ const sample = (expression) => slot.colorSpace === 'srgb' ? `decodeMapColor(${index}, ${expression})` : expression;
161
+ if (backend === 'wgsl') {
162
+ return `
163
+ if (${slot.feature}) {
164
+ let ${index} = i32(matData.${slot.packed.wgslField});
165
+ if (${index} >= 0) {
166
+ (*ma).${slot.target} *= ${sample(`sampleMap(
167
+ ${index}, getMapUvSet(${index}, uv, uv1)
168
+ ).${slot.channel}`)};
169
+ }
170
+ }
171
+ `;
172
+ }
173
+ return `
174
+ #ifdef ${slot.define}
175
+ int ${index} = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});
176
+ if (${index} >= 0) {
177
+ mat.${slot.target} *= ${sample(`sampleMap(
178
+ ${index}, getMapUvSet(${index}, uv, uv1)
179
+ ).${slot.channel}`)};
180
+ }
181
+ #endif
182
+ `;
183
+ }
184
+ // Multi-parameter slots retain explicit resolution and their original sample site.
185
+ export function thinFilmTextureSample(backend) {
186
+ const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === 'thinFilmMap');
187
+ if (backend === 'wgsl')
188
+ return `
189
+ if (${slot.feature}) {
190
+ let thinFilmMapIndex = i32(matData.${slot.packed.wgslField});
191
+ if (thinFilmMapIndex >= 0) {
192
+ let filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));
193
+ // Preserve the legacy nm conversion followed by R multiplication exactly.
194
+ if (matData.thinFilmThicknessMinimum == 0.0 && matData.thinFilmMapChannel == 0.0) {
195
+ (*ma).thinFilmThickness *= filmTexel.r;
196
+ } else {
197
+ (*ma).thinFilmThickness = mix(matData.thinFilmThicknessMinimum,
198
+ matData.thinFilmThickness, filmTexel[i32(matData.thinFilmMapChannel)]) * 1000.0;
199
+ }
200
+ }
201
+ }
202
+ `;
203
+ return `
204
+ #ifdef ${slot.define}
205
+ int thinFilmMapIndex = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});
206
+ if (thinFilmMapIndex >= 0) {
207
+ vec4 filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));
208
+ vec4 filmTextureParams = fetchMatData(i + MAT_ROW_FILM_TEXTURE);
209
+ if (filmTextureParams.z == 0.0 && filmTextureParams.w == 0.0) {
210
+ mat.thinFilmThickness *= filmTexel.r;
211
+ } else {
212
+ mat.thinFilmThickness = mix(filmTextureParams.z, misc.b,
213
+ filmTexel[int(filmTextureParams.w)]) * 1000.0;
214
+ }
215
+ }
216
+ #endif
217
+ `;
218
+ }
219
+ //# sourceMappingURL=materialTextureSlots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialTextureSlots.js","sourceRoot":"","sources":["../../src/renderer/materialTextureSlots.ts"],"names":[],"mappings":"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","sourcesContent":["import { MATERIAL_TEXTURE_NAMES, type MaterialTextureName } from '../scene/materialTextureNames.js';\nexport { MATERIAL_TEXTURE_NAMES };\nexport type { MaterialTextureName };\nimport { MATERIAL_LAYOUT, materialLayoutFields } from './materialLayout.js';\n\n// Internal slots only. Order is the legacy atlas/index contract. Color spaces\n// describe decoding at the sample site; textures share the same stored atlas.\nconst slots = [\n {\n property: 'map', index: 'diffuseMapIndex',\n target: 'baseColor/alpha/transmissionWeight', channel: 'rgb/a',\n colorSpace: 'srgb', operation: 'custom',\n define: 'NUM_DIFFUSE_MAPS', feature: 'USE_DIFFUSE_MAPS', featureBit: 2 ** 1,\n sampling: 'manual'\n },\n {\n property: 'alphaMap', index: 'alphaMapIndex',\n target: 'alpha', channel: 'g',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_ALPHA_MAPS', feature: 'USE_ALPHA_MAPS', featureBit: 2 ** 2,\n sampling: 'multiply'\n },\n {\n property: 'normalMap', index: 'normalMapIndex',\n target: 'normal', channel: 'rgb',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_NORMAL_MAPS', feature: 'USE_NORMAL_MAPS', featureBit: 2 ** 9,\n sampling: 'manual'\n },\n {\n property: 'emissiveMap', index: 'emissiveMapIndex',\n target: 'emission', channel: 'rgb',\n colorSpace: 'srgb', operation: 'custom',\n define: 'NUM_EMISSIVE_MAPS', feature: 'USE_EMISSIVE_MAPS', featureBit: 2 ** 7,\n sampling: 'manual'\n },\n {\n property: 'metallicRoughnessMap', index: 'metallicRoughnessMapIndex',\n target: 'baseMetalness/specularRoughness', channel: 'b/g',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_METALLIC_ROUGHNESS_MAPS', feature: 'USE_METALLIC_ROUGHNESS_MAPS', featureBit: 2 ** 3,\n sampling: 'manual'\n },\n {\n property: 'roughnessMap', index: 'roughnessMapIndex',\n target: 'specularRoughness', channel: 'g',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_ROUGHNESS_MAPS', feature: 'USE_ROUGHNESS_MAPS', featureBit: 2 ** 4,\n sampling: 'multiply'\n },\n {\n property: 'metalnessMap', index: 'metalnessMapIndex',\n target: 'baseMetalness', channel: 'b',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_METALNESS_MAPS', feature: 'USE_METALNESS_MAPS', featureBit: 2 ** 5,\n sampling: 'multiply'\n },\n {\n property: 'transmissionMap', index: 'transmissionMapIndex',\n target: 'transmissionWeight', channel: 'r',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_TRANSMISSION_MAPS', feature: 'USE_TRANSMISSION_MAPS', featureBit: 2 ** 6,\n sampling: 'multiply'\n },\n {\n property: 'thinFilmMap', index: 'thinFilmMapIndex',\n target: 'thinFilmThickness', channel: 'per-material',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_THIN_FILM_MAPS', feature: 'USE_THIN_FILM_MAPS', featureBit: 2 ** 8,\n sampling: 'manual'\n },\n {\n property: 'displacementMap', index: 'displacementMapIndex',\n target: 'displacement', channel: 'r',\n colorSpace: 'linear', operation: 'custom',\n define: null, feature: null, featureBit: 0,\n sampling: 'manual'\n },\n {\n property: 'coatWeightMap', index: 'coatWeightMapIndex',\n target: 'coatWeight', channel: 'r',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_COAT_WEIGHT_MAPS', feature: 'USE_COAT_WEIGHT_MAPS', featureBit: 2 ** 15,\n sampling: 'multiply'\n },\n {\n property: 'coatRoughnessMap', index: 'coatRoughnessMapIndex',\n target: 'coatRoughness', channel: 'g',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_COAT_ROUGHNESS_MAPS', feature: 'USE_COAT_ROUGHNESS_MAPS', featureBit: 2 ** 16,\n sampling: 'multiply'\n },\n {\n property: 'fuzzColorMap', index: 'fuzzColorMapIndex',\n target: 'fuzzColor', channel: 'rgb',\n colorSpace: 'srgb', operation: 'multiply',\n define: 'NUM_FUZZ_COLOR_MAPS', feature: 'USE_FUZZ_COLOR_MAPS', featureBit: 2 ** 18,\n sampling: 'multiply'\n },\n {\n property: 'fuzzRoughnessMap', index: 'fuzzRoughnessMapIndex',\n target: 'fuzzRoughness', channel: 'a',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_FUZZ_ROUGHNESS_MAPS', feature: 'USE_FUZZ_ROUGHNESS_MAPS', featureBit: 2 ** 19,\n sampling: 'multiply'\n },\n {\n property: 'specularWeightMap', index: 'specularWeightMapIndex',\n target: 'specularWeight', channel: 'a',\n colorSpace: 'linear', operation: 'multiply',\n define: 'NUM_SPECULAR_WEIGHT_MAPS', feature: 'USE_SPECULAR_WEIGHT_MAPS', featureBit: 2 ** 20,\n sampling: 'multiply'\n },\n {\n property: 'specularColorMap', index: 'specularColorMapIndex',\n target: 'specularColor', channel: 'rgb',\n colorSpace: 'srgb', operation: 'multiply',\n define: 'NUM_SPECULAR_COLOR_MAPS', feature: 'USE_SPECULAR_COLOR_MAPS', featureBit: 2 ** 21,\n sampling: 'multiply'\n },\n {\n property: 'anisotropyMap', index: 'anisotropyMapIndex',\n target: 'specularAnisotropy/direction', channel: 'rg/b',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_ANISOTROPY_MAPS', feature: 'USE_ANISOTROPY_MAPS', featureBit: 2 ** 22,\n sampling: 'manual'\n },\n {\n property: 'coatNormalMap', index: 'coatNormalMapIndex',\n target: 'coatNormal', channel: 'rgb',\n colorSpace: 'linear', operation: 'custom',\n define: 'NUM_COAT_NORMAL_MAPS', feature: 'USE_COAT_NORMAL_MAPS', featureBit: 2 ** 17,\n sampling: 'manual'\n },\n] as const;\n\n// A missing or extra descriptor fails type checking in both directions.\ntype SlotName = typeof slots[number]['property'];\nconst textureNamesMatch: [Exclude<MaterialTextureName, SlotName> | Exclude<SlotName, MaterialTextureName>] extends [never] ? true : never = true;\nvoid textureNamesMatch;\nexport type MaterialTextureIndex = typeof slots[number]['index'];\n\nexport const MATERIAL_TEXTURE_SLOTS = slots.map(slot => {\n const field = materialLayoutFields().find(field => field.source === slot.index);\n if (!field) throw new Error(`Missing packed texture index: ${slot.property}`);\n return { ...slot, packed: {\n row: field.row, component: field.component, wgslField: field.name,\n glslRow: `MAT_ROW_${MATERIAL_LAYOUT[field.row].name}`,\n glslComponent: 'xyzw'[field.component]\n } };\n});\n\nexport const MATERIAL_TEXTURE_FEATURE_BITS = Object.fromEntries(slots.flatMap(slot => slot.feature\n ? [[slot.feature, slot.featureBit]] : []));\nexport const MATERIAL_TEXTURE_DEFINES = slots.flatMap(slot => slot.define ? [slot.define] : []);\n\nexport function materialTextureFeatures(defines: Record<string, string | number>) {\n return Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.feature && slot.define\n ? [[slot.feature, +defines[slot.define] > 0]] : []));\n}\n\n// Call at each original sample site: alpha resolution and combined maps must\n// keep their existing order. The scalar factors use raw linear channels; film ranges resolve explicitly.\nexport function simpleTextureSample(property: MaterialTextureName, backend: 'wgsl' | 'glsl'): string {\n const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === property);\n if (!slot || slot.sampling !== 'multiply') throw new Error(`Handwritten texture slot: ${property}`);\n const index = slot.index;\n const sample = (expression: string) => slot.colorSpace === 'srgb' ? `decodeMapColor(${index}, ${expression})` : expression;\n if (backend === 'wgsl') {\n return `\n if (${slot.feature}) {\n let ${index} = i32(matData.${slot.packed.wgslField});\n if (${index} >= 0) {\n (*ma).${slot.target} *= ${sample(`sampleMap(\n ${index}, getMapUvSet(${index}, uv, uv1)\n ).${slot.channel}`)};\n }\n }\n`;\n }\n return `\n #ifdef ${slot.define}\n int ${index} = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});\n if (${index} >= 0) {\n mat.${slot.target} *= ${sample(`sampleMap(\n ${index}, getMapUvSet(${index}, uv, uv1)\n ).${slot.channel}`)};\n }\n #endif\n`;\n}\n\n// Multi-parameter slots retain explicit resolution and their original sample site.\nexport function thinFilmTextureSample(backend: 'wgsl' | 'glsl'): string {\n const slot = MATERIAL_TEXTURE_SLOTS.find(slot => slot.property === 'thinFilmMap')!;\n if (backend === 'wgsl') return `\n if (${slot.feature}) {\n let thinFilmMapIndex = i32(matData.${slot.packed.wgslField});\n if (thinFilmMapIndex >= 0) {\n let filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));\n // Preserve the legacy nm conversion followed by R multiplication exactly.\n if (matData.thinFilmThicknessMinimum == 0.0 && matData.thinFilmMapChannel == 0.0) {\n (*ma).thinFilmThickness *= filmTexel.r;\n } else {\n (*ma).thinFilmThickness = mix(matData.thinFilmThicknessMinimum,\n matData.thinFilmThickness, filmTexel[i32(matData.thinFilmMapChannel)]) * 1000.0;\n }\n }\n }\n`;\n return `\n #ifdef ${slot.define}\n int thinFilmMapIndex = int(fetchMatData(i + ${slot.packed.glslRow}).${slot.packed.glslComponent});\n if (thinFilmMapIndex >= 0) {\n vec4 filmTexel = sampleMap(thinFilmMapIndex, getMapUvSet(thinFilmMapIndex, uv, uv1));\n vec4 filmTextureParams = fetchMatData(i + MAT_ROW_FILM_TEXTURE);\n if (filmTextureParams.z == 0.0 && filmTextureParams.w == 0.0) {\n mat.thinFilmThickness *= filmTexel.r;\n } else {\n mat.thinFilmThickness = mix(filmTextureParams.z, misc.b,\n filmTexel[int(filmTextureParams.w)]) * 1000.0;\n }\n }\n #endif\n`;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import Geometry from '../scene/Geometry.js';
2
+ import Mesh from '../scene/Mesh.js';
3
+ import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
4
+ export interface InternalMergedMesh {
5
+ geometry: Geometry;
6
+ materials: OpenPBRMaterial[];
7
+ }
8
+ export declare function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh;
@@ -0,0 +1,236 @@
1
+ import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';
2
+ import { writeMaterialIndices } from './materialIndices.js';
3
+ // Portions adapted from ray-tracing-renderer@0.10.15
4
+ // (https://github.com/hoverinc/ray-tracing-renderer).
5
+ // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
6
+ import { mat3, vec3 } from '../math.js';
7
+ import Geometry, { Attribute } from '../scene/Geometry.js';
8
+ import { getMaterialHashKey, resetMaterialTextureId } from '../scene/OpenPBRMaterial.js';
9
+ export function mergeMeshesToGeometry(meshes) {
10
+ let vertexCount = 0;
11
+ let indexCount = 0;
12
+ const geometryAndMaterialIndex = [];
13
+ const materialIndexMap = new Map();
14
+ const materials = [];
15
+ resetMaterialTextureId();
16
+ for (const mesh of meshes) {
17
+ for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {
18
+ let geometry = mesh.geometry;
19
+ const index = geometry.indices;
20
+ if (!index) {
21
+ addFlatGeometryIndices(geometry);
22
+ }
23
+ geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));
24
+ if (!geometry.normal) {
25
+ computeGeometryNormals(geometry);
26
+ }
27
+ else {
28
+ vec3.forEach(geometry.normal.array, 3, 0, undefined, vec3.normalize, undefined);
29
+ }
30
+ vertexCount += Attribute.getCount(geometry.position);
31
+ indexCount += Attribute.getCount(geometry.indices);
32
+ const materialIndices = mesh.materials.map((material) => {
33
+ const key = getMaterialHashKey(material);
34
+ let materialIndex = materialIndexMap.get(key);
35
+ if (materialIndex === undefined) {
36
+ materialIndex = materialIndexMap.size;
37
+ materialIndexMap.set(key, materialIndex);
38
+ materials.push(material);
39
+ }
40
+ return materialIndex;
41
+ });
42
+ geometryAndMaterialIndex.push({
43
+ geometry,
44
+ materialIndex: materialIndices
45
+ });
46
+ }
47
+ }
48
+ const geometry = mergeGeometry(geometryAndMaterialIndex, vertexCount, indexCount);
49
+ return {
50
+ geometry,
51
+ // TODO compress materials. Reuse materials with same props.
52
+ materials
53
+ };
54
+ }
55
+ function mergeGeometry(geometryAndMaterialIndex, totalVertexCount, totalIndexCount) {
56
+ const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
57
+ const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
58
+ const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
59
+ const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
60
+ const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
61
+ const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
62
+ const mergedGeometry = new Geometry({
63
+ position: positionAttrib,
64
+ normal: normalAttrib,
65
+ uv: uvAttrib,
66
+ uv1: uv1Attrib,
67
+ materialIndex: materialIndexAttrib,
68
+ // color: colorAttrib,
69
+ indices: indexAttrib
70
+ });
71
+ let currentVertex = 0;
72
+ let currentIndex = 0;
73
+ let currentMesh = 1;
74
+ for (const { geometry } of geometryAndMaterialIndex) {
75
+ if (geometry.color) {
76
+ mergedGeometry.color = new Attribute(new Float32Array(3 * totalVertexCount), 3);
77
+ break;
78
+ }
79
+ if (geometry.tangent) {
80
+ mergedGeometry.tangent = new Attribute(new Float32Array(3 * totalVertexCount), 3);
81
+ break;
82
+ }
83
+ }
84
+ for (const { geometry, materialIndex: globalMaterialIndex } of geometryAndMaterialIndex) {
85
+ const vertexCount = Attribute.getCount(geometry.position);
86
+ ['position', 'normal', 'uv'].forEach((attr) => {
87
+ if (!geometry[attr]) {
88
+ if (attr == 'normal' || attr === 'position') {
89
+ console.error('Geometry must have at least position and normal attributes.');
90
+ }
91
+ return;
92
+ }
93
+ mergedGeometry[attr].array.set(geometry[attr].array, currentVertex * geometry[attr].itemSize);
94
+ });
95
+ uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
96
+ if (mergedGeometry.color) {
97
+ const itemSize = 3;
98
+ if (geometry.color) {
99
+ mergedGeometry.color.array.set(geometry.color.array, currentVertex * itemSize);
100
+ }
101
+ else {
102
+ // Set to white
103
+ for (let i = 0; i < vertexCount * itemSize; i++) {
104
+ mergedGeometry.color.array[currentVertex * itemSize + i] = 1;
105
+ }
106
+ }
107
+ }
108
+ if (mergedGeometry.tangent) {
109
+ const itemSize = 3;
110
+ if (geometry.tangent) {
111
+ mergedGeometry.tangent.array.set(geometry.tangent.array, currentVertex * itemSize);
112
+ }
113
+ else {
114
+ for (let i = 0; i < vertexCount * itemSize; i++) {
115
+ mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;
116
+ }
117
+ }
118
+ }
119
+ const meshIndices = geometry.indices.array;
120
+ for (let i = 0; i < meshIndices.length; i++) {
121
+ indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];
122
+ }
123
+ writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);
124
+ currentVertex += vertexCount;
125
+ currentIndex += meshIndices.length;
126
+ currentMesh++;
127
+ }
128
+ return mergedGeometry;
129
+ }
130
+ function addFlatGeometryIndices(geometry) {
131
+ const position = geometry.position;
132
+ if (!position) {
133
+ console.warn('No position attribute');
134
+ return;
135
+ }
136
+ const index = new Uint32Array(Attribute.getCount(position));
137
+ for (let i = 0; i < index.length; i++) {
138
+ index[i] = i;
139
+ }
140
+ geometry.indices = new Attribute(index, 1);
141
+ return geometry;
142
+ }
143
+ function transformGeometry(geometry, matrix) {
144
+ const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {
145
+ position: geometry.position.array,
146
+ normal: geometry.normal.array,
147
+ uv: geometry.uv && geometry.uv.array,
148
+ uv1: geometry.uv1 && geometry.uv1.array,
149
+ color: geometry.color && geometry.color.array,
150
+ tangent: geometry.tangent && geometry.tangent.array,
151
+ materialIndex: geometry.materialIndex && geometry.materialIndex.array,
152
+ indices: geometry.indices.array
153
+ };
154
+ const newGeometry = new Geometry({
155
+ position: new Attribute(
156
+ // TODO only copy when necessary
157
+ new Float32Array(position), geometry.position.itemSize),
158
+ normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),
159
+ // No need to clone uv
160
+ uv: uv && new Attribute(uv, geometry.uv.itemSize),
161
+ uv1: uv1 && new Attribute(uv1, geometry.uv1.itemSize),
162
+ color: color && new Attribute(color, geometry.color.itemSize),
163
+ tangent: tangent &&
164
+ new Attribute(new Float32Array(tangent), geometry.tangent.itemSize),
165
+ materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex.itemSize),
166
+ indices: indices && new Attribute(indices, geometry.indices.itemSize)
167
+ });
168
+ // Normal Matrix
169
+ let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);
170
+ if (normalMatrix == null) {
171
+ // If matrix has NaN value. normalMatrix may be null.
172
+ // Create an identity one.
173
+ // TODO remove scale information
174
+ normalMatrix = mat3.create();
175
+ }
176
+ vec3.forEach(newGeometry.position.array, 3, 0, undefined, vec3.transformMat4, matrix);
177
+ if (newGeometry.normal) {
178
+ vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.transformMat3, normalMatrix);
179
+ vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);
180
+ }
181
+ if (newGeometry.tangent) {
182
+ vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.transformMat3, normalMatrix);
183
+ // Try not to normalize the tangent.
184
+ // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.
185
+ // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);
186
+ }
187
+ return newGeometry;
188
+ }
189
+ function computeGeometryNormals(geometry) {
190
+ const indices = geometry.indices;
191
+ const positions = geometry.position.array;
192
+ geometry.normal = new Attribute(new Float32Array(positions.length), 3);
193
+ const normals = geometry.normal.array;
194
+ const p1 = vec3.create();
195
+ const p2 = vec3.create();
196
+ const p3 = vec3.create();
197
+ const v21 = vec3.create();
198
+ const v32 = vec3.create();
199
+ const n = vec3.create();
200
+ const len = indices
201
+ ? indices.array.length
202
+ : geometry.vertexCount;
203
+ let i1, i2, i3;
204
+ for (let f = 0; f < len;) {
205
+ if (indices) {
206
+ i1 = indices.array[f++];
207
+ i2 = indices.array[f++];
208
+ i3 = indices.array[f++];
209
+ }
210
+ else {
211
+ i1 = f++;
212
+ i2 = f++;
213
+ i3 = f++;
214
+ }
215
+ vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
216
+ vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
217
+ vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
218
+ vec3.sub(v21, p1, p2);
219
+ vec3.sub(v32, p2, p3);
220
+ vec3.cross(n, v21, v32);
221
+ // Already be weighted by the triangle area
222
+ for (let i = 0; i < 3; i++) {
223
+ normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
224
+ normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
225
+ normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
226
+ }
227
+ }
228
+ for (let i = 0; i < normals.length;) {
229
+ vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
230
+ vec3.normalize(n, n);
231
+ normals[i++] = n[0];
232
+ normals[i++] = n[1];
233
+ normals[i++] = n[2];
234
+ }
235
+ }
236
+ //# sourceMappingURL=mergeMeshesToGeometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeMeshesToGeometry.js","sourceRoot":"","sources":["../../src/renderer/mergeMeshesToGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { writeMaterialIndices } from './materialIndices.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { mat3, mat4, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, {\n getMaterialHashKey,\n resetMaterialTextureId\n} from '../scene/OpenPBRMaterial.js';\n\nexport interface InternalMergedMesh {\n geometry: Geometry;\n materials: OpenPBRMaterial[];\n}\n\nexport function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh {\n let vertexCount = 0;\n let indexCount = 0;\n\n const geometryAndMaterialIndex = [];\n const materialIndexMap = new Map<string, number>();\n const materials: OpenPBRMaterial[] = [];\n\n resetMaterialTextureId();\n\n for (const mesh of meshes) {\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n let geometry = mesh.geometry;\n\n const index = geometry.indices;\n if (!index) {\n addFlatGeometryIndices(geometry);\n }\n\n geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));\n\n if (!geometry.normal) {\n computeGeometryNormals(geometry);\n } else {\n vec3.forEach(\n geometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.normalize,\n undefined\n );\n }\n\n vertexCount += Attribute.getCount(geometry.position);\n indexCount += Attribute.getCount(geometry.indices);\n\n const materialIndices = mesh.materials.map((material) => {\n const key = getMaterialHashKey(material);\n let materialIndex = materialIndexMap.get(key);\n if (materialIndex === undefined) {\n materialIndex = materialIndexMap.size;\n materialIndexMap.set(key, materialIndex);\n materials.push(material);\n }\n return materialIndex;\n });\n\n geometryAndMaterialIndex.push({\n geometry,\n materialIndex: materialIndices\n });\n }\n }\n\n const geometry = mergeGeometry(\n geometryAndMaterialIndex,\n vertexCount,\n indexCount\n );\n\n return {\n geometry,\n // TODO compress materials. Reuse materials with same props.\n materials\n };\n}\n\nfunction mergeGeometry(\n geometryAndMaterialIndex: {\n geometry: Geometry;\n materialIndex: number[];\n }[],\n totalVertexCount: number,\n totalIndexCount: number\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 const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n // color: colorAttrib,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n let currentMesh = 1;\n\n for (const { geometry } of geometryAndMaterialIndex) {\n if (geometry.color) {\n mergedGeometry.color = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n if (geometry.tangent) {\n mergedGeometry.tangent = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n }\n\n for (const {\n geometry,\n materialIndex: globalMaterialIndex\n } of geometryAndMaterialIndex) {\n const vertexCount = Attribute.getCount(geometry.position);\n\n (['position', 'normal', 'uv'] as const).forEach((attr) => {\n if (!geometry[attr]) {\n if (attr == 'normal' || attr === 'position') {\n console.error(\n 'Geometry must have at least position and normal attributes.'\n );\n }\n return;\n }\n mergedGeometry[attr]!.array.set(\n geometry[attr]!.array,\n currentVertex * geometry[attr]!.itemSize\n );\n });\n\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n\n if (mergedGeometry.color) {\n const itemSize = 3;\n if (geometry.color) {\n mergedGeometry.color.array.set(\n geometry.color.array,\n currentVertex * itemSize\n );\n } else {\n // Set to white\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.color.array[currentVertex * itemSize + i] = 1;\n }\n }\n }\n if (mergedGeometry.tangent) {\n const itemSize = 3;\n if (geometry.tangent) {\n mergedGeometry.tangent.array.set(\n geometry.tangent.array,\n currentVertex * itemSize\n );\n } else {\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;\n }\n }\n }\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);\n\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n currentMesh++;\n }\n\n return mergedGeometry;\n}\n\nfunction addFlatGeometryIndices(geometry: Geometry) {\n const position = geometry.position;\n\n if (!position) {\n console.warn('No position attribute');\n return;\n }\n\n const index = new Uint32Array(Attribute.getCount(position));\n\n for (let i = 0; i < index.length; i++) {\n index[i] = i;\n }\n\n geometry.indices = new Attribute(index, 1);\n\n return geometry;\n}\n\nfunction transformGeometry(geometry: Geometry, matrix: mat4.Mat4Array) {\n const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {\n position: geometry.position.array,\n normal: geometry.normal.array,\n uv: geometry.uv && geometry.uv.array,\n uv1: geometry.uv1 && geometry.uv1.array,\n color: geometry.color && geometry.color.array,\n tangent: geometry.tangent && geometry.tangent.array,\n materialIndex: geometry.materialIndex && geometry.materialIndex.array,\n indices: geometry.indices.array\n };\n const newGeometry = new Geometry({\n position: new Attribute(\n // TODO only copy when necessary\n new Float32Array(position),\n geometry.position.itemSize\n ),\n normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),\n // No need to clone uv\n uv: uv && new Attribute(uv, geometry.uv!.itemSize),\n uv1: uv1 && new Attribute(uv1, geometry.uv1!.itemSize),\n color: color && new Attribute(color, geometry.color!.itemSize),\n tangent:\n tangent &&\n new Attribute(new Float32Array(tangent), geometry.tangent!.itemSize),\n materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex!.itemSize),\n indices: indices && new Attribute(indices, geometry.indices.itemSize)\n });\n\n // Normal Matrix\n let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);\n if (normalMatrix == null) {\n // If matrix has NaN value. normalMatrix may be null.\n // Create an identity one.\n // TODO remove scale information\n normalMatrix = mat3.create();\n }\n\n vec3.forEach(\n newGeometry.position.array,\n 3,\n 0,\n undefined,\n vec3.transformMat4,\n matrix\n );\n\n if (newGeometry.normal) {\n vec3.forEach(\n newGeometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);\n }\n if (newGeometry.tangent) {\n vec3.forEach(\n newGeometry.tangent.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n // Try not to normalize the tangent.\n // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.\n // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);\n }\n return newGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\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.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[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"]}
@@ -0,0 +1,23 @@
1
+ import Mesh from '../scene/Mesh.js';
2
+ import { mat4 } from '../math.js';
3
+ import type { TLASInstance } from './bvhAccel.js';
4
+ export declare function meshInstanceCount(mesh: Mesh): number;
5
+ /** Writes a world matrix without allocating per-instance Mesh objects or views. */
6
+ export declare function meshInstanceTransform(mesh: Mesh, index: number, out: mat4.Mat4Array): mat4.Mat4Array;
7
+ /** CPU instance records in numeric storage; one reusable synchronous read view. */
8
+ export declare class PackedMeshInstances {
9
+ length: number;
10
+ readonly transforms: Float64Array;
11
+ readonly colors: Float32Array;
12
+ readonly bounds: Float32Array;
13
+ readonly blasIndices: Uint32Array;
14
+ readonly materials: Int32Array;
15
+ readonly displacement: Float64Array;
16
+ readonly sourceIndices: Uint32Array;
17
+ private readonly view;
18
+ constructor(capacity: number);
19
+ read(index: number): TLASInstance;
20
+ }
21
+ export type MeshInstances = TLASInstance[] | PackedMeshInstances;
22
+ export declare function readMeshInstance(instances: MeshInstances, index: number): TLASInstance;
23
+ export declare function sameInstanceMembership(a: MeshInstances, b: MeshInstances): boolean;
@@ -0,0 +1,66 @@
1
+ import InstancedMesh from '../scene/InstancedMesh.js';
2
+ import { mat4 } from '../math.js';
3
+ export function meshInstanceCount(mesh) { return mesh instanceof InstancedMesh ? mesh.count : 1; }
4
+ /** Writes a world matrix without allocating per-instance Mesh objects or views. */
5
+ export function meshInstanceTransform(mesh, index, out) {
6
+ if (!(mesh instanceof InstancedMesh))
7
+ return mat4.copy(out, mesh.transform);
8
+ const local = mesh.transforms, offset = index * 16, parent = mesh.transform;
9
+ for (let column = 0; column < 4; column++) {
10
+ const o = offset + column * 4;
11
+ const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];
12
+ for (let row = 0; row < 4; row++)
13
+ out[column * 4 + row] = parent[row] * x + parent[row + 4] * y + parent[row + 8] * z + parent[row + 12] * w;
14
+ }
15
+ return out;
16
+ }
17
+ /** CPU instance records in numeric storage; one reusable synchronous read view. */
18
+ export class PackedMeshInstances {
19
+ length = 0;
20
+ transforms;
21
+ colors;
22
+ bounds;
23
+ blasIndices;
24
+ materials;
25
+ displacement;
26
+ sourceIndices;
27
+ view = { blasIndex: 0, bounds: { min: [0, 0, 0], max: [0, 0, 0] }, transform: Array(16).fill(0), materialsIndices: [0], color: [1, 1, 1] };
28
+ constructor(capacity) {
29
+ this.colors = new Float32Array(capacity * 3);
30
+ this.transforms = new Float64Array(capacity * 16);
31
+ this.bounds = new Float32Array(capacity * 6);
32
+ this.blasIndices = new Uint32Array(capacity);
33
+ this.materials = new Int32Array(capacity);
34
+ this.displacement = new Float64Array(capacity);
35
+ this.sourceIndices = new Uint32Array(capacity);
36
+ }
37
+ read(index) {
38
+ const v = this.view;
39
+ v.blasIndex = this.blasIndices[index];
40
+ v.materialsIndices[0] = this.materials[index];
41
+ v.displacementScale = this.displacement[index];
42
+ for (let i = 0; i < 16; i++)
43
+ v.transform[i] = this.transforms[index * 16 + i];
44
+ for (let i = 0; i < 3; i++)
45
+ v.color[i] = this.colors[index * 3 + i];
46
+ for (let i = 0; i < 3; i++) {
47
+ v.bounds.min[i] = this.bounds[index * 6 + i];
48
+ v.bounds.max[i] = this.bounds[index * 6 + i + 3];
49
+ }
50
+ return v;
51
+ }
52
+ }
53
+ export function readMeshInstance(instances, index) {
54
+ return instances instanceof PackedMeshInstances ? instances.read(index) : instances[index];
55
+ }
56
+ export function sameInstanceMembership(a, b) {
57
+ if (a.length !== b.length)
58
+ return false;
59
+ if (a instanceof PackedMeshInstances && b instanceof PackedMeshInstances) {
60
+ for (let i = 0; i < a.length; i++)
61
+ if (a.sourceIndices[i] !== b.sourceIndices[i])
62
+ return false;
63
+ }
64
+ return true;
65
+ }
66
+ //# sourceMappingURL=meshInstances.js.map