@driftengine/core 4.4.2 → 4.6.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 (339) hide show
  1. package/CHANGELOG.json +97 -0
  2. package/README.md +1 -1
  3. package/dist/geometry/boxCsg.d.ts +28 -0
  4. package/dist/geometry/boxCsg.js +139 -0
  5. package/dist/geometry/csg.d.ts +36 -0
  6. package/dist/geometry/csg.js +329 -0
  7. package/dist/geometry/meshBuilder.js +13 -0
  8. package/dist/geometry/meshConcat.js +1 -0
  9. package/dist/geometry/pixelFont.js +2 -0
  10. package/dist/geometry/solid.d.ts +61 -0
  11. package/dist/geometry/solid.js +152 -0
  12. package/dist/geometry/solidFlat.d.ts +35 -0
  13. package/dist/geometry/solidFlat.js +428 -0
  14. package/dist/geometry/solidHarness.d.ts +19 -0
  15. package/dist/geometry/solidHarness.js +66 -0
  16. package/dist/geometry/solidNormals.d.ts +17 -0
  17. package/dist/geometry/solidNormals.js +86 -0
  18. package/dist/geometry/solidRound.d.ts +41 -0
  19. package/dist/geometry/solidRound.js +323 -0
  20. package/dist/geometry/solidWriter.d.ts +16 -0
  21. package/dist/geometry/solidWriter.js +42 -0
  22. package/dist/index.d.ts +28 -3
  23. package/dist/index.js +20 -1
  24. package/dist/render/backend/api.d.ts +34 -14
  25. package/dist/render/backend/drawFog.d.ts +26 -0
  26. package/dist/render/backend/drawFog.js +30 -0
  27. package/dist/render/backend/materialChanges.d.ts +2 -1
  28. package/dist/render/backend/materialChanges.js +6 -1
  29. package/dist/render/backend/webgl2/glassTintPrograms.d.ts +13 -0
  30. package/dist/render/backend/webgl2/glassTintPrograms.js +38 -0
  31. package/dist/render/backend/webgl2/instanced.d.ts +24 -5
  32. package/dist/render/backend/webgl2/instanced.js +72 -15
  33. package/dist/render/backend/webgl2/renderer.d.ts +201 -16
  34. package/dist/render/backend/webgl2/renderer.js +596 -224
  35. package/dist/render/backend/webgpu/buffers.d.ts +29 -1
  36. package/dist/render/backend/webgpu/buffers.js +61 -4
  37. package/dist/render/backend/webgpu/depthPass.d.ts +1 -1
  38. package/dist/render/backend/webgpu/depthPass.js +7 -2
  39. package/dist/render/backend/webgpu/drawCommand.d.ts +5 -0
  40. package/dist/render/backend/webgpu/drawCommand.js +1 -0
  41. package/dist/render/backend/webgpu/flatPass.d.ts +6 -1
  42. package/dist/render/backend/webgpu/flatPass.js +57 -9
  43. package/dist/render/backend/webgpu/glassTintPass.d.ts +28 -0
  44. package/dist/render/backend/webgpu/glassTintPass.js +206 -0
  45. package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +60 -1
  46. package/dist/render/backend/webgpu/gpuDrivenPass.js +305 -5
  47. package/dist/render/backend/webgpu/instanceCullPass.d.ts +34 -0
  48. package/dist/render/backend/webgpu/instanceCullPass.js +144 -0
  49. package/dist/render/backend/webgpu/instanced.d.ts +23 -2
  50. package/dist/render/backend/webgpu/instanced.js +41 -4
  51. package/dist/render/backend/webgpu/latePass.d.ts +30 -0
  52. package/dist/render/backend/webgpu/latePass.js +140 -0
  53. package/dist/render/backend/webgpu/lightVolumePass.js +5 -1
  54. package/dist/render/backend/webgpu/motionPass.d.ts +95 -0
  55. package/dist/render/backend/webgpu/motionPass.js +491 -0
  56. package/dist/render/backend/webgpu/pipelineCache.d.ts +10 -1
  57. package/dist/render/backend/webgpu/pipelineCache.js +11 -1
  58. package/dist/render/backend/webgpu/pointGlassTintPass.d.ts +32 -0
  59. package/dist/render/backend/webgpu/pointGlassTintPass.js +193 -0
  60. package/dist/render/backend/webgpu/pointShadowPass.d.ts +35 -6
  61. package/dist/render/backend/webgpu/pointShadowPass.js +105 -20
  62. package/dist/render/backend/webgpu/postPass.d.ts +3 -13
  63. package/dist/render/backend/webgpu/renderer.d.ts +271 -64
  64. package/dist/render/backend/webgpu/renderer.js +1395 -580
  65. package/dist/render/backend/webgpu/scatterPass.js +2 -1
  66. package/dist/render/backend/webgpu/sdfTextPass.js +6 -1
  67. package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.d.ts +18 -0
  68. package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.js +59 -0
  69. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +4 -0
  70. package/dist/render/backend/webgpu/skinPaletteRing.js +4 -0
  71. package/dist/render/backend/webgpu/snapshotMips.d.ts +29 -0
  72. package/dist/render/backend/webgpu/snapshotMips.js +52 -0
  73. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +22 -3
  74. package/dist/render/backend/webgpu/surfaceTexturePass.js +78 -39
  75. package/dist/render/driftLight/bake.d.ts +7 -0
  76. package/dist/render/driftLight/bake.js +61 -56
  77. package/dist/render/driftLight/denseField.d.ts +46 -0
  78. package/dist/render/driftLight/denseField.js +109 -0
  79. package/dist/render/driftLight/lightField.d.ts +10 -5
  80. package/dist/render/driftLight/lightField.js +25 -19
  81. package/dist/render/driftLight/presence.d.ts +50 -0
  82. package/dist/render/driftLight/presence.js +43 -0
  83. package/dist/render/driftLight/uniforms.d.ts +3 -3
  84. package/dist/render/driftLight/uniforms.js +5 -6
  85. package/dist/render/driftLight/worldLightField.d.ts +41 -0
  86. package/dist/render/driftLight/worldLightField.js +66 -0
  87. package/dist/render/fixtureAtlas.d.ts +20 -0
  88. package/dist/render/fixtureAtlas.js +49 -0
  89. package/dist/render/glass.d.ts +45 -0
  90. package/dist/render/glass.js +39 -0
  91. package/dist/render/glassCasters.d.ts +40 -0
  92. package/dist/render/glassCasters.js +84 -0
  93. package/dist/render/glassShadow.d.ts +78 -0
  94. package/dist/render/glassShadow.js +125 -0
  95. package/dist/render/globalMediumPass.d.ts +2 -3
  96. package/dist/render/globalMediumPass.js +2 -8
  97. package/dist/render/gpudriven/lit.d.ts +12 -0
  98. package/dist/render/gpudriven/lit.js +23 -0
  99. package/dist/render/gpudriven/materialTable.d.ts +15 -5
  100. package/dist/render/gpudriven/materialTable.js +26 -6
  101. package/dist/render/gpudriven/pipeline.d.ts +1 -1
  102. package/dist/render/gpudriven/pipeline.js +4 -3
  103. package/dist/render/gpudriven/sunGlass.d.ts +35 -0
  104. package/dist/render/gpudriven/sunGlass.js +89 -0
  105. package/dist/render/instanceCull.d.ts +63 -0
  106. package/dist/render/instanceCull.js +160 -0
  107. package/dist/render/instances.d.ts +15 -0
  108. package/dist/render/lightBudget.d.ts +36 -35
  109. package/dist/render/lightBudget.js +38 -37
  110. package/dist/render/lightGrid.d.ts +42 -0
  111. package/dist/render/lightGrid.js +87 -0
  112. package/dist/render/mesh.d.ts +18 -24
  113. package/dist/render/mesh.js +51 -68
  114. package/dist/render/occlusion.d.ts +10 -0
  115. package/dist/render/occlusion.js +36 -7
  116. package/dist/render/pointGlassTint.d.ts +59 -0
  117. package/dist/render/pointGlassTint.js +198 -0
  118. package/dist/render/pointLightSelection.d.ts +7 -0
  119. package/dist/render/pointLightSelection.js +29 -4
  120. package/dist/render/pointShadowArray.d.ts +56 -3
  121. package/dist/render/pointShadowArray.js +127 -16
  122. package/dist/render/pointShadowMap.d.ts +23 -1
  123. package/dist/render/pointShadowMap.js +27 -1
  124. package/dist/render/rainField.d.ts +13 -0
  125. package/dist/render/rainField.js +27 -5
  126. package/dist/render/recon/changeFrames.d.ts +15 -0
  127. package/dist/render/recon/changeFrames.js +21 -0
  128. package/dist/render/recon/lateDepth.d.ts +11 -0
  129. package/dist/render/recon/lateDepth.js +70 -0
  130. package/dist/render/recon/lateRouting.d.ts +14 -0
  131. package/dist/render/recon/lateRouting.js +18 -0
  132. package/dist/render/recon/mover.d.ts +57 -0
  133. package/dist/render/recon/mover.js +86 -0
  134. package/dist/render/recon/resolve.d.ts +34 -4
  135. package/dist/render/recon/resolve.js +161 -20
  136. package/dist/render/renderQuality.d.ts +35 -0
  137. package/dist/render/renderQuality.js +7 -0
  138. package/dist/render/rendererHarness.js +16 -0
  139. package/dist/render/sceneTarget.d.ts +9 -1
  140. package/dist/render/sceneTarget.js +60 -12
  141. package/dist/render/shaders/depth.d.ts +16 -1
  142. package/dist/render/shaders/depth.js +94 -15
  143. package/dist/render/shaders/flat/directionalShadow.js +91 -6
  144. package/dist/render/shaders/flat/driftLight.d.ts +1 -1
  145. package/dist/render/shaders/flat/driftLight.js +32 -7
  146. package/dist/render/shaders/flat/glassTint.d.ts +6 -0
  147. package/dist/render/shaders/flat/glassTint.js +25 -0
  148. package/dist/render/shaders/flat/index.d.ts +13 -0
  149. package/dist/render/shaders/flat/index.js +9 -3
  150. package/dist/render/shaders/flat/lampGlass.d.ts +1 -0
  151. package/dist/render/shaders/flat/lampGlass.js +183 -0
  152. package/dist/render/shaders/flat/main.d.ts +1 -1
  153. package/dist/render/shaders/flat/main.js +190 -38
  154. package/dist/render/shaders/flat/pointShadow.d.ts +1 -1
  155. package/dist/render/shaders/flat/pointShadow.js +2 -0
  156. package/dist/render/shaders/flat/preamble.js +96 -26
  157. package/dist/render/shaders/flat/surfaceEffects.d.ts +29 -0
  158. package/dist/render/shaders/flat/surfaceEffects.js +152 -0
  159. package/dist/render/shaders/generated/depth.wgsl.d.ts +230 -7
  160. package/dist/render/shaders/generated/depth.wgsl.js +230 -7
  161. package/dist/render/shaders/generated/flat.wgsl.d.ts +1644 -1596
  162. package/dist/render/shaders/generated/flat.wgsl.js +1683 -1621
  163. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +3 -13
  164. package/dist/render/shaders/generated/globalMedium.wgsl.js +3 -13
  165. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +3 -13
  166. package/dist/render/shaders/generated/lightVolume.wgsl.js +21 -17
  167. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +29 -0
  168. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +29 -0
  169. package/dist/render/shaders/generated/rush.wgsl.d.ts +21 -16
  170. package/dist/render/shaders/generated/rush.wgsl.js +21 -16
  171. package/dist/render/shaders/generated/sdfText.wgsl.d.ts +2 -2
  172. package/dist/render/shaders/generated/sdfText.wgsl.js +2 -2
  173. package/dist/render/shaders/generated/text.wgsl.d.ts +1 -1
  174. package/dist/render/shaders/generated/text.wgsl.js +1 -1
  175. package/dist/render/shaders/gi/driftLight.wgsl.d.ts +1 -1
  176. package/dist/render/shaders/gi/driftLight.wgsl.js +27 -4
  177. package/dist/render/shaders/globalMedium.js +6 -6
  178. package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +7 -0
  179. package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +86 -1
  180. package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +1 -1
  181. package/dist/render/shaders/gpudriven/cull.wgsl.js +11 -2
  182. package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +1 -1
  183. package/dist/render/shaders/gpudriven/materialTable.wgsl.js +3 -1
  184. package/dist/render/shaders/gpudriven/shade.wgsl.js +50 -1
  185. package/dist/render/shaders/gpudriven/sunGlass.wgsl.d.ts +9 -0
  186. package/dist/render/shaders/gpudriven/sunGlass.wgsl.js +133 -0
  187. package/dist/render/shaders/lightVolume.js +6 -6
  188. package/dist/render/shaders/octahedralResolve.d.ts +8 -0
  189. package/dist/render/shaders/octahedralResolve.js +48 -17
  190. package/dist/render/shaders/recon/lateDepth.wgsl.d.ts +1 -0
  191. package/dist/render/shaders/recon/lateDepth.wgsl.js +69 -0
  192. package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
  193. package/dist/render/shaders/recon/motion.wgsl.js +84 -0
  194. package/dist/render/shaders/recon/resolve.wgsl.d.ts +8 -7
  195. package/dist/render/shaders/recon/resolve.wgsl.js +161 -27
  196. package/dist/render/shaders/rush.js +11 -1
  197. package/dist/render/shaders/sdfText.d.ts +1 -1
  198. package/dist/render/shaders/sdfText.js +3 -2
  199. package/dist/render/shaders/text.d.ts +1 -1
  200. package/dist/render/shaders/text.js +18 -9
  201. package/dist/render/shadowCasters.d.ts +20 -1
  202. package/dist/render/shadowCasters.js +15 -1
  203. package/dist/render/shadowMap.d.ts +54 -5
  204. package/dist/render/shadowMap.js +190 -36
  205. package/dist/render/sunGlassTint.d.ts +25 -0
  206. package/dist/render/sunGlassTint.js +79 -0
  207. package/dist/render/surfaceEffects.d.ts +83 -0
  208. package/dist/render/surfaceEffects.js +75 -0
  209. package/dist/render/surfaceScene.d.ts +8 -0
  210. package/dist/render/surfaceScene.js +8 -0
  211. package/dist/render/surfaceTexture.d.ts +18 -2
  212. package/dist/render/surfaceTexture.js +68 -15
  213. package/dist/render/temporalAa.d.ts +25 -6
  214. package/dist/render/temporalAa.js +45 -15
  215. package/dist/render/textureSource.d.ts +30 -0
  216. package/dist/render/textureSource.js +53 -0
  217. package/dist/render/translucentQueue.d.ts +6 -0
  218. package/dist/render/translucentQueue.js +15 -1
  219. package/dist/render/vertexDefaults.js +2 -0
  220. package/dist/world/hlod.d.ts +104 -0
  221. package/dist/world/hlod.js +214 -0
  222. package/package.json +6 -6
  223. package/src/geometry/boxCsg.ts +186 -0
  224. package/src/geometry/csg.ts +384 -0
  225. package/src/geometry/meshBuilder.ts +15 -0
  226. package/src/geometry/meshConcat.ts +1 -0
  227. package/src/geometry/pixelFont.ts +2 -0
  228. package/src/geometry/solid.ts +189 -0
  229. package/src/geometry/solidFlat.ts +522 -0
  230. package/src/geometry/solidHarness.ts +83 -0
  231. package/src/geometry/solidNormals.ts +103 -0
  232. package/src/geometry/solidRound.ts +443 -0
  233. package/src/geometry/solidWriter.ts +58 -0
  234. package/src/index.ts +61 -1
  235. package/src/render/backend/api.ts +36 -11
  236. package/src/render/backend/drawFog.ts +31 -0
  237. package/src/render/backend/materialChanges.ts +9 -2
  238. package/src/render/backend/webgl2/glassTintPrograms.ts +58 -0
  239. package/src/render/backend/webgl2/instanced.ts +80 -14
  240. package/src/render/backend/webgl2/renderer.ts +700 -250
  241. package/src/render/backend/webgpu/buffers.ts +92 -5
  242. package/src/render/backend/webgpu/depthPass.ts +7 -2
  243. package/src/render/backend/webgpu/drawCommand.ts +6 -0
  244. package/src/render/backend/webgpu/flatPass.ts +62 -11
  245. package/src/render/backend/webgpu/glassTintPass.ts +245 -0
  246. package/src/render/backend/webgpu/gpuDrivenPass.ts +349 -5
  247. package/src/render/backend/webgpu/instanceCullPass.ts +165 -0
  248. package/src/render/backend/webgpu/instanced.ts +42 -4
  249. package/src/render/backend/webgpu/latePass.ts +161 -0
  250. package/src/render/backend/webgpu/lightVolumePass.ts +5 -1
  251. package/src/render/backend/webgpu/motionPass.ts +535 -0
  252. package/src/render/backend/webgpu/pipelineCache.ts +12 -1
  253. package/src/render/backend/webgpu/pointGlassTintPass.ts +233 -0
  254. package/src/render/backend/webgpu/pointShadowPass.ts +158 -26
  255. package/src/render/backend/webgpu/renderer.ts +1671 -670
  256. package/src/render/backend/webgpu/scatterPass.ts +2 -1
  257. package/src/render/backend/webgpu/sdfTextPass.ts +6 -1
  258. package/src/render/backend/webgpu/shaders/instanceCull.wgsl.ts +61 -0
  259. package/src/render/backend/webgpu/skinPaletteRing.ts +4 -0
  260. package/src/render/backend/webgpu/snapshotMips.ts +80 -0
  261. package/src/render/backend/webgpu/surfaceTexturePass.ts +91 -51
  262. package/src/render/driftLight/bake.ts +85 -62
  263. package/src/render/driftLight/denseField.ts +149 -0
  264. package/src/render/driftLight/lightField.ts +33 -18
  265. package/src/render/driftLight/presence.ts +69 -0
  266. package/src/render/driftLight/uniforms.ts +8 -9
  267. package/src/render/driftLight/worldLightField.ts +83 -0
  268. package/src/render/fixtureAtlas.ts +63 -0
  269. package/src/render/glass.ts +74 -0
  270. package/src/render/glassCasters.ts +164 -0
  271. package/src/render/glassShadow.ts +153 -0
  272. package/src/render/globalMediumPass.ts +4 -11
  273. package/src/render/gpudriven/lit.ts +31 -0
  274. package/src/render/gpudriven/materialTable.ts +28 -6
  275. package/src/render/gpudriven/pipeline.ts +4 -3
  276. package/src/render/gpudriven/sunGlass.ts +117 -0
  277. package/src/render/instanceCull.ts +205 -0
  278. package/src/render/instances.ts +16 -0
  279. package/src/render/lightBudget.ts +41 -38
  280. package/src/render/lightGrid.ts +130 -0
  281. package/src/render/mesh.ts +59 -72
  282. package/src/render/occlusion.ts +51 -7
  283. package/src/render/pointGlassTint.ts +250 -0
  284. package/src/render/pointLightSelection.ts +72 -4
  285. package/src/render/pointShadowArray.ts +188 -22
  286. package/src/render/pointShadowMap.ts +41 -0
  287. package/src/render/rainField.ts +39 -5
  288. package/src/render/recon/changeFrames.ts +24 -0
  289. package/src/render/recon/lateDepth.ts +83 -0
  290. package/src/render/recon/lateRouting.ts +29 -0
  291. package/src/render/recon/mover.ts +118 -0
  292. package/src/render/recon/resolve.ts +206 -20
  293. package/src/render/renderQuality.ts +47 -0
  294. package/src/render/rendererHarness.ts +16 -0
  295. package/src/render/sceneTarget.ts +62 -11
  296. package/src/render/shaders/depth.ts +118 -15
  297. package/src/render/shaders/flat/directionalShadow.ts +97 -6
  298. package/src/render/shaders/flat/driftLight.ts +32 -7
  299. package/src/render/shaders/flat/glassTint.ts +25 -0
  300. package/src/render/shaders/flat/index.ts +22 -3
  301. package/src/render/shaders/flat/lampGlass.ts +185 -0
  302. package/src/render/shaders/flat/main.ts +190 -38
  303. package/src/render/shaders/flat/pointShadow.ts +2 -0
  304. package/src/render/shaders/flat/preamble.ts +96 -26
  305. package/src/render/shaders/flat/surfaceEffects.ts +152 -0
  306. package/src/render/shaders/generated/depth.wgsl.ts +237 -7
  307. package/src/render/shaders/generated/flat.wgsl.ts +1685 -1621
  308. package/src/render/shaders/generated/globalMedium.wgsl.ts +3 -13
  309. package/src/render/shaders/generated/lightVolume.wgsl.ts +23 -17
  310. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +30 -0
  311. package/src/render/shaders/generated/rush.wgsl.ts +21 -16
  312. package/src/render/shaders/generated/sdfText.wgsl.ts +2 -2
  313. package/src/render/shaders/generated/text.wgsl.ts +1 -1
  314. package/src/render/shaders/gi/driftLight.wgsl.ts +27 -4
  315. package/src/render/shaders/globalMedium.ts +6 -6
  316. package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +88 -1
  317. package/src/render/shaders/gpudriven/cull.wgsl.ts +11 -2
  318. package/src/render/shaders/gpudriven/materialTable.wgsl.ts +3 -1
  319. package/src/render/shaders/gpudriven/shade.wgsl.ts +50 -1
  320. package/src/render/shaders/gpudriven/sunGlass.wgsl.ts +139 -0
  321. package/src/render/shaders/lightVolume.ts +6 -6
  322. package/src/render/shaders/octahedralResolve.ts +50 -17
  323. package/src/render/shaders/recon/lateDepth.wgsl.ts +72 -0
  324. package/src/render/shaders/recon/motion.wgsl.ts +84 -0
  325. package/src/render/shaders/recon/resolve.wgsl.ts +161 -27
  326. package/src/render/shaders/rush.ts +11 -1
  327. package/src/render/shaders/sdfText.ts +3 -2
  328. package/src/render/shaders/text.ts +18 -9
  329. package/src/render/shadowCasters.ts +28 -1
  330. package/src/render/shadowMap.ts +231 -37
  331. package/src/render/sunGlassTint.ts +86 -0
  332. package/src/render/surfaceEffects.ts +132 -0
  333. package/src/render/surfaceScene.ts +16 -0
  334. package/src/render/surfaceTexture.ts +110 -19
  335. package/src/render/temporalAa.ts +78 -14
  336. package/src/render/textureSource.ts +72 -0
  337. package/src/render/translucentQueue.ts +20 -1
  338. package/src/render/vertexDefaults.ts +2 -0
  339. package/src/world/hlod.ts +290 -0
@@ -109,6 +109,7 @@ export class MeshBuilder {
109
109
  * inverse transpose, and nothing here has wanted that yet.
110
110
  */
111
111
  addMesh(mesh, x, y, z, scale = 1) {
112
+ refuseLayers(mesh);
112
113
  const base = this.vertexCount;
113
114
  const count = mesh.positions.length / 3;
114
115
  for (let i = 0; i < count; i++) {
@@ -157,6 +158,7 @@ export class MeshBuilder {
157
158
  * @param scale uniform, applied in the local frame before the basis.
158
159
  */
159
160
  addOrientedMesh(mesh, origin, right, up, forward, scale = 1) {
161
+ refuseLayers(mesh);
160
162
  assertOrthonormal(right, up, forward);
161
163
  const base = this.vertexCount;
162
164
  const count = mesh.positions.length / 3;
@@ -1186,3 +1188,14 @@ const CORNERS = [
1186
1188
  [1, 1],
1187
1189
  [-1, 1],
1188
1190
  ];
1191
+ /**
1192
+ * A builder has no layer channel, so merging a layered mesh would keep its texture coordinates and
1193
+ * silently put every face on layer 0 — the first image of the array, which reads as the wrong
1194
+ * facade everywhere rather than as an error. Refused instead; `concatMeshes` joins layered meshes.
1195
+ */
1196
+ function refuseLayers(mesh) {
1197
+ if (mesh.layers === undefined)
1198
+ return;
1199
+ throw new Error('MeshBuilder: this mesh names texture-array layers, which a builder does not carry — merging ' +
1200
+ 'it here would put every face on layer 0. Join layered meshes with concatMeshes instead.');
1201
+ }
@@ -26,6 +26,7 @@ const OPTIONAL = [
26
26
  ['channel', 4],
27
27
  ['joints', 4],
28
28
  ['weights', 4],
29
+ ['layers', 1],
29
30
  ];
30
31
  /**
31
32
  * `mesh` scaled uniformly and then moved by `x, y, z`. The same object when the fit is the
@@ -66,6 +66,8 @@ const GLYPHS = {
66
66
  "'": [0b00100, 0b00100, 0, 0, 0, 0, 0],
67
67
  '(': [0b00010, 0b00100, 0b01000, 0b01000, 0b01000, 0b00100, 0b00010],
68
68
  ')': [0b01000, 0b00100, 0b00010, 0b00010, 0b00010, 0b00100, 0b01000],
69
+ '[': [0b01110, 0b01000, 0b01000, 0b01000, 0b01000, 0b01000, 0b01110],
70
+ ']': [0b01110, 0b00010, 0b00010, 0b00010, 0b00010, 0b00010, 0b01110],
69
71
  '%': [0b11001, 0b11010, 0b00010, 0b00100, 0b01000, 0b01011, 0b10011],
70
72
  '·': [0, 0, 0, 0b01100, 0b01100, 0, 0],
71
73
  '×': [0, 0b10001, 0b01010, 0b00100, 0b01010, 0b10001, 0],
@@ -0,0 +1,61 @@
1
+ /**
2
+ * A solid: an indexed triangle surface with normals and texture coordinates, and the operations
3
+ * every procedural builder needs on one — place it, join several, measure it, and hand it to the
4
+ * renderer as a mesh.
5
+ *
6
+ * **Why a type of its own rather than `MeshData`.** A mesh carries a dozen per-vertex channels a
7
+ * renderer reads (colour, emissive, roughness, grain, joints…) and a solid is what exists before any
8
+ * of them are decided: shape alone. Booleans, smoothing and transforms are defined on shape, and
9
+ * dragging eleven channels through a boolean would mean deciding how each one interpolates across a
10
+ * cut. The caller paints a finished solid once, with `solidToMesh` or its own writer.
11
+ *
12
+ * **Named `Solid` because `*Shape` is taken**: the physics colliders the core barrel re-exports are
13
+ * `boxShape`, `cylinderShape` and the rest, and a second meaning for the word would read as the
14
+ * same thing. Every primitive here is closed except `solidQuad`, a single-sided plane.
15
+ *
16
+ * Built at load or bake time, never per frame, so these functions allocate their results.
17
+ */
18
+ import type { MeshData } from '../render/mesh.ts';
19
+ import type { Vec3 } from '../math/color.ts';
20
+ export interface Solid {
21
+ /** Three floats a vertex. */
22
+ readonly positions: Float32Array;
23
+ /** Three floats a vertex, unit length, outward. */
24
+ readonly normals: Float32Array;
25
+ /**
26
+ * Two floats a vertex, parametric: 0..1 across each face of a box, around and along a round
27
+ * primitive. Tiling in metres is the caller's, who knows the sizes.
28
+ */
29
+ readonly uvs: Float32Array;
30
+ /** Counter-clockwise triangles seen from outside. */
31
+ readonly indices: Uint32Array;
32
+ }
33
+ export declare function emptySolid(): Solid;
34
+ /**
35
+ * `solid` moved by a column-major 4×4 model matrix.
36
+ *
37
+ * **Normals go through the inverse transpose of the upper 3×3**, then are renormalised. Rotating
38
+ * them by the matrix itself is right only for rotations and uniform scales; under a non-uniform one
39
+ * — a unit cylinder scaled to a post, a sphere to an ellipsoid — it leaves every normal leaning
40
+ * toward the stretched axis, and the surface is lit as if it faced somewhere else, which reads as a
41
+ * shading bug rather than a maths one.
42
+ *
43
+ * **A mirror reverses the winding**, because a negative determinant turns every triangle inside
44
+ * out; without the reversal a mirrored solid is culled from outside and its volume goes negative.
45
+ */
46
+ export declare function transformSolid(solid: Solid, model: ArrayLike<number>): Solid;
47
+ /** Several solids as one, each one's indices offset past the vertices before it. */
48
+ export declare function mergeSolids(solids: readonly Solid[]): Solid;
49
+ /**
50
+ * The enclosed volume by the divergence theorem: the sum of each triangle's signed tetrahedron
51
+ * with the origin. Positive for a closed, outward-wound solid; meaningless for an open one.
52
+ *
53
+ * Exact for any closed surface, T-junctions included, which is why the CSG tests can use it on a
54
+ * boolean's output where an edge-pairing check cannot.
55
+ */
56
+ export declare function solidVolume(solid: Solid): number;
57
+ /**
58
+ * A solid painted one colour, as a mesh the renderer draws. `emissive` is the usual scalar: the
59
+ * surface's own colour scaled, gated by the environment's night factor like every emissive.
60
+ */
61
+ export declare function solidToMesh(solid: Solid, color: Vec3, emissive?: number): MeshData;
@@ -0,0 +1,152 @@
1
+ export function emptySolid() {
2
+ return {
3
+ positions: new Float32Array(0),
4
+ normals: new Float32Array(0),
5
+ uvs: new Float32Array(0),
6
+ indices: new Uint32Array(0),
7
+ };
8
+ }
9
+ /**
10
+ * `solid` moved by a column-major 4×4 model matrix.
11
+ *
12
+ * **Normals go through the inverse transpose of the upper 3×3**, then are renormalised. Rotating
13
+ * them by the matrix itself is right only for rotations and uniform scales; under a non-uniform one
14
+ * — a unit cylinder scaled to a post, a sphere to an ellipsoid — it leaves every normal leaning
15
+ * toward the stretched axis, and the surface is lit as if it faced somewhere else, which reads as a
16
+ * shading bug rather than a maths one.
17
+ *
18
+ * **A mirror reverses the winding**, because a negative determinant turns every triangle inside
19
+ * out; without the reversal a mirrored solid is culled from outside and its volume goes negative.
20
+ */
21
+ export function transformSolid(solid, model) {
22
+ const m = (i) => model[i] ?? 0;
23
+ const a = m(0);
24
+ const b = m(4);
25
+ const c = m(8);
26
+ const d = m(1);
27
+ const e = m(5);
28
+ const f = m(9);
29
+ const g = m(2);
30
+ const h = m(6);
31
+ const k = m(10);
32
+ /* Cofactors of the upper 3×3 in row-major (a b c / d e f / g h k): the inverse transpose up to
33
+ the determinant's scale, which renormalising removes — except its sign, kept below. */
34
+ const c00 = e * k - f * h;
35
+ const c01 = f * g - d * k;
36
+ const c02 = d * h - e * g;
37
+ const c10 = c * h - b * k;
38
+ const c11 = a * k - c * g;
39
+ const c12 = b * g - a * h;
40
+ const c20 = b * f - c * e;
41
+ const c21 = c * d - a * f;
42
+ const c22 = a * e - b * d;
43
+ const det = a * c00 + b * c01 + c * c02;
44
+ const sign = det < 0 ? -1 : 1;
45
+ const count = solid.positions.length / 3;
46
+ const positions = new Float32Array(count * 3);
47
+ const normals = new Float32Array(count * 3);
48
+ for (let v = 0; v < count; v++) {
49
+ const x = solid.positions[v * 3] ?? 0;
50
+ const y = solid.positions[v * 3 + 1] ?? 0;
51
+ const z = solid.positions[v * 3 + 2] ?? 0;
52
+ positions[v * 3] = a * x + b * y + c * z + m(12);
53
+ positions[v * 3 + 1] = d * x + e * y + f * z + m(13);
54
+ positions[v * 3 + 2] = g * x + h * y + k * z + m(14);
55
+ const nx = solid.normals[v * 3] ?? 0;
56
+ const ny = solid.normals[v * 3 + 1] ?? 0;
57
+ const nz = solid.normals[v * 3 + 2] ?? 0;
58
+ const tx = (c00 * nx + c01 * ny + c02 * nz) * sign;
59
+ const ty = (c10 * nx + c11 * ny + c12 * nz) * sign;
60
+ const tz = (c20 * nx + c21 * ny + c22 * nz) * sign;
61
+ const len = Math.hypot(tx, ty, tz) || 1;
62
+ normals[v * 3] = tx / len;
63
+ normals[v * 3 + 1] = ty / len;
64
+ normals[v * 3 + 2] = tz / len;
65
+ }
66
+ let indices = solid.indices;
67
+ if (det < 0) {
68
+ indices = new Uint32Array(solid.indices.length);
69
+ for (let t = 0; t < indices.length; t += 3) {
70
+ indices[t] = solid.indices[t] ?? 0;
71
+ indices[t + 1] = solid.indices[t + 2] ?? 0;
72
+ indices[t + 2] = solid.indices[t + 1] ?? 0;
73
+ }
74
+ }
75
+ return { positions, normals, uvs: solid.uvs, indices };
76
+ }
77
+ /** Several solids as one, each one's indices offset past the vertices before it. */
78
+ export function mergeSolids(solids) {
79
+ if (solids.length === 1 && solids[0] !== undefined)
80
+ return solids[0];
81
+ let vertices = 0;
82
+ let triangles = 0;
83
+ for (const s of solids) {
84
+ vertices += s.positions.length / 3;
85
+ triangles += s.indices.length;
86
+ }
87
+ const positions = new Float32Array(vertices * 3);
88
+ const normals = new Float32Array(vertices * 3);
89
+ const uvs = new Float32Array(vertices * 2);
90
+ const indices = new Uint32Array(triangles);
91
+ let v = 0;
92
+ let t = 0;
93
+ for (const s of solids) {
94
+ positions.set(s.positions, v * 3);
95
+ normals.set(s.normals, v * 3);
96
+ uvs.set(s.uvs, v * 2);
97
+ for (let i = 0; i < s.indices.length; i++)
98
+ indices[t + i] = (s.indices[i] ?? 0) + v;
99
+ v += s.positions.length / 3;
100
+ t += s.indices.length;
101
+ }
102
+ return { positions, normals, uvs, indices };
103
+ }
104
+ /**
105
+ * The enclosed volume by the divergence theorem: the sum of each triangle's signed tetrahedron
106
+ * with the origin. Positive for a closed, outward-wound solid; meaningless for an open one.
107
+ *
108
+ * Exact for any closed surface, T-junctions included, which is why the CSG tests can use it on a
109
+ * boolean's output where an edge-pairing check cannot.
110
+ */
111
+ export function solidVolume(solid) {
112
+ const p = solid.positions;
113
+ const idx = solid.indices;
114
+ let sum = 0;
115
+ for (let t = 0; t < idx.length; t += 3) {
116
+ const a = (idx[t] ?? 0) * 3;
117
+ const b = (idx[t + 1] ?? 0) * 3;
118
+ const c = (idx[t + 2] ?? 0) * 3;
119
+ const ax = p[a] ?? 0;
120
+ const ay = p[a + 1] ?? 0;
121
+ const az = p[a + 2] ?? 0;
122
+ const bx = p[b] ?? 0;
123
+ const by = p[b + 1] ?? 0;
124
+ const bz = p[b + 2] ?? 0;
125
+ const cx = p[c] ?? 0;
126
+ const cy = p[c + 1] ?? 0;
127
+ const cz = p[c + 2] ?? 0;
128
+ sum += ax * (by * cz - bz * cy) - ay * (bx * cz - bz * cx) + az * (bx * cy - by * cx);
129
+ }
130
+ return sum / 6;
131
+ }
132
+ /**
133
+ * A solid painted one colour, as a mesh the renderer draws. `emissive` is the usual scalar: the
134
+ * surface's own colour scaled, gated by the environment's night factor like every emissive.
135
+ */
136
+ export function solidToMesh(solid, color, emissive = 0) {
137
+ const count = solid.positions.length / 3;
138
+ const colors = new Float32Array(count * 3);
139
+ for (let v = 0; v < count; v++) {
140
+ colors[v * 3] = color[0];
141
+ colors[v * 3 + 1] = color[1];
142
+ colors[v * 3 + 2] = color[2];
143
+ }
144
+ return {
145
+ positions: solid.positions,
146
+ normals: solid.normals,
147
+ colors,
148
+ emissive: new Float32Array(count).fill(emissive),
149
+ uvs: solid.uvs,
150
+ indices: solid.indices,
151
+ };
152
+ }
@@ -0,0 +1,35 @@
1
+ import type { Solid } from './solid.ts';
2
+ import type { Vec3 } from '../math/color.ts';
3
+ /** A box of full extents `x, y, z`, faceted: four vertices a face, texture 0..1 across each. */
4
+ export declare function solidBox(x: number, y: number, z: number): Solid;
5
+ /** A single-sided plane of `x` by `y` in XY, facing +Z. The one open solid. */
6
+ export declare function solidQuad(x: number, y: number): Solid;
7
+ /**
8
+ * A box of full extents with every edge rounded to `radius`, `segments` steps per rounded band.
9
+ *
10
+ * Built as a Minkowski sum: each face is a grid whose points are pushed out from the inner box —
11
+ * the box shrunk by the radius — along the direction from their clamped inner point. Grid lines
12
+ * fall on the inner box's edges exactly, so the flat middle of each face is one quad and adjacent
13
+ * faces meet on identical seams.
14
+ */
15
+ export declare function solidRoundedBox(x: number, y: number, z: number, radius: number, segments: number): Solid;
16
+ /**
17
+ * A triangular prism: the section in XY — base `x` wide at −y/2, apex at +y/2 — extruded `z` along
18
+ * Z, centred. `right` puts the apex over the base's left end, a right angle there.
19
+ */
20
+ export declare function solidPrism(x: number, y: number, z: number, right?: boolean): Solid;
21
+ /**
22
+ * A polygon in XZ (`x, z` pairs, either winding, convex or not) extruded along +Y from 0 to
23
+ * `height`, or centred on the origin when `centre` is set.
24
+ */
25
+ export declare function solidExtrude(profile: ArrayLike<number>, height: number, centre?: boolean): Solid;
26
+ /**
27
+ * A profile (`x, y` pairs in the plane across the path) swept along a polyline path (`x, y, z`
28
+ * triples). At each point the frame is right = up × tangent, up' = tangent × right, so profile x
29
+ * runs right and profile y runs up; `up` defaults to +Y. Sides are faceted; `capEnds` closes both
30
+ * ends. Texture u runs around the profile and v along the path, both 0..1.
31
+ *
32
+ * Corners are not mitred: a sharp turn pinches the section. A path that turns sharply wants more
33
+ * points.
34
+ */
35
+ export declare function solidSweep(profile: ArrayLike<number>, path: ArrayLike<number>, capEnds: boolean, up?: Vec3): Solid;