package com.jogamp.opengl.test.junit.jogl.demos.gl2;
import java.net.URLConnection;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.fixedfunc.GLLightingFunc;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.common.util.IOUtil;
import com.jogamp.opengl.test.junit.jogl.util.texture.PNGTstFiles;
import com.jogamp.opengl.util.gl2.GLUT;
import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureIO;
/**
* Adapted from
* http://www.java-tips.org/other-api-tips/jogl/how-to-draw-a-texture-mapped-teapot-with-automatically-generated-texture-coordi.html
*/
public class Teapot implements GLEventListener {
private GLUT glut;
/* glTexGen stuff: */
// private final float sgenparams[] = { 1.0f, 1.0f, 1.0f, 0.0f };
private Texture tex = null;
private void enableStates(final GL2 gl, final boolean enable) {
if( enable ) {
if( null != tex ) {
tex.bind(gl);
}
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LESS); // default
// gl.glEnable(GL2.GL_TEXTURE_GEN_S);
// gl.glEnable(GL2.GL_TEXTURE_1D);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glEnable(GL.GL_CULL_FACE);
gl.glEnable(GLLightingFunc.GL_LIGHTING);
gl.glEnable(GLLightingFunc.GL_LIGHT0);
gl.glEnable(GL2.GL_AUTO_NORMAL);
gl.glEnable(GLLightingFunc.GL_NORMALIZE);
gl.glFrontFace(GL.GL_CW);
gl.glCullFace(GL.GL_BACK); // default
gl.glMaterialf(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, 64.0f);
gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
} else {
if( null != tex ) {
gl.glBindTexture(tex.getTarget(), 0);
}
gl.glDisable(GL.GL_DEPTH_TEST);
// gl.glDisable(GL2.GL_TEXTURE_GEN_S);
// gl.glDisable(GL2.GL_TEXTURE_1D);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glDisable(GL.GL_CULL_FACE);
gl.glDisable(GLLightingFunc.GL_LIGHTING);
gl.glDisable(GLLightingFunc.GL_LIGHT0);
gl.glDisable(GL2.GL_AUTO_NORMAL);
gl.glDisable(GLLightingFunc.GL_NORMALIZE);
gl.glFrontFace(GL.GL_CCW); // default
}
}
@Override
public void init(final GLAutoDrawable drawable) {
final GL2 gl = drawable.getGL().getGL2();
glut = new GLUT();
gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
try {
final URLConnection urlConn = IOUtil.getResource("test-ntscP_3-01-160x90.png", PNGTstFiles.class.getClassLoader(), PNGTstFiles.class);
tex = TextureIO.newTexture(gl, TextureIO.newTextureData(gl.getGLProfile(), urlConn.getInputStream(), false, TextureIO.PNG));
} catch (final Exception e) {
e.printStackTrace();
}
// tex.bind(gl);
// uncomment this and comment the above to see a working texture
// makeStripeImage();
// gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
// gl.glTexEnvf(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE,
// GL2.GL_MODULATE);
// gl.glTexParameterf(GL2.GL_TEXTURE_1D, GL.GL_TEXTURE_WRAP_S,
// GL.GL_REPEAT);
// gl.glTexParameterf(GL2.GL_TEXTURE_1D, GL.GL_TEXTURE_MAG_FILTER,
// GL.GL_LINEAR);
// gl.glTexParameterf(GL2.GL_TEXTURE_1D, GL.GL_TEXTURE_MIN_FILTER,
// GL.GL_LINEAR);
// gl.glTexImage1D(GL2.GL_TEXTURE_1D, 0, 3, stripeImageWidth, 0,
// GL.GL_RGB, GL.GL_UNSIGNED_BYTE, stripeImageBuf);
// gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
// gl.glTexGeni(GL2.GL_S, GL2.GL_TEXTURE_GEN_MODE, GL2.GL_OBJECT_LINEAR);
// gl.glTexGenfv(GL2.GL_S, GL2.GL_OBJECT_PLANE, sgenparams, 0);
}
float angleZ = 0.0f;
float rotDir = 1.0f;
public float rotIncr = 0.4f;
@Override
public void display(final GLAutoDrawable gLDrawable) {
final GL2 gl = gLDrawable.getGL().getGL2();
enableStates(gl, true);
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glPushMatrix();
gl.glRotatef(angleZ, 0.0f, 1.0f, 0.0f);
gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
glut.glutSolidTeapot(2.0f);
gl.glPopMatrix();
gl.glFlush();
if( angleZ >= 180.0f ) {
rotDir = -1.0f;
} else if (angleZ <= 0.0f ) {
rotDir = +1.0f;
}
angleZ += rotIncr * rotDir;
enableStates(gl, false);
}
@Override
public void reshape(final GLAutoDrawable gLDrawable, final int x, final int y, final int w, final int h) {
final GL2 gl = gLDrawable.getGL().getGL2();
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
if (w <= h) {
gl.glOrtho(-3.5, 3.5, -3.5 * h / w,
3.5 * h / w, -3.5, 3.5);
} else {
gl.glOrtho(-3.5 * w / h,
3.5 * w / h, -3.5, 3.5, -3.5, 3.5);
}
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void dispose(final GLAutoDrawable gLDrawable) {
}
}