From 28f509d9f48d165bb38e956eb8a8805c405115c4 Mon Sep 17 00:00:00 2001 From: joliver82 <39382046+joliver82@users.noreply.github.com> Date: Thu, 17 May 2018 23:07:23 +0200 Subject: [PATCH 1/4] Update GLImageFormats.java --- .../src/main/java/com/jme3/renderer/opengl/GLImageFormats.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java index 21070227b1..fb46b0805e 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java @@ -220,7 +220,7 @@ public static GLImageFormat[][] getFormatsForCaps(EnumSet caps) { // NOTE: OpenGL ES 2.0 does not support DEPTH_COMPONENT as internal format -- fallback to 16-bit depth. if (caps.contains(Caps.OpenGLES20)) { - format(formatToGL, Format.Depth, GL.GL_DEPTH_COMPONENT16, GL.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_BYTE); + format(formatToGL, Format.Depth, GL.GL_DEPTH_COMPONENT16, GL.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_SHORT); } else { format(formatToGL, Format.Depth, GL.GL_DEPTH_COMPONENT, GL.GL_DEPTH_COMPONENT, GL.GL_UNSIGNED_BYTE); } From 7026362605cf8f173f0c0749eb106cd8b2c5a95b Mon Sep 17 00:00:00 2001 From: v1r7ua1 Date: Thu, 19 Dec 2019 02:57:15 +0100 Subject: [PATCH 2/4] First implementation to solve the glTexSubImage issue --- .../com/jme3/renderer/opengl/GLRenderer.java | 6 +++ .../src/main/java/com/jme3/texture/Image.java | 52 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index d20c78b309..4b4f859152 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -2549,6 +2549,9 @@ public void setTexture(int unit, Texture tex) { @Deprecated public void modifyTexture(Texture tex, Image pixels, int x, int y) { setTexture(0, tex); + if(caps.contains(Caps.OpenGLES20)) { + pixels.convertToFormat(tex.getImage().getFormat()); + } int target = convertTextureType(tex.getType(), pixels.getMultiSamples(), -1); texUtil.uploadSubTexture(target,pixels, 0, x, y,0,0,pixels.getWidth(),pixels.getHeight(), linearizeSrgbImages); } @@ -2566,6 +2569,9 @@ public void modifyTexture(Texture tex, Image pixels, int x, int y) { */ public void modifyTexture(Texture2D dest, Image src, int destX, int destY, int srcX, int srcY, int areaW, int areaH) { setTexture(0, dest); + if(caps.contains(Caps.OpenGLES20)) { + src.convertToFormat(dest.getImage().getFormat()); + } int target = convertTextureType(dest.getType(), src.getMultiSamples(), -1); texUtil.uploadSubTexture(target, src, 0, destX, destY, srcX, srcY, areaW, areaH, linearizeSrgbImages); } diff --git a/jme3-core/src/main/java/com/jme3/texture/Image.java b/jme3-core/src/main/java/com/jme3/texture/Image.java index f7cee1b55e..c46383c05d 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -1167,6 +1167,58 @@ public ColorSpace getColorSpace() { return colorSpace; } + /** + * Modifies current image creating a new bytebuffer to the selected format if possible. + * This method is only usefull and used when uploading sub image to currently existing + * textures in GLES renderers + * + * Currently only rgb8 to rgba8 and back (most found use cases) + * + * @param fmt @see Format. Desired format to convert the image. + * + * @return True, if the image could be converted to the desired format, false otherwise. + * + */ + public boolean convertToFormat(Format fmt) { + if(fmt==Format.RGB8) { + if(getFormat()==Format.RGBA8) { + ByteBuffer d=data.get(0); + ByteBuffer new_data=BufferUtils.createByteBuffer(getHeight()*getWidth()*4); + d.rewind(); + + for(int i=0; i Date: Thu, 19 Dec 2019 03:09:32 +0100 Subject: [PATCH 3/4] Setting proper format to the image --- jme3-core/src/main/java/com/jme3/texture/Image.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/texture/Image.java b/jme3-core/src/main/java/com/jme3/texture/Image.java index c46383c05d..a96c3c9815 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -1192,6 +1192,7 @@ public boolean convertToFormat(Format fmt) { new_data.put(d.get()); d.get(); //ignore alpha } + format=fmt; setData(0, new_data); BufferUtils.destroyDirectBuffer(d); return true; @@ -1210,6 +1211,7 @@ public boolean convertToFormat(Format fmt) { new_data.put(d.get()); new_data.put((byte)255); //just add alpha=1 } + format=fmt; setData(0, new_data); BufferUtils.destroyDirectBuffer(d); return true; From b18586f230fd2ea26dfd7b8396f858affba5cd05 Mon Sep 17 00:00:00 2001 From: joliver82 Date: Fri, 20 Dec 2019 14:44:15 +0100 Subject: [PATCH 4/4] Removed the Image.convertToFormat method and its usage from GLRenderer.modifyTexture. Added a warning instead for the potential failing cases Fixing the issue in JmeBatchRenderBackend.loadImage transforming it to RGBA8 if required --- .../com/jme3/renderer/opengl/GLRenderer.java | 8 +-- .../src/main/java/com/jme3/texture/Image.java | 54 ------------------- .../jme3/niftygui/JmeBatchRenderBackend.java | 28 ++++++++++ 3 files changed, 32 insertions(+), 58 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 4b4f859152..5c3f4eb125 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -2549,8 +2549,8 @@ public void setTexture(int unit, Texture tex) { @Deprecated public void modifyTexture(Texture tex, Image pixels, int x, int y) { setTexture(0, tex); - if(caps.contains(Caps.OpenGLES20)) { - pixels.convertToFormat(tex.getImage().getFormat()); + if(caps.contains(Caps.OpenGLES20) && pixels.getFormat()!=tex.getImage().getFormat() ) { + logger.log(Level.WARNING, "Incompatible texture subimage"); } int target = convertTextureType(tex.getType(), pixels.getMultiSamples(), -1); texUtil.uploadSubTexture(target,pixels, 0, x, y,0,0,pixels.getWidth(),pixels.getHeight(), linearizeSrgbImages); @@ -2569,8 +2569,8 @@ public void modifyTexture(Texture tex, Image pixels, int x, int y) { */ public void modifyTexture(Texture2D dest, Image src, int destX, int destY, int srcX, int srcY, int areaW, int areaH) { setTexture(0, dest); - if(caps.contains(Caps.OpenGLES20)) { - src.convertToFormat(dest.getImage().getFormat()); + if(caps.contains(Caps.OpenGLES20) && src.getFormat()!=dest.getImage().getFormat() ) { + logger.log(Level.WARNING, "Incompatible texture subimage"); } int target = convertTextureType(dest.getType(), src.getMultiSamples(), -1); texUtil.uploadSubTexture(target, src, 0, destX, destY, srcX, srcY, areaW, areaH, linearizeSrgbImages); diff --git a/jme3-core/src/main/java/com/jme3/texture/Image.java b/jme3-core/src/main/java/com/jme3/texture/Image.java index a96c3c9815..f7cee1b55e 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -1167,60 +1167,6 @@ public ColorSpace getColorSpace() { return colorSpace; } - /** - * Modifies current image creating a new bytebuffer to the selected format if possible. - * This method is only usefull and used when uploading sub image to currently existing - * textures in GLES renderers - * - * Currently only rgb8 to rgba8 and back (most found use cases) - * - * @param fmt @see Format. Desired format to convert the image. - * - * @return True, if the image could be converted to the desired format, false otherwise. - * - */ - public boolean convertToFormat(Format fmt) { - if(fmt==Format.RGB8) { - if(getFormat()==Format.RGBA8) { - ByteBuffer d=data.get(0); - ByteBuffer new_data=BufferUtils.createByteBuffer(getHeight()*getWidth()*4); - d.rewind(); - - for(int i=0; i