From ef067952b21f01806a96de0c938a1331b4669567 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 12:35:12 +0200 Subject: [PATCH 01/14] Fixed multiple extension handling in CustomContentManager If multiple GLTF extensions are present on an element, the CustomContentManager now processes all supported ones instead of just the first one. --- .../java/com/jme3/scene/plugins/gltf/CustomContentManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d9c4cbf7d8..5898887e58 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 @@ -214,7 +214,7 @@ private T readExtension(String name, JsonElement el, T input) throws AssetLo continue; } try { - return (T) loader.handleExtension(gltfLoader, name, el, ext.getValue(), input); + input = (T) loader.handleExtension(gltfLoader, name, el, ext.getValue(), input); } catch (ClassCastException e) { throw new AssetLoadException("Extension loader " + loader.getClass().getName() + " for extension " + ext.getKey() + " is incompatible with type " + input.getClass(), e); } From 317a56abf18e11a4dfccdd170b7ea29b43e5d085 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 20:28:24 +0200 Subject: [PATCH 02/14] Added a flag to GltfModelKey to switch between the old and new material creation process --- .../jme3/scene/plugins/gltf/GltfLoader.java | 10 +++++++++ .../jme3/scene/plugins/gltf/GltfModelKey.java | 21 +++++++++++++++++++ .../jme3/scene/plugins/gltf/GltfUtils.java | 5 +++++ 3 files changed, 36 insertions(+) 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 69b0696df3..8dd1f1d4dd 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 @@ -803,6 +803,16 @@ protected ByteBuffer getBytes(int bufferIndex, String uri, Integer bufferLength) } public Material readMaterial(int materialIndex) throws IOException { + // Fallback to the old material adapter system, if the legacy flag is set. + if (GltfUtils.isMaterialAdaptersEnabled(info)) { + return readMaterialUsingMaterialAdapters(materialIndex); + } + + // TODO Implement new material factory system. + return defaultMat; + } + + protected Material readMaterialUsingMaterialAdapters(int materialIndex) throws IOException { assertNotNull(materials, "There is no material defined yet a mesh references one"); JsonObject matData = materials.get(materialIndex).getAsJsonObject(); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java index 2490243a00..de66ffbc0a 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java @@ -52,6 +52,13 @@ */ public class GltfModelKey extends ModelKey { + /** + * Enables or disables the legacy material adapter system. + * This should only be used in older projects for backward compatibility. + */ + // TODO Set the default to false, after the new material creation process has been implemented + private boolean materialAdaptersEnabled = true; + private Map materialAdapters = new HashMap<>(); private static Map extensionLoaders = new HashMap<>(); private boolean keepSkeletonPose = false; @@ -101,6 +108,20 @@ public boolean isStrict() { return strictExtensionCheck; } + public boolean isMaterialAdaptersEnabled() { + return materialAdaptersEnabled; + } + + /** + * Enables or disables the legacy material adapter system. + * This should only be used in older projects for backward compatibility. + * + * @param materialAdaptersEnabled The value to set. + */ + public void setMaterialAdaptersEnabled(boolean materialAdaptersEnabled) { + this.materialAdaptersEnabled = materialAdaptersEnabled; + } + /** * Registers a MaterialAdapter for the given materialName. * The materialName must be "pbrMetallicRoughness" or any name from KHR_materials glTF Extension (for example "pbrSpecularGlossiness" for "KHR_materials_pbrSpecularGlossiness" extension) diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java index 677f15e6ea..6aff505079 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java @@ -716,6 +716,11 @@ public static GltfModelKey getKey(AssetInfo info) { return null; } + public static boolean isMaterialAdaptersEnabled(AssetInfo info) { + GltfModelKey key = getKey(info); + return key != null && key.isMaterialAdaptersEnabled(); + } + public static MaterialAdapter getAdapterForMaterial(AssetInfo info, String defName) { GltfModelKey key = getKey(info); if (key == null) { From c164633a22c4f5a1fbe6c04feeb8f5a72200c493 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 20:38:40 +0200 Subject: [PATCH 03/14] Implemented new material creation process in GltfLoader * Step 1: Collect all material data in the new GltfMaterialData object * Step 1.1: GltfLoader reads all standard GLTF parameters * Step 1.2: ExtensionLoader and ExtrasLoader can read additional GLTF parameters * Step 2: Find a matching GltfMaterialFactory and use it to create the material --- .../jme3/scene/plugins/gltf/GltfLoader.java | 106 ++++++++++- .../scene/plugins/gltf/GltfMaterialData.java | 176 ++++++++++++++++++ .../plugins/gltf/GltfMaterialFactory.java | 68 +++++++ .../jme3/scene/plugins/gltf/GltfModelKey.java | 3 +- 4 files changed, 350 insertions(+), 3 deletions(-) create mode 100644 jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java create mode 100644 jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java 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 8dd1f1d4dd..77d2d4901a 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 @@ -31,6 +31,7 @@ */ package com.jme3.scene.plugins.gltf; +import static com.jme3.scene.plugins.gltf.GltfMaterialData.*; import static com.jme3.scene.plugins.gltf.GltfUtils.assertNotNull; import static com.jme3.scene.plugins.gltf.GltfUtils.findCommonAncestor; import static com.jme3.scene.plugins.gltf.GltfUtils.getAdapterForMaterial; @@ -109,6 +110,7 @@ import com.jme3.util.BufferInputStream; import com.jme3.util.BufferUtils; import com.jme3.util.IntMap; +import com.jme3.util.SafeArrayList; import com.jme3.util.mikktspace.MikktspaceTangentGenerator; /** @@ -150,6 +152,8 @@ public class GltfLoader implements AssetLoader { Map> skinnedSpatials = new HashMap<>(); private final IntMap skinBuffers = new IntMap<>(); + private static SafeArrayList materialFactoryList = new SafeArrayList<>(GltfMaterialFactory.class); + public GltfLoader() { defaultMaterialAdapters.put("pbrMetallicRoughness", new PBRMetalRoughMaterialAdapter()); } @@ -808,7 +812,63 @@ public Material readMaterial(int materialIndex) throws IOException { return readMaterialUsingMaterialAdapters(materialIndex); } - // TODO Implement new material factory system. + assertNotNull(materials, "There is no material defined yet a mesh references one"); + JsonObject materialJson = materials.get(materialIndex).getAsJsonObject(); + + GltfMaterialData gltfMaterialData = readStandardMaterialParameters(materialJson); + gltfMaterialData = customContentManager.readExtensionAndExtras("material", materialJson, gltfMaterialData); + return createMaterial(gltfMaterialData, materialIndex); + } + + protected GltfMaterialData readStandardMaterialParameters(JsonObject materialJson) throws IOException { + GltfMaterialData gltfMaterialData = new GltfMaterialData(); + gltfMaterialData.setGltfParam(MATERIAL_NAME_PARAM, getAsString(materialJson, "name")); + + JsonObject pbrMetallicRoughnessJson = materialJson.getAsJsonObject("pbrMetallicRoughness"); + if (pbrMetallicRoughnessJson != null) { + gltfMaterialData.setGltfParam(BASE_COLOR_PARAM, getAsColor(pbrMetallicRoughnessJson, "baseColorFactor", ColorRGBA.White)); + gltfMaterialData.setGltfParam(BASE_COLOR_TEXTURE_PARAM, getAsTexture2D(pbrMetallicRoughnessJson, "baseColorTexture")); + gltfMaterialData.setGltfParam(METALLIC_FACTOR_PARAM, getAsFloat(pbrMetallicRoughnessJson, "metallicFactor", 1f)); + gltfMaterialData.setGltfParam(ROUGHNESS_FACTOR_PARAM, getAsFloat(pbrMetallicRoughnessJson, "roughnessFactor", 1f)); + gltfMaterialData.setGltfParam(METALLIC_ROUGHNESS_TEXTURE_PARAM, getAsTexture2D(pbrMetallicRoughnessJson, "metallicRoughnessTexture")); + } + + JsonObject normalTextureJson = materialJson.getAsJsonObject("normalTexture"); + if (normalTextureJson != null) { + gltfMaterialData.setGltfParam(NORMAL_TEXTURE_PARAM, readTexture(normalTextureJson)); + gltfMaterialData.setGltfParam(NORMAL_SCALE_PARAM, getAsFloat(normalTextureJson, "scale")); + useNormalsFlag = true; + } + + JsonObject occlusionTextureJson = materialJson.getAsJsonObject("occlusionTexture"); + if (occlusionTextureJson != null) { + gltfMaterialData.setGltfParam(OCCLUSION_TEXTURE_PARAM, readTexture(occlusionTextureJson)); + gltfMaterialData.setGltfParam(OCCLUSION_TEXTURE_STRENGTH_PARAM, getAsFloat(occlusionTextureJson, "strength")); + } + + gltfMaterialData.setGltfParam(EMISSIV_TEXTURE_PARAM, getAsTexture2D(materialJson, "emissiveTexture")); + gltfMaterialData.setGltfParam(EMISSIV_COLOR_PARAM, getAsColor(materialJson, "emissiveFactor", ColorRGBA.Black)); + + String alphaMode = getAsString(materialJson, "alphaMode"); + gltfMaterialData.setGltfParam(ALPHA_MODE_PARAM, alphaMode); + if ("MASK".equals(alphaMode)) { + gltfMaterialData.setGltfParam(ALPHA_CUTOFF_PARAM, getAsFloat(materialJson, "alphaCutoff")); + } + + gltfMaterialData.setGltfParam(DOUBLE_SIDED_PARAM, getAsBoolean(materialJson, "doubleSided")); + + return gltfMaterialData; + } + + protected Material createMaterial(GltfMaterialData gltfMaterialData, int materialIndex) { + for (GltfMaterialFactory gltfMaterialFactory : materialFactoryList) { + if (gltfMaterialFactory.accepts(info.getKey(), gltfMaterialData)) { + return gltfMaterialFactory.createMaterial(info.getManager(), info.getKey(), gltfMaterialData); + } + } + + logger.log(Level.WARNING, "Couldn't find any matching GltfMaterialFactory for material " + materialIndex); + useNormalsFlag = false; return defaultMat; } @@ -932,6 +992,10 @@ public void readCameras() throws IOException { } } + protected Texture2D getAsTexture2D(JsonObject jsonObject, String textureName) throws IOException { + return readTexture(jsonObject.getAsJsonObject(textureName)); + } + public Texture2D readTexture(JsonObject texture) throws IOException { return readTexture(texture, false); } @@ -1725,4 +1789,44 @@ public static void registerDefaultExtrasLoader(Class loa public static void unregisterDefaultExtrasLoader() { CustomContentManager.defaultExtraLoaderClass = UserDataLoader.class; } + + /** + * Registers a new material factory and places it before all existing factories.
+ * The ordering of these factories defines their priority. When a new material needs to be created, + * the loader searches for the first material factory that accepts the given material data. + * + * @param materialFactory The {@link GltfMaterialFactory} to register. + */ + public static void registerMaterialFactoryFirst(GltfMaterialFactory materialFactory) { + unregisterMaterialFactory(materialFactory.getClass()); + materialFactoryList.add(0, materialFactory); + } + + /** + * Registers a new material factory and places it behind all existing factories.
+ * The ordering of these factories defines their priority. When a new material needs to be created, + * the loader searches for the first material factory that accepts the given material data. + * + * @param materialFactory The {@link GltfMaterialFactory} to register. + */ + public static void registerMaterialFactoryLast(GltfMaterialFactory materialFactory) { + unregisterMaterialFactory(materialFactory.getClass()); + materialFactoryList.add(materialFactory); + } + + /** + * Unregisters a material factory by its class. + * + * @param materialFactoryClass The class of the {@link GltfMaterialFactory} to unregister. + */ + public static void unregisterMaterialFactory(Class materialFactoryClass) { + materialFactoryList.removeIf(materialFactoryClass::isInstance); + } + + /** + * Unregisters all material factories. + */ + public static void unregisterAllMaterialFactories() { + materialFactoryList.clear(); + } } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java new file mode 100644 index 0000000000..cac559e900 --- /dev/null +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2009-2026 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene.plugins.gltf; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Stores all data of a single material from a GLTF file. + * This data can then be used by a {@link GltfMaterialFactory} to create a new material. + *

+ *

Parameter naming convention

+ *
    + *
  • + * Parameter names should use single dots '.' as a separator. + *
  • + *
  • + * All standard parameter names are directly taken from the + * GLTF specs document + * (ยง 5.19. Material and following). + *
  • + *
  • + * All additional parameter names from GLTF extensions should start with {@link #MATERIAL_EXTENSION_PARAM_PREFIX} + * followed by the name of the extension (e.g. "KHR_materials_unlit") and finished by the parameter name. + *
  • + *
  • + * All additional parameter names from GLTF extras should start with {@link #MATERIAL_EXTRA_PARAM_PREFIX}. + *
  • + *
+ *

+ */ +public class GltfMaterialData { + + public static final String MATERIAL_NAME_PARAM = "material.name"; + + public static final String BASE_COLOR_PARAM = "material.pbrMetallicRoughness.baseColorFactor"; + + public static final String BASE_COLOR_TEXTURE_PARAM = "material.pbrMetallicRoughness.baseColorTexture"; + + public static final String METALLIC_FACTOR_PARAM = "material.pbrMetallicRoughness.metallicFactor"; + + public static final String ROUGHNESS_FACTOR_PARAM = "material.pbrMetallicRoughness.roughnessFactor"; + + public static final String METALLIC_ROUGHNESS_TEXTURE_PARAM = "material.pbrMetallicRoughness.metallicRoughnessTexture"; + + public static final String NORMAL_TEXTURE_PARAM = "material.normalTexture"; + + public static final String NORMAL_SCALE_PARAM = "material.normalTextureInfo.scale"; + + public static final String OCCLUSION_TEXTURE_PARAM = "material.occlusionTexture"; + + public static final String OCCLUSION_TEXTURE_STRENGTH_PARAM = "material.occlusionTextureInfo.strength"; + + public static final String EMISSIV_TEXTURE_PARAM = "material.emissiveTexture"; + + public static final String EMISSIV_COLOR_PARAM = "material.emissiveFactor"; + + public static final String ALPHA_MODE_PARAM = "material.alphaMode"; + + public static final String ALPHA_CUTOFF_PARAM = "material.alphaCutoff"; + + public static final String DOUBLE_SIDED_PARAM = "material.doubleSided"; + + public static final String MATERIAL_EXTENSION_PARAM_PREFIX = "material.extension."; + + public static final String MATERIAL_EXTRA_PARAM_PREFIX = "material.extra."; + + + private Map gltfParamMap = new HashMap<>(); + + private Set gltfExtensions = new HashSet<>(); + + + /** + * Checks if the material provides the given GLTF extension. + * + * @param gltfExtension The GLTF extension name. + * @return true if the material provides the given GLTF extension, otherwise false. + */ + public boolean hasGltfExtension(String gltfExtension) { + return gltfExtensions.contains(gltfExtension); + } + + /** + * Adds the given GLTF extension name. + * + * @param gltfExtension The GLTF extension name. + */ + public void addGltfExtension(String gltfExtension) { + gltfExtensions.add(gltfExtension); + } + + /** + * Removes the given GLTF extension name. + * + * @param gltfExtension The GLTF extension name. + */ + public void removeGltfExtension(String gltfExtension) { + gltfExtensions.remove(gltfExtension); + } + + + /** + * Checks if the material provides a material parameter with the given name. + * + * @param gltfParamName The GLTF parameter name. + * @return true if the material provides a material parameter with the given name, otherwise false. + */ + public boolean containsGltfParam(String gltfParamName) { + return gltfParamMap.containsKey(gltfParamName); + } + + /** + * Gets the material parameter with the given name. + * + * @param gltfParamName The GLTF parameter name. + * @return The value of the material parameter with the given name, or null if no such parameter exists. + */ + public Object getGltfParam(String gltfParamName) { + return gltfParamMap.get(gltfParamName); + } + + /** + * Adds a material parameter with the given name and value. + * + * @param gltfParamName The GLTF parameter name. + * @param value The value of the material parameter. Does nothing, if value is null. + */ + public void setGltfParam(String gltfParamName, Object value) { + if (value != null) { + gltfParamMap.put(gltfParamName, value); + } + } + + /** + * Removes the material parameter with the given name. + * + * @param gltfParamName The GLTF parameter name. + * @return The previous value of the material parameter, or null if there was no such parameter. + */ + public Object removeGltfParam(String gltfParamName) { + return gltfParamMap.remove(gltfParamName); + } + +} diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java new file mode 100644 index 0000000000..7d4eabf5f4 --- /dev/null +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2009-2026 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene.plugins.gltf; + +import com.jme3.asset.AssetKey; +import com.jme3.asset.AssetManager; +import com.jme3.material.Material; + +/** + * A material factory creates {@link Material}s based on the data of a single material from a GLTF file. + *

+ * All material factories have bo be registered at the {@link GltfLoader} by using one of its + * static register methods. + *

+ */ +public interface GltfMaterialFactory { + + /** + * Checks, if the factory is able to create a new material from the given material data. + * If it accepts the material data, the {@link #createMaterial(AssetManager, AssetKey, GltfMaterialData)} method + * can be used to create a new material. + * + * @param assetKey The {@link AssetKey} used for loading the GLTF model. + * @param gltfMaterialData The {@link GltfMaterialData} containing all available GLTF material data. + * @return true if the factory is able to create a material from the given material data, otherwise false. + */ + boolean accepts(AssetKey assetKey, GltfMaterialData gltfMaterialData); + + /** + * Creates a new material from the given material data. + * + * @param assetManager The {@link AssetManager} instance. + * @param assetKey The {@link AssetKey} used for loading the GLTF model. + * @param gltfMaterialData The {@link GltfMaterialData} containing all available GLTF material data. + * @return The new created {@link Material}. + */ + Material createMaterial(AssetManager assetManager, AssetKey assetKey, GltfMaterialData gltfMaterialData); + +} diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java index de66ffbc0a..92b6dbe463 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java @@ -56,8 +56,7 @@ public class GltfModelKey extends ModelKey { * Enables or disables the legacy material adapter system. * This should only be used in older projects for backward compatibility. */ - // TODO Set the default to false, after the new material creation process has been implemented - private boolean materialAdaptersEnabled = true; + private boolean materialAdaptersEnabled = false; private Map materialAdapters = new HashMap<>(); private static Map extensionLoaders = new HashMap<>(); From fef2d6ef55244307efd8c575cce32a12b10c5c8e Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 20:56:16 +0200 Subject: [PATCH 04/14] Added handling of GltfMaterialData objects for all material-based ExtensionLoaders * Retains the old MaterialAdapter handling for backward compatibility --- .../PBREmissiveStrengthExtensionLoader.java | 34 ++++++++++++++- .../gltf/PBRSpecGlossExtensionLoader.java | 41 +++++++++++++++++++ .../plugins/gltf/UnlitExtensionLoader.java | 21 ++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java index 71ab1b84a4..3ad3c59d88 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java @@ -33,7 +33,13 @@ import com.jme3.asset.AssetKey; import com.jme3.plugins.json.JsonElement; +import com.jme3.plugins.json.JsonObject; + import java.io.IOException; +import java.util.logging.Logger; + +import static com.jme3.scene.plugins.gltf.GltfMaterialData.MATERIAL_EXTENSION_PARAM_PREFIX; +import static com.jme3.scene.plugins.gltf.GltfUtils.getAsFloat; /** * Extension loader for "KHR_materials_emissive_strength". @@ -41,11 +47,35 @@ * @author codex */ public class PBREmissiveStrengthExtensionLoader implements ExtensionLoader { - + + public static final String EXTENSION_NAME = "KHR_materials_emissive_strength"; + + public static final String EMISSIVE_STRENGTH_PARAM = MATERIAL_EXTENSION_PARAM_PREFIX + EXTENSION_NAME + ".emissiveStrength"; + + private static final Logger logger = Logger.getLogger(PBREmissiveStrengthExtensionLoader.class.getName()); + private PBREmissiveStrengthMaterialAdapter materialAdapter = new PBREmissiveStrengthMaterialAdapter(); - + @Override public Object handleExtension(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { + if (input instanceof GltfMaterialData) { + GltfMaterialData gltfMaterialData = (GltfMaterialData) input; + gltfMaterialData.addGltfExtension(EXTENSION_NAME); + + JsonObject extensionJson = extension.getAsJsonObject(); + gltfMaterialData.setGltfParam(EMISSIVE_STRENGTH_PARAM, getAsFloat(extensionJson, "emissiveStrength")); + + } else if (input instanceof MaterialAdapter) { + return handleExtensionForMaterialAdapter(loader, parentName, parent, extension, input); + + } else { + logger.warning(EXTENSION_NAME + " extension added on unsupported element"); + } + + return input; + } + + private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { MaterialAdapter adapter = materialAdapter; AssetKey key = loader.getInfo().getKey(); //check for a custom adapter for emissive strength diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java index abeda10cd7..395982fd8e 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java @@ -34,7 +34,12 @@ import com.jme3.asset.AssetKey; import java.io.IOException; +import java.util.logging.Logger; + import com.jme3.plugins.json.JsonElement; +import com.jme3.plugins.json.JsonObject; + +import static com.jme3.scene.plugins.gltf.GltfMaterialData.MATERIAL_EXTENSION_PARAM_PREFIX; import static com.jme3.scene.plugins.gltf.GltfUtils.getAsColor; import static com.jme3.scene.plugins.gltf.GltfUtils.getAsFloat; @@ -44,10 +49,46 @@ */ public class PBRSpecGlossExtensionLoader implements ExtensionLoader { + public static final String EXTENSION_NAME = "KHR_materials_pbrSpecularGlossiness"; + + public static final String DIFFUSE_COLOR_PARAM = MATERIAL_EXTENSION_PARAM_PREFIX + EXTENSION_NAME + ".diffuseFactor"; + + public static final String SPECULAR_COLOR_PARAM = MATERIAL_EXTENSION_PARAM_PREFIX + EXTENSION_NAME + ".specularFactor"; + + public static final String GLOSSINESS_FACTOR_PARAM = MATERIAL_EXTENSION_PARAM_PREFIX + EXTENSION_NAME + ".glossinessFactor"; + + public static final String DIFFUSE_TEXTURE_PARAM = MATERIAL_EXTENSION_PARAM_PREFIX + EXTENSION_NAME + ".diffuseTexture"; + + public static final String SPECULAR_GLOSSINESS_TEXTURE_PARAM = MATERIAL_EXTENSION_PARAM_PREFIX + EXTENSION_NAME + ".specularGlossinessTexture"; + + private static final Logger logger = Logger.getLogger(PBRSpecGlossExtensionLoader.class.getName()); + private PBRSpecGlossMaterialAdapter materialAdapter = new PBRSpecGlossMaterialAdapter(); @Override public Object handleExtension(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { + if (input instanceof GltfMaterialData) { + GltfMaterialData gltfMaterialData = (GltfMaterialData) input; + gltfMaterialData.addGltfExtension(EXTENSION_NAME); + + JsonObject extensionJson = extension.getAsJsonObject(); + gltfMaterialData.setGltfParam(DIFFUSE_COLOR_PARAM, getAsColor(extensionJson, "diffuseFactor")); + gltfMaterialData.setGltfParam(SPECULAR_COLOR_PARAM, getAsColor(extensionJson, "specularFactor")); + gltfMaterialData.setGltfParam(GLOSSINESS_FACTOR_PARAM, getAsFloat(extensionJson, "glossinessFactor")); + gltfMaterialData.setGltfParam(DIFFUSE_TEXTURE_PARAM, loader.getAsTexture2D(extensionJson,"diffuseTexture")); + gltfMaterialData.setGltfParam(SPECULAR_GLOSSINESS_TEXTURE_PARAM, loader.getAsTexture2D(extensionJson,"specularGlossinessTexture")); + + } else if (input instanceof MaterialAdapter) { + return handleExtensionForMaterialAdapter(loader, parentName, parent, extension, input); + + } else { + logger.warning(EXTENSION_NAME + " extension added on unsupported element"); + } + + return input; + } + + private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { MaterialAdapter adapter = materialAdapter; AssetKey key = loader.getInfo().getKey(); //check for a custom adapter for spec/gloss pipeline diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java index 790d70b0cf..0ec82c6aed 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java @@ -34,16 +34,37 @@ import com.jme3.plugins.json.JsonElement; import com.jme3.asset.AssetKey; +import java.util.logging.Logger; + /** * Material adapter for the Unlit pipeline * @author Markil 3 */ public class UnlitExtensionLoader implements ExtensionLoader { + public static final String EXTENSION_NAME = "KHR_materials_unlit"; + + private static final Logger logger = Logger.getLogger(UnlitExtensionLoader.class.getName()); + private final UnlitMaterialAdapter materialAdapter = new UnlitMaterialAdapter(); @Override public Object handleExtension(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) { + if (input instanceof GltfMaterialData) { + GltfMaterialData gltfMaterialData = (GltfMaterialData) input; + gltfMaterialData.addGltfExtension(EXTENSION_NAME); + + } else if (input instanceof MaterialAdapter) { + return handleExtensionForMaterialAdapter(loader, parentName, parent, extension, input); + + } else { + logger.warning(EXTENSION_NAME + " extension added on unsupported element"); + } + + return input; + } + + private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) { MaterialAdapter adapter = materialAdapter; AssetKey key = loader.getInfo().getKey(); //check for a custom adapter for spec/gloss pipeline From 11eded35be1c20c4ab9feb4dd2daaa6250577c32 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 21:18:33 +0200 Subject: [PATCH 05/14] Added GltfMaterialFactory implementations for BPRLighting and Unshaded material * Added both material factories as the default ones to the GltfLoader --- .../jme3/scene/plugins/gltf/GltfLoader.java | 5 + .../gltf/PBRLightingMaterialFactory.java | 149 ++++++++++++++++++ .../plugins/gltf/UnshadedMaterialFactory.java | 95 +++++++++++ 3 files changed, 249 insertions(+) create mode 100644 jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java create mode 100644 jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java 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 77d2d4901a..e105e93052 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 @@ -154,6 +154,11 @@ public class GltfLoader implements AssetLoader { private static SafeArrayList materialFactoryList = new SafeArrayList<>(GltfMaterialFactory.class); + static { + materialFactoryList.add(new UnshadedMaterialFactory()); + materialFactoryList.add(new PBRLightingMaterialFactory()); + } + public GltfLoader() { defaultMaterialAdapters.put("pbrMetallicRoughness", new PBRMetalRoughMaterialAdapter()); } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java new file mode 100644 index 0000000000..1100dbb3e4 --- /dev/null +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2009-2026 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene.plugins.gltf; + +import com.jme3.asset.AssetKey; +import com.jme3.asset.AssetManager; +import com.jme3.material.Material; +import com.jme3.material.RenderState; +import com.jme3.texture.Texture; + +import static com.jme3.scene.plugins.gltf.GltfMaterialData.*; +import static com.jme3.scene.plugins.gltf.PBREmissiveStrengthExtensionLoader.EMISSIVE_STRENGTH_PARAM; +import static com.jme3.scene.plugins.gltf.PBRSpecGlossExtensionLoader.*; + +/** + * This material factory creates jME3's standard "PBRLighting" materials. + */ +public class PBRLightingMaterialFactory implements GltfMaterialFactory { + + @Override + public boolean accepts(AssetKey assetKey, GltfMaterialData gltfMaterialData) { + // Since PBRLighting is the default material, it accepts all material data, + // making any subsequent material factories effectively unreachable. + return true; + } + + @Override + public Material createMaterial(AssetManager assetManager, AssetKey assetKey, GltfMaterialData gltfMaterialData) { + Material material = new Material(assetManager, getMaterialDefPath()); + material.setName((String) gltfMaterialData.getGltfParam(MATERIAL_NAME_PARAM)); + + setStandardParams(material, gltfMaterialData); + + if (gltfMaterialData.hasGltfExtension(PBRSpecGlossExtensionLoader.EXTENSION_NAME)) { + setSpecularGlossinessParams(material, gltfMaterialData); + + } else { + setMetallicRoughnessParams(material, gltfMaterialData); + } + + return material; + } + + protected String getMaterialDefPath() { + return "Common/MatDefs/Light/PBRLighting.j3md"; + } + + protected void setStandardParams(Material material, GltfMaterialData gltfMaterialData) { + if (gltfMaterialData.containsGltfParam(NORMAL_TEXTURE_PARAM)) { + setParam(material, "NormalMap", gltfMaterialData.getGltfParam(NORMAL_TEXTURE_PARAM)); + setParam(material, "NormalScale", gltfMaterialData.getGltfParam(NORMAL_SCALE_PARAM)); + material.setFloat("NormalType", 1f); + } + + if (gltfMaterialData.containsGltfParam(OCCLUSION_TEXTURE_PARAM)) { + // Gltf only supports AO maps (gray scales and only the r channel must be read) + material.setBoolean("LightMapAsAOMap", true); + setParam(material, "LightMap", gltfMaterialData.getGltfParam(OCCLUSION_TEXTURE_PARAM)); + setParam(material, "AoStrength", gltfMaterialData.getGltfParam(OCCLUSION_TEXTURE_STRENGTH_PARAM)); + + // Check if the occlusion texture is actually the same instance as the metallic-roughness texture. + boolean isAoPackedInMRMap = false; + if (gltfMaterialData.containsGltfParam(METALLIC_ROUGHNESS_TEXTURE_PARAM)) { + Texture occlusionTexture = (Texture) gltfMaterialData.getGltfParam(OCCLUSION_TEXTURE_PARAM); + Texture metallicRoughnessTexture = (Texture) gltfMaterialData.getGltfParam(METALLIC_ROUGHNESS_TEXTURE_PARAM); + isAoPackedInMRMap = occlusionTexture == metallicRoughnessTexture; + } + material.setBoolean("AoPackedInMRMap", isAoPackedInMRMap); + } + + setParam(material, "EmissiveMap", gltfMaterialData.getGltfParam(EMISSIV_TEXTURE_PARAM)); + setParam(material, "Emissive", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM)); + setParam(material, "EmissiveIntensity", gltfMaterialData.getGltfParam(EMISSIVE_STRENGTH_PARAM)); + + if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { + String alphaMode = (String) gltfMaterialData.getGltfParam(ALPHA_MODE_PARAM); + switch (alphaMode) { + case "MASK": + // "MASK" -> BlendMode.Off + setParam(material, "AlphaDiscardThreshold", gltfMaterialData.getGltfParam(ALPHA_CUTOFF_PARAM)); + break; + case "BLEND": + material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); + break; + } + } + + if (gltfMaterialData.containsGltfParam(DOUBLE_SIDED_PARAM)) { + boolean doubleSided = (boolean) gltfMaterialData.getGltfParam(DOUBLE_SIDED_PARAM); + if (doubleSided) { + //Note that this is not completely right as normals on the back side will be in the wrong direction. + material.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); + } + } + } + + protected void setMetallicRoughnessParams(Material material, GltfMaterialData gltfMaterialData) { + setParam(material, "BaseColor", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM)); + setParam(material, "BaseColorMap", gltfMaterialData.getGltfParam(BASE_COLOR_TEXTURE_PARAM)); + setParam(material, "Metallic", gltfMaterialData.getGltfParam(METALLIC_FACTOR_PARAM)); + setParam(material, "Roughness", gltfMaterialData.getGltfParam(ROUGHNESS_FACTOR_PARAM)); + setParam(material, "MetallicRoughnessMap", gltfMaterialData.getGltfParam(METALLIC_ROUGHNESS_TEXTURE_PARAM)); + } + + protected void setSpecularGlossinessParams(Material material, GltfMaterialData gltfMaterialData) { + material.setBoolean("UseSpecGloss", true); + setParam(material, "BaseColor", gltfMaterialData.getGltfParam(DIFFUSE_COLOR_PARAM)); + setParam(material, "BaseColorMap", gltfMaterialData.getGltfParam(DIFFUSE_TEXTURE_PARAM)); + setParam(material, "Specular", gltfMaterialData.getGltfParam(SPECULAR_COLOR_PARAM)); + setParam(material, "Glossiness", gltfMaterialData.getGltfParam(GLOSSINESS_FACTOR_PARAM)); + setParam(material, "SpecularGlossinessMap", gltfMaterialData.getGltfParam(SPECULAR_GLOSSINESS_TEXTURE_PARAM)); + } + + protected void setParam(Material material, String paramName, Object value) { + if (value != null) { + material.setParam(paramName, value); + } + } + +} diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java new file mode 100644 index 0000000000..ae47824046 --- /dev/null +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2009-2026 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene.plugins.gltf; + +import com.jme3.asset.AssetKey; +import com.jme3.asset.AssetManager; +import com.jme3.material.Material; +import com.jme3.material.RenderState; + +import static com.jme3.scene.plugins.gltf.GltfMaterialData.*; + +/** + * This material factory creates jME3's standard "Unshaded" materials. + */ +public class UnshadedMaterialFactory implements GltfMaterialFactory { + + @Override + public boolean accepts(AssetKey assetKey, GltfMaterialData gltfMaterialData) { + return gltfMaterialData.hasGltfExtension(UnlitExtensionLoader.EXTENSION_NAME); + } + + @Override + public Material createMaterial(AssetManager assetManager, AssetKey assetKey, GltfMaterialData gltfMaterialData) { + Material material = new Material(assetManager,getMaterialDefPath()); + material.setName((String) gltfMaterialData.getGltfParam(MATERIAL_NAME_PARAM)); + + setParam(material, "Color", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM)); + setParam(material, "ColorMap", gltfMaterialData.getGltfParam(BASE_COLOR_TEXTURE_PARAM)); + setParam(material, "GlowColor", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM)); + setParam(material, "GlowMap", gltfMaterialData.getGltfParam(EMISSIV_TEXTURE_PARAM)); + + if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { + String alphaMode = (String) gltfMaterialData.getGltfParam(ALPHA_MODE_PARAM); + switch (alphaMode) { + case "MASK": + // "MASK" -> BlendMode.Off + setParam(material, "AlphaDiscardThreshold", gltfMaterialData.getGltfParam(ALPHA_CUTOFF_PARAM)); + break; + case "BLEND": + material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); + break; + } + } + + if (gltfMaterialData.containsGltfParam(DOUBLE_SIDED_PARAM)) { + boolean doubleSided = (boolean) gltfMaterialData.getGltfParam(DOUBLE_SIDED_PARAM); + if (doubleSided) { + //Note that this is not completely right as normals on the back side will be in the wrong direction. + material.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); + } + } + + return material; + } + + protected String getMaterialDefPath() { + return "Common/MatDefs/Misc/Unshaded.j3md"; + } + + protected void setParam(Material material, String paramName, Object value) { + if (value != null) { + material.setParam(paramName, value); + } + } + +} From ae12167eed21c011bad876578c9b115e6a00fb38 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 22:20:48 +0200 Subject: [PATCH 06/14] Move default values for material parameters to material factories Reason: Setting default values directly in GltfMaterialData obscures whether a parameter is actually defined in the glTF material. The presence of material parameters may be relevant for some material factories. Therefore, default values should be set by the material factories themselves. --- .../com/jme3/scene/plugins/gltf/GltfLoader.java | 8 ++++---- .../plugins/gltf/PBRLightingMaterialFactory.java | 15 ++++++++++----- .../plugins/gltf/UnshadedMaterialFactory.java | 11 ++++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) 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 e105e93052..bb83f4f369 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 @@ -831,10 +831,10 @@ protected GltfMaterialData readStandardMaterialParameters(JsonObject materialJso JsonObject pbrMetallicRoughnessJson = materialJson.getAsJsonObject("pbrMetallicRoughness"); if (pbrMetallicRoughnessJson != null) { - gltfMaterialData.setGltfParam(BASE_COLOR_PARAM, getAsColor(pbrMetallicRoughnessJson, "baseColorFactor", ColorRGBA.White)); + gltfMaterialData.setGltfParam(BASE_COLOR_PARAM, getAsColor(pbrMetallicRoughnessJson, "baseColorFactor")); gltfMaterialData.setGltfParam(BASE_COLOR_TEXTURE_PARAM, getAsTexture2D(pbrMetallicRoughnessJson, "baseColorTexture")); - gltfMaterialData.setGltfParam(METALLIC_FACTOR_PARAM, getAsFloat(pbrMetallicRoughnessJson, "metallicFactor", 1f)); - gltfMaterialData.setGltfParam(ROUGHNESS_FACTOR_PARAM, getAsFloat(pbrMetallicRoughnessJson, "roughnessFactor", 1f)); + gltfMaterialData.setGltfParam(METALLIC_FACTOR_PARAM, getAsFloat(pbrMetallicRoughnessJson, "metallicFactor")); + gltfMaterialData.setGltfParam(ROUGHNESS_FACTOR_PARAM, getAsFloat(pbrMetallicRoughnessJson, "roughnessFactor")); gltfMaterialData.setGltfParam(METALLIC_ROUGHNESS_TEXTURE_PARAM, getAsTexture2D(pbrMetallicRoughnessJson, "metallicRoughnessTexture")); } @@ -852,7 +852,7 @@ protected GltfMaterialData readStandardMaterialParameters(JsonObject materialJso } gltfMaterialData.setGltfParam(EMISSIV_TEXTURE_PARAM, getAsTexture2D(materialJson, "emissiveTexture")); - gltfMaterialData.setGltfParam(EMISSIV_COLOR_PARAM, getAsColor(materialJson, "emissiveFactor", ColorRGBA.Black)); + gltfMaterialData.setGltfParam(EMISSIV_COLOR_PARAM, getAsColor(materialJson, "emissiveFactor")); String alphaMode = getAsString(materialJson, "alphaMode"); gltfMaterialData.setGltfParam(ALPHA_MODE_PARAM, alphaMode); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java index 1100dbb3e4..07d0f47f7b 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java @@ -35,6 +35,7 @@ import com.jme3.asset.AssetManager; import com.jme3.material.Material; import com.jme3.material.RenderState; +import com.jme3.math.ColorRGBA; import com.jme3.texture.Texture; import static com.jme3.scene.plugins.gltf.GltfMaterialData.*; @@ -98,7 +99,7 @@ protected void setStandardParams(Material material, GltfMaterialData gltfMateria } setParam(material, "EmissiveMap", gltfMaterialData.getGltfParam(EMISSIV_TEXTURE_PARAM)); - setParam(material, "Emissive", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM)); + setParam(material, "Emissive", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM), ColorRGBA.Black); setParam(material, "EmissiveIntensity", gltfMaterialData.getGltfParam(EMISSIVE_STRENGTH_PARAM)); if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { @@ -106,7 +107,7 @@ protected void setStandardParams(Material material, GltfMaterialData gltfMateria switch (alphaMode) { case "MASK": // "MASK" -> BlendMode.Off - setParam(material, "AlphaDiscardThreshold", gltfMaterialData.getGltfParam(ALPHA_CUTOFF_PARAM)); + setParam(material, "AlphaDiscardThreshold", gltfMaterialData.getGltfParam(ALPHA_CUTOFF_PARAM), 0.5f); break; case "BLEND": material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); @@ -124,10 +125,10 @@ protected void setStandardParams(Material material, GltfMaterialData gltfMateria } protected void setMetallicRoughnessParams(Material material, GltfMaterialData gltfMaterialData) { - setParam(material, "BaseColor", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM)); + setParam(material, "BaseColor", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM), ColorRGBA.White); setParam(material, "BaseColorMap", gltfMaterialData.getGltfParam(BASE_COLOR_TEXTURE_PARAM)); - setParam(material, "Metallic", gltfMaterialData.getGltfParam(METALLIC_FACTOR_PARAM)); - setParam(material, "Roughness", gltfMaterialData.getGltfParam(ROUGHNESS_FACTOR_PARAM)); + setParam(material, "Metallic", gltfMaterialData.getGltfParam(METALLIC_FACTOR_PARAM), 1f); + setParam(material, "Roughness", gltfMaterialData.getGltfParam(ROUGHNESS_FACTOR_PARAM), 1f); setParam(material, "MetallicRoughnessMap", gltfMaterialData.getGltfParam(METALLIC_ROUGHNESS_TEXTURE_PARAM)); } @@ -146,4 +147,8 @@ protected void setParam(Material material, String paramName, Object value) { } } + protected void setParam(Material material, String paramName, Object value, Object defaultValue) { + setParam(material, paramName, value != null ? value : defaultValue); + } + } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java index ae47824046..58443a95ec 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java @@ -35,6 +35,7 @@ import com.jme3.asset.AssetManager; import com.jme3.material.Material; import com.jme3.material.RenderState; +import com.jme3.math.ColorRGBA; import static com.jme3.scene.plugins.gltf.GltfMaterialData.*; @@ -53,9 +54,9 @@ public Material createMaterial(AssetManager assetManager, AssetKey assetKey, Material material = new Material(assetManager,getMaterialDefPath()); material.setName((String) gltfMaterialData.getGltfParam(MATERIAL_NAME_PARAM)); - setParam(material, "Color", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM)); + setParam(material, "Color", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM), ColorRGBA.White); setParam(material, "ColorMap", gltfMaterialData.getGltfParam(BASE_COLOR_TEXTURE_PARAM)); - setParam(material, "GlowColor", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM)); + setParam(material, "GlowColor", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM), ColorRGBA.Black); setParam(material, "GlowMap", gltfMaterialData.getGltfParam(EMISSIV_TEXTURE_PARAM)); if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { @@ -63,7 +64,7 @@ public Material createMaterial(AssetManager assetManager, AssetKey assetKey, switch (alphaMode) { case "MASK": // "MASK" -> BlendMode.Off - setParam(material, "AlphaDiscardThreshold", gltfMaterialData.getGltfParam(ALPHA_CUTOFF_PARAM)); + setParam(material, "AlphaDiscardThreshold", gltfMaterialData.getGltfParam(ALPHA_CUTOFF_PARAM), 0.5f); break; case "BLEND": material.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); @@ -92,4 +93,8 @@ protected void setParam(Material material, String paramName, Object value) { } } + protected void setParam(Material material, String paramName, Object value, Object defaultValue) { + setParam(material, paramName, value != null ? value : defaultValue); + } + } From 53b75ca00e3945b2e50c781bdb3786212474afc2 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sun, 19 Apr 2026 22:28:11 +0200 Subject: [PATCH 07/14] Deprecating most parts of the old MaterialAdapter system --- .../gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 3 ++- .../java/com/jme3/scene/plugins/gltf/GltfModelKey.java | 7 +++++++ .../gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java | 1 + .../java/com/jme3/scene/plugins/gltf/MaterialAdapter.java | 4 ++++ .../plugins/gltf/PBREmissiveStrengthExtensionLoader.java | 2 ++ .../plugins/gltf/PBREmissiveStrengthMaterialAdapter.java | 4 ++++ .../com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java | 4 ++++ .../scene/plugins/gltf/PBRMetalRoughMaterialAdapter.java | 4 ++++ .../scene/plugins/gltf/PBRSpecGlossExtensionLoader.java | 2 ++ .../scene/plugins/gltf/PBRSpecGlossMaterialAdapter.java | 4 ++++ .../com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java | 2 ++ .../com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java | 4 ++++ 12 files changed, 40 insertions(+), 1 deletion(-) 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 bb83f4f369..69596e7f6a 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 @@ -145,7 +145,7 @@ public class GltfLoader implements AssetLoader { private final Vector3fArrayPopulator vector3fArrayPopulator = new Vector3fArrayPopulator(); private final QuaternionArrayPopulator quaternionArrayPopulator = new QuaternionArrayPopulator(); private final Matrix4fArrayPopulator matrix4fArrayPopulator = new Matrix4fArrayPopulator(); - private final Map defaultMaterialAdapters = new HashMap<>(); + @Deprecated private final Map defaultMaterialAdapters = new HashMap<>(); private final CustomContentManager customContentManager = new CustomContentManager(); private boolean useNormalsFlag = false; @@ -877,6 +877,7 @@ protected Material createMaterial(GltfMaterialData gltfMaterialData, int materia return defaultMat; } + @Deprecated protected Material readMaterialUsingMaterialAdapters(int materialIndex) throws IOException { assertNotNull(materials, "There is no material defined yet a mesh references one"); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java index 92b6dbe463..cea372e7df 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java @@ -58,7 +58,9 @@ public class GltfModelKey extends ModelKey { */ private boolean materialAdaptersEnabled = false; + @Deprecated private Map materialAdapters = new HashMap<>(); + private static Map extensionLoaders = new HashMap<>(); private boolean keepSkeletonPose = false; private ExtrasLoader extrasLoader; @@ -127,7 +129,11 @@ public void setMaterialAdaptersEnabled(boolean materialAdaptersEnabled) { * * @param gltfMaterialName the name of the gltf material * @param adapter the material adapter + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ + @Deprecated public void registerMaterialAdapter(String gltfMaterialName, MaterialAdapter adapter) { materialAdapters.put(gltfMaterialName, adapter); } @@ -144,6 +150,7 @@ public void registerExtensionLoader(String extensionName, ExtensionLoader loader extensionLoaders.put(extensionName, loader); } + @Deprecated public MaterialAdapter getAdapterForMaterial(String gltfMaterialName) { return materialAdapters.get(gltfMaterialName); } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java index 6aff505079..e8f0735f67 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfUtils.java @@ -721,6 +721,7 @@ public static boolean isMaterialAdaptersEnabled(AssetInfo info) { return key != null && key.isMaterialAdaptersEnabled(); } + @Deprecated public static MaterialAdapter getAdapterForMaterial(AssetInfo info, String defName) { GltfModelKey key = getKey(info); if (key == null) { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java index b6b10f9c83..d94d1662fa 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/MaterialAdapter.java @@ -47,7 +47,11 @@ * It maps each gltf parameter to its matching parameter in the JME material, * and allows for some conversion if the JME material model doesn't exactly match the gltf material model * Created by Nehon on 08/08/2017. + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ +@Deprecated public abstract class MaterialAdapter { private final Map paramsMapping = new HashMap<>(); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java index 3ad3c59d88..a29691a669 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java @@ -54,6 +54,7 @@ public class PBREmissiveStrengthExtensionLoader implements ExtensionLoader { private static final Logger logger = Logger.getLogger(PBREmissiveStrengthExtensionLoader.class.getName()); + @Deprecated private PBREmissiveStrengthMaterialAdapter materialAdapter = new PBREmissiveStrengthMaterialAdapter(); @Override @@ -75,6 +76,7 @@ public Object handleExtension(GltfLoader loader, String parentName, JsonElement return input; } + @Deprecated private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { MaterialAdapter adapter = materialAdapter; AssetKey key = loader.getInfo().getKey(); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java index 5d078c97f7..59386c0a8b 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java @@ -35,7 +35,11 @@ * Adapter for converting GLTF emissive strength to JME emissive intensity. * * @author codex + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ +@Deprecated public class PBREmissiveStrengthMaterialAdapter extends PBRMaterialAdapter { public PBREmissiveStrengthMaterialAdapter() { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java index 340cdb513b..6e73560548 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java @@ -37,7 +37,11 @@ * Adapts GLTF PBR materials to JME PBR materials. * * @author Nehon + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ +@Deprecated public abstract class PBRMaterialAdapter extends MaterialAdapter { /** diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMetalRoughMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMetalRoughMaterialAdapter.java index fd744cffdd..c9c99c595f 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMetalRoughMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMetalRoughMaterialAdapter.java @@ -33,7 +33,11 @@ /** * Created by Nehon on 20/08/2017. + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ +@Deprecated public class PBRMetalRoughMaterialAdapter extends PBRMaterialAdapter { public PBRMetalRoughMaterialAdapter() { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java index 395982fd8e..984e649fb4 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossExtensionLoader.java @@ -63,6 +63,7 @@ public class PBRSpecGlossExtensionLoader implements ExtensionLoader { private static final Logger logger = Logger.getLogger(PBRSpecGlossExtensionLoader.class.getName()); + @Deprecated private PBRSpecGlossMaterialAdapter materialAdapter = new PBRSpecGlossMaterialAdapter(); @Override @@ -88,6 +89,7 @@ public Object handleExtension(GltfLoader loader, String parentName, JsonElement return input; } + @Deprecated private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { MaterialAdapter adapter = materialAdapter; AssetKey key = loader.getInfo().getKey(); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossMaterialAdapter.java index bd4c25c8af..df74552ea6 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRSpecGlossMaterialAdapter.java @@ -35,7 +35,11 @@ /** * Created by Nehon on 20/08/2017. + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ +@Deprecated public class PBRSpecGlossMaterialAdapter extends PBRMaterialAdapter { public PBRSpecGlossMaterialAdapter() { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java index 0ec82c6aed..a95eda8960 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitExtensionLoader.java @@ -46,6 +46,7 @@ public class UnlitExtensionLoader implements ExtensionLoader { private static final Logger logger = Logger.getLogger(UnlitExtensionLoader.class.getName()); + @Deprecated private final UnlitMaterialAdapter materialAdapter = new UnlitMaterialAdapter(); @Override @@ -64,6 +65,7 @@ public Object handleExtension(GltfLoader loader, String parentName, JsonElement return input; } + @Deprecated private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) { MaterialAdapter adapter = materialAdapter; AssetKey key = loader.getInfo().getKey(); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java index 65acdf7f2b..9b32dc8fce 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java @@ -37,7 +37,11 @@ /** * @author Markil 3 + * + * @deprecated This will be removed in a future version of the engine. To migrate, + * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. */ +@Deprecated public class UnlitMaterialAdapter extends MaterialAdapter { public UnlitMaterialAdapter() { From 13ad8ba5df51120280f48165f3dd227add898cae Mon Sep 17 00:00:00 2001 From: theMinka Date: Sat, 25 Apr 2026 18:16:20 +0200 Subject: [PATCH 08/14] Fixed vertex color flag in GltfLoader --- .../jme3/scene/plugins/gltf/GltfLoader.java | 9 +++----- .../scene/plugins/gltf/GltfMaterialData.java | 22 +++++++++++++++++++ .../gltf/PBRLightingMaterialFactory.java | 2 ++ .../plugins/gltf/UnshadedMaterialFactory.java | 2 ++ 4 files changed, 29 insertions(+), 6 deletions(-) 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 69596e7f6a..ed8dca5d32 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 @@ -535,7 +535,7 @@ public Geometry[] readMeshPrimitives(int meshIndex) throws IOException { geom.setMaterial(defaultMat); } else { useNormalsFlag = false; - geom.setMaterial(readMaterial(materialIndex)); + geom.setMaterial(readMaterial(materialIndex, useVertexColors)); if (geom.getMaterial().getAdditionalRenderState() .getBlendMode() == RenderState.BlendMode.Alpha) { // Alpha blending is enabled for this material. Let's place the geom in the @@ -549,10 +549,6 @@ public Geometry[] readMeshPrimitives(int meshIndex) throws IOException { } } - if (useVertexColors) { - geom.getMaterial().setBoolean("UseVertexColor", useVertexColors); - } - geom.setName(name + "_" + index); geom.updateModelBound(); @@ -811,7 +807,7 @@ protected ByteBuffer getBytes(int bufferIndex, String uri, Integer bufferLength) return data; } - public Material readMaterial(int materialIndex) throws IOException { + public Material readMaterial(int materialIndex, boolean usesVertexColors) throws IOException { // Fallback to the old material adapter system, if the legacy flag is set. if (GltfUtils.isMaterialAdaptersEnabled(info)) { return readMaterialUsingMaterialAdapters(materialIndex); @@ -821,6 +817,7 @@ public Material readMaterial(int materialIndex) throws IOException { JsonObject materialJson = materials.get(materialIndex).getAsJsonObject(); GltfMaterialData gltfMaterialData = readStandardMaterialParameters(materialJson); + gltfMaterialData.setHasVertexColors(usesVertexColors); gltfMaterialData = customContentManager.readExtensionAndExtras("material", materialJson, gltfMaterialData); return createMaterial(gltfMaterialData, materialIndex); } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java index cac559e900..989a612318 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java @@ -101,6 +101,11 @@ public class GltfMaterialData { private Set gltfExtensions = new HashSet<>(); + /** + * Indicates the existence of a vertex color buffer. + */ + private boolean hasVertexColors; + /** * Checks if the material provides the given GLTF extension. @@ -173,4 +178,21 @@ public Object removeGltfParam(String gltfParamName) { return gltfParamMap.remove(gltfParamName); } + + /** + * @return Indicates the existence of a vertex color buffer. + */ + public boolean hasVertexColors() { + return hasVertexColors; + } + + /** + * Sets the vertex color flag. + * + * @param hasVertexColors The value to set. + */ + public void setHasVertexColors(boolean hasVertexColors) { + this.hasVertexColors = hasVertexColors; + } + } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java index 07d0f47f7b..fbde3c53e8 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java @@ -122,6 +122,8 @@ protected void setStandardParams(Material material, GltfMaterialData gltfMateria material.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); } } + + setParam(material, "UseVertexColor", gltfMaterialData.hasVertexColors()); } protected void setMetallicRoughnessParams(Material material, GltfMaterialData gltfMaterialData) { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java index 58443a95ec..7dd384a9f2 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java @@ -80,6 +80,8 @@ public Material createMaterial(AssetManager assetManager, AssetKey assetKey, } } + setParam(material, "VertexColor", gltfMaterialData.hasVertexColors()); + return material; } From 58410b626d2fa290a32ac981c649e83a328250b0 Mon Sep 17 00:00:00 2001 From: theMinka Date: Sat, 25 Apr 2026 19:03:21 +0200 Subject: [PATCH 09/14] Fixed QueueBucket for BlendMode.AlphaAdditive in GltfLoader --- .../gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 ed8dca5d32..d011925e75 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 @@ -84,6 +84,7 @@ import com.jme3.asset.TextureKey; import com.jme3.material.Material; import com.jme3.material.RenderState; +import com.jme3.material.RenderState.BlendMode; import com.jme3.math.ColorRGBA; import com.jme3.math.FastMath; import com.jme3.math.Matrix4f; @@ -535,9 +536,10 @@ public Geometry[] readMeshPrimitives(int meshIndex) throws IOException { geom.setMaterial(defaultMat); } else { useNormalsFlag = false; - geom.setMaterial(readMaterial(materialIndex, useVertexColors)); - if (geom.getMaterial().getAdditionalRenderState() - .getBlendMode() == RenderState.BlendMode.Alpha) { + Material material = readMaterial(materialIndex, useVertexColors); + geom.setMaterial(material); + BlendMode blendMode = material.getAdditionalRenderState().getBlendMode(); + if (blendMode == BlendMode.Alpha || blendMode == BlendMode.AlphaAdditive) { // Alpha blending is enabled for this material. Let's place the geom in the // transparent bucket. geom.setQueueBucket(RenderQueue.Bucket.Transparent); From 2921b830b686247f3a43fbac7c120d510218bf43 Mon Sep 17 00:00:00 2001 From: theMinka Date: Tue, 28 Apr 2026 11:20:25 +0200 Subject: [PATCH 10/14] Fixed typo in emissive constants in GltfMaterialData --- .../gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 5 ++--- .../java/com/jme3/scene/plugins/gltf/GltfMaterialData.java | 4 ++-- .../jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java | 4 ++-- .../com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) 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 d011925e75..211ad735dd 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 @@ -83,7 +83,6 @@ import com.jme3.asset.AssetLoader; import com.jme3.asset.TextureKey; import com.jme3.material.Material; -import com.jme3.material.RenderState; import com.jme3.material.RenderState.BlendMode; import com.jme3.math.ColorRGBA; import com.jme3.math.FastMath; @@ -850,8 +849,8 @@ protected GltfMaterialData readStandardMaterialParameters(JsonObject materialJso gltfMaterialData.setGltfParam(OCCLUSION_TEXTURE_STRENGTH_PARAM, getAsFloat(occlusionTextureJson, "strength")); } - gltfMaterialData.setGltfParam(EMISSIV_TEXTURE_PARAM, getAsTexture2D(materialJson, "emissiveTexture")); - gltfMaterialData.setGltfParam(EMISSIV_COLOR_PARAM, getAsColor(materialJson, "emissiveFactor")); + gltfMaterialData.setGltfParam(EMISSIVE_TEXTURE_PARAM, getAsTexture2D(materialJson, "emissiveTexture")); + gltfMaterialData.setGltfParam(EMISSIVE_COLOR_PARAM, getAsColor(materialJson, "emissiveFactor")); String alphaMode = getAsString(materialJson, "alphaMode"); gltfMaterialData.setGltfParam(ALPHA_MODE_PARAM, alphaMode); diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java index 989a612318..490bc2973f 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialData.java @@ -82,9 +82,9 @@ public class GltfMaterialData { public static final String OCCLUSION_TEXTURE_STRENGTH_PARAM = "material.occlusionTextureInfo.strength"; - public static final String EMISSIV_TEXTURE_PARAM = "material.emissiveTexture"; + public static final String EMISSIVE_TEXTURE_PARAM = "material.emissiveTexture"; - public static final String EMISSIV_COLOR_PARAM = "material.emissiveFactor"; + public static final String EMISSIVE_COLOR_PARAM = "material.emissiveFactor"; public static final String ALPHA_MODE_PARAM = "material.alphaMode"; diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java index fbde3c53e8..5dcf6761c2 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java @@ -98,8 +98,8 @@ protected void setStandardParams(Material material, GltfMaterialData gltfMateria material.setBoolean("AoPackedInMRMap", isAoPackedInMRMap); } - setParam(material, "EmissiveMap", gltfMaterialData.getGltfParam(EMISSIV_TEXTURE_PARAM)); - setParam(material, "Emissive", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM), ColorRGBA.Black); + setParam(material, "EmissiveMap", gltfMaterialData.getGltfParam(EMISSIVE_TEXTURE_PARAM)); + setParam(material, "Emissive", gltfMaterialData.getGltfParam(EMISSIVE_COLOR_PARAM), ColorRGBA.Black); setParam(material, "EmissiveIntensity", gltfMaterialData.getGltfParam(EMISSIVE_STRENGTH_PARAM)); if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java index 7dd384a9f2..0d89573392 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnshadedMaterialFactory.java @@ -56,8 +56,8 @@ public Material createMaterial(AssetManager assetManager, AssetKey assetKey, setParam(material, "Color", gltfMaterialData.getGltfParam(BASE_COLOR_PARAM), ColorRGBA.White); setParam(material, "ColorMap", gltfMaterialData.getGltfParam(BASE_COLOR_TEXTURE_PARAM)); - setParam(material, "GlowColor", gltfMaterialData.getGltfParam(EMISSIV_COLOR_PARAM), ColorRGBA.Black); - setParam(material, "GlowMap", gltfMaterialData.getGltfParam(EMISSIV_TEXTURE_PARAM)); + setParam(material, "GlowColor", gltfMaterialData.getGltfParam(EMISSIVE_COLOR_PARAM), ColorRGBA.Black); + setParam(material, "GlowMap", gltfMaterialData.getGltfParam(EMISSIVE_TEXTURE_PARAM)); if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { String alphaMode = (String) gltfMaterialData.getGltfParam(ALPHA_MODE_PARAM); From d005d0b1e74c8b6db74f85b7f396bfcc45e1eee0 Mon Sep 17 00:00:00 2001 From: theMinka Date: Wed, 13 May 2026 02:33:49 +0200 Subject: [PATCH 11/14] Fixed missing vertex coloring flag in GltfLoader --- .../java/com/jme3/scene/plugins/gltf/GltfLoader.java | 12 +++++++++--- .../jme3/scene/plugins/gltf/PBRMaterialAdapter.java | 1 + .../scene/plugins/gltf/UnlitMaterialAdapter.java | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) 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 211ad735dd..98942d9417 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 @@ -532,7 +532,11 @@ public Geometry[] readMeshPrimitives(int meshIndex) throws IOException { Integer materialIndex = getAsInteger(meshObject, "material"); if (materialIndex == null) { - geom.setMaterial(defaultMat); + // Create a new default material + Material material = defaultMat.clone(); + material.setBoolean("UseVertexColor", useVertexColors); + geom.setMaterial(material); + } else { useNormalsFlag = false; Material material = readMaterial(materialIndex, useVertexColors); @@ -811,7 +815,7 @@ protected ByteBuffer getBytes(int bufferIndex, String uri, Integer bufferLength) public Material readMaterial(int materialIndex, boolean usesVertexColors) throws IOException { // Fallback to the old material adapter system, if the legacy flag is set. if (GltfUtils.isMaterialAdaptersEnabled(info)) { - return readMaterialUsingMaterialAdapters(materialIndex); + return readMaterialUsingMaterialAdapters(materialIndex, usesVertexColors); } assertNotNull(materials, "There is no material defined yet a mesh references one"); @@ -876,7 +880,7 @@ protected Material createMaterial(GltfMaterialData gltfMaterialData, int materia } @Deprecated - protected Material readMaterialUsingMaterialAdapters(int materialIndex) throws IOException { + protected Material readMaterialUsingMaterialAdapters(int materialIndex, boolean usesVertexColors) throws IOException { assertNotNull(materials, "There is no material defined yet a mesh references one"); JsonObject matData = materials.get(materialIndex).getAsJsonObject(); @@ -949,6 +953,8 @@ protected Material readMaterialUsingMaterialAdapters(int materialIndex) throws I adapter.setParam("emissiveTexture", readTexture(matData.getAsJsonObject("emissiveTexture"))); + adapter.setParam("usesVertexColors", usesVertexColors); + return adapter.getMaterial(); } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java index 6e73560548..185b961b0f 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRMaterialAdapter.java @@ -59,6 +59,7 @@ public PBRMaterialAdapter() { addParamMapping("alphaMode", "alpha"); addParamMapping("alphaCutoff", "AlphaDiscardThreshold"); addParamMapping("doubleSided", "doubleSided"); + addParamMapping("usesVertexColors", "UseVertexColor"); } @Override diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java index 9b32dc8fce..e921025dd5 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/UnlitMaterialAdapter.java @@ -52,6 +52,7 @@ public UnlitMaterialAdapter() { addParamMapping("alphaMode", "alpha"); addParamMapping("alphaCutoff", "AlphaDiscardThreshold"); addParamMapping("doubleSided", "doubleSided"); + addParamMapping("usesVertexColors", "VertexColor"); } @Override From 7909f1bef0b5613ee548bc416245dc32f48248b5 Mon Sep 17 00:00:00 2001 From: theMinka Date: Wed, 13 May 2026 02:36:33 +0200 Subject: [PATCH 12/14] Smaller fixes in some components for loading GLTF files --- .../gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 4 ++-- .../com/jme3/scene/plugins/gltf/GltfMaterialFactory.java | 2 +- .../java/com/jme3/scene/plugins/gltf/GltfModelKey.java | 8 +++++--- .../scene/plugins/gltf/PBRLightingMaterialFactory.java | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) 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 98942d9417..bbca2de105 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 @@ -1808,8 +1808,8 @@ public static void unregisterDefaultExtrasLoader() { * @param materialFactory The {@link GltfMaterialFactory} to register. */ public static void registerMaterialFactoryFirst(GltfMaterialFactory materialFactory) { - unregisterMaterialFactory(materialFactory.getClass()); - materialFactoryList.add(0, materialFactory); + unregisterMaterialFactory(materialFactory.getClass()); + materialFactoryList.add(0, materialFactory); } /** diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java index 7d4eabf5f4..32554b9919 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfMaterialFactory.java @@ -38,7 +38,7 @@ /** * A material factory creates {@link Material}s based on the data of a single material from a GLTF file. *

- * All material factories have bo be registered at the {@link GltfLoader} by using one of its + * All material factories have bo be registered with the {@link GltfLoader} by using one of its * static register methods. *

*/ diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java index cea372e7df..f045a5a7b3 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfModelKey.java @@ -196,15 +196,17 @@ public boolean equals(Object object) { || !Objects.equals(extrasLoader, other.extrasLoader)) { return false; } - return keepSkeletonPose == other.keepSkeletonPose; + return keepSkeletonPose == other.keepSkeletonPose + && materialAdaptersEnabled == other.materialAdaptersEnabled; } @Override public int hashCode() { int hash = 5; hash = 37 * hash + materialAdapters.hashCode(); - hash = 37 * hash + Objects.hashCode(this.extrasLoader); - hash = 37 * hash + (this.keepSkeletonPose ? 1 : 0); + hash = 37 * hash + Objects.hashCode(extrasLoader); + hash = 37 * hash + (keepSkeletonPose ? 1 : 0); + hash = 37 * hash + (materialAdaptersEnabled ? 1 : 0); return hash; } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java index 5dcf6761c2..334d21f1cb 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBRLightingMaterialFactory.java @@ -100,7 +100,7 @@ protected void setStandardParams(Material material, GltfMaterialData gltfMateria setParam(material, "EmissiveMap", gltfMaterialData.getGltfParam(EMISSIVE_TEXTURE_PARAM)); setParam(material, "Emissive", gltfMaterialData.getGltfParam(EMISSIVE_COLOR_PARAM), ColorRGBA.Black); - setParam(material, "EmissiveIntensity", gltfMaterialData.getGltfParam(EMISSIVE_STRENGTH_PARAM)); + setParam(material, "EmissiveIntensity", gltfMaterialData.getGltfParam(EMISSIVE_STRENGTH_PARAM), 1f); if (gltfMaterialData.containsGltfParam(ALPHA_MODE_PARAM)) { String alphaMode = (String) gltfMaterialData.getGltfParam(ALPHA_MODE_PARAM); From b245ada292192ec26957eccb52cf61482f87d0b2 Mon Sep 17 00:00:00 2001 From: theMinka Date: Fri, 15 May 2026 17:31:08 +0200 Subject: [PATCH 13/14] PBREmissiveStrengthExtensionLoader no longer replaces other MaterialAdapters --- .../PBREmissiveStrengthExtensionLoader.java | 20 +++++--- .../PBREmissiveStrengthMaterialAdapter.java | 50 ------------------- 2 files changed, 13 insertions(+), 57 deletions(-) delete mode 100644 jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java index a29691a669..8fdf2934d7 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthExtensionLoader.java @@ -32,8 +32,10 @@ package com.jme3.scene.plugins.gltf; import com.jme3.asset.AssetKey; +import com.jme3.material.MatParam; import com.jme3.plugins.json.JsonElement; import com.jme3.plugins.json.JsonObject; +import com.jme3.shader.VarType; import java.io.IOException; import java.util.logging.Logger; @@ -54,9 +56,6 @@ public class PBREmissiveStrengthExtensionLoader implements ExtensionLoader { private static final Logger logger = Logger.getLogger(PBREmissiveStrengthExtensionLoader.class.getName()); - @Deprecated - private PBREmissiveStrengthMaterialAdapter materialAdapter = new PBREmissiveStrengthMaterialAdapter(); - @Override public Object handleExtension(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { if (input instanceof GltfMaterialData) { @@ -78,7 +77,7 @@ public Object handleExtension(GltfLoader loader, String parentName, JsonElement @Deprecated private Object handleExtensionForMaterialAdapter(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) throws IOException { - MaterialAdapter adapter = materialAdapter; + MaterialAdapter adapter = (MaterialAdapter) input; AssetKey key = loader.getInfo().getKey(); //check for a custom adapter for emissive strength if (key instanceof GltfModelKey) { @@ -86,9 +85,16 @@ private Object handleExtensionForMaterialAdapter(GltfLoader loader, String paren if (custom != null) { adapter = custom; } - } - adapter.init(loader.getInfo().getManager()); - adapter.setParam("emissiveStrength", GltfUtils.getAsFloat(extension.getAsJsonObject(), "emissiveStrength")); + } + + // Simply add a param mapping for the emissive strength, if the given material supports a + // material parameter with the exact name "EmissiveIntensity". + MatParam matParam = adapter.getMaterial().getMaterialDef().getMaterialParam("EmissiveIntensity"); + if (matParam != null && matParam.getVarType() == VarType.Float) { + adapter.addParamMapping("emissiveStrength", "EmissiveIntensity"); + adapter.setParam("emissiveStrength", GltfUtils.getAsFloat(extension.getAsJsonObject(), "emissiveStrength")); + } + return adapter; } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java deleted file mode 100644 index 59386c0a8b..0000000000 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/PBREmissiveStrengthMaterialAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2023 jMonkeyEngine - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'jMonkeyEngine' nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jme3.scene.plugins.gltf; - -/** - * Adapter for converting GLTF emissive strength to JME emissive intensity. - * - * @author codex - * - * @deprecated This will be removed in a future version of the engine. To migrate, - * create a custom {@link GltfMaterialFactory} and register it with the {@link GltfLoader}. - */ -@Deprecated -public class PBREmissiveStrengthMaterialAdapter extends PBRMaterialAdapter { - - public PBREmissiveStrengthMaterialAdapter() { - super(); - addParamMapping("emissiveStrength", "EmissiveIntensity"); - } - -} From ccec70ac41e60a04cbe4226e130cca542b73fea8 Mon Sep 17 00:00:00 2001 From: theMinka Date: Fri, 15 May 2026 17:32:17 +0200 Subject: [PATCH 14/14] Added material parameter tests to GltfLoaderTest --- .../scene/plugins/gltf/GltfLoaderTest.java | 279 +++++++++- .../src/test/resources/gltf/ColorTexture.png | Bin 0 -> 530 bytes .../test/resources/gltf/EmissiveTexture.png | Bin 0 -> 530 bytes .../test/resources/gltf/MaterialTestCubes.bin | Bin 0 -> 3720 bytes .../resources/gltf/MaterialTestCubes.gltf | 523 ++++++++++++++++++ .../resources/gltf/MaterialTextCubes.blend | Bin 0 -> 943925 bytes .../MetallicRoughnessOcclusionTexture.png | Bin 0 -> 530 bytes .../src/test/resources/gltf/NormalTexture.png | Bin 0 -> 530 bytes 8 files changed, 801 insertions(+), 1 deletion(-) create mode 100644 jme3-plugins/src/test/resources/gltf/ColorTexture.png create mode 100644 jme3-plugins/src/test/resources/gltf/EmissiveTexture.png create mode 100644 jme3-plugins/src/test/resources/gltf/MaterialTestCubes.bin create mode 100644 jme3-plugins/src/test/resources/gltf/MaterialTestCubes.gltf create mode 100644 jme3-plugins/src/test/resources/gltf/MaterialTextCubes.blend create mode 100644 jme3-plugins/src/test/resources/gltf/MetallicRoughnessOcclusionTexture.png create mode 100644 jme3-plugins/src/test/resources/gltf/NormalTexture.png diff --git a/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java b/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java index d2662b9ec0..d485ec2f31 100644 --- a/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java +++ b/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java @@ -37,7 +37,12 @@ import com.jme3.light.Light; import com.jme3.light.PointLight; import com.jme3.light.SpotLight; +import com.jme3.material.MatParam; +import com.jme3.material.MatParamTexture; +import com.jme3.material.Material; +import com.jme3.material.RenderState; import com.jme3.material.plugin.TestMaterialWrite; +import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; @@ -196,4 +201,276 @@ private void dumpScene(Spatial s, int indent) { } } } -} \ No newline at end of file + + @Test + public void testPBRMaterialNoTextures() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry pbrNoTexturesCube = (Geometry) sceneNode.getChild("pbrNoTexturesCube_0"); + Material pbrMaterial = pbrNoTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(pbrMaterial, "PBR Lighting", "pbrNoTexturesMaterial"); + + assertMaterialParam(pbrMaterial, "BaseColor", new ColorRGBA(0.9f, 0.6f, 0.3f, 0f)); + assertMaterialParam(pbrMaterial, "BaseColorMap", null); + assertMaterialParam(pbrMaterial, "Metallic", 0.4f); + assertMaterialParam(pbrMaterial, "Roughness", 0.6f); + assertMaterialParam(pbrMaterial, "MetallicRoughnessMap", null); + + assertMaterialParam(pbrMaterial, "NormalMap", null); + assertMaterialParam(pbrMaterial, "NormalScale", null); + assertMaterialParam(pbrMaterial, "NormalType", -1f); + + assertMaterialParam(pbrMaterial, "LightMapAsAOMap", null); + assertMaterialParam(pbrMaterial, "LightMap", null); + assertMaterialParam(pbrMaterial, "AoStrength", null); + assertMaterialParam(pbrMaterial, "AoPackedInMRMap", null); + + assertMaterialParam(pbrMaterial, "EmissiveMap", null); + assertMaterialParam(pbrMaterial, "Emissive", new ColorRGBA(0.2f, 0.6f, 1.f, 1f)); + assertMaterialParam(pbrMaterial, "EmissiveIntensity", 2.7f); + + assertMaterialParam(pbrMaterial, "AlphaDiscardThreshold", 0.5f); + Assertions.assertEquals(RenderState.BlendMode.Off, pbrMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Off, pbrMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(pbrMaterial, "UseVertexColor", true); + } + + @Test + public void testPBRMaterialWithTextures() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry pbrWithTexturesCube = (Geometry) sceneNode.getChild("pbrWithTexturesCube_0"); + Material pbrMaterial = pbrWithTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(pbrMaterial, "PBR Lighting", "pbrWithTexturesMaterial"); + + assertMaterialParam(pbrMaterial, "BaseColor", ColorRGBA.White); + assertMaterialParam(pbrMaterial, "BaseColorMap", "gltf/ColorTexture.png"); + assertMaterialParam(pbrMaterial, "Metallic", 1f); + assertMaterialParam(pbrMaterial, "Roughness", 1f); + assertMaterialParam(pbrMaterial, "MetallicRoughnessMap", "gltf/MetallicRoughnessOcclusionTexture.png"); + + assertMaterialParam(pbrMaterial, "NormalMap", "gltf/NormalTexture.png"); + assertMaterialParam(pbrMaterial, "NormalScale", 1.8f); + assertMaterialParam(pbrMaterial, "NormalType", 1f); + + assertMaterialParam(pbrMaterial, "LightMapAsAOMap", true); + assertMaterialParam(pbrMaterial, "LightMap", "gltf/MetallicRoughnessOcclusionTexture.png"); + assertMaterialParam(pbrMaterial, "AoStrength", null); + assertMaterialParam(pbrMaterial, "AoPackedInMRMap", true); + + assertMaterialParam(pbrMaterial, "EmissiveMap", "gltf/EmissiveTexture.png"); + assertMaterialParam(pbrMaterial, "Emissive", ColorRGBA.White); + assertMaterialParam(pbrMaterial, "EmissiveIntensity", 2.7f); + + assertMaterialParam(pbrMaterial, "AlphaDiscardThreshold", null); + Assertions.assertEquals(RenderState.BlendMode.Alpha, pbrMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Back, pbrMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(pbrMaterial, "UseVertexColor", false); + } + + @Test + public void testUnlitMaterialNoTextures() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry unlitNoTexturesCube = (Geometry) sceneNode.getChild("unlitNoTexturesCube_0"); + Material unlitMaterial = unlitNoTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(unlitMaterial, "Unshaded", "unlitNoTexturesMaterial"); + + assertMaterialParam(unlitMaterial, "Color", new ColorRGBA(0.2f, 0.4f, 0.6f, 0f)); + assertMaterialParam(unlitMaterial, "ColorMap", null); + + assertMaterialParam(unlitMaterial, "GlowMap", null); + assertMaterialParam(unlitMaterial, "GlowColor", ColorRGBA.Black); + + assertMaterialParam(unlitMaterial, "AlphaDiscardThreshold", 0.5f); + Assertions.assertEquals(RenderState.BlendMode.Off, unlitMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Off, unlitMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(unlitMaterial, "VertexColor", true); + } + + @Test + public void testUnlitMaterialWithTextures() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry unlitWithTexturesCube = (Geometry) sceneNode.getChild("unlitWithTexturesCube_0"); + Material unlitMaterial = unlitWithTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(unlitMaterial, "Unshaded", "unlitWithTexturesMaterial"); + + assertMaterialParam(unlitMaterial, "Color", ColorRGBA.White); + assertMaterialParam(unlitMaterial, "ColorMap", "gltf/ColorTexture.png"); + + assertMaterialParam(unlitMaterial, "GlowMap", null); + assertMaterialParam(unlitMaterial, "GlowColor", ColorRGBA.Black); + + assertMaterialParam(unlitMaterial, "AlphaDiscardThreshold", null); + Assertions.assertEquals(RenderState.BlendMode.Alpha, unlitMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Back, unlitMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(unlitMaterial, "VertexColor", false); + } + + @Test + public void testPBRMaterialNoTextures_LegacyMechanism() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + gltfModelKey.setMaterialAdaptersEnabled(true); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry pbrNoTexturesCube = (Geometry) sceneNode.getChild("pbrNoTexturesCube_0"); + Material pbrMaterial = pbrNoTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(pbrMaterial, "PBR Lighting", "pbrNoTexturesMaterial"); + + assertMaterialParam(pbrMaterial, "BaseColor", new ColorRGBA(0.9f, 0.6f, 0.3f, 0f)); + assertMaterialParam(pbrMaterial, "BaseColorMap", null); + assertMaterialParam(pbrMaterial, "Metallic", 0.4f); + assertMaterialParam(pbrMaterial, "Roughness", 0.6f); + assertMaterialParam(pbrMaterial, "MetallicRoughnessMap", null); + + assertMaterialParam(pbrMaterial, "NormalMap", null); + assertMaterialParam(pbrMaterial, "NormalScale", null); + assertMaterialParam(pbrMaterial, "NormalType", -1f); + + assertMaterialParam(pbrMaterial, "LightMapAsAOMap", null); + assertMaterialParam(pbrMaterial, "LightMap", null); + assertMaterialParam(pbrMaterial, "AoStrength", null); + assertMaterialParam(pbrMaterial, "AoPackedInMRMap", null); + + assertMaterialParam(pbrMaterial, "EmissiveMap", null); + assertMaterialParam(pbrMaterial, "Emissive", new ColorRGBA(0.2f, 0.6f, 1.f, 1f)); + assertMaterialParam(pbrMaterial, "EmissiveIntensity", 2.7f); + + assertMaterialParam(pbrMaterial, "AlphaDiscardThreshold", 0.5f); + Assertions.assertEquals(RenderState.BlendMode.Off, pbrMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Off, pbrMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(pbrMaterial, "UseVertexColor", true); + } + + @Test + public void testPBRMaterialWithTextures_LegacyMechanism() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + gltfModelKey.setMaterialAdaptersEnabled(true); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry pbrWithTexturesCube = (Geometry) sceneNode.getChild("pbrWithTexturesCube_0"); + Material pbrMaterial = pbrWithTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(pbrMaterial, "PBR Lighting", "pbrWithTexturesMaterial"); + + assertMaterialParam(pbrMaterial, "BaseColor", ColorRGBA.White); + assertMaterialParam(pbrMaterial, "BaseColorMap", "gltf/ColorTexture.png"); + assertMaterialParam(pbrMaterial, "Metallic", 1f); + assertMaterialParam(pbrMaterial, "Roughness", 1f); + assertMaterialParam(pbrMaterial, "MetallicRoughnessMap", "gltf/MetallicRoughnessOcclusionTexture.png"); + + assertMaterialParam(pbrMaterial, "NormalMap", "gltf/NormalTexture.png"); + assertMaterialParam(pbrMaterial, "NormalScale", 1.8f); + assertMaterialParam(pbrMaterial, "NormalType", 1f); + + // Differences to new material system: + // - LightMap is not set to occlusion texture + // - LightMapAsAOMap is not set + assertMaterialParam(pbrMaterial, "LightMapAsAOMap", null); + assertMaterialParam(pbrMaterial, "LightMap", null); + assertMaterialParam(pbrMaterial, "AoStrength", null); + assertMaterialParam(pbrMaterial, "AoPackedInMRMap", true); + + assertMaterialParam(pbrMaterial, "EmissiveMap", "gltf/EmissiveTexture.png"); + assertMaterialParam(pbrMaterial, "Emissive", ColorRGBA.White); + assertMaterialParam(pbrMaterial, "EmissiveIntensity", 2.7f); + + assertMaterialParam(pbrMaterial, "AlphaDiscardThreshold", null); + Assertions.assertEquals(RenderState.BlendMode.Alpha, pbrMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Back, pbrMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(pbrMaterial, "UseVertexColor", false); + } + + @Test + public void testUnlitMaterialNoTextures_LegacyMechanism() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + gltfModelKey.setMaterialAdaptersEnabled(true); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry unlitNoTexturesCube = (Geometry) sceneNode.getChild("unlitNoTexturesCube_0"); + Material unlitMaterial = unlitNoTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(unlitMaterial, "Unshaded", "unlitNoTexturesMaterial"); + + assertMaterialParam(unlitMaterial, "Color", new ColorRGBA(0.2f, 0.4f, 0.6f, 0f)); + assertMaterialParam(unlitMaterial, "ColorMap", null); + + assertMaterialParam(unlitMaterial, "GlowMap", null); + assertMaterialParam(unlitMaterial, "GlowColor", ColorRGBA.Black); + + // Differences to new material system: + // - UnlitMaterialAdapter translates alphaMode=MASK to BlendMode.Alpha + // - AlphaDiscardThreshold is also not set + assertMaterialParam(unlitMaterial, "AlphaDiscardThreshold", null); + Assertions.assertEquals(RenderState.BlendMode.Alpha, unlitMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Off, unlitMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(unlitMaterial, "VertexColor", true); + } + + @Test + public void testUnlitMaterialWithTextures_LegacyMechanism() { + GltfModelKey gltfModelKey = new GltfModelKey("gltf/MaterialTestCubes.gltf"); + gltfModelKey.setMaterialAdaptersEnabled(true); + Node sceneNode = (Node) assetManager.loadModel(gltfModelKey); + + Geometry unlitWithTexturesCube = (Geometry) sceneNode.getChild("unlitWithTexturesCube_0"); + Material unlitMaterial = unlitWithTexturesCube.getMaterial(); + + assertMaterialNameAndDefinition(unlitMaterial, "Unshaded", "unlitWithTexturesMaterial"); + + assertMaterialParam(unlitMaterial, "Color", ColorRGBA.White); + assertMaterialParam(unlitMaterial, "ColorMap", "gltf/ColorTexture.png"); + + assertMaterialParam(unlitMaterial, "GlowMap", null); + assertMaterialParam(unlitMaterial, "GlowColor", ColorRGBA.Black); + + assertMaterialParam(unlitMaterial, "AlphaDiscardThreshold", null); + Assertions.assertEquals(RenderState.BlendMode.Alpha, unlitMaterial.getAdditionalRenderState().getBlendMode()); + Assertions.assertEquals(RenderState.FaceCullMode.Back, unlitMaterial.getAdditionalRenderState().getFaceCullMode()); + + assertMaterialParam(unlitMaterial, "VertexColor", false); + } + + private void assertMaterialNameAndDefinition(Material material, String expectedDefinitionName, String expectedMaterialName) { + Assertions.assertEquals(expectedMaterialName, material.getName(), "Wrong material name."); + Assertions.assertEquals(expectedDefinitionName, material.getMaterialDef().getName(), "Wrong material definition."); + } + + private void assertMaterialParam(Material material, String paramName, Object expectedValue) { + MatParam matParam = material.getParam(paramName); + if (expectedValue == null) { + Assertions.assertNull(matParam, () -> "Material parameter '" + paramName + "' should not be set."); + return; + + } else { + Assertions.assertNotNull(matParam, () -> "Missing material parameter '" + paramName + "'."); + } + + if (matParam instanceof MatParamTexture) { + String imageName = ((MatParamTexture) matParam).getTextureValue().getName(); + Assertions.assertEquals(expectedValue, imageName, () -> "Wrong value of texture parameter '" + paramName + "'."); + + } else { + Object value = matParam.getValue(); + Assertions.assertEquals(expectedValue, value, () -> "Wrong value of material parameter '" + paramName + "'."); + } + } + +} diff --git a/jme3-plugins/src/test/resources/gltf/ColorTexture.png b/jme3-plugins/src/test/resources/gltf/ColorTexture.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6f42a6b200f2983d8cce87d07383c7f217d9a5 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^DImM)dUR) b0i6@f`N_YzA}0f&|Vmv|V=MYLYxq5ar=$z%1d%J*o*B b5C@xV+zvC(Znl5y1&S6=S3j3^P6|R82=n={7y(Ta7 z5+{dlj_Bg}tjRIE2hY`C4A;=f=X7Bo?TcM_y|s7t#_s)jZ{O^PeYIPE-r8sTWUuVT zpEvg1UfZQz`}5k~+ns&zfp=b4Ui`*Vr!zgiGFyFG&DiQS1Hacx14q655vIBy&4I^W z9PISV*>g_ru{f(W7FIQ7gf-h_!uy)n&5Y&*Py1`;C=;;Bq{6h1?i^)0b9Q)M5xJ-6 z5y^3nBQEz^_j`rp_Fj{hd5M!pH%D}FeAeWc-Gk@qFNSOA9A!Flc6eS9xnJlJ$#MT8F85LQa)spfUXz!3iIYb+M|5#~*5sJogXiimhHL2L zbDCdxJzgG;4^Q(P@o;>+{QG;JBgUL~%!$j7C_iG%iN~CHIXlkp`PbqSbxxLrqWnSXs(ajNE9G^8gX7}K^`itQj kI{BCXf6#Xp@z2%IUx(v7M~pe~m=l*DQGUdj6OTFZ|M0|StN;K2 literal 0 HcmV?d00001 diff --git a/jme3-plugins/src/test/resources/gltf/MaterialTestCubes.gltf b/jme3-plugins/src/test/resources/gltf/MaterialTestCubes.gltf new file mode 100644 index 0000000000..4000b4dca3 --- /dev/null +++ b/jme3-plugins/src/test/resources/gltf/MaterialTestCubes.gltf @@ -0,0 +1,523 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.3.47", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_emissive_strength", + "KHR_materials_unlit" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0, + 1, + 2, + 3 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"pbrWithTexturesCube", + "translation":[ + -2, + 0, + 0 + ] + }, + { + "mesh":1, + "name":"unlitWithTexturesCube", + "translation":[ + 2, + 0, + 0 + ] + }, + { + "mesh":2, + "name":"pbrNoTexturesCube", + "translation":[ + -2, + 0, + 3 + ] + }, + { + "mesh":3, + "name":"unlitNoTexturesCube", + "translation":[ + 2, + 0, + 3 + ] + } + ], + "materials":[ + { + "alphaMode":"BLEND", + "emissiveFactor":[ + 1, + 1, + 1 + ], + "emissiveTexture":{ + "index":0 + }, + "extensions":{ + "KHR_materials_emissive_strength":{ + "emissiveStrength":2.700000047683716 + } + }, + "name":"pbrWithTexturesMaterial", + "normalTexture":{ + "index":1, + "scale":1.7999999523162842 + }, + "occlusionTexture":{ + "index":2 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "extensions":{ + "KHR_materials_unlit":{} + }, + "name":"unlitWithTexturesMaterial", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "roughnessFactor":0.9 + } + }, + { + "alphaMode":"MASK", + "doubleSided":true, + "emissiveFactor":[ + 0.20000000298023224, + 0.6000000238418579, + 1 + ], + "extensions":{ + "KHR_materials_emissive_strength":{ + "emissiveStrength":2.700000047683716 + } + }, + "name":"pbrNoTexturesMaterial", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.8999999761581421, + 0.6000000238418579, + 0.30000001192092896, + 0 + ], + "metallicFactor":0.4000000059604645, + "roughnessFactor":0.6000000238418579 + } + }, + { + "alphaMode":"MASK", + "doubleSided":true, + "extensions":{ + "KHR_materials_unlit":{} + }, + "name":"unlitNoTexturesMaterial", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.20000000298023224, + 0.4000000059604645, + 0.6000000238418579, + 0 + ], + "metallicFactor":0, + "roughnessFactor":0.9 + } + } + ], + "meshes":[ + { + "name":"pbrWithTexturesCube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + }, + { + "name":"unlitWithTexturesCube", + "primitives":[ + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":3, + "material":1 + } + ] + }, + { + "name":"pbrNoTexturesCube", + "primitives":[ + { + "attributes":{ + "POSITION":7, + "NORMAL":8, + "TEXCOORD_0":9, + "COLOR_0":10, + "COLOR_1":11 + }, + "indices":3, + "material":2 + } + ] + }, + { + "name":"unlitNoTexturesCube", + "primitives":[ + { + "attributes":{ + "POSITION":12, + "NORMAL":13, + "TEXCOORD_0":14, + "COLOR_0":15, + "COLOR_1":16 + }, + "indices":3, + "material":3 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":3 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"EmissiveTexture", + "uri":"EmissiveTexture.png" + }, + { + "mimeType":"image/png", + "name":"NormalTexture", + "uri":"NormalTexture.png" + }, + { + "mimeType":"image/png", + "name":"MetallicRoughnessOcclusionTexture", + "uri":"MetallicRoughnessOcclusionTexture.png" + }, + { + "mimeType":"image/png", + "name":"ColorTexture", + "uri":"ColorTexture.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":8, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":10, + "componentType":5121, + "count":24, + "normalized":true, + "type":"VEC4" + }, + { + "bufferView":11, + "componentType":5123, + "count":24, + "normalized":true, + "type":"VEC4" + }, + { + "bufferView":12, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":13, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":14, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":15, + "componentType":5121, + "count":24, + "normalized":true, + "type":"VEC4" + }, + { + "bufferView":16, + "componentType":5123, + "count":24, + "normalized":true, + "type":"VEC4" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":840, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1416, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1608, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1896, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":2184, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":2376, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":2472, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":2664, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":2952, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":3240, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":3432, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":3528, + "target":34962 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987, + "wrapS":33071, + "wrapT":33071 + } + ], + "buffers":[ + { + "byteLength":3720, + "uri":"MaterialTestCubes.bin" + } + ] +} diff --git a/jme3-plugins/src/test/resources/gltf/MaterialTextCubes.blend b/jme3-plugins/src/test/resources/gltf/MaterialTextCubes.blend new file mode 100644 index 0000000000000000000000000000000000000000..ee16d8624e04fac30a27136a701619718d016f15 GIT binary patch literal 943925 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

u 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

3e_Xcym6#46FERu45i3cqNyg8o< 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 bVuJ$z9WmzJmo_bz1x1UetDnm{r-UW|zO|Hq literal 0 HcmV?d00001 diff --git a/jme3-plugins/src/test/resources/gltf/NormalTexture.png b/jme3-plugins/src/test/resources/gltf/NormalTexture.png new file mode 100644 index 0000000000000000000000000000000000000000..fea5cc1a4828d367c6859e93c9973358d9a7dde8 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^DIm