@loaders.gl/gltf 4.0.0-alpha.5 → 4.0.0-alpha.6

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 (292) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/dist.min.js +2037 -1013
  3. package/dist/es5/bundle.js +6 -0
  4. package/dist/es5/bundle.js.map +1 -0
  5. package/dist/es5/glb-loader.js +56 -0
  6. package/dist/es5/glb-loader.js.map +1 -0
  7. package/dist/es5/glb-writer.js +35 -0
  8. package/dist/es5/glb-writer.js.map +1 -0
  9. package/dist/es5/gltf-loader.js +81 -0
  10. package/dist/es5/gltf-loader.js.map +1 -0
  11. package/dist/es5/gltf-writer.js +35 -0
  12. package/dist/es5/gltf-writer.js.map +1 -0
  13. package/dist/es5/index.js +49 -0
  14. package/dist/es5/index.js.map +1 -0
  15. package/dist/es5/lib/api/gltf-extensions.js +109 -0
  16. package/dist/es5/lib/api/gltf-extensions.js.map +1 -0
  17. package/dist/es5/lib/api/gltf-scenegraph.js +578 -0
  18. package/dist/es5/lib/api/gltf-scenegraph.js.map +1 -0
  19. package/dist/es5/lib/api/normalize-gltf-v1.js +331 -0
  20. package/dist/es5/lib/api/normalize-gltf-v1.js.map +1 -0
  21. package/dist/es5/lib/api/post-process-gltf.js +422 -0
  22. package/dist/es5/lib/api/post-process-gltf.js.map +1 -0
  23. package/dist/es5/lib/encoders/encode-glb.js +61 -0
  24. package/dist/es5/lib/encoders/encode-glb.js.map +1 -0
  25. package/dist/es5/lib/encoders/encode-gltf.js +21 -0
  26. package/dist/es5/lib/encoders/encode-gltf.js.map +1 -0
  27. package/dist/es5/lib/extensions/EXT_meshopt_compression.js +96 -0
  28. package/dist/es5/lib/extensions/EXT_meshopt_compression.js.map +1 -0
  29. package/dist/es5/lib/extensions/EXT_texture_webp.js +44 -0
  30. package/dist/es5/lib/extensions/EXT_texture_webp.js.map +1 -0
  31. package/dist/es5/lib/extensions/KHR_binary_gltf.js +40 -0
  32. package/dist/es5/lib/extensions/KHR_binary_gltf.js.map +1 -0
  33. package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js +246 -0
  34. package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js.map +1 -0
  35. package/dist/es5/lib/extensions/KHR_texture_basisu.js +37 -0
  36. package/dist/es5/lib/extensions/KHR_texture_basisu.js.map +1 -0
  37. package/dist/es5/lib/extensions/KHR_texture_transform.js +229 -0
  38. package/dist/es5/lib/extensions/KHR_texture_transform.js.map +1 -0
  39. package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js +103 -0
  40. package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  41. package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js +99 -0
  42. package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
  43. package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js +76 -0
  44. package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
  45. package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js +113 -0
  46. package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
  47. package/dist/es5/lib/gltf-utils/get-typed-array.js +23 -0
  48. package/dist/es5/lib/gltf-utils/get-typed-array.js.map +1 -0
  49. package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js +68 -0
  50. package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js.map +1 -0
  51. package/dist/es5/lib/gltf-utils/gltf-constants.js +48 -0
  52. package/dist/es5/lib/gltf-utils/gltf-constants.js.map +1 -0
  53. package/dist/es5/lib/gltf-utils/gltf-utils.js +62 -0
  54. package/dist/es5/lib/gltf-utils/gltf-utils.js.map +1 -0
  55. package/dist/es5/lib/gltf-utils/resolve-url.js +18 -0
  56. package/dist/es5/lib/gltf-utils/resolve-url.js.map +1 -0
  57. package/dist/es5/lib/parsers/parse-glb.js +120 -0
  58. package/dist/es5/lib/parsers/parse-glb.js.map +1 -0
  59. package/dist/es5/lib/parsers/parse-gltf.js +287 -0
  60. package/dist/es5/lib/parsers/parse-gltf.js.map +1 -0
  61. package/dist/es5/lib/types/glb-types.js +2 -0
  62. package/dist/es5/lib/types/glb-types.js.map +1 -0
  63. package/dist/es5/lib/types/gltf-json-schema.js +2 -0
  64. package/dist/es5/lib/types/gltf-json-schema.js.map +1 -0
  65. package/dist/es5/lib/types/gltf-postprocessed-schema.js +2 -0
  66. package/dist/es5/lib/types/gltf-postprocessed-schema.js.map +1 -0
  67. package/dist/es5/lib/types/gltf-types.js +2 -0
  68. package/dist/es5/lib/types/gltf-types.js.map +1 -0
  69. package/dist/es5/lib/utils/assert.js +12 -0
  70. package/dist/es5/lib/utils/assert.js.map +1 -0
  71. package/dist/es5/lib/utils/version.js +9 -0
  72. package/dist/es5/lib/utils/version.js.map +1 -0
  73. package/dist/es5/meshopt/meshopt-decoder.js +215 -0
  74. package/dist/es5/meshopt/meshopt-decoder.js.map +1 -0
  75. package/dist/es5/webp/webp.js +83 -0
  76. package/dist/es5/webp/webp.js.map +1 -0
  77. package/dist/esm/bundle.js +4 -0
  78. package/dist/esm/bundle.js.map +1 -0
  79. package/dist/esm/glb-loader.js +31 -0
  80. package/dist/esm/glb-loader.js.map +1 -0
  81. package/dist/esm/glb-writer.js +27 -0
  82. package/dist/esm/glb-writer.js.map +1 -0
  83. package/dist/esm/gltf-loader.js +51 -0
  84. package/dist/esm/gltf-loader.js.map +1 -0
  85. package/dist/esm/gltf-writer.js +28 -0
  86. package/dist/esm/gltf-writer.js.map +1 -0
  87. package/dist/esm/index.js +7 -0
  88. package/dist/esm/index.js.map +1 -0
  89. package/dist/esm/lib/api/gltf-extensions.js +35 -0
  90. package/dist/esm/lib/api/gltf-extensions.js.map +1 -0
  91. package/dist/esm/lib/api/gltf-scenegraph.js +441 -0
  92. package/dist/esm/lib/api/gltf-scenegraph.js.map +1 -0
  93. package/dist/esm/lib/api/normalize-gltf-v1.js +204 -0
  94. package/dist/esm/lib/api/normalize-gltf-v1.js.map +1 -0
  95. package/dist/esm/lib/api/post-process-gltf.js +341 -0
  96. package/dist/esm/lib/api/post-process-gltf.js.map +1 -0
  97. package/dist/esm/lib/encoders/encode-glb.js +54 -0
  98. package/dist/esm/lib/encoders/encode-glb.js.map +1 -0
  99. package/dist/esm/lib/encoders/encode-gltf.js +14 -0
  100. package/dist/esm/lib/encoders/encode-gltf.js.map +1 -0
  101. package/dist/esm/lib/extensions/EXT_meshopt_compression.js +42 -0
  102. package/dist/esm/lib/extensions/EXT_meshopt_compression.js.map +1 -0
  103. package/dist/esm/lib/extensions/EXT_texture_webp.js +25 -0
  104. package/dist/esm/lib/extensions/EXT_texture_webp.js.map +1 -0
  105. package/dist/esm/lib/extensions/KHR_binary_gltf.js +21 -0
  106. package/dist/esm/lib/extensions/KHR_binary_gltf.js.map +1 -0
  107. package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js +110 -0
  108. package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js.map +1 -0
  109. package/dist/esm/lib/extensions/KHR_texture_basisu.js +18 -0
  110. package/dist/esm/lib/extensions/KHR_texture_basisu.js.map +1 -0
  111. package/dist/esm/lib/extensions/KHR_texture_transform.js +181 -0
  112. package/dist/esm/lib/extensions/KHR_texture_transform.js.map +1 -0
  113. package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js +77 -0
  114. package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  115. package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js +42 -0
  116. package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
  117. package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js +33 -0
  118. package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
  119. package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js +61 -0
  120. package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
  121. package/dist/esm/lib/gltf-utils/get-typed-array.js +16 -0
  122. package/dist/esm/lib/gltf-utils/get-typed-array.js.map +1 -0
  123. package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js +62 -0
  124. package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js.map +1 -0
  125. package/dist/esm/lib/gltf-utils/gltf-constants.js +37 -0
  126. package/dist/esm/lib/gltf-utils/gltf-constants.js.map +1 -0
  127. package/dist/esm/lib/gltf-utils/gltf-utils.js +54 -0
  128. package/dist/esm/lib/gltf-utils/gltf-utils.js.map +1 -0
  129. package/dist/esm/lib/gltf-utils/resolve-url.js +12 -0
  130. package/dist/esm/lib/gltf-utils/resolve-url.js.map +1 -0
  131. package/dist/esm/lib/parsers/parse-glb.js +114 -0
  132. package/dist/esm/lib/parsers/parse-glb.js.map +1 -0
  133. package/dist/esm/lib/parsers/parse-gltf.js +156 -0
  134. package/dist/esm/lib/parsers/parse-gltf.js.map +1 -0
  135. package/dist/esm/lib/types/glb-types.js +2 -0
  136. package/dist/esm/lib/types/glb-types.js.map +1 -0
  137. package/dist/esm/lib/types/gltf-json-schema.js +2 -0
  138. package/dist/esm/lib/types/gltf-json-schema.js.map +1 -0
  139. package/dist/esm/lib/types/gltf-postprocessed-schema.js +2 -0
  140. package/dist/esm/lib/types/gltf-postprocessed-schema.js.map +1 -0
  141. package/dist/esm/lib/types/gltf-types.js +2 -0
  142. package/dist/esm/lib/types/gltf-types.js.map +1 -0
  143. package/dist/esm/lib/utils/assert.js +6 -0
  144. package/dist/esm/lib/utils/assert.js.map +1 -0
  145. package/dist/esm/lib/utils/version.js +2 -0
  146. package/dist/esm/lib/utils/version.js.map +1 -0
  147. package/dist/esm/meshopt/meshopt-decoder.js +91 -0
  148. package/dist/esm/meshopt/meshopt-decoder.js.map +1 -0
  149. package/dist/esm/meshopt/meshopt-encoder.ts.disabled +409 -0
  150. package/dist/esm/webp/webp.js +25 -0
  151. package/dist/esm/webp/webp.js.map +1 -0
  152. package/dist/glb-loader.d.ts +3 -2
  153. package/dist/glb-loader.d.ts.map +1 -1
  154. package/dist/glb-loader.js +33 -28
  155. package/dist/glb-writer.d.ts +7 -16
  156. package/dist/glb-writer.d.ts.map +1 -1
  157. package/dist/glb-writer.js +34 -26
  158. package/dist/gltf-loader.d.ts +3 -2
  159. package/dist/gltf-loader.d.ts.map +1 -1
  160. package/dist/gltf-loader.js +46 -43
  161. package/dist/gltf-writer.d.ts +2 -2
  162. package/dist/gltf-writer.d.ts.map +1 -1
  163. package/dist/gltf-writer.js +29 -26
  164. package/dist/index.d.ts +2 -1
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +21 -7
  167. package/dist/lib/api/gltf-extensions.d.ts +6 -1
  168. package/dist/lib/api/gltf-extensions.d.ts.map +1 -1
  169. package/dist/lib/api/gltf-extensions.js +79 -31
  170. package/dist/lib/api/gltf-scenegraph.d.ts +5 -11
  171. package/dist/lib/api/gltf-scenegraph.d.ts.map +1 -1
  172. package/dist/lib/api/gltf-scenegraph.js +563 -512
  173. package/dist/lib/api/normalize-gltf-v1.d.ts.map +1 -1
  174. package/dist/lib/api/normalize-gltf-v1.js +278 -229
  175. package/dist/lib/api/post-process-gltf.js +324 -376
  176. package/dist/lib/encoders/encode-glb.d.ts +2 -1
  177. package/dist/lib/encoders/encode-glb.d.ts.map +1 -1
  178. package/dist/lib/encoders/encode-glb.js +56 -58
  179. package/dist/lib/encoders/encode-gltf.d.ts +18 -0
  180. package/dist/lib/encoders/encode-gltf.d.ts.map +1 -1
  181. package/dist/lib/encoders/encode-gltf.js +33 -12
  182. package/dist/lib/extensions/EXT_meshopt_compression.d.ts +0 -3
  183. package/dist/lib/extensions/EXT_meshopt_compression.d.ts.map +1 -1
  184. package/dist/lib/extensions/EXT_meshopt_compression.js +39 -50
  185. package/dist/lib/extensions/EXT_texture_webp.d.ts.map +1 -1
  186. package/dist/lib/extensions/EXT_texture_webp.js +35 -28
  187. package/dist/lib/extensions/KHR_binary_gltf.js +39 -23
  188. package/dist/lib/extensions/KHR_draco_mesh_compression.js +126 -111
  189. package/dist/lib/extensions/KHR_texture_basisu.d.ts.map +1 -1
  190. package/dist/lib/extensions/KHR_texture_basisu.js +29 -19
  191. package/dist/lib/extensions/KHR_texture_transform.d.ts +13 -0
  192. package/dist/lib/extensions/KHR_texture_transform.d.ts.map +1 -0
  193. package/dist/lib/extensions/KHR_texture_transform.js +230 -0
  194. package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts +6 -0
  195. package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts.map +1 -0
  196. package/dist/lib/extensions/deprecated/EXT_feature_metadata.js +118 -0
  197. package/dist/lib/extensions/deprecated/KHR_lights_punctual.js +57 -44
  198. package/dist/lib/extensions/deprecated/KHR_materials_unlit.js +42 -32
  199. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.d.ts.map +1 -1
  200. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.js +76 -62
  201. package/dist/lib/gltf-utils/get-typed-array.js +39 -14
  202. package/dist/lib/gltf-utils/gltf-attribute-utils.js +65 -65
  203. package/dist/lib/gltf-utils/gltf-constants.d.ts +17 -0
  204. package/dist/lib/gltf-utils/gltf-constants.d.ts.map +1 -1
  205. package/dist/lib/gltf-utils/gltf-constants.js +38 -32
  206. package/dist/lib/gltf-utils/gltf-utils.js +52 -45
  207. package/dist/lib/gltf-utils/resolve-url.js +17 -15
  208. package/dist/lib/parsers/parse-glb.d.ts +1 -1
  209. package/dist/lib/parsers/parse-glb.d.ts.map +1 -1
  210. package/dist/lib/parsers/parse-glb.js +120 -107
  211. package/dist/lib/parsers/parse-gltf.d.ts +2 -2
  212. package/dist/lib/parsers/parse-gltf.d.ts.map +1 -1
  213. package/dist/lib/parsers/parse-gltf.js +187 -154
  214. package/dist/lib/types/glb-types.d.ts +3 -3
  215. package/dist/lib/types/glb-types.d.ts.map +1 -1
  216. package/dist/lib/types/glb-types.js +2 -2
  217. package/dist/lib/types/gltf-json-schema.d.ts +396 -11
  218. package/dist/lib/types/gltf-json-schema.d.ts.map +1 -1
  219. package/dist/lib/types/gltf-json-schema.js +4 -2
  220. package/dist/lib/types/gltf-postprocessed-schema.d.ts +10 -10
  221. package/dist/lib/types/gltf-postprocessed-schema.d.ts.map +1 -1
  222. package/dist/lib/types/gltf-postprocessed-schema.js +4 -2
  223. package/dist/lib/types/gltf-types.d.ts +8 -5
  224. package/dist/lib/types/gltf-types.d.ts.map +1 -1
  225. package/dist/lib/types/gltf-types.js +3 -2
  226. package/dist/lib/utils/assert.js +11 -5
  227. package/dist/lib/utils/version.js +7 -2
  228. package/dist/meshopt/meshopt-decoder.js +97 -82
  229. package/dist/webp/webp.d.ts +1 -1
  230. package/dist/webp/webp.d.ts.map +1 -1
  231. package/dist/webp/webp.js +32 -23
  232. package/package.json +9 -8
  233. package/src/glb-loader.ts +1 -1
  234. package/src/glb-writer.ts +9 -3
  235. package/src/gltf-writer.ts +2 -2
  236. package/src/index.ts +10 -1
  237. package/src/lib/api/gltf-extensions.ts +13 -2
  238. package/src/lib/api/gltf-scenegraph.ts +21 -12
  239. package/src/lib/api/normalize-gltf-v1.ts +2 -1
  240. package/src/lib/encoders/encode-glb.ts +8 -1
  241. package/src/lib/encoders/encode-gltf.ts +18 -9
  242. package/src/lib/extensions/EXT_meshopt_compression.ts +12 -19
  243. package/src/lib/extensions/EXT_texture_webp.ts +3 -2
  244. package/src/lib/extensions/KHR_binary_gltf.ts +1 -1
  245. package/src/lib/extensions/KHR_draco_mesh_compression.ts +1 -1
  246. package/src/lib/extensions/KHR_texture_basisu.ts +1 -0
  247. package/src/lib/extensions/KHR_texture_transform.ts +305 -0
  248. package/src/lib/extensions/deprecated/EXT_feature_metadata.ts +163 -0
  249. package/src/lib/extensions/deprecated/KHR_materials_unlit.ts +3 -3
  250. package/src/lib/extensions/deprecated/KHR_techniques_webgl.ts +1 -0
  251. package/src/lib/gltf-utils/gltf-constants.ts +2 -2
  252. package/src/lib/parsers/parse-gltf.ts +10 -1
  253. package/src/lib/types/glb-types.ts +1 -1
  254. package/src/lib/types/gltf-json-schema.ts +434 -5
  255. package/src/lib/types/gltf-postprocessed-schema.ts +9 -9
  256. package/src/lib/types/gltf-types.ts +24 -3
  257. package/dist/bundle.js.map +0 -1
  258. package/dist/glb-loader.js.map +0 -1
  259. package/dist/glb-writer.js.map +0 -1
  260. package/dist/gltf-loader.js.map +0 -1
  261. package/dist/gltf-writer.js.map +0 -1
  262. package/dist/index.js.map +0 -1
  263. package/dist/lib/api/gltf-extensions.js.map +0 -1
  264. package/dist/lib/api/gltf-scenegraph.js.map +0 -1
  265. package/dist/lib/api/normalize-gltf-v1.js.map +0 -1
  266. package/dist/lib/api/post-process-gltf.js.map +0 -1
  267. package/dist/lib/encoders/encode-glb.js.map +0 -1
  268. package/dist/lib/encoders/encode-gltf.js.map +0 -1
  269. package/dist/lib/extensions/EXT_meshopt_compression.js.map +0 -1
  270. package/dist/lib/extensions/EXT_texture_webp.js.map +0 -1
  271. package/dist/lib/extensions/KHR_binary_gltf.js.map +0 -1
  272. package/dist/lib/extensions/KHR_draco_mesh_compression.js.map +0 -1
  273. package/dist/lib/extensions/KHR_texture_basisu.js.map +0 -1
  274. package/dist/lib/extensions/deprecated/KHR_lights_punctual.js.map +0 -1
  275. package/dist/lib/extensions/deprecated/KHR_materials_unlit.js.map +0 -1
  276. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.js.map +0 -1
  277. package/dist/lib/gltf-utils/get-typed-array.js.map +0 -1
  278. package/dist/lib/gltf-utils/gltf-attribute-utils.js.map +0 -1
  279. package/dist/lib/gltf-utils/gltf-constants.js.map +0 -1
  280. package/dist/lib/gltf-utils/gltf-utils.js.map +0 -1
  281. package/dist/lib/gltf-utils/resolve-url.js.map +0 -1
  282. package/dist/lib/parsers/parse-glb.js.map +0 -1
  283. package/dist/lib/parsers/parse-gltf.js.map +0 -1
  284. package/dist/lib/types/glb-types.js.map +0 -1
  285. package/dist/lib/types/gltf-json-schema.js.map +0 -1
  286. package/dist/lib/types/gltf-postprocessed-schema.js.map +0 -1
  287. package/dist/lib/types/gltf-types.js.map +0 -1
  288. package/dist/lib/utils/assert.js.map +0 -1
  289. package/dist/lib/utils/version.js.map +0 -1
  290. package/dist/meshopt/meshopt-decoder.js.map +0 -1
  291. package/dist/webp/webp.js.map +0 -1
  292. /package/dist/{meshopt → es5/meshopt}/meshopt-encoder.ts.disabled +0 -0
@@ -1,515 +1,566 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { getBinaryImageMetadata } from '@loaders.gl/images';
3
- import { padToNBytes, copyToArray } from '@loaders.gl/loader-utils';
4
- import { assert } from '../utils/assert';
5
- import { getAccessorArrayTypeAndLength, getAccessorTypeFromSize, getComponentTypeFromArray } from '../gltf-utils/gltf-utils';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const images_1 = require("@loaders.gl/images");
4
+ const loader_utils_1 = require("@loaders.gl/loader-utils");
5
+ const assert_1 = require("../utils/assert");
6
+ const gltf_utils_1 = require("../gltf-utils/gltf-utils");
6
7
  const DEFAULT_GLTF_JSON = {
7
- asset: {
8
- version: '2.0',
9
- generator: 'loaders.gl'
10
- },
11
- buffers: []
8
+ asset: {
9
+ version: '2.0',
10
+ generator: 'loaders.gl'
11
+ },
12
+ buffers: []
12
13
  };
13
- export default class GLTFScenegraph {
14
- constructor(gltf) {
15
- _defineProperty(this, "gltf", void 0);
16
-
17
- _defineProperty(this, "sourceBuffers", void 0);
18
-
19
- _defineProperty(this, "byteLength", void 0);
20
-
21
- this.gltf = gltf || {
22
- json: { ...DEFAULT_GLTF_JSON
23
- },
24
- buffers: []
25
- };
26
- this.sourceBuffers = [];
27
- this.byteLength = 0;
28
-
29
- if (this.gltf.buffers && this.gltf.buffers[0]) {
30
- this.byteLength = this.gltf.buffers[0].byteLength;
31
- this.sourceBuffers = [this.gltf.buffers[0]];
32
- }
33
- }
34
-
35
- get json() {
36
- return this.gltf.json;
37
- }
38
-
39
- getApplicationData(key) {
40
- const data = this.json[key];
41
- return data;
42
- }
43
-
44
- getExtraData(key) {
45
- const extras = this.json.extras || {};
46
- return extras[key];
47
- }
48
-
49
- getExtension(extensionName) {
50
- const isExtension = this.getUsedExtensions().find(name => name === extensionName);
51
- const extensions = this.json.extensions || {};
52
- return isExtension ? extensions[extensionName] || true : null;
53
- }
54
-
55
- getRequiredExtension(extensionName) {
56
- const isRequired = this.getRequiredExtensions().find(name => name === extensionName);
57
- return isRequired ? this.getExtension(extensionName) : null;
58
- }
59
-
60
- getRequiredExtensions() {
61
- return this.json.extensionsRequired || [];
62
- }
63
-
64
- getUsedExtensions() {
65
- return this.json.extensionsUsed || [];
66
- }
67
-
68
- getObjectExtension(object, extensionName) {
69
- const extensions = object.extensions || {};
70
- return extensions[extensionName];
71
- }
72
-
73
- getScene(index) {
74
- return this.getObject('scenes', index);
75
- }
76
-
77
- getNode(index) {
78
- return this.getObject('nodes', index);
79
- }
80
-
81
- getSkin(index) {
82
- return this.getObject('skins', index);
83
- }
84
-
85
- getMesh(index) {
86
- return this.getObject('meshes', index);
87
- }
88
-
89
- getMaterial(index) {
90
- return this.getObject('materials', index);
91
- }
92
-
93
- getAccessor(index) {
94
- return this.getObject('accessors', index);
95
- }
96
-
97
- getTexture(index) {
98
- return this.getObject('textures', index);
99
- }
100
-
101
- getSampler(index) {
102
- return this.getObject('samplers', index);
103
- }
104
-
105
- getImage(index) {
106
- return this.getObject('images', index);
107
- }
108
-
109
- getBufferView(index) {
110
- return this.getObject('bufferViews', index);
111
- }
112
-
113
- getBuffer(index) {
114
- return this.getObject('buffers', index);
115
- }
116
-
117
- getObject(array, index) {
118
- if (typeof index === 'object') {
119
- return index;
120
- }
121
-
122
- const object = this.json[array] && this.json[array][index];
123
-
124
- if (!object) {
125
- throw new Error("glTF file error: Could not find ".concat(array, "[").concat(index, "]"));
126
- }
127
-
128
- return object;
129
- }
130
-
131
- getTypedArrayForBufferView(bufferView) {
132
- bufferView = this.getBufferView(bufferView);
133
- const bufferIndex = bufferView.buffer;
134
- const binChunk = this.gltf.buffers[bufferIndex];
135
- assert(binChunk);
136
- const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;
137
- return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);
138
- }
139
-
140
- getTypedArrayForAccessor(accessor) {
141
- accessor = this.getAccessor(accessor);
142
- const bufferView = this.getBufferView(accessor.bufferView);
143
- const buffer = this.getBuffer(bufferView.buffer);
144
- const arrayBuffer = buffer.data;
145
- const {
146
- ArrayType,
147
- length
148
- } = getAccessorArrayTypeAndLength(accessor, bufferView);
149
- const byteOffset = bufferView.byteOffset + accessor.byteOffset;
150
- return new ArrayType(arrayBuffer, byteOffset, length);
151
- }
152
-
153
- getTypedArrayForImageData(image) {
154
- image = this.getAccessor(image);
155
- const bufferView = this.getBufferView(image.bufferView);
156
- const buffer = this.getBuffer(bufferView.buffer);
157
- const arrayBuffer = buffer.data;
158
- const byteOffset = bufferView.byteOffset || 0;
159
- return new Uint8Array(arrayBuffer, byteOffset, bufferView.byteLength);
160
- }
161
-
162
- addApplicationData(key, data) {
163
- this.json[key] = data;
164
- return this;
165
- }
166
-
167
- addExtraData(key, data) {
168
- this.json.extras = this.json.extras || {};
169
- this.json.extras[key] = data;
170
- return this;
171
- }
172
-
173
- addObjectExtension(object, extensionName, data) {
174
- object.extensions = object.extensions || {};
175
- object.extensions[extensionName] = data;
176
- this.registerUsedExtension(extensionName);
177
- return this;
178
- }
179
-
180
- setObjectExtension(object, extensionName, data) {
181
- const extensions = object.extensions || {};
182
- extensions[extensionName] = data;
183
- }
184
-
185
- removeObjectExtension(object, extensionName) {
186
- const extensions = object.extensions || {};
187
- const extension = extensions[extensionName];
188
- delete extensions[extensionName];
189
- return extension;
190
- }
191
-
192
- addExtension(extensionName, extensionData = {}) {
193
- assert(extensionData);
194
- this.json.extensions = this.json.extensions || {};
195
- this.json.extensions[extensionName] = extensionData;
196
- this.registerUsedExtension(extensionName);
197
- return extensionData;
198
- }
199
-
200
- addRequiredExtension(extensionName, extensionData = {}) {
201
- assert(extensionData);
202
- this.addExtension(extensionName, extensionData);
203
- this.registerRequiredExtension(extensionName);
204
- return extensionData;
205
- }
206
-
207
- registerUsedExtension(extensionName) {
208
- this.json.extensionsUsed = this.json.extensionsUsed || [];
209
-
210
- if (!this.json.extensionsUsed.find(ext => ext === extensionName)) {
211
- this.json.extensionsUsed.push(extensionName);
212
- }
213
- }
214
-
215
- registerRequiredExtension(extensionName) {
216
- this.registerUsedExtension(extensionName);
217
- this.json.extensionsRequired = this.json.extensionsRequired || [];
218
-
219
- if (!this.json.extensionsRequired.find(ext => ext === extensionName)) {
220
- this.json.extensionsRequired.push(extensionName);
221
- }
222
- }
223
-
224
- removeExtension(extensionName) {
225
- if (this.json.extensionsRequired) {
226
- this._removeStringFromArray(this.json.extensionsRequired, extensionName);
227
- }
228
-
229
- if (this.json.extensionsUsed) {
230
- this._removeStringFromArray(this.json.extensionsUsed, extensionName);
231
- }
232
-
233
- if (this.json.extensions) {
234
- delete this.json.extensions[extensionName];
235
- }
236
- }
237
-
238
- setDefaultScene(sceneIndex) {
239
- this.json.scene = sceneIndex;
240
- }
241
-
242
- addScene(scene) {
243
- const {
244
- nodeIndices
245
- } = scene;
246
- this.json.scenes = this.json.scenes || [];
247
- this.json.scenes.push({
248
- nodes: nodeIndices
249
- });
250
- return this.json.scenes.length - 1;
251
- }
252
-
253
- addNode(node) {
254
- const {
255
- meshIndex,
256
- matrix
257
- } = node;
258
- this.json.nodes = this.json.nodes || [];
259
- const nodeData = {
260
- mesh: meshIndex
261
- };
262
-
263
- if (matrix) {
264
- nodeData.matrix = matrix;
265
- }
266
-
267
- this.json.nodes.push(nodeData);
268
- return this.json.nodes.length - 1;
269
- }
270
-
271
- addMesh(mesh) {
272
- const {
273
- attributes,
274
- indices,
275
- material,
276
- mode = 4
277
- } = mesh;
278
-
279
- const accessors = this._addAttributes(attributes);
280
-
281
- const glTFMesh = {
282
- primitives: [{
283
- attributes: accessors,
284
- mode
285
- }]
286
- };
287
-
288
- if (indices) {
289
- const indicesAccessor = this._addIndices(indices);
290
-
291
- glTFMesh.primitives[0].indices = indicesAccessor;
292
- }
293
-
294
- if (Number.isFinite(material)) {
295
- glTFMesh.primitives[0].material = material;
296
- }
297
-
298
- this.json.meshes = this.json.meshes || [];
299
- this.json.meshes.push(glTFMesh);
300
- return this.json.meshes.length - 1;
301
- }
302
-
303
- addPointCloud(attributes) {
304
- const accessorIndices = this._addAttributes(attributes);
305
-
306
- const glTFMesh = {
307
- primitives: [{
308
- attributes: accessorIndices,
309
- mode: 0
310
- }]
311
- };
312
- this.json.meshes = this.json.meshes || [];
313
- this.json.meshes.push(glTFMesh);
314
- return this.json.meshes.length - 1;
315
- }
316
-
317
- addImage(imageData, mimeTypeOpt) {
318
- const metadata = getBinaryImageMetadata(imageData);
319
- const mimeType = mimeTypeOpt || (metadata === null || metadata === void 0 ? void 0 : metadata.mimeType);
320
- const bufferViewIndex = this.addBufferView(imageData);
321
- const glTFImage = {
322
- bufferView: bufferViewIndex,
323
- mimeType
324
- };
325
- this.json.images = this.json.images || [];
326
- this.json.images.push(glTFImage);
327
- return this.json.images.length - 1;
328
- }
329
-
330
- addBufferView(buffer) {
331
- const byteLength = buffer.byteLength;
332
- assert(Number.isFinite(byteLength));
333
- this.sourceBuffers = this.sourceBuffers || [];
334
- this.sourceBuffers.push(buffer);
335
- const glTFBufferView = {
336
- buffer: 0,
337
- byteOffset: this.byteLength,
338
- byteLength
339
- };
340
- this.byteLength += padToNBytes(byteLength, 4);
341
- this.json.bufferViews = this.json.bufferViews || [];
342
- this.json.bufferViews.push(glTFBufferView);
343
- return this.json.bufferViews.length - 1;
344
- }
345
-
346
- addAccessor(bufferViewIndex, accessor) {
347
- const glTFAccessor = {
348
- bufferView: bufferViewIndex,
349
- type: getAccessorTypeFromSize(accessor.size),
350
- componentType: accessor.componentType,
351
- count: accessor.count,
352
- max: accessor.max,
353
- min: accessor.min
354
- };
355
- this.json.accessors = this.json.accessors || [];
356
- this.json.accessors.push(glTFAccessor);
357
- return this.json.accessors.length - 1;
358
- }
359
-
360
- addBinaryBuffer(sourceBuffer, accessor = {
361
- size: 3
362
- }) {
363
- const bufferViewIndex = this.addBufferView(sourceBuffer);
364
- let minMax = {
365
- min: accessor.min,
366
- max: accessor.max
367
- };
368
-
369
- if (!minMax.min || !minMax.max) {
370
- minMax = this._getAccessorMinMax(sourceBuffer, accessor.size);
371
- }
372
-
373
- const accessorDefaults = {
374
- size: accessor.size,
375
- componentType: getComponentTypeFromArray(sourceBuffer),
376
- count: Math.round(sourceBuffer.length / accessor.size),
377
- min: minMax.min,
378
- max: minMax.max
379
- };
380
- return this.addAccessor(bufferViewIndex, Object.assign(accessorDefaults, accessor));
381
- }
382
-
383
- addTexture(texture) {
384
- const {
385
- imageIndex
386
- } = texture;
387
- const glTFTexture = {
388
- source: imageIndex
389
- };
390
- this.json.textures = this.json.textures || [];
391
- this.json.textures.push(glTFTexture);
392
- return this.json.textures.length - 1;
393
- }
394
-
395
- addMaterial(pbrMaterialInfo) {
396
- this.json.materials = this.json.materials || [];
397
- this.json.materials.push(pbrMaterialInfo);
398
- return this.json.materials.length - 1;
399
- }
400
-
401
- createBinaryChunk() {
402
- var _this$json, _this$json$buffers;
403
-
404
- this.gltf.buffers = [];
405
- const totalByteLength = this.byteLength;
406
- const arrayBuffer = new ArrayBuffer(totalByteLength);
407
- const targetArray = new Uint8Array(arrayBuffer);
408
- let dstByteOffset = 0;
409
-
410
- for (const sourceBuffer of this.sourceBuffers || []) {
411
- dstByteOffset = copyToArray(sourceBuffer, targetArray, dstByteOffset);
412
- }
413
-
414
- if ((_this$json = this.json) !== null && _this$json !== void 0 && (_this$json$buffers = _this$json.buffers) !== null && _this$json$buffers !== void 0 && _this$json$buffers[0]) {
415
- this.json.buffers[0].byteLength = totalByteLength;
416
- } else {
417
- this.json.buffers = [{
418
- byteLength: totalByteLength
419
- }];
420
- }
421
-
422
- this.gltf.binary = arrayBuffer;
423
- this.sourceBuffers = [arrayBuffer];
424
- }
425
-
426
- _removeStringFromArray(array, string) {
427
- let found = true;
428
-
429
- while (found) {
430
- const index = array.indexOf(string);
431
-
432
- if (index > -1) {
433
- array.splice(index, 1);
434
- } else {
435
- found = false;
436
- }
437
- }
438
- }
439
-
440
- _addAttributes(attributes = {}) {
441
- const result = {};
442
-
443
- for (const attributeKey in attributes) {
444
- const attributeData = attributes[attributeKey];
445
-
446
- const attrName = this._getGltfAttributeName(attributeKey);
447
-
448
- const accessor = this.addBinaryBuffer(attributeData.value, attributeData);
449
- result[attrName] = accessor;
450
- }
451
-
452
- return result;
453
- }
454
-
455
- _addIndices(indices) {
456
- return this.addBinaryBuffer(indices, {
457
- size: 1
458
- });
459
- }
460
-
461
- _getGltfAttributeName(attributeName) {
462
- switch (attributeName.toLowerCase()) {
463
- case 'position':
464
- case 'positions':
465
- case 'vertices':
466
- return 'POSITION';
467
-
468
- case 'normal':
469
- case 'normals':
470
- return 'NORMAL';
471
-
472
- case 'color':
473
- case 'colors':
474
- return 'COLOR_0';
475
-
476
- case 'texcoord':
477
- case 'texcoords':
478
- return 'TEXCOORD_0';
479
-
480
- default:
481
- return attributeName;
482
- }
483
- }
484
-
485
- _getAccessorMinMax(buffer, size) {
486
- const result = {
487
- min: null,
488
- max: null
489
- };
490
-
491
- if (buffer.length < size) {
492
- return result;
493
- }
494
-
495
- result.min = [];
496
- result.max = [];
497
- const initValues = buffer.subarray(0, size);
498
-
499
- for (const value of initValues) {
500
- result.min.push(value);
501
- result.max.push(value);
502
- }
503
-
504
- for (let index = size; index < buffer.length; index += size) {
505
- for (let componentIndex = 0; componentIndex < size; componentIndex++) {
506
- result.min[0 + componentIndex] = Math.min(result.min[0 + componentIndex], buffer[index + componentIndex]);
507
- result.max[0 + componentIndex] = Math.max(result.max[0 + componentIndex], buffer[index + componentIndex]);
508
- }
509
- }
510
-
511
- return result;
512
- }
513
-
14
+ /**
15
+ * Class for structured access to GLTF data
16
+ */
17
+ class GLTFScenegraph {
18
+ constructor(gltf) {
19
+ // @ts-ignore
20
+ this.gltf = gltf || {
21
+ json: { ...DEFAULT_GLTF_JSON },
22
+ buffers: []
23
+ };
24
+ this.sourceBuffers = [];
25
+ this.byteLength = 0;
26
+ // Initialize buffers
27
+ if (this.gltf.buffers && this.gltf.buffers[0]) {
28
+ this.byteLength = this.gltf.buffers[0].byteLength;
29
+ this.sourceBuffers = [this.gltf.buffers[0]];
30
+ }
31
+ }
32
+ // Accessors
33
+ get json() {
34
+ return this.gltf.json;
35
+ }
36
+ getApplicationData(key) {
37
+ // TODO - Data is already unpacked by GLBParser
38
+ const data = this.json[key];
39
+ return data;
40
+ }
41
+ getExtraData(key) {
42
+ // TODO - Data is already unpacked by GLBParser
43
+ const extras = this.json.extras || {};
44
+ return extras[key];
45
+ }
46
+ getExtension(extensionName) {
47
+ const isExtension = this.getUsedExtensions().find((name) => name === extensionName);
48
+ const extensions = this.json.extensions || {};
49
+ return isExtension ? extensions[extensionName] || true : null;
50
+ }
51
+ getRequiredExtension(extensionName) {
52
+ const isRequired = this.getRequiredExtensions().find((name) => name === extensionName);
53
+ return isRequired ? this.getExtension(extensionName) : null;
54
+ }
55
+ getRequiredExtensions() {
56
+ return this.json.extensionsRequired || [];
57
+ }
58
+ getUsedExtensions() {
59
+ return this.json.extensionsUsed || [];
60
+ }
61
+ getRemovedExtensions() {
62
+ return (this.json.extensionsRemoved || []);
63
+ }
64
+ getObjectExtension(object, extensionName) {
65
+ const extensions = object.extensions || {};
66
+ return extensions[extensionName];
67
+ }
68
+ getScene(index) {
69
+ return this.getObject('scenes', index);
70
+ }
71
+ getNode(index) {
72
+ return this.getObject('nodes', index);
73
+ }
74
+ getSkin(index) {
75
+ return this.getObject('skins', index);
76
+ }
77
+ getMesh(index) {
78
+ return this.getObject('meshes', index);
79
+ }
80
+ getMaterial(index) {
81
+ return this.getObject('materials', index);
82
+ }
83
+ getAccessor(index) {
84
+ return this.getObject('accessors', index);
85
+ }
86
+ // getCamera(index: number): object | null {
87
+ // return null; // TODO: fix thi: object as null;
88
+ // }
89
+ getTexture(index) {
90
+ return this.getObject('textures', index);
91
+ }
92
+ getSampler(index) {
93
+ return this.getObject('samplers', index);
94
+ }
95
+ getImage(index) {
96
+ return this.getObject('images', index);
97
+ }
98
+ getBufferView(index) {
99
+ return this.getObject('bufferViews', index);
100
+ }
101
+ getBuffer(index) {
102
+ return this.getObject('buffers', index);
103
+ }
104
+ getObject(array, index) {
105
+ // check if already resolved
106
+ if (typeof index === 'object') {
107
+ return index;
108
+ }
109
+ const object = this.json[array] && this.json[array][index];
110
+ if (!object) {
111
+ throw new Error(`glTF file error: Could not find ${array}[${index}]`); // eslint-disable-line
112
+ }
113
+ return object;
114
+ }
115
+ /**
116
+ * Accepts buffer view index or buffer view object
117
+ * @returns a `Uint8Array`
118
+ */
119
+ getTypedArrayForBufferView(bufferView) {
120
+ bufferView = this.getBufferView(bufferView);
121
+ // @ts-ignore
122
+ const bufferIndex = bufferView.buffer;
123
+ // Get hold of the arrayBuffer
124
+ // const buffer = this.getBuffer(bufferIndex);
125
+ const binChunk = this.gltf.buffers[bufferIndex];
126
+ (0, assert_1.assert)(binChunk);
127
+ // @ts-ignore
128
+ const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;
129
+ // @ts-ignore
130
+ return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);
131
+ }
132
+ /** Accepts accessor index or accessor object
133
+ * @returns a typed array with type that matches the types
134
+ */
135
+ getTypedArrayForAccessor(accessor) {
136
+ // @ts-ignore
137
+ accessor = this.getAccessor(accessor);
138
+ // @ts-ignore
139
+ const bufferView = this.getBufferView(accessor.bufferView);
140
+ const buffer = this.getBuffer(bufferView.buffer);
141
+ // @ts-ignore
142
+ const arrayBuffer = buffer.data;
143
+ // Create a new typed array as a view into the combined buffer
144
+ const { ArrayType, length } = (0, gltf_utils_1.getAccessorArrayTypeAndLength)(accessor, bufferView);
145
+ // @ts-ignore
146
+ const byteOffset = bufferView.byteOffset + accessor.byteOffset;
147
+ return new ArrayType(arrayBuffer, byteOffset, length);
148
+ }
149
+ /** accepts accessor index or accessor object
150
+ * returns a `Uint8Array`
151
+ */
152
+ getTypedArrayForImageData(image) {
153
+ // @ts-ignore
154
+ image = this.getAccessor(image);
155
+ // @ts-ignore
156
+ const bufferView = this.getBufferView(image.bufferView);
157
+ const buffer = this.getBuffer(bufferView.buffer);
158
+ // @ts-ignore
159
+ const arrayBuffer = buffer.data;
160
+ const byteOffset = bufferView.byteOffset || 0;
161
+ return new Uint8Array(arrayBuffer, byteOffset, bufferView.byteLength);
162
+ }
163
+ // MODIFERS
164
+ /**
165
+ * Add an extra application-defined key to the top-level data structure
166
+ */
167
+ addApplicationData(key, data) {
168
+ this.json[key] = data;
169
+ return this;
170
+ }
171
+ /**
172
+ * `extras` - Standard GLTF field for storing application specific data
173
+ */
174
+ addExtraData(key, data) {
175
+ this.json.extras = this.json.extras || {};
176
+ this.json.extras[key] = data;
177
+ return this;
178
+ }
179
+ addObjectExtension(object, extensionName, data) {
180
+ // @ts-ignore
181
+ object.extensions = object.extensions || {};
182
+ // TODO - clobber or merge?
183
+ // @ts-ignore
184
+ object.extensions[extensionName] = data;
185
+ this.registerUsedExtension(extensionName);
186
+ return this;
187
+ }
188
+ setObjectExtension(object, extensionName, data) {
189
+ // @ts-ignore
190
+ const extensions = object.extensions || {};
191
+ extensions[extensionName] = data;
192
+ // TODO - add to usedExtensions...
193
+ }
194
+ removeObjectExtension(object, extensionName) {
195
+ // @ts-ignore
196
+ const extensions = object.extensions || {};
197
+ const extension = extensions[extensionName];
198
+ delete extensions[extensionName];
199
+ return extension;
200
+ }
201
+ /**
202
+ * Add to standard GLTF top level extension object, mark as used
203
+ */
204
+ addExtension(extensionName, extensionData = {}) {
205
+ (0, assert_1.assert)(extensionData);
206
+ this.json.extensions = this.json.extensions || {};
207
+ this.json.extensions[extensionName] = extensionData;
208
+ this.registerUsedExtension(extensionName);
209
+ return extensionData;
210
+ }
211
+ /**
212
+ * Standard GLTF top level extension object, mark as used and required
213
+ */
214
+ addRequiredExtension(extensionName, extensionData = {}) {
215
+ (0, assert_1.assert)(extensionData);
216
+ this.addExtension(extensionName, extensionData);
217
+ this.registerRequiredExtension(extensionName);
218
+ return extensionData;
219
+ }
220
+ /**
221
+ * Add extensionName to list of used extensions
222
+ */
223
+ registerUsedExtension(extensionName) {
224
+ this.json.extensionsUsed = this.json.extensionsUsed || [];
225
+ if (!this.json.extensionsUsed.find((ext) => ext === extensionName)) {
226
+ this.json.extensionsUsed.push(extensionName);
227
+ }
228
+ }
229
+ /**
230
+ * Add extensionName to list of required extensions
231
+ */
232
+ registerRequiredExtension(extensionName) {
233
+ this.registerUsedExtension(extensionName);
234
+ this.json.extensionsRequired = this.json.extensionsRequired || [];
235
+ if (!this.json.extensionsRequired.find((ext) => ext === extensionName)) {
236
+ this.json.extensionsRequired.push(extensionName);
237
+ }
238
+ }
239
+ /**
240
+ * Removes an extension from the top-level list
241
+ */
242
+ removeExtension(extensionName) {
243
+ if (!this.getExtension(extensionName)) {
244
+ return;
245
+ }
246
+ if (this.json.extensionsRequired) {
247
+ this._removeStringFromArray(this.json.extensionsRequired, extensionName);
248
+ }
249
+ if (this.json.extensionsUsed) {
250
+ this._removeStringFromArray(this.json.extensionsUsed, extensionName);
251
+ }
252
+ if (this.json.extensions) {
253
+ delete this.json.extensions[extensionName];
254
+ }
255
+ if (!Array.isArray(this.json.extensionsRemoved)) {
256
+ this.json.extensionsRemoved = [];
257
+ }
258
+ const extensionsRemoved = this.json.extensionsRemoved;
259
+ if (!extensionsRemoved.includes(extensionName)) {
260
+ extensionsRemoved.push(extensionName);
261
+ }
262
+ }
263
+ /**
264
+ * Set default scene which is to be displayed at load time
265
+ */
266
+ setDefaultScene(sceneIndex) {
267
+ this.json.scene = sceneIndex;
268
+ }
269
+ /**
270
+ * @todo: add more properties for scene initialization:
271
+ * name`, `extensions`, `extras`
272
+ * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-scene
273
+ */
274
+ addScene(scene) {
275
+ const { nodeIndices } = scene;
276
+ this.json.scenes = this.json.scenes || [];
277
+ this.json.scenes.push({ nodes: nodeIndices });
278
+ return this.json.scenes.length - 1;
279
+ }
280
+ /**
281
+ * @todo: add more properties for node initialization:
282
+ * `name`, `extensions`, `extras`, `camera`, `children`, `skin`, `rotation`, `scale`, `translation`, `weights`
283
+ * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#node
284
+ */
285
+ addNode(node) {
286
+ const { meshIndex, matrix } = node;
287
+ this.json.nodes = this.json.nodes || [];
288
+ const nodeData = { mesh: meshIndex };
289
+ if (matrix) {
290
+ // @ts-ignore
291
+ nodeData.matrix = matrix;
292
+ }
293
+ this.json.nodes.push(nodeData);
294
+ return this.json.nodes.length - 1;
295
+ }
296
+ /** Adds a mesh to the json part */
297
+ addMesh(mesh) {
298
+ const { attributes, indices, material, mode = 4 } = mesh;
299
+ const accessors = this._addAttributes(attributes);
300
+ const glTFMesh = {
301
+ primitives: [
302
+ {
303
+ attributes: accessors,
304
+ mode
305
+ }
306
+ ]
307
+ };
308
+ if (indices) {
309
+ const indicesAccessor = this._addIndices(indices);
310
+ // @ts-ignore
311
+ glTFMesh.primitives[0].indices = indicesAccessor;
312
+ }
313
+ if (Number.isFinite(material)) {
314
+ // @ts-ignore
315
+ glTFMesh.primitives[0].material = material;
316
+ }
317
+ this.json.meshes = this.json.meshes || [];
318
+ this.json.meshes.push(glTFMesh);
319
+ return this.json.meshes.length - 1;
320
+ }
321
+ addPointCloud(attributes) {
322
+ // @ts-ignore
323
+ const accessorIndices = this._addAttributes(attributes);
324
+ const glTFMesh = {
325
+ primitives: [
326
+ {
327
+ attributes: accessorIndices,
328
+ mode: 0 // GL.POINTS
329
+ }
330
+ ]
331
+ };
332
+ this.json.meshes = this.json.meshes || [];
333
+ this.json.meshes.push(glTFMesh);
334
+ return this.json.meshes.length - 1;
335
+ }
336
+ /**
337
+ * Adds a binary image. Builds glTF "JSON metadata" and saves buffer reference
338
+ * Buffer will be copied into BIN chunk during "pack"
339
+ * Currently encodes as glTF image
340
+ * @param imageData
341
+ * @param mimeType
342
+ */
343
+ addImage(imageData, mimeTypeOpt) {
344
+ // If image is referencing a bufferView instead of URI, mimeType must be defined:
345
+ // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#images
346
+ // "a reference to a bufferView; in that case mimeType must be defined."
347
+ const metadata = (0, images_1.getBinaryImageMetadata)(imageData);
348
+ const mimeType = mimeTypeOpt || metadata?.mimeType;
349
+ const bufferViewIndex = this.addBufferView(imageData);
350
+ const glTFImage = {
351
+ bufferView: bufferViewIndex,
352
+ mimeType
353
+ };
354
+ this.json.images = this.json.images || [];
355
+ this.json.images.push(glTFImage);
356
+ return this.json.images.length - 1;
357
+ }
358
+ /**
359
+ * Add one untyped source buffer, create a matching glTF `bufferView`, and return its index
360
+ * @param buffer
361
+ */
362
+ addBufferView(buffer) {
363
+ const byteLength = buffer.byteLength;
364
+ (0, assert_1.assert)(Number.isFinite(byteLength));
365
+ // Add this buffer to the list of buffers to be written to the body.
366
+ this.sourceBuffers = this.sourceBuffers || [];
367
+ this.sourceBuffers.push(buffer);
368
+ const glTFBufferView = {
369
+ buffer: 0,
370
+ // Write offset from the start of the binary body
371
+ byteOffset: this.byteLength,
372
+ byteLength
373
+ };
374
+ // We've now added the contents to the body, so update the total length
375
+ // Every sub-chunk needs to be 4-byte align ed
376
+ this.byteLength += (0, loader_utils_1.padToNBytes)(byteLength, 4);
377
+ // Add a bufferView indicating start and length of this binary sub-chunk
378
+ this.json.bufferViews = this.json.bufferViews || [];
379
+ this.json.bufferViews.push(glTFBufferView);
380
+ return this.json.bufferViews.length - 1;
381
+ }
382
+ /**
383
+ * Adds an accessor to a bufferView
384
+ * @param bufferViewIndex
385
+ * @param accessor
386
+ */
387
+ addAccessor(bufferViewIndex, accessor) {
388
+ const glTFAccessor = {
389
+ bufferView: bufferViewIndex,
390
+ // @ts-ignore
391
+ type: (0, gltf_utils_1.getAccessorTypeFromSize)(accessor.size),
392
+ // @ts-ignore
393
+ componentType: accessor.componentType,
394
+ // @ts-ignore
395
+ count: accessor.count,
396
+ // @ts-ignore
397
+ max: accessor.max,
398
+ // @ts-ignore
399
+ min: accessor.min
400
+ };
401
+ this.json.accessors = this.json.accessors || [];
402
+ this.json.accessors.push(glTFAccessor);
403
+ return this.json.accessors.length - 1;
404
+ }
405
+ /**
406
+ * Add a binary buffer. Builds glTF "JSON metadata" and saves buffer reference
407
+ * Buffer will be copied into BIN chunk during "pack"
408
+ * Currently encodes buffers as glTF accessors, but this could be optimized
409
+ * @param sourceBuffer
410
+ * @param accessor
411
+ */
412
+ addBinaryBuffer(sourceBuffer, accessor = { size: 3 }) {
413
+ const bufferViewIndex = this.addBufferView(sourceBuffer);
414
+ // @ts-ignore
415
+ let minMax = { min: accessor.min, max: accessor.max };
416
+ if (!minMax.min || !minMax.max) {
417
+ // @ts-ignore
418
+ minMax = this._getAccessorMinMax(sourceBuffer, accessor.size);
419
+ }
420
+ const accessorDefaults = {
421
+ // @ts-ignore
422
+ size: accessor.size,
423
+ componentType: (0, gltf_utils_1.getComponentTypeFromArray)(sourceBuffer),
424
+ // @ts-ignore
425
+ count: Math.round(sourceBuffer.length / accessor.size),
426
+ min: minMax.min,
427
+ max: minMax.max
428
+ };
429
+ return this.addAccessor(bufferViewIndex, Object.assign(accessorDefaults, accessor));
430
+ }
431
+ /**
432
+ * Adds a texture to the json part
433
+ * @todo: add more properties for texture initialization
434
+ * `sampler`, `name`, `extensions`, `extras`
435
+ * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#texture
436
+ */
437
+ addTexture(texture) {
438
+ const { imageIndex } = texture;
439
+ const glTFTexture = {
440
+ source: imageIndex
441
+ };
442
+ this.json.textures = this.json.textures || [];
443
+ this.json.textures.push(glTFTexture);
444
+ return this.json.textures.length - 1;
445
+ }
446
+ /** Adds a material to the json part */
447
+ addMaterial(pbrMaterialInfo) {
448
+ this.json.materials = this.json.materials || [];
449
+ this.json.materials.push(pbrMaterialInfo);
450
+ return this.json.materials.length - 1;
451
+ }
452
+ /** Pack the binary chunk */
453
+ createBinaryChunk() {
454
+ // Encoder expects this array undefined or empty
455
+ this.gltf.buffers = [];
456
+ // Allocate total array
457
+ const totalByteLength = this.byteLength;
458
+ const arrayBuffer = new ArrayBuffer(totalByteLength);
459
+ const targetArray = new Uint8Array(arrayBuffer);
460
+ // Copy each array into
461
+ let dstByteOffset = 0;
462
+ for (const sourceBuffer of this.sourceBuffers || []) {
463
+ dstByteOffset = (0, loader_utils_1.copyToArray)(sourceBuffer, targetArray, dstByteOffset);
464
+ }
465
+ // Update the glTF BIN CHUNK byte length
466
+ if (this.json?.buffers?.[0]) {
467
+ this.json.buffers[0].byteLength = totalByteLength;
468
+ }
469
+ else {
470
+ this.json.buffers = [{ byteLength: totalByteLength }];
471
+ }
472
+ // Save generated arrayBuffer
473
+ this.gltf.binary = arrayBuffer;
474
+ // Put arrayBuffer to sourceBuffers for possible additional writing data in the chunk
475
+ this.sourceBuffers = [arrayBuffer];
476
+ }
477
+ // PRIVATE
478
+ _removeStringFromArray(array, string) {
479
+ let found = true;
480
+ while (found) {
481
+ const index = array.indexOf(string);
482
+ if (index > -1) {
483
+ array.splice(index, 1);
484
+ }
485
+ else {
486
+ found = false;
487
+ }
488
+ }
489
+ }
490
+ /**
491
+ * Add attributes to buffers and create `attributes` object which is part of `mesh`
492
+ */
493
+ _addAttributes(attributes = {}) {
494
+ const result = {};
495
+ for (const attributeKey in attributes) {
496
+ const attributeData = attributes[attributeKey];
497
+ const attrName = this._getGltfAttributeName(attributeKey);
498
+ const accessor = this.addBinaryBuffer(attributeData.value, attributeData);
499
+ result[attrName] = accessor;
500
+ }
501
+ return result;
502
+ }
503
+ /**
504
+ * Add indices to buffers
505
+ */
506
+ _addIndices(indices) {
507
+ return this.addBinaryBuffer(indices, { size: 1 });
508
+ }
509
+ /**
510
+ * Deduce gltf specific attribue name from input attribute name
511
+ */
512
+ _getGltfAttributeName(attributeName) {
513
+ switch (attributeName.toLowerCase()) {
514
+ case 'position':
515
+ case 'positions':
516
+ case 'vertices':
517
+ return 'POSITION';
518
+ case 'normal':
519
+ case 'normals':
520
+ return 'NORMAL';
521
+ case 'color':
522
+ case 'colors':
523
+ return 'COLOR_0';
524
+ case 'texcoord':
525
+ case 'texcoords':
526
+ return 'TEXCOORD_0';
527
+ default:
528
+ return attributeName;
529
+ }
530
+ }
531
+ /**
532
+ * Calculate `min` and `max` arrays of accessor according to spec:
533
+ * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-accessor
534
+ */
535
+ _getAccessorMinMax(buffer, size) {
536
+ const result = { min: null, max: null };
537
+ if (buffer.length < size) {
538
+ return result;
539
+ }
540
+ // @ts-ignore
541
+ result.min = [];
542
+ // @ts-ignore
543
+ result.max = [];
544
+ const initValues = buffer.subarray(0, size);
545
+ for (const value of initValues) {
546
+ // @ts-ignore
547
+ result.min.push(value);
548
+ // @ts-ignore
549
+ result.max.push(value);
550
+ }
551
+ for (let index = size; index < buffer.length; index += size) {
552
+ for (let componentIndex = 0; componentIndex < size; componentIndex++) {
553
+ // @ts-ignore
554
+ result.min[0 + componentIndex] = Math.min(
555
+ // @ts-ignore
556
+ result.min[0 + componentIndex], buffer[index + componentIndex]);
557
+ // @ts-ignore
558
+ result.max[0 + componentIndex] = Math.max(
559
+ // @ts-ignore
560
+ result.max[0 + componentIndex], buffer[index + componentIndex]);
561
+ }
562
+ }
563
+ return result;
564
+ }
514
565
  }
515
- //# sourceMappingURL=gltf-scenegraph.js.map
566
+ exports.default = GLTFScenegraph;