Преглед на файлове

* Introduce Image.isNPOT() which is now used to check if the image is non-power-of-2 in renderer implementations.

shadowislord преди 11 години
родител
ревизия
81498d6f79

+ 8 - 12
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);
 

+ 12 - 0
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;

+ 8 - 12
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);
 

+ 3 - 9
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()) {

+ 5 - 10
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);
             }
         }
 

+ 3 - 9
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()) {

+ 5 - 10
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);
             }
         }