@nodetool-ai/base-nodes 0.7.0-rc.23 → 0.8.1

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 (363) hide show
  1. package/README.md +21 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/index.d.ts +61 -67
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +179 -173
  6. package/dist/index.js.map +1 -1
  7. package/dist/platforms/browser.d.ts +19 -0
  8. package/dist/platforms/browser.d.ts.map +1 -0
  9. package/dist/platforms/browser.js +29 -0
  10. package/dist/platforms/browser.js.map +1 -0
  11. package/package.json +53 -65
  12. package/dist/lib/audio-wav.d.ts +0 -66
  13. package/dist/lib/audio-wav.d.ts.map +0 -1
  14. package/dist/lib/audio-wav.js +0 -215
  15. package/dist/lib/audio-wav.js.map +0 -1
  16. package/dist/nodes/agent-tool-hydration.d.ts +0 -10
  17. package/dist/nodes/agent-tool-hydration.d.ts.map +0 -1
  18. package/dist/nodes/agent-tool-hydration.js +0 -43
  19. package/dist/nodes/agent-tool-hydration.js.map +0 -1
  20. package/dist/nodes/agents.d.ts +0 -262
  21. package/dist/nodes/agents.d.ts.map +0 -1
  22. package/dist/nodes/agents.js +0 -2856
  23. package/dist/nodes/agents.js.map +0 -1
  24. package/dist/nodes/anthropic.d.ts +0 -26
  25. package/dist/nodes/anthropic.d.ts.map +0 -1
  26. package/dist/nodes/anthropic.js +0 -133
  27. package/dist/nodes/anthropic.js.map +0 -1
  28. package/dist/nodes/apify.d.ts +0 -120
  29. package/dist/nodes/apify.d.ts.map +0 -1
  30. package/dist/nodes/apify.js +0 -618
  31. package/dist/nodes/apify.js.map +0 -1
  32. package/dist/nodes/audio.d.ts +0 -301
  33. package/dist/nodes/audio.d.ts.map +0 -1
  34. package/dist/nodes/audio.js +0 -1274
  35. package/dist/nodes/audio.js.map +0 -1
  36. package/dist/nodes/code-node.d.ts +0 -34
  37. package/dist/nodes/code-node.d.ts.map +0 -1
  38. package/dist/nodes/code-node.js +0 -343
  39. package/dist/nodes/code-node.js.map +0 -1
  40. package/dist/nodes/code.d.ts +0 -301
  41. package/dist/nodes/code.d.ts.map +0 -1
  42. package/dist/nodes/code.js +0 -850
  43. package/dist/nodes/code.js.map +0 -1
  44. package/dist/nodes/compare.d.ts +0 -18
  45. package/dist/nodes/compare.d.ts.map +0 -1
  46. package/dist/nodes/compare.js +0 -122
  47. package/dist/nodes/compare.js.map +0 -1
  48. package/dist/nodes/constant.d.ts +0 -315
  49. package/dist/nodes/constant.d.ts.map +0 -1
  50. package/dist/nodes/constant.js +0 -715
  51. package/dist/nodes/constant.js.map +0 -1
  52. package/dist/nodes/control.d.ts +0 -83
  53. package/dist/nodes/control.d.ts.map +0 -1
  54. package/dist/nodes/control.js +0 -212
  55. package/dist/nodes/control.js.map +0 -1
  56. package/dist/nodes/data.d.ts +0 -369
  57. package/dist/nodes/data.d.ts.map +0 -1
  58. package/dist/nodes/data.js +0 -1590
  59. package/dist/nodes/data.js.map +0 -1
  60. package/dist/nodes/document.d.ts +0 -134
  61. package/dist/nodes/document.d.ts.map +0 -1
  62. package/dist/nodes/document.js +0 -984
  63. package/dist/nodes/document.js.map +0 -1
  64. package/dist/nodes/extended-placeholders.d.ts +0 -6
  65. package/dist/nodes/extended-placeholders.d.ts.map +0 -1
  66. package/dist/nodes/extended-placeholders.js +0 -19
  67. package/dist/nodes/extended-placeholders.js.map +0 -1
  68. package/dist/nodes/gemini.d.ts +0 -110
  69. package/dist/nodes/gemini.d.ts.map +0 -1
  70. package/dist/nodes/gemini.js +0 -871
  71. package/dist/nodes/gemini.js.map +0 -1
  72. package/dist/nodes/generators.d.ts +0 -84
  73. package/dist/nodes/generators.d.ts.map +0 -1
  74. package/dist/nodes/generators.js +0 -968
  75. package/dist/nodes/generators.js.map +0 -1
  76. package/dist/nodes/image.d.ts +0 -232
  77. package/dist/nodes/image.d.ts.map +0 -1
  78. package/dist/nodes/image.js +0 -1395
  79. package/dist/nodes/image.js.map +0 -1
  80. package/dist/nodes/input.d.ts +0 -445
  81. package/dist/nodes/input.d.ts.map +0 -1
  82. package/dist/nodes/input.js +0 -1459
  83. package/dist/nodes/input.js.map +0 -1
  84. package/dist/nodes/kie-dynamic.d.ts +0 -31
  85. package/dist/nodes/kie-dynamic.d.ts.map +0 -1
  86. package/dist/nodes/kie-dynamic.js +0 -270
  87. package/dist/nodes/kie-dynamic.js.map +0 -1
  88. package/dist/nodes/lib-audio-dsp.d.ts +0 -85
  89. package/dist/nodes/lib-audio-dsp.d.ts.map +0 -1
  90. package/dist/nodes/lib-audio-dsp.js +0 -450
  91. package/dist/nodes/lib-audio-dsp.js.map +0 -1
  92. package/dist/nodes/lib-audio-effects.d.ts +0 -116
  93. package/dist/nodes/lib-audio-effects.d.ts.map +0 -1
  94. package/dist/nodes/lib-audio-effects.js +0 -905
  95. package/dist/nodes/lib-audio-effects.js.map +0 -1
  96. package/dist/nodes/lib-browser.d.ts +0 -99
  97. package/dist/nodes/lib-browser.d.ts.map +0 -1
  98. package/dist/nodes/lib-browser.js +0 -692
  99. package/dist/nodes/lib-browser.js.map +0 -1
  100. package/dist/nodes/lib-charts.d.ts +0 -20
  101. package/dist/nodes/lib-charts.d.ts.map +0 -1
  102. package/dist/nodes/lib-charts.js +0 -245
  103. package/dist/nodes/lib-charts.js.map +0 -1
  104. package/dist/nodes/lib-datetime.d.ts +0 -108
  105. package/dist/nodes/lib-datetime.d.ts.map +0 -1
  106. package/dist/nodes/lib-datetime.js +0 -421
  107. package/dist/nodes/lib-datetime.js.map +0 -1
  108. package/dist/nodes/lib-doc-convert.d.ts +0 -19
  109. package/dist/nodes/lib-doc-convert.d.ts.map +0 -1
  110. package/dist/nodes/lib-doc-convert.js +0 -257
  111. package/dist/nodes/lib-doc-convert.js.map +0 -1
  112. package/dist/nodes/lib-doc-transform.d.ts +0 -39
  113. package/dist/nodes/lib-doc-transform.d.ts.map +0 -1
  114. package/dist/nodes/lib-doc-transform.js +0 -335
  115. package/dist/nodes/lib-doc-transform.js.map +0 -1
  116. package/dist/nodes/lib-docx.d.ts +0 -106
  117. package/dist/nodes/lib-docx.d.ts.map +0 -1
  118. package/dist/nodes/lib-docx.js +0 -595
  119. package/dist/nodes/lib-docx.js.map +0 -1
  120. package/dist/nodes/lib-epub.d.ts +0 -55
  121. package/dist/nodes/lib-epub.d.ts.map +0 -1
  122. package/dist/nodes/lib-epub.js +0 -220
  123. package/dist/nodes/lib-epub.js.map +0 -1
  124. package/dist/nodes/lib-excel.d.ts +0 -74
  125. package/dist/nodes/lib-excel.d.ts.map +0 -1
  126. package/dist/nodes/lib-excel.js +0 -448
  127. package/dist/nodes/lib-excel.js.map +0 -1
  128. package/dist/nodes/lib-graphql.d.ts +0 -66
  129. package/dist/nodes/lib-graphql.d.ts.map +0 -1
  130. package/dist/nodes/lib-graphql.js +0 -333
  131. package/dist/nodes/lib-graphql.js.map +0 -1
  132. package/dist/nodes/lib-grid.d.ts +0 -27
  133. package/dist/nodes/lib-grid.d.ts.map +0 -1
  134. package/dist/nodes/lib-grid.js +0 -172
  135. package/dist/nodes/lib-grid.js.map +0 -1
  136. package/dist/nodes/lib-html-parse.d.ts +0 -108
  137. package/dist/nodes/lib-html-parse.d.ts.map +0 -1
  138. package/dist/nodes/lib-html-parse.js +0 -365
  139. package/dist/nodes/lib-html-parse.js.map +0 -1
  140. package/dist/nodes/lib-http.d.ts +0 -98
  141. package/dist/nodes/lib-http.d.ts.map +0 -1
  142. package/dist/nodes/lib-http.js +0 -267
  143. package/dist/nodes/lib-http.js.map +0 -1
  144. package/dist/nodes/lib-image-color-grading.d.ts +0 -3
  145. package/dist/nodes/lib-image-color-grading.d.ts.map +0 -1
  146. package/dist/nodes/lib-image-color-grading.js +0 -1386
  147. package/dist/nodes/lib-image-color-grading.js.map +0 -1
  148. package/dist/nodes/lib-image-draw.d.ts +0 -3
  149. package/dist/nodes/lib-image-draw.d.ts.map +0 -1
  150. package/dist/nodes/lib-image-draw.js +0 -470
  151. package/dist/nodes/lib-image-draw.js.map +0 -1
  152. package/dist/nodes/lib-image-enhance.d.ts +0 -3
  153. package/dist/nodes/lib-image-enhance.d.ts.map +0 -1
  154. package/dist/nodes/lib-image-enhance.js +0 -731
  155. package/dist/nodes/lib-image-enhance.js.map +0 -1
  156. package/dist/nodes/lib-image-filter.d.ts +0 -3
  157. package/dist/nodes/lib-image-filter.d.ts.map +0 -1
  158. package/dist/nodes/lib-image-filter.js +0 -684
  159. package/dist/nodes/lib-image-filter.js.map +0 -1
  160. package/dist/nodes/lib-image-utils.d.ts +0 -24
  161. package/dist/nodes/lib-image-utils.d.ts.map +0 -1
  162. package/dist/nodes/lib-image-utils.js +0 -150
  163. package/dist/nodes/lib-image-utils.js.map +0 -1
  164. package/dist/nodes/lib-mail.d.ts +0 -74
  165. package/dist/nodes/lib-mail.d.ts.map +0 -1
  166. package/dist/nodes/lib-mail.js +0 -452
  167. package/dist/nodes/lib-mail.js.map +0 -1
  168. package/dist/nodes/lib-markdown.d.ts +0 -70
  169. package/dist/nodes/lib-markdown.d.ts.map +0 -1
  170. package/dist/nodes/lib-markdown.js +0 -236
  171. package/dist/nodes/lib-markdown.js.map +0 -1
  172. package/dist/nodes/lib-nlp.d.ts +0 -98
  173. package/dist/nodes/lib-nlp.d.ts.map +0 -1
  174. package/dist/nodes/lib-nlp.js +0 -374
  175. package/dist/nodes/lib-nlp.js.map +0 -1
  176. package/dist/nodes/lib-notion.d.ts +0 -99
  177. package/dist/nodes/lib-notion.d.ts.map +0 -1
  178. package/dist/nodes/lib-notion.js +0 -601
  179. package/dist/nodes/lib-notion.js.map +0 -1
  180. package/dist/nodes/lib-ocr.d.ts +0 -31
  181. package/dist/nodes/lib-ocr.d.ts.map +0 -1
  182. package/dist/nodes/lib-ocr.js +0 -143
  183. package/dist/nodes/lib-ocr.js.map +0 -1
  184. package/dist/nodes/lib-os.d.ts +0 -312
  185. package/dist/nodes/lib-os.d.ts.map +0 -1
  186. package/dist/nodes/lib-os.js +0 -909
  187. package/dist/nodes/lib-os.js.map +0 -1
  188. package/dist/nodes/lib-pdf.d.ts +0 -142
  189. package/dist/nodes/lib-pdf.d.ts.map +0 -1
  190. package/dist/nodes/lib-pdf.js +0 -871
  191. package/dist/nodes/lib-pdf.js.map +0 -1
  192. package/dist/nodes/lib-pptx.d.ts +0 -29
  193. package/dist/nodes/lib-pptx.d.ts.map +0 -1
  194. package/dist/nodes/lib-pptx.js +0 -122
  195. package/dist/nodes/lib-pptx.js.map +0 -1
  196. package/dist/nodes/lib-rss.d.ts +0 -31
  197. package/dist/nodes/lib-rss.d.ts.map +0 -1
  198. package/dist/nodes/lib-rss.js +0 -163
  199. package/dist/nodes/lib-rss.js.map +0 -1
  200. package/dist/nodes/lib-s3.d.ts +0 -112
  201. package/dist/nodes/lib-s3.d.ts.map +0 -1
  202. package/dist/nodes/lib-s3.js +0 -521
  203. package/dist/nodes/lib-s3.js.map +0 -1
  204. package/dist/nodes/lib-secret.d.ts +0 -15
  205. package/dist/nodes/lib-secret.d.ts.map +0 -1
  206. package/dist/nodes/lib-secret.js +0 -42
  207. package/dist/nodes/lib-secret.js.map +0 -1
  208. package/dist/nodes/lib-sqlite.d.ts +0 -102
  209. package/dist/nodes/lib-sqlite.d.ts.map +0 -1
  210. package/dist/nodes/lib-sqlite.js +0 -532
  211. package/dist/nodes/lib-sqlite.js.map +0 -1
  212. package/dist/nodes/lib-supabase.d.ts +0 -86
  213. package/dist/nodes/lib-supabase.d.ts.map +0 -1
  214. package/dist/nodes/lib-supabase.js +0 -425
  215. package/dist/nodes/lib-supabase.js.map +0 -1
  216. package/dist/nodes/lib-svg.d.ts +0 -199
  217. package/dist/nodes/lib-svg.d.ts.map +0 -1
  218. package/dist/nodes/lib-svg.js +0 -1027
  219. package/dist/nodes/lib-svg.js.map +0 -1
  220. package/dist/nodes/lib-tensorflow.d.ts +0 -71
  221. package/dist/nodes/lib-tensorflow.d.ts.map +0 -1
  222. package/dist/nodes/lib-tensorflow.js +0 -351
  223. package/dist/nodes/lib-tensorflow.js.map +0 -1
  224. package/dist/nodes/lib-twilio.d.ts +0 -71
  225. package/dist/nodes/lib-twilio.d.ts.map +0 -1
  226. package/dist/nodes/lib-twilio.js +0 -469
  227. package/dist/nodes/lib-twilio.js.map +0 -1
  228. package/dist/nodes/lib-validate.d.ts +0 -84
  229. package/dist/nodes/lib-validate.d.ts.map +0 -1
  230. package/dist/nodes/lib-validate.js +0 -215
  231. package/dist/nodes/lib-validate.js.map +0 -1
  232. package/dist/nodes/lib-video-download.d.ts +0 -26
  233. package/dist/nodes/lib-video-download.d.ts.map +0 -1
  234. package/dist/nodes/lib-video-download.js +0 -299
  235. package/dist/nodes/lib-video-download.js.map +0 -1
  236. package/dist/nodes/messaging.d.ts +0 -88
  237. package/dist/nodes/messaging.d.ts.map +0 -1
  238. package/dist/nodes/messaging.js +0 -418
  239. package/dist/nodes/messaging.js.map +0 -1
  240. package/dist/nodes/mistral.d.ts +0 -83
  241. package/dist/nodes/mistral.d.ts.map +0 -1
  242. package/dist/nodes/mistral.js +0 -450
  243. package/dist/nodes/mistral.js.map +0 -1
  244. package/dist/nodes/model3d/analysis.d.ts +0 -13
  245. package/dist/nodes/model3d/analysis.d.ts.map +0 -1
  246. package/dist/nodes/model3d/analysis.js +0 -36
  247. package/dist/nodes/model3d/analysis.js.map +0 -1
  248. package/dist/nodes/model3d/base.d.ts +0 -11
  249. package/dist/nodes/model3d/base.d.ts.map +0 -1
  250. package/dist/nodes/model3d/base.js +0 -20
  251. package/dist/nodes/model3d/base.js.map +0 -1
  252. package/dist/nodes/model3d/boolean-ops.d.ts +0 -2
  253. package/dist/nodes/model3d/boolean-ops.d.ts.map +0 -1
  254. package/dist/nodes/model3d/boolean-ops.js +0 -172
  255. package/dist/nodes/model3d/boolean-ops.js.map +0 -1
  256. package/dist/nodes/model3d/cleanup.d.ts +0 -47
  257. package/dist/nodes/model3d/cleanup.d.ts.map +0 -1
  258. package/dist/nodes/model3d/cleanup.js +0 -136
  259. package/dist/nodes/model3d/cleanup.js.map +0 -1
  260. package/dist/nodes/model3d/convert.d.ts +0 -14
  261. package/dist/nodes/model3d/convert.d.ts.map +0 -1
  262. package/dist/nodes/model3d/convert.js +0 -64
  263. package/dist/nodes/model3d/convert.js.map +0 -1
  264. package/dist/nodes/model3d/defaults.d.ts +0 -34
  265. package/dist/nodes/model3d/defaults.d.ts.map +0 -1
  266. package/dist/nodes/model3d/defaults.js +0 -28
  267. package/dist/nodes/model3d/defaults.js.map +0 -1
  268. package/dist/nodes/model3d/document-ops.d.ts +0 -4
  269. package/dist/nodes/model3d/document-ops.d.ts.map +0 -1
  270. package/dist/nodes/model3d/document-ops.js +0 -40
  271. package/dist/nodes/model3d/document-ops.js.map +0 -1
  272. package/dist/nodes/model3d/generation.d.ts +0 -39
  273. package/dist/nodes/model3d/generation.d.ts.map +0 -1
  274. package/dist/nodes/model3d/generation.js +0 -179
  275. package/dist/nodes/model3d/generation.js.map +0 -1
  276. package/dist/nodes/model3d/glb.d.ts +0 -29
  277. package/dist/nodes/model3d/glb.d.ts.map +0 -1
  278. package/dist/nodes/model3d/glb.js +0 -255
  279. package/dist/nodes/model3d/glb.js.map +0 -1
  280. package/dist/nodes/model3d/index.d.ts +0 -20
  281. package/dist/nodes/model3d/index.d.ts.map +0 -1
  282. package/dist/nodes/model3d/index.js +0 -38
  283. package/dist/nodes/model3d/index.js.map +0 -1
  284. package/dist/nodes/model3d/io.d.ts +0 -38
  285. package/dist/nodes/model3d/io.d.ts.map +0 -1
  286. package/dist/nodes/model3d/io.js +0 -162
  287. package/dist/nodes/model3d/io.js.map +0 -1
  288. package/dist/nodes/model3d/mesh-ops.d.ts +0 -40
  289. package/dist/nodes/model3d/mesh-ops.d.ts.map +0 -1
  290. package/dist/nodes/model3d/mesh-ops.js +0 -775
  291. package/dist/nodes/model3d/mesh-ops.js.map +0 -1
  292. package/dist/nodes/model3d/nodes.d.ts +0 -2
  293. package/dist/nodes/model3d/nodes.d.ts.map +0 -1
  294. package/dist/nodes/model3d/nodes.js +0 -2
  295. package/dist/nodes/model3d/nodes.js.map +0 -1
  296. package/dist/nodes/model3d/ops.d.ts +0 -37
  297. package/dist/nodes/model3d/ops.d.ts.map +0 -1
  298. package/dist/nodes/model3d/ops.js +0 -137
  299. package/dist/nodes/model3d/ops.js.map +0 -1
  300. package/dist/nodes/model3d/transforms.d.ts +0 -49
  301. package/dist/nodes/model3d/transforms.d.ts.map +0 -1
  302. package/dist/nodes/model3d/transforms.js +0 -142
  303. package/dist/nodes/model3d/transforms.js.map +0 -1
  304. package/dist/nodes/model3d/types.d.ts +0 -81
  305. package/dist/nodes/model3d/types.d.ts.map +0 -1
  306. package/dist/nodes/model3d/types.js +0 -2
  307. package/dist/nodes/model3d/types.js.map +0 -1
  308. package/dist/nodes/model3d/utils.d.ts +0 -34
  309. package/dist/nodes/model3d/utils.d.ts.map +0 -1
  310. package/dist/nodes/model3d/utils.js +0 -185
  311. package/dist/nodes/model3d/utils.js.map +0 -1
  312. package/dist/nodes/model3d.d.ts +0 -2
  313. package/dist/nodes/model3d.d.ts.map +0 -1
  314. package/dist/nodes/model3d.js +0 -2
  315. package/dist/nodes/model3d.js.map +0 -1
  316. package/dist/nodes/openai.d.ts +0 -172
  317. package/dist/nodes/openai.d.ts.map +0 -1
  318. package/dist/nodes/openai.js +0 -1294
  319. package/dist/nodes/openai.js.map +0 -1
  320. package/dist/nodes/output.d.ts +0 -29
  321. package/dist/nodes/output.d.ts.map +0 -1
  322. package/dist/nodes/output.js +0 -87
  323. package/dist/nodes/output.js.map +0 -1
  324. package/dist/nodes/sandbox.d.ts +0 -63
  325. package/dist/nodes/sandbox.d.ts.map +0 -1
  326. package/dist/nodes/sandbox.js +0 -633
  327. package/dist/nodes/sandbox.js.map +0 -1
  328. package/dist/nodes/search.d.ts +0 -117
  329. package/dist/nodes/search.d.ts.map +0 -1
  330. package/dist/nodes/search.js +0 -607
  331. package/dist/nodes/search.js.map +0 -1
  332. package/dist/nodes/team.d.ts +0 -74
  333. package/dist/nodes/team.d.ts.map +0 -1
  334. package/dist/nodes/team.js +0 -309
  335. package/dist/nodes/team.js.map +0 -1
  336. package/dist/nodes/text-extra.d.ts +0 -633
  337. package/dist/nodes/text-extra.d.ts.map +0 -1
  338. package/dist/nodes/text-extra.js +0 -2226
  339. package/dist/nodes/text-extra.js.map +0 -1
  340. package/dist/nodes/tool-agents.d.ts +0 -334
  341. package/dist/nodes/tool-agents.d.ts.map +0 -1
  342. package/dist/nodes/tool-agents.js +0 -1861
  343. package/dist/nodes/tool-agents.js.map +0 -1
  344. package/dist/nodes/triggers.d.ts +0 -107
  345. package/dist/nodes/triggers.d.ts.map +0 -1
  346. package/dist/nodes/triggers.js +0 -706
  347. package/dist/nodes/triggers.js.map +0 -1
  348. package/dist/nodes/vector.d.ts +0 -168
  349. package/dist/nodes/vector.d.ts.map +0 -1
  350. package/dist/nodes/vector.js +0 -1121
  351. package/dist/nodes/vector.js.map +0 -1
  352. package/dist/nodes/video.d.ts +0 -387
  353. package/dist/nodes/video.d.ts.map +0 -1
  354. package/dist/nodes/video.js +0 -2383
  355. package/dist/nodes/video.js.map +0 -1
  356. package/dist/nodes/workflow.d.ts +0 -24
  357. package/dist/nodes/workflow.d.ts.map +0 -1
  358. package/dist/nodes/workflow.js +0 -146
  359. package/dist/nodes/workflow.js.map +0 -1
  360. package/dist/nodes/workspace.d.ts +0 -203
  361. package/dist/nodes/workspace.d.ts.map +0 -1
  362. package/dist/nodes/workspace.js +0 -795
  363. package/dist/nodes/workspace.js.map +0 -1
@@ -1,775 +0,0 @@
1
- import { buildGlb, COMP_FLOAT, COMP_UNSIGNED_INT, glbGetIndexAccessor, glbGetVec3Accessor, glbReadIndices, glbReadVec3, glbUpdateMinMax, glbWriteIndices, glbWriteVec3, parseGlb } from "./glb.js";
2
- function buildSequentialIndices(vertexCount) {
3
- const indices = new Uint32Array(vertexCount);
4
- for (let i = 0; i < vertexCount; i++) {
5
- indices[i] = i;
6
- }
7
- return indices;
8
- }
9
- function transformNormal(data, r00, r01, r02, r10, r11, r12, r20, r21, r22) {
10
- for (let i = 0; i < data.length; i += 3) {
11
- const x = data[i];
12
- const y = data[i + 1];
13
- const z = data[i + 2];
14
- const nx = r00 * x + r01 * y + r02 * z;
15
- const ny = r10 * x + r11 * y + r12 * z;
16
- const nz = r20 * x + r21 * y + r22 * z;
17
- const len = Math.sqrt(nx * nx + ny * ny + nz * nz) || 1;
18
- data[i] = nx / len;
19
- data[i + 1] = ny / len;
20
- data[i + 2] = nz / len;
21
- }
22
- }
23
- function applyAxisPreset(data, axisPreset) {
24
- if (axisPreset === "keep")
25
- return;
26
- for (let i = 0; i < data.length; i += 3) {
27
- const x = data[i];
28
- const y = data[i + 1];
29
- const z = data[i + 2];
30
- if (axisPreset === "z_to_y") {
31
- data[i] = x;
32
- data[i + 1] = z;
33
- data[i + 2] = -y;
34
- }
35
- else {
36
- data[i] = x;
37
- data[i + 1] = -z;
38
- data[i + 2] = y;
39
- }
40
- }
41
- }
42
- function computeBoundsAndCentroid(glb) {
43
- let sumX = 0;
44
- let sumY = 0;
45
- let sumZ = 0;
46
- let totalVerts = 0;
47
- let minX = Infinity;
48
- let minY = Infinity;
49
- let minZ = Infinity;
50
- let maxX = -Infinity;
51
- let maxY = -Infinity;
52
- let maxZ = -Infinity;
53
- for (const mesh of glb.json.meshes ?? []) {
54
- for (const primitive of mesh.primitives) {
55
- const posIdx = primitive.attributes["POSITION"];
56
- if (posIdx === undefined)
57
- continue;
58
- const position = glbGetVec3Accessor(glb.json, posIdx);
59
- if (!position)
60
- continue;
61
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
62
- for (let i = 0; i < data.length; i += 3) {
63
- sumX += data[i];
64
- sumY += data[i + 1];
65
- sumZ += data[i + 2];
66
- minX = Math.min(minX, data[i]);
67
- minY = Math.min(minY, data[i + 1]);
68
- minZ = Math.min(minZ, data[i + 2]);
69
- maxX = Math.max(maxX, data[i]);
70
- maxY = Math.max(maxY, data[i + 1]);
71
- maxZ = Math.max(maxZ, data[i + 2]);
72
- totalVerts++;
73
- }
74
- }
75
- }
76
- return {
77
- minX,
78
- minY,
79
- minZ,
80
- maxX,
81
- maxY,
82
- maxZ,
83
- centroidX: totalVerts > 0 ? sumX / totalVerts : 0,
84
- centroidY: totalVerts > 0 ? sumY / totalVerts : 0,
85
- centroidZ: totalVerts > 0 ? sumZ / totalVerts : 0,
86
- totalVerts
87
- };
88
- }
89
- function collectTriangleMeshData(glb) {
90
- const positions = [];
91
- const indices = [];
92
- let vertexOffset = 0;
93
- for (const mesh of glb.json.meshes ?? []) {
94
- for (const primitive of mesh.primitives) {
95
- const mode = primitive.mode ?? 4;
96
- if (mode !== 4) {
97
- continue;
98
- }
99
- const posIdx = primitive.attributes["POSITION"];
100
- if (posIdx === undefined) {
101
- continue;
102
- }
103
- const position = glbGetVec3Accessor(glb.json, posIdx);
104
- if (!position) {
105
- continue;
106
- }
107
- const primitivePositions = glbReadVec3(glb.bin, position.acc, position.bv);
108
- positions.push(...primitivePositions);
109
- let primitiveIndices;
110
- if (primitive.indices !== undefined) {
111
- const indexAccessor = glbGetIndexAccessor(glb.json, primitive.indices);
112
- const read = indexAccessor &&
113
- glbReadIndices(glb.bin, indexAccessor.acc, indexAccessor.bv);
114
- if (!read) {
115
- vertexOffset += position.acc.count;
116
- continue;
117
- }
118
- primitiveIndices = read;
119
- }
120
- else {
121
- primitiveIndices = buildSequentialIndices(position.acc.count);
122
- }
123
- for (const index of primitiveIndices) {
124
- indices.push(index + vertexOffset);
125
- }
126
- vertexOffset += position.acc.count;
127
- }
128
- }
129
- return { positions, indices };
130
- }
131
- function buildTriangleOnlyGlb(positions, indices) {
132
- const positionsArray = new Float32Array(positions);
133
- const indicesArray = new Uint32Array(indices);
134
- const positionBytes = new Uint8Array(positionsArray.buffer);
135
- const indexBytes = new Uint8Array(indicesArray.buffer);
136
- const min = [Infinity, Infinity, Infinity];
137
- const max = [-Infinity, -Infinity, -Infinity];
138
- for (let i = 0; i < positions.length; i += 3) {
139
- for (let axis = 0; axis < 3; axis++) {
140
- min[axis] = Math.min(min[axis], positions[i + axis]);
141
- max[axis] = Math.max(max[axis], positions[i + axis]);
142
- }
143
- }
144
- const json = {
145
- asset: { version: "2.0" },
146
- scenes: [{ nodes: [0] }],
147
- scene: 0,
148
- nodes: [{ mesh: 0 }],
149
- meshes: [
150
- {
151
- primitives: [
152
- {
153
- attributes: { POSITION: 0 },
154
- indices: 1
155
- }
156
- ]
157
- }
158
- ],
159
- buffers: [{ byteLength: positionBytes.byteLength + indexBytes.byteLength }],
160
- bufferViews: [
161
- { buffer: 0, byteOffset: 0, byteLength: positionBytes.byteLength },
162
- {
163
- buffer: 0,
164
- byteOffset: positionBytes.byteLength,
165
- byteLength: indexBytes.byteLength
166
- }
167
- ],
168
- accessors: [
169
- {
170
- bufferView: 0,
171
- componentType: COMP_FLOAT,
172
- count: positions.length / 3,
173
- type: "VEC3",
174
- min,
175
- max
176
- },
177
- {
178
- bufferView: 1,
179
- componentType: COMP_UNSIGNED_INT,
180
- count: indices.length,
181
- type: "SCALAR"
182
- }
183
- ]
184
- };
185
- const bin = new Uint8Array(positionBytes.byteLength + indexBytes.byteLength);
186
- bin.set(positionBytes, 0);
187
- bin.set(indexBytes, positionBytes.byteLength);
188
- return buildGlb(json, bin);
189
- }
190
- function compactTriangleMesh(mesh) {
191
- const remap = new Map();
192
- const positions = [];
193
- const indices = [];
194
- for (const sourceIndex of mesh.indices) {
195
- if (!remap.has(sourceIndex)) {
196
- const targetIndex = remap.size;
197
- remap.set(sourceIndex, targetIndex);
198
- positions.push(mesh.positions[sourceIndex * 3], mesh.positions[sourceIndex * 3 + 1], mesh.positions[sourceIndex * 3 + 2]);
199
- }
200
- indices.push(remap.get(sourceIndex));
201
- }
202
- return { positions, indices };
203
- }
204
- function quantizedKey(x, y, z, tolerance) {
205
- if (tolerance <= 0) {
206
- return `${x}:${y}:${z}`;
207
- }
208
- return [
209
- Math.round(x / tolerance),
210
- Math.round(y / tolerance),
211
- Math.round(z / tolerance)
212
- ].join(":");
213
- }
214
- function mergeDuplicateVertices(mesh, tolerance) {
215
- const indexMap = new Map();
216
- const remap = new Uint32Array(Math.floor(mesh.positions.length / 3));
217
- const positions = [];
218
- for (let i = 0; i < remap.length; i++) {
219
- const x = mesh.positions[i * 3];
220
- const y = mesh.positions[i * 3 + 1];
221
- const z = mesh.positions[i * 3 + 2];
222
- const key = quantizedKey(x, y, z, tolerance);
223
- const existing = indexMap.get(key);
224
- if (existing !== undefined) {
225
- remap[i] = existing;
226
- continue;
227
- }
228
- const next = Math.floor(positions.length / 3);
229
- indexMap.set(key, next);
230
- remap[i] = next;
231
- positions.push(x, y, z);
232
- }
233
- const indices = mesh.indices.map((index) => remap[index]);
234
- return compactTriangleMesh({ positions, indices });
235
- }
236
- function removeDegenerateFaces(mesh, tolerance) {
237
- const keptIndices = [];
238
- const areaThreshold = tolerance > 0 ? tolerance * tolerance : 0;
239
- for (let i = 0; i < mesh.indices.length; i += 3) {
240
- const a = mesh.indices[i];
241
- const b = mesh.indices[i + 1];
242
- const c = mesh.indices[i + 2];
243
- if (a === b || b === c || a === c) {
244
- continue;
245
- }
246
- const ax = mesh.positions[a * 3];
247
- const ay = mesh.positions[a * 3 + 1];
248
- const az = mesh.positions[a * 3 + 2];
249
- const bx = mesh.positions[b * 3];
250
- const by = mesh.positions[b * 3 + 1];
251
- const bz = mesh.positions[b * 3 + 2];
252
- const cx = mesh.positions[c * 3];
253
- const cy = mesh.positions[c * 3 + 1];
254
- const cz = mesh.positions[c * 3 + 2];
255
- const abx = bx - ax;
256
- const aby = by - ay;
257
- const abz = bz - az;
258
- const acx = cx - ax;
259
- const acy = cy - ay;
260
- const acz = cz - az;
261
- const crossX = aby * acz - abz * acy;
262
- const crossY = abz * acx - abx * acz;
263
- const crossZ = abx * acy - aby * acx;
264
- const areaSquared = crossX * crossX + crossY * crossY + crossZ * crossZ;
265
- if (areaSquared <= areaThreshold) {
266
- continue;
267
- }
268
- keptIndices.push(a, b, c);
269
- }
270
- return compactTriangleMesh({
271
- positions: mesh.positions,
272
- indices: keptIndices
273
- });
274
- }
275
- export function transformGlb(bytes, options) {
276
- const glb = parseGlb(bytes);
277
- if (!glb)
278
- return null;
279
- const tx = options.translateX;
280
- const ty = options.translateY;
281
- const tz = options.translateZ;
282
- const rx = (options.rotateXDeg * Math.PI) / 180;
283
- const ry = (options.rotateYDeg * Math.PI) / 180;
284
- const rz = (options.rotateZDeg * Math.PI) / 180;
285
- const scX = options.scaleX * options.uniformScale;
286
- const scY = options.scaleY * options.uniformScale;
287
- const scZ = options.scaleZ * options.uniformScale;
288
- const cx = Math.cos(rx);
289
- const sx = Math.sin(rx);
290
- const cy = Math.cos(ry);
291
- const sy = Math.sin(ry);
292
- const cz = Math.cos(rz);
293
- const sz = Math.sin(rz);
294
- const r00 = cy * cz;
295
- const r01 = sx * sy * cz - cx * sz;
296
- const r02 = cx * sy * cz + sx * sz;
297
- const r10 = cy * sz;
298
- const r11 = sx * sy * sz + cx * cz;
299
- const r12 = cx * sy * sz - sx * cz;
300
- const r20 = -sy;
301
- const r21 = sx * cy;
302
- const r22 = cx * cy;
303
- for (const mesh of glb.json.meshes ?? []) {
304
- for (const primitive of mesh.primitives) {
305
- const posIdx = primitive.attributes["POSITION"];
306
- if (posIdx !== undefined) {
307
- const position = glbGetVec3Accessor(glb.json, posIdx);
308
- if (position) {
309
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
310
- for (let i = 0; i < data.length; i += 3) {
311
- const x = data[i] * scX;
312
- const y = data[i + 1] * scY;
313
- const z = data[i + 2] * scZ;
314
- data[i] = r00 * x + r01 * y + r02 * z + tx;
315
- data[i + 1] = r10 * x + r11 * y + r12 * z + ty;
316
- data[i + 2] = r20 * x + r21 * y + r22 * z + tz;
317
- }
318
- glbWriteVec3(glb.bin, position.acc, position.bv, data);
319
- glbUpdateMinMax(position.acc, data);
320
- }
321
- }
322
- const normIdx = primitive.attributes["NORMAL"];
323
- if (normIdx !== undefined) {
324
- const normal = glbGetVec3Accessor(glb.json, normIdx);
325
- if (normal) {
326
- const data = glbReadVec3(glb.bin, normal.acc, normal.bv);
327
- transformNormal(data, r00, r01, r02, r10, r11, r12, r20, r21, r22);
328
- glbWriteVec3(glb.bin, normal.acc, normal.bv, data);
329
- }
330
- }
331
- }
332
- }
333
- return buildGlb(glb.json, glb.bin);
334
- }
335
- export function recalculateNormalsGlb(bytes, options) {
336
- const glb = parseGlb(bytes);
337
- if (!glb)
338
- return null;
339
- const mode = options.mode.toLowerCase();
340
- for (const mesh of glb.json.meshes ?? []) {
341
- for (const primitive of mesh.primitives) {
342
- const posIdx = primitive.attributes["POSITION"];
343
- const normIdx = primitive.attributes["NORMAL"];
344
- if (posIdx === undefined || normIdx === undefined)
345
- continue;
346
- const position = glbGetVec3Accessor(glb.json, posIdx);
347
- const normal = glbGetVec3Accessor(glb.json, normIdx);
348
- if (!position || !normal || position.acc.count !== normal.acc.count) {
349
- continue;
350
- }
351
- const pos = glbReadVec3(glb.bin, position.acc, position.bv);
352
- const normals = new Float32Array(pos.length);
353
- const vertexCount = position.acc.count;
354
- let indices;
355
- if (primitive.indices !== undefined) {
356
- const indexAccessor = glbGetIndexAccessor(glb.json, primitive.indices);
357
- if (indexAccessor) {
358
- indices =
359
- glbReadIndices(glb.bin, indexAccessor.acc, indexAccessor.bv) ??
360
- new Uint32Array(0);
361
- }
362
- else {
363
- indices = new Uint32Array(0);
364
- }
365
- }
366
- else {
367
- indices = buildSequentialIndices(vertexCount);
368
- }
369
- const triCount = Math.floor(indices.length / 3);
370
- for (let t = 0; t < triCount; t++) {
371
- const i0 = indices[t * 3];
372
- const i1 = indices[t * 3 + 1];
373
- const i2 = indices[t * 3 + 2];
374
- const ax = pos[i1 * 3] - pos[i0 * 3];
375
- const ay = pos[i1 * 3 + 1] - pos[i0 * 3 + 1];
376
- const az = pos[i1 * 3 + 2] - pos[i0 * 3 + 2];
377
- const bx = pos[i2 * 3] - pos[i0 * 3];
378
- const by = pos[i2 * 3 + 1] - pos[i0 * 3 + 1];
379
- const bz = pos[i2 * 3 + 2] - pos[i0 * 3 + 2];
380
- const nx = ay * bz - az * by;
381
- const ny = az * bx - ax * bz;
382
- const nz = ax * by - ay * bx;
383
- if (mode === "flat") {
384
- const len = Math.sqrt(nx * nx + ny * ny + nz * nz) || 1;
385
- for (const idx of [i0, i1, i2]) {
386
- normals[idx * 3] = nx / len;
387
- normals[idx * 3 + 1] = ny / len;
388
- normals[idx * 3 + 2] = nz / len;
389
- }
390
- }
391
- else {
392
- for (const idx of [i0, i1, i2]) {
393
- normals[idx * 3] += nx;
394
- normals[idx * 3 + 1] += ny;
395
- normals[idx * 3 + 2] += nz;
396
- }
397
- }
398
- }
399
- if (mode !== "flat") {
400
- for (let i = 0; i < normals.length; i += 3) {
401
- const len = Math.sqrt(normals[i] * normals[i] +
402
- normals[i + 1] * normals[i + 1] +
403
- normals[i + 2] * normals[i + 2]) || 1;
404
- normals[i] /= len;
405
- normals[i + 1] /= len;
406
- normals[i + 2] /= len;
407
- }
408
- }
409
- glbWriteVec3(glb.bin, normal.acc, normal.bv, normals);
410
- if (options.fixWinding && primitive.indices !== undefined) {
411
- const indexAccessor = glbGetIndexAccessor(glb.json, primitive.indices);
412
- if (indexAccessor) {
413
- const idx = glbReadIndices(glb.bin, indexAccessor.acc, indexAccessor.bv);
414
- if (idx) {
415
- let fixed = false;
416
- for (let t = 0; t < triCount; t++) {
417
- const i0 = idx[t * 3];
418
- const i1 = idx[t * 3 + 1];
419
- const i2 = idx[t * 3 + 2];
420
- const ax = pos[i1 * 3] - pos[i0 * 3];
421
- const ay = pos[i1 * 3 + 1] - pos[i0 * 3 + 1];
422
- const az = pos[i1 * 3 + 2] - pos[i0 * 3 + 2];
423
- const bx = pos[i2 * 3] - pos[i0 * 3];
424
- const by = pos[i2 * 3 + 1] - pos[i0 * 3 + 1];
425
- const bz = pos[i2 * 3 + 2] - pos[i0 * 3 + 2];
426
- const fnx = ay * bz - az * by;
427
- const fny = az * bx - ax * bz;
428
- const fnz = ax * by - ay * bx;
429
- const vn0 = normals[i0 * 3] * fnx +
430
- normals[i0 * 3 + 1] * fny +
431
- normals[i0 * 3 + 2] * fnz;
432
- if (vn0 < 0) {
433
- idx[t * 3 + 1] = i2;
434
- idx[t * 3 + 2] = i1;
435
- fixed = true;
436
- }
437
- }
438
- if (fixed) {
439
- glbWriteIndices(glb.bin, indexAccessor.acc, indexAccessor.bv, idx);
440
- }
441
- }
442
- }
443
- }
444
- }
445
- }
446
- return buildGlb(glb.json, glb.bin);
447
- }
448
- export function centerGlb(bytes, options) {
449
- const glb = parseGlb(bytes);
450
- if (!glb)
451
- return null;
452
- let sumX = 0;
453
- let sumY = 0;
454
- let sumZ = 0;
455
- let totalVerts = 0;
456
- let minX = Infinity;
457
- let minY = Infinity;
458
- let minZ = Infinity;
459
- let maxX = -Infinity;
460
- let maxY = -Infinity;
461
- let maxZ = -Infinity;
462
- for (const mesh of glb.json.meshes ?? []) {
463
- for (const primitive of mesh.primitives) {
464
- const posIdx = primitive.attributes["POSITION"];
465
- if (posIdx === undefined)
466
- continue;
467
- const position = glbGetVec3Accessor(glb.json, posIdx);
468
- if (!position)
469
- continue;
470
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
471
- for (let i = 0; i < data.length; i += 3) {
472
- sumX += data[i];
473
- sumY += data[i + 1];
474
- sumZ += data[i + 2];
475
- minX = Math.min(minX, data[i]);
476
- minY = Math.min(minY, data[i + 1]);
477
- minZ = Math.min(minZ, data[i + 2]);
478
- maxX = Math.max(maxX, data[i]);
479
- maxY = Math.max(maxY, data[i + 1]);
480
- maxZ = Math.max(maxZ, data[i + 2]);
481
- totalVerts++;
482
- }
483
- }
484
- }
485
- if (totalVerts === 0) {
486
- return buildGlb(glb.json, glb.bin);
487
- }
488
- let cx;
489
- let cy;
490
- let cz;
491
- if (options.useCentroid) {
492
- cx = sumX / totalVerts;
493
- cy = sumY / totalVerts;
494
- cz = sumZ / totalVerts;
495
- }
496
- else {
497
- cx = (minX + maxX) / 2;
498
- cy = (minY + maxY) / 2;
499
- cz = (minZ + maxZ) / 2;
500
- }
501
- for (const mesh of glb.json.meshes ?? []) {
502
- for (const primitive of mesh.primitives) {
503
- const posIdx = primitive.attributes["POSITION"];
504
- if (posIdx === undefined)
505
- continue;
506
- const position = glbGetVec3Accessor(glb.json, posIdx);
507
- if (!position)
508
- continue;
509
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
510
- for (let i = 0; i < data.length; i += 3) {
511
- data[i] -= cx;
512
- data[i + 1] -= cy;
513
- data[i + 2] -= cz;
514
- }
515
- glbWriteVec3(glb.bin, position.acc, position.bv, data);
516
- glbUpdateMinMax(position.acc, data);
517
- }
518
- }
519
- return buildGlb(glb.json, glb.bin);
520
- }
521
- export function flipNormalsGlb(bytes) {
522
- const glb = parseGlb(bytes);
523
- if (!glb)
524
- return null;
525
- for (const mesh of glb.json.meshes ?? []) {
526
- for (const primitive of mesh.primitives) {
527
- const normIdx = primitive.attributes["NORMAL"];
528
- if (normIdx !== undefined) {
529
- const normal = glbGetVec3Accessor(glb.json, normIdx);
530
- if (normal) {
531
- const data = glbReadVec3(glb.bin, normal.acc, normal.bv);
532
- for (let i = 0; i < data.length; i++) {
533
- data[i] = -data[i];
534
- }
535
- glbWriteVec3(glb.bin, normal.acc, normal.bv, data);
536
- }
537
- }
538
- if (primitive.indices !== undefined) {
539
- const indexAccessor = glbGetIndexAccessor(glb.json, primitive.indices);
540
- if (indexAccessor) {
541
- const idx = glbReadIndices(glb.bin, indexAccessor.acc, indexAccessor.bv);
542
- if (idx) {
543
- const triCount = Math.floor(idx.length / 3);
544
- for (let t = 0; t < triCount; t++) {
545
- const tmp = idx[t * 3 + 1];
546
- idx[t * 3 + 1] = idx[t * 3 + 2];
547
- idx[t * 3 + 2] = tmp;
548
- }
549
- glbWriteIndices(glb.bin, indexAccessor.acc, indexAccessor.bv, idx);
550
- }
551
- }
552
- }
553
- }
554
- }
555
- return buildGlb(glb.json, glb.bin);
556
- }
557
- export function normalizeGlb(bytes, options) {
558
- const glb = parseGlb(bytes);
559
- if (!glb)
560
- return null;
561
- for (const mesh of glb.json.meshes ?? []) {
562
- for (const primitive of mesh.primitives) {
563
- const posIdx = primitive.attributes["POSITION"];
564
- if (posIdx !== undefined) {
565
- const position = glbGetVec3Accessor(glb.json, posIdx);
566
- if (position) {
567
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
568
- applyAxisPreset(data, options.axisPreset);
569
- glbWriteVec3(glb.bin, position.acc, position.bv, data);
570
- glbUpdateMinMax(position.acc, data);
571
- }
572
- }
573
- const normIdx = primitive.attributes["NORMAL"];
574
- if (normIdx !== undefined) {
575
- const normal = glbGetVec3Accessor(glb.json, normIdx);
576
- if (normal) {
577
- const data = glbReadVec3(glb.bin, normal.acc, normal.bv);
578
- applyAxisPreset(data, options.axisPreset);
579
- glbWriteVec3(glb.bin, normal.acc, normal.bv, data);
580
- }
581
- }
582
- }
583
- }
584
- let summary = computeBoundsAndCentroid(glb);
585
- if (summary.totalVerts === 0) {
586
- return buildGlb(glb.json, glb.bin);
587
- }
588
- let translateX = 0;
589
- let translateY = 0;
590
- let translateZ = 0;
591
- if (options.centerMode === "bounds") {
592
- translateX = -((summary.minX + summary.maxX) / 2);
593
- translateY = -((summary.minY + summary.maxY) / 2);
594
- translateZ = -((summary.minZ + summary.maxZ) / 2);
595
- }
596
- else if (options.centerMode === "centroid") {
597
- translateX = -summary.centroidX;
598
- translateY = -summary.centroidY;
599
- translateZ = -summary.centroidZ;
600
- }
601
- for (const mesh of glb.json.meshes ?? []) {
602
- for (const primitive of mesh.primitives) {
603
- const posIdx = primitive.attributes["POSITION"];
604
- if (posIdx === undefined)
605
- continue;
606
- const position = glbGetVec3Accessor(glb.json, posIdx);
607
- if (!position)
608
- continue;
609
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
610
- for (let i = 0; i < data.length; i += 3) {
611
- data[i] += translateX;
612
- data[i + 1] += translateY;
613
- data[i + 2] += translateZ;
614
- }
615
- glbWriteVec3(glb.bin, position.acc, position.bv, data);
616
- glbUpdateMinMax(position.acc, data);
617
- }
618
- }
619
- summary = computeBoundsAndCentroid(glb);
620
- const sizeX = summary.maxX - summary.minX;
621
- const sizeY = summary.maxY - summary.minY;
622
- const sizeZ = summary.maxZ - summary.minZ;
623
- const longest = Math.max(sizeX, sizeY, sizeZ);
624
- if (options.scaleToSize && options.targetSize > 0 && longest > 0) {
625
- const scale = options.targetSize / longest;
626
- for (const mesh of glb.json.meshes ?? []) {
627
- for (const primitive of mesh.primitives) {
628
- const posIdx = primitive.attributes["POSITION"];
629
- if (posIdx !== undefined) {
630
- const position = glbGetVec3Accessor(glb.json, posIdx);
631
- if (position) {
632
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
633
- for (let i = 0; i < data.length; i++) {
634
- data[i] *= scale;
635
- }
636
- glbWriteVec3(glb.bin, position.acc, position.bv, data);
637
- glbUpdateMinMax(position.acc, data);
638
- }
639
- }
640
- }
641
- }
642
- }
643
- summary = computeBoundsAndCentroid(glb);
644
- if (options.placeOnGround) {
645
- const groundOffset = options.groundAxis === "y" ? -summary.minY : -summary.minZ;
646
- for (const mesh of glb.json.meshes ?? []) {
647
- for (const primitive of mesh.primitives) {
648
- const posIdx = primitive.attributes["POSITION"];
649
- if (posIdx === undefined)
650
- continue;
651
- const position = glbGetVec3Accessor(glb.json, posIdx);
652
- if (!position)
653
- continue;
654
- const data = glbReadVec3(glb.bin, position.acc, position.bv);
655
- for (let i = 0; i < data.length; i += 3) {
656
- if (options.groundAxis === "y") {
657
- data[i + 1] += groundOffset;
658
- }
659
- else {
660
- data[i + 2] += groundOffset;
661
- }
662
- }
663
- glbWriteVec3(glb.bin, position.acc, position.bv, data);
664
- glbUpdateMinMax(position.acc, data);
665
- }
666
- }
667
- }
668
- return buildGlb(glb.json, glb.bin);
669
- }
670
- export function extractLargestComponentGlb(bytes) {
671
- const glb = parseGlb(bytes);
672
- if (!glb)
673
- return null;
674
- const mesh = collectTriangleMeshData(glb);
675
- if (mesh.positions.length === 0 || mesh.indices.length === 0) {
676
- return buildGlb(glb.json, glb.bin);
677
- }
678
- const vertexCount = Math.floor(mesh.positions.length / 3);
679
- const parent = new Uint32Array(vertexCount);
680
- const rank = new Uint8Array(vertexCount);
681
- for (let i = 0; i < vertexCount; i++) {
682
- parent[i] = i;
683
- }
684
- const find = (value) => {
685
- let current = value;
686
- while (parent[current] !== current) {
687
- parent[current] = parent[parent[current]];
688
- current = parent[current];
689
- }
690
- return current;
691
- };
692
- const union = (a, b) => {
693
- const rootA = find(a);
694
- const rootB = find(b);
695
- if (rootA === rootB)
696
- return;
697
- if (rank[rootA] < rank[rootB]) {
698
- parent[rootA] = rootB;
699
- }
700
- else if (rank[rootA] > rank[rootB]) {
701
- parent[rootB] = rootA;
702
- }
703
- else {
704
- parent[rootB] = rootA;
705
- rank[rootA] += 1;
706
- }
707
- };
708
- for (let i = 0; i < mesh.indices.length; i += 3) {
709
- const a = mesh.indices[i];
710
- const b = mesh.indices[i + 1];
711
- const c = mesh.indices[i + 2];
712
- union(a, b);
713
- union(b, c);
714
- union(a, c);
715
- }
716
- const faceCounts = new Map();
717
- for (let i = 0; i < mesh.indices.length; i += 3) {
718
- const root = find(mesh.indices[i]);
719
- faceCounts.set(root, (faceCounts.get(root) ?? 0) + 1);
720
- }
721
- let largestRoot = -1;
722
- let largestFaceCount = -1;
723
- for (const [root, faceCount] of faceCounts.entries()) {
724
- if (faceCount > largestFaceCount) {
725
- largestRoot = root;
726
- largestFaceCount = faceCount;
727
- }
728
- }
729
- if (largestRoot < 0) {
730
- return buildGlb(glb.json, glb.bin);
731
- }
732
- const remap = new Map();
733
- const positions = [];
734
- const indices = [];
735
- for (let i = 0; i < mesh.indices.length; i += 3) {
736
- const a = mesh.indices[i];
737
- const b = mesh.indices[i + 1];
738
- const c = mesh.indices[i + 2];
739
- if (find(a) !== largestRoot)
740
- continue;
741
- for (const sourceIndex of [a, b, c]) {
742
- if (!remap.has(sourceIndex)) {
743
- const targetIndex = remap.size;
744
- remap.set(sourceIndex, targetIndex);
745
- positions.push(mesh.positions[sourceIndex * 3], mesh.positions[sourceIndex * 3 + 1], mesh.positions[sourceIndex * 3 + 2]);
746
- }
747
- indices.push(remap.get(sourceIndex));
748
- }
749
- }
750
- if (positions.length === 0 || indices.length === 0) {
751
- return buildGlb(glb.json, glb.bin);
752
- }
753
- return buildTriangleOnlyGlb(positions, indices);
754
- }
755
- export function repairGlb(bytes, options) {
756
- const glb = parseGlb(bytes);
757
- if (!glb)
758
- return null;
759
- const collected = collectTriangleMeshData(glb);
760
- if (collected.positions.length === 0 || collected.indices.length === 0) {
761
- return buildGlb(glb.json, glb.bin);
762
- }
763
- let repaired = collected;
764
- if (options.mergeDuplicateVertices) {
765
- repaired = mergeDuplicateVertices(repaired, Math.max(0, Number(options.positionTolerance) || 0));
766
- }
767
- if (options.removeDegenerateFaces) {
768
- repaired = removeDegenerateFaces(repaired, Math.max(0, Number(options.positionTolerance) || 0));
769
- }
770
- if (repaired.positions.length === 0 || repaired.indices.length === 0) {
771
- return buildGlb(glb.json, glb.bin);
772
- }
773
- return buildTriangleOnlyGlb(repaired.positions, repaired.indices);
774
- }
775
- //# sourceMappingURL=mesh-ops.js.map