This is my basic texture loader class, and I insist on the term "basic"since it pales in comparaison to what Greg coded.
It also addresses the upside down symptom that you’re having.
class load_image
{
java.awt.Image tex;
byte[] data;
int width,
height,
pixels[];
load_image(){
destroy();
}
void generate_texture_info(String texture_name, int type){
try{
tex = java.awt.Toolkit.getDefaultToolkit().getImage(texture_name);
}
catch(NullPointerException e){
System.out.println(e);
}
while(width <= 0 || height <= 0){
width = tex.getWidth(null);
height = tex.getHeight(null);
}
pixels = new int[width*height];
extract_pixels();
int pointer =0;
switch(type){
case net.java.games.jogl.GL.GL_RGB:
data = new byte[pixels.length*3];
for(int y = height -1; y>=0; y--)
for(int x = 0; x<width; x++){
data[pointer+0] = (byte)((pixels[y*width + x] >> 16) & 0xFF);
data[pointer+1] = (byte)((pixels[y*width + x] >> 8) & 0xFF);
data[pointer+2] = (byte) (pixels[y*width + x] & 0xFF);
pointer+=3;
}
break;
case net.java.games.jogl.GL.GL_RGBA:
data = new byte[pixels.length*4];
for(int y = height -1; y>=0; y--)
for(int x = 0; x<width; x++){
data[pointer+3] = (byte)((pixels[y*width + x] >> 24) & 0xFF);
data[pointer+0] = (byte)((pixels[y*width + x] >> 16) & 0xFF);
data[pointer+1] = (byte)((pixels[y*width + x] >> 8) & 0xFF);
data[pointer+2] = (byte)( pixels[y*width + x] & 0xFF);
pointer+=4;
}
break;
default: System.out.println("Unrecognized GL mode or not supported yet ^_^");
}
}
void destroy(){
tex = null;
data = null;
width = -1;
height = -1;
pixels = null;
}
void extract_pixels(){
try{
new java.awt.image.PixelGrabber(tex,0,0,width,height,pixels,0,width).grabPixels();
}
catch (InterruptedException e) {}
}
}
And this is how I call/use it in my demos:
load_image texture_loader = new load_image();
String texture_name[] = {"textures/floor.png",
"textures/wall.png",
"textures/ceiling.jpg"};
float x, y, z;
int index,
texture_id[] = new int[3];
gl.glGenTextures(3, texture_id);
for(int i =0; i<3; i++){
texture_loader.generate_texture_info(texture_name[i], gl.GL_RGB);
gl.glBindTexture(gl.GL_TEXTURE_2D, texture_id[i]);
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, 3,texture_loader.width, texture_loader.height,
0,gl.GL_RGB, gl.GL_UNSIGNED_BYTE, texture_loader.data);
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);
texture_loader.destroy();
}