import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import javax.imageio.ImageIO;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import com.sun.opengl.util.Animator;
import com.sun.opengl.util.BufferUtil;
public class Tex implements GLEventListener {
private static final String IMAGE = "pic.png";
private GL gl;
private GLU glu;
private int textureID;
private final ByteBuffer texture;
private final int width;
private final int height;
public Tex() throws IOException {
final BufferedImage image = ImageIO.read(this.getClass().getClassLoader().getResourceAsStream(IMAGE));
width = image.getWidth();
height = image.getHeight();
final byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
texture = BufferUtil.newByteBuffer(data.length);
texture.put(data);
texture.rewind();
}
@Override
public void init(final GLAutoDrawable drawable) {
gl = drawable.getGL();
glu = new GLU();
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_TEXTURE_2D);
final IntBuffer buffer = BufferUtil.newIntBuffer(1);
gl.glGenTextures(1, buffer);
textureID = buffer.get(0);
gl.glBindTexture(GL.GL_TEXTURE_2D, textureID);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, width, height, 0, GL.GL_BGR, GL.GL_UNSIGNED_BYTE, texture);
}
@Override
public void display(final GLAutoDrawable drawable) {
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glBindTexture(GL.GL_TEXTURE_2D, textureID);
gl.glBegin(GL.GL_TRIANGLES);
gl.glTexCoord2f(1, 1);
gl.glVertex3f(1, -1, -5);
gl.glTexCoord2f(1, 0);
gl.glVertex3f(1, 1, -5);
gl.glTexCoord2f(0, 0);
gl.glVertex3f(-1, 1, -5);
gl.glEnd();
gl.glBindTexture(GL.GL_TEXTURE_2D, 0);
gl.glColor3f(0.3f, 0.3f, 0.5f);
gl.glBegin(GL.GL_TRIANGLES);
gl.glVertex3f(-1, 1, -5);
gl.glVertex3f(-1, -1, -5);
gl.glVertex3f(1, -1, -5);
gl.glEnd();
}
@Override
public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, int height) {
if (height <= 0)
height = 1;
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, (float) width / (float) height, 1.0, 20.0);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) {
}
public static void main(final String[] args) throws IOException {
final Tex tex = new Tex();
final Frame frame = new Frame();
final GLCanvas canvas = new GLCanvas();
final Animator animator = new Animator(canvas);
canvas.addGLEventListener(tex);
frame.add(canvas);
frame.setSize(500, 500);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent e) {
new Thread(new Runnable() {
public void run() {
animator.stop();
System.exit(0);
}
}).start();
}
});
frame.setLocationRelativeTo(null);
frame.setVisible(true);
animator.start();
}
}