diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java index 719d9a61ce..e06e4dfda5 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2022 jMonkeyEngine + * Copyright (c) 2009-2023 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,8 +36,10 @@ import com.jme3.plugins.json.JsonElement; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -51,14 +53,20 @@ public class CustomContentManager { private GltfModelKey key; private GltfLoader gltfLoader; - private final Map defaultExtensionLoaders = new HashMap<>(); + + static final Map> defaultExtensionLoaders = new ConcurrentHashMap<>(); + static { + defaultExtensionLoaders.put("KHR_materials_pbrSpecularGlossiness", PBRSpecGlossExtensionLoader.class); + defaultExtensionLoaders.put("KHR_lights_punctual", LightsPunctualExtensionLoader.class); + defaultExtensionLoaders.put("KHR_materials_unlit", UnlitExtensionLoader.class); + defaultExtensionLoaders.put("KHR_texture_transform", TextureTransformExtensionLoader.class); + defaultExtensionLoaders.put("KHR_materials_emissive_strength", PBREmissiveStrengthExtensionLoader.class); + + } + + private final Map loadedExtensionLoaders = new HashMap<>(); public CustomContentManager() { - defaultExtensionLoaders.put("KHR_materials_pbrSpecularGlossiness", new PBRSpecGlossExtensionLoader()); - defaultExtensionLoaders.put("KHR_lights_punctual", new LightsPunctualExtensionLoader()); - defaultExtensionLoaders.put("KHR_materials_unlit", new UnlitExtensionLoader()); - defaultExtensionLoaders.put("KHR_texture_transform", new TextureTransformExtensionLoader()); - defaultExtensionLoaders.put("KHR_materials_emissive_strength", new PBREmissiveStrengthExtensionLoader()); } void init(GltfLoader gltfLoader) { @@ -107,12 +115,29 @@ private T readExtension(String name, JsonElement el, T input) throws AssetLo for (Map.Entry ext : extensions.getAsJsonObject().entrySet()) { ExtensionLoader loader = null; + if (key != null) { loader = key.getExtensionLoader(ext.getKey()); } + if (loader == null) { - loader = defaultExtensionLoaders.get(ext.getKey()); + loader = loadedExtensionLoaders.get(ext.getKey()); + if (loader == null) { + try { + Class clz = defaultExtensionLoaders.get(ext.getKey()); + if (clz != null) { + loader = clz.getDeclaredConstructor().newInstance(); + } + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + logger.log(Level.WARNING, "Could not instantiate loader", e); + } + + if (loader != null) { + loadedExtensionLoaders.put(ext.getKey(), loader); + } + } } + if (loader == null) { logger.log(Level.WARNING, "Could not find loader for extension " + ext.getKey()); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java index 647f1bfcd8..0a03156f88 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java @@ -1471,4 +1471,14 @@ public SkinBuffers populate(Integer bufferViewIndex, int componentType, String t return new SkinBuffers(data, format.getComponentSize()); } } + + + public static void registerExtension(String name, Class ext) { + CustomContentManager.defaultExtensionLoaders.put(name, ext); + } + + + public static void unregisterExtension(String name) { + CustomContentManager.defaultExtensionLoaders.remove(name); + } } \ No newline at end of file