package glredbook10;
import com.jogamp.opengl.util.gl2.GLUT;
import java.awt.event.*;
import javax.swing.*;
import com.jogamp.opengl.*; import com.jogamp.opengl.awt.GLJPanel;
/**
* This program renders three lighted, shaded teapots, with different ambient
* values.
*
* @author Kiet Le (Java port) Ported to JOGL 2.x by Claudio Eduardo Goes
*/
public class teaambient //
extends GLSkeleton<GLJPanel>
implements GLEventListener, KeyListener {
private GLUT glut;
@Override
protected GLJPanel createDrawable() {
GLCapabilities caps = new GLCapabilities(null);
//
GLJPanel panel = new GLJPanel(caps);
panel.addGLEventListener(this);
panel.addKeyListener(this);
return panel;
}
public static void main(String[] args) {
teaambient demo = new teaambient();
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("teaambient");
frame.setSize(512, 512);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(demo.drawable);
frame.setVisible(true);
demo.drawable.requestFocusInWindow();
}
/*
* Initialize light source and lighting model.
*/
public void init(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
glut = new GLUT();
//
float light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
float light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
float light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
/* light_position is NOT default value */
float light_position[] = { 1.0f, 0.0f, 0.0f, 0.0f };
float global_ambient[] = { 0.75f, 0.75f, 0.75f, 1.0f };
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, light_ambient, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, light_diffuse, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, light_specular, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, light_position, 0);
gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, global_ambient, 0);
gl.glFrontFace(GL.GL_CW);
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT0);
gl.glEnable(GL2.GL_AUTO_NORMAL);
gl.glEnable(GL2.GL_NORMALIZE);
gl.glDepthFunc(GL.GL_LESS);
gl.glEnable(GL.GL_DEPTH_TEST);
}
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
//
float low_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
float more_ambient[] = { 0.4f, 0.4f, 0.4f, 1.0f };
float most_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
/* material has small ambient reflection */
gl.glMaterialfv(GL.GL_FRONT, GL2.GL_SPECULAR, low_ambient, 0);
gl.glMaterialf(GL.GL_FRONT, GL2.GL_SHININESS, 40.0f);
gl.glPushMatrix();
gl.glTranslatef(0.0f, 2.0f, 0.0f);
glut.glutSolidTeapot(1.0);
gl.glPopMatrix();
/* material has moderate ambient reflection */
gl.glMaterialfv(GL.GL_FRONT, GL2.GL_SPECULAR, more_ambient, 0);
gl.glPushMatrix();
gl.glTranslatef(0.0f, 0.0f, 0.0f);
glut.glutSolidTeapot(1.0);
gl.glPopMatrix();
/* material has large ambient reflection */
gl.glMaterialfv(GL.GL_FRONT, GL2.GL_SPECULAR, most_ambient, 0);
gl.glPushMatrix();
gl.glTranslatef(0.0f, -2.0f, 0.0f);
glut.glutSolidTeapot(1.0);
gl.glPopMatrix();
gl.glFlush();
}
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
GL2 gl = drawable.getGL().getGL2();
//
gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
if (w <= h)
gl.glOrtho(-4.0, 4.0, -4.0 * (float) h / (float) w, 4.0 * (float) h
/ (float) w, -10.0, 10.0);
else
gl.glOrtho(-4.0 * (float) w / (float) h, 4.0 * (float) w
/ (float) h, -4.0, 4.0, -10.0, 10.0);
gl.glMatrixMode(GL2.GL_MODELVIEW);
}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged,
boolean deviceChanged) {
}
public void keyTyped(KeyEvent key) {
}
public void keyPressed(KeyEvent key) {
switch (key.getKeyCode()) {
case KeyEvent.VK_ESCAPE:
System.exit(0);
break;
default:
break;
}
}
public void keyReleased(KeyEvent key) {
}
public void dispose(GLAutoDrawable arg0) {
}
}