diff options
author | Kenneth Russel <[email protected]> | 2005-10-24 19:21:28 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2005-10-24 19:21:28 +0000 |
commit | 6873f65775af236ed270fcbd08661f5b53ba3598 (patch) | |
tree | 6fcefdc3a9429d7d3071b1464c11d40fa7bc3ab9 /src/demos/vertexProgWarp/VertexProgWarp.java | |
parent | 538be101e7bce7788c82e1b254a66deb5d35bb56 (diff) |
Merged JSR-231 branch on to the main JOGL trunk. The main trunk now
contains the evolving JSR-231 Reference Implementation and the JSR-231
branch is permanently closed.
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/jogl-demos/trunk@144 3298f667-5e0e-4b4a-8ed4-a3559d26a5f4
Diffstat (limited to 'src/demos/vertexProgWarp/VertexProgWarp.java')
-rw-r--r-- | src/demos/vertexProgWarp/VertexProgWarp.java | 940 |
1 files changed, 485 insertions, 455 deletions
diff --git a/src/demos/vertexProgWarp/VertexProgWarp.java b/src/demos/vertexProgWarp/VertexProgWarp.java index 3361755..cd39a01 100644 --- a/src/demos/vertexProgWarp/VertexProgWarp.java +++ b/src/demos/vertexProgWarp/VertexProgWarp.java @@ -40,7 +40,10 @@ import java.nio.*; import java.util.*; import javax.swing.*; -import net.java.games.jogl.*; +import javax.media.opengl.*; +import javax.media.opengl.glu.*; +import com.sun.opengl.utils.*; +import demos.common.*; import demos.util.*; import gleem.*; import gleem.linalg.*; @@ -54,12 +57,12 @@ import gleem.linalg.*; Ported to Java by Kenneth Russell */ -public class VertexProgWarp { - private GLCanvas canvas; +public class VertexProgWarp extends Demo { private Frame frame; private Animator animator; private volatile boolean quit; + private GLAutoDrawable drawable; private DurationTimer timer = new DurationTimer(); private boolean firstRender = true; private int frameCount; @@ -69,12 +72,24 @@ public class VertexProgWarp { } public void run(String[] args) { - canvas = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities()); - canvas.addGLEventListener(new Listener()); - - animator = new Animator(canvas); + GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities()); + VertexProgWarp demo = new VertexProgWarp(); + canvas.addGLEventListener(demo); + + final Animator animator = new Animator(canvas); + demo.setDemoListener(new DemoListener() { + public void shutdownDemo() { + runExit(animator); + } + public void repaint() {} + }); - frame = new Frame(); + final Frame frame = new Frame(); + demo.setTitleSetter(new VertexProgWarp.TitleSetter() { + public void setTitle(String title) { + frame.setTitle(title); + } + }); frame.setLayout(new BorderLayout()); canvas.setSize(512, 512); frame.add(canvas, BorderLayout.CENTER); @@ -84,513 +99,529 @@ public class VertexProgWarp { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { - // Run this on another thread than the AWT event queue to - // make sure the call to Animator.stop() completes before - // exiting - new Thread(new Runnable() { - public void run() { - animator.stop(); - System.exit(0); - } - }).start(); + runExit(animator); } }); animator.start(); } - class Listener implements GLEventListener { - // period of 4-term Taylor approximation to sin isn't quite 2*M_PI - private static final float SIN_PERIOD = 3.079f; - private static final int NUM_OBJS = 5; - private static final int NUM_PROGS = 7; - private int[] programs = new int[NUM_PROGS]; - private float zNear = 0.1f; - private float zFar = 10.0f; - private int program = 2; - private int obj = 2; - private boolean[] b = new boolean[256]; - private boolean wire = false; - private boolean toggleWire = false; - private boolean animating = true; - private boolean doViewAll = true; - - private Time time = new SystemTime(); - private float anim = 0.0f; - private float animScale = 7.0f; - private float amp = 0.05f; - private float freq = 8.0f; - private float d = 4.0f; - - private ExaminerViewer viewer; - - public void init(GLDrawable drawable) { - GL gl = drawable.getGL(); - GLU glu = drawable.getGLU(); - - float cc = 0.0f; - gl.glClearColor(cc, cc, cc, 1); - - gl.glColor3f(1,1,1); - gl.glEnable(GL.GL_DEPTH_TEST); - gl.glDisable(GL.GL_CULL_FACE); + public static abstract class TitleSetter { + public abstract void setTitle(String title); + } - try { - initExtension(gl, "GL_ARB_vertex_program"); - } catch (RuntimeException e) { - quit = true; - throw(e); - } + public void setTitleSetter(TitleSetter setter) { + titleSetter = setter; + } - for(int i=0; i<NUM_OBJS; i++) { - gl.glNewList(i+1, GL.GL_COMPILE); - drawObject(gl, glu, i); - gl.glEndList(); - } - - for(int i=0; i<NUM_PROGS; i++) { - int[] vtxProgTmp = new int[1]; - gl.glGenProgramsARB(1, vtxProgTmp); - programs[i] = vtxProgTmp[0]; - gl.glBindProgramARB(GL.GL_VERTEX_PROGRAM_ARB, programs[i]); - gl.glProgramStringARB(GL.GL_VERTEX_PROGRAM_ARB, GL.GL_PROGRAM_FORMAT_ASCII_ARB, programTexts[i].length(), programTexts[i]); - } + private TitleSetter titleSetter; + private boolean initComplete; + + // period of 4-term Taylor approximation to sin isn't quite 2*M_PI + private static final float SIN_PERIOD = 3.079f; + private static final int NUM_OBJS = 5; + private static final int NUM_PROGS = 7; + private int[] programs = new int[NUM_PROGS]; + private float zNear = 0.1f; + private float zFar = 10.0f; + private int program = 2; + private int obj = 2; + private boolean[] b = new boolean[256]; + private boolean wire = false; + private boolean toggleWire = false; + private boolean animating = true; + private boolean doViewAll = true; + + private Time time = new SystemTime(); + private float anim = 0.0f; + private float animScale = 7.0f; + private float amp = 0.05f; + private float freq = 8.0f; + private float d = 4.0f; + + private GLU glu = new GLU(); + private ExaminerViewer viewer; + + public void init(GLAutoDrawable drawable) { + initComplete = false; + GL gl = drawable.getGL(); + + float cc = 0.0f; + gl.glClearColor(cc, cc, cc, 1); + + gl.glColor3f(1,1,1); + gl.glEnable(GL.GL_DEPTH_TEST); + gl.glDisable(GL.GL_CULL_FACE); + + try { + initExtension(gl, "GL_ARB_vertex_program"); + } catch (RuntimeException e) { + shutdownDemo(); + throw(e); + } + + for(int i=0; i<NUM_OBJS; i++) { + gl.glNewList(i+1, GL.GL_COMPILE); + drawObject(gl, i); + gl.glEndList(); + } + + for(int i=0; i<NUM_PROGS; i++) { + int[] vtxProgTmp = new int[1]; + gl.glGenProgramsARB(1, vtxProgTmp, 0); + programs[i] = vtxProgTmp[0]; + gl.glBindProgramARB(GL.GL_VERTEX_PROGRAM_ARB, programs[i]); + gl.glProgramStringARB(GL.GL_VERTEX_PROGRAM_ARB, GL.GL_PROGRAM_FORMAT_ASCII_ARB, programTexts[i].length(), programTexts[i]); + } - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 0, 0.0f, 0.0f, 1.0f, 0.0f); // light position/direction - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 1, 0.0f, 1.0f, 0.0f, 0.0f); // diffuse color - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 2, 1.0f, 1.0f, 1.0f, 0.0f); // specular color + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 0, 0.0f, 0.0f, 1.0f, 0.0f); // light position/direction + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 1, 0.0f, 1.0f, 0.0f, 0.0f); // diffuse color + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 2, 1.0f, 1.0f, 1.0f, 0.0f); // specular color - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 3, 0.0f, 1.0f, 2.0f, 3.0f); // smoothstep constants + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 3, 0.0f, 1.0f, 2.0f, 3.0f); // smoothstep constants - // sin Taylor series constants - 1, 1/3!, 1/5!, 1/7! - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 4, 1.0f, 1.0f / (3*2), 1.0f / (5*4*3*2), 1.0f / (7*6*5*4*3*2)); + // sin Taylor series constants - 1, 1/3!, 1/5!, 1/7! + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 4, 1.0f, 1.0f / (3*2), 1.0f / (5*4*3*2), 1.0f / (7*6*5*4*3*2)); - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 5, 1.0f / (2.0f * SIN_PERIOD), 2.0f * SIN_PERIOD, SIN_PERIOD, SIN_PERIOD/2.0f); + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 5, 1.0f / (2.0f * SIN_PERIOD), 2.0f * SIN_PERIOD, SIN_PERIOD, SIN_PERIOD/2.0f); - // sin wave frequency, amplitude - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 6, 1.0f, 0.2f, 0.0f, 0.0f); + // sin wave frequency, amplitude + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 6, 1.0f, 0.2f, 0.0f, 0.0f); - // phase animation - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 7, 0.0f, 0.0f, 0.0f, 0.0f); + // phase animation + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 7, 0.0f, 0.0f, 0.0f, 0.0f); - // fisheye sphere radius - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 8, 1.0f, 0.0f, 0.0f, 0.0f); + // fisheye sphere radius + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 8, 1.0f, 0.0f, 0.0f, 0.0f); - setWindowTitle(); + setWindowTitle(); - b['p'] = true; + doViewAll = true; + + b['p'] = true; - drawable.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - dispatchKey(e.getKeyCode(), e.getKeyChar()); - } - }); - - // Register the window with the ManipManager - ManipManager manager = ManipManager.getManipManager(); - manager.registerWindow(drawable); - - viewer = new ExaminerViewer(MouseButtonHelper.numMouseButtons()); - viewer.setNoAltKeyMode(true); - viewer.attach(drawable, new BSphereProvider() { - public BSphere getBoundingSphere() { - return new BSphere(new Vec3f(0, 0, 0), 1.0f); - } - }); - viewer.setVertFOV((float) Math.toRadians(60)); - viewer.setZNear(zNear); - viewer.setZFar(zFar); - } + drawable.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + dispatchKey(e.getKeyCode(), e.getKeyChar()); + } + }); - public void display(GLDrawable drawable) { - if (!firstRender) { - if (++frameCount == 30) { - timer.stop(); - System.err.println("Frames per second: " + (30.0f / timer.getDurationAsSeconds())); - timer.reset(); - timer.start(); - frameCount = 0; + // Register the window with the ManipManager + ManipManager manager = ManipManager.getManipManager(); + manager.registerWindow(drawable); + this.drawable = drawable; + + viewer = new ExaminerViewer(MouseButtonHelper.numMouseButtons()); + viewer.setNoAltKeyMode(true); + viewer.setAutoRedrawMode(false); + viewer.attach(drawable, new BSphereProvider() { + public BSphere getBoundingSphere() { + return new BSphere(new Vec3f(0, 0, 0), 1.0f); } - } else { - firstRender = false; + }); + viewer.setVertFOV((float) Math.toRadians(60)); + viewer.setZNear(zNear); + viewer.setZFar(zFar); + initComplete = true; + } + + public void display(GLAutoDrawable drawable) { + if (!initComplete) { + return; + } + + if (!firstRender) { + if (++frameCount == 30) { + timer.stop(); + System.err.println("Frames per second: " + (30.0f / timer.getDurationAsSeconds())); + timer.reset(); timer.start(); + frameCount = 0; } + } else { + firstRender = false; + timer.start(); + } - time.update(); + time.update(); - GL gl = drawable.getGL(); - GLU glu = drawable.getGLU(); + GL gl = drawable.getGL(); - gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - if (toggleWire) { - wire = !wire; - if (wire) - gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE); - else - gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); - toggleWire = false; - } + if (toggleWire) { + wire = !wire; + if (wire) + gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE); + else + gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); + toggleWire = false; + } - gl.glPushMatrix(); + gl.glPushMatrix(); - if (doViewAll) { - viewer.viewAll(gl); - doViewAll = false; - } + if (doViewAll) { + viewer.viewAll(gl); + doViewAll = false; + } - if (animating) { - anim -= (float) (animScale * time.deltaT()); - } + if (animating) { + anim -= (float) (animScale * time.deltaT()); + } - viewer.update(gl); - ManipManager.getManipManager().updateCameraParameters(drawable, viewer.getCameraParameters()); - ManipManager.getManipManager().render(drawable, gl); + viewer.update(gl); + ManipManager.getManipManager().updateCameraParameters(drawable, viewer.getCameraParameters()); + ManipManager.getManipManager().render(drawable, gl); - gl.glBindProgramARB(GL.GL_VERTEX_PROGRAM_ARB, programs[program]); - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 7, anim, 0.0f, 0.0f, 0.0f); + gl.glBindProgramARB(GL.GL_VERTEX_PROGRAM_ARB, programs[program]); + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 7, anim, 0.0f, 0.0f, 0.0f); - if (program==6) - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 6, (float) Math.sin(anim)*amp*50.0f, 0.0f, 0.0f, 0.0f); - else - gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 6, freq, amp, d, d+1); + if (program==6) + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 6, (float) Math.sin(anim)*amp*50.0f, 0.0f, 0.0f, 0.0f); + else + gl.glProgramEnvParameter4fARB(GL.GL_VERTEX_PROGRAM_ARB, 6, freq, amp, d, d+1); - if (b['p']) - gl.glEnable(GL.GL_VERTEX_PROGRAM_ARB); + if (b['p']) + gl.glEnable(GL.GL_VERTEX_PROGRAM_ARB); - gl.glDisable(GL.GL_TEXTURE_2D); - gl.glCallList(obj+1); + gl.glDisable(GL.GL_TEXTURE_2D); + gl.glCallList(obj+1); - gl.glDisable(GL.GL_VERTEX_PROGRAM_ARB); + gl.glDisable(GL.GL_VERTEX_PROGRAM_ARB); - gl.glPopMatrix(); - } + gl.glPopMatrix(); + } - // Unused routines - public void reshape(GLDrawable drawable, int x, int y, int width, int height) {} - public void displayChanged(GLDrawable drawable, boolean modeChanged, boolean deviceChanged) {} + // Unused routines + public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {} + public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {} + + //---------------------------------------------------------------------- + // Internals only below this point + // + public void shutdownDemo() { + ManipManager.getManipManager().unregisterWindow(drawable); + drawable.removeGLEventListener(this); + super.shutdownDemo(); + } - //---------------------------------------------------------------------- - // Internals only below this point - // - private void initExtension(GL gl, String glExtensionName) { - if (!gl.isExtensionAvailable(glExtensionName)) { - final String message = "OpenGL extension \"" + glExtensionName + "\" not available"; - new Thread(new Runnable() { - public void run() { - JOptionPane.showMessageDialog(null, message, "Unavailable extension", JOptionPane.ERROR_MESSAGE); - runExit(); - } - }).start(); - throw new RuntimeException(message); - } + private void initExtension(GL gl, String glExtensionName) { + if (!gl.isExtensionAvailable(glExtensionName)) { + final String message = "OpenGL extension \"" + glExtensionName + "\" not available"; + new Thread(new Runnable() { + public void run() { + JOptionPane.showMessageDialog(null, message, "Unavailable extension", JOptionPane.ERROR_MESSAGE); + shutdownDemo(); + } + }).start(); + throw new RuntimeException(message); } + } - private void dispatchKey(int keyCode, char k) { - if (k < 256) - b[k] = !b[k]; - - switch (keyCode) { - case KeyEvent.VK_HOME: - case KeyEvent.VK_R: - anim = 0.0f; - amp = 0.05f; - freq = 8.0f; - d = 4.0f; - doViewAll = true; - break; - - case KeyEvent.VK_LEFT: - case KeyEvent.VK_KP_LEFT: - program--; - if (program < 0) - program = NUM_PROGS-1; - setWindowTitle(); - break; - - case KeyEvent.VK_RIGHT: - case KeyEvent.VK_KP_RIGHT: - program = (program + 1) % NUM_PROGS; - setWindowTitle(); - break; - - case KeyEvent.VK_F1: - case KeyEvent.VK_H: - String endl = System.getProperty("line.separator"); - endl = endl + endl; - String msg = ("F1/h - Help" + endl + - "Home - Reset" + endl + - "Left Button & Mouse - Rotate viewpoint" + endl + - "1..5 - Switch object (Sphere, Torus, Triceratop, Cube, Cylinder)" + endl + - "- / + - Change amplitude" + endl + - "[ / ] - Change frequency" + endl + - ", / . - Change square fisheye size" + endl + - "Left - Next vertex program" + endl + - "Right - Previous vertex program" + endl + - "W - Toggle wireframe" + endl + - "Space - Toggle animation" + endl + - "Esc/q - Exit program" + endl); - JOptionPane.showMessageDialog(null, msg, "Help", JOptionPane.INFORMATION_MESSAGE); - break; - - case KeyEvent.VK_ESCAPE: - case KeyEvent.VK_Q: - runExit(); - return; - - case KeyEvent.VK_W: - toggleWire = true; - break; - - case KeyEvent.VK_EQUALS: - case KeyEvent.VK_PLUS: - amp += 0.01; - break; - - case KeyEvent.VK_MINUS: - amp -= 0.01; - break; - - case KeyEvent.VK_CLOSE_BRACKET: - freq += 0.5; - break; - - case KeyEvent.VK_OPEN_BRACKET: - freq -= 0.5; - break; - - case KeyEvent.VK_PERIOD: - d += 0.1; - break; - - case KeyEvent.VK_COMMA: - d -= 0.1; - break; - - case KeyEvent.VK_SPACE: - // Could also start/stop Animator here - animating = !animating; - break; - - case KeyEvent.VK_1: - obj = 0; - break; - - case KeyEvent.VK_2: - obj = 1; - break; - - case KeyEvent.VK_3: - obj = 2; - break; - - case KeyEvent.VK_4: - obj = 3; - break; - - case KeyEvent.VK_5: - obj = 4; - break; - } - } + private void dispatchKey(int keyCode, char k) { + if (k < 256) + b[k] = !b[k]; + + switch (keyCode) { + case KeyEvent.VK_HOME: + case KeyEvent.VK_R: + anim = 0.0f; + amp = 0.05f; + freq = 8.0f; + d = 4.0f; + doViewAll = true; + break; + + case KeyEvent.VK_LEFT: + case KeyEvent.VK_KP_LEFT: + program--; + if (program < 0) + program = NUM_PROGS-1; + setWindowTitle(); + break; - private void setWindowTitle() { - frame.setTitle("SpaceWarp - " + programNames[program]); + case KeyEvent.VK_RIGHT: + case KeyEvent.VK_KP_RIGHT: + program = (program + 1) % NUM_PROGS; + setWindowTitle(); + break; + + case KeyEvent.VK_F1: + case KeyEvent.VK_H: + String endl = System.getProperty("line.separator"); + endl = endl + endl; + String msg = ("F1/h - Help" + endl + + "Home - Reset" + endl + + "Left Button & Mouse - Rotate viewpoint" + endl + + "1..5 - Switch object (Sphere, Torus, Triceratop, Cube, Cylinder)" + endl + + "- / + - Change amplitude" + endl + + "[ / ] - Change frequency" + endl + + ", / . - Change square fisheye size" + endl + + "Left - Next vertex program" + endl + + "Right - Previous vertex program" + endl + + "W - Toggle wireframe" + endl + + "Space - Toggle animation" + endl + + "Esc/q - Exit program" + endl); + JOptionPane.showMessageDialog(null, msg, "Help", JOptionPane.INFORMATION_MESSAGE); + break; + + case KeyEvent.VK_ESCAPE: + case KeyEvent.VK_Q: + shutdownDemo(); + return; + + case KeyEvent.VK_W: + toggleWire = true; + break; + + case KeyEvent.VK_EQUALS: + case KeyEvent.VK_PLUS: + amp += 0.01; + break; + + case KeyEvent.VK_MINUS: + amp -= 0.01; + break; + + case KeyEvent.VK_CLOSE_BRACKET: + freq += 0.5; + break; + + case KeyEvent.VK_OPEN_BRACKET: + freq -= 0.5; + break; + + case KeyEvent.VK_PERIOD: + d += 0.1; + break; + + case KeyEvent.VK_COMMA: + d -= 0.1; + break; + + case KeyEvent.VK_SPACE: + // Could also start/stop Animator here + animating = !animating; + break; + + case KeyEvent.VK_1: + obj = 0; + break; + + case KeyEvent.VK_2: + obj = 1; + break; + + case KeyEvent.VK_3: + obj = 2; + break; + + case KeyEvent.VK_4: + obj = 3; + break; + + case KeyEvent.VK_5: + obj = 4; + break; } + } - private void drawObject(GL gl, GLU glu, int which) { - switch(which) { - case 0: - drawSphere(gl, 0.5f, 100, 100); - break; - - case 1: - drawTorus(gl, 0.25f, 0.5f, 100, 100); - break; - - case 2: - try { - Triceratops.drawObject(gl); - } catch (IOException e) { - runExit(); - throw new RuntimeException(e); - } - break; + private void setWindowTitle() { + titleSetter.setTitle("SpaceWarp - " + programNames[program]); + } + + private void drawObject(GL gl, int which) { + switch(which) { + case 0: + drawSphere(gl, 0.5f, 100, 100); + break; - case 3: - drawCube(gl); - break; + case 1: + drawTorus(gl, 0.25f, 0.5f, 100, 100); + break; - case 4: - drawCylinder(gl, glu); - break; + case 2: + try { + Triceratops.drawObject(gl); + } catch (IOException e) { + shutdownDemo(); + throw new RuntimeException(e); } + break; + + case 3: + drawCube(gl); + break; + + case 4: + drawCylinder(gl); + break; } + } - private void drawSphere(GL gl, float radius, int slices, int stacks) { - int J = stacks; - int I = slices; - for(int j = 0; j < J; j++) { - float v = j/(float) J; - float phi = (float) (v * 2 * Math.PI); - float v2 = (j+1)/(float) J; - float phi2 = (float) (v2 * 2 * Math.PI); - - gl.glBegin(GL.GL_QUAD_STRIP); - for(int i = 0; i < I; i++) { - float u = i/(I-1.0f); - float theta = (float) (u * Math.PI); - float x,y,z,nx,ny,nz; - - nx = (float) (Math.cos(theta)*Math.cos(phi)); - ny = (float) (Math.sin(theta)*Math.cos(phi)); - nz = (float) (Math.sin(phi)); - x = radius * nx; - y = radius * ny; - z = radius * nz; - - gl.glColor3f ( u, v, 0.0f); - gl.glNormal3f(nx, ny, nz); - gl.glVertex3f( x, y, z); - - nx = (float) (Math.cos(theta)*Math.cos(phi2)); - ny = (float) (Math.sin(theta)*Math.cos(phi2)); - nz = (float) (Math.sin(phi2)); - x = radius * nx; - y = radius * ny; - z = radius * nz; - - gl.glColor3f ( u, v+(1.0f/(J-1.0f)), 0.0f); - gl.glNormal3f(nx, ny, nz); - gl.glVertex3f( x, y, z); - } - gl.glEnd(); + private void drawSphere(GL gl, float radius, int slices, int stacks) { + int J = stacks; + int I = slices; + for(int j = 0; j < J; j++) { + float v = j/(float) J; + float phi = (float) (v * 2 * Math.PI); + float v2 = (j+1)/(float) J; + float phi2 = (float) (v2 * 2 * Math.PI); + + gl.glBegin(GL.GL_QUAD_STRIP); + for(int i = 0; i < I; i++) { + float u = i/(I-1.0f); + float theta = (float) (u * Math.PI); + float x,y,z,nx,ny,nz; + + nx = (float) (Math.cos(theta)*Math.cos(phi)); + ny = (float) (Math.sin(theta)*Math.cos(phi)); + nz = (float) (Math.sin(phi)); + x = radius * nx; + y = radius * ny; + z = radius * nz; + + gl.glColor3f ( u, v, 0.0f); + gl.glNormal3f(nx, ny, nz); + gl.glVertex3f( x, y, z); + + nx = (float) (Math.cos(theta)*Math.cos(phi2)); + ny = (float) (Math.sin(theta)*Math.cos(phi2)); + nz = (float) (Math.sin(phi2)); + x = radius * nx; + y = radius * ny; + z = radius * nz; + + gl.glColor3f ( u, v+(1.0f/(J-1.0f)), 0.0f); + gl.glNormal3f(nx, ny, nz); + gl.glVertex3f( x, y, z); } + gl.glEnd(); } + } - private void drawTorus(GL gl, float meridian_radius, float core_radius, - int meridian_slices, int core_slices) { - int J = meridian_slices; - int I = core_slices; - for(int j = 0; j < J-1; j++) { - float v = j/(J-1.0f); - float rho = (float) (v * 2.0f * Math.PI); - float v2 = (j+1)/(J-1.0f); - float rho2 = (float) (v2 * 2.0f * Math.PI); - gl.glBegin(GL.GL_QUAD_STRIP); - for(int i = 0; i < I; i++) { - float u = i/(I-1.0f); - float theta = (float) (u * 2.0f * Math.PI); - float x,y,z,nx,ny,nz; - - x = (float) (core_radius*Math.cos(theta) + meridian_radius*Math.cos(theta)*Math.cos(rho)); - y = (float) (core_radius*Math.sin(theta) + meridian_radius*Math.sin(theta)*Math.cos(rho)); - z = (float) (meridian_radius*Math.sin(rho)); - nx = (float) (Math.cos(theta)*Math.cos(rho)); - ny = (float) (Math.sin(theta)*Math.cos(rho)); - nz = (float) (Math.sin(rho)); - - gl.glColor3f ( u, v, 0.0f); - gl.glNormal3f(nx, ny, nz); - gl.glVertex3f( x, y, z); - - x = (float) (core_radius*Math.cos(theta) + meridian_radius*Math.cos(theta)*Math.cos(rho2)); - y = (float) (core_radius*Math.sin(theta) + meridian_radius*Math.sin(theta)*Math.cos(rho2)); - z = (float) (meridian_radius*Math.sin(rho2)); - nx = (float) (Math.cos(theta)*Math.cos(rho2)); - ny = (float) (Math.sin(theta)*Math.cos(rho2)); - nz = (float) (Math.sin(rho2)); - - gl.glColor3f ( u, v, 0.0f); - gl.glNormal3f(nx, ny, nz); - gl.glVertex3f( x, y, z); - } - gl.glEnd(); + private void drawTorus(GL gl, float meridian_radius, float core_radius, + int meridian_slices, int core_slices) { + int J = meridian_slices; + int I = core_slices; + for(int j = 0; j < J-1; j++) { + float v = j/(J-1.0f); + float rho = (float) (v * 2.0f * Math.PI); + float v2 = (j+1)/(J-1.0f); + float rho2 = (float) (v2 * 2.0f * Math.PI); + gl.glBegin(GL.GL_QUAD_STRIP); + for(int i = 0; i < I; i++) { + float u = i/(I-1.0f); + float theta = (float) (u * 2.0f * Math.PI); + float x,y,z,nx,ny,nz; + + x = (float) (core_radius*Math.cos(theta) + meridian_radius*Math.cos(theta)*Math.cos(rho)); + y = (float) (core_radius*Math.sin(theta) + meridian_radius*Math.sin(theta)*Math.cos(rho)); + z = (float) (meridian_radius*Math.sin(rho)); + nx = (float) (Math.cos(theta)*Math.cos(rho)); + ny = (float) (Math.sin(theta)*Math.cos(rho)); + nz = (float) (Math.sin(rho)); + + gl.glColor3f ( u, v, 0.0f); + gl.glNormal3f(nx, ny, nz); + gl.glVertex3f( x, y, z); + + x = (float) (core_radius*Math.cos(theta) + meridian_radius*Math.cos(theta)*Math.cos(rho2)); + y = (float) (core_radius*Math.sin(theta) + meridian_radius*Math.sin(theta)*Math.cos(rho2)); + z = (float) (meridian_radius*Math.sin(rho2)); + nx = (float) (Math.cos(theta)*Math.cos(rho2)); + ny = (float) (Math.sin(theta)*Math.cos(rho2)); + nz = (float) (Math.sin(rho2)); + + gl.glColor3f ( u, v, 0.0f); + gl.glNormal3f(nx, ny, nz); + gl.glVertex3f( x, y, z); } + gl.glEnd(); } + } - private void drawCube(GL gl) { - int cr = 40; - float scaleFactor = 0.5f; - - // back - gl.glColor3f(1.0f, 0.0f, 0.0f); - gl.glNormal3f(0.0f, 0.0f, -1.0f); - drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f); - - // front - gl.glColor3f(1.0f, 0.0f, 0.0f); - gl.glNormal3f(0.0f, 0.0f, 1.0f); - drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, 1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f); - - // left - gl.glColor3f(0.0f, 1.0f, 0.0f); - gl.glNormal3f(-1.0f, 0.0f, 0.0f); - drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 2.0f, 0.0f); - - // right - gl.glColor3f(0.0f, 0.0f, 1.0f); - gl.glNormal3f(1.0f, 0.0f, 0.0f); - drawGrid(gl, cr, cr, scaleFactor, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 2.0f, 0.0f); - - // bottom - gl.glColor3f(1.0f, 1.0f, 0.0f); - gl.glNormal3f(0.0f,-1.0f, 0.0f); - drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f); - - // top - gl.glColor3f(0.0f, 1.0f, 1.0f); - gl.glNormal3f(0.0f, 1.0f, 0.0f); - drawGrid(gl, cr, cr, scaleFactor, -1.0f, 1.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f); - } + private void drawCube(GL gl) { + int cr = 40; + float scaleFactor = 0.5f; + + // back + gl.glColor3f(1.0f, 0.0f, 0.0f); + gl.glNormal3f(0.0f, 0.0f, -1.0f); + drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f); + + // front + gl.glColor3f(1.0f, 0.0f, 0.0f); + gl.glNormal3f(0.0f, 0.0f, 1.0f); + drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, 1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f); + + // left + gl.glColor3f(0.0f, 1.0f, 0.0f); + gl.glNormal3f(-1.0f, 0.0f, 0.0f); + drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 2.0f, 0.0f); + + // right + gl.glColor3f(0.0f, 0.0f, 1.0f); + gl.glNormal3f(1.0f, 0.0f, 0.0f); + drawGrid(gl, cr, cr, scaleFactor, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 2.0f, 0.0f); + + // bottom + gl.glColor3f(1.0f, 1.0f, 0.0f); + gl.glNormal3f(0.0f,-1.0f, 0.0f); + drawGrid(gl, cr, cr, scaleFactor, -1.0f, -1.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f); + + // top + gl.glColor3f(0.0f, 1.0f, 1.0f); + gl.glNormal3f(0.0f, 1.0f, 0.0f); + drawGrid(gl, cr, cr, scaleFactor, -1.0f, 1.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f); + } - private void drawGrid(GL gl, int rows, int cols, - float scaleFactor, - float sx, float sy, float sz, - float ux, float uy, float uz, - float vx, float vy, float vz) { - int x, y; - - for(y=0; y<rows; y++) { - gl.glBegin(GL.GL_QUAD_STRIP); - for(x=0; x<=cols; x++) { - float u = x / (float) cols; - float v = y / (float) rows; - float v2 = v + (1.0f / (float) rows); - - gl.glTexCoord2f(u, v); - gl.glVertex3f(scaleFactor * (sx + (u*ux) + (v*vx)), - scaleFactor * (sy + (u*uy) + (v*vy)), - scaleFactor * (sz + (u*uz) + (v*vz))); - - gl.glTexCoord2f(u, v2); - gl.glVertex3f(scaleFactor * (sx + (u*ux) + (v2*vx)), - scaleFactor * (sy + (u*uy) + (v2*vy)), - scaleFactor * (sz + (u*uz) + (v2*vz))); - } - gl.glEnd(); + private void drawGrid(GL gl, int rows, int cols, + float scaleFactor, + float sx, float sy, float sz, + float ux, float uy, float uz, + float vx, float vy, float vz) { + int x, y; + + for(y=0; y<rows; y++) { + gl.glBegin(GL.GL_QUAD_STRIP); + for(x=0; x<=cols; x++) { + float u = x / (float) cols; + float v = y / (float) rows; + float v2 = v + (1.0f / (float) rows); + + gl.glTexCoord2f(u, v); + gl.glVertex3f(scaleFactor * (sx + (u*ux) + (v*vx)), + scaleFactor * (sy + (u*uy) + (v*vy)), + scaleFactor * (sz + (u*uz) + (v*vz))); + + gl.glTexCoord2f(u, v2); + gl.glVertex3f(scaleFactor * (sx + (u*ux) + (v2*vx)), + scaleFactor * (sy + (u*uy) + (v2*vy)), + scaleFactor * (sz + (u*uz) + (v2*vz))); } + gl.glEnd(); } + } - private void drawCylinder(GL gl, GLU glu) { - GLUquadric quad; + private void drawCylinder(GL gl) { + GLUquadric quad; - quad = glu.gluNewQuadric(); - glu.gluQuadricDrawStyle (quad, GLU.GLU_FILL); - glu.gluQuadricOrientation(quad, GLU.GLU_OUTSIDE); - glu.gluQuadricNormals (quad, GLU.GLU_SMOOTH); - glu.gluQuadricTexture (quad, true); + quad = glu.gluNewQuadric(); + glu.gluQuadricDrawStyle (quad, GLU.GLU_FILL); + glu.gluQuadricOrientation(quad, GLU.GLU_OUTSIDE); + glu.gluQuadricNormals (quad, GLU.GLU_SMOOTH); + glu.gluQuadricTexture (quad, true); - gl.glMatrixMode(GL.GL_MODELVIEW); - gl.glPushMatrix(); - gl.glTranslatef(-1.0f, 0.0f, 0.0f); - gl.glRotatef (90.0f, 0.0f, 1.0f, 0.0f); + gl.glMatrixMode(GL.GL_MODELVIEW); + gl.glPushMatrix(); + gl.glTranslatef(-1.0f, 0.0f, 0.0f); + gl.glRotatef (90.0f, 0.0f, 1.0f, 0.0f); - glu.gluCylinder(quad, 0.25f, 0.25f, 2.0f, 60, 30); - gl.glPopMatrix(); + glu.gluCylinder(quad, 0.25f, 0.25f, 2.0f, 60, 30); + gl.glPopMatrix(); - glu.gluDeleteQuadric(quad); - } + glu.gluDeleteQuadric(quad); } private static final String[] programNames = new String[] { @@ -1009,8 +1040,7 @@ public class VertexProgWarp { "END\n" }; - private void runExit() { - quit = true; + private static void runExit(final Animator animator) { // Note: calling System.exit() synchronously inside the draw, // reshape or init callbacks can lead to deadlocks on certain // platforms (in particular, X11) because the JAWT's locking |