summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java100
-rw-r--r--src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java4
-rw-r--r--src/demos/proceduralTexturePhysics/Water.java194
-rwxr-xr-xsrc/demos/texture/TestTexture.java4
-rwxr-xr-xsrc/demos/util/Cubemap.java77
-rw-r--r--src/demos/vertexProgRefract/VertexProgRefract.java83
-rw-r--r--src/gleem/ExaminerViewer.java1
7 files changed, 188 insertions, 275 deletions
diff --git a/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java b/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java
index c8395ff..02e3c5c 100644
--- a/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java
+++ b/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java
@@ -128,8 +128,8 @@ public class HWShadowmapsSimple extends Demo {
// Texture objects
private static final int TEX_SIZE = 1024;
- private int decal;
- private int light_image;
+ private Texture decal;
+ private Texture light_image;
private int light_view_depth;
// Depth buffer format
@@ -194,21 +194,18 @@ public class HWShadowmapsSimple extends Demo {
gl.glClearColor(.5f, .5f, .5f, .5f);
- decal = genTexture(gl);
- gl.glBindTexture(GL.GL_TEXTURE_2D, decal);
- BufferedImage img = readPNGImage("demos/data/images/decal_image.png");
- makeRGBTexture(gl, img, GL.GL_TEXTURE_2D, true);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
-
- light_image = genTexture(gl);
- gl.glBindTexture(GL.GL_TEXTURE_2D, light_image);
- img = readPNGImage("demos/data/images/nvlogo_spot.png");
- makeRGBTexture(gl, img, GL.GL_TEXTURE_2D, true);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
+ try {
+ decal = TextureIO.newTexture(getClass().getClassLoader().getResourceAsStream("demos/data/images/decal_image.png"),
+ true,
+ TextureIO.PNG);
+ decal.setTexParameteri(GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
+ decal.setTexParameteri(GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
+ light_image = TextureIO.newTexture(getClass().getClassLoader().getResourceAsStream("demos/data/images/nvlogo_spot.png"),
+ true,
+ TextureIO.PNG);
+ } catch (IOException e) {
+ throw new GLException(e);
+ }
quad = gl.glGenLists(1);
gl.glNewList(quad, GL.GL_COMPILE);
@@ -463,51 +460,6 @@ public class HWShadowmapsSimple extends Demo {
return tmp[0];
}
- private BufferedImage readPNGImage(String resourceName) {
- try {
- // Note: use of BufferedInputStream works around 4764639/4892246
- BufferedImage img = ImageIO.read(new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(resourceName)));
- if (img == null) {
- throw new RuntimeException("Error reading resource " + resourceName);
- }
- return img;
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void makeRGBTexture(GL gl, BufferedImage img, int target, boolean mipmapped) {
- switch (img.getType()) {
- case BufferedImage.TYPE_3BYTE_BGR:
- case BufferedImage.TYPE_CUSTOM: {
- byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
- if (mipmapped) {
- glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB,
- GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));
- } else {
- gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0,
- GL.GL_RGB, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));
- }
- break;
- }
-
- case BufferedImage.TYPE_INT_RGB: {
- int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
- if (mipmapped) {
- glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB,
- GL.GL_UNSIGNED_BYTE, IntBuffer.wrap(data));
- } else {
- gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0,
- GL.GL_RGB, GL.GL_UNSIGNED_BYTE, IntBuffer.wrap(data));
- }
- break;
- }
-
- default:
- throw new RuntimeException("Unsupported image type " + img.getType());
- }
- }
-
private void eye_linear_texgen(GL gl) {
Mat4f m = new Mat4f();
m.makeIdent();
@@ -576,10 +528,10 @@ public class HWShadowmapsSimple extends Demo {
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glDisable(GL.GL_LIGHTING);
- gl.glBindTexture(GL.GL_TEXTURE_2D, decal);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ decal.bind();
+ decal.enable();
gl.glCallList(quad);
- gl.glDisable(GL.GL_TEXTURE_2D);
+ decal.disable();
gl.glEnable(GL.GL_LIGHTING);
texgen(gl, false);
@@ -650,8 +602,8 @@ public class HWShadowmapsSimple extends Demo {
applyTransform(gl, spotlightInverseTransform);
gl.glMatrixMode(GL.GL_MODELVIEW);
- gl.glBindTexture(GL.GL_TEXTURE_2D, light_image);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ light_image.bind();
+ light_image.enable();
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
gl.glActiveTexture(GL.GL_TEXTURE0);
@@ -663,7 +615,7 @@ public class HWShadowmapsSimple extends Demo {
render_scene(gl, cameraTransform, drawable, params);
gl.glActiveTexture(GL.GL_TEXTURE1);
- gl.glDisable(GL.GL_TEXTURE_2D);
+ light_image.disable();
gl.glActiveTexture(GL.GL_TEXTURE0);
render_manipulators(gl, cameraTransform, drawable, params);
@@ -697,8 +649,8 @@ public class HWShadowmapsSimple extends Demo {
applyTransform(gl, spotlightInverseTransform);
gl.glMatrixMode(GL.GL_MODELVIEW);
- gl.glBindTexture(GL.GL_TEXTURE_2D, light_image);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ light_image.bind();
+ light_image.enable();
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
// depth compare
@@ -732,7 +684,7 @@ public class HWShadowmapsSimple extends Demo {
render_scene(gl, cameraTransform, drawable, params);
gl.glActiveTexture(GL.GL_TEXTURE1);
- gl.glDisable(GL.GL_TEXTURE_2D);
+ light_image.disable();
gl.glActiveTexture(GL.GL_TEXTURE2);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE0);
@@ -772,8 +724,8 @@ public class HWShadowmapsSimple extends Demo {
glu.gluPerspective(lightshaper_fovy, 1, lightshaper_zNear, lightshaper_zFar);
gl.glMatrixMode(GL.GL_MODELVIEW);
- gl.glBindTexture(GL.GL_TEXTURE_2D, light_image);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ light_image.bind();
+ light_image.enable();
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
gl.glActiveTexture(GL.GL_TEXTURE0);
@@ -788,7 +740,7 @@ public class HWShadowmapsSimple extends Demo {
render_scene(gl, spotlightTransform, null, null);
gl.glActiveTexture(GL.GL_TEXTURE1);
- gl.glDisable(GL.GL_TEXTURE_2D);
+ light_image.disable();
gl.glActiveTexture(GL.GL_TEXTURE0);
}
diff --git a/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java b/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java
index 6fe2369..6a7d116 100644
--- a/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java
+++ b/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java
@@ -94,6 +94,7 @@ public class ProceduralTexturePhysics extends Demo {
//
public void shutdownDemo() {
+ viewer.detach();
ManipManager.getManipManager().unregisterWindow(drawable);
drawable.removeGLEventListener(this);
super.shutdownDemo();
@@ -124,7 +125,8 @@ public class ProceduralTexturePhysics extends Demo {
water.initialize("demos/data/images/nvfixed.tga",
"demos/data/images/nvspin.tga",
"demos/data/images/droplet.tga",
- "demos/data/cubemaps/CloudyHills_{0}.tga",
+ "demos/data/cubemaps/CloudyHills_",
+ "tga",
drawable);
GL gl = drawable.getGL();
diff --git a/src/demos/proceduralTexturePhysics/Water.java b/src/demos/proceduralTexturePhysics/Water.java
index f29d4a1..2fd0f0b 100644
--- a/src/demos/proceduralTexturePhysics/Water.java
+++ b/src/demos/proceduralTexturePhysics/Water.java
@@ -74,22 +74,16 @@ public class Water {
public static final int CA_DO_NOT_RENDER = 5;
private int[] initialMapDimensions = new int[2];
- private TGAImage initialMap;
+ private TextureData initialMapData;
private String tmpSpinFilename;
private String tmpDropletFilename;
- private String tmpCubeMapFilenamePattern;
+ private String tmpCubeMapFilenamePrefix;
+ private String tmpCubeMapFilenameSuffix;
private GLPbuffer pbuffer;
private Rotf cameraOrientation = new Rotf();
- // Static texture names
- private static final int CA_TEXTURE_INITIAL_MAP = 0;
- private static final int CA_TEXTURE_SPIN = 1;
- private static final int CA_TEXTURE_DROPLET = 2;
- private static final int CA_TEXTURE_CUBEMAP = 3;
- private static final int CA_NUM_STATIC_TEXTURES = 4;
-
// Dynamic texture names
private static final int CA_TEXTURE_FORCE_INTERMEDIATE = 0;
private static final int CA_TEXTURE_FORCE_TARGET = 1;
@@ -111,8 +105,13 @@ public class Water {
private static final int CA_DRAW_SCREEN_QUAD = 7;
private static final int CA_NUM_LISTS = 8;
- private int[] staticTextureIDs = new int[CA_NUM_STATIC_TEXTURES];
- private int[] dynamicTextureIDs = new int[CA_NUM_DYNAMIC_TEXTURES];
+ // Static textures
+ private Texture initialMapTex;
+ private Texture spinTex;
+ private Texture dropletTex;
+ private Texture cubemap;
+
+ private Texture[] dynamicTextures = new Texture[CA_NUM_DYNAMIC_TEXTURES];
private int texHeightInput; // current input height texture ID.
private int texHeightOutput; // current output height texture ID.
@@ -190,12 +189,14 @@ public class Water {
public void initialize(String initialMapFilename,
String spinFilename,
String dropletFilename,
- String cubeMapFilenamePattern,
+ String cubeMapFilenamePrefix,
+ String cubeMapFilenameSuffix,
GLAutoDrawable parentWindow) {
loadInitialTexture(initialMapFilename);
tmpSpinFilename = spinFilename;
tmpDropletFilename = dropletFilename;
- tmpCubeMapFilenamePattern = cubeMapFilenamePattern;
+ tmpCubeMapFilenamePrefix = cubeMapFilenamePrefix;
+ tmpCubeMapFilenameSuffix = cubeMapFilenameSuffix;
// create the pbuffer. Will use this as an offscreen rendering buffer.
// it allows rendering a texture larger than our window.
@@ -258,11 +259,11 @@ public class Water {
// Draw quad over full display
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_NORMAL_MAP]);
- gl.glDisable(GL.GL_TEXTURE_2D);
+ dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind();
+ dynamicTextures[CA_TEXTURE_NORMAL_MAP].disable();
gl.glActiveTexture(GL.GL_TEXTURE3);
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, staticTextureIDs[CA_TEXTURE_CUBEMAP]);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ cubemap.bind();
+ cubemap.enable();
gl.glColor4f(1, 1, 1, 1);
gl.glBegin(GL.GL_QUADS);
@@ -293,6 +294,7 @@ public class Water {
gl.glEnd();
+ cubemap.disable();
gl.glDisable(GL.GL_FRAGMENT_PROGRAM_ARB);
break;
@@ -301,7 +303,7 @@ public class Water {
case CA_FULLSCREEN_NORMALMAP: {
// Draw quad over full display
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_NORMAL_MAP]);
+ dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind();
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
break;
@@ -319,7 +321,7 @@ public class Water {
case CA_FULLSCREEN_FORCE: {
// Draw quad over full display
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_FORCE_TARGET]);
+ dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind();
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
break;
@@ -329,7 +331,7 @@ public class Water {
// Draw quad over full display
// lower left
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_FORCE_TARGET]);
+ dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind();
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
@@ -348,7 +350,7 @@ public class Water {
gl.glPopMatrix();
// upper left
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_NORMAL_MAP]);
+ dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind();
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
@@ -471,31 +473,30 @@ public class Water {
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}
}
- private TGAImage loadImage(String resourceName) {
- try {
- return TGAImage.read(getClass().getClassLoader().getResourceAsStream(resourceName));
- } catch (IOException e) {
- throw new GLException(e);
- }
- }
-
// We need to load the initial texture file early to get the width
// and height for the pbuffer
private void loadInitialTexture(String initialMapFilename) {
try {
- initialMap = TGAImage.read(getClass().getClassLoader().getResourceAsStream(initialMapFilename));
+ initialMapData = TextureIO.newTextureData(getClass().getClassLoader().getResourceAsStream(initialMapFilename),
+ false,
+ TextureIO.getFileSuffix(initialMapFilename));
} catch (IOException e) {
throw new GLException(e);
}
- initialMapDimensions[0] = initialMap.getWidth();
- initialMapDimensions[1] = initialMap.getHeight();
+ initialMapDimensions[0] = initialMapData.getWidth();
+ initialMapDimensions[1] = initialMapData.getHeight();
}
private void initOpenGL(GL gl) {
- loadTextures(gl, tmpSpinFilename, tmpDropletFilename, tmpCubeMapFilenamePattern);
+ try {
+ loadTextures(gl, tmpSpinFilename, tmpDropletFilename, tmpCubeMapFilenamePrefix, tmpCubeMapFilenameSuffix);
+ } catch (IOException e) {
+ throw new GLException(e);
+ }
tmpSpinFilename = null;
tmpDropletFilename = null;
- tmpCubeMapFilenamePattern = null;
+ tmpCubeMapFilenamePrefix = null;
+ tmpCubeMapFilenameSuffix = null;
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
@@ -674,11 +675,11 @@ public class Water {
switch (flipState) {
case 0:
- texHeightInput = dynamicTextureIDs[CA_TEXTURE_HEIGHT_SOURCE]; // initial height map.
- texHeightOutput = dynamicTextureIDs[CA_TEXTURE_HEIGHT_TARGET]; // next height map.
+ texHeightInput = dynamicTextures[CA_TEXTURE_HEIGHT_SOURCE].getTextureObject(); // initial height map.
+ texHeightOutput = dynamicTextures[CA_TEXTURE_HEIGHT_TARGET].getTextureObject(); // next height map.
- texVelocityInput = dynamicTextureIDs[CA_TEXTURE_VELOCITY_SOURCE]; // initial velocity.
- texVelocityOutput = dynamicTextureIDs[CA_TEXTURE_VELOCITY_TARGET]; // next velocity.
+ texVelocityInput = dynamicTextures[CA_TEXTURE_VELOCITY_SOURCE].getTextureObject(); // initial velocity.
+ texVelocityOutput = dynamicTextures[CA_TEXTURE_VELOCITY_TARGET].getTextureObject(); // next velocity.
// Clear initial velocity texture to 0x80 == gray
gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
@@ -756,7 +757,7 @@ public class Water {
// Now we need to copy the resulting pixels into the intermediate force field texture
gl.glActiveTexture(GL.GL_TEXTURE2);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_FORCE_INTERMEDIATE]);
+ dynamicTextures[CA_TEXTURE_FORCE_INTERMEDIATE].bind();
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
@@ -798,7 +799,7 @@ public class Water {
// Now we need to copy the resulting pixels into the intermediate force field texture
gl.glActiveTexture(GL.GL_TEXTURE1);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_FORCE_TARGET]);
+ dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind();
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
@@ -817,7 +818,7 @@ public class Water {
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glBindTexture(GL.GL_TEXTURE_2D, texVelocityInput);
gl.glActiveTexture(GL.GL_TEXTURE1);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_FORCE_TARGET]);
+ dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind();
gl.glActiveTexture(GL.GL_TEXTURE2);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE3);
@@ -965,7 +966,7 @@ public class Water {
// Now we need to copy the resulting pixels into the normal map
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, dynamicTextureIDs[CA_TEXTURE_NORMAL_MAP]);
+ dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind();
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
@@ -975,8 +976,8 @@ public class Water {
gl.glDisable(GL.GL_REGISTER_COMBINERS_NV);
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, staticTextureIDs[CA_TEXTURE_INITIAL_MAP]);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ initialMapTex.bind();
+ initialMapTex.enable();
gl.glEnable(GL.GL_ALPHA_TEST);
@@ -993,7 +994,7 @@ public class Water {
if (spinLogo) {
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, staticTextureIDs[CA_TEXTURE_SPIN]);
+ spinTex.bind();
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
gl.glRotatef(angle, 0, 0, 1);
@@ -1008,100 +1009,39 @@ public class Water {
gl.glDisable(GL.GL_BLEND);
}
- private void createTextureObject(GL gl, int id, TGAImage image, boolean test) {
- // Fetch image data out of image
- gl.glBindTexture(GL.GL_TEXTURE_2D, id);
- gl.glTexImage2D (GL.GL_TEXTURE_2D,
- 0,
- GL.GL_RGBA8,
- image.getWidth(),
- image.getHeight(),
- 0,
- image.getGLFormat(),
- GL.GL_UNSIGNED_BYTE,
- ByteBuffer.wrap(image.getData()));
- gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
- gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
- }
-
- private void loadCubeMap(GL gl, int id, String filenamePattern, boolean mipmap) {
- int[] faces = new int[] { GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z };
- String[] faceNames = new String[] { "posx", "negx", "posy", "negy", "posz", "negz" };
-
- // create and bind a cubemap texture object
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, id);
-
- // enable automipmap generation if needed.
- gl.glTexParameteri(GL.GL_TEXTURE_CUBE_MAP, GL.GL_GENERATE_MIPMAP_SGIS, (mipmap ? 1 : 0));
-
- if (mipmap)
- gl.glTexParameterf(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR);
- else
- gl.glTexParameterf(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- gl.glTexParameterf(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- gl.glTexParameterf(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE);
- gl.glTexParameterf(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE);
-
- // load 6 faces.
- MessageFormat fmt = new MessageFormat(filenamePattern);
- for (int i = 0; i < 6; i++) {
- String filename = MessageFormat.format(filenamePattern, new String[] { faceNames[i] });
- TGAImage image = loadImage(filename);
- gl.glTexImage2D(faces[i],
- 0,
- GL.GL_RGBA8,
- image.getWidth(),
- image.getHeight(),
- 0,
- image.getGLFormat(),
- GL.GL_UNSIGNED_BYTE,
- ByteBuffer.wrap(image.getData()));
- }
- }
-
private void loadTextures(GL gl,
String spinFilename,
String dropletFilename,
- String cubeMapFilenamePattern) {
- if (initialMap == null) {
+ String cubeMapFilenamePrefix,
+ String cubeMapFilenameSuffix) throws IOException {
+ if (initialMapData == null) {
throw new GLException("Must call loadInitialTexture ahead of time");
}
- TGAImage spin = loadImage(spinFilename);
- TGAImage droplet = loadImage(dropletFilename);
-
- gl.glGenTextures(CA_NUM_STATIC_TEXTURES, staticTextureIDs, 0);
- gl.glGenTextures(CA_NUM_DYNAMIC_TEXTURES, dynamicTextureIDs, 0); // also create intermediate texture object
-
- // upload the initial map texture
- createTextureObject(gl, staticTextureIDs[CA_TEXTURE_INITIAL_MAP], initialMap, true);
-
- createTextureObject(gl, staticTextureIDs[CA_TEXTURE_SPIN], spin, true);
-
- createTextureObject(gl, staticTextureIDs[CA_TEXTURE_DROPLET], droplet, false);
+ initialMapTex = TextureIO.newTexture(initialMapData);
+ spinTex = TextureIO.newTexture(getClass().getClassLoader().getResourceAsStream(spinFilename), false,
+ TextureIO.getFileSuffix(spinFilename));
+ dropletTex = TextureIO.newTexture(getClass().getClassLoader().getResourceAsStream(dropletFilename), false,
+ TextureIO.getFileSuffix(dropletFilename));
// load the cubemap texture
- loadCubeMap(gl, staticTextureIDs[CA_TEXTURE_CUBEMAP], cubeMapFilenamePattern, true);
+ cubemap = Cubemap.loadFromStreams(getClass().getClassLoader(),
+ cubeMapFilenamePrefix,
+ cubeMapFilenameSuffix,
+ true);
+ // now create dummy intermediate textures from the initial map texture
for (int i = 0; i < CA_NUM_DYNAMIC_TEXTURES; i++) {
- // now create a dummy intermediate textures from the initial map texture
- createTextureObject(gl, dynamicTextureIDs[i], initialMap, false);
+ dynamicTextures[i] = TextureIO.newTexture(initialMapData);
}
- initialMap = null;
+ initialMapData = null;
- texHeightInput = staticTextureIDs [CA_TEXTURE_INITIAL_MAP]; // initial height map.
- texHeightOutput = dynamicTextureIDs[CA_TEXTURE_HEIGHT_TARGET]; // next height map.
+ texHeightInput = initialMapTex.getTextureObject(); // initial height map.
+ texHeightOutput = dynamicTextures[CA_TEXTURE_HEIGHT_TARGET].getTextureObject(); // next height map.
- texVelocityInput = dynamicTextureIDs[CA_TEXTURE_VELOCITY_SOURCE]; // initial velocity.
- texVelocityOutput = dynamicTextureIDs[CA_TEXTURE_VELOCITY_TARGET]; // next velocity.
+ texVelocityInput = dynamicTextures[CA_TEXTURE_VELOCITY_SOURCE].getTextureObject(); // initial velocity.
+ texVelocityOutput = dynamicTextures[CA_TEXTURE_VELOCITY_TARGET].getTextureObject(); // next velocity.
}
private void createAndWriteUVOffsets(GL gl, int width, int height) {
@@ -1196,8 +1136,8 @@ public class Water {
gl.glDisable(GL.GL_VERTEX_PROGRAM_ARB);
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_2D, staticTextureIDs[CA_TEXTURE_DROPLET]);
- gl.glEnable(GL.GL_TEXTURE_2D);
+ dropletTex.bind();
+ dropletTex.enable();
gl.glActiveTexture(GL.GL_TEXTURE1);
gl.glDisable(GL.GL_TEXTURE_2D);
diff --git a/src/demos/texture/TestTexture.java b/src/demos/texture/TestTexture.java
index cd71a3a..1ef0074 100755
--- a/src/demos/texture/TestTexture.java
+++ b/src/demos/texture/TestTexture.java
@@ -129,6 +129,8 @@ public class TestTexture implements GLEventListener {
}
public void init(GLAutoDrawable drawable) {
+ drawable.setGL(new DebugGL(drawable.getGL()));
+
GL gl = drawable.getGL();
gl.glClearColor(0, 0, 0, 0);
gl.glEnable(GL.GL_DEPTH_TEST);
@@ -180,8 +182,8 @@ public class TestTexture implements GLEventListener {
if (texture != null) {
texture.enable();
- gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
texture.bind();
+ gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
TextureCoords coords = texture.getImageTexCoords();
gl.glBegin(GL.GL_QUADS);
diff --git a/src/demos/util/Cubemap.java b/src/demos/util/Cubemap.java
new file mode 100755
index 0000000..fc7cd16
--- /dev/null
+++ b/src/demos/util/Cubemap.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package demos.util;
+
+import java.io.*;
+
+import javax.media.opengl.*;
+import com.sun.opengl.utils.*;
+
+/** Helper class for loading cubemaps from a set of textures. */
+
+public class Cubemap {
+ private static final String[] suffixes = { "posx", "negx", "posy", "negy", "posz", "negz" };
+ private static final int[] targets = { GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+ GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+ GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+ GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+ GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+ GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z };
+
+ public static Texture loadFromStreams(ClassLoader scope,
+ String basename,
+ String suffix,
+ boolean mipmapped) throws IOException, GLException {
+ Texture cubemap = TextureIO.newTexture(GL.GL_TEXTURE_CUBE_MAP);
+
+ for (int i = 0; i < suffixes.length; i++) {
+ String resourceName = basename + suffixes[i] + "." + suffix;
+ TextureData data = TextureIO.newTextureData(scope.getResourceAsStream(resourceName),
+ mipmapped,
+ TextureIO.getFileSuffix(resourceName));
+ if (data == null) {
+ throw new IOException("Unable to load texture " + resourceName);
+ }
+ cubemap.updateImage(data, targets[i]);
+ }
+
+ return cubemap;
+ }
+}
diff --git a/src/demos/vertexProgRefract/VertexProgRefract.java b/src/demos/vertexProgRefract/VertexProgRefract.java
index a01a5d7..00e1d4c 100644
--- a/src/demos/vertexProgRefract/VertexProgRefract.java
+++ b/src/demos/vertexProgRefract/VertexProgRefract.java
@@ -46,7 +46,6 @@ import javax.swing.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import com.sun.opengl.utils.*;
-import com.sun.opengl.utils.*;
import demos.common.*;
import demos.util.*;
import gleem.*;
@@ -100,7 +99,7 @@ public class VertexProgRefract extends Demo {
private boolean firstRender = true;
private int vtxProg;
private int fragProg;
- private int cubemap;
+ private Texture cubemap;
private int bunnydl;
private int obj;
@@ -269,16 +268,11 @@ public class VertexProgRefract extends Demo {
gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 2, 1.0f, -1.0f, 1.0f, 0.0f); // texture scale
gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 3, 0.0f, 1.0f, 2.0f, 3.0f); // misc constants
- int[] cubemapTmp = new int[1];
- gl.glGenTextures(1, cubemapTmp, 0);
- cubemap = cubemapTmp[0];
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, cubemap);
-
- gl.glTexParameteri(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_CUBE_MAP, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_LINEAR);
-
try {
- loadPNGCubemap(gl, "demos/data/cubemaps/uffizi", true);
+ cubemap = Cubemap.loadFromStreams(getClass().getClassLoader(),
+ "demos/data/cubemaps/uffizi_",
+ "png",
+ true);
} catch (IOException e) {
shutdownDemo();
throw new RuntimeException(e);
@@ -381,16 +375,16 @@ public class VertexProgRefract extends Demo {
// set texture transforms
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, cubemap);
- gl.glEnable(GL.GL_TEXTURE_CUBE_MAP);
+ cubemap.bind();
+ cubemap.enable();
gl.glMatrixMode(GL.GL_TEXTURE);
gl.glLoadIdentity();
gl.glScalef(1.0f, -1.0f, 1.0f);
viewer.updateInverseRotation(gl);
gl.glActiveTexture(GL.GL_TEXTURE1);
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, cubemap);
- gl.glEnable(GL.GL_TEXTURE_CUBE_MAP);
+ cubemap.bind();
+ cubemap.enable();
gl.glMatrixMode(GL.GL_TEXTURE);
gl.glLoadIdentity();
gl.glScalef(1.0f, -1.0f, 1.0f);
@@ -454,6 +448,7 @@ public class VertexProgRefract extends Demo {
//
public void shutdownDemo() {
if (drawable != null) {
+ viewer.detach();
ManipManager.getManipManager().unregisterWindow(drawable);
drawable.removeGLEventListener(this);
}
@@ -508,60 +503,6 @@ public class VertexProgRefract extends Demo {
return b[((int) key) & 0xFF];
}
- // FIXME: note we found that we had to swap the negy and posy portions of the cubemap.
- // Not sure why this is the case. Vertical flip in the image read? Possible, but doesn't
- // appear to be the case (have tried this and produced wrong results at the time).
- String[] suffixes = { "posx", "negx", "negy", "posy", "posz", "negz" };
- int[] targets = { GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
- GL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
- GL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z };
- private void loadPNGCubemap(GL gl, String baseName, boolean mipmapped) throws IOException {
- for (int i = 0; i < suffixes.length; i++) {
- String resourceName = baseName + "_" + suffixes[i] + ".png";
- // Note: use of BufferedInputStream works around 4764639/4892246
- BufferedImage img = ImageIO.read(new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(resourceName)));
- if (img == null) {
- throw new RuntimeException("Error reading PNG image " + resourceName);
- }
- makeRGBTexture(gl, img, targets[i], mipmapped);
- }
- }
-
- private void makeRGBTexture(GL gl, BufferedImage img, int target, boolean mipmapped) {
- switch (img.getType()) {
- case BufferedImage.TYPE_3BYTE_BGR:
- case BufferedImage.TYPE_CUSTOM: {
- byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
- if (mipmapped) {
- glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB,
- GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));
- } else {
- gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0,
- GL.GL_RGB, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));
- }
- break;
- }
-
- case BufferedImage.TYPE_INT_RGB: {
- int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
- if (mipmapped) {
- glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB,
- GL.GL_UNSIGNED_BYTE, IntBuffer.wrap(data));
- } else {
- gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0,
- GL.GL_RGB, GL.GL_UNSIGNED_BYTE, IntBuffer.wrap(data));
- }
- break;
- }
-
- default:
- throw new RuntimeException("Unsupported image type " + img.getType());
- }
- }
-
private void initExtension(GL gl, String glExtensionName) {
if (!gl.isExtensionAvailable(glExtensionName)) {
final String message = "OpenGL extension \"" + glExtensionName + "\" not available";
@@ -650,8 +591,8 @@ public class VertexProgRefract extends Demo {
gl.glDisable(GL.GL_TEXTURE_CUBE_MAP);
gl.glActiveTexture(GL.GL_TEXTURE0);
- gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, cubemap);
- gl.glEnable(GL.GL_TEXTURE_CUBE_MAP);
+ cubemap.bind();
+ cubemap.enable();
// This is a workaround for a driver bug on Mac OS X where the
// normals are not being sent down to the hardware in
diff --git a/src/gleem/ExaminerViewer.java b/src/gleem/ExaminerViewer.java
index 61976b1..3ff04a9 100644
--- a/src/gleem/ExaminerViewer.java
+++ b/src/gleem/ExaminerViewer.java
@@ -607,7 +607,6 @@ public class ExaminerViewer {
Rotf oriInv = orientation.inverse();
Vec3f tmp = new Vec3f();
float ang = orientation.get(tmp);
- gl.glLoadIdentity();
if (tmp.lengthSquared() > EPSILON)
gl.glRotatef((float) Math.toDegrees(ang), tmp.x(), tmp.y(), tmp.z());
}