@loaders.gl/gltf 3.0.12 → 3.1.0-alpha.4
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.
- package/dist/dist.min.js +1 -1
- package/dist/dist.min.js.map +1 -1
- package/dist/es5/bundle.js +2 -4
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/gltf-loader.js.map +1 -1
- package/dist/es5/index.js +0 -8
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/api/gltf-extensions.js +146 -0
- package/dist/es5/lib/api/gltf-extensions.js.map +1 -0
- package/dist/es5/lib/api/gltf-scenegraph.js.map +1 -1
- package/dist/es5/lib/api/normalize-gltf-v1.js +1 -1
- package/dist/es5/lib/api/normalize-gltf-v1.js.map +1 -1
- package/dist/es5/lib/extensions/EXT_meshopt_compression.js +32 -21
- package/dist/es5/lib/extensions/EXT_meshopt_compression.js.map +1 -1
- package/dist/es5/lib/extensions/EXT_texture_webp.js +60 -0
- package/dist/es5/lib/extensions/EXT_texture_webp.js.map +1 -0
- package/dist/es5/lib/extensions/KHR_binary_gltf.js +13 -13
- package/dist/es5/lib/extensions/KHR_binary_gltf.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js +55 -32
- package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_texture_basisu.js +49 -0
- package/dist/es5/lib/extensions/KHR_texture_basisu.js.map +1 -0
- package/dist/es5/lib/extensions/{KHR_lights_punctual.js → deprecated/KHR_lights_punctual.js} +13 -10
- package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
- package/dist/es5/lib/extensions/{KHR_materials_unlit.js → deprecated/KHR_materials_unlit.js} +10 -7
- package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
- package/dist/es5/lib/extensions/{KHR_techniques_webgl.js → deprecated/KHR_techniques_webgl.js} +10 -7
- package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
- package/dist/es5/lib/gltf-utils/gltf-constants.js +0 -13
- package/dist/es5/lib/gltf-utils/gltf-constants.js.map +1 -1
- package/dist/es5/lib/parsers/parse-gltf.js +71 -28
- package/dist/es5/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/lib/utils/version.js.map +1 -1
- package/dist/es5/webp/webp.js +104 -0
- package/dist/es5/webp/webp.js.map +1 -0
- package/dist/esm/bundle.js +2 -4
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/gltf-loader.js.map +1 -1
- package/dist/esm/index.js +0 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/api/gltf-extensions.js +35 -0
- package/dist/esm/lib/api/gltf-extensions.js.map +1 -0
- package/dist/esm/lib/api/gltf-scenegraph.js.map +1 -1
- package/dist/esm/lib/api/normalize-gltf-v1.js +1 -1
- package/dist/esm/lib/api/normalize-gltf-v1.js.map +1 -1
- package/dist/esm/lib/extensions/EXT_meshopt_compression.js +16 -8
- package/dist/esm/lib/extensions/EXT_meshopt_compression.js.map +1 -1
- package/dist/esm/lib/extensions/EXT_texture_webp.js +32 -0
- package/dist/esm/lib/extensions/EXT_texture_webp.js.map +1 -0
- package/dist/esm/lib/extensions/KHR_binary_gltf.js +8 -8
- package/dist/esm/lib/extensions/KHR_binary_gltf.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js +9 -1
- package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_texture_basisu.js +22 -0
- package/dist/esm/lib/extensions/KHR_texture_basisu.js.map +1 -0
- package/dist/esm/lib/extensions/{KHR_lights_punctual.js → deprecated/KHR_lights_punctual.js} +4 -3
- package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
- package/dist/esm/lib/extensions/{KHR_materials_unlit.js → deprecated/KHR_materials_unlit.js} +3 -2
- package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
- package/dist/esm/lib/extensions/{KHR_techniques_webgl.js → deprecated/KHR_techniques_webgl.js} +3 -2
- package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
- package/dist/esm/lib/gltf-utils/gltf-constants.js +0 -6
- package/dist/esm/lib/gltf-utils/gltf-constants.js.map +1 -1
- package/dist/esm/lib/parsers/parse-gltf.js +23 -5
- package/dist/esm/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/esm/lib/utils/version.js +1 -1
- package/dist/esm/lib/utils/version.js.map +1 -1
- package/dist/esm/webp/webp.js +29 -0
- package/dist/esm/webp/webp.js.map +1 -0
- package/package.json +6 -6
- package/src/bundle.ts +2 -3
- package/src/gltf-loader.ts +7 -4
- package/src/index.ts +8 -4
- package/src/lib/api/gltf-extensions.ts +71 -0
- package/src/lib/api/gltf-scenegraph.ts +4 -6
- package/src/lib/api/normalize-gltf-v1.js +2 -1
- package/src/lib/extensions/EXT_meshopt_compression.ts +32 -23
- package/src/lib/extensions/EXT_texture_webp.ts +45 -0
- package/src/lib/extensions/KHR_binary_gltf.ts +19 -10
- package/src/lib/extensions/KHR_draco_mesh_compression.ts +31 -11
- package/src/lib/extensions/KHR_texture_basisu.ts +36 -0
- package/src/lib/extensions/{KHR_lights_punctual.ts → deprecated/KHR_lights_punctual.ts} +7 -4
- package/src/lib/extensions/{KHR_materials_unlit.ts → deprecated/KHR_materials_unlit.ts} +6 -3
- package/src/lib/extensions/{KHR_techniques_webgl.ts → deprecated/KHR_techniques_webgl.ts} +6 -3
- package/src/lib/gltf-utils/gltf-constants.ts +0 -12
- package/src/lib/parsers/parse-gltf.ts +55 -19
- package/src/lib/types/gltf-json-schema.ts +96 -3
- package/src/lib/types/gltf-types.ts +19 -21
- package/src/webp/webp.ts +41 -0
- package/dist/dist.es5.min.js +0 -2
- package/dist/dist.es5.min.js.map +0 -1
- package/dist/es5/lib/extensions/KHR_lights_punctual.js.map +0 -1
- package/dist/es5/lib/extensions/KHR_materials_unlit.js.map +0 -1
- package/dist/es5/lib/extensions/KHR_techniques_webgl.js.map +0 -1
- package/dist/es5/lib/extensions/gltf-extensions.js +0 -92
- package/dist/es5/lib/extensions/gltf-extensions.js.map +0 -1
- package/dist/esm/lib/extensions/KHR_lights_punctual.js.map +0 -1
- package/dist/esm/lib/extensions/KHR_materials_unlit.js.map +0 -1
- package/dist/esm/lib/extensions/KHR_techniques_webgl.js.map +0 -1
- package/dist/esm/lib/extensions/gltf-extensions.js +0 -24
- package/dist/esm/lib/extensions/gltf-extensions.js.map +0 -1
- package/src/lib/extensions/gltf-extensions.ts +0 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/api/normalize-gltf-v1.js"],"names":["KHR_binary_glTF","GLTF_ARRAYS","accessors","animations","buffers","bufferViews","images","materials","meshes","nodes","samplers","scenes","skins","textures","GLTF_KEYS","accessor","buffer","bufferView","image","material","mesh","node","sampler","scene","skin","texture","GLTFV1Normalizer","constructor","gltf","idToIndexMap","normalize","options","json","asset","version","undefined","console","warn","Error","_addAsset","_convertTopLevelObjectsToArrays","decode","_convertObjectIdsToArrayIndices","_updateObjects","_updateMaterial","generator","arrayName","_convertTopLevelObjectToArray","mapName","objectMap","Array","isArray","id","object","index","length","push","_convertIdsToIndices","_convertIdToIndex","_convertTextureIds","_convertMeshIds","_convertNodeIds","_convertSceneIds","source","primitive","primitives","attributes","indices","attributeName","children","map","child","topLevelArrayName","key","Number","isFinite","type","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","textureId","values","tex","textureIndex","findIndex","baseColorTexture","normalizeGLTFV1"],"mappings":"AACA,OAAO,KAAKA,eAAZ,MAAiC,+BAAjC;AA+CA,MAAMC,WAAW,GAAG;AAClBC,EAAAA,SAAS,EAAE,UADO;AAElBC,EAAAA,UAAU,EAAE,WAFM;AAGlBC,EAAAA,OAAO,EAAE,QAHS;AAIlBC,EAAAA,WAAW,EAAE,YAJK;AAKlBC,EAAAA,MAAM,EAAE,OALU;AAMlBC,EAAAA,SAAS,EAAE,UANO;AAOlBC,EAAAA,MAAM,EAAE,MAPU;AAQlBC,EAAAA,KAAK,EAAE,MARW;AASlBC,EAAAA,QAAQ,EAAE,SATQ;AAUlBC,EAAAA,MAAM,EAAE,OAVU;AAWlBC,EAAAA,KAAK,EAAE,MAXW;AAYlBC,EAAAA,QAAQ,EAAE;AAZQ,CAApB;AAeA,MAAMC,SAAS,GAAG;AAChBC,EAAAA,QAAQ,EAAE,WADM;AAEhBZ,EAAAA,UAAU,EAAE,WAFI;AAGhBa,EAAAA,MAAM,EAAE,SAHQ;AAIhBC,EAAAA,UAAU,EAAE,aAJI;AAKhBC,EAAAA,KAAK,EAAE,QALS;AAMhBC,EAAAA,QAAQ,EAAE,WANM;AAOhBC,EAAAA,IAAI,EAAE,QAPU;AAQhBC,EAAAA,IAAI,EAAE,OARU;AAShBC,EAAAA,OAAO,EAAE,UATO;AAUhBC,EAAAA,KAAK,EAAE,QAVS;AAWhBC,EAAAA,IAAI,EAAE,OAXU;AAYhBC,EAAAA,OAAO,EAAE;AAZO,CAAlB;;AAkBA,MAAMC,gBAAN,CAAuB;AACrBC,EAAAA,WAAW,CAACC,IAAD,EAAO;AAChB,SAAKC,YAAL,GAAoB;AAClB1B,MAAAA,UAAU,EAAE,EADM;AAElBD,MAAAA,SAAS,EAAE,EAFO;AAGlBE,MAAAA,OAAO,EAAE,EAHS;AAIlBC,MAAAA,WAAW,EAAE,EAJK;AAKlBC,MAAAA,MAAM,EAAE,EALU;AAMlBC,MAAAA,SAAS,EAAE,EANO;AAOlBC,MAAAA,MAAM,EAAE,EAPU;AAQlBC,MAAAA,KAAK,EAAE,EARW;AASlBC,MAAAA,QAAQ,EAAE,EATQ;AAUlBC,MAAAA,MAAM,EAAE,EAVU;AAWlBC,MAAAA,KAAK,EAAE,EAXW;AAYlBC,MAAAA,QAAQ,EAAE;AAZQ,KAApB;AAcD;;AAQDiB,EAAAA,SAAS,CAACF,IAAD,EAAOG,OAAP,EAAgB;AACvB,SAAKC,IAAL,GAAYJ,IAAI,CAACI,IAAjB;AACA,UAAMA,IAAI,GAAGJ,IAAI,CAACI,IAAlB;;AAGA,YAAQA,IAAI,CAACC,KAAL,IAAcD,IAAI,CAACC,KAAL,CAAWC,OAAjC;AAEE,WAAK,KAAL;AACE;;AAGF,WAAKC,SAAL;AACA,WAAK,KAAL;AACE;;AAEF;AAEEC,QAAAA,OAAO,CAACC,IAAR,CAAc,yBAAwBL,IAAI,CAACC,KAAL,CAAWC,OAAQ,EAAzD;AACA;AAbJ;;AAgBA,QAAI,CAACH,OAAO,CAACD,SAAb,EAAwB;AAEtB,YAAM,IAAIQ,KAAJ,CAAU,2BAAV,CAAN;AACD;;AAGDF,IAAAA,OAAO,CAACC,IAAR,CAAa,0EAAb;;AAEA,SAAKE,SAAL,CAAeP,IAAf;;AAGA,SAAKQ,+BAAL,CAAqCR,IAArC;;AAIAhC,IAAAA,eAAe,CAACyC,MAAhB,CAAuBb,IAAvB;;AAGA,SAAKc,+BAAL,CAAqCV,IAArC;;AAEA,SAAKW,cAAL,CAAoBX,IAApB;;AAEA,SAAKY,eAAL,CAAqBZ,IAArB;AACD;;AAGDO,EAAAA,SAAS,CAACP,IAAD,EAAO;AACdA,IAAAA,IAAI,CAACC,KAAL,GAAaD,IAAI,CAACC,KAAL,IAAc,EAA3B;AAEAD,IAAAA,IAAI,CAACC,KAAL,CAAWC,OAAX,GAAqB,KAArB;AACAF,IAAAA,IAAI,CAACC,KAAL,CAAWY,SAAX,GAAuBb,IAAI,CAACC,KAAL,CAAWY,SAAX,IAAwB,sCAA/C;AACD;;AAEDL,EAAAA,+BAA+B,CAACR,IAAD,EAAO;AAEpC,SAAK,MAAMc,SAAX,IAAwB7C,WAAxB,EAAqC;AACnC,WAAK8C,6BAAL,CAAmCf,IAAnC,EAAyCc,SAAzC;AACD;AACF;;AAGDC,EAAAA,6BAA6B,CAACf,IAAD,EAAOgB,OAAP,EAAgB;AAC3C,UAAMC,SAAS,GAAGjB,IAAI,CAACgB,OAAD,CAAtB;;AACA,QAAI,CAACC,SAAD,IAAcC,KAAK,CAACC,OAAN,CAAcF,SAAd,CAAlB,EAA4C;AAC1C;AACD;;AAGDjB,IAAAA,IAAI,CAACgB,OAAD,CAAJ,GAAgB,EAAhB;;AAEA,SAAK,MAAMI,EAAX,IAAiBH,SAAjB,EAA4B;AAC1B,YAAMI,MAAM,GAAGJ,SAAS,CAACG,EAAD,CAAxB;AACAC,MAAAA,MAAM,CAACD,EAAP,GAAYC,MAAM,CAACD,EAAP,IAAaA,EAAzB;AACA,YAAME,KAAK,GAAGtB,IAAI,CAACgB,OAAD,CAAJ,CAAcO,MAA5B;AACAvB,MAAAA,IAAI,CAACgB,OAAD,CAAJ,CAAcQ,IAAd,CAAmBH,MAAnB;AACA,WAAKxB,YAAL,CAAkBmB,OAAlB,EAA2BI,EAA3B,IAAiCE,KAAjC;AACD;AACF;;AAGDZ,EAAAA,+BAA+B,CAACV,IAAD,EAAO;AACpC,SAAK,MAAMc,SAAX,IAAwB7C,WAAxB,EAAqC;AACnC,WAAKwD,oBAAL,CAA0BzB,IAA1B,EAAgCc,SAAhC;AACD;;AACD,QAAI,WAAWd,IAAf,EAAqB;AACnBA,MAAAA,IAAI,CAACT,KAAL,GAAa,KAAKmC,iBAAL,CAAuB1B,IAAI,CAACT,KAA5B,EAAmC,OAAnC,CAAb;AACD;;AAKD,SAAK,MAAME,OAAX,IAAsBO,IAAI,CAACnB,QAA3B,EAAqC;AACnC,WAAK8C,kBAAL,CAAwBlC,OAAxB;AACD;;AACD,SAAK,MAAML,IAAX,IAAmBY,IAAI,CAACxB,MAAxB,EAAgC;AAC9B,WAAKoD,eAAL,CAAqBxC,IAArB;AACD;;AACD,SAAK,MAAMC,IAAX,IAAmBW,IAAI,CAACvB,KAAxB,EAA+B;AAC7B,WAAKoD,eAAL,CAAqBxC,IAArB;AACD;;AACD,SAAK,MAAMA,IAAX,IAAmBW,IAAI,CAACrB,MAAxB,EAAgC;AAC9B,WAAKmD,gBAAL,CAAsBzC,IAAtB;AACD;AACF;;AAEDsC,EAAAA,kBAAkB,CAAClC,OAAD,EAAU;AAC1B,QAAIA,OAAO,CAACsC,MAAZ,EAAoB;AAClBtC,MAAAA,OAAO,CAACsC,MAAR,GAAiB,KAAKL,iBAAL,CAAuBjC,OAAO,CAACsC,MAA/B,EAAuC,OAAvC,CAAjB;AACD;AACF;;AAEDH,EAAAA,eAAe,CAACxC,IAAD,EAAO;AACpB,SAAK,MAAM4C,SAAX,IAAwB5C,IAAI,CAAC6C,UAA7B,EAAyC;AACvC,YAAM;AAACC,QAAAA,UAAD;AAAaC,QAAAA,OAAb;AAAsBhD,QAAAA;AAAtB,UAAkC6C,SAAxC;;AACA,WAAK,MAAMI,aAAX,IAA4BF,UAA5B,EAAwC;AACtCA,QAAAA,UAAU,CAACE,aAAD,CAAV,GAA4B,KAAKV,iBAAL,CAAuBQ,UAAU,CAACE,aAAD,CAAjC,EAAkD,UAAlD,CAA5B;AACD;;AACD,UAAID,OAAJ,EAAa;AACXH,QAAAA,SAAS,CAACG,OAAV,GAAoB,KAAKT,iBAAL,CAAuBS,OAAvB,EAAgC,UAAhC,CAApB;AACD;;AACD,UAAIhD,QAAJ,EAAc;AACZ6C,QAAAA,SAAS,CAAC7C,QAAV,GAAqB,KAAKuC,iBAAL,CAAuBvC,QAAvB,EAAiC,UAAjC,CAArB;AACD;AACF;AACF;;AAED0C,EAAAA,eAAe,CAACxC,IAAD,EAAO;AACpB,QAAIA,IAAI,CAACgD,QAAT,EAAmB;AACjBhD,MAAAA,IAAI,CAACgD,QAAL,GAAgBhD,IAAI,CAACgD,QAAL,CAAcC,GAAd,CAAmBC,KAAD,IAAW,KAAKb,iBAAL,CAAuBa,KAAvB,EAA8B,MAA9B,CAA7B,CAAhB;AACD;;AACD,QAAIlD,IAAI,CAACb,MAAT,EAAiB;AACfa,MAAAA,IAAI,CAACb,MAAL,GAAca,IAAI,CAACb,MAAL,CAAY8D,GAAZ,CAAiBlD,IAAD,IAAU,KAAKsC,iBAAL,CAAuBtC,IAAvB,EAA6B,MAA7B,CAA1B,CAAd;AACD;AACF;;AAED0C,EAAAA,gBAAgB,CAACvC,KAAD,EAAQ;AACtB,QAAIA,KAAK,CAACd,KAAV,EAAiB;AACfc,MAAAA,KAAK,CAACd,KAAN,GAAcc,KAAK,CAACd,KAAN,CAAY6D,GAAZ,CAAiBjD,IAAD,IAAU,KAAKqC,iBAAL,CAAuBrC,IAAvB,EAA6B,MAA7B,CAA1B,CAAd;AACD;AACF;;AAGDoC,EAAAA,oBAAoB,CAACzB,IAAD,EAAOwC,iBAAP,EAA0B;AAC5C,QAAI,CAACxC,IAAI,CAACwC,iBAAD,CAAT,EAA8B;AAC5BpC,MAAAA,OAAO,CAACC,IAAR,CAAc,2CAA0CmC,iBAAkB,EAA1E;AACAxC,MAAAA,IAAI,CAACwC,iBAAD,CAAJ,GAA0B,EAA1B;AACD;;AACD,SAAK,MAAMnB,MAAX,IAAqBrB,IAAI,CAACwC,iBAAD,CAAzB,EAA8C;AAC5C,WAAK,MAAMC,GAAX,IAAkBpB,MAAlB,EAA0B;AACxB,cAAMD,EAAE,GAAGC,MAAM,CAACoB,GAAD,CAAjB;;AACA,cAAMnB,KAAK,GAAG,KAAKI,iBAAL,CAAuBN,EAAvB,EAA2BqB,GAA3B,CAAd;;AACApB,QAAAA,MAAM,CAACoB,GAAD,CAAN,GAAcnB,KAAd;AACD;AACF;AACF;;AAEDI,EAAAA,iBAAiB,CAACN,EAAD,EAAKqB,GAAL,EAAU;AACzB,UAAM3B,SAAS,GAAGhC,SAAS,CAAC2D,GAAD,CAA3B;;AACA,QAAI3B,SAAS,IAAI,KAAKjB,YAAtB,EAAoC;AAClC,YAAMyB,KAAK,GAAG,KAAKzB,YAAL,CAAkBiB,SAAlB,EAA6BM,EAA7B,CAAd;;AACA,UAAI,CAACsB,MAAM,CAACC,QAAP,CAAgBrB,KAAhB,CAAL,EAA6B;AAC3B,cAAM,IAAIhB,KAAJ,CAAW,8BAA6BmC,GAAI,YAAWrB,EAAG,EAA1D,CAAN;AACD;;AACD,aAAOE,KAAP;AACD;;AACD,WAAOF,EAAP;AACD;;AAMDT,EAAAA,cAAc,CAACX,IAAD,EAAO;AACnB,SAAK,MAAMhB,MAAX,IAAqB,KAAKgB,IAAL,CAAU5B,OAA/B,EAAwC;AAEtC,aAAOY,MAAM,CAAC4D,IAAd;AACD;AACF;;AAMDhC,EAAAA,eAAe,CAACZ,IAAD,EAAO;AACpB,SAAK,MAAMb,QAAX,IAAuBa,IAAI,CAACzB,SAA5B,EAAuC;AACrCY,MAAAA,QAAQ,CAAC0D,oBAAT,GAAgC;AAC9BC,QAAAA,eAAe,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADa;AAE9BC,QAAAA,cAAc,EAAE,CAFc;AAG9BC,QAAAA,eAAe,EAAE;AAHa,OAAhC;AAMA,YAAMC,SAAS,GAAG9D,QAAQ,CAAC+D,MAAT,IAAmB/D,QAAQ,CAAC+D,MAAT,CAAgBC,GAArD;AACA,YAAMC,YAAY,GAAGpD,IAAI,CAACnB,QAAL,CAAcwE,SAAd,CAAyB5D,OAAD,IAAaA,OAAO,CAAC2B,EAAR,KAAe6B,SAApD,CAArB;;AACA,UAAIG,YAAY,KAAK,CAAC,CAAtB,EAAyB;AACvBjE,QAAAA,QAAQ,CAAC0D,oBAAT,CAA8BS,gBAA9B,GAAiD;AAAChC,UAAAA,KAAK,EAAE8B;AAAR,SAAjD;AACD;AACF;AACF;;AA9NoB;;AAiOvB,OAAO,SAASG,eAAT,CAAyB3D,IAAzB,EAA+BG,OAAO,GAAG,EAAzC,EAA6C;AAClD,SAAO,IAAIL,gBAAJ,GAAuBI,SAAvB,CAAiCF,IAAjC,EAAuCG,OAAvC,CAAP;AACD","sourcesContent":["/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n accessors: 'accessor',\n animations: 'animation',\n buffers: 'buffer',\n bufferViews: 'bufferView',\n images: 'image',\n materials: 'material',\n meshes: 'mesh',\n nodes: 'node',\n samplers: 'sampler',\n scenes: 'scene',\n skins: 'skin',\n textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n accessor: 'accessors',\n animations: 'animation',\n buffer: 'buffers',\n bufferView: 'bufferViews',\n image: 'images',\n material: 'materials',\n mesh: 'meshes',\n node: 'nodes',\n sampler: 'samplers',\n scene: 'scenes',\n skin: 'skins',\n texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n constructor(gltf) {\n this.idToIndexMap = {\n animations: {},\n accessors: {},\n buffers: {},\n bufferViews: {},\n images: {},\n materials: {},\n meshes: {},\n nodes: {},\n samplers: {},\n scenes: {},\n skins: {},\n textures: {}\n };\n }\n\n /**\n * Convert (normalize) glTF < 2.0 to glTF 2.0\n * @param gltf - object with json and binChunks\n * @param options\n * @param options normalize Whether to actually normalize\n */\n normalize(gltf, options) {\n this.json = gltf.json;\n const json = gltf.json;\n\n // Check version\n switch (json.asset && json.asset.version) {\n // We are converting to v2 format. Return if there is nothing to do\n case '2.0':\n return;\n\n // This class is written to convert 1.0\n case undefined:\n case '1.0':\n break;\n\n default:\n // eslint-disable-next-line no-undef, no-console\n console.warn(`glTF: Unknown version ${json.asset.version}`);\n return;\n }\n\n if (!options.normalize) {\n // We are still missing a few conversion tricks, remove once addressed\n throw new Error('glTF v1 is not supported.');\n }\n\n // eslint-disable-next-line no-undef, no-console\n console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n this._addAsset(json);\n\n // In glTF2 top-level fields are Arrays not Object maps\n this._convertTopLevelObjectsToArrays(json);\n\n // Extract bufferView indices for images\n // (this extension needs to be invoked early in the normalization process)\n KHR_binary_glTF.decode(gltf);\n\n // Convert object references from ids to indices\n this._convertObjectIdsToArrayIndices(json);\n\n this._updateObjects(json);\n\n this._updateMaterial(json);\n }\n\n // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n _addAsset(json) {\n json.asset = json.asset || {};\n // We are normalizing to glTF v2, so change version to \"2.0\"\n json.asset.version = '2.0';\n json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n }\n\n _convertTopLevelObjectsToArrays(json) {\n // TODO check that all arrays are covered\n for (const arrayName in GLTF_ARRAYS) {\n this._convertTopLevelObjectToArray(json, arrayName);\n }\n }\n\n /** Convert one top level object to array */\n _convertTopLevelObjectToArray(json, mapName) {\n const objectMap = json[mapName];\n if (!objectMap || Array.isArray(objectMap)) {\n return;\n }\n\n // Rewrite the top-level field as an array\n json[mapName] = [];\n // Copy the map key into object.id\n for (const id in objectMap) {\n const object = objectMap[id];\n object.id = object.id || id; // Mutates the loaded object\n const index = json[mapName].length;\n json[mapName].push(object);\n this.idToIndexMap[mapName][id] = index;\n }\n }\n\n /** Go through all objects in all top-level arrays and replace ids with indices */\n _convertObjectIdsToArrayIndices(json) {\n for (const arrayName in GLTF_ARRAYS) {\n this._convertIdsToIndices(json, arrayName);\n }\n if ('scene' in json) {\n json.scene = this._convertIdToIndex(json.scene, 'scene');\n }\n\n // Convert any index references that are not using array names\n\n // texture.source (image)\n for (const texture of json.textures) {\n this._convertTextureIds(texture);\n }\n for (const mesh of json.meshes) {\n this._convertMeshIds(mesh);\n }\n for (const node of json.nodes) {\n this._convertNodeIds(node);\n }\n for (const node of json.scenes) {\n this._convertSceneIds(node);\n }\n }\n\n _convertTextureIds(texture) {\n if (texture.source) {\n texture.source = this._convertIdToIndex(texture.source, 'image');\n }\n }\n\n _convertMeshIds(mesh) {\n for (const primitive of mesh.primitives) {\n const {attributes, indices, material} = primitive;\n for (const attributeName in attributes) {\n attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n }\n if (indices) {\n primitive.indices = this._convertIdToIndex(indices, 'accessor');\n }\n if (material) {\n primitive.material = this._convertIdToIndex(material, 'material');\n }\n }\n }\n\n _convertNodeIds(node) {\n if (node.children) {\n node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n }\n if (node.meshes) {\n node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n }\n }\n\n _convertSceneIds(scene) {\n if (scene.nodes) {\n scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n }\n }\n\n /** Go through all objects in a top-level array and replace ids with indices */\n _convertIdsToIndices(json, topLevelArrayName) {\n if (!json[topLevelArrayName]) {\n console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n json[topLevelArrayName] = [];\n }\n for (const object of json[topLevelArrayName]) {\n for (const key in object) {\n const id = object[key];\n const index = this._convertIdToIndex(id, key);\n object[key] = index;\n }\n }\n }\n\n _convertIdToIndex(id, key) {\n const arrayName = GLTF_KEYS[key];\n if (arrayName in this.idToIndexMap) {\n const index = this.idToIndexMap[arrayName][id];\n if (!Number.isFinite(index)) {\n throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n }\n return index;\n }\n return id;\n }\n\n /**\n *\n * @param {*} json\n */\n _updateObjects(json) {\n for (const buffer of this.json.buffers) {\n // - [x] Removed buffer.type, #786, #629\n delete buffer.type;\n }\n }\n\n /**\n * Update material (set pbrMetallicRoughness)\n * @param {*} json\n */\n _updateMaterial(json) {\n for (const material of json.materials) {\n material.pbrMetallicRoughness = {\n baseColorFactor: [1, 1, 1, 1],\n metallicFactor: 1,\n roughnessFactor: 1\n };\n\n const textureId = material.values && material.values.tex;\n const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n if (textureIndex !== -1) {\n material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n }\n }\n }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n return new GLTFV1Normalizer().normalize(gltf, options);\n}\n"],"file":"normalize-gltf-v1.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/api/normalize-gltf-v1.js"],"names":["KHR_binary_glTF","GLTF_ARRAYS","accessors","animations","buffers","bufferViews","images","materials","meshes","nodes","samplers","scenes","skins","textures","GLTF_KEYS","accessor","buffer","bufferView","image","material","mesh","node","sampler","scene","skin","texture","GLTFV1Normalizer","constructor","gltf","idToIndexMap","normalize","options","json","asset","version","undefined","console","warn","Error","_addAsset","_convertTopLevelObjectsToArrays","preprocess","_convertObjectIdsToArrayIndices","_updateObjects","_updateMaterial","generator","arrayName","_convertTopLevelObjectToArray","mapName","objectMap","Array","isArray","id","object","index","length","push","_convertIdsToIndices","_convertIdToIndex","_convertTextureIds","_convertMeshIds","_convertNodeIds","_convertSceneIds","source","primitive","primitives","attributes","indices","attributeName","children","map","child","topLevelArrayName","key","Number","isFinite","type","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","textureId","values","tex","textureIndex","findIndex","baseColorTexture","normalizeGLTFV1"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n accessors: 'accessor',\n animations: 'animation',\n buffers: 'buffer',\n bufferViews: 'bufferView',\n images: 'image',\n materials: 'material',\n meshes: 'mesh',\n nodes: 'node',\n samplers: 'sampler',\n scenes: 'scene',\n skins: 'skin',\n textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n accessor: 'accessors',\n animations: 'animation',\n buffer: 'buffers',\n bufferView: 'bufferViews',\n image: 'images',\n material: 'materials',\n mesh: 'meshes',\n node: 'nodes',\n sampler: 'samplers',\n scene: 'scenes',\n skin: 'skins',\n texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n constructor(gltf) {\n this.idToIndexMap = {\n animations: {},\n accessors: {},\n buffers: {},\n bufferViews: {},\n images: {},\n materials: {},\n meshes: {},\n nodes: {},\n samplers: {},\n scenes: {},\n skins: {},\n textures: {}\n };\n }\n\n /**\n * Convert (normalize) glTF < 2.0 to glTF 2.0\n * @param gltf - object with json and binChunks\n * @param options\n * @param options normalize Whether to actually normalize\n */\n normalize(gltf, options) {\n this.json = gltf.json;\n const json = gltf.json;\n\n // Check version\n switch (json.asset && json.asset.version) {\n // We are converting to v2 format. Return if there is nothing to do\n case '2.0':\n return;\n\n // This class is written to convert 1.0\n case undefined:\n case '1.0':\n break;\n\n default:\n // eslint-disable-next-line no-undef, no-console\n console.warn(`glTF: Unknown version ${json.asset.version}`);\n return;\n }\n\n if (!options.normalize) {\n // We are still missing a few conversion tricks, remove once addressed\n throw new Error('glTF v1 is not supported.');\n }\n\n // eslint-disable-next-line no-undef, no-console\n console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n this._addAsset(json);\n\n // In glTF2 top-level fields are Arrays not Object maps\n this._convertTopLevelObjectsToArrays(json);\n\n // Extract bufferView indices for images\n // (this extension needs to be invoked early in the normalization process)\n // TODO can this be handled by standard extension processing instead of called explicitly?\n KHR_binary_glTF.preprocess(gltf);\n\n // Convert object references from ids to indices\n this._convertObjectIdsToArrayIndices(json);\n\n this._updateObjects(json);\n\n this._updateMaterial(json);\n }\n\n // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n _addAsset(json) {\n json.asset = json.asset || {};\n // We are normalizing to glTF v2, so change version to \"2.0\"\n json.asset.version = '2.0';\n json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n }\n\n _convertTopLevelObjectsToArrays(json) {\n // TODO check that all arrays are covered\n for (const arrayName in GLTF_ARRAYS) {\n this._convertTopLevelObjectToArray(json, arrayName);\n }\n }\n\n /** Convert one top level object to array */\n _convertTopLevelObjectToArray(json, mapName) {\n const objectMap = json[mapName];\n if (!objectMap || Array.isArray(objectMap)) {\n return;\n }\n\n // Rewrite the top-level field as an array\n json[mapName] = [];\n // Copy the map key into object.id\n for (const id in objectMap) {\n const object = objectMap[id];\n object.id = object.id || id; // Mutates the loaded object\n const index = json[mapName].length;\n json[mapName].push(object);\n this.idToIndexMap[mapName][id] = index;\n }\n }\n\n /** Go through all objects in all top-level arrays and replace ids with indices */\n _convertObjectIdsToArrayIndices(json) {\n for (const arrayName in GLTF_ARRAYS) {\n this._convertIdsToIndices(json, arrayName);\n }\n if ('scene' in json) {\n json.scene = this._convertIdToIndex(json.scene, 'scene');\n }\n\n // Convert any index references that are not using array names\n\n // texture.source (image)\n for (const texture of json.textures) {\n this._convertTextureIds(texture);\n }\n for (const mesh of json.meshes) {\n this._convertMeshIds(mesh);\n }\n for (const node of json.nodes) {\n this._convertNodeIds(node);\n }\n for (const node of json.scenes) {\n this._convertSceneIds(node);\n }\n }\n\n _convertTextureIds(texture) {\n if (texture.source) {\n texture.source = this._convertIdToIndex(texture.source, 'image');\n }\n }\n\n _convertMeshIds(mesh) {\n for (const primitive of mesh.primitives) {\n const {attributes, indices, material} = primitive;\n for (const attributeName in attributes) {\n attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n }\n if (indices) {\n primitive.indices = this._convertIdToIndex(indices, 'accessor');\n }\n if (material) {\n primitive.material = this._convertIdToIndex(material, 'material');\n }\n }\n }\n\n _convertNodeIds(node) {\n if (node.children) {\n node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n }\n if (node.meshes) {\n node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n }\n }\n\n _convertSceneIds(scene) {\n if (scene.nodes) {\n scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n }\n }\n\n /** Go through all objects in a top-level array and replace ids with indices */\n _convertIdsToIndices(json, topLevelArrayName) {\n if (!json[topLevelArrayName]) {\n console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n json[topLevelArrayName] = [];\n }\n for (const object of json[topLevelArrayName]) {\n for (const key in object) {\n const id = object[key];\n const index = this._convertIdToIndex(id, key);\n object[key] = index;\n }\n }\n }\n\n _convertIdToIndex(id, key) {\n const arrayName = GLTF_KEYS[key];\n if (arrayName in this.idToIndexMap) {\n const index = this.idToIndexMap[arrayName][id];\n if (!Number.isFinite(index)) {\n throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n }\n return index;\n }\n return id;\n }\n\n /**\n *\n * @param {*} json\n */\n _updateObjects(json) {\n for (const buffer of this.json.buffers) {\n // - [x] Removed buffer.type, #786, #629\n delete buffer.type;\n }\n }\n\n /**\n * Update material (set pbrMetallicRoughness)\n * @param {*} json\n */\n _updateMaterial(json) {\n for (const material of json.materials) {\n material.pbrMetallicRoughness = {\n baseColorFactor: [1, 1, 1, 1],\n metallicFactor: 1,\n roughnessFactor: 1\n };\n\n const textureId = material.values && material.values.tex;\n const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n if (textureIndex !== -1) {\n material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n }\n }\n }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n return new GLTFV1Normalizer().normalize(gltf, options);\n}\n"],"file":"normalize-gltf-v1.js"}
|
|
@@ -1,34 +1,42 @@
|
|
|
1
1
|
import GLTFScenegraph from '../api/gltf-scenegraph';
|
|
2
|
-
import { EXT_MESHOPT_COMPRESSION } from '../gltf-utils/gltf-constants';
|
|
3
2
|
import { isMeshoptSupported, meshoptDecodeGltfBuffer } from '../../meshopt/meshopt-decoder';
|
|
4
3
|
const DEFAULT_MESHOPT_OPTIONS = {
|
|
5
4
|
byteOffset: 0,
|
|
6
5
|
filter: 'NONE'
|
|
7
6
|
};
|
|
7
|
+
const EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';
|
|
8
|
+
export const name = EXT_MESHOPT_COMPRESSION;
|
|
9
|
+
export function preprocess(gltfData) {
|
|
10
|
+
const scenegraph = new GLTFScenegraph(gltfData);
|
|
11
|
+
|
|
12
|
+
if (scenegraph.getRequiredExtensions().includes(EXT_MESHOPT_COMPRESSION) && !isMeshoptSupported()) {
|
|
13
|
+
throw new Error(`gltf: Required extension ${EXT_MESHOPT_COMPRESSION} not supported by browser`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
8
16
|
export async function decode(gltfData, options) {
|
|
9
17
|
var _options$gltf;
|
|
10
18
|
|
|
11
|
-
|
|
19
|
+
const scenegraph = new GLTFScenegraph(gltfData);
|
|
20
|
+
|
|
21
|
+
if (!(options !== null && options !== void 0 && (_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.decompressMeshes)) {
|
|
12
22
|
return;
|
|
13
23
|
}
|
|
14
24
|
|
|
15
25
|
const promises = [];
|
|
16
26
|
|
|
17
27
|
for (const bufferViewIndex of gltfData.json.bufferViews || []) {
|
|
18
|
-
promises.push(decodeMeshoptBufferView(
|
|
28
|
+
promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));
|
|
19
29
|
}
|
|
20
30
|
|
|
21
31
|
await Promise.all(promises);
|
|
22
|
-
const scenegraph = new GLTFScenegraph(gltfData);
|
|
23
32
|
scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);
|
|
24
33
|
}
|
|
25
34
|
|
|
26
|
-
async function decodeMeshoptBufferView(
|
|
27
|
-
const
|
|
28
|
-
const meshoptExtension = bufferView.extensions && bufferView.extensions[EXT_MESHOPT_COMPRESSION];
|
|
35
|
+
async function decodeMeshoptBufferView(scenegraph, bufferView) {
|
|
36
|
+
const meshoptExtension = scenegraph.getObjectExtension(bufferView, EXT_MESHOPT_COMPRESSION);
|
|
29
37
|
|
|
30
38
|
if (meshoptExtension) {
|
|
31
|
-
const buffer =
|
|
39
|
+
const buffer = bufferView.buffer;
|
|
32
40
|
const {
|
|
33
41
|
byteOffset = 0,
|
|
34
42
|
byteLength = 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/extensions/EXT_meshopt_compression.ts"],"names":["GLTFScenegraph","
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/extensions/EXT_meshopt_compression.ts"],"names":["GLTFScenegraph","isMeshoptSupported","meshoptDecodeGltfBuffer","DEFAULT_MESHOPT_OPTIONS","byteOffset","filter","EXT_MESHOPT_COMPRESSION","name","preprocess","gltfData","scenegraph","getRequiredExtensions","includes","Error","decode","options","gltf","decompressMeshes","promises","bufferViewIndex","json","bufferViews","push","decodeMeshoptBufferView","Promise","all","removeExtension","bufferView","meshoptExtension","getObjectExtension","buffer","byteLength","byteStride","count","mode","source","Uint8Array","result","ArrayBuffer"],"mappings":"AAGA,OAAOA,cAAP,MAA2B,wBAA3B;AACA,SAAQC,kBAAR,EAA4BC,uBAA5B,QAA0D,+BAA1D;AAIA,MAAMC,uBAAuB,GAAG;AAC9BC,EAAAA,UAAU,EAAE,CADkB;AAE9BC,EAAAA,MAAM,EAAE;AAFsB,CAAhC;AAMA,MAAMC,uBAAuB,GAAG,yBAAhC;AAEA,OAAO,MAAMC,IAAI,GAAGD,uBAAb;AAEP,OAAO,SAASE,UAAT,CAAoBC,QAApB,EAA4C;AACjD,QAAMC,UAAU,GAAG,IAAIV,cAAJ,CAAmBS,QAAnB,CAAnB;;AACA,MACEC,UAAU,CAACC,qBAAX,GAAmCC,QAAnC,CAA4CN,uBAA5C,KACA,CAACL,kBAAkB,EAFrB,EAGE;AACA,UAAM,IAAIY,KAAJ,CAAW,4BAA2BP,uBAAwB,2BAA9D,CAAN;AACD;AACF;AAED,OAAO,eAAeQ,MAAf,CAAsBL,QAAtB,EAA8CM,OAA9C,EAA0E;AAAA;;AAC/E,QAAML,UAAU,GAAG,IAAIV,cAAJ,CAAmBS,QAAnB,CAAnB;;AAEA,MAAI,EAACM,OAAD,aAACA,OAAD,gCAACA,OAAO,CAAEC,IAAV,0CAAC,cAAeC,gBAAhB,CAAJ,EAAsC;AACpC;AACD;;AAED,QAAMC,QAAwB,GAAG,EAAjC;;AACA,OAAK,MAAMC,eAAX,IAA8BV,QAAQ,CAACW,IAAT,CAAcC,WAAd,IAA6B,EAA3D,EAA+D;AAC7DH,IAAAA,QAAQ,CAACI,IAAT,CAAcC,uBAAuB,CAACb,UAAD,EAAaS,eAAb,CAArC;AACD;;AAGD,QAAMK,OAAO,CAACC,GAAR,CAAYP,QAAZ,CAAN;AAGAR,EAAAA,UAAU,CAACgB,eAAX,CAA2BpB,uBAA3B;AACD;;AAGD,eAAeiB,uBAAf,CACEb,UADF,EAEEiB,UAFF,EAG+B;AAC7B,QAAMC,gBAAgB,GAAGlB,UAAU,CAACmB,kBAAX,CACvBF,UADuB,EAEvBrB,uBAFuB,CAAzB;;AAIA,MAAIsB,gBAAJ,EAAsB;AACpB,UAAME,MAAM,GAAGH,UAAU,CAACG,MAA1B;AAEA,UAAM;AACJ1B,MAAAA,UAAU,GAAG,CADT;AAEJ2B,MAAAA,UAAU,GAAG,CAFT;AAGJC,MAAAA,UAHI;AAIJC,MAAAA,KAJI;AAKJC,MAAAA,IALI;AAMJ7B,MAAAA,MAAM,GAAG;AANL,QAOFuB,gBAPJ;AAUA,UAAMO,MAAM,GAAG,IAAIC,UAAJ,CAAeN,MAAf,EAAuB1B,UAAvB,EAAmC2B,UAAnC,CAAf;AACA,UAAMM,MAAM,GAAG,IAAIC,WAAJ,CAAgBL,KAAK,GAAGD,UAAxB,CAAf;AACA,UAAM9B,uBAAuB,CAAC,IAAIkC,UAAJ,CAAeC,MAAf,CAAD,EAAyBJ,KAAzB,EAAgCD,UAAhC,EAA4CG,MAA5C,EAAoDD,IAApD,EAA0D7B,MAA1D,CAA7B;AACA,WAAOgC,MAAP;AACD;;AAED,SAAO,IAAP;AACD","sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport GLTFScenegraph from '../api/gltf-scenegraph';\nimport {isMeshoptSupported, meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';\n\n// @ts-ignore\n// eslint-disable-next-line\nconst DEFAULT_MESHOPT_OPTIONS = {\n byteOffset: 0,\n filter: 'NONE'\n};\n\n/** Extension name */\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\n\nexport const name = EXT_MESHOPT_COMPRESSION;\n\nexport function preprocess(gltfData: {json: GLTF}) {\n const scenegraph = new GLTFScenegraph(gltfData);\n if (\n scenegraph.getRequiredExtensions().includes(EXT_MESHOPT_COMPRESSION) &&\n !isMeshoptSupported()\n ) {\n throw new Error(`gltf: Required extension ${EXT_MESHOPT_COMPRESSION} not supported by browser`);\n }\n}\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {\n const scenegraph = new GLTFScenegraph(gltfData);\n\n if (!options?.gltf?.decompressMeshes) {\n return;\n }\n\n const promises: Promise<any>[] = [];\n for (const bufferViewIndex of gltfData.json.bufferViews || []) {\n promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extensions\n scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);\n}\n\n/** Decode one meshopt buffer view */\nasync function decodeMeshoptBufferView(\n scenegraph: GLTFScenegraph,\n bufferView: GLTFBufferView\n): Promise<ArrayBuffer | null> {\n const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(\n bufferView,\n EXT_MESHOPT_COMPRESSION\n );\n if (meshoptExtension) {\n const buffer = bufferView.buffer;\n\n const {\n byteOffset = 0,\n byteLength = 0,\n byteStride,\n count,\n mode,\n filter = 'NONE'\n } = meshoptExtension;\n\n // @ts-expect-error TODO - fix buffer handling\n const source = new Uint8Array(buffer, byteOffset, byteLength);\n const result = new ArrayBuffer(count * byteStride);\n await meshoptDecodeGltfBuffer(new Uint8Array(result), count, byteStride, source, mode, filter);\n return result;\n }\n\n return null;\n}\n"],"file":"EXT_meshopt_compression.js"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { _isImageFormatSupported } from '@loaders.gl/images';
|
|
2
|
+
import GLTFScenegraph from '../api/gltf-scenegraph';
|
|
3
|
+
const EXT_TEXTURE_WEBP = 'EXT_texture_webp';
|
|
4
|
+
export const name = EXT_TEXTURE_WEBP;
|
|
5
|
+
export function preprocess(gltfData, options) {
|
|
6
|
+
const scenegraph = new GLTFScenegraph(gltfData);
|
|
7
|
+
|
|
8
|
+
if (!_isImageFormatSupported('image/webp')) {
|
|
9
|
+
if (scenegraph.getRequiredExtensions().includes(EXT_TEXTURE_WEBP)) {
|
|
10
|
+
throw new Error(`gltf: Required extension ${EXT_TEXTURE_WEBP} not supported by browser`);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const {
|
|
17
|
+
json
|
|
18
|
+
} = scenegraph;
|
|
19
|
+
|
|
20
|
+
for (const texture of json.textures || []) {
|
|
21
|
+
const extension = scenegraph.getObjectExtension(texture, EXT_TEXTURE_WEBP);
|
|
22
|
+
|
|
23
|
+
if (extension) {
|
|
24
|
+
texture.source = extension.source;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
scenegraph.removeObjectExtension(texture, EXT_TEXTURE_WEBP);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
scenegraph.removeExtension(EXT_TEXTURE_WEBP);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=EXT_texture_webp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/extensions/EXT_texture_webp.ts"],"names":["_isImageFormatSupported","GLTFScenegraph","EXT_TEXTURE_WEBP","name","preprocess","gltfData","options","scenegraph","getRequiredExtensions","includes","Error","json","texture","textures","extension","getObjectExtension","source","removeObjectExtension","removeExtension"],"mappings":"AAOA,SAAQA,uBAAR,QAAsC,oBAAtC;AACA,OAAOC,cAAP,MAA2B,wBAA3B;AAEA,MAAMC,gBAAgB,GAAG,kBAAzB;AAGA,OAAO,MAAMC,IAAI,GAAGD,gBAAb;AAMP,OAAO,SAASE,UAAT,CAAoBC,QAApB,EAA4CC,OAA5C,EAA8E;AACnF,QAAMC,UAAU,GAAG,IAAIN,cAAJ,CAAmBI,QAAnB,CAAnB;;AAEA,MAAI,CAACL,uBAAuB,CAAC,YAAD,CAA5B,EAA4C;AAC1C,QAAIO,UAAU,CAACC,qBAAX,GAAmCC,QAAnC,CAA4CP,gBAA5C,CAAJ,EAAmE;AACjE,YAAM,IAAIQ,KAAJ,CAAW,4BAA2BR,gBAAiB,2BAAvD,CAAN;AACD;;AACD;AACD;;AAED,QAAM;AAACS,IAAAA;AAAD,MAASJ,UAAf;;AAEA,OAAK,MAAMK,OAAX,IAAsBD,IAAI,CAACE,QAAL,IAAiB,EAAvC,EAA2C;AACzC,UAAMC,SAAS,GAAGP,UAAU,CAACQ,kBAAX,CAChBH,OADgB,EAEhBV,gBAFgB,CAAlB;;AAIA,QAAIY,SAAJ,EAAe;AACbF,MAAAA,OAAO,CAACI,MAAR,GAAiBF,SAAS,CAACE,MAA3B;AACD;;AACDT,IAAAA,UAAU,CAACU,qBAAX,CAAiCL,OAAjC,EAA0CV,gBAA1C;AACD;;AAGDK,EAAAA,UAAU,CAACW,eAAX,CAA2BhB,gBAA3B;AACD","sourcesContent":["// GLTF EXTENSION: EXT_TEXTURE_WEBP\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_TEXTURE_WEBP\n/* eslint-disable camelcase */\n\nimport type {GLTF, GLTF_EXT_texture_webp} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {_isImageFormatSupported} from '@loaders.gl/images';\nimport GLTFScenegraph from '../api/gltf-scenegraph';\n\nconst EXT_TEXTURE_WEBP = 'EXT_texture_webp';\n\n/** Extension name */\nexport const name = EXT_TEXTURE_WEBP;\n\n/**\n * Replaces a texture source reference with the extension texture\n * Done in preprocess() to prevent load of default image\n */\nexport function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions): void {\n const scenegraph = new GLTFScenegraph(gltfData);\n\n if (!_isImageFormatSupported('image/webp')) {\n if (scenegraph.getRequiredExtensions().includes(EXT_TEXTURE_WEBP)) {\n throw new Error(`gltf: Required extension ${EXT_TEXTURE_WEBP} not supported by browser`);\n }\n return;\n }\n\n const {json} = scenegraph;\n\n for (const texture of json.textures || []) {\n const extension = scenegraph.getObjectExtension<GLTF_EXT_texture_webp>(\n texture,\n EXT_TEXTURE_WEBP\n );\n if (extension) {\n texture.source = extension.source;\n }\n scenegraph.removeObjectExtension(texture, EXT_TEXTURE_WEBP);\n }\n\n // Remove the top-level extension\n scenegraph.removeExtension(EXT_TEXTURE_WEBP);\n}\n"],"file":"EXT_texture_webp.js"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import GLTFScenegraph from '../api/gltf-scenegraph';
|
|
2
|
-
|
|
3
|
-
export
|
|
2
|
+
const KHR_BINARY_GLTF = 'KHR_binary_glTF';
|
|
3
|
+
export const name = KHR_BINARY_GLTF;
|
|
4
|
+
export function preprocess(gltfData) {
|
|
4
5
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
5
6
|
const {
|
|
6
7
|
json
|
|
7
8
|
} = gltfScenegraph;
|
|
8
9
|
|
|
9
|
-
for (const
|
|
10
|
-
const extension = gltfScenegraph.
|
|
10
|
+
for (const image of json.images || []) {
|
|
11
|
+
const extension = gltfScenegraph.getObjectExtension(image, KHR_BINARY_GLTF);
|
|
11
12
|
|
|
12
13
|
if (extension) {
|
|
13
|
-
Object.assign(
|
|
14
|
+
Object.assign(image, extension);
|
|
14
15
|
}
|
|
16
|
+
|
|
17
|
+
gltfScenegraph.removeObjectExtension(image, KHR_BINARY_GLTF);
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
if (json.buffers && json.buffers[0]) {
|
|
@@ -20,7 +23,4 @@ export function decode(gltfData) {
|
|
|
20
23
|
|
|
21
24
|
gltfScenegraph.removeExtension(KHR_BINARY_GLTF);
|
|
22
25
|
}
|
|
23
|
-
export function encode() {
|
|
24
|
-
throw new Error(KHR_BINARY_GLTF);
|
|
25
|
-
}
|
|
26
26
|
//# sourceMappingURL=KHR_binary_gltf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/extensions/KHR_binary_gltf.ts"],"names":["GLTFScenegraph","KHR_BINARY_GLTF","
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/extensions/KHR_binary_gltf.ts"],"names":["GLTFScenegraph","KHR_BINARY_GLTF","name","preprocess","gltfData","gltfScenegraph","json","image","images","extension","getObjectExtension","Object","assign","removeObjectExtension","buffers","uri","removeExtension"],"mappings":"AAMA,OAAOA,cAAP,MAA2B,wBAA3B;AAEA,MAAMC,eAAe,GAAG,iBAAxB;AAGA,OAAO,MAAMC,IAAI,GAAGD,eAAb;AAEP,OAAO,SAASE,UAAT,CAAoBC,QAApB,EAAkD;AACvD,QAAMC,cAAc,GAAG,IAAIL,cAAJ,CAAmBI,QAAnB,CAAvB;AACA,QAAM;AAACE,IAAAA;AAAD,MAASD,cAAf;;AAOA,OAAK,MAAME,KAAX,IAAoBD,IAAI,CAACE,MAAL,IAAe,EAAnC,EAAuC;AACrC,UAAMC,SAAS,GAAGJ,cAAc,CAACK,kBAAf,CAChBH,KADgB,EAEhBN,eAFgB,CAAlB;;AAKA,QAAIQ,SAAJ,EAAe;AACbE,MAAAA,MAAM,CAACC,MAAP,CAAcL,KAAd,EAAqBE,SAArB;AACD;;AACDJ,IAAAA,cAAc,CAACQ,qBAAf,CAAqCN,KAArC,EAA4CN,eAA5C;AACD;;AAMD,MAAIK,IAAI,CAACQ,OAAL,IAAgBR,IAAI,CAACQ,OAAL,CAAa,CAAb,CAApB,EAAqC;AACnC,WAAOR,IAAI,CAACQ,OAAL,CAAa,CAAb,EAAgBC,GAAvB;AACD;;AAGDV,EAAAA,cAAc,CAACW,eAAf,CAA+Bf,eAA/B;AACD","sourcesContent":["// GLTF 1.0 EXTENSION: KHR_binary_glTF\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n/* eslint-disable camelcase */\n\nimport type {GLTF, GLTF_KHR_binary_glTF} from '../types/gltf-types';\n\nimport GLTFScenegraph from '../api/gltf-scenegraph';\n\nconst KHR_BINARY_GLTF = 'KHR_binary_glTF';\n\n/** Extension name */\nexport const name = KHR_BINARY_GLTF;\n\nexport function preprocess(gltfData: {json: GLTF}): void {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const {json} = gltfScenegraph;\n\n // Note: json.buffers.binary_glTF also needs to be replaced\n // This is currently done during gltf normalization\n\n // Image and shader nodes can have the extension\n // https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/schema/image.KHR_binary_glTF.schema.json\n for (const image of json.images || []) {\n const extension = gltfScenegraph.getObjectExtension<GLTF_KHR_binary_glTF>(\n image,\n KHR_BINARY_GLTF\n );\n // The data in the extension is valid as glTF 2.0 data inside the object, so just copy it in\n if (extension) {\n Object.assign(image, extension);\n }\n gltfScenegraph.removeObjectExtension(image, KHR_BINARY_GLTF);\n }\n\n // TODO shaders - At least traverse and throw error if used?\n // https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/schema/shader.KHR_binary_glTF.schema.json\n\n // glTF v1 one files have a partially formed URI field that is not expected in (and causes problems in) 2.0\n if (json.buffers && json.buffers[0]) {\n delete json.buffers[0].uri;\n }\n\n // Remove the top-level extension as it has now been removed from all nodes\n gltfScenegraph.removeExtension(KHR_BINARY_GLTF);\n}\n\n// KHR_binary_gltf is a 1.0 extension that is supported natively by 2.0\n// export function encode() {\n// throw new Error(KHR_BINARY_GLTF);\n// }\n"],"file":"KHR_binary_gltf.js"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { DracoLoader } from '@loaders.gl/draco';
|
|
2
2
|
import { sliceArrayBuffer } from '@loaders.gl/loader-utils';
|
|
3
3
|
import { default as Scenegraph } from '../api/gltf-scenegraph';
|
|
4
|
-
import { KHR_DRACO_MESH_COMPRESSION } from '../gltf-utils/gltf-constants';
|
|
5
4
|
import { getGLTFAccessors, getGLTFAccessor } from '../gltf-utils/gltf-attribute-utils';
|
|
5
|
+
const KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';
|
|
6
|
+
export const name = KHR_DRACO_MESH_COMPRESSION;
|
|
7
|
+
export function preprocess(gltfData, options, context) {
|
|
8
|
+
const scenegraph = new Scenegraph(gltfData);
|
|
9
|
+
|
|
10
|
+
for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {
|
|
11
|
+
if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
6
14
|
export async function decode(gltfData, options, context) {
|
|
7
15
|
var _options$gltf;
|
|
8
16
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/extensions/KHR_draco_mesh_compression.ts"],"names":["DracoLoader","sliceArrayBuffer","default","Scenegraph","KHR_DRACO_MESH_COMPRESSION","getGLTFAccessors","getGLTFAccessor","decode","gltfData","options","context","gltf","decompressMeshes","scenegraph","promises","primitive","makeMeshPrimitiveIterator","getObjectExtension","push","decompressPrimitive","Promise","all","removeExtension","encode","mesh","json","meshes","compressMesh","addRequiredExtension","dracoExtension","buffer","getTypedArrayForBufferView","bufferView","bufferCopy","byteOffset","parse","dracoOptions","decodedData","decodedAttributes","attributes","attributeName","decodedAttribute","Object","entries","accessorIndex","accessor","getAccessor","min","max","indices","checkPrimitive","mode","DracoWriter","Error","compressedData","encodeSync","parseSync","fauxAccessors","_addFauxAttributes","bufferViewIndex","addBufferView","glTFMesh","primitives","extensions","keys","length"],"mappings":"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","sourcesContent":["// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n// Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported\n\n/* eslint-disable camelcase */\nimport type {GLTF, GLTFAccessor, GLTFMeshPrimitive} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {DracoLoader} from '@loaders.gl/draco';\nimport {DracoLoaderOptions, DracoMeshData} from '@loaders.gl/draco';\nimport {sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {default as Scenegraph} from '../api/gltf-scenegraph';\nimport {KHR_DRACO_MESH_COMPRESSION} from '../gltf-utils/gltf-constants';\nimport {getGLTFAccessors, getGLTFAccessor} from '../gltf-utils/gltf-attribute-utils';\n\n// Note: We have a \"soft dependency\" on DracoWriter to avoid bundling it when not needed\nexport async function decode(\n gltfData: {json: GLTF},\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<void> {\n if (!options?.gltf?.decompressMeshes) {\n return;\n }\n\n const scenegraph = new Scenegraph(gltfData);\n const promises: Promise<void>[] = [];\n for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {\n if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {\n promises.push(decompressPrimitive(scenegraph, primitive, options, context));\n }\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extensions\n scenegraph.removeExtension(KHR_DRACO_MESH_COMPRESSION);\n}\n\nexport function encode(gltfData, options: GLTFLoaderOptions = {}): void {\n const scenegraph = new Scenegraph(gltfData);\n\n for (const mesh of scenegraph.json.meshes || []) {\n // eslint-disable-next-line camelcase\n // @ts-ignore\n compressMesh(mesh, options);\n // NOTE: Only add the extension if something was actually compressed\n scenegraph.addRequiredExtension(KHR_DRACO_MESH_COMPRESSION);\n }\n}\n\n// DECODE\n\n// Unpacks one mesh primitive and removes the extension from the primitive\n// DracoDecoder needs to be imported and registered by app\n// Returns: Promise that resolves when all pending draco decoder jobs for this mesh complete\n\n// TODO - Implement fallback behavior per KHR_DRACO_MESH_COMPRESSION spec\n\nasync function decompressPrimitive(\n scenegraph: Scenegraph,\n primitive: GLTFMeshPrimitive,\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<void> {\n const dracoExtension = scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION);\n if (!dracoExtension) {\n return;\n }\n\n const buffer = scenegraph.getTypedArrayForBufferView(dracoExtension.bufferView);\n // TODO - parse does not yet deal well with byte offsets embedded in typed arrays. Copy buffer\n // TODO - remove when `parse` is fixed to handle `byteOffset`s\n const bufferCopy = sliceArrayBuffer(buffer.buffer, buffer.byteOffset); // , buffer.byteLength);\n\n const {parse} = context;\n const dracoOptions: DracoLoaderOptions = {...options};\n\n // TODO - remove hack: The entire tileset might be included, too expensive to serialize\n delete dracoOptions['3d-tiles'];\n const decodedData = (await parse(\n bufferCopy,\n DracoLoader,\n dracoOptions,\n context\n )) as DracoMeshData;\n\n const decodedAttributes: {[key: string]: GLTFAccessor} = getGLTFAccessors(decodedData.attributes);\n\n // Restore min/max values\n for (const [attributeName, decodedAttribute] of Object.entries(decodedAttributes)) {\n if (attributeName in primitive.attributes) {\n const accessorIndex: number = primitive.attributes[attributeName];\n const accessor = scenegraph.getAccessor(accessorIndex);\n if (accessor?.min && accessor?.max) {\n decodedAttribute.min = accessor.min;\n decodedAttribute.max = accessor.max;\n }\n }\n }\n\n // @ts-ignore\n primitive.attributes = decodedAttributes;\n if (decodedData.indices) {\n // @ts-ignore\n primitive.indices = getGLTFAccessor(decodedData.indices);\n }\n\n // Extension has been processed, delete it\n // delete primitive.extensions[KHR_DRACO_MESH_COMPRESSION];\n\n checkPrimitive(primitive);\n}\n\n// ENCODE\n\n// eslint-disable-next-line max-len\n// Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported\nfunction compressMesh(attributes, indices, mode: number = 4, options, context: LoaderContext) {\n if (!options.DracoWriter) {\n throw new Error('options.gltf.DracoWriter not provided');\n }\n\n // TODO - use DracoWriter using encode w/ registered DracoWriter...\n const compressedData = options.DracoWriter.encodeSync({attributes});\n\n // Draco compression may change the order and number of vertices in a mesh.\n // To satisfy the requirement that accessors properties be correct for both\n // compressed and uncompressed data, generators should create uncompressed\n // attributes and indices using data that has been decompressed from the Draco buffer,\n // rather than the original source data.\n // @ts-ignore TODO this needs to be fixed\n const decodedData = context?.parseSync?.({attributes});\n const fauxAccessors = options._addFauxAttributes(decodedData.attributes);\n\n const bufferViewIndex = options.addBufferView(compressedData);\n\n const glTFMesh = {\n primitives: [\n {\n attributes: fauxAccessors, // TODO - verify with spec\n mode, // GL.POINTS\n extensions: {\n [KHR_DRACO_MESH_COMPRESSION]: {\n bufferView: bufferViewIndex,\n attributes: fauxAccessors // TODO - verify with spec\n }\n }\n }\n ]\n };\n\n return glTFMesh;\n}\n\n// UTILS\n\nfunction checkPrimitive(primitive: GLTFMeshPrimitive) {\n if (!primitive.attributes && Object.keys(primitive.attributes).length > 0) {\n throw new Error('glTF: Empty primitive detected: Draco decompression failure?');\n }\n}\n\nfunction* makeMeshPrimitiveIterator(scenegraph) {\n for (const mesh of scenegraph.json.meshes || []) {\n for (const primitive of mesh.primitives) {\n yield primitive;\n }\n }\n}\n"],"file":"KHR_draco_mesh_compression.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/extensions/KHR_draco_mesh_compression.ts"],"names":["DracoLoader","sliceArrayBuffer","default","Scenegraph","getGLTFAccessors","getGLTFAccessor","KHR_DRACO_MESH_COMPRESSION","name","preprocess","gltfData","options","context","scenegraph","primitive","makeMeshPrimitiveIterator","getObjectExtension","decode","gltf","decompressMeshes","promises","push","decompressPrimitive","Promise","all","removeExtension","encode","mesh","json","meshes","compressMesh","addRequiredExtension","dracoExtension","buffer","getTypedArrayForBufferView","bufferView","bufferCopy","byteOffset","parse","dracoOptions","decodedData","decodedAttributes","attributes","attributeName","decodedAttribute","Object","entries","accessorIndex","accessor","getAccessor","min","max","indices","checkPrimitive","mode","DracoWriter","Error","compressedData","encodeSync","parseSync","fauxAccessors","_addFauxAttributes","bufferViewIndex","addBufferView","glTFMesh","primitives","extensions","keys","length"],"mappings":"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","sourcesContent":["// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n// Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported\n/* eslint-disable camelcase */\n\n/* eslint-disable camelcase */\nimport type {\n GLTF,\n GLTFAccessor,\n GLTFMeshPrimitive,\n GLTF_KHR_draco_mesh_compression\n} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {DracoLoader} from '@loaders.gl/draco';\nimport {DracoLoaderOptions, DracoMesh} from '@loaders.gl/draco';\nimport {sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {default as Scenegraph} from '../api/gltf-scenegraph';\nimport {getGLTFAccessors, getGLTFAccessor} from '../gltf-utils/gltf-attribute-utils';\n\nconst KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';\n\n/** Extension name */\nexport const name = KHR_DRACO_MESH_COMPRESSION;\n\nexport function preprocess(\n gltfData: {json: GLTF},\n options: GLTFLoaderOptions,\n context: LoaderContext\n): void {\n const scenegraph = new Scenegraph(gltfData);\n for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {\n if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {\n // TODO - Remove fallback accessors to make sure we don't load unnecessary buffers\n }\n }\n}\n\nexport async function decode(\n gltfData: {json: GLTF},\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<void> {\n if (!options?.gltf?.decompressMeshes) {\n return;\n }\n\n const scenegraph = new Scenegraph(gltfData);\n const promises: Promise<void>[] = [];\n for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {\n if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {\n promises.push(decompressPrimitive(scenegraph, primitive, options, context));\n }\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extensions\n scenegraph.removeExtension(KHR_DRACO_MESH_COMPRESSION);\n}\n\nexport function encode(gltfData, options: GLTFLoaderOptions = {}): void {\n const scenegraph = new Scenegraph(gltfData);\n\n for (const mesh of scenegraph.json.meshes || []) {\n // eslint-disable-next-line camelcase\n // @ts-ignore\n compressMesh(mesh, options);\n // NOTE: Only add the extension if something was actually compressed\n scenegraph.addRequiredExtension(KHR_DRACO_MESH_COMPRESSION);\n }\n}\n\n// DECODE\n\n// Unpacks one mesh primitive and removes the extension from the primitive\n// DracoDecoder needs to be imported and registered by app\n// Returns: Promise that resolves when all pending draco decoder jobs for this mesh complete\n\n// TODO - Implement fallback behavior per KHR_DRACO_MESH_COMPRESSION spec\n\nasync function decompressPrimitive(\n scenegraph: Scenegraph,\n primitive: GLTFMeshPrimitive,\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<void> {\n const dracoExtension = scenegraph.getObjectExtension<GLTF_KHR_draco_mesh_compression>(\n primitive,\n KHR_DRACO_MESH_COMPRESSION\n );\n if (!dracoExtension) {\n return;\n }\n\n const buffer = scenegraph.getTypedArrayForBufferView(dracoExtension.bufferView);\n // TODO - parse does not yet deal well with byte offsets embedded in typed arrays. Copy buffer\n // TODO - remove when `parse` is fixed to handle `byteOffset`s\n const bufferCopy = sliceArrayBuffer(buffer.buffer, buffer.byteOffset); // , buffer.byteLength);\n\n const {parse} = context;\n const dracoOptions: DracoLoaderOptions = {...options};\n\n // TODO - remove hack: The entire tileset might be included, too expensive to serialize\n delete dracoOptions['3d-tiles'];\n const decodedData = (await parse(bufferCopy, DracoLoader, dracoOptions, context)) as DracoMesh;\n\n const decodedAttributes: {[key: string]: GLTFAccessor} = getGLTFAccessors(decodedData.attributes);\n\n // Restore min/max values\n for (const [attributeName, decodedAttribute] of Object.entries(decodedAttributes)) {\n if (attributeName in primitive.attributes) {\n const accessorIndex: number = primitive.attributes[attributeName];\n const accessor = scenegraph.getAccessor(accessorIndex);\n if (accessor?.min && accessor?.max) {\n decodedAttribute.min = accessor.min;\n decodedAttribute.max = accessor.max;\n }\n }\n }\n\n // @ts-ignore\n primitive.attributes = decodedAttributes;\n if (decodedData.indices) {\n // @ts-ignore\n primitive.indices = getGLTFAccessor(decodedData.indices);\n }\n\n // Extension has been processed, delete it\n // delete primitive.extensions[KHR_DRACO_MESH_COMPRESSION];\n\n checkPrimitive(primitive);\n}\n\n// ENCODE\n\n// eslint-disable-next-line max-len\n// Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported\nfunction compressMesh(attributes, indices, mode: number = 4, options, context: LoaderContext) {\n if (!options.DracoWriter) {\n throw new Error('options.gltf.DracoWriter not provided');\n }\n\n // TODO - use DracoWriter using encode w/ registered DracoWriter...\n const compressedData = options.DracoWriter.encodeSync({attributes});\n\n // Draco compression may change the order and number of vertices in a mesh.\n // To satisfy the requirement that accessors properties be correct for both\n // compressed and uncompressed data, generators should create uncompressed\n // attributes and indices using data that has been decompressed from the Draco buffer,\n // rather than the original source data.\n // @ts-ignore TODO this needs to be fixed\n const decodedData = context?.parseSync?.({attributes});\n const fauxAccessors = options._addFauxAttributes(decodedData.attributes);\n\n const bufferViewIndex = options.addBufferView(compressedData);\n\n const glTFMesh = {\n primitives: [\n {\n attributes: fauxAccessors, // TODO - verify with spec\n mode, // GL.POINTS\n extensions: {\n [KHR_DRACO_MESH_COMPRESSION]: {\n bufferView: bufferViewIndex,\n attributes: fauxAccessors // TODO - verify with spec\n }\n }\n }\n ]\n };\n\n return glTFMesh;\n}\n\n// UTILS\n\nfunction checkPrimitive(primitive: GLTFMeshPrimitive) {\n if (!primitive.attributes && Object.keys(primitive.attributes).length > 0) {\n throw new Error('glTF: Empty primitive detected: Draco decompression failure?');\n }\n}\n\nfunction* makeMeshPrimitiveIterator(scenegraph) {\n for (const mesh of scenegraph.json.meshes || []) {\n for (const primitive of mesh.primitives) {\n yield primitive;\n }\n }\n}\n"],"file":"KHR_draco_mesh_compression.js"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import GLTFScenegraph from '../api/gltf-scenegraph';
|
|
2
|
+
const KHR_TEXTURE_BASISU = 'KHR_texture_basisu';
|
|
3
|
+
export const name = KHR_TEXTURE_BASISU;
|
|
4
|
+
export function preprocess(gltfData, options) {
|
|
5
|
+
const scene = new GLTFScenegraph(gltfData);
|
|
6
|
+
const {
|
|
7
|
+
json
|
|
8
|
+
} = scene;
|
|
9
|
+
|
|
10
|
+
for (const texture of json.textures || []) {
|
|
11
|
+
const extension = scene.getObjectExtension(texture, KHR_TEXTURE_BASISU);
|
|
12
|
+
|
|
13
|
+
if (extension) {
|
|
14
|
+
texture.source = extension.source;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
scene.removeObjectExtension(texture, KHR_TEXTURE_BASISU);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
scene.removeExtension(KHR_TEXTURE_BASISU);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=KHR_texture_basisu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/extensions/KHR_texture_basisu.ts"],"names":["GLTFScenegraph","KHR_TEXTURE_BASISU","name","preprocess","gltfData","options","scene","json","texture","textures","extension","getObjectExtension","source","removeObjectExtension","removeExtension"],"mappings":"AAOA,OAAOA,cAAP,MAA2B,wBAA3B;AAEA,MAAMC,kBAAkB,GAAG,oBAA3B;AAGA,OAAO,MAAMC,IAAI,GAAGD,kBAAb;AAMP,OAAO,SAASE,UAAT,CAAoBC,QAApB,EAA4CC,OAA5C,EAA8E;AACnF,QAAMC,KAAK,GAAG,IAAIN,cAAJ,CAAmBI,QAAnB,CAAd;AACA,QAAM;AAACG,IAAAA;AAAD,MAASD,KAAf;;AAEA,OAAK,MAAME,OAAX,IAAsBD,IAAI,CAACE,QAAL,IAAiB,EAAvC,EAA2C;AACzC,UAAMC,SAAS,GAAGJ,KAAK,CAACK,kBAAN,CAChBH,OADgB,EAEhBP,kBAFgB,CAAlB;;AAIA,QAAIS,SAAJ,EAAe;AACbF,MAAAA,OAAO,CAACI,MAAR,GAAiBF,SAAS,CAACE,MAA3B;AACD;;AACDN,IAAAA,KAAK,CAACO,qBAAN,CAA4BL,OAA5B,EAAqCP,kBAArC;AACD;;AAGDK,EAAAA,KAAK,CAACQ,eAAN,CAAsBb,kBAAtB;AACD","sourcesContent":["// GLTF EXTENSION: EXT_TEXTURE_WEBP\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_TEXTURE_WEBP\n/* eslint-disable camelcase */\n\nimport type {GLTF, GLTF_KHR_texture_basisu} from '../types/gltf-types';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport GLTFScenegraph from '../api/gltf-scenegraph';\n\nconst KHR_TEXTURE_BASISU = 'KHR_texture_basisu';\n\n/** Extension name */\nexport const name = KHR_TEXTURE_BASISU;\n\n/**\n * Replaces a texture source reference with the extension texture\n * Done in preprocess() to prevent load of default image\n */\nexport function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions): void {\n const scene = new GLTFScenegraph(gltfData);\n const {json} = scene;\n\n for (const texture of json.textures || []) {\n const extension = scene.getObjectExtension<GLTF_KHR_texture_basisu>(\n texture,\n KHR_TEXTURE_BASISU\n );\n if (extension) {\n texture.source = extension.source;\n }\n scene.removeObjectExtension(texture, KHR_TEXTURE_BASISU);\n }\n\n // Remove the top-level extension\n scene.removeExtension(KHR_TEXTURE_BASISU);\n}\n"],"file":"KHR_texture_basisu.js"}
|
package/dist/esm/lib/extensions/{KHR_lights_punctual.js → deprecated/KHR_lights_punctual.js}
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { assert } from '
|
|
2
|
-
import GLTFScenegraph from '
|
|
3
|
-
|
|
1
|
+
import { assert } from '../../utils/assert';
|
|
2
|
+
import GLTFScenegraph from '../../api/gltf-scenegraph';
|
|
3
|
+
const KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';
|
|
4
|
+
export const name = KHR_LIGHTS_PUNCTUAL;
|
|
4
5
|
export async function decode(gltfData) {
|
|
5
6
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
6
7
|
const {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/extensions/deprecated/KHR_lights_punctual.ts"],"names":["assert","GLTFScenegraph","KHR_LIGHTS_PUNCTUAL","name","decode","gltfData","gltfScenegraph","json","extension","getExtension","lights","removeExtension","node","nodes","nodeExtension","getObjectExtension","light","removeObjectExtension","encode","addExtension","addObjectExtension"],"mappings":"AAKA,SAAQA,MAAR,QAAqB,oBAArB;AACA,OAAOC,cAAP,MAA2B,2BAA3B;AAEA,MAAMC,mBAAmB,GAAG,qBAA5B;AAEA,OAAO,MAAMC,IAAI,GAAGD,mBAAb;AAEP,OAAO,eAAeE,MAAf,CAAsBC,QAAtB,EAA6D;AAClE,QAAMC,cAAc,GAAG,IAAIL,cAAJ,CAAmBI,QAAnB,CAAvB;AACA,QAAM;AAACE,IAAAA;AAAD,MAASD,cAAf;AAGA,QAAME,SAAS,GAAGF,cAAc,CAACG,YAAf,CAA4BP,mBAA5B,CAAlB;;AACA,MAAIM,SAAJ,EAAe;AAEbF,IAAAA,cAAc,CAACC,IAAf,CAAoBG,MAApB,GAA6BF,SAAS,CAACE,MAAvC;AACAJ,IAAAA,cAAc,CAACK,eAAf,CAA+BT,mBAA/B;AACD;;AAID,OAAK,MAAMU,IAAX,IAAmBL,IAAI,CAACM,KAAL,IAAc,EAAjC,EAAqC;AACnC,UAAMC,aAAa,GAAGR,cAAc,CAACS,kBAAf,CAAkCH,IAAlC,EAAwCV,mBAAxC,CAAtB;;AACA,QAAIY,aAAJ,EAAmB;AAEjBF,MAAAA,IAAI,CAACI,KAAL,GAAaF,aAAa,CAACE,KAA3B;AACD;;AACDV,IAAAA,cAAc,CAACW,qBAAf,CAAqCL,IAArC,EAA2CV,mBAA3C;AACD;AACF;AAGD,OAAO,eAAegB,MAAf,CAAsBb,QAAtB,EAA+C;AACpD,QAAMC,cAAc,GAAG,IAAIL,cAAJ,CAAmBI,QAAnB,CAAvB;AACA,QAAM;AAACE,IAAAA;AAAD,MAASD,cAAf;;AAGA,MAAIC,IAAI,CAACG,MAAT,EAAiB;AACf,UAAMF,SAAS,GAAGF,cAAc,CAACa,YAAf,CAA4BjB,mBAA5B,CAAlB;AAEAF,IAAAA,MAAM,CAAC,CAACQ,SAAS,CAACE,MAAZ,CAAN;AAEAF,IAAAA,SAAS,CAACE,MAAV,GAAmBH,IAAI,CAACG,MAAxB;AAEA,WAAOH,IAAI,CAACG,MAAZ;AACD;;AAKD,MAAIJ,cAAc,CAACC,IAAf,CAAoBG,MAAxB,EAAgC;AAE9B,SAAK,MAAMM,KAAX,IAAoBV,cAAc,CAACC,IAAf,CAAoBG,MAAxC,EAAgD;AAC9C,YAAME,IAAI,GAAGI,KAAK,CAACJ,IAAnB;AACAN,MAAAA,cAAc,CAACc,kBAAf,CAAkCR,IAAlC,EAAwCV,mBAAxC,EAA6Dc,KAA7D;AACD;;AAED,WAAOV,cAAc,CAACC,IAAf,CAAoBG,MAA3B;AACD;AACF","sourcesContent":["// GLTF EXTENSION: KHR_lights_punctual\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n\nimport type {GLTF} from '../../types/gltf-types';\n\nimport {assert} from '../../utils/assert';\nimport GLTFScenegraph from '../../api/gltf-scenegraph';\n\nconst KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';\n\nexport const name = KHR_LIGHTS_PUNCTUAL;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const {json} = gltfScenegraph;\n\n // Move the light array out of the extension and remove the extension\n const extension = gltfScenegraph.getExtension(KHR_LIGHTS_PUNCTUAL);\n if (extension) {\n // @ts-ignore\n gltfScenegraph.json.lights = extension.lights;\n gltfScenegraph.removeExtension(KHR_LIGHTS_PUNCTUAL);\n }\n\n // Any nodes that have the extension, add lights field pointing to light object\n // and remove the extension\n for (const node of json.nodes || []) {\n const nodeExtension = gltfScenegraph.getObjectExtension(node, KHR_LIGHTS_PUNCTUAL);\n if (nodeExtension) {\n // @ts-ignore\n node.light = nodeExtension.light;\n }\n gltfScenegraph.removeObjectExtension(node, KHR_LIGHTS_PUNCTUAL);\n }\n}\n\n// Move the light ar ray out of the extension and remove the extension\nexport async function encode(gltfData): Promise<void> {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const {json} = gltfScenegraph;\n\n // @ts-ignore\n if (json.lights) {\n const extension = gltfScenegraph.addExtension(KHR_LIGHTS_PUNCTUAL);\n // @ts-ignore\n assert(!extension.lights);\n // @ts-ignore\n extension.lights = json.lights;\n // @ts-ignore\n delete json.lights;\n }\n\n // Any nodes that have lights field pointing to light object\n // add the extension\n // @ts-ignore\n if (gltfScenegraph.json.lights) {\n // @ts-ignore\n for (const light of gltfScenegraph.json.lights) {\n const node = light.node;\n gltfScenegraph.addObjectExtension(node, KHR_LIGHTS_PUNCTUAL, light);\n }\n // @ts-ignore\n delete gltfScenegraph.json.lights;\n }\n}\n"],"file":"KHR_lights_punctual.js"}
|
package/dist/esm/lib/extensions/{KHR_materials_unlit.js → deprecated/KHR_materials_unlit.js}
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import GLTFScenegraph from '
|
|
2
|
-
|
|
1
|
+
import GLTFScenegraph from '../../api/gltf-scenegraph';
|
|
2
|
+
const KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';
|
|
3
|
+
export const name = KHR_MATERIALS_UNLIT;
|
|
3
4
|
export async function decode(gltfData) {
|
|
4
5
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
5
6
|
const {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/extensions/deprecated/KHR_materials_unlit.ts"],"names":["GLTFScenegraph","KHR_MATERIALS_UNLIT","name","decode","gltfData","gltfScenegraph","json","removeExtension","material","materials","extension","extensions","KHR_materials_unlit","unlit","removeObjectExtension","encode","addObjectExtension","addExtension"],"mappings":"AAKA,OAAOA,cAAP,MAA2B,2BAA3B;AAEA,MAAMC,mBAAmB,GAAG,qBAA5B;AAEA,OAAO,MAAMC,IAAI,GAAGD,mBAAb;AAEP,OAAO,eAAeE,MAAf,CAAsBC,QAAtB,EAA6D;AAClE,QAAMC,cAAc,GAAG,IAAIL,cAAJ,CAAmBI,QAAnB,CAAvB;AACA,QAAM;AAACE,IAAAA;AAAD,MAASD,cAAf;AAGAA,EAAAA,cAAc,CAACE,eAAf,CAA+BN,mBAA/B;;AAIA,OAAK,MAAMO,QAAX,IAAuBF,IAAI,CAACG,SAAL,IAAkB,EAAzC,EAA6C;AAC3C,UAAMC,SAAS,GAAGF,QAAQ,CAACG,UAAT,IAAuBH,QAAQ,CAACG,UAAT,CAAoBC,mBAA7D;;AACA,QAAIF,SAAJ,EAAe;AAEbF,MAAAA,QAAQ,CAACK,KAAT,GAAiB,IAAjB;AACD;;AACDR,IAAAA,cAAc,CAACS,qBAAf,CAAqCN,QAArC,EAA+CP,mBAA/C;AACD;AACF;AAED,OAAO,SAASc,MAAT,CAAgBX,QAAhB,EAA0B;AAC/B,QAAMC,cAAc,GAAG,IAAIL,cAAJ,CAAmBI,QAAnB,CAAvB;AACA,QAAM;AAACE,IAAAA;AAAD,MAASD,cAAf;;AAKA,MAAIA,cAAc,CAACI,SAAnB,EAA8B;AAC5B,SAAK,MAAMD,QAAX,IAAuBF,IAAI,CAACG,SAAL,IAAkB,EAAzC,EAA6C;AAE3C,UAAID,QAAQ,CAACK,KAAb,EAAoB;AAElB,eAAOL,QAAQ,CAACK,KAAhB;AACAR,QAAAA,cAAc,CAACW,kBAAf,CAAkCR,QAAlC,EAA4CP,mBAA5C,EAAiE,EAAjE;AACAI,QAAAA,cAAc,CAACY,YAAf,CAA4BhB,mBAA5B;AACD;AACF;AACF;AACF","sourcesContent":["// GLTF EXTENSION: KHR_materials_unlit\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n\nimport type {GLTF} from '../../types/gltf-types';\n\nimport GLTFScenegraph from '../../api/gltf-scenegraph';\n\nconst KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';\n\nexport const name = KHR_MATERIALS_UNLIT;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const {json} = gltfScenegraph;\n\n // Remove the top-level extension\n gltfScenegraph.removeExtension(KHR_MATERIALS_UNLIT);\n\n // Any nodes that have the extension, add lights field pointing to light object\n // and remove the extension\n for (const material of json.materials || []) {\n const extension = material.extensions && material.extensions.KHR_materials_unlit;\n if (extension) {\n // @ts-ignore TODO\n material.unlit = true;\n }\n gltfScenegraph.removeObjectExtension(material, KHR_MATERIALS_UNLIT);\n }\n}\n\nexport function encode(gltfData) {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const {json} = gltfScenegraph;\n\n // Any nodes that have lights field pointing to light object\n // add the extension\n // @ts-ignore\n if (gltfScenegraph.materials) {\n for (const material of json.materials || []) {\n // @ts-ignore\n if (material.unlit) {\n // @ts-ignore\n delete material.unlit;\n gltfScenegraph.addObjectExtension(material, KHR_MATERIALS_UNLIT, {});\n gltfScenegraph.addExtension(KHR_MATERIALS_UNLIT);\n }\n }\n }\n}\n"],"file":"KHR_materials_unlit.js"}
|
package/dist/esm/lib/extensions/{KHR_techniques_webgl.js → deprecated/KHR_techniques_webgl.js}
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import GLTFScenegraph from '
|
|
2
|
-
|
|
1
|
+
import GLTFScenegraph from '../../api/gltf-scenegraph';
|
|
2
|
+
const KHR_TECHNIQUES_WEBGL = 'KHR_techniques_webgl';
|
|
3
|
+
export const name = KHR_TECHNIQUES_WEBGL;
|
|
3
4
|
export async function decode(gltfData) {
|
|
4
5
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
5
6
|
const {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/extensions/deprecated/KHR_techniques_webgl.ts"],"names":["GLTFScenegraph","KHR_TECHNIQUES_WEBGL","name","decode","gltfData","gltfScenegraph","json","extension","getExtension","techniques","resolveTechniques","material","materials","materialExtension","getObjectExtension","technique","Object","assign","values","resolveValues","removeObjectExtension","removeExtension","encode","options","techniquesExtension","programs","shaders","textDecoder","TextDecoder","forEach","shader","Number","isFinite","bufferView","code","getTypedArrayForBufferView","Error","program","fragmentShader","vertexShader","keys","uniforms","uniform","value","index","undefined","texture","getTexture"],"mappings":"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","sourcesContent":["// GLTF EXTENSION: KHR_techniques_webgl\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_techniques_webgl\n\nimport type {GLTF} from '../../types/gltf-types';\n\nimport GLTFScenegraph from '../../api/gltf-scenegraph';\n\nconst KHR_TECHNIQUES_WEBGL = 'KHR_techniques_webgl';\n\nexport const name = KHR_TECHNIQUES_WEBGL;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const {json} = gltfScenegraph;\n\n const extension = gltfScenegraph.getExtension(KHR_TECHNIQUES_WEBGL);\n if (extension) {\n const techniques = resolveTechniques(extension, gltfScenegraph);\n\n for (const material of json.materials || []) {\n const materialExtension = gltfScenegraph.getObjectExtension(material, KHR_TECHNIQUES_WEBGL);\n if (materialExtension) {\n // @ts-ignore TODO\n material.technique = Object.assign(\n {},\n materialExtension,\n // @ts-ignore\n techniques[materialExtension.technique]\n );\n // @ts-ignore TODO\n material.technique.values = resolveValues(material.technique, gltfScenegraph);\n }\n gltfScenegraph.removeObjectExtension(material, KHR_TECHNIQUES_WEBGL);\n }\n\n gltfScenegraph.removeExtension(KHR_TECHNIQUES_WEBGL);\n }\n}\n// eslint-disable-next-line\nexport async function encode(gltfData, options): Promise<void> {\n // TODO\n}\n\nfunction resolveTechniques(\n techniquesExtension: {[key: string]: any},\n // programs: {[key: string]: any}[],\n // shaders: {[key: string]: any}[],\n // techniques: {[key: string]: any}[]\n gltfScenegraph\n) {\n const {programs = [], shaders = [], techniques = []} = techniquesExtension;\n const textDecoder = new TextDecoder();\n\n shaders.forEach((shader) => {\n if (Number.isFinite(shader.bufferView)) {\n shader.code = textDecoder.decode(\n gltfScenegraph.getTypedArrayForBufferView(shader.bufferView)\n );\n } else {\n // TODO: handle URI shader\n throw new Error('KHR_techniques_webgl: no shader code');\n }\n });\n\n programs.forEach((program) => {\n program.fragmentShader = shaders[program.fragmentShader];\n program.vertexShader = shaders[program.vertexShader];\n });\n\n techniques.forEach((technique) => {\n technique.program = programs[technique.program];\n });\n\n return techniques;\n}\n\nfunction resolveValues(technique, gltfScenegraph) {\n const values = Object.assign({}, technique.values);\n\n // merge values from uniforms\n Object.keys(technique.uniforms || {}).forEach((uniform) => {\n if (technique.uniforms[uniform].value && !(uniform in values)) {\n values[uniform] = technique.uniforms[uniform].value;\n }\n });\n\n // resolve textures\n Object.keys(values).forEach((uniform) => {\n if (typeof values[uniform] === 'object' && values[uniform].index !== undefined) {\n // Assume this is a texture\n // TODO: find if there are any other types that can be referenced\n values[uniform].texture = gltfScenegraph.getTexture(values[uniform].index);\n }\n });\n\n return values;\n}\n"],"file":"KHR_techniques_webgl.js"}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
export const KHR_BINARY_GLTF = 'KHR_binary_glTF';
|
|
2
|
-
export const KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';
|
|
3
|
-
export const KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';
|
|
4
|
-
export const KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';
|
|
5
|
-
export const KHR_TECHNIQUES_WEBGL = 'KHR_techniques_webgl';
|
|
6
|
-
export const EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';
|
|
7
1
|
const COMPONENTS = {
|
|
8
2
|
SCALAR: 1,
|
|
9
3
|
VEC2: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/gltf-utils/gltf-constants.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/gltf-utils/gltf-constants.ts"],"names":["COMPONENTS","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","BYTES","getBytesFromComponentType","componentType","getSizeFromAccessorType","type","getGLEnumFromSamplerParameter","parameter","GL_TEXTURE_MAG_FILTER","GL_TEXTURE_MIN_FILTER","GL_TEXTURE_WRAP_S","GL_TEXTURE_WRAP_T","PARAMETER_MAP","magFilter","minFilter","wrapS","wrapT"],"mappings":"AAAA,MAAMA,UAAU,GAAG;AACjBC,EAAAA,MAAM,EAAE,CADS;AAEjBC,EAAAA,IAAI,EAAE,CAFW;AAGjBC,EAAAA,IAAI,EAAE,CAHW;AAIjBC,EAAAA,IAAI,EAAE,CAJW;AAKjBC,EAAAA,IAAI,EAAE,CALW;AAMjBC,EAAAA,IAAI,EAAE,CANW;AAOjBC,EAAAA,IAAI,EAAE;AAPW,CAAnB;AAUA,MAAMC,KAAK,GAAG;AACZ,QAAM,CADM;AAEZ,QAAM,CAFM;AAGZ,QAAM,CAHM;AAIZ,QAAM,CAJM;AAKZ,QAAM,CALM;AAMZ,QAAM;AANM,CAAd;AAWA,OAAO,SAASC,yBAAT,CAAmCC,aAAnC,EAAkD;AACvD,SAAOF,KAAK,CAACE,aAAD,CAAZ;AACD;AAED,OAAO,SAASC,uBAAT,CAAiCC,IAAjC,EAAuC;AAC5C,SAAOZ,UAAU,CAACY,IAAD,CAAjB;AACD;AAED,OAAO,SAASC,6BAAT,CAAuCC,SAAvC,EAAkD;AACvD,QAAMC,qBAAqB,GAAG,MAA9B;AACA,QAAMC,qBAAqB,GAAG,MAA9B;AACA,QAAMC,iBAAiB,GAAG,MAA1B;AACA,QAAMC,iBAAiB,GAAG,MAA1B;AAEA,QAAMC,aAAa,GAAG;AACpBC,IAAAA,SAAS,EAAEL,qBADS;AAEpBM,IAAAA,SAAS,EAAEL,qBAFS;AAGpBM,IAAAA,KAAK,EAAEL,iBAHa;AAIpBM,IAAAA,KAAK,EAAEL;AAJa,GAAtB;AAOA,SAAOC,aAAa,CAACL,SAAD,CAApB;AACD","sourcesContent":["const COMPONENTS = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n};\n\nconst BYTES = {\n 5120: 1, // BYTE\n 5121: 1, // UNSIGNED_BYTE\n 5122: 2, // SHORT\n 5123: 2, // UNSIGNED_SHORT\n 5125: 4, // UNSIGNED_INT\n 5126: 4 // FLOAT\n};\n\n// ENUM LOOKUP\n\nexport function getBytesFromComponentType(componentType) {\n return BYTES[componentType];\n}\n\nexport function getSizeFromAccessorType(type) {\n return COMPONENTS[type];\n}\n\nexport function getGLEnumFromSamplerParameter(parameter) {\n const GL_TEXTURE_MAG_FILTER = 0x2800;\n const GL_TEXTURE_MIN_FILTER = 0x2801;\n const GL_TEXTURE_WRAP_S = 0x2802;\n const GL_TEXTURE_WRAP_T = 0x2803;\n\n const PARAMETER_MAP = {\n magFilter: GL_TEXTURE_MAG_FILTER,\n minFilter: GL_TEXTURE_MIN_FILTER,\n wrapS: GL_TEXTURE_WRAP_S,\n wrapT: GL_TEXTURE_WRAP_T\n };\n\n return PARAMETER_MAP[parameter];\n}\n"],"file":"gltf-constants.js"}
|
|
@@ -3,7 +3,7 @@ import { parseJSON, sliceArrayBuffer } from '@loaders.gl/loader-utils';
|
|
|
3
3
|
import { assert } from '../utils/assert';
|
|
4
4
|
import { resolveUrl } from '../gltf-utils/resolve-url';
|
|
5
5
|
import { getTypedArrayForBufferView } from '../gltf-utils/get-typed-array';
|
|
6
|
-
import { decodeExtensions } from '../
|
|
6
|
+
import { preprocessExtensions, decodeExtensions } from '../api/gltf-extensions';
|
|
7
7
|
import { normalizeGLTFV1 } from '../api/normalize-gltf-v1';
|
|
8
8
|
import { postProcessGLTF } from '../api/post-process-gltf';
|
|
9
9
|
import parseGLBSync, { isGLB } from './parse-glb';
|
|
@@ -18,6 +18,7 @@ export async function parseGLTF(gltf, arrayBufferOrString, byteOffset = 0, optio
|
|
|
18
18
|
normalizeGLTFV1(gltf, {
|
|
19
19
|
normalize: options === null || options === void 0 ? void 0 : (_options$gltf = options.gltf) === null || _options$gltf === void 0 ? void 0 : _options$gltf.normalize
|
|
20
20
|
});
|
|
21
|
+
preprocessExtensions(gltf, options, context);
|
|
21
22
|
const promises = [];
|
|
22
23
|
|
|
23
24
|
if (options !== null && options !== void 0 && (_options$gltf2 = options.gltf) !== null && _options$gltf2 !== void 0 && _options$gltf2.loadBuffers && gltf.json.buffers) {
|
|
@@ -76,8 +77,10 @@ function parseGLTFContainerSync(gltf, data, byteOffset, options) {
|
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
async function loadBuffers(gltf, options, context) {
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
const buffers = gltf.json.buffers || [];
|
|
81
|
+
|
|
82
|
+
for (let i = 0; i < buffers.length; ++i) {
|
|
83
|
+
const buffer = buffers[i];
|
|
81
84
|
|
|
82
85
|
if (buffer.uri) {
|
|
83
86
|
var _context$fetch, _response$arrayBuffer;
|
|
@@ -100,16 +103,30 @@ async function loadBuffers(gltf, options, context) {
|
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
async function loadImages(gltf, options, context) {
|
|
106
|
+
const imageIndices = getReferencesImageIndices(gltf);
|
|
103
107
|
const images = gltf.json.images || [];
|
|
104
108
|
const promises = [];
|
|
105
109
|
|
|
106
|
-
for (
|
|
107
|
-
promises.push(loadImage(gltf, images[
|
|
110
|
+
for (const imageIndex of imageIndices) {
|
|
111
|
+
promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
return await Promise.all(promises);
|
|
111
115
|
}
|
|
112
116
|
|
|
117
|
+
function getReferencesImageIndices(gltf) {
|
|
118
|
+
const imageIndices = new Set();
|
|
119
|
+
const textures = gltf.json.textures || [];
|
|
120
|
+
|
|
121
|
+
for (const texture of textures) {
|
|
122
|
+
if (texture.source !== undefined) {
|
|
123
|
+
imageIndices.add(texture.source);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return Array.from(imageIndices).sort();
|
|
128
|
+
}
|
|
129
|
+
|
|
113
130
|
async function loadImage(gltf, image, index, options, context) {
|
|
114
131
|
const {
|
|
115
132
|
fetch,
|
|
@@ -130,6 +147,7 @@ async function loadImage(gltf, image, index, options, context) {
|
|
|
130
147
|
|
|
131
148
|
assert(arrayBuffer, 'glTF image has no data');
|
|
132
149
|
const parsedImage = await parse(arrayBuffer, ImageLoader, {}, context);
|
|
150
|
+
gltf.images = gltf.images || [];
|
|
133
151
|
gltf.images[index] = parsedImage;
|
|
134
152
|
}
|
|
135
153
|
//# sourceMappingURL=parse-gltf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"names":["ImageLoader","parseJSON","sliceArrayBuffer","assert","resolveUrl","getTypedArrayForBufferView","decodeExtensions","normalizeGLTFV1","postProcessGLTF","parseGLBSync","isGLB","isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","context","parseGLTFContainerSync","normalize","promises","loadBuffers","json","buffers","loadImages","promise","push","Promise","all","postProcess","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","_glb","Array","length","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","fetch","response","loadImage","image","index","parse","Number","isFinite","bufferView","array","parsedImage"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport type {GLB} from '../types/glb-types';\nimport type {GLBParseOptions} from './parse-glb';\n\nimport {ImageLoader} from '@loaders.gl/images';\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {decodeExtensions} from '../extensions/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\nimport {postProcessGLTF} from '../api/post-process-gltf';\nimport parseGLBSync, {isGLB} from './parse-glb';\n\nexport type GLTFParseOptions = {\n excludeExtensions?: string[];\n decompressMeshes?: boolean;\n normalize?: boolean;\n loadBuffers?: boolean;\n loadImages?: boolean;\n postProcess?: boolean;\n};\n\n// export type GLTFOptions = {\n// gltf?: GLTFParseOptions;\n// };\n\nexport function isGLTF(arrayBuffer, options?): boolean {\n const byteOffset = 0;\n return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n gltf,\n arrayBufferOrString,\n byteOffset = 0,\n options: {\n gltf?: GLTFParseOptions;\n glb?: GLBParseOptions;\n },\n context: LoaderContext\n) {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n const promises: Promise<any>[] = [];\n\n // Load linked buffers asynchronously and decodes base64 buffers in parallel\n if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n await loadBuffers(gltf, options, context);\n }\n\n if (options?.gltf?.loadImages) {\n const promise = loadImages(gltf, options, context);\n promises.push(promise);\n }\n\n const promise = decodeExtensions(gltf, options, context);\n promises.push(promise);\n\n // Parallelize image loading and buffer loading/extension decoding\n await Promise.all(promises);\n\n // Post processing resolves indices to objects, buffers\n return options?.gltf?.postProcess ? postProcessGLTF(gltf, options) : gltf;\n}\n\n// `data` - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options) {\n // Initialize gltf container\n if (options.uri) {\n gltf.baseUri = options.uri;\n }\n\n // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(data);\n }\n\n if (typeof data === 'string') {\n // If string, try to parse as JSON\n gltf.json = parseJSON(data);\n } else if (data instanceof ArrayBuffer) {\n // If still ArrayBuffer, parse as GLB container\n const glb: GLB = {} as GLB;\n byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n gltf._glb = glb;\n gltf.json = glb.json;\n } else {\n assert(false, 'GLTF: must be ArrayBuffer or string');\n }\n\n // Populate buffers\n // Create an external buffers array to hold binary data\n const buffers = gltf.json.buffers || [];\n gltf.buffers = new Array(buffers.length).fill(null);\n\n // Populates JSON and some bin chunk info\n if (gltf._glb && gltf._glb.header.hasBinChunk) {\n const {binChunks} = gltf._glb;\n gltf.buffers[0] = {\n arrayBuffer: binChunks[0].arrayBuffer,\n byteOffset: binChunks[0].byteOffset,\n byteLength: binChunks[0].byteLength\n };\n\n // TODO - this modifies JSON and is a post processing thing\n // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n }\n\n // Populate images\n const images = gltf.json.images || [];\n gltf.images = new Array(images.length).fill({});\n}\n\n// Asynchronously fetch and parse buffers, store in buffers array outside of json\nasync function loadBuffers(gltf, options, context: LoaderContext) {\n for (let i = 0; i < gltf.json.buffers.length; ++i) {\n const buffer = gltf.json.buffers[i];\n if (buffer.uri) {\n const {fetch} = context;\n assert(fetch);\n\n const uri = resolveUrl(buffer.uri, options);\n const response = await context?.fetch?.(uri);\n const arrayBuffer = await response?.arrayBuffer?.();\n\n gltf.buffers[i] = {\n arrayBuffer,\n byteOffset: 0,\n byteLength: arrayBuffer.byteLength\n };\n\n delete buffer.uri;\n }\n }\n}\n\nasync function loadImages(gltf, options, context: LoaderContext) {\n const images = gltf.json.images || [];\n\n const promises: Promise<any>[] = [];\n for (let i = 0; i < images.length; ++i) {\n promises.push(loadImage(gltf, images[i], i, options, context));\n }\n\n return await Promise.all(promises);\n}\n\n// Asynchronously fetches and parses one image, store in images array outside of json\nasync function loadImage(gltf, image, index: number, options, context: LoaderContext) {\n const {fetch, parse} = context;\n\n let arrayBuffer;\n\n if (image.uri) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\n }\n\n if (Number.isFinite(image.bufferView)) {\n const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n }\n\n assert(arrayBuffer, 'glTF image has no data');\n\n // Call `parse`\n const parsedImage = await parse(arrayBuffer, ImageLoader, {}, context);\n // TODO making sure ImageLoader is overridable by using array of loaders\n // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n gltf.images[index] = parsedImage;\n}\n"],"file":"parse-gltf.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"names":["ImageLoader","parseJSON","sliceArrayBuffer","assert","resolveUrl","getTypedArrayForBufferView","preprocessExtensions","decodeExtensions","normalizeGLTFV1","postProcessGLTF","parseGLBSync","isGLB","isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","context","parseGLTFContainerSync","normalize","promises","loadBuffers","json","buffers","loadImages","promise","push","Promise","all","postProcess","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","_glb","Array","length","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","fetch","response","imageIndices","getReferencesImageIndices","imageIndex","loadImage","Set","textures","texture","source","undefined","add","from","sort","image","index","parse","Number","isFinite","bufferView","array","parsedImage"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLB} from '../types/glb-types';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\n\nimport {ImageLoader} from '@loaders.gl/images';\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {preprocessExtensions, decodeExtensions} from '../api/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\nimport {postProcessGLTF} from '../api/post-process-gltf';\nimport parseGLBSync, {isGLB} from './parse-glb';\n\nexport type GLTFParseOptions = {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n postProcess?: boolean;\n excludeExtensions?: string[];\n};\n\n// export type GLTFOptions = {\n// gltf?: GLTFParseOptions;\n// };\n\nexport function isGLTF(arrayBuffer, options?): boolean {\n const byteOffset = 0;\n return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n gltf: GLTFWithBuffers,\n arrayBufferOrString,\n byteOffset = 0,\n options: GLTFLoaderOptions,\n context: LoaderContext\n) {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n const promises: Promise<any>[] = [];\n\n // Load linked buffers asynchronously and decodes base64 buffers in parallel\n if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n await loadBuffers(gltf, options, context);\n }\n\n if (options?.gltf?.loadImages) {\n const promise = loadImages(gltf, options, context);\n promises.push(promise);\n }\n\n const promise = decodeExtensions(gltf, options, context);\n promises.push(promise);\n\n // Parallelize image loading and buffer loading/extension decoding\n await Promise.all(promises);\n\n // Post processing resolves indices to objects, buffers\n return options?.gltf?.postProcess ? postProcessGLTF(gltf, options) : gltf;\n}\n\n// `data` - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options) {\n // Initialize gltf container\n if (options.uri) {\n gltf.baseUri = options.uri;\n }\n\n // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(data);\n }\n\n if (typeof data === 'string') {\n // If string, try to parse as JSON\n gltf.json = parseJSON(data);\n } else if (data instanceof ArrayBuffer) {\n // If still ArrayBuffer, parse as GLB container\n const glb: GLB = {} as GLB;\n byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n gltf._glb = glb;\n gltf.json = glb.json;\n } else {\n assert(false, 'GLTF: must be ArrayBuffer or string');\n }\n\n // Populate buffers\n // Create an external buffers array to hold binary data\n const buffers = gltf.json.buffers || [];\n gltf.buffers = new Array(buffers.length).fill(null);\n\n // Populates JSON and some bin chunk info\n if (gltf._glb && gltf._glb.header.hasBinChunk) {\n const {binChunks} = gltf._glb;\n gltf.buffers[0] = {\n arrayBuffer: binChunks[0].arrayBuffer,\n byteOffset: binChunks[0].byteOffset,\n byteLength: binChunks[0].byteLength\n };\n\n // TODO - this modifies JSON and is a post processing thing\n // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n }\n\n // Populate images\n const images = gltf.json.images || [];\n gltf.images = new Array(images.length).fill({});\n}\n\n/** Asynchronously fetch and parse buffers, store in buffers array outside of json\n * TODO - traverse gltf and determine which buffers are actually needed\n */\nasync function loadBuffers(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n // TODO\n const buffers = gltf.json.buffers || [];\n for (let i = 0; i < buffers.length; ++i) {\n const buffer = buffers[i];\n if (buffer.uri) {\n const {fetch} = context;\n assert(fetch);\n\n const uri = resolveUrl(buffer.uri, options);\n const response = await context?.fetch?.(uri);\n const arrayBuffer = await response?.arrayBuffer?.();\n\n gltf.buffers[i] = {\n arrayBuffer,\n byteOffset: 0,\n byteLength: arrayBuffer.byteLength\n };\n\n delete buffer.uri;\n }\n }\n}\n\n/**\n * Loads all images\n * TODO - traverse gltf and determine which images are actually needed\n * @param gltf\n * @param options\n * @param context\n * @returns\n */\nasync function loadImages(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n const imageIndices = getReferencesImageIndices(gltf);\n\n const images = gltf.json.images || [];\n\n const promises: Promise<any>[] = [];\n for (const imageIndex of imageIndices) {\n promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));\n }\n\n return await Promise.all(promises);\n}\n\n/** Make sure we only load images that are actually referenced by textures */\nfunction getReferencesImageIndices(gltf: GLTFWithBuffers): number[] {\n const imageIndices = new Set<number>();\n\n const textures = gltf.json.textures || [];\n for (const texture of textures) {\n if (texture.source !== undefined) {\n imageIndices.add(texture.source);\n }\n }\n\n return Array.from(imageIndices).sort();\n}\n\n/** Asynchronously fetches and parses one image, store in images array outside of json */\nasync function loadImage(\n gltf: GLTFWithBuffers,\n image,\n index: number,\n options,\n context: LoaderContext\n) {\n const {fetch, parse} = context;\n\n let arrayBuffer;\n\n if (image.uri) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\n }\n\n if (Number.isFinite(image.bufferView)) {\n const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n }\n\n assert(arrayBuffer, 'glTF image has no data');\n\n // Call `parse`\n const parsedImage = await parse(arrayBuffer, ImageLoader, {}, context);\n // TODO making sure ImageLoader is overridable by using array of loaders\n // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n // Store the loaded image\n gltf.images = gltf.images || [];\n gltf.images[index] = parsedImage;\n}\n"],"file":"parse-gltf.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = typeof "3.0.
|
|
1
|
+
export const VERSION = typeof "3.1.0-alpha.4" !== 'undefined' ? "3.1.0-alpha.4" : 'latest';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/utils/version.js"],"names":["VERSION"],"mappings":"AAGA,OAAO,MAAMA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/utils/version.js"],"names":["VERSION"],"mappings":"AAGA,OAAO,MAAMA,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE","sourcesContent":["// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n"],"file":"version.js"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const WEBP_TEST_IMAGES = {
|
|
2
|
+
lossy: 'UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA',
|
|
3
|
+
lossless: 'UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==',
|
|
4
|
+
alpha: 'UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==',
|
|
5
|
+
animation: 'UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA'
|
|
6
|
+
};
|
|
7
|
+
const WEBP_FEATURES = ['lossy', 'lossless', 'alpha', 'animation'];
|
|
8
|
+
export async function isWebPSupported(features = WEBP_FEATURES) {
|
|
9
|
+
const promises = features.map(feature => checkWebPFeature(feature));
|
|
10
|
+
const statuses = await Promise.all(promises);
|
|
11
|
+
return statuses.every(_ => _);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function checkWebPFeature(feature) {
|
|
15
|
+
if (typeof Image === 'undefined') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return await new Promise((resolve, reject) => {
|
|
20
|
+
const img = new Image();
|
|
21
|
+
|
|
22
|
+
img.onload = () => resolve(img.width > 0 && img.height > 0);
|
|
23
|
+
|
|
24
|
+
img.onerror = () => resolve(false);
|
|
25
|
+
|
|
26
|
+
img.src = `data:image/webp;base64,${WEBP_TEST_IMAGES[feature]}`;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=webp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/webp/webp.ts"],"names":["WEBP_TEST_IMAGES","lossy","lossless","alpha","animation","WEBP_FEATURES","isWebPSupported","features","promises","map","feature","checkWebPFeature","statuses","Promise","all","every","_","Image","resolve","reject","img","onload","width","height","onerror","src"],"mappings":"AAAA,MAAMA,gBAAgB,GAAG;AACvBC,EAAAA,KAAK,EAAE,0DADgB;AAEvBC,EAAAA,QAAQ,EAAE,kDAFa;AAGvBC,EAAAA,KAAK,EACH,kHAJqB;AAKvBC,EAAAA,SAAS,EACP;AANqB,CAAzB;AAWA,MAAMC,aAA4B,GAAG,CAAC,OAAD,EAAU,UAAV,EAAsB,OAAtB,EAA+B,WAA/B,CAArC;AAMA,OAAO,eAAeC,eAAf,CAA+BC,QAAuB,GAAGF,aAAzD,EAA0F;AAC/F,QAAMG,QAAQ,GAAGD,QAAQ,CAACE,GAAT,CAAcC,OAAD,IAAaC,gBAAgB,CAACD,OAAD,CAA1C,CAAjB;AACA,QAAME,QAAQ,GAAG,MAAMC,OAAO,CAACC,GAAR,CAAYN,QAAZ,CAAvB;AACA,SAAOI,QAAQ,CAACG,KAAT,CAAgBC,CAAD,IAAOA,CAAtB,CAAP;AACD;;AASD,eAAeL,gBAAf,CAAgCD,OAAhC,EAAwE;AACtE,MAAI,OAAOO,KAAP,KAAiB,WAArB,EAAkC;AAChC,WAAO,KAAP;AACD;;AACD,SAAO,MAAM,IAAIJ,OAAJ,CAAY,CAACK,OAAD,EAAUC,MAAV,KAAqB;AAC5C,UAAMC,GAAG,GAAG,IAAIH,KAAJ,EAAZ;;AACAG,IAAAA,GAAG,CAACC,MAAJ,GAAa,MAAMH,OAAO,CAACE,GAAG,CAACE,KAAJ,GAAY,CAAZ,IAAiBF,GAAG,CAACG,MAAJ,GAAa,CAA/B,CAA1B;;AACAH,IAAAA,GAAG,CAACI,OAAJ,GAAc,MAAMN,OAAO,CAAC,KAAD,CAA3B;;AACAE,IAAAA,GAAG,CAACK,GAAJ,GAAW,0BAAyBzB,gBAAgB,CAACU,OAAD,CAAU,EAA9D;AACD,GALY,CAAb;AAMD","sourcesContent":["const WEBP_TEST_IMAGES = {\n lossy: 'UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA',\n lossless: 'UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==',\n alpha:\n 'UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==',\n animation:\n 'UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA'\n};\n\nexport type WebPFeature = 'lossy' | 'lossless' | 'alpha' | 'animation';\n\nconst WEBP_FEATURES: WebPFeature[] = ['lossy', 'lossless', 'alpha', 'animation'];\n\n/**\n * Checks if WebP is supported\n * @param features Array, can include 'lossy', 'lossless', 'alpha' or 'animation'\n */\nexport async function isWebPSupported(features: WebPFeature[] = WEBP_FEATURES): Promise<boolean> {\n const promises = features.map((feature) => checkWebPFeature(feature));\n const statuses = await Promise.all(promises);\n return statuses.every((_) => _);\n}\n\n/**\n * Checks if a specific WebP feature is supported\n * @param feature 'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.\n *\n * Based on Google's official recommended checks\n * @see https://developers.google.com/speed/webp/faq#how_can_i_detect_browser_support_for_webp\n */\nasync function checkWebPFeature(feature: WebPFeature): Promise<boolean> {\n if (typeof Image === 'undefined') {\n return false;\n }\n return await new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img.width > 0 && img.height > 0);\n img.onerror = () => resolve(false);\n img.src = `data:image/webp;base64,${WEBP_TEST_IMAGES[feature]}`;\n });\n}\n"],"file":"webp.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/gltf",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.1.0-alpha.4",
|
|
4
4
|
"description": "Framework-independent loader for the glTF format",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"build-bundle": "webpack --config ../../scripts/webpack/bundle.js"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@loaders.gl/core": "3.0.
|
|
38
|
-
"@loaders.gl/draco": "3.0.
|
|
39
|
-
"@loaders.gl/images": "3.0.
|
|
40
|
-
"@loaders.gl/loader-utils": "3.0.
|
|
37
|
+
"@loaders.gl/core": "3.1.0-alpha.4",
|
|
38
|
+
"@loaders.gl/draco": "3.1.0-alpha.4",
|
|
39
|
+
"@loaders.gl/images": "3.1.0-alpha.4",
|
|
40
|
+
"@loaders.gl/loader-utils": "3.1.0-alpha.4"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "e309784af37ef9f3640c7733c7851124c72e1fa3"
|
|
43
43
|
}
|
package/src/bundle.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
const moduleExports = require('./index');
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
module.exports = Object.assign(_global.loaders, moduleExports);
|
|
3
|
+
globalThis.loaders = globalThis.loaders || {};
|
|
4
|
+
module.exports = Object.assign(globalThis.loaders, moduleExports);
|
package/src/gltf-loader.ts
CHANGED
|
@@ -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';
|