diff --git a/app_web/src/main.js b/app_web/src/main.js index a2d07d89..62b66a2d 100644 --- a/app_web/src/main.js +++ b/app_web/src/main.js @@ -3,8 +3,8 @@ import { GltfView } from 'gltf-viewer-source'; import { UIModel } from './logic/uimodel.js'; import { app } from './ui/ui.js'; -import { from, merge } from 'rxjs'; -import { mergeMap, map, share } from 'rxjs/operators'; +import { EMPTY, from, merge } from 'rxjs'; +import { mergeMap, map, share, catchError } from 'rxjs/operators'; import { GltfModelPathProvider, fillEnvironmentWithPaths } from './model_path_provider.js'; export default async () => { @@ -72,6 +72,11 @@ export default async () => { return state; })); }), + catchError(error => { + console.error(error); + uiModel.exitLoadingState(); + return EMPTY; + }), share() ); diff --git a/source/gltf/gltf.js b/source/gltf/gltf.js index f6f9e9e0..9253c3e6 100644 --- a/source/gltf/gltf.js +++ b/source/gltf/gltf.js @@ -18,6 +18,27 @@ import { gltfAnimation } from './animation.js'; import { gltfSkin } from './skin.js'; import { gltfVariant } from './variant.js'; +const allowedExtensions = [ + "KHR_draco_mesh_compression", + "KHR_texture_basisu", + "KHR_texture_transform", + "KHR_lights_punctual", + "KHR_lights_image_based", + "KHR_materials_variants", + "KHR_materials_unlit", + "KHR_materials_clearcoat", + "KHR_materials_sheen", + "KHR_materials_transmission", + "KHR_materials_volume", + "KHR_materials_ior", + "KHR_materials_iridescence", + "KHR_materials_anisotropy", + "KHR_materials_specular", + "KHR_materials_emissive_strength", + "KHR_materials_xmp_json_ld", + "KHR_materials_pbrSpecularGlossiness", +]; + class glTF extends GltfObject { constructor(file) @@ -52,6 +73,12 @@ class glTF extends GltfObject { super.fromJson(json); + for (const extensionName of json.extensionsRequired ?? []) { + if (!allowedExtensions.includes(extensionName)) { + throw new Error("Unsupported extension: " + extensionName); + } + } + this.asset = objectFromJson(json.asset, gltfAsset); this.cameras = objectsFromJsons(json.cameras, gltfCamera); this.accessors = objectsFromJsons(json.accessors, gltfAccessor);