/* * File: Renderer.java * Author: Joe Phillips * Date: 2/6/08 */package edu.msoe.phillijw.main;import javax.media.opengl.GL;import javax.media.opengl.GLAutoDrawable;import javax.media.opengl.GLEventListener;import javax.media.opengl.glu.GLU;import java.util.*;import edu.msoe.phillijw.entity.*;public class Renderer implements GLEventListener{ private GLU glu = new GLU(); private LinkedList<Entity> entities = new LinkedList<Entity>(); public Renderer() { entities.add(new FloorEntity()); entities.add(new BlockEntity()); } /** * Called by the drawable to initiate OpenGL rendering by the client. * After all GLEventListeners have been notified of a display event, the * drawable will swap its buffers if necessary. * @author Joe Phillips * @param gLDrawable The GLAutoDrawable object. */ public void display(GLAutoDrawable gLDrawable) { final GL gl = gLDrawable.getGL(); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); glu.gluLookAt(5.0, 4.0, 10.0, //eye position 0.0, 0.0, 0.0, //look at 0.0, 1.0, 0.0); //y-axis is up for (Entity e : entities) { gl.glColor3f(0.0f, 0.8f, 0.0f); e.render(gl); } } /** * Called by the drawable immediately after the OpenGL context is * initialized for the first time. Can be used to perform one-time OpenGL * initialization such as setup of lights and display lists. * @param gLDrawable The GLAutoDrawable object. */ public void init(GLAutoDrawable gLDrawable) { GL gl = gLDrawable.getGL(); gl.glShadeModel(GL.GL_SMOOTH); // Enable Smooth Shading gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background gl.glEnable(GL.GL_LIGHTING); gl.glEnable(GL.GL_LIGHT0); float[] diffuse = new float[] {0.5f, 0.5f, 0.5f, 1.0f}; float[] position = new float[] {2.0f, 2.0f, 10.0f, 1.0f}; gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuse, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position, 0); } /** * Called by the drawable during the first repaint after the component has * been resized. The client can update the viewport and view volume of the * window appropriately, for example by a call to * GL.glViewport(int, int, int, int); note that for convenience the component * has already called GL.glViewport(int, int, int, int)(x, y, width, height) * when this method is called, so the client may not have to do anything in * this method. * @param gLDrawable The GLAutoDrawable object. * @param x The X Coordinate of the viewport rectangle. * @param y The Y coordinate of the viewport rectangle. * @param width The new width of the window. * @param height The new height of the window. */ public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) { final GL gl = gLDrawable.getGL(); if (height <= 0) { height = 1; } // avoid a divide by zero error! final float h = (float) width / (float) height; gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(30.0, h, 1.0, 100.0); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); } /** * Called when the display mode has been changed. * <B>!! CURRENTLY UNIMPLEMENTED IN JOGL!</B> * @param gLDrawable The GLAutoDrawable object. * @param modeChanged Indicates if the video mode has changed. * @param deviceChanged Indicates if the video device has changed. */ public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) { //unavailable }}