diff --git a/jme3-android/src/main/java/com/jme3/renderer/android/TextureUtil.java b/jme3-android/src/main/java/com/jme3/renderer/android/TextureUtil.java index aa55f30a6..db4ea5ad7 100644 --- a/jme3-android/src/main/java/com/jme3/renderer/android/TextureUtil.java +++ b/jme3-android/src/main/java/com/jme3/renderer/android/TextureUtil.java @@ -429,13 +429,11 @@ public class TextureUtil { int width = img.getWidth(); int height = img.getHeight(); - if (!NPOT) { + if (!NPOT && img.isNPOT()) { // Check if texture is POT - if (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height)) { - throw new RendererException("Non-power-of-2 textures " - + "are not supported by the video hardware " - + "and no scaling path available for image: " + img); - } + throw new RendererException("Non-power-of-2 textures " + + "are not supported by the video hardware " + + "and no scaling path available for image: " + img); } AndroidGLImageFormat imageFormat = getImageFormat(fmt); @@ -524,13 +522,11 @@ public class TextureUtil { int width = img.getWidth(); int height = img.getHeight(); - if (!NPOT) { + if (!NPOT && img.isNPOT()) { // Check if texture is POT - if (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height)) { - throw new RendererException("Non-power-of-2 textures " - + "are not supported by the video hardware " - + "and no scaling path available for image: " + img); - } + throw new RendererException("Non-power-of-2 textures " + + "are not supported by the video hardware " + + "and no scaling path available for image: " + img); } AndroidGLImageFormat imageFormat = getImageFormat(fmt); 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 6f7682aba..1d5939c8d 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -32,6 +32,7 @@ package com.jme3.texture; import com.jme3.export.*; +import com.jme3.math.FastMath; import com.jme3.renderer.Caps; import com.jme3.renderer.Renderer; import com.jme3.texture.image.ColorSpace; @@ -392,6 +393,17 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { return needGeneratedMips; } + /** + * Determine if the image is NPOT. + * + * @return if the image is a non-power-of-2 image, e.g. having dimensions + * that are not powers of 2. + */ + public boolean isNPOT() { + return width != 0 && height != 0 + && (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height)); + } + @Override public void resetObject() { this.id = -1; diff --git a/jme3-ios/src/main/java/com/jme3/renderer/ios/TextureUtil.java b/jme3-ios/src/main/java/com/jme3/renderer/ios/TextureUtil.java index 596df0ce4..3f4645147 100644 --- a/jme3-ios/src/main/java/com/jme3/renderer/ios/TextureUtil.java +++ b/jme3-ios/src/main/java/com/jme3/renderer/ios/TextureUtil.java @@ -443,13 +443,11 @@ public class TextureUtil { int width = img.getWidth(); int height = img.getHeight(); - if (!NPOT) { + if (!NPOT && img.isNPOT()) { // Check if texture is POT - if (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height)) { - throw new RendererException("Non-power-of-2 textures " - + "are not supported by the video hardware " - + "and no scaling path available for image: " + img); - } + throw new RendererException("Non-power-of-2 textures " + + "are not supported by the video hardware " + + "and no scaling path available for image: " + img); } IosGLImageFormat imageFormat = getImageFormat(fmt); @@ -543,13 +541,11 @@ public class TextureUtil { int width = img.getWidth(); int height = img.getHeight(); - if (!NPOT) { + if (!NPOT && img.isNPOT()) { // Check if texture is POT - if (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height)) { - throw new RendererException("Non-power-of-2 textures " - + "are not supported by the video hardware " - + "and no scaling path available for image: " + img); - } + throw new RendererException("Non-power-of-2 textures " + + "are not supported by the video hardware " + + "and no scaling path available for image: " + img); } IosGLImageFormat imageFormat = getImageFormat(fmt); diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL1Renderer.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL1Renderer.java index 491f6df21..22a4d3143 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL1Renderer.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL1Renderer.java @@ -806,15 +806,9 @@ public class JoglGL1Renderer implements GL1Renderer { } // Check sizes if graphics card doesn't support NPOT - if (!gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two")) { - if (img.getWidth() != 0 && img.getHeight() != 0) { - if (!FastMath.isPowerOfTwo(img.getWidth()) - || !FastMath.isPowerOfTwo(img.getHeight())) { - - // Resize texture to Power-of-2 size - MipMapGenerator.resizeToPowerOf2(img); - } - } + if (!gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two") && img.isNPOT()) { + // Resize texture to Power-of-2 size + MipMapGenerator.resizeToPowerOf2(img); } if (!img.hasMipmaps() && img.isGeneratedMipmapsRequired()) { diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java index 4e48ca409..363711033 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglRenderer.java @@ -1962,16 +1962,11 @@ public class JoglRenderer implements Renderer { } // Yes, some OpenGL2 cards (GeForce 5) still dont support NPOT. - if (!gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two")) { - if (img.getWidth() != 0 && img.getHeight() != 0) { - if (!FastMath.isPowerOfTwo(img.getWidth()) - || !FastMath.isPowerOfTwo(img.getHeight())) { - if (img.getData(0) == null) { - throw new RendererException("non-power-of-2 framebuffer textures are not supported by the video hardware"); - } else { - MipMapGenerator.resizeToPowerOf2(img); - } - } + if (!gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two") && img.isNPOT()) { + if (img.getData(0) == null) { + throw new RendererException("non-power-of-2 framebuffer textures are not supported by the video hardware"); + } else { + MipMapGenerator.resizeToPowerOf2(img); } } diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java index 54ff4fd8d..435687f42 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java @@ -753,15 +753,9 @@ public class LwjglGL1Renderer implements GL1Renderer { } // Check sizes if graphics card doesn't support NPOT - if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two) { - if (img.getWidth() != 0 && img.getHeight() != 0) { - if (!FastMath.isPowerOfTwo(img.getWidth()) - || !FastMath.isPowerOfTwo(img.getHeight())) { - - // Resize texture to Power-of-2 size - MipMapGenerator.resizeToPowerOf2(img); - } - } + if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two && img.isNPOT()) { + // Resize texture to Power-of-2 size + MipMapGenerator.resizeToPowerOf2(img); } if (!img.hasMipmaps() && img.isGeneratedMipmapsRequired()) { diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java index 1403112ce..b1c2df7ce 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglRenderer.java @@ -1870,16 +1870,11 @@ public class LwjglRenderer implements Renderer { } // Yes, some OpenGL2 cards (GeForce 5) still dont support NPOT. - if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two) { - if (img.getWidth() != 0 && img.getHeight() != 0) { - if (!FastMath.isPowerOfTwo(img.getWidth()) - || !FastMath.isPowerOfTwo(img.getHeight())) { - if (img.getData(0) == null) { - throw new RendererException("non-power-of-2 framebuffer textures are not supported by the video hardware"); - } else { - MipMapGenerator.resizeToPowerOf2(img); - } - } + if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two && img.isNPOT()) { + if (img.getData(0) == null) { + throw new RendererException("non-power-of-2 framebuffer textures are not supported by the video hardware"); + } else { + MipMapGenerator.resizeToPowerOf2(img); } }