aboutsummaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun/opengl/util/texture
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2007-04-21 02:12:03 +0000
committerKenneth Russel <[email protected]>2007-04-21 02:12:03 +0000
commit3827e79351d502be423eca5ee1ed23b45b1a0ab6 (patch)
tree8d659e8d407ca09ff9cf75ebac57e7f84615360b /src/classes/com/sun/opengl/util/texture
parentd22ef032e84a79f86683db1e2f829f403c4bb3e2 (diff)
Fixed Issue 296: TextureIO cube map support broken
Fixed code paths supporting cube maps. As a positive side-effect, the VertexProgRefract demo's cube map is now rendered completely correctly; inversion of the positive and negative Y images, and the negative Y scale factor on the texture matrix, are no longer needed, and the seams around the top image are gone. Fixed code relating to automatic mipmap generation in the presence of only GL_ARB_texture_rectangle and not GL_ARB_texture_non_power_of_two. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@1212 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/classes/com/sun/opengl/util/texture')
-rwxr-xr-xsrc/classes/com/sun/opengl/util/texture/Texture.java82
-rwxr-xr-xsrc/classes/com/sun/opengl/util/texture/TextureIO.java10
2 files changed, 56 insertions, 36 deletions
diff --git a/src/classes/com/sun/opengl/util/texture/Texture.java b/src/classes/com/sun/opengl/util/texture/Texture.java
index 85c2da52e..4339de6bf 100755
--- a/src/classes/com/sun/opengl/util/texture/Texture.java
+++ b/src/classes/com/sun/opengl/util/texture/Texture.java
@@ -386,13 +386,21 @@ public class Texture {
aspectRatio = (float) imgWidth / (float) imgHeight;
mustFlipVertically = data.getMustFlipVertically();
- int newTarget = 0;
+ int texTarget = 0;
+ int texParamTarget = this.target;
// See whether we have automatic mipmap generation support
boolean haveAutoMipmapGeneration =
(gl.isExtensionAvailable("GL_VERSION_1_4") ||
gl.isExtensionAvailable("GL_SGIS_generate_mipmap"));
+ // Note that automatic mipmap generation doesn't work for
+ // GL_ARB_texture_rectangle
+ if ((!isPowerOfTwo(imgWidth) || !isPowerOfTwo(imgHeight)) &&
+ !haveNPOT(gl)) {
+ haveAutoMipmapGeneration = false;
+ }
+
if (data.getMipmap() && !haveAutoMipmapGeneration) {
// GLU always scales the texture's dimensions to be powers of
// two. It also doesn't really matter exactly what the texture
@@ -402,7 +410,7 @@ public class Texture {
imgHeight = nextPowerOfTwo(imgHeight);
texWidth = imgWidth;
texHeight = imgHeight;
- newTarget = GL.GL_TEXTURE_2D;
+ texTarget = GL.GL_TEXTURE_2D;
} else if ((isPowerOfTwo(imgWidth) && isPowerOfTwo(imgHeight)) ||
haveNPOT(gl)) {
if (DEBUG) {
@@ -415,7 +423,7 @@ public class Texture {
texWidth = imgWidth;
texHeight = imgHeight;
- newTarget = GL.GL_TEXTURE_2D;
+ texTarget = GL.GL_TEXTURE_2D;
} else if (haveTexRect(gl)) {
if (DEBUG) {
System.err.println("Using GL_ARB_texture_rectangle");
@@ -423,7 +431,7 @@ public class Texture {
texWidth = imgWidth;
texHeight = imgHeight;
- newTarget = GL.GL_TEXTURE_RECTANGLE_ARB;
+ texTarget = GL.GL_TEXTURE_RECTANGLE_ARB;
} else {
if (DEBUG) {
System.err.println("Expanding texture to power-of-two dimensions");
@@ -434,36 +442,23 @@ public class Texture {
}
texWidth = nextPowerOfTwo(imgWidth);
texHeight = nextPowerOfTwo(imgHeight);
- newTarget = GL.GL_TEXTURE_2D;
+ texTarget = GL.GL_TEXTURE_2D;
}
- setImageSize(imgWidth, imgHeight, newTarget);
+ texParamTarget = texTarget;
+ setImageSize(imgWidth, imgHeight, texTarget);
if (target != 0) {
// Allow user to override auto detection and skip bind step (for
// cubemap construction)
- newTarget = target;
+ texTarget = target;
if (this.target == 0) {
throw new GLException("Override of target failed; no target specified yet");
}
- gl.glBindTexture(this.target, texID);
+ texParamTarget = this.target;
+ gl.glBindTexture(texParamTarget, texID);
} else {
- gl.glBindTexture(newTarget, texID);
- }
-
- int minFilter = (data.getMipmap() ? GL.GL_LINEAR_MIPMAP_LINEAR : GL.GL_LINEAR);
- int magFilter = GL.GL_LINEAR;
- int wrapMode = (gl.isExtensionAvailable("GL_VERSION_1_2") ? GL.GL_CLAMP_TO_EDGE : GL.GL_CLAMP);
-
- // REMIND: figure out what to do for GL_TEXTURE_RECTANGLE_ARB
- if (newTarget != GL.GL_TEXTURE_RECTANGLE_ARB) {
- gl.glTexParameteri(newTarget, GL.GL_TEXTURE_MIN_FILTER, minFilter);
- gl.glTexParameteri(newTarget, GL.GL_TEXTURE_MAG_FILTER, magFilter);
- gl.glTexParameteri(newTarget, GL.GL_TEXTURE_WRAP_S, wrapMode);
- gl.glTexParameteri(newTarget, GL.GL_TEXTURE_WRAP_T, wrapMode);
- if (newTarget == GL.GL_TEXTURE_CUBE_MAP) {
- gl.glTexParameteri(newTarget, GL.GL_TEXTURE_WRAP_R, wrapMode);
- }
+ gl.glBindTexture(texTarget, texID);
}
if (data.getMipmap() && !haveAutoMipmapGeneration) {
@@ -477,7 +472,7 @@ public class Texture {
try {
GLU glu = new GLU();
- glu.gluBuild2DMipmaps(newTarget, data.getInternalFormat(),
+ glu.gluBuild2DMipmaps(texTarget, data.getInternalFormat(),
data.getWidth(), data.getHeight(),
data.getPixelFormat(), data.getPixelType(), data.getBuffer());
} finally {
@@ -492,15 +487,15 @@ public class Texture {
for (int i = 0; i < mipmapData.length; i++) {
if (data.isDataCompressed()) {
// Need to use glCompressedTexImage2D directly to allocate and fill this image
- gl.glCompressedTexImage2D(newTarget, i, data.getInternalFormat(),
+ gl.glCompressedTexImage2D(texTarget, i, data.getInternalFormat(),
width, height, data.getBorder(),
mipmapData[i].remaining(), mipmapData[i]);
} else {
// Allocate texture image at this level
- gl.glTexImage2D(newTarget, i, data.getInternalFormat(),
+ gl.glTexImage2D(texTarget, i, data.getInternalFormat(),
width, height, data.getBorder(),
data.getPixelFormat(), data.getPixelType(), null);
- updateSubImageImpl(data, newTarget, i, 0, 0, 0, 0, data.getWidth(), data.getHeight());
+ updateSubImageImpl(data, texTarget, i, 0, 0, 0, 0, data.getWidth(), data.getHeight());
}
width /= 2;
@@ -509,7 +504,7 @@ public class Texture {
} else {
if (data.isDataCompressed()) {
// Need to use glCompressedTexImage2D directly to allocate and fill this image
- gl.glCompressedTexImage2D(newTarget, 0, data.getInternalFormat(),
+ gl.glCompressedTexImage2D(texTarget, 0, data.getInternalFormat(),
texWidth, texHeight, data.getBorder(),
data.getBuffer().capacity(), data.getBuffer());
} else {
@@ -518,24 +513,39 @@ public class Texture {
// textures where the user hasn't explicitly specified
// mipmap data; don't know about interactions between
// GL_GENERATE_MIPMAP and glCompressedTexImage2D
- gl.glTexParameteri(newTarget, GL.GL_GENERATE_MIPMAP, GL.GL_TRUE);
+ gl.glTexParameteri(texParamTarget, GL.GL_GENERATE_MIPMAP, GL.GL_TRUE);
usingAutoMipmapGeneration = true;
}
- gl.glTexImage2D(newTarget, 0, data.getInternalFormat(),
+ gl.glTexImage2D(texTarget, 0, data.getInternalFormat(),
texWidth, texHeight, data.getBorder(),
data.getPixelFormat(), data.getPixelType(), null);
- updateSubImageImpl(data, newTarget, 0, 0, 0, 0, 0, data.getWidth(), data.getHeight());
+ updateSubImageImpl(data, texTarget, 0, 0, 0, 0, 0, data.getWidth(), data.getHeight());
}
}
}
+ int minFilter = (data.getMipmap() ? GL.GL_LINEAR_MIPMAP_LINEAR : GL.GL_LINEAR);
+ int magFilter = GL.GL_LINEAR;
+ int wrapMode = (gl.isExtensionAvailable("GL_VERSION_1_2") ? GL.GL_CLAMP_TO_EDGE : GL.GL_CLAMP);
+
+ // REMIND: figure out what to do for GL_TEXTURE_RECTANGLE_ARB
+ if (texTarget != GL.GL_TEXTURE_RECTANGLE_ARB) {
+ gl.glTexParameteri(texParamTarget, GL.GL_TEXTURE_MIN_FILTER, minFilter);
+ gl.glTexParameteri(texParamTarget, GL.GL_TEXTURE_MAG_FILTER, magFilter);
+ gl.glTexParameteri(texParamTarget, GL.GL_TEXTURE_WRAP_S, wrapMode);
+ gl.glTexParameteri(texParamTarget, GL.GL_TEXTURE_WRAP_T, wrapMode);
+ if (this.target == GL.GL_TEXTURE_CUBE_MAP) {
+ gl.glTexParameteri(texParamTarget, GL.GL_TEXTURE_WRAP_R, wrapMode);
+ }
+ }
+
// Don't overwrite target if we're loading e.g. faces of a cube
// map
if ((this.target == 0) ||
(this.target == GL.GL_TEXTURE_2D) ||
(this.target == GL.GL_TEXTURE_RECTANGLE_ARB)) {
- this.target = newTarget;
+ this.target = texTarget;
}
// This estimate will be wrong for cube maps
@@ -570,6 +580,7 @@ public class Texture {
// don't need to update other mipmap levels
return;
}
+ bind();
updateSubImageImpl(data, target, mipmapLevel, x, y, 0, 0, data.getWidth(), data.getHeight());
}
@@ -615,6 +626,7 @@ public class Texture {
// don't need to update other mipmap levels
return;
}
+ bind();
updateSubImageImpl(data, target, mipmapLevel, dstx, dsty, srcx, srcy, width, height);
}
@@ -811,7 +823,6 @@ public class Texture {
return;
}
- gl.glBindTexture(newTarget, texID);
int rowlen = data.getRowLength();
int dataWidth = data.getWidth();
int dataHeight = data.getHeight();
@@ -939,7 +950,8 @@ public class Texture {
// Helper routines for disabling certain codepaths
private static boolean haveNPOT(GL gl) {
- return (!disableNPOT && gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two"));
+ return (!disableNPOT &&
+ gl.isExtensionAvailable("GL_ARB_texture_non_power_of_two"));
}
private static boolean haveTexRect(GL gl) {
diff --git a/src/classes/com/sun/opengl/util/texture/TextureIO.java b/src/classes/com/sun/opengl/util/texture/TextureIO.java
index f1ac85ebd..fe7dacee4 100755
--- a/src/classes/com/sun/opengl/util/texture/TextureIO.java
+++ b/src/classes/com/sun/opengl/util/texture/TextureIO.java
@@ -646,7 +646,7 @@ public class TextureIO {
(height + (2 * border)) *
bytesPerPixel);
if (DEBUG) {
- System.err.println("Allocated buffer of size " + res.remaining() + " for fetched image (" +
+ System.out.println("Allocated buffer of size " + res.remaining() + " for fetched image (" +
((fetchedFormat == GL.GL_RGB) ? "GL_RGB" : "GL_RGBA") + ")");
}
gl.glGetTexImage(GL.GL_TEXTURE_2D, 0, fetchedFormat, GL.GL_UNSIGNED_BYTE, res);
@@ -855,6 +855,10 @@ public class TextureIO {
if (img == null) {
return null;
}
+ if (DEBUG) {
+ System.out.println("TextureIO.newTextureData(): BufferedImage type for " + file + " = " +
+ img.getType());
+ }
return new TextureData(internalFormat, pixelFormat, mipmap, img);
}
@@ -867,6 +871,10 @@ public class TextureIO {
if (img == null) {
return null;
}
+ if (DEBUG) {
+ System.out.println("TextureIO.newTextureData(): BufferedImage type for stream = " +
+ img.getType());
+ }
return new TextureData(internalFormat, pixelFormat, mipmap, img);
}