@loaders.gl/gltf 3.1.0-alpha.1 → 3.1.0-alpha.5

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 (232) hide show
  1. package/dist/bundle.d.ts +1 -0
  2. package/dist/dist.min.js +1 -1
  3. package/dist/dist.min.js.map +1 -1
  4. package/dist/es5/bundle.js +7 -0
  5. package/dist/es5/bundle.js.map +1 -0
  6. package/dist/es5/glb-loader.js +47 -0
  7. package/dist/es5/glb-loader.js.map +1 -0
  8. package/dist/es5/glb-writer.js +42 -0
  9. package/dist/es5/glb-writer.js.map +1 -0
  10. package/dist/es5/gltf-loader.js +59 -0
  11. package/dist/es5/gltf-loader.js.map +1 -0
  12. package/dist/es5/gltf-writer.js +40 -0
  13. package/dist/es5/gltf-writer.js.map +1 -0
  14. package/dist/es5/index.js +56 -0
  15. package/dist/es5/index.js.map +1 -0
  16. package/dist/es5/lib/api/gltf-extensions.js +58 -0
  17. package/dist/es5/lib/api/gltf-extensions.js.map +1 -0
  18. package/dist/es5/lib/api/gltf-scenegraph.js +529 -0
  19. package/dist/es5/lib/api/gltf-scenegraph.js.map +1 -0
  20. package/dist/es5/lib/api/normalize-gltf-v1.js +259 -0
  21. package/dist/es5/lib/api/normalize-gltf-v1.js.map +1 -0
  22. package/dist/es5/lib/api/post-process-gltf.js +401 -0
  23. package/dist/es5/lib/api/post-process-gltf.js.map +1 -0
  24. package/dist/es5/lib/encoders/encode-glb.js +72 -0
  25. package/dist/es5/lib/encoders/encode-glb.js.map +1 -0
  26. package/dist/es5/lib/encoders/encode-gltf.js +24 -0
  27. package/dist/es5/lib/encoders/encode-gltf.js.map +1 -0
  28. package/dist/es5/lib/extensions/EXT_meshopt_compression.js +72 -0
  29. package/dist/es5/lib/extensions/EXT_meshopt_compression.js.map +1 -0
  30. package/dist/es5/lib/extensions/EXT_texture_webp.js +46 -0
  31. package/dist/es5/lib/extensions/EXT_texture_webp.js.map +1 -0
  32. package/dist/es5/lib/extensions/KHR_binary_gltf.js +39 -0
  33. package/dist/es5/lib/extensions/KHR_binary_gltf.js.map +1 -0
  34. package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js +146 -0
  35. package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js.map +1 -0
  36. package/dist/es5/lib/extensions/KHR_texture_basisu.js +35 -0
  37. package/dist/es5/lib/extensions/KHR_texture_basisu.js.map +1 -0
  38. package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js +65 -0
  39. package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
  40. package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js +52 -0
  41. package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
  42. package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js +83 -0
  43. package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
  44. package/dist/es5/lib/gltf-utils/get-typed-array.js +26 -0
  45. package/dist/es5/lib/gltf-utils/get-typed-array.js.map +1 -0
  46. package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js +83 -0
  47. package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js.map +1 -0
  48. package/dist/es5/lib/gltf-utils/gltf-constants.js +48 -0
  49. package/dist/es5/lib/gltf-utils/gltf-constants.js.map +1 -0
  50. package/dist/es5/lib/gltf-utils/gltf-utils.js +69 -0
  51. package/dist/es5/lib/gltf-utils/gltf-utils.js.map +1 -0
  52. package/dist/es5/lib/gltf-utils/resolve-url.js +23 -0
  53. package/dist/es5/lib/gltf-utils/resolve-url.js.map +1 -0
  54. package/dist/es5/lib/parsers/parse-glb.js +138 -0
  55. package/dist/es5/lib/parsers/parse-glb.js.map +1 -0
  56. package/dist/es5/lib/parsers/parse-gltf.js +193 -0
  57. package/dist/es5/lib/parsers/parse-gltf.js.map +1 -0
  58. package/dist/es5/lib/types/glb-types.js +2 -0
  59. package/dist/{lib → es5/lib}/types/glb-types.js.map +0 -0
  60. package/dist/es5/lib/types/gltf-json-schema.js +2 -0
  61. package/dist/{lib → es5/lib}/types/gltf-json-schema.js.map +0 -0
  62. package/dist/es5/lib/types/gltf-postprocessed-schema.js +2 -0
  63. package/dist/{lib → es5/lib}/types/gltf-postprocessed-schema.js.map +0 -0
  64. package/dist/es5/lib/types/gltf-types.js +2 -0
  65. package/dist/{lib → es5/lib}/types/gltf-types.js.map +0 -0
  66. package/dist/es5/lib/utils/assert.js +13 -0
  67. package/dist/es5/lib/utils/assert.js.map +1 -0
  68. package/dist/es5/lib/utils/version.js +9 -0
  69. package/dist/es5/lib/utils/version.js.map +1 -0
  70. package/dist/es5/meshopt/meshopt-decoder.js +119 -0
  71. package/dist/es5/meshopt/meshopt-decoder.js.map +1 -0
  72. package/dist/{meshopt → es5/meshopt}/meshopt-encoder.ts.disabled +0 -0
  73. package/dist/es5/webp/webp.js +36 -0
  74. package/dist/es5/webp/webp.js.map +1 -0
  75. package/dist/esm/bundle.js +5 -0
  76. package/dist/esm/bundle.js.map +1 -0
  77. package/dist/{glb-loader.js → esm/glb-loader.js} +0 -0
  78. package/dist/esm/glb-loader.js.map +1 -0
  79. package/dist/{glb-writer.js → esm/glb-writer.js} +0 -0
  80. package/dist/esm/glb-writer.js.map +1 -0
  81. package/dist/{gltf-loader.js → esm/gltf-loader.js} +0 -0
  82. package/dist/esm/gltf-loader.js.map +1 -0
  83. package/dist/{gltf-writer.js → esm/gltf-writer.js} +0 -0
  84. package/dist/esm/gltf-writer.js.map +1 -0
  85. package/dist/{index.js → esm/index.js} +0 -1
  86. package/dist/esm/index.js.map +1 -0
  87. package/dist/esm/lib/api/gltf-extensions.js +35 -0
  88. package/dist/esm/lib/api/gltf-extensions.js.map +1 -0
  89. package/dist/{lib → esm/lib}/api/gltf-scenegraph.js +1 -1
  90. package/dist/esm/lib/api/gltf-scenegraph.js.map +1 -0
  91. package/dist/{lib → esm/lib}/api/normalize-gltf-v1.js +4 -4
  92. package/dist/esm/lib/api/normalize-gltf-v1.js.map +1 -0
  93. package/dist/{lib → esm/lib}/api/post-process-gltf.js +12 -12
  94. package/dist/esm/lib/api/post-process-gltf.js.map +1 -0
  95. package/dist/{lib → esm/lib}/encoders/encode-glb.js +0 -0
  96. package/dist/esm/lib/encoders/encode-glb.js.map +1 -0
  97. package/dist/{lib → esm/lib}/encoders/encode-gltf.js +0 -0
  98. package/dist/esm/lib/encoders/encode-gltf.js.map +1 -0
  99. package/dist/{lib → esm/lib}/extensions/EXT_meshopt_compression.js +16 -8
  100. package/dist/esm/lib/extensions/EXT_meshopt_compression.js.map +1 -0
  101. package/dist/esm/lib/extensions/EXT_texture_webp.js +32 -0
  102. package/dist/esm/lib/extensions/EXT_texture_webp.js.map +1 -0
  103. package/dist/esm/lib/extensions/KHR_binary_gltf.js +26 -0
  104. package/dist/esm/lib/extensions/KHR_binary_gltf.js.map +1 -0
  105. package/dist/{lib → esm/lib}/extensions/KHR_draco_mesh_compression.js +9 -1
  106. package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js.map +1 -0
  107. package/dist/esm/lib/extensions/KHR_texture_basisu.js +22 -0
  108. package/dist/esm/lib/extensions/KHR_texture_basisu.js.map +1 -0
  109. package/dist/{lib/extensions → esm/lib/extensions/deprecated}/KHR_lights_punctual.js +4 -3
  110. package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
  111. package/dist/{lib/extensions → esm/lib/extensions/deprecated}/KHR_materials_unlit.js +3 -2
  112. package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
  113. package/dist/{lib/extensions → esm/lib/extensions/deprecated}/KHR_techniques_webgl.js +3 -2
  114. package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
  115. package/dist/{lib → esm/lib}/gltf-utils/get-typed-array.js +0 -0
  116. package/dist/esm/lib/gltf-utils/get-typed-array.js.map +1 -0
  117. package/dist/{lib → esm/lib}/gltf-utils/gltf-attribute-utils.js +0 -0
  118. package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js.map +1 -0
  119. package/dist/{lib → esm/lib}/gltf-utils/gltf-constants.js +0 -6
  120. package/dist/esm/lib/gltf-utils/gltf-constants.js.map +1 -0
  121. package/dist/{lib → esm/lib}/gltf-utils/gltf-utils.js +0 -0
  122. package/dist/esm/lib/gltf-utils/gltf-utils.js.map +1 -0
  123. package/dist/{lib → esm/lib}/gltf-utils/resolve-url.js +1 -1
  124. package/dist/esm/lib/gltf-utils/resolve-url.js.map +1 -0
  125. package/dist/{lib → esm/lib}/parsers/parse-glb.js +2 -6
  126. package/dist/esm/lib/parsers/parse-glb.js.map +1 -0
  127. package/dist/{lib → esm/lib}/parsers/parse-gltf.js +42 -7
  128. package/dist/esm/lib/parsers/parse-gltf.js.map +1 -0
  129. package/dist/{lib → esm/lib}/types/glb-types.js +0 -0
  130. package/dist/esm/lib/types/glb-types.js.map +1 -0
  131. package/dist/{lib → esm/lib}/types/gltf-json-schema.js +0 -0
  132. package/dist/esm/lib/types/gltf-json-schema.js.map +1 -0
  133. package/dist/{lib → esm/lib}/types/gltf-postprocessed-schema.js +0 -0
  134. package/dist/esm/lib/types/gltf-postprocessed-schema.js.map +1 -0
  135. package/dist/{lib → esm/lib}/types/gltf-types.js +0 -0
  136. package/dist/esm/lib/types/gltf-types.js.map +1 -0
  137. package/dist/{lib → esm/lib}/utils/assert.js +0 -0
  138. package/dist/esm/lib/utils/assert.js.map +1 -0
  139. package/dist/esm/lib/utils/version.js +2 -0
  140. package/dist/esm/lib/utils/version.js.map +1 -0
  141. package/dist/{meshopt → esm/meshopt}/meshopt-decoder.js +1 -1
  142. package/dist/esm/meshopt/meshopt-decoder.js.map +1 -0
  143. package/dist/esm/meshopt/meshopt-encoder.ts.disabled +409 -0
  144. package/dist/esm/webp/webp.js +29 -0
  145. package/dist/esm/webp/webp.js.map +1 -0
  146. package/dist/glb-loader.d.ts +12 -0
  147. package/dist/glb-writer.d.ts +21 -0
  148. package/dist/gltf-loader.d.ts +17 -0
  149. package/dist/gltf-writer.d.ts +24 -0
  150. package/dist/index.d.ts +10 -0
  151. package/dist/lib/api/gltf-extensions.d.ts +25 -0
  152. package/dist/lib/api/gltf-scenegraph.d.ts +182 -0
  153. package/dist/lib/api/normalize-gltf-v1.d.ts +1 -0
  154. package/dist/lib/api/post-process-gltf.d.ts +1 -0
  155. package/dist/lib/encoders/encode-glb.d.ts +1 -0
  156. package/dist/lib/encoders/encode-gltf.d.ts +1 -0
  157. package/dist/lib/extensions/EXT_meshopt_compression.d.ts +9 -0
  158. package/dist/lib/extensions/EXT_texture_webp.d.ts +11 -0
  159. package/dist/lib/extensions/KHR_binary_gltf.d.ts +6 -0
  160. package/dist/lib/extensions/KHR_draco_mesh_compression.d.ts +12 -0
  161. package/dist/lib/extensions/KHR_texture_basisu.d.ts +11 -0
  162. package/dist/lib/extensions/deprecated/KHR_lights_punctual.d.ts +6 -0
  163. package/dist/lib/extensions/deprecated/KHR_materials_unlit.d.ts +6 -0
  164. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.d.ts +6 -0
  165. package/dist/lib/gltf-utils/get-typed-array.d.ts +2 -0
  166. package/dist/lib/gltf-utils/gltf-attribute-utils.d.ts +5 -0
  167. package/dist/lib/gltf-utils/gltf-constants.d.ts +3 -0
  168. package/dist/lib/gltf-utils/gltf-utils.d.ts +7 -0
  169. package/dist/lib/gltf-utils/resolve-url.d.ts +1 -0
  170. package/dist/lib/parsers/parse-glb.d.ts +7 -0
  171. package/dist/lib/parsers/parse-gltf.d.ts +13 -0
  172. package/dist/lib/types/glb-types.d.ts +16 -0
  173. package/dist/lib/types/gltf-json-schema.d.ts +719 -0
  174. package/dist/lib/types/gltf-postprocessed-schema.d.ts +684 -0
  175. package/dist/lib/types/gltf-types.d.ts +9 -0
  176. package/dist/lib/utils/assert.d.ts +1 -0
  177. package/dist/lib/utils/version.d.ts +1 -0
  178. package/dist/meshopt/meshopt-decoder.d.ts +5 -0
  179. package/dist/webp/webp.d.ts +6 -0
  180. package/package.json +13 -9
  181. package/src/bundle.ts +2 -3
  182. package/src/gltf-loader.ts +7 -4
  183. package/src/index.ts +8 -4
  184. package/src/lib/api/gltf-extensions.ts +71 -0
  185. package/src/lib/api/gltf-scenegraph.ts +4 -6
  186. package/src/lib/api/normalize-gltf-v1.js +2 -1
  187. package/src/lib/extensions/EXT_meshopt_compression.ts +32 -23
  188. package/src/lib/extensions/EXT_texture_webp.ts +45 -0
  189. package/src/lib/extensions/KHR_binary_gltf.ts +19 -10
  190. package/src/lib/extensions/KHR_draco_mesh_compression.ts +29 -4
  191. package/src/lib/extensions/KHR_texture_basisu.ts +36 -0
  192. package/src/lib/extensions/{KHR_lights_punctual.ts → deprecated/KHR_lights_punctual.ts} +7 -4
  193. package/src/lib/extensions/{KHR_materials_unlit.ts → deprecated/KHR_materials_unlit.ts} +6 -3
  194. package/src/lib/extensions/{KHR_techniques_webgl.ts → deprecated/KHR_techniques_webgl.ts} +6 -3
  195. package/src/lib/gltf-utils/gltf-constants.ts +0 -12
  196. package/src/lib/parsers/parse-gltf.ts +72 -20
  197. package/src/lib/types/gltf-json-schema.ts +96 -3
  198. package/src/lib/types/gltf-types.ts +19 -21
  199. package/src/webp/webp.ts +41 -0
  200. package/dist/bundle.js +0 -7
  201. package/dist/bundle.js.map +0 -1
  202. package/dist/glb-loader.js.map +0 -1
  203. package/dist/glb-writer.js.map +0 -1
  204. package/dist/gltf-loader.js.map +0 -1
  205. package/dist/gltf-writer.js.map +0 -1
  206. package/dist/index.js.map +0 -1
  207. package/dist/lib/api/gltf-scenegraph.js.map +0 -1
  208. package/dist/lib/api/normalize-gltf-v1.js.map +0 -1
  209. package/dist/lib/api/post-process-gltf.js.map +0 -1
  210. package/dist/lib/encoders/encode-glb.js.map +0 -1
  211. package/dist/lib/encoders/encode-gltf.js.map +0 -1
  212. package/dist/lib/extensions/EXT_meshopt_compression.js.map +0 -1
  213. package/dist/lib/extensions/KHR_binary_gltf.js +0 -26
  214. package/dist/lib/extensions/KHR_binary_gltf.js.map +0 -1
  215. package/dist/lib/extensions/KHR_draco_mesh_compression.js.map +0 -1
  216. package/dist/lib/extensions/KHR_lights_punctual.js.map +0 -1
  217. package/dist/lib/extensions/KHR_materials_unlit.js.map +0 -1
  218. package/dist/lib/extensions/KHR_techniques_webgl.js.map +0 -1
  219. package/dist/lib/extensions/gltf-extensions.js +0 -24
  220. package/dist/lib/extensions/gltf-extensions.js.map +0 -1
  221. package/dist/lib/gltf-utils/get-typed-array.js.map +0 -1
  222. package/dist/lib/gltf-utils/gltf-attribute-utils.js.map +0 -1
  223. package/dist/lib/gltf-utils/gltf-constants.js.map +0 -1
  224. package/dist/lib/gltf-utils/gltf-utils.js.map +0 -1
  225. package/dist/lib/gltf-utils/resolve-url.js.map +0 -1
  226. package/dist/lib/parsers/parse-glb.js.map +0 -1
  227. package/dist/lib/parsers/parse-gltf.js.map +0 -1
  228. package/dist/lib/utils/assert.js.map +0 -1
  229. package/dist/lib/utils/version.js +0 -2
  230. package/dist/lib/utils/version.js.map +0 -1
  231. package/dist/meshopt/meshopt-decoder.js.map +0 -1
  232. package/src/lib/extensions/gltf-extensions.ts +0 -48
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/gltf",
3
- "version": "3.1.0-alpha.1",
3
+ "version": "3.1.0-alpha.5",
4
4
  "description": "Framework-independent loader for the glTF format",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -19,9 +19,9 @@
19
19
  "GLB",
20
20
  "glTF"
21
21
  ],
22
- "types": "src/index.ts",
23
- "main": "dist/index.js",
24
- "module": "dist/index.js",
22
+ "types": "dist/index.d.ts",
23
+ "main": "dist/es5/index.js",
24
+ "module": "dist/esm/index.js",
25
25
  "sideEffects": false,
26
26
  "files": [
27
27
  "src",
@@ -31,13 +31,17 @@
31
31
  ],
32
32
  "scripts": {
33
33
  "pre-build": "npm run build-bundle",
34
+ "post-build": "tsc",
34
35
  "build-bundle": "webpack --config ../../scripts/webpack/bundle.js"
35
36
  },
36
37
  "dependencies": {
37
- "@loaders.gl/core": "3.1.0-alpha.1",
38
- "@loaders.gl/draco": "3.1.0-alpha.1",
39
- "@loaders.gl/images": "3.1.0-alpha.1",
40
- "@loaders.gl/loader-utils": "3.1.0-alpha.1"
38
+ "@loaders.gl/draco": "3.1.0-alpha.5",
39
+ "@loaders.gl/images": "3.1.0-alpha.5",
40
+ "@loaders.gl/loader-utils": "3.1.0-alpha.5",
41
+ "@loaders.gl/textures": "3.1.0-alpha.5"
41
42
  },
42
- "gitHead": "725f6ceeb9d76dacff6305f01bc45873680f17d5"
43
+ "peerDependencies": {
44
+ "@loaders.gl/core": "^3.0.0"
45
+ },
46
+ "gitHead": "352241dd910a8c6307a235dadbe154ca915b885b"
43
47
  }
package/src/bundle.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  // @ts-nocheck
2
2
  const moduleExports = require('./index');
3
- const _global = typeof window === 'undefined' ? global : window;
4
- _global.loaders = _global.loaders || {};
5
- module.exports = Object.assign(_global.loaders, moduleExports);
3
+ globalThis.loaders = globalThis.loaders || {};
4
+ module.exports = Object.assign(globalThis.loaders, moduleExports);
@@ -1,9 +1,10 @@
1
1
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
2
2
  import type {DracoLoaderOptions} from '@loaders.gl/draco';
3
- // import type {ImageLoaderOptions} from '@loaders.gl/images';
4
- // import type {TextureLoaderOptions} from '@loaders.gl/textures';
5
- import type {GLTFParseOptions} from './lib/parsers/parse-gltf';
6
3
  import {VERSION} from './lib/utils/version';
4
+ import type {ImageLoaderOptions} from '@loaders.gl/images';
5
+ import type {TextureLoaderOptions} from '@loaders.gl/textures';
6
+ import type {GLTFParseOptions} from './lib/parsers/parse-gltf';
7
+ import type {GLTFWithBuffers} from './lib/types/gltf-types';
7
8
  import {parseGLTF} from './lib/parsers/parse-gltf';
8
9
  import {GLBLoaderOptions} from './glb-loader';
9
10
 
@@ -11,6 +12,8 @@ import {GLBLoaderOptions} from './glb-loader';
11
12
  * GLTF loader options
12
13
  */
13
14
  export type GLTFLoaderOptions = LoaderOptions &
15
+ ImageLoaderOptions &
16
+ TextureLoaderOptions &
14
17
  GLBLoaderOptions &
15
18
  DracoLoaderOptions & {
16
19
  gltf?: GLTFParseOptions;
@@ -63,5 +66,5 @@ export async function parse(arrayBuffer, options: GLTFLoaderOptions = {}, contex
63
66
 
64
67
  const {byteOffset = 0} = options;
65
68
  const gltf = {};
66
- return await parseGLTF(gltf, arrayBuffer, byteOffset, options, context);
69
+ return await parseGLTF(gltf as GLTFWithBuffers, arrayBuffer, byteOffset, options, context);
67
70
  }
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable camelcase, indent */
1
2
  export type {GLB} from './lib/types/glb-types';
2
3
  export type {
3
4
  GLTF,
@@ -12,12 +13,15 @@ export type {
12
13
  GLTFScene,
13
14
  GLTFSkin,
14
15
  GLTFTexture,
15
- GLTFImage
16
+ GLTFImage,
17
+ // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)
18
+ GLTF_KHR_binary_glTF,
19
+ GLTF_KHR_draco_mesh_compression,
20
+ GLTF_KHR_texture_basisu,
21
+ GLTF_EXT_meshopt_compression,
22
+ GLTF_EXT_texture_webp
16
23
  } from './lib/types/gltf-types';
17
24
 
18
- // Constants
19
- export {KHR_DRACO_MESH_COMPRESSION} from './lib/gltf-utils/gltf-constants';
20
-
21
25
  // glTF loader/writer definition objects
22
26
  export {GLTFLoader} from './gltf-loader';
23
27
  export {GLTFWriter} from './gltf-writer';
@@ -0,0 +1,71 @@
1
+ /* eslint-disable camelcase */
2
+ import {GLTF} from '../types/gltf-types';
3
+ import type {GLTFLoaderOptions} from '../../gltf-loader';
4
+
5
+ // GLTF 1.0 extensions (decode only)
6
+ // import * as KHR_binary_gltf from './KHR_draco_mesh_compression';
7
+
8
+ // GLTF 2.0 Khronos extensions (decode/encode)
9
+ import * as EXT_meshopt_compression from '../extensions/EXT_meshopt_compression';
10
+ import * as EXT_texture_webp from '../extensions/EXT_texture_webp';
11
+ import * as KHR_texture_basisu from '../extensions/KHR_texture_basisu';
12
+ import * as KHR_draco_mesh_compression from '../extensions/KHR_draco_mesh_compression';
13
+
14
+ // Deprecated. These should be handled by rendering library (e.g. luma.gl), not the loader.
15
+ import * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';
16
+ import * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';
17
+ import * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';
18
+
19
+ // Vendor extensions
20
+
21
+ type GLTFExtensionPlugin = {
22
+ name: string;
23
+ preprocess?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => void;
24
+ decode?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => Promise<void>;
25
+ encode?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions) => void;
26
+ };
27
+
28
+ /**
29
+ * List of extensions processed by the GLTFLoader
30
+ * Note that may extensions can only be handled on the rendering stage and are left out here
31
+ * These are just extensions that can be handled fully or partially during loading.
32
+ */
33
+ export const EXTENSIONS: GLTFExtensionPlugin[] = [
34
+ // 1.0
35
+ // KHR_binary_gltf is handled separately - must be processed before other parsing starts
36
+ // KHR_binary_gltf,
37
+
38
+ // 2.0
39
+ EXT_meshopt_compression,
40
+ EXT_texture_webp,
41
+ // Basisu should come after webp, we want basisu to be preferred if both are provided
42
+ KHR_texture_basisu,
43
+ KHR_draco_mesh_compression,
44
+ KHR_lights_punctual,
45
+ KHR_materials_unlit,
46
+ KHR_techniques_webgl
47
+ ];
48
+
49
+ /** Call before any resource loading starts */
50
+ export function preprocessExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {
51
+ const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));
52
+ for (const extension of extensions) {
53
+ extension.preprocess?.(gltf, options, context);
54
+ }
55
+ }
56
+
57
+ /** Call after resource loading */
58
+ export async function decodeExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {
59
+ const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));
60
+ for (const extension of extensions) {
61
+ // Note: We decode async extensions sequentially, this might not be necessary
62
+ // Currently we only have Draco, but when we add Basis we may revisit
63
+ await extension.decode?.(gltf, options, context);
64
+ }
65
+ }
66
+
67
+ function useExtension(extensionName: string, options: GLTFLoaderOptions) {
68
+ const excludes = options?.gltf?.excludeExtensions || {};
69
+ const exclude = extensionName in excludes && !excludes[extensionName];
70
+ return !exclude;
71
+ }
@@ -36,6 +36,7 @@ const DEFAULT_GLTF_JSON: GLTF = {
36
36
  buffers: []
37
37
  };
38
38
 
39
+ type Extension = {[key: string]: any};
39
40
  /**
40
41
  * Class for structured access to GLTF data
41
42
  */
@@ -79,13 +80,13 @@ export default class GLTFScenegraph {
79
80
  return extras[key];
80
81
  }
81
82
 
82
- getExtension(extensionName: string): {[key: string]: any} | null {
83
+ getExtension<T = Extension>(extensionName: string): T | null {
83
84
  const isExtension = this.getUsedExtensions().find((name) => name === extensionName);
84
85
  const extensions = this.json.extensions || {};
85
86
  return isExtension ? extensions[extensionName] || true : null;
86
87
  }
87
88
 
88
- getRequiredExtension(extensionName: string): {[key: string]: any} | null {
89
+ getRequiredExtension<T = Extension>(extensionName: string): T | null {
89
90
  const isRequired = this.getRequiredExtensions().find((name) => name === extensionName);
90
91
  return isRequired ? this.getExtension(extensionName) : null;
91
92
  }
@@ -98,10 +99,7 @@ export default class GLTFScenegraph {
98
99
  return this.json.extensionsUsed || [];
99
100
  }
100
101
 
101
- getObjectExtension(
102
- object: {[key: string]: any},
103
- extensionName: string
104
- ): {[key: string]: any} | null {
102
+ getObjectExtension<T = Extension>(object: {[key: string]: any}, extensionName: string): T | null {
105
103
  const extensions = object.extensions || {};
106
104
  return extensions[extensionName];
107
105
  }
@@ -139,7 +139,8 @@ class GLTFV1Normalizer {
139
139
 
140
140
  // Extract bufferView indices for images
141
141
  // (this extension needs to be invoked early in the normalization process)
142
- KHR_binary_glTF.decode(gltf);
142
+ // TODO can this be handled by standard extension processing instead of called explicitly?
143
+ KHR_binary_glTF.preprocess(gltf);
143
144
 
144
145
  // Convert object references from ids to indices
145
146
  this._convertObjectIdsToArrayIndices(json);
@@ -1,19 +1,9 @@
1
1
  /* eslint-disable camelcase */
2
+ import type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-types';
2
3
  import type {GLTFLoaderOptions} from '../../gltf-loader';
3
4
  import GLTFScenegraph from '../api/gltf-scenegraph';
4
- import {EXT_MESHOPT_COMPRESSION} from '../gltf-utils/gltf-constants';
5
5
  import {isMeshoptSupported, meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';
6
6
 
7
- type GLTF_EXT_meshopt_compression = {
8
- buffer: number;
9
- byteOffset?: number;
10
- byteLength: number;
11
- byteStride: number;
12
- count: number;
13
- mode: 'ATTRIBUTES' | 'TRIANGLES' | 'INDICES';
14
- filter?: 'NONE' | 'OCTAHEDRAL' | 'QUATERNION' | 'EXPONENTIAL';
15
- };
16
-
17
7
  // @ts-ignore
18
8
  // eslint-disable-next-line
19
9
  const DEFAULT_MESHOPT_OPTIONS = {
@@ -21,34 +11,51 @@ const DEFAULT_MESHOPT_OPTIONS = {
21
11
  filter: 'NONE'
22
12
  };
23
13
 
24
- // Note: We have a "soft dependency" on DracoWriter to avoid bundling it when not needed
25
- export async function decode(gltfData, options: GLTFLoaderOptions) {
26
- if (!options?.gltf?.decompressMeshes || !isMeshoptSupported()) {
14
+ /** Extension name */
15
+ const EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';
16
+
17
+ export const name = EXT_MESHOPT_COMPRESSION;
18
+
19
+ export function preprocess(gltfData: {json: GLTF}) {
20
+ const scenegraph = new GLTFScenegraph(gltfData);
21
+ if (
22
+ scenegraph.getRequiredExtensions().includes(EXT_MESHOPT_COMPRESSION) &&
23
+ !isMeshoptSupported()
24
+ ) {
25
+ throw new Error(`gltf: Required extension ${EXT_MESHOPT_COMPRESSION} not supported by browser`);
26
+ }
27
+ }
28
+
29
+ export async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {
30
+ const scenegraph = new GLTFScenegraph(gltfData);
31
+
32
+ if (!options?.gltf?.decompressMeshes) {
27
33
  return;
28
34
  }
29
35
 
30
36
  const promises: Promise<any>[] = [];
31
37
  for (const bufferViewIndex of gltfData.json.bufferViews || []) {
32
- promises.push(decodeMeshoptBufferView(gltfData.json, bufferViewIndex));
38
+ promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));
33
39
  }
34
40
 
35
41
  // Decompress meshes in parallel
36
42
  await Promise.all(promises);
37
43
 
38
44
  // We have now decompressed all primitives, so remove the top-level extensions
39
- const scenegraph = new GLTFScenegraph(gltfData);
40
45
  scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);
41
46
  }
42
47
 
43
48
  /** Decode one meshopt buffer view */
44
- async function decodeMeshoptBufferView(json, index: number): Promise<ArrayBuffer | null> {
45
- const bufferView = json.bufferViews[index];
46
-
47
- const meshoptExtension =
48
- bufferView.extensions &&
49
- (bufferView.extensions[EXT_MESHOPT_COMPRESSION] as GLTF_EXT_meshopt_compression);
49
+ async function decodeMeshoptBufferView(
50
+ scenegraph: GLTFScenegraph,
51
+ bufferView: GLTFBufferView
52
+ ): Promise<ArrayBuffer | null> {
53
+ const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(
54
+ bufferView,
55
+ EXT_MESHOPT_COMPRESSION
56
+ );
50
57
  if (meshoptExtension) {
51
- const buffer = json.buffers[meshoptExtension.buffer];
58
+ const buffer = bufferView.buffer;
52
59
 
53
60
  const {
54
61
  byteOffset = 0,
@@ -58,6 +65,8 @@ async function decodeMeshoptBufferView(json, index: number): Promise<ArrayBuffer
58
65
  mode,
59
66
  filter = 'NONE'
60
67
  } = meshoptExtension;
68
+
69
+ // @ts-expect-error TODO - fix buffer handling
61
70
  const source = new Uint8Array(buffer, byteOffset, byteLength);
62
71
  const result = new ArrayBuffer(count * byteStride);
63
72
  await meshoptDecodeGltfBuffer(new Uint8Array(result), count, byteStride, source, mode, filter);
@@ -0,0 +1,45 @@
1
+ // GLTF EXTENSION: EXT_TEXTURE_WEBP
2
+ // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_TEXTURE_WEBP
3
+ /* eslint-disable camelcase */
4
+
5
+ import type {GLTF, GLTF_EXT_texture_webp} from '../types/gltf-types';
6
+ import type {GLTFLoaderOptions} from '../../gltf-loader';
7
+
8
+ import {_isImageFormatSupported} from '@loaders.gl/images';
9
+ import GLTFScenegraph from '../api/gltf-scenegraph';
10
+
11
+ const EXT_TEXTURE_WEBP = 'EXT_texture_webp';
12
+
13
+ /** Extension name */
14
+ export const name = EXT_TEXTURE_WEBP;
15
+
16
+ /**
17
+ * Replaces a texture source reference with the extension texture
18
+ * Done in preprocess() to prevent load of default image
19
+ */
20
+ export function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions): void {
21
+ const scenegraph = new GLTFScenegraph(gltfData);
22
+
23
+ if (!_isImageFormatSupported('image/webp')) {
24
+ if (scenegraph.getRequiredExtensions().includes(EXT_TEXTURE_WEBP)) {
25
+ throw new Error(`gltf: Required extension ${EXT_TEXTURE_WEBP} not supported by browser`);
26
+ }
27
+ return;
28
+ }
29
+
30
+ const {json} = scenegraph;
31
+
32
+ for (const texture of json.textures || []) {
33
+ const extension = scenegraph.getObjectExtension<GLTF_EXT_texture_webp>(
34
+ texture,
35
+ EXT_TEXTURE_WEBP
36
+ );
37
+ if (extension) {
38
+ texture.source = extension.source;
39
+ }
40
+ scenegraph.removeObjectExtension(texture, EXT_TEXTURE_WEBP);
41
+ }
42
+
43
+ // Remove the top-level extension
44
+ scenegraph.removeExtension(EXT_TEXTURE_WEBP);
45
+ }
@@ -1,12 +1,17 @@
1
1
  // GLTF 1.0 EXTENSION: KHR_binary_glTF
2
2
  // https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF
3
+ /* eslint-disable camelcase */
3
4
 
4
- import type {GLTF} from '../types/gltf-types';
5
+ import type {GLTF, GLTF_KHR_binary_glTF} from '../types/gltf-types';
5
6
 
6
7
  import GLTFScenegraph from '../api/gltf-scenegraph';
7
- import {KHR_BINARY_GLTF} from '../gltf-utils/gltf-constants';
8
8
 
9
- export function decode(gltfData: {json: GLTF}): void {
9
+ const KHR_BINARY_GLTF = 'KHR_binary_glTF';
10
+
11
+ /** Extension name */
12
+ export const name = KHR_BINARY_GLTF;
13
+
14
+ export function preprocess(gltfData: {json: GLTF}): void {
10
15
  const gltfScenegraph = new GLTFScenegraph(gltfData);
11
16
  const {json} = gltfScenegraph;
12
17
 
@@ -15,15 +20,19 @@ export function decode(gltfData: {json: GLTF}): void {
15
20
 
16
21
  // Image and shader nodes can have the extension
17
22
  // https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/schema/image.KHR_binary_glTF.schema.json
18
- for (const node of json.images || []) {
19
- const extension = gltfScenegraph.removeObjectExtension(node, KHR_BINARY_GLTF);
23
+ for (const image of json.images || []) {
24
+ const extension = gltfScenegraph.getObjectExtension<GLTF_KHR_binary_glTF>(
25
+ image,
26
+ KHR_BINARY_GLTF
27
+ );
20
28
  // The data in the extension is valid as glTF 2.0 data inside the object, so just copy it in
21
29
  if (extension) {
22
- Object.assign(node, extension);
30
+ Object.assign(image, extension);
23
31
  }
32
+ gltfScenegraph.removeObjectExtension(image, KHR_BINARY_GLTF);
24
33
  }
25
34
 
26
- // TODO shaders
35
+ // TODO shaders - At least traverse and throw error if used?
27
36
  // https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/schema/shader.KHR_binary_glTF.schema.json
28
37
 
29
38
  // glTF v1 one files have a partially formed URI field that is not expected in (and causes problems in) 2.0
@@ -36,6 +45,6 @@ export function decode(gltfData: {json: GLTF}): void {
36
45
  }
37
46
 
38
47
  // KHR_binary_gltf is a 1.0 extension that is supported natively by 2.0
39
- export function encode() {
40
- throw new Error(KHR_BINARY_GLTF);
41
- }
48
+ // export function encode() {
49
+ // throw new Error(KHR_BINARY_GLTF);
50
+ // }
@@ -1,8 +1,14 @@
1
1
  // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression
2
2
  // Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported
3
+ /* eslint-disable camelcase */
3
4
 
4
5
  /* eslint-disable camelcase */
5
- import type {GLTF, GLTFAccessor, GLTFMeshPrimitive} from '../types/gltf-types';
6
+ import type {
7
+ GLTF,
8
+ GLTFAccessor,
9
+ GLTFMeshPrimitive,
10
+ GLTF_KHR_draco_mesh_compression
11
+ } from '../types/gltf-types';
6
12
  import type {GLTFLoaderOptions} from '../../gltf-loader';
7
13
 
8
14
  import type {LoaderContext} from '@loaders.gl/loader-utils';
@@ -10,10 +16,26 @@ import {DracoLoader} from '@loaders.gl/draco';
10
16
  import {DracoLoaderOptions, DracoMesh} from '@loaders.gl/draco';
11
17
  import {sliceArrayBuffer} from '@loaders.gl/loader-utils';
12
18
  import {default as Scenegraph} from '../api/gltf-scenegraph';
13
- import {KHR_DRACO_MESH_COMPRESSION} from '../gltf-utils/gltf-constants';
14
19
  import {getGLTFAccessors, getGLTFAccessor} from '../gltf-utils/gltf-attribute-utils';
15
20
 
16
- // Note: We have a "soft dependency" on DracoWriter to avoid bundling it when not needed
21
+ const KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';
22
+
23
+ /** Extension name */
24
+ export const name = KHR_DRACO_MESH_COMPRESSION;
25
+
26
+ export function preprocess(
27
+ gltfData: {json: GLTF},
28
+ options: GLTFLoaderOptions,
29
+ context: LoaderContext
30
+ ): void {
31
+ const scenegraph = new Scenegraph(gltfData);
32
+ for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {
33
+ if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {
34
+ // TODO - Remove fallback accessors to make sure we don't load unnecessary buffers
35
+ }
36
+ }
37
+ }
38
+
17
39
  export async function decode(
18
40
  gltfData: {json: GLTF},
19
41
  options: GLTFLoaderOptions,
@@ -64,7 +86,10 @@ async function decompressPrimitive(
64
86
  options: GLTFLoaderOptions,
65
87
  context: LoaderContext
66
88
  ): Promise<void> {
67
- const dracoExtension = scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION);
89
+ const dracoExtension = scenegraph.getObjectExtension<GLTF_KHR_draco_mesh_compression>(
90
+ primitive,
91
+ KHR_DRACO_MESH_COMPRESSION
92
+ );
68
93
  if (!dracoExtension) {
69
94
  return;
70
95
  }
@@ -0,0 +1,36 @@
1
+ // GLTF EXTENSION: EXT_TEXTURE_WEBP
2
+ // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_TEXTURE_WEBP
3
+ /* eslint-disable camelcase */
4
+
5
+ import type {GLTF, GLTF_KHR_texture_basisu} from '../types/gltf-types';
6
+ import type {GLTFLoaderOptions} from '../../gltf-loader';
7
+
8
+ import GLTFScenegraph from '../api/gltf-scenegraph';
9
+
10
+ const KHR_TEXTURE_BASISU = 'KHR_texture_basisu';
11
+
12
+ /** Extension name */
13
+ export const name = KHR_TEXTURE_BASISU;
14
+
15
+ /**
16
+ * Replaces a texture source reference with the extension texture
17
+ * Done in preprocess() to prevent load of default image
18
+ */
19
+ export function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions): void {
20
+ const scene = new GLTFScenegraph(gltfData);
21
+ const {json} = scene;
22
+
23
+ for (const texture of json.textures || []) {
24
+ const extension = scene.getObjectExtension<GLTF_KHR_texture_basisu>(
25
+ texture,
26
+ KHR_TEXTURE_BASISU
27
+ );
28
+ if (extension) {
29
+ texture.source = extension.source;
30
+ }
31
+ scene.removeObjectExtension(texture, KHR_TEXTURE_BASISU);
32
+ }
33
+
34
+ // Remove the top-level extension
35
+ scene.removeExtension(KHR_TEXTURE_BASISU);
36
+ }
@@ -1,11 +1,14 @@
1
1
  // GLTF EXTENSION: KHR_lights_punctual
2
2
  // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual
3
3
 
4
- import type {GLTF} from '../types/gltf-types';
4
+ import type {GLTF} from '../../types/gltf-types';
5
5
 
6
- import {assert} from '../utils/assert';
7
- import GLTFScenegraph from '../api/gltf-scenegraph';
8
- import {KHR_LIGHTS_PUNCTUAL} from '../gltf-utils/gltf-constants';
6
+ import {assert} from '../../utils/assert';
7
+ import GLTFScenegraph from '../../api/gltf-scenegraph';
8
+
9
+ const KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';
10
+
11
+ export const name = KHR_LIGHTS_PUNCTUAL;
9
12
 
10
13
  export async function decode(gltfData: {json: GLTF}): Promise<void> {
11
14
  const gltfScenegraph = new GLTFScenegraph(gltfData);
@@ -1,10 +1,13 @@
1
1
  // GLTF EXTENSION: KHR_materials_unlit
2
2
  // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit
3
3
 
4
- import type {GLTF} from '../types/gltf-types';
4
+ import type {GLTF} from '../../types/gltf-types';
5
5
 
6
- import GLTFScenegraph from '../api/gltf-scenegraph';
7
- import {KHR_MATERIALS_UNLIT} from '../gltf-utils/gltf-constants';
6
+ import GLTFScenegraph from '../../api/gltf-scenegraph';
7
+
8
+ const KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';
9
+
10
+ export const name = KHR_MATERIALS_UNLIT;
8
11
 
9
12
  export async function decode(gltfData: {json: GLTF}): Promise<void> {
10
13
  const gltfScenegraph = new GLTFScenegraph(gltfData);
@@ -1,10 +1,13 @@
1
1
  // GLTF EXTENSION: KHR_techniques_webgl
2
2
  // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_techniques_webgl
3
3
 
4
- import type {GLTF} from '../types/gltf-types';
4
+ import type {GLTF} from '../../types/gltf-types';
5
5
 
6
- import GLTFScenegraph from '../api/gltf-scenegraph';
7
- import {KHR_TECHNIQUES_WEBGL} from '../gltf-utils/gltf-constants';
6
+ import GLTFScenegraph from '../../api/gltf-scenegraph';
7
+
8
+ const KHR_TECHNIQUES_WEBGL = 'KHR_techniques_webgl';
9
+
10
+ export const name = KHR_TECHNIQUES_WEBGL;
8
11
 
9
12
  export async function decode(gltfData: {json: GLTF}): Promise<void> {
10
13
  const gltfScenegraph = new GLTFScenegraph(gltfData);
@@ -1,15 +1,3 @@
1
- // GLTF 1.0 extensions
2
- export const KHR_BINARY_GLTF = 'KHR_binary_glTF';
3
-
4
- // GLTF 2.0 extensions
5
- export const KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';
6
- export const KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';
7
- export const KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';
8
- export const KHR_TECHNIQUES_WEBGL = 'KHR_techniques_webgl';
9
-
10
- // External extensions
11
- export const EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';
12
-
13
1
  const COMPONENTS = {
14
2
  SCALAR: 1,
15
3
  VEC2: 2,