@loaders.gl/gltf 3.3.0-alpha.1 → 3.3.0-alpha.2

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 (30) hide show
  1. package/dist/dist.min.js +105 -15
  2. package/dist/es5/index.js.map +1 -1
  3. package/dist/es5/lib/api/gltf-extensions.js +3 -1
  4. package/dist/es5/lib/api/gltf-extensions.js.map +1 -1
  5. package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js +131 -0
  6. package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  7. package/dist/es5/lib/utils/version.js +1 -1
  8. package/dist/esm/index.js.map +1 -1
  9. package/dist/esm/lib/api/gltf-extensions.js +2 -1
  10. package/dist/esm/lib/api/gltf-extensions.js.map +1 -1
  11. package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js +95 -0
  12. package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  13. package/dist/esm/lib/utils/version.js +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/lib/api/gltf-extensions.d.ts.map +1 -1
  17. package/dist/lib/api/gltf-extensions.js +3 -1
  18. package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts +6 -0
  19. package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts.map +1 -0
  20. package/dist/lib/extensions/deprecated/EXT_feature_metadata.js +118 -0
  21. package/dist/lib/types/gltf-json-schema.d.ts +384 -0
  22. package/dist/lib/types/gltf-json-schema.d.ts.map +1 -1
  23. package/dist/lib/types/gltf-types.d.ts +2 -2
  24. package/dist/lib/types/gltf-types.d.ts.map +1 -1
  25. package/package.json +6 -6
  26. package/src/index.ts +2 -1
  27. package/src/lib/api/gltf-extensions.ts +3 -1
  28. package/src/lib/extensions/deprecated/EXT_feature_metadata.ts +163 -0
  29. package/src/lib/types/gltf-json-schema.ts +429 -0
  30. package/src/lib/types/gltf-types.ts +4 -2
package/dist/dist.min.js CHANGED
@@ -14,8 +14,8 @@
14
14
  };
15
15
  var __export = (target, all) => {
16
16
  __markAsModule(target);
17
- for (var name9 in all)
18
- __defProp(target, name9, { get: all[name9], enumerable: true });
17
+ for (var name10 in all)
18
+ __defProp(target, name10, { get: all[name10], enumerable: true });
19
19
  };
20
20
  var __reExport = (target, module, desc) => {
21
21
  if (module && typeof module === "object" || typeof module === "function") {
@@ -200,6 +200,7 @@
200
200
  // ../worker-utils/src/index.ts
201
201
  var init_src = __esm({
202
202
  "../worker-utils/src/index.ts"() {
203
+ init_globals2();
203
204
  init_library_utils();
204
205
  }
205
206
  });
@@ -753,11 +754,12 @@
753
754
  var BasisWorkerLoader, BasisLoader;
754
755
  var init_basis_loader = __esm({
755
756
  "../textures/src/basis-loader.ts"() {
757
+ init_src();
756
758
  init_version3();
757
759
  init_parse_basis();
758
760
  BasisWorkerLoader = {
759
761
  name: "Basis",
760
- id: "basis",
762
+ id: isBrowser2 ? "basis" : "basis-nodejs",
761
763
  module: "textures",
762
764
  version: VERSION4,
763
765
  worker: true,
@@ -1396,12 +1398,12 @@
1396
1398
  return extras[key];
1397
1399
  }
1398
1400
  getExtension(extensionName) {
1399
- const isExtension = this.getUsedExtensions().find((name9) => name9 === extensionName);
1401
+ const isExtension = this.getUsedExtensions().find((name10) => name10 === extensionName);
1400
1402
  const extensions = this.json.extensions || {};
1401
1403
  return isExtension ? extensions[extensionName] || true : null;
1402
1404
  }
1403
1405
  getRequiredExtension(extensionName) {
1404
- const isRequired = this.getRequiredExtensions().find((name9) => name9 === extensionName);
1406
+ const isRequired = this.getRequiredExtensions().find((name10) => name10 === extensionName);
1405
1407
  return isRequired ? this.getExtension(extensionName) : null;
1406
1408
  }
1407
1409
  getRequiredExtensions() {
@@ -2064,6 +2066,7 @@
2064
2066
  var DEFAULT_DRACO_OPTIONS, DracoLoader;
2065
2067
  var init_draco_loader = __esm({
2066
2068
  "../draco/src/draco-loader.ts"() {
2069
+ init_src();
2067
2070
  init_version5();
2068
2071
  DEFAULT_DRACO_OPTIONS = {
2069
2072
  draco: {
@@ -2075,7 +2078,7 @@
2075
2078
  };
2076
2079
  DracoLoader = {
2077
2080
  name: "Draco",
2078
- id: "draco",
2081
+ id: isBrowser2 ? "draco" : "draco-nodejs",
2079
2082
  module: "draco",
2080
2083
  shapes: ["mesh"],
2081
2084
  version: VERSION7,
@@ -2171,8 +2174,8 @@
2171
2174
  }
2172
2175
  select(...columnNames) {
2173
2176
  const nameMap = Object.create(null);
2174
- for (const name9 of columnNames) {
2175
- nameMap[name9] = true;
2177
+ for (const name10 of columnNames) {
2178
+ nameMap[name10] = true;
2176
2179
  }
2177
2180
  const selectedFields = this.fields.filter((field) => nameMap[field.name]);
2178
2181
  return new Schema(selectedFields, this.metadata);
@@ -2210,8 +2213,8 @@
2210
2213
  var init_field = __esm({
2211
2214
  "../schema/src/lib/schema/impl/field.ts"() {
2212
2215
  Field = class {
2213
- constructor(name9, type, nullable = false, metadata = new Map()) {
2214
- this.name = name9;
2216
+ constructor(name10, type, nullable = false, metadata = new Map()) {
2217
+ this.name = name10;
2215
2218
  this.type = type;
2216
2219
  this.nullable = nullable;
2217
2220
  this.metadata = metadata;
@@ -3134,11 +3137,11 @@
3134
3137
  // src/lib/gltf-utils/gltf-attribute-utils.ts
3135
3138
  function getGLTFAccessors(attributes) {
3136
3139
  const accessors = {};
3137
- for (const name9 in attributes) {
3138
- const attribute = attributes[name9];
3139
- if (name9 !== "indices") {
3140
+ for (const name10 in attributes) {
3141
+ const attribute = attributes[name10];
3142
+ if (name10 !== "indices") {
3140
3143
  const glTFAccessor = getGLTFAccessor(attribute);
3141
- accessors[name9] = glTFAccessor;
3144
+ accessors[name10] = glTFAccessor;
3142
3145
  }
3143
3146
  }
3144
3147
  return accessors;
@@ -4824,6 +4827,91 @@
4824
4827
  }
4825
4828
  });
4826
4829
 
4830
+ // src/lib/extensions/deprecated/EXT_feature_metadata.ts
4831
+ var EXT_feature_metadata_exports = {};
4832
+ __export(EXT_feature_metadata_exports, {
4833
+ decode: () => decode8,
4834
+ name: () => name9
4835
+ });
4836
+ async function decode8(gltfData) {
4837
+ const scenegraph = new GLTFScenegraph(gltfData);
4838
+ decodeExtFeatureMetadata(scenegraph);
4839
+ }
4840
+ function decodeExtFeatureMetadata(scenegraph) {
4841
+ const extension = scenegraph.getExtension(EXT_FEATURE_METADATA);
4842
+ const schemaClasses = extension?.schema?.classes;
4843
+ const featureTables = extension?.featureTables;
4844
+ const featureTextures = extension?.featureTextures;
4845
+ if (featureTextures) {
4846
+ console.warn('featureTextures is not yet supported in the "EXT_feature_metadata" extension.');
4847
+ }
4848
+ if (schemaClasses && featureTables) {
4849
+ for (const schemaName in schemaClasses) {
4850
+ const schemaClass = schemaClasses[schemaName];
4851
+ const featureTable = findFeatureTableByName(featureTables, schemaName);
4852
+ if (featureTable) {
4853
+ handleFeatureTableProperties(scenegraph, featureTable, schemaClass);
4854
+ }
4855
+ }
4856
+ }
4857
+ }
4858
+ function handleFeatureTableProperties(scenegraph, featureTable, schemaClass) {
4859
+ for (const propertyName in schemaClass.properties) {
4860
+ const schemaProperty = schemaClass.properties[propertyName];
4861
+ const featureTableProperty = featureTable?.properties?.[propertyName];
4862
+ const numberOfFeatures = featureTable.count;
4863
+ if (featureTableProperty) {
4864
+ const data = getPropertyDataFromBinarySource(scenegraph, schemaProperty, numberOfFeatures, featureTableProperty);
4865
+ featureTableProperty.data = data;
4866
+ }
4867
+ }
4868
+ }
4869
+ function getPropertyDataFromBinarySource(scenegraph, schemaProperty, numberOfFeatures, featureTableProperty) {
4870
+ const bufferView = featureTableProperty.bufferView;
4871
+ let data = scenegraph.getTypedArrayForBufferView(bufferView);
4872
+ switch (schemaProperty.type) {
4873
+ case "STRING": {
4874
+ const stringOffsetBufferView = featureTableProperty.stringOffsetBufferView;
4875
+ const offsetsData = scenegraph.getTypedArrayForBufferView(stringOffsetBufferView);
4876
+ data = getStringAttributes(data, offsetsData, numberOfFeatures);
4877
+ break;
4878
+ }
4879
+ default:
4880
+ }
4881
+ return data;
4882
+ }
4883
+ function findFeatureTableByName(featureTables, schemaClassName) {
4884
+ for (const featureTableName in featureTables) {
4885
+ const featureTable = featureTables[featureTableName];
4886
+ if (featureTable.class === schemaClassName) {
4887
+ return featureTable;
4888
+ }
4889
+ }
4890
+ return null;
4891
+ }
4892
+ function getStringAttributes(data, offsetsData, stringsCount) {
4893
+ const stringsArray = [];
4894
+ const textDecoder = new TextDecoder("utf8");
4895
+ let stringOffset = 0;
4896
+ const bytesPerStringSize = 4;
4897
+ for (let index = 0; index < stringsCount; index++) {
4898
+ const stringByteSize = offsetsData[(index + 1) * bytesPerStringSize] - offsetsData[index * bytesPerStringSize];
4899
+ const stringData = data.subarray(stringOffset, stringByteSize + stringOffset);
4900
+ const stringAttribute = textDecoder.decode(stringData);
4901
+ stringsArray.push(stringAttribute);
4902
+ stringOffset += stringByteSize;
4903
+ }
4904
+ return stringsArray;
4905
+ }
4906
+ var EXT_FEATURE_METADATA, name9;
4907
+ var init_EXT_feature_metadata = __esm({
4908
+ "src/lib/extensions/deprecated/EXT_feature_metadata.ts"() {
4909
+ init_gltf_scenegraph();
4910
+ EXT_FEATURE_METADATA = "EXT_feature_metadata";
4911
+ name9 = EXT_FEATURE_METADATA;
4912
+ }
4913
+ });
4914
+
4827
4915
  // src/lib/api/gltf-extensions.ts
4828
4916
  function preprocessExtensions(gltf, options = {}, context) {
4829
4917
  const extensions = EXTENSIONS2.filter((extension) => useExtension(extension.name, options));
@@ -4853,6 +4941,7 @@
4853
4941
  init_KHR_lights_punctual();
4854
4942
  init_KHR_materials_unlit();
4855
4943
  init_KHR_techniques_webgl();
4944
+ init_EXT_feature_metadata();
4856
4945
  EXTENSIONS2 = [
4857
4946
  EXT_meshopt_compression_exports,
4858
4947
  EXT_texture_webp_exports,
@@ -4861,7 +4950,8 @@
4861
4950
  KHR_lights_punctual_exports,
4862
4951
  KHR_materials_unlit_exports,
4863
4952
  KHR_techniques_webgl_exports,
4864
- KHR_texture_transform_exports
4953
+ KHR_texture_transform_exports,
4954
+ EXT_feature_metadata_exports
4865
4955
  ];
4866
4956
  }
4867
4957
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA;;AACA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFImagePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA;;AACA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFImagePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp,\n GLTF_EXT_feature_metadata\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\n"],"file":"index.js"}
@@ -31,6 +31,8 @@ var KHR_materials_unlit = _interopRequireWildcard(require("../extensions/depreca
31
31
 
32
32
  var KHR_techniques_webgl = _interopRequireWildcard(require("../extensions/deprecated/KHR_techniques_webgl"));
33
33
 
34
+ var EXT_feature_metadata = _interopRequireWildcard(require("../extensions/deprecated/EXT_feature_metadata"));
35
+
34
36
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
37
 
36
38
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -41,7 +43,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
41
43
 
42
44
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
43
45
 
44
- var EXTENSIONS = [EXT_meshopt_compression, EXT_texture_webp, KHR_texture_basisu, KHR_draco_mesh_compression, KHR_lights_punctual, KHR_materials_unlit, KHR_techniques_webgl, KHR_texture_transform];
46
+ var EXTENSIONS = [EXT_meshopt_compression, EXT_texture_webp, KHR_texture_basisu, KHR_draco_mesh_compression, KHR_lights_punctual, KHR_materials_unlit, KHR_techniques_webgl, KHR_texture_transform, EXT_feature_metadata];
45
47
  exports.EXTENSIONS = EXTENSIONS;
46
48
 
47
49
  function preprocessExtensions(gltf) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api/gltf-extensions.ts"],"names":["EXTENSIONS","EXT_meshopt_compression","EXT_texture_webp","KHR_texture_basisu","KHR_draco_mesh_compression","KHR_lights_punctual","KHR_materials_unlit","KHR_techniques_webgl","KHR_texture_transform","preprocessExtensions","gltf","options","context","extensions","filter","extension","useExtension","name","preprocess","decodeExtensions","decode","extensionName","excludes","excludeExtensions","exclude"],"mappings":";;;;;;;;;;;;;;;;;AAQA;;AACA;;AACA;;AACA;;AACA;;AAGA;;AACA;;AACA;;;;;;;;;;;;AAuBO,IAAMA,UAAiC,GAAG,CAM/CC,uBAN+C,EAO/CC,gBAP+C,EAS/CC,kBAT+C,EAU/CC,0BAV+C,EAW/CC,mBAX+C,EAY/CC,mBAZ+C,EAa/CC,oBAb+C,EAc/CC,qBAd+C,CAA1C;;;AAkBA,SAASC,oBAAT,CAA8BC,IAA9B,EAA+E;AAAA,MAA3CC,OAA2C,uEAAd,EAAc;AAAA,MAAVC,OAAU;AACpF,MAAMC,UAAU,GAAGb,UAAU,CAACc,MAAX,CAAkB,UAACC,SAAD;AAAA,WAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA3B;AAAA,GAAlB,CAAnB;;AADoF,6CAE5DE,UAF4D;AAAA;;AAAA;AAEpF,wDAAoC;AAAA;;AAAA,UAAzBE,SAAyB;AAClC,+BAAAA,SAAS,CAACG,UAAV,qFAAAH,SAAS,EAAcL,IAAd,EAAoBC,OAApB,EAA6BC,OAA7B,CAAT;AACD;AAJmF;AAAA;AAAA;AAAA;AAAA;AAKrF;;SAGqBO,gB;;;;;gFAAf,iBAAgCT,IAAhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAsCC,YAAAA,OAAtC,2DAAmE,EAAnE;AAAuEC,YAAAA,OAAvE;AACCC,YAAAA,UADD,GACcb,UAAU,CAACc,MAAX,CAAkB,UAACC,SAAD;AAAA,qBAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA3B;AAAA,aAAlB,CADd;AAAA,oDAEmBE,UAFnB;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAEME,YAAAA,SAFN;AAAA;AAAA,wCAKGA,SAAS,CAACK,MALb,sDAKG,uBAAAL,SAAS,EAAUL,IAAV,EAAgBC,OAAhB,EAAyBC,OAAzB,CALZ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AASP,SAASI,YAAT,CAAsBK,aAAtB,EAA6CV,OAA7C,EAAyE;AAAA;;AACvE,MAAMW,QAAQ,GAAG,CAAAX,OAAO,SAAP,IAAAA,OAAO,WAAP,6BAAAA,OAAO,CAAED,IAAT,gEAAea,iBAAf,KAAoC,EAArD;AACA,MAAMC,OAAO,GAAGH,aAAa,IAAIC,QAAjB,IAA6B,CAACA,QAAQ,CAACD,aAAD,CAAtD;AACA,SAAO,CAACG,OAAR;AACD","sourcesContent":["/* eslint-disable camelcase */\nimport {GLTF} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\n// GLTF 1.0 extensions (decode only)\n// import * as KHR_binary_gltf from './KHR_draco_mesh_compression';\n\n// GLTF 2.0 Khronos extensions (decode/encode)\nimport * as EXT_meshopt_compression from '../extensions/EXT_meshopt_compression';\nimport * as EXT_texture_webp from '../extensions/EXT_texture_webp';\nimport * as KHR_texture_basisu from '../extensions/KHR_texture_basisu';\nimport * as KHR_draco_mesh_compression from '../extensions/KHR_draco_mesh_compression';\nimport * as KHR_texture_transform from '../extensions/KHR_texture_transform';\n\n// Deprecated. These should be handled by rendering library (e.g. luma.gl), not the loader.\nimport * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';\nimport * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';\nimport * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';\n\n// Vendor extensions\n\ntype GLTFExtensionPlugin = {\n name: string;\n preprocess?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => void;\n decode?: (\n gltfData: {\n json: GLTF;\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[];\n },\n options: GLTFLoaderOptions,\n context\n ) => Promise<void>;\n encode?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions) => void;\n};\n\n/**\n * List of extensions processed by the GLTFLoader\n * Note that may extensions can only be handled on the rendering stage and are left out here\n * These are just extensions that can be handled fully or partially during loading.\n */\nexport const EXTENSIONS: GLTFExtensionPlugin[] = [\n // 1.0\n // KHR_binary_gltf is handled separately - must be processed before other parsing starts\n // KHR_binary_gltf,\n\n // 2.0\n EXT_meshopt_compression,\n EXT_texture_webp,\n // Basisu should come after webp, we want basisu to be preferred if both are provided\n KHR_texture_basisu,\n KHR_draco_mesh_compression,\n KHR_lights_punctual,\n KHR_materials_unlit,\n KHR_techniques_webgl,\n KHR_texture_transform\n];\n\n/** Call before any resource loading starts */\nexport function preprocessExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n extension.preprocess?.(gltf, options, context);\n }\n}\n\n/** Call after resource loading */\nexport async function decodeExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n // Note: We decode async extensions sequentially, this might not be necessary\n // Currently we only have Draco, but when we add Basis we may revisit\n await extension.decode?.(gltf, options, context);\n }\n}\n\nfunction useExtension(extensionName: string, options: GLTFLoaderOptions) {\n const excludes = options?.gltf?.excludeExtensions || {};\n const exclude = extensionName in excludes && !excludes[extensionName];\n return !exclude;\n}\n"],"file":"gltf-extensions.js"}
1
+ {"version":3,"sources":["../../../../src/lib/api/gltf-extensions.ts"],"names":["EXTENSIONS","EXT_meshopt_compression","EXT_texture_webp","KHR_texture_basisu","KHR_draco_mesh_compression","KHR_lights_punctual","KHR_materials_unlit","KHR_techniques_webgl","KHR_texture_transform","EXT_feature_metadata","preprocessExtensions","gltf","options","context","extensions","filter","extension","useExtension","name","preprocess","decodeExtensions","decode","extensionName","excludes","excludeExtensions","exclude"],"mappings":";;;;;;;;;;;;;;;;;AAQA;;AACA;;AACA;;AACA;;AACA;;AAGA;;AACA;;AACA;;AACA;;;;;;;;;;;;AAuBO,IAAMA,UAAiC,GAAG,CAM/CC,uBAN+C,EAO/CC,gBAP+C,EAS/CC,kBAT+C,EAU/CC,0BAV+C,EAW/CC,mBAX+C,EAY/CC,mBAZ+C,EAa/CC,oBAb+C,EAc/CC,qBAd+C,EAe/CC,oBAf+C,CAA1C;;;AAmBA,SAASC,oBAAT,CAA8BC,IAA9B,EAA+E;AAAA,MAA3CC,OAA2C,uEAAd,EAAc;AAAA,MAAVC,OAAU;AACpF,MAAMC,UAAU,GAAGd,UAAU,CAACe,MAAX,CAAkB,UAACC,SAAD;AAAA,WAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA3B;AAAA,GAAlB,CAAnB;;AADoF,6CAE5DE,UAF4D;AAAA;;AAAA;AAEpF,wDAAoC;AAAA;;AAAA,UAAzBE,SAAyB;AAClC,+BAAAA,SAAS,CAACG,UAAV,qFAAAH,SAAS,EAAcL,IAAd,EAAoBC,OAApB,EAA6BC,OAA7B,CAAT;AACD;AAJmF;AAAA;AAAA;AAAA;AAAA;AAKrF;;SAGqBO,gB;;;;;gFAAf,iBAAgCT,IAAhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAsCC,YAAAA,OAAtC,2DAAmE,EAAnE;AAAuEC,YAAAA,OAAvE;AACCC,YAAAA,UADD,GACcd,UAAU,CAACe,MAAX,CAAkB,UAACC,SAAD;AAAA,qBAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA3B;AAAA,aAAlB,CADd;AAAA,oDAEmBE,UAFnB;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAEME,YAAAA,SAFN;AAAA;AAAA,wCAKGA,SAAS,CAACK,MALb,sDAKG,uBAAAL,SAAS,EAAUL,IAAV,EAAgBC,OAAhB,EAAyBC,OAAzB,CALZ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AASP,SAASI,YAAT,CAAsBK,aAAtB,EAA6CV,OAA7C,EAAyE;AAAA;;AACvE,MAAMW,QAAQ,GAAG,CAAAX,OAAO,SAAP,IAAAA,OAAO,WAAP,6BAAAA,OAAO,CAAED,IAAT,gEAAea,iBAAf,KAAoC,EAArD;AACA,MAAMC,OAAO,GAAGH,aAAa,IAAIC,QAAjB,IAA6B,CAACA,QAAQ,CAACD,aAAD,CAAtD;AACA,SAAO,CAACG,OAAR;AACD","sourcesContent":["/* eslint-disable camelcase */\nimport {GLTF} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\n// GLTF 1.0 extensions (decode only)\n// import * as KHR_binary_gltf from './KHR_draco_mesh_compression';\n\n// GLTF 2.0 Khronos extensions (decode/encode)\nimport * as EXT_meshopt_compression from '../extensions/EXT_meshopt_compression';\nimport * as EXT_texture_webp from '../extensions/EXT_texture_webp';\nimport * as KHR_texture_basisu from '../extensions/KHR_texture_basisu';\nimport * as KHR_draco_mesh_compression from '../extensions/KHR_draco_mesh_compression';\nimport * as KHR_texture_transform from '../extensions/KHR_texture_transform';\n\n// Deprecated. These should be handled by rendering library (e.g. luma.gl), not the loader.\nimport * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';\nimport * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';\nimport * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';\nimport * as EXT_feature_metadata from '../extensions/deprecated/EXT_feature_metadata';\n\n// Vendor extensions\n\ntype GLTFExtensionPlugin = {\n name: string;\n preprocess?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => void;\n decode?: (\n gltfData: {\n json: GLTF;\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[];\n },\n options: GLTFLoaderOptions,\n context\n ) => Promise<void>;\n encode?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions) => void;\n};\n\n/**\n * List of extensions processed by the GLTFLoader\n * Note that may extensions can only be handled on the rendering stage and are left out here\n * These are just extensions that can be handled fully or partially during loading.\n */\nexport const EXTENSIONS: GLTFExtensionPlugin[] = [\n // 1.0\n // KHR_binary_gltf is handled separately - must be processed before other parsing starts\n // KHR_binary_gltf,\n\n // 2.0\n EXT_meshopt_compression,\n EXT_texture_webp,\n // Basisu should come after webp, we want basisu to be preferred if both are provided\n KHR_texture_basisu,\n KHR_draco_mesh_compression,\n KHR_lights_punctual,\n KHR_materials_unlit,\n KHR_techniques_webgl,\n KHR_texture_transform,\n EXT_feature_metadata\n];\n\n/** Call before any resource loading starts */\nexport function preprocessExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n extension.preprocess?.(gltf, options, context);\n }\n}\n\n/** Call after resource loading */\nexport async function decodeExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n // Note: We decode async extensions sequentially, this might not be necessary\n // Currently we only have Draco, but when we add Basis we may revisit\n await extension.decode?.(gltf, options, context);\n }\n}\n\nfunction useExtension(extensionName: string, options: GLTFLoaderOptions) {\n const excludes = options?.gltf?.excludeExtensions || {};\n const exclude = extensionName in excludes && !excludes[extensionName];\n return !exclude;\n}\n"],"file":"gltf-extensions.js"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.decode = decode;
9
+ exports.name = void 0;
10
+
11
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
+
13
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
+
15
+ var _gltfScenegraph = _interopRequireDefault(require("../../api/gltf-scenegraph"));
16
+
17
+ var EXT_FEATURE_METADATA = 'EXT_feature_metadata';
18
+ var name = EXT_FEATURE_METADATA;
19
+ exports.name = name;
20
+
21
+ function decode(_x) {
22
+ return _decode.apply(this, arguments);
23
+ }
24
+
25
+ function _decode() {
26
+ _decode = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(gltfData) {
27
+ var scenegraph;
28
+ return _regenerator.default.wrap(function _callee$(_context) {
29
+ while (1) {
30
+ switch (_context.prev = _context.next) {
31
+ case 0:
32
+ scenegraph = new _gltfScenegraph.default(gltfData);
33
+ decodeExtFeatureMetadata(scenegraph);
34
+
35
+ case 2:
36
+ case "end":
37
+ return _context.stop();
38
+ }
39
+ }
40
+ }, _callee);
41
+ }));
42
+ return _decode.apply(this, arguments);
43
+ }
44
+
45
+ function decodeExtFeatureMetadata(scenegraph) {
46
+ var _extension$schema;
47
+
48
+ var extension = scenegraph.getExtension(EXT_FEATURE_METADATA);
49
+ var schemaClasses = extension === null || extension === void 0 ? void 0 : (_extension$schema = extension.schema) === null || _extension$schema === void 0 ? void 0 : _extension$schema.classes;
50
+ var featureTables = extension === null || extension === void 0 ? void 0 : extension.featureTables;
51
+ var featureTextures = extension === null || extension === void 0 ? void 0 : extension.featureTextures;
52
+
53
+ if (featureTextures) {
54
+ console.warn('featureTextures is not yet supported in the "EXT_feature_metadata" extension.');
55
+ }
56
+
57
+ if (schemaClasses && featureTables) {
58
+ for (var schemaName in schemaClasses) {
59
+ var schemaClass = schemaClasses[schemaName];
60
+ var featureTable = findFeatureTableByName(featureTables, schemaName);
61
+
62
+ if (featureTable) {
63
+ handleFeatureTableProperties(scenegraph, featureTable, schemaClass);
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ function handleFeatureTableProperties(scenegraph, featureTable, schemaClass) {
70
+ for (var propertyName in schemaClass.properties) {
71
+ var _featureTable$propert;
72
+
73
+ var schemaProperty = schemaClass.properties[propertyName];
74
+ var featureTableProperty = featureTable === null || featureTable === void 0 ? void 0 : (_featureTable$propert = featureTable.properties) === null || _featureTable$propert === void 0 ? void 0 : _featureTable$propert[propertyName];
75
+ var numberOfFeatures = featureTable.count;
76
+
77
+ if (featureTableProperty) {
78
+ var data = getPropertyDataFromBinarySource(scenegraph, schemaProperty, numberOfFeatures, featureTableProperty);
79
+ featureTableProperty.data = data;
80
+ }
81
+ }
82
+ }
83
+
84
+ function getPropertyDataFromBinarySource(scenegraph, schemaProperty, numberOfFeatures, featureTableProperty) {
85
+ var bufferView = featureTableProperty.bufferView;
86
+ var data = scenegraph.getTypedArrayForBufferView(bufferView);
87
+
88
+ switch (schemaProperty.type) {
89
+ case 'STRING':
90
+ {
91
+ var stringOffsetBufferView = featureTableProperty.stringOffsetBufferView;
92
+ var offsetsData = scenegraph.getTypedArrayForBufferView(stringOffsetBufferView);
93
+ data = getStringAttributes(data, offsetsData, numberOfFeatures);
94
+ break;
95
+ }
96
+
97
+ default:
98
+ }
99
+
100
+ return data;
101
+ }
102
+
103
+ function findFeatureTableByName(featureTables, schemaClassName) {
104
+ for (var featureTableName in featureTables) {
105
+ var featureTable = featureTables[featureTableName];
106
+
107
+ if (featureTable.class === schemaClassName) {
108
+ return featureTable;
109
+ }
110
+ }
111
+
112
+ return null;
113
+ }
114
+
115
+ function getStringAttributes(data, offsetsData, stringsCount) {
116
+ var stringsArray = [];
117
+ var textDecoder = new TextDecoder('utf8');
118
+ var stringOffset = 0;
119
+ var bytesPerStringSize = 4;
120
+
121
+ for (var index = 0; index < stringsCount; index++) {
122
+ var stringByteSize = offsetsData[(index + 1) * bytesPerStringSize] - offsetsData[index * bytesPerStringSize];
123
+ var stringData = data.subarray(stringOffset, stringByteSize + stringOffset);
124
+ var stringAttribute = textDecoder.decode(stringData);
125
+ stringsArray.push(stringAttribute);
126
+ stringOffset += stringByteSize;
127
+ }
128
+
129
+ return stringsArray;
130
+ }
131
+ //# sourceMappingURL=EXT_feature_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/lib/extensions/deprecated/EXT_feature_metadata.ts"],"names":["EXT_FEATURE_METADATA","name","decode","gltfData","scenegraph","GLTFScenegraph","decodeExtFeatureMetadata","extension","getExtension","schemaClasses","schema","classes","featureTables","featureTextures","console","warn","schemaName","schemaClass","featureTable","findFeatureTableByName","handleFeatureTableProperties","propertyName","properties","schemaProperty","featureTableProperty","numberOfFeatures","count","data","getPropertyDataFromBinarySource","bufferView","getTypedArrayForBufferView","type","stringOffsetBufferView","offsetsData","getStringAttributes","schemaClassName","featureTableName","class","stringsCount","stringsArray","textDecoder","TextDecoder","stringOffset","bytesPerStringSize","index","stringByteSize","stringData","subarray","stringAttribute","push"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF} from '../../types/gltf-types';\n\nimport GLTFScenegraph from '../../api/gltf-scenegraph';\nimport {\n ClassProperty,\n EXT_feature_metadata_class_object,\n EXT_feature_metadata_feature_table,\n FeatureTableProperty,\n GLTF_EXT_feature_metadata\n} from '../../types/gltf-json-schema';\n\n/** Extension name */\nconst EXT_FEATURE_METADATA = 'EXT_feature_metadata';\n\nexport const name = EXT_FEATURE_METADATA;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n const scenegraph = new GLTFScenegraph(gltfData);\n decodeExtFeatureMetadata(scenegraph);\n}\n\n/**\n * Decodes feature metadata from extension\n * @param scenegraph\n */\nfunction decodeExtFeatureMetadata(scenegraph: GLTFScenegraph): void {\n const extension: GLTF_EXT_feature_metadata | null = scenegraph.getExtension(EXT_FEATURE_METADATA);\n const schemaClasses = extension?.schema?.classes;\n const featureTables = extension?.featureTables;\n const featureTextures = extension?.featureTextures;\n\n if (featureTextures) {\n /*\n * TODO add support for featureTextures\n * Spec - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata#feature-textures\n */\n // eslint-disable-next-line no-console\n console.warn('featureTextures is not yet supported in the \"EXT_feature_metadata\" extension.');\n }\n\n if (schemaClasses && featureTables) {\n for (const schemaName in schemaClasses) {\n const schemaClass = schemaClasses[schemaName];\n const featureTable = findFeatureTableByName(featureTables, schemaName);\n\n if (featureTable) {\n handleFeatureTableProperties(scenegraph, featureTable, schemaClass);\n }\n }\n }\n}\n\n/**\n * Navigate throw all properies in feature table and gets properties data.\n * @param scenegraph\n * @param featureTable\n * @param schemaClass\n */\nfunction handleFeatureTableProperties(\n scenegraph: GLTFScenegraph,\n featureTable: EXT_feature_metadata_feature_table,\n schemaClass: EXT_feature_metadata_class_object\n): void {\n for (const propertyName in schemaClass.properties) {\n const schemaProperty = schemaClass.properties[propertyName];\n const featureTableProperty = featureTable?.properties?.[propertyName];\n const numberOfFeatures = featureTable.count;\n\n if (featureTableProperty) {\n const data = getPropertyDataFromBinarySource(\n scenegraph,\n schemaProperty,\n numberOfFeatures,\n featureTableProperty\n );\n featureTableProperty.data = data;\n }\n }\n}\n\n/**\n * Decode properties from binary sourse based on property type.\n * @param scenegraph\n * @param schemaProperty\n * @param numberOfFeatures\n * @param featureTableProperty\n */\nfunction getPropertyDataFromBinarySource(\n scenegraph: GLTFScenegraph,\n schemaProperty: ClassProperty,\n numberOfFeatures: number,\n featureTableProperty: FeatureTableProperty\n): Uint8Array | string[] {\n const bufferView = featureTableProperty.bufferView;\n // TODO think maybe we shouldn't get data only in Uint8Array format.\n let data: Uint8Array | string[] = scenegraph.getTypedArrayForBufferView(bufferView);\n\n switch (schemaProperty.type) {\n case 'STRING': {\n // stringOffsetBufferView should be available for string type.\n const stringOffsetBufferView = featureTableProperty.stringOffsetBufferView!;\n const offsetsData = scenegraph.getTypedArrayForBufferView(stringOffsetBufferView);\n data = getStringAttributes(data, offsetsData, numberOfFeatures);\n break;\n }\n default:\n }\n\n return data;\n}\n\n/**\n * Find the feature table by class name.\n * @param featureTables\n * @param schemaClassName\n */\nfunction findFeatureTableByName(\n featureTables: {[key: string]: EXT_feature_metadata_feature_table},\n schemaClassName: string\n): EXT_feature_metadata_feature_table | null {\n for (const featureTableName in featureTables) {\n const featureTable = featureTables[featureTableName];\n\n if (featureTable.class === schemaClassName) {\n return featureTable;\n }\n }\n\n return null;\n}\n\n/**\n * Getting string attributes from binary data.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata#strings\n * @param data\n * @param offsetsData\n * @param stringsCount\n */\nfunction getStringAttributes(\n data: Uint8Array,\n offsetsData: Uint8Array,\n stringsCount: number\n): string[] {\n const stringsArray: string[] = [];\n const textDecoder = new TextDecoder('utf8');\n\n let stringOffset = 0;\n const bytesPerStringSize = 4;\n\n for (let index = 0; index < stringsCount; index++) {\n // TODO check if it is multiplication on bytesPerStringSize is valid operation?\n const stringByteSize =\n offsetsData[(index + 1) * bytesPerStringSize] - offsetsData[index * bytesPerStringSize];\n const stringData = data.subarray(stringOffset, stringByteSize + stringOffset);\n const stringAttribute = textDecoder.decode(stringData);\n\n stringsArray.push(stringAttribute);\n stringOffset += stringByteSize;\n }\n\n return stringsArray;\n}\n"],"file":"EXT_feature_metadata.js"}
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VERSION = void 0;
7
- var VERSION = typeof "3.3.0-alpha.1" !== 'undefined' ? "3.3.0-alpha.1" : 'latest';
7
+ var VERSION = typeof "3.3.0-alpha.2" !== 'undefined' ? "3.3.0-alpha.2" : 'latest';
8
8
  exports.VERSION = VERSION;
9
9
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":["GLTFLoader","GLTFWriter","GLBLoader","GLBWriter","default","GLTFScenegraph","postProcessGLTF"],"mappings":"AA6BA,SAAQA,UAAR,QAAyB,eAAzB;AACA,SAAQC,UAAR,QAAyB,eAAzB;AAGA,SAAQC,SAAR,QAAwB,cAAxB;AACA,SAAQC,SAAR,QAAwB,cAAxB;AAGA,SAAQC,OAAO,IAAIC,cAAnB,QAAwC,2BAAxC;AACA,SAAQC,eAAR,QAA8B,6BAA9B","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFImagePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":["GLTFLoader","GLTFWriter","GLBLoader","GLBWriter","default","GLTFScenegraph","postProcessGLTF"],"mappings":"AA8BA,SAAQA,UAAR,QAAyB,eAAzB;AACA,SAAQC,UAAR,QAAyB,eAAzB;AAGA,SAAQC,SAAR,QAAwB,cAAxB;AACA,SAAQC,SAAR,QAAwB,cAAxB;AAGA,SAAQC,OAAO,IAAIC,cAAnB,QAAwC,2BAAxC;AACA,SAAQC,eAAR,QAA8B,6BAA9B","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFImagePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp,\n GLTF_EXT_feature_metadata\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\n"],"file":"index.js"}
@@ -6,7 +6,8 @@ import * as KHR_texture_transform from '../extensions/KHR_texture_transform';
6
6
  import * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';
7
7
  import * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';
8
8
  import * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';
9
- export const EXTENSIONS = [EXT_meshopt_compression, EXT_texture_webp, KHR_texture_basisu, KHR_draco_mesh_compression, KHR_lights_punctual, KHR_materials_unlit, KHR_techniques_webgl, KHR_texture_transform];
9
+ import * as EXT_feature_metadata from '../extensions/deprecated/EXT_feature_metadata';
10
+ export const EXTENSIONS = [EXT_meshopt_compression, EXT_texture_webp, KHR_texture_basisu, KHR_draco_mesh_compression, KHR_lights_punctual, KHR_materials_unlit, KHR_techniques_webgl, KHR_texture_transform, EXT_feature_metadata];
10
11
  export function preprocessExtensions(gltf, options = {}, context) {
11
12
  const extensions = EXTENSIONS.filter(extension => useExtension(extension.name, options));
12
13
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api/gltf-extensions.ts"],"names":["EXT_meshopt_compression","EXT_texture_webp","KHR_texture_basisu","KHR_draco_mesh_compression","KHR_texture_transform","KHR_lights_punctual","KHR_materials_unlit","KHR_techniques_webgl","EXTENSIONS","preprocessExtensions","gltf","options","context","extensions","filter","extension","useExtension","name","preprocess","decodeExtensions","decode","extensionName","excludes","excludeExtensions","exclude"],"mappings":"AAQA,OAAO,KAAKA,uBAAZ,MAAyC,uCAAzC;AACA,OAAO,KAAKC,gBAAZ,MAAkC,gCAAlC;AACA,OAAO,KAAKC,kBAAZ,MAAoC,kCAApC;AACA,OAAO,KAAKC,0BAAZ,MAA4C,0CAA5C;AACA,OAAO,KAAKC,qBAAZ,MAAuC,qCAAvC;AAGA,OAAO,KAAKC,mBAAZ,MAAqC,8CAArC;AACA,OAAO,KAAKC,mBAAZ,MAAqC,8CAArC;AACA,OAAO,KAAKC,oBAAZ,MAAsC,+CAAtC;AAuBA,OAAO,MAAMC,UAAiC,GAAG,CAM/CR,uBAN+C,EAO/CC,gBAP+C,EAS/CC,kBAT+C,EAU/CC,0BAV+C,EAW/CE,mBAX+C,EAY/CC,mBAZ+C,EAa/CC,oBAb+C,EAc/CH,qBAd+C,CAA1C;AAkBP,OAAO,SAASK,oBAAT,CAA8BC,IAA9B,EAAoCC,OAA0B,GAAG,EAAjE,EAAqEC,OAArE,EAA+E;AACpF,QAAMC,UAAU,GAAGL,UAAU,CAACM,MAAX,CAAmBC,SAAD,IAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA7C,CAAnB;;AACA,OAAK,MAAMI,SAAX,IAAwBF,UAAxB,EAAoC;AAAA;;AAClC,6BAAAE,SAAS,CAACG,UAAV,qFAAAH,SAAS,EAAcL,IAAd,EAAoBC,OAApB,EAA6BC,OAA7B,CAAT;AACD;AACF;AAGD,OAAO,eAAeO,gBAAf,CAAgCT,IAAhC,EAAsCC,OAA0B,GAAG,EAAnE,EAAuEC,OAAvE,EAAiF;AACtF,QAAMC,UAAU,GAAGL,UAAU,CAACM,MAAX,CAAmBC,SAAD,IAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA7C,CAAnB;;AACA,OAAK,MAAMI,SAAX,IAAwBF,UAAxB,EAAoC;AAAA;;AAGlC,gCAAME,SAAS,CAACK,MAAhB,sDAAM,uBAAAL,SAAS,EAAUL,IAAV,EAAgBC,OAAhB,EAAyBC,OAAzB,CAAf;AACD;AACF;;AAED,SAASI,YAAT,CAAsBK,aAAtB,EAA6CV,OAA7C,EAAyE;AAAA;;AACvE,QAAMW,QAAQ,GAAG,CAAAX,OAAO,SAAP,IAAAA,OAAO,WAAP,6BAAAA,OAAO,CAAED,IAAT,gEAAea,iBAAf,KAAoC,EAArD;AACA,QAAMC,OAAO,GAAGH,aAAa,IAAIC,QAAjB,IAA6B,CAACA,QAAQ,CAACD,aAAD,CAAtD;AACA,SAAO,CAACG,OAAR;AACD","sourcesContent":["/* eslint-disable camelcase */\nimport {GLTF} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\n// GLTF 1.0 extensions (decode only)\n// import * as KHR_binary_gltf from './KHR_draco_mesh_compression';\n\n// GLTF 2.0 Khronos extensions (decode/encode)\nimport * as EXT_meshopt_compression from '../extensions/EXT_meshopt_compression';\nimport * as EXT_texture_webp from '../extensions/EXT_texture_webp';\nimport * as KHR_texture_basisu from '../extensions/KHR_texture_basisu';\nimport * as KHR_draco_mesh_compression from '../extensions/KHR_draco_mesh_compression';\nimport * as KHR_texture_transform from '../extensions/KHR_texture_transform';\n\n// Deprecated. These should be handled by rendering library (e.g. luma.gl), not the loader.\nimport * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';\nimport * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';\nimport * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';\n\n// Vendor extensions\n\ntype GLTFExtensionPlugin = {\n name: string;\n preprocess?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => void;\n decode?: (\n gltfData: {\n json: GLTF;\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[];\n },\n options: GLTFLoaderOptions,\n context\n ) => Promise<void>;\n encode?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions) => void;\n};\n\n/**\n * List of extensions processed by the GLTFLoader\n * Note that may extensions can only be handled on the rendering stage and are left out here\n * These are just extensions that can be handled fully or partially during loading.\n */\nexport const EXTENSIONS: GLTFExtensionPlugin[] = [\n // 1.0\n // KHR_binary_gltf is handled separately - must be processed before other parsing starts\n // KHR_binary_gltf,\n\n // 2.0\n EXT_meshopt_compression,\n EXT_texture_webp,\n // Basisu should come after webp, we want basisu to be preferred if both are provided\n KHR_texture_basisu,\n KHR_draco_mesh_compression,\n KHR_lights_punctual,\n KHR_materials_unlit,\n KHR_techniques_webgl,\n KHR_texture_transform\n];\n\n/** Call before any resource loading starts */\nexport function preprocessExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n extension.preprocess?.(gltf, options, context);\n }\n}\n\n/** Call after resource loading */\nexport async function decodeExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n // Note: We decode async extensions sequentially, this might not be necessary\n // Currently we only have Draco, but when we add Basis we may revisit\n await extension.decode?.(gltf, options, context);\n }\n}\n\nfunction useExtension(extensionName: string, options: GLTFLoaderOptions) {\n const excludes = options?.gltf?.excludeExtensions || {};\n const exclude = extensionName in excludes && !excludes[extensionName];\n return !exclude;\n}\n"],"file":"gltf-extensions.js"}
1
+ {"version":3,"sources":["../../../../src/lib/api/gltf-extensions.ts"],"names":["EXT_meshopt_compression","EXT_texture_webp","KHR_texture_basisu","KHR_draco_mesh_compression","KHR_texture_transform","KHR_lights_punctual","KHR_materials_unlit","KHR_techniques_webgl","EXT_feature_metadata","EXTENSIONS","preprocessExtensions","gltf","options","context","extensions","filter","extension","useExtension","name","preprocess","decodeExtensions","decode","extensionName","excludes","excludeExtensions","exclude"],"mappings":"AAQA,OAAO,KAAKA,uBAAZ,MAAyC,uCAAzC;AACA,OAAO,KAAKC,gBAAZ,MAAkC,gCAAlC;AACA,OAAO,KAAKC,kBAAZ,MAAoC,kCAApC;AACA,OAAO,KAAKC,0BAAZ,MAA4C,0CAA5C;AACA,OAAO,KAAKC,qBAAZ,MAAuC,qCAAvC;AAGA,OAAO,KAAKC,mBAAZ,MAAqC,8CAArC;AACA,OAAO,KAAKC,mBAAZ,MAAqC,8CAArC;AACA,OAAO,KAAKC,oBAAZ,MAAsC,+CAAtC;AACA,OAAO,KAAKC,oBAAZ,MAAsC,+CAAtC;AAuBA,OAAO,MAAMC,UAAiC,GAAG,CAM/CT,uBAN+C,EAO/CC,gBAP+C,EAS/CC,kBAT+C,EAU/CC,0BAV+C,EAW/CE,mBAX+C,EAY/CC,mBAZ+C,EAa/CC,oBAb+C,EAc/CH,qBAd+C,EAe/CI,oBAf+C,CAA1C;AAmBP,OAAO,SAASE,oBAAT,CAA8BC,IAA9B,EAAoCC,OAA0B,GAAG,EAAjE,EAAqEC,OAArE,EAA+E;AACpF,QAAMC,UAAU,GAAGL,UAAU,CAACM,MAAX,CAAmBC,SAAD,IAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA7C,CAAnB;;AACA,OAAK,MAAMI,SAAX,IAAwBF,UAAxB,EAAoC;AAAA;;AAClC,6BAAAE,SAAS,CAACG,UAAV,qFAAAH,SAAS,EAAcL,IAAd,EAAoBC,OAApB,EAA6BC,OAA7B,CAAT;AACD;AACF;AAGD,OAAO,eAAeO,gBAAf,CAAgCT,IAAhC,EAAsCC,OAA0B,GAAG,EAAnE,EAAuEC,OAAvE,EAAiF;AACtF,QAAMC,UAAU,GAAGL,UAAU,CAACM,MAAX,CAAmBC,SAAD,IAAeC,YAAY,CAACD,SAAS,CAACE,IAAX,EAAiBN,OAAjB,CAA7C,CAAnB;;AACA,OAAK,MAAMI,SAAX,IAAwBF,UAAxB,EAAoC;AAAA;;AAGlC,gCAAME,SAAS,CAACK,MAAhB,sDAAM,uBAAAL,SAAS,EAAUL,IAAV,EAAgBC,OAAhB,EAAyBC,OAAzB,CAAf;AACD;AACF;;AAED,SAASI,YAAT,CAAsBK,aAAtB,EAA6CV,OAA7C,EAAyE;AAAA;;AACvE,QAAMW,QAAQ,GAAG,CAAAX,OAAO,SAAP,IAAAA,OAAO,WAAP,6BAAAA,OAAO,CAAED,IAAT,gEAAea,iBAAf,KAAoC,EAArD;AACA,QAAMC,OAAO,GAAGH,aAAa,IAAIC,QAAjB,IAA6B,CAACA,QAAQ,CAACD,aAAD,CAAtD;AACA,SAAO,CAACG,OAAR;AACD","sourcesContent":["/* eslint-disable camelcase */\nimport {GLTF} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\n// GLTF 1.0 extensions (decode only)\n// import * as KHR_binary_gltf from './KHR_draco_mesh_compression';\n\n// GLTF 2.0 Khronos extensions (decode/encode)\nimport * as EXT_meshopt_compression from '../extensions/EXT_meshopt_compression';\nimport * as EXT_texture_webp from '../extensions/EXT_texture_webp';\nimport * as KHR_texture_basisu from '../extensions/KHR_texture_basisu';\nimport * as KHR_draco_mesh_compression from '../extensions/KHR_draco_mesh_compression';\nimport * as KHR_texture_transform from '../extensions/KHR_texture_transform';\n\n// Deprecated. These should be handled by rendering library (e.g. luma.gl), not the loader.\nimport * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';\nimport * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';\nimport * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';\nimport * as EXT_feature_metadata from '../extensions/deprecated/EXT_feature_metadata';\n\n// Vendor extensions\n\ntype GLTFExtensionPlugin = {\n name: string;\n preprocess?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => void;\n decode?: (\n gltfData: {\n json: GLTF;\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[];\n },\n options: GLTFLoaderOptions,\n context\n ) => Promise<void>;\n encode?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions) => void;\n};\n\n/**\n * List of extensions processed by the GLTFLoader\n * Note that may extensions can only be handled on the rendering stage and are left out here\n * These are just extensions that can be handled fully or partially during loading.\n */\nexport const EXTENSIONS: GLTFExtensionPlugin[] = [\n // 1.0\n // KHR_binary_gltf is handled separately - must be processed before other parsing starts\n // KHR_binary_gltf,\n\n // 2.0\n EXT_meshopt_compression,\n EXT_texture_webp,\n // Basisu should come after webp, we want basisu to be preferred if both are provided\n KHR_texture_basisu,\n KHR_draco_mesh_compression,\n KHR_lights_punctual,\n KHR_materials_unlit,\n KHR_techniques_webgl,\n KHR_texture_transform,\n EXT_feature_metadata\n];\n\n/** Call before any resource loading starts */\nexport function preprocessExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n extension.preprocess?.(gltf, options, context);\n }\n}\n\n/** Call after resource loading */\nexport async function decodeExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n for (const extension of extensions) {\n // Note: We decode async extensions sequentially, this might not be necessary\n // Currently we only have Draco, but when we add Basis we may revisit\n await extension.decode?.(gltf, options, context);\n }\n}\n\nfunction useExtension(extensionName: string, options: GLTFLoaderOptions) {\n const excludes = options?.gltf?.excludeExtensions || {};\n const exclude = extensionName in excludes && !excludes[extensionName];\n return !exclude;\n}\n"],"file":"gltf-extensions.js"}
@@ -0,0 +1,95 @@
1
+ import GLTFScenegraph from '../../api/gltf-scenegraph';
2
+ const EXT_FEATURE_METADATA = 'EXT_feature_metadata';
3
+ export const name = EXT_FEATURE_METADATA;
4
+ export async function decode(gltfData) {
5
+ const scenegraph = new GLTFScenegraph(gltfData);
6
+ decodeExtFeatureMetadata(scenegraph);
7
+ }
8
+
9
+ function decodeExtFeatureMetadata(scenegraph) {
10
+ var _extension$schema;
11
+
12
+ const extension = scenegraph.getExtension(EXT_FEATURE_METADATA);
13
+ const schemaClasses = extension === null || extension === void 0 ? void 0 : (_extension$schema = extension.schema) === null || _extension$schema === void 0 ? void 0 : _extension$schema.classes;
14
+ const featureTables = extension === null || extension === void 0 ? void 0 : extension.featureTables;
15
+ const featureTextures = extension === null || extension === void 0 ? void 0 : extension.featureTextures;
16
+
17
+ if (featureTextures) {
18
+ console.warn('featureTextures is not yet supported in the "EXT_feature_metadata" extension.');
19
+ }
20
+
21
+ if (schemaClasses && featureTables) {
22
+ for (const schemaName in schemaClasses) {
23
+ const schemaClass = schemaClasses[schemaName];
24
+ const featureTable = findFeatureTableByName(featureTables, schemaName);
25
+
26
+ if (featureTable) {
27
+ handleFeatureTableProperties(scenegraph, featureTable, schemaClass);
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+ function handleFeatureTableProperties(scenegraph, featureTable, schemaClass) {
34
+ for (const propertyName in schemaClass.properties) {
35
+ var _featureTable$propert;
36
+
37
+ const schemaProperty = schemaClass.properties[propertyName];
38
+ const featureTableProperty = featureTable === null || featureTable === void 0 ? void 0 : (_featureTable$propert = featureTable.properties) === null || _featureTable$propert === void 0 ? void 0 : _featureTable$propert[propertyName];
39
+ const numberOfFeatures = featureTable.count;
40
+
41
+ if (featureTableProperty) {
42
+ const data = getPropertyDataFromBinarySource(scenegraph, schemaProperty, numberOfFeatures, featureTableProperty);
43
+ featureTableProperty.data = data;
44
+ }
45
+ }
46
+ }
47
+
48
+ function getPropertyDataFromBinarySource(scenegraph, schemaProperty, numberOfFeatures, featureTableProperty) {
49
+ const bufferView = featureTableProperty.bufferView;
50
+ let data = scenegraph.getTypedArrayForBufferView(bufferView);
51
+
52
+ switch (schemaProperty.type) {
53
+ case 'STRING':
54
+ {
55
+ const stringOffsetBufferView = featureTableProperty.stringOffsetBufferView;
56
+ const offsetsData = scenegraph.getTypedArrayForBufferView(stringOffsetBufferView);
57
+ data = getStringAttributes(data, offsetsData, numberOfFeatures);
58
+ break;
59
+ }
60
+
61
+ default:
62
+ }
63
+
64
+ return data;
65
+ }
66
+
67
+ function findFeatureTableByName(featureTables, schemaClassName) {
68
+ for (const featureTableName in featureTables) {
69
+ const featureTable = featureTables[featureTableName];
70
+
71
+ if (featureTable.class === schemaClassName) {
72
+ return featureTable;
73
+ }
74
+ }
75
+
76
+ return null;
77
+ }
78
+
79
+ function getStringAttributes(data, offsetsData, stringsCount) {
80
+ const stringsArray = [];
81
+ const textDecoder = new TextDecoder('utf8');
82
+ let stringOffset = 0;
83
+ const bytesPerStringSize = 4;
84
+
85
+ for (let index = 0; index < stringsCount; index++) {
86
+ const stringByteSize = offsetsData[(index + 1) * bytesPerStringSize] - offsetsData[index * bytesPerStringSize];
87
+ const stringData = data.subarray(stringOffset, stringByteSize + stringOffset);
88
+ const stringAttribute = textDecoder.decode(stringData);
89
+ stringsArray.push(stringAttribute);
90
+ stringOffset += stringByteSize;
91
+ }
92
+
93
+ return stringsArray;
94
+ }
95
+ //# sourceMappingURL=EXT_feature_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/lib/extensions/deprecated/EXT_feature_metadata.ts"],"names":["GLTFScenegraph","EXT_FEATURE_METADATA","name","decode","gltfData","scenegraph","decodeExtFeatureMetadata","extension","getExtension","schemaClasses","schema","classes","featureTables","featureTextures","console","warn","schemaName","schemaClass","featureTable","findFeatureTableByName","handleFeatureTableProperties","propertyName","properties","schemaProperty","featureTableProperty","numberOfFeatures","count","data","getPropertyDataFromBinarySource","bufferView","getTypedArrayForBufferView","type","stringOffsetBufferView","offsetsData","getStringAttributes","schemaClassName","featureTableName","class","stringsCount","stringsArray","textDecoder","TextDecoder","stringOffset","bytesPerStringSize","index","stringByteSize","stringData","subarray","stringAttribute","push"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF} from '../../types/gltf-types';\n\nimport GLTFScenegraph from '../../api/gltf-scenegraph';\nimport {\n ClassProperty,\n EXT_feature_metadata_class_object,\n EXT_feature_metadata_feature_table,\n FeatureTableProperty,\n GLTF_EXT_feature_metadata\n} from '../../types/gltf-json-schema';\n\n/** Extension name */\nconst EXT_FEATURE_METADATA = 'EXT_feature_metadata';\n\nexport const name = EXT_FEATURE_METADATA;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n const scenegraph = new GLTFScenegraph(gltfData);\n decodeExtFeatureMetadata(scenegraph);\n}\n\n/**\n * Decodes feature metadata from extension\n * @param scenegraph\n */\nfunction decodeExtFeatureMetadata(scenegraph: GLTFScenegraph): void {\n const extension: GLTF_EXT_feature_metadata | null = scenegraph.getExtension(EXT_FEATURE_METADATA);\n const schemaClasses = extension?.schema?.classes;\n const featureTables = extension?.featureTables;\n const featureTextures = extension?.featureTextures;\n\n if (featureTextures) {\n /*\n * TODO add support for featureTextures\n * Spec - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata#feature-textures\n */\n // eslint-disable-next-line no-console\n console.warn('featureTextures is not yet supported in the \"EXT_feature_metadata\" extension.');\n }\n\n if (schemaClasses && featureTables) {\n for (const schemaName in schemaClasses) {\n const schemaClass = schemaClasses[schemaName];\n const featureTable = findFeatureTableByName(featureTables, schemaName);\n\n if (featureTable) {\n handleFeatureTableProperties(scenegraph, featureTable, schemaClass);\n }\n }\n }\n}\n\n/**\n * Navigate throw all properies in feature table and gets properties data.\n * @param scenegraph\n * @param featureTable\n * @param schemaClass\n */\nfunction handleFeatureTableProperties(\n scenegraph: GLTFScenegraph,\n featureTable: EXT_feature_metadata_feature_table,\n schemaClass: EXT_feature_metadata_class_object\n): void {\n for (const propertyName in schemaClass.properties) {\n const schemaProperty = schemaClass.properties[propertyName];\n const featureTableProperty = featureTable?.properties?.[propertyName];\n const numberOfFeatures = featureTable.count;\n\n if (featureTableProperty) {\n const data = getPropertyDataFromBinarySource(\n scenegraph,\n schemaProperty,\n numberOfFeatures,\n featureTableProperty\n );\n featureTableProperty.data = data;\n }\n }\n}\n\n/**\n * Decode properties from binary sourse based on property type.\n * @param scenegraph\n * @param schemaProperty\n * @param numberOfFeatures\n * @param featureTableProperty\n */\nfunction getPropertyDataFromBinarySource(\n scenegraph: GLTFScenegraph,\n schemaProperty: ClassProperty,\n numberOfFeatures: number,\n featureTableProperty: FeatureTableProperty\n): Uint8Array | string[] {\n const bufferView = featureTableProperty.bufferView;\n // TODO think maybe we shouldn't get data only in Uint8Array format.\n let data: Uint8Array | string[] = scenegraph.getTypedArrayForBufferView(bufferView);\n\n switch (schemaProperty.type) {\n case 'STRING': {\n // stringOffsetBufferView should be available for string type.\n const stringOffsetBufferView = featureTableProperty.stringOffsetBufferView!;\n const offsetsData = scenegraph.getTypedArrayForBufferView(stringOffsetBufferView);\n data = getStringAttributes(data, offsetsData, numberOfFeatures);\n break;\n }\n default:\n }\n\n return data;\n}\n\n/**\n * Find the feature table by class name.\n * @param featureTables\n * @param schemaClassName\n */\nfunction findFeatureTableByName(\n featureTables: {[key: string]: EXT_feature_metadata_feature_table},\n schemaClassName: string\n): EXT_feature_metadata_feature_table | null {\n for (const featureTableName in featureTables) {\n const featureTable = featureTables[featureTableName];\n\n if (featureTable.class === schemaClassName) {\n return featureTable;\n }\n }\n\n return null;\n}\n\n/**\n * Getting string attributes from binary data.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata#strings\n * @param data\n * @param offsetsData\n * @param stringsCount\n */\nfunction getStringAttributes(\n data: Uint8Array,\n offsetsData: Uint8Array,\n stringsCount: number\n): string[] {\n const stringsArray: string[] = [];\n const textDecoder = new TextDecoder('utf8');\n\n let stringOffset = 0;\n const bytesPerStringSize = 4;\n\n for (let index = 0; index < stringsCount; index++) {\n // TODO check if it is multiplication on bytesPerStringSize is valid operation?\n const stringByteSize =\n offsetsData[(index + 1) * bytesPerStringSize] - offsetsData[index * bytesPerStringSize];\n const stringData = data.subarray(stringOffset, stringByteSize + stringOffset);\n const stringAttribute = textDecoder.decode(stringData);\n\n stringsArray.push(stringAttribute);\n stringOffset += stringByteSize;\n }\n\n return stringsArray;\n}\n"],"file":"EXT_feature_metadata.js"}
@@ -1,2 +1,2 @@
1
- export const VERSION = typeof "3.3.0-alpha.1" !== 'undefined' ? "3.3.0-alpha.1" : 'latest';
1
+ export const VERSION = typeof "3.3.0-alpha.2" !== 'undefined' ? "3.3.0-alpha.2" : 'latest';
2
2
  //# sourceMappingURL=version.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export type { GLB } from './lib/types/glb-types';
2
- export type { GLTF, GLTFAccessor, GLTFBuffer, GLTFBufferView, GLTFMeshPrimitive, GLTFMesh, GLTFNode, GLTFMaterial, GLTFSampler, GLTFScene, GLTFSkin, GLTFTexture, GLTFImage, GLTFPostprocessed, GLTFNodePostprocessed, GLTFMaterialPostprocessed, GLTFImagePostprocessed, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp } from './lib/types/gltf-types';
2
+ export type { GLTF, GLTFAccessor, GLTFBuffer, GLTFBufferView, GLTFMeshPrimitive, GLTFMesh, GLTFNode, GLTFMaterial, GLTFSampler, GLTFScene, GLTFSkin, GLTFTexture, GLTFImage, GLTFPostprocessed, GLTFNodePostprocessed, GLTFMaterialPostprocessed, GLTFImagePostprocessed, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp, GLTF_EXT_feature_metadata } from './lib/types/gltf-types';
3
3
  export { GLTFLoader } from './gltf-loader';
4
4
  export { GLTFWriter } from './gltf-writer';
5
5
  export { GLBLoader } from './glb-loader';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAC;AAC/C,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EAEtB,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAC,IAAI,EAAC,MAAM,8BAA8B,CAAC;AACvD,YAAY,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAC;AAC/C,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EAEtB,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAC,IAAI,EAAC,MAAM,8BAA8B,CAAC;AACvD,YAAY,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-extensions.d.ts","sourceRoot":"","sources":["../../../src/lib/api/gltf-extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AACzC,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAmBzD,aAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAC,IAAI,EAAE,IAAI,CAAA;KAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,KAAA,KAAK,IAAI,CAAC;IACnF,MAAM,CAAC,EAAE,CACP,QAAQ,EAAE;QACR,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,EAAE;YAAC,WAAW,EAAE,WAAW,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;KAC/E,EACD,OAAO,EAAE,iBAAiB,EAC1B,OAAO,KAAA,KACJ,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAC,IAAI,EAAE,IAAI,CAAA;KAAC,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACvE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,mBAAmB,EAe3C,CAAC;AAEF,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,IAAI,KAAA,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,KAAA,QAKnF;AAED,kCAAkC;AAClC,wBAAsB,gBAAgB,CAAC,IAAI,KAAA,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,KAAA,iBAOrF"}
1
+ {"version":3,"file":"gltf-extensions.d.ts","sourceRoot":"","sources":["../../../src/lib/api/gltf-extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AACzC,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAoBzD,aAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAC,IAAI,EAAE,IAAI,CAAA;KAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,KAAA,KAAK,IAAI,CAAC;IACnF,MAAM,CAAC,EAAE,CACP,QAAQ,EAAE;QACR,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,EAAE;YAAC,WAAW,EAAE,WAAW,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;KAC/E,EACD,OAAO,EAAE,iBAAiB,EAC1B,OAAO,KAAA,KACJ,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAC,IAAI,EAAE,IAAI,CAAA;KAAC,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACvE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,mBAAmB,EAgB3C,CAAC;AAEF,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,IAAI,KAAA,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,KAAA,QAKnF;AAED,kCAAkC;AAClC,wBAAsB,gBAAgB,CAAC,IAAI,KAAA,EAAE,OAAO,GAAE,iBAAsB,EAAE,OAAO,CAAC,KAAA,iBAOrF"}