From 6cb4ac0e38bc7bf5a42ddc4c99c1c19c311e2de7 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Mon, 23 Oct 2023 20:53:33 +0300 Subject: [PATCH 1/6] Cache the materials --- .../com/jme3/scene/plugins/gltf/GltfLoader.java | 17 ++++++++++++++++- 1 file changed, 16 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 6db0fd4ce2..20203e8bb5 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 @@ -470,7 +470,7 @@ public Geometry[] readMeshPrimitives(int meshIndex) throws IOException { geom.setMaterial(defaultMat); } else { useNormalsFlag = false; - geom.setMaterial(readMaterial(materialIndex)); + geom.setMaterial(getMaterial(materialIndex)); if (geom.getMaterial().getAdditionalRenderState().getBlendMode() == RenderState.BlendMode.Alpha) { // Alpha blending is enabled for this material. Let's place the geom in the transparent bucket. @@ -616,6 +616,21 @@ protected byte[] getBytes(int bufferIndex, String uri, Integer bufferLength) thr return data; } + public Material getMaterial(int materialIndex) throws IOException { + + // Get from cache + Material material = fetchFromCache("Material", materialIndex, Material.class); + if (material != null) { + return material; + } + + material = readMaterial(materialIndex); + + addToCache("Material", materialIndex, material, materials.size()); + + return material; + } + public Material readMaterial(int materialIndex) throws IOException { assertNotNull(materials, "There is no material defined yet a mesh references one"); From a7227c00c84facfeb83af696f78a97c8c9537e75 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Mon, 23 Oct 2023 20:54:04 +0300 Subject: [PATCH 2/6] Try with resources to make sure we close the stream --- .../gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 6 +++--- 1 file changed, 3 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 20203e8bb5..4106ddc736 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 @@ -605,9 +605,9 @@ protected byte[] getBytes(int bufferIndex, String uri, Integer bufferLength) thr BinDataKey key = new BinDataKey(info.getKey().getFolder() + decoded); InputStream input = (InputStream) info.getManager().loadAsset(key); data = new byte[bufferLength]; - DataInputStream dataStream = new DataInputStream(input); - dataStream.readFully(data); - dataStream.close(); + try (DataInputStream dataStream = new DataInputStream(input)) { + dataStream.readFully(data); + } } } else { // no URI, this should not happen in a gltf file, only in glb files. From 0244deee1178a16c7ac04807db41cc4f23050f60 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Mon, 23 Oct 2023 21:12:01 +0300 Subject: [PATCH 3/6] Conform cache naming to the other cache usages --- .../src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 4106ddc736..e93bd40d71 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 @@ -619,14 +619,14 @@ protected byte[] getBytes(int bufferIndex, String uri, Integer bufferLength) thr public Material getMaterial(int materialIndex) throws IOException { // Get from cache - Material material = fetchFromCache("Material", materialIndex, Material.class); + Material material = fetchFromCache("materials", materialIndex, Material.class); if (material != null) { return material; } material = readMaterial(materialIndex); - addToCache("Material", materialIndex, material, materials.size()); + addToCache("materials", materialIndex, material, materials.size()); return material; } From cc1d57d6bd1050c47281f6932a212d684d521959 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Mon, 23 Oct 2023 21:28:50 +0300 Subject: [PATCH 4/6] Just use the cache in the read method as the other caches do --- .../jme3/scene/plugins/gltf/GltfLoader.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 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 e93bd40d71..56402d8b0d 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 @@ -470,7 +470,7 @@ public Geometry[] readMeshPrimitives(int meshIndex) throws IOException { geom.setMaterial(defaultMat); } else { useNormalsFlag = false; - geom.setMaterial(getMaterial(materialIndex)); + geom.setMaterial(readMaterial(materialIndex)); if (geom.getMaterial().getAdditionalRenderState().getBlendMode() == RenderState.BlendMode.Alpha) { // Alpha blending is enabled for this material. Let's place the geom in the transparent bucket. @@ -616,24 +616,14 @@ protected byte[] getBytes(int bufferIndex, String uri, Integer bufferLength) thr return data; } - public Material getMaterial(int materialIndex) throws IOException { + public Material readMaterial(int materialIndex) throws IOException { + assertNotNull(materials, "There is no material defined yet a mesh references one"); - // Get from cache Material material = fetchFromCache("materials", materialIndex, Material.class); if (material != null) { return material; } - material = readMaterial(materialIndex); - - addToCache("materials", materialIndex, material, materials.size()); - - return material; - } - - public Material readMaterial(int materialIndex) throws IOException { - assertNotNull(materials, "There is no material defined yet a mesh references one"); - JsonObject matData = materials.get(materialIndex).getAsJsonObject(); JsonObject pbrMat = matData.getAsJsonObject("pbrMetallicRoughness"); @@ -703,7 +693,10 @@ public Material readMaterial(int materialIndex) throws IOException { adapter.setParam("emissiveTexture", readTexture(matData.getAsJsonObject("emissiveTexture"))); - return adapter.getMaterial(); + material = adapter.getMaterial(); + addToCache("materials", materialIndex, material, materials.size()); + + return material; } public void readCameras() throws IOException { From 47ab89b4c0b30cac76e0fc558d1d8d037b21946f Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Mon, 23 Oct 2023 22:03:45 +0300 Subject: [PATCH 5/6] Clone the material --- .../src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java | 2 +- 1 file changed, 1 insertion(+), 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 56402d8b0d..7c6bb0e847 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 @@ -621,7 +621,7 @@ public Material readMaterial(int materialIndex) throws IOException { Material material = fetchFromCache("materials", materialIndex, Material.class); if (material != null) { - return material; + return material.clone(); } JsonObject matData = materials.get(materialIndex).getAsJsonObject(); From efe77d4ed5967f47867eb6dc8029bfdaad383b46 Mon Sep 17 00:00:00 2001 From: Toni Helenius Date: Tue, 24 Oct 2023 19:32:39 +0300 Subject: [PATCH 6/6] Cache textures locally to avoid embedded textures to be read many times --- .../java/com/jme3/scene/plugins/gltf/GltfLoader.java | 9 ++++++++- 1 file changed, 8 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 7c6bb0e847..12b477bd87 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 @@ -754,12 +754,17 @@ public Texture2D readTexture(JsonObject texture, boolean flip) throws IOExceptio Integer textureIndex = getAsInteger(texture, "index"); assertNotNull(textureIndex, "Texture has no index"); assertNotNull(textures, "There are no textures, yet one is referenced by a material"); + + Texture2D texture2d = fetchFromCache("textures", textureIndex, Texture2D.class); + if (texture2d != null) { + return texture2d; + } JsonObject textureData = textures.get(textureIndex).getAsJsonObject(); Integer sourceIndex = getAsInteger(textureData, "source"); Integer samplerIndex = getAsInteger(textureData, "sampler"); - Texture2D texture2d = readImage(sourceIndex, flip); + texture2d = readImage(sourceIndex, flip); if (samplerIndex != null) { texture2d = readSampler(samplerIndex, texture2d); @@ -769,6 +774,8 @@ public Texture2D readTexture(JsonObject texture, boolean flip) throws IOExceptio texture2d = customContentManager.readExtensionAndExtras("texture", texture, texture2d); + addToCache("textures", textureIndex, texture2d, textures.size()); + return texture2d; }