diff options
Diffstat (limited to 'demos/src/jgudemos/BouncingText3D.java')
-rw-r--r-- | demos/src/jgudemos/BouncingText3D.java | 220 |
1 files changed, 113 insertions, 107 deletions
diff --git a/demos/src/jgudemos/BouncingText3D.java b/demos/src/jgudemos/BouncingText3D.java index 4be64a3..5c26768 100644 --- a/demos/src/jgudemos/BouncingText3D.java +++ b/demos/src/jgudemos/BouncingText3D.java @@ -1,6 +1,6 @@ /**
* Simple bouncing text example. Illustrates use of the TextRenderer3D class
- *
+ *
* Ric Wright
* June 2008
@@ -18,47 +18,53 @@ import java.util.ArrayList; import java.util.Iterator;
import java.util.Random;
-import javax.media.opengl.*;
-import javax.media.opengl.awt.*;
-import javax.media.opengl.glu.*;
+import com.jogamp.opengl.GL;
+import com.jogamp.opengl.GL2;
+import com.jogamp.opengl.GLAutoDrawable;
+import com.jogamp.opengl.GLEventListener;
+import com.jogamp.opengl.awt.GLCanvas;
+import com.jogamp.opengl.fixedfunc.GLLightingFunc;
+import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
+import com.jogamp.opengl.glu.GLU;
+import com.jogamp.opengl.glu.GLUquadric;
+import com.jogamp.opengl.util.Animator;
+
import javax.vecmath.Point3f;
import net.java.joglutils.jogltext.TextRenderer3D;
-import com.sun.opengl.util.Animator;
-
/**
* Simple class to demonstrate the use of compile/call with
* TextRenderer3D
- *
+ *
*/
public class BouncingText3D implements GLEventListener
{
TextRenderer3D tr3;
-
+
float[] LightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
float[] LightAmbient = { 0.8f, 0.8f, 0.8f, 1.0f };
float[] LightPosition = { 1.0f, 1.0f, 1.0f, 0.0f };
float[] mat_specular = { 1.0f, 1.0f, 1.0f, 1.0f };
float[] mat_ambient_magenta = { 1.0f, 0.0f, 1.0f, 1.0f };
- float[] mat_shininess = { 100.0f };
+ float[] mat_shininess = { 100.0f };
protected Random random = new Random();
public static final int NUM_ITEMS = 20;
public static final int MAX_ITEMS = 200;
private static int numItems = NUM_ITEMS;
- private ArrayList<TextInfo3D> textInfo = new ArrayList<TextInfo3D>();
+ private final ArrayList<TextInfo3D> textInfo = new ArrayList<TextInfo3D>();
- private GLU glu = new GLU();
+ private final GLU glu = new GLU();
protected GLUquadric QUADRIC;
/**
- * Main entry point for the app. The only argument that is parsed
+ * Main entry point for the app. The only argument that is parsed
* out is the number of items
* @param args
*/
- public static void main(String[] args)
+ public static void main(final String[] args)
{
if (args != null && Array.getLength(args) > 0)
{
@@ -68,9 +74,9 @@ public class BouncingText3D implements GLEventListener else if (numItems > MAX_ITEMS)
numItems = MAX_ITEMS;
}
-
- Frame frame = new Frame("Bouncing Text 3D");
- GLCanvas canvas = new GLCanvas();
+
+ final Frame frame = new Frame("Bouncing Text 3D");
+ final GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new BouncingText3D());
frame.add(canvas);
@@ -80,7 +86,7 @@ public class BouncingText3D implements GLEventListener {
@Override
- public void windowClosing(WindowEvent e)
+ public void windowClosing(final WindowEvent e)
{
// Run this on another thread than the AWT event queue to
// make sure the call to Animator.stop() completes before
@@ -96,7 +102,7 @@ public class BouncingText3D implements GLEventListener }).start();
}
});
-
+
// Center frame
frame.setLocationRelativeTo(null);
frame.setVisible(true);
@@ -107,37 +113,37 @@ public class BouncingText3D implements GLEventListener * Initialize the GL instance. Set up the lights and other
* variables and conditions specific to this class
*/
- public void init(GLAutoDrawable drawable)
+ public void init(final GLAutoDrawable drawable)
{
- QUADRIC = glu.gluNewQuadric();
+ QUADRIC = glu.gluNewQuadric();
- GL2 gl = drawable.getGL().getGL2();
+ final GL2 gl = drawable.getGL().getGL2();
System.out.println("INIT GL IS: " + gl.getClass().getName());
- System.out.println("init GL called. GL Class: " + gl.getClass().getName()
+ System.out.println("init GL called. GL Class: " + gl.getClass().getName()
+ " and this: " + this.getClass().getName());
gl.setSwapInterval(1);
// Setup the drawing area and shading mode
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- gl.glShadeModel(GL2.GL_SMOOTH);
-
- gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, LightAmbient, 0);
- gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, LightDiffuse, 0);
- gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, LightPosition, 0);
+ gl.glShadeModel(GLLightingFunc.GL_SMOOTH);
- gl.glEnable(GL2.GL_DEPTH_TEST);
- gl.glDepthFunc(GL2.GL_LESS);
+ gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, LightAmbient, 0);
+ gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, LightDiffuse, 0);
+ gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, LightPosition, 0);
- gl.glEnable(GL2.GL_BLEND);
- gl.glEnable(GL2.GL_LINE_SMOOTH);
- gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);
+ gl.glEnable(GL.GL_DEPTH_TEST);
+ gl.glDepthFunc(GL.GL_LESS);
+
+ gl.glEnable(GL.GL_BLEND);
+ gl.glEnable(GL.GL_LINE_SMOOTH);
+ gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
// Note that it has to be a TRUETYPE font - not OpenType. Apparently, AWT can't
// handle CFF glyphs
- tr3 = new TextRenderer3D(new Font("Times New Roman", Font.TRUETYPE_FONT, 3), 0.25f);
-
+ tr3 = new TextRenderer3D(new Font("Times New Roman", Font.TRUETYPE_FONT, 3), 0.25f);
+
// Create random text
textInfo.clear();
for (int i = 0; i < numItems; i++)
@@ -151,20 +157,20 @@ public class BouncingText3D implements GLEventListener * The shape or size of the viewport (client frame) has changed. We need to re-init
* the matrix stack, i.e. the GL_PROJECTION and then initialize back to the GL_MODELVIEW
*/
- public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
+ public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, int height)
{
- GL2 gl = drawable.getGL().getGL2();
+ final GL2 gl = drawable.getGL().getGL2();
if (height <= 0) // avoid a divide by zero error!
height = 1;
-
+
final float h = (float) width / (float) height;
gl.glViewport(0, 0, width, height);
- gl.glMatrixMode(GL2.GL_PROJECTION);
+ gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 20.0);
-
- gl.glMatrixMode(GL2.GL_MODELVIEW);
+
+ gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
}
@@ -172,15 +178,15 @@ public class BouncingText3D implements GLEventListener * Display needs to be re-rendered. This is where all the heavy-lifting
* gets done.
*/
- public void display(GLAutoDrawable drawable)
+ public void display(final GLAutoDrawable drawable)
{
- GL2 gl = drawable.getGL().getGL2();
+ final GL2 gl = drawable.getGL().getGL2();
// Clear the drawing area
- gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
+ gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
- gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, mat_specular, 0);
- gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SHININESS, mat_shininess, 0);
+ gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, mat_specular, 0);
+ gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, mat_shininess, 0);
// Reset the current matrix to the "identity"
gl.glLoadIdentity();
@@ -188,42 +194,42 @@ public class BouncingText3D implements GLEventListener gl.glTranslatef(0.0f, 0.0f, -3.0f);
gl.glRotatef(45.0f, 1, 0, 0);
gl.glRotatef(-30.0f, 0, 1, 0);
-
+
try
{
- gl.glEnable(GL2.GL_LIGHTING);
- gl.glEnable(GL2.GL_LIGHT0);
+ gl.glEnable(GLLightingFunc.GL_LIGHTING);
+ gl.glEnable(GLLightingFunc.GL_LIGHT0);
drawAxes(gl);
-
- for (Iterator iter = textInfo.iterator(); iter.hasNext();)
+
+ for (final Iterator iter = textInfo.iterator(); iter.hasNext();)
{
- TextInfo3D info = (TextInfo3D) iter.next();
-
+ final TextInfo3D info = (TextInfo3D) iter.next();
+
updateTextInfo( info );
-
+
gl.glPushAttrib(GL2.GL_TRANSFORM_BIT);
- gl.glMatrixMode(GL2.GL_MODELVIEW);
+ gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glPushMatrix();
- gl.glEnable( GL2.GL_NORMALIZE);
-
+ gl.glEnable( GLLightingFunc.GL_NORMALIZE);
+
gl.glTranslatef(info.position.x, info.position.y, info.position.z);
gl.glRotatef(info.angle.x, 1, 0, 0);
gl.glRotatef(info.angle.y, 0, 1, 0);
gl.glRotatef(info.angle.z, 0, 0, 1);
-
+
// System.out.println(" x,y,z: " + info.position.x + " " + info.position.y + " " + info.position.z + " angle: " + info.angle );
-
- gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT_AND_DIFFUSE, info.material, 0);
+
+ gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GLLightingFunc.GL_AMBIENT_AND_DIFFUSE, info.material, 0);
tr3.call(info.index);
-
+
gl.glPopMatrix();
- gl.glPopAttrib();
+ gl.glPopAttrib();
}
-
+
}
- catch (Exception e)
+ catch (final Exception e)
{
e.printStackTrace();
}
@@ -232,10 +238,10 @@ public class BouncingText3D implements GLEventListener /**
* No explicit cleanup necessary.
*/
- public void dispose(GLAutoDrawable drawable)
+ public void dispose(final GLAutoDrawable drawable)
{
}
-
+
//------------------ Private Stuff below here ------------------------------
private static final float INIT_ANG_VEL_MAG = 0.3f;
private static final float INIT_VEL_MAG = 0.25f;
@@ -265,11 +271,11 @@ public class BouncingText3D implements GLEventListener }
Point3f tmp = new Point3f();
-
- private void updateTextInfo( TextInfo3D info )
+
+ private void updateTextInfo( final TextInfo3D info )
{
// Update velocities and positions of all text
- float deltaT = 0.1f;
+ final float deltaT = 0.1f;
// Randomize things a little bit every little once in a while
if (random.nextInt(10000) == 0)
@@ -282,7 +288,7 @@ public class BouncingText3D implements GLEventListener tmp.set(info.angularVelocity);
tmp.scale(deltaT*deltaT);
info.angle.add(tmp);
-
+
tmp.set(info.velocity);
tmp.scale(deltaT);
info.position.add(tmp);
@@ -291,22 +297,22 @@ public class BouncingText3D implements GLEventListener info.angle.x = clampAngle(info.angle.x);
info.angle.y = clampAngle(info.angle.y);
info.angle.z = clampAngle(info.angle.z);
-
+
info.velocity.x = clampBounds(info.position.x, info.velocity.x );
info.velocity.y = clampBounds(info.position.y, info.velocity.y );
info.velocity.z = clampBounds(info.position.z, info.velocity.z );
}
- private float clampBounds( float pos, float velocity )
+ private float clampBounds( final float pos, float velocity )
{
if (pos < -MAX_BOUNDS || pos > MAX_BOUNDS)
{
velocity *= -1.0f;
}
-
+
return velocity;
}
-
+
private float clampAngle(float angle)
{
if (angle < 0)
@@ -317,23 +323,23 @@ public class BouncingText3D implements GLEventListener {
angle -= 360;
}
-
+
return angle;
}
-
+
private TextInfo3D randomTextInfo()
{
- TextInfo3D info = new TextInfo3D();
+ final TextInfo3D info = new TextInfo3D();
info.text = randomString();
info.angle = randomRotation(INIT_ANG_VEL_MAG, INIT_ANG_VEL_MAG, INIT_ANG_VEL_MAG);
info.position = randomVector(MAX_BOUNDS, MAX_BOUNDS, MAX_BOUNDS);
-
-
- Rectangle2D rect = tr3.getBounds(info.text, SCALE_FACTOR);
- float offX = (float) rect.getCenterX();
- float offY = (float) rect.getCenterY();
- float offZ = tr3.getDepth() / 2.0f;
+
+ final Rectangle2D rect = tr3.getBounds(info.text, SCALE_FACTOR);
+
+ final float offX = (float) rect.getCenterX();
+ final float offY = (float) rect.getCenterY();
+ final float offZ = tr3.getDepth() / 2.0f;
tr3.setDepth(0.1f + random.nextFloat() * 2.0f);
info.index = tr3.compile(info.text, -offX, offY, -offZ, SCALE_FACTOR);
@@ -341,11 +347,11 @@ public class BouncingText3D implements GLEventListener info.angularVelocity = randomRotation(INIT_ANG_VEL_MAG, INIT_ANG_VEL_MAG, INIT_ANG_VEL_MAG);
info.velocity = randomVelocity(INIT_VEL_MAG, INIT_VEL_MAG, INIT_VEL_MAG);
- Color c = randomColor();
+ final Color c = randomColor();
c.getColorComponents(info.material);
// Color doesn't set the opacity,so set it to some random non-zero value
info.material[3] = random.nextFloat() * 0.9f + 0.1f;
-
+
return info;
}
@@ -362,21 +368,21 @@ public class BouncingText3D implements GLEventListener }
}
- private Point3f randomVector(float x, float y, float z)
+ private Point3f randomVector(final float x, final float y, final float z)
{
return new Point3f(x * random.nextFloat(), y * random.nextFloat(), z * random.nextFloat());
}
- private Point3f randomVelocity(float x, float y, float z)
+ private Point3f randomVelocity(final float x, final float y, final float z)
{
return new Point3f(x * (random.nextFloat() - 0.5f), y * (random.nextFloat() - 0.5f), z * (random.nextFloat() - 0.5f));
}
- private Point3f randomRotation(float x, float y, float z)
+ private Point3f randomRotation(final float x, final float y, final float z)
{
return new Point3f(random.nextFloat() * 360.0f, random.nextFloat() * 360.0f, random.nextFloat() * 360.0f);
}
-
+
private Color randomColor()
{
// Get a bright and saturated color
@@ -390,21 +396,21 @@ public class BouncingText3D implements GLEventListener g = random.nextFloat();
b = random.nextFloat();
- float[] hsb = Color.RGBtoHSB((int) (255.0f * r), (int) (255.0f * g), (int) (255.0f * b), null);
+ final float[] hsb = Color.RGBtoHSB((int) (255.0f * r), (int) (255.0f * g), (int) (255.0f * b), null);
s = hsb[1];
- }
+ }
while ((r < 0.6f && g < 0.6f && b < 0.6f) || s < 0.8f);
-
+
return new Color(r, g, b);
}
-
+
// draw some striped-pole axes for visdual reference
- protected void drawAxes(GL2 gl)
+ protected void drawAxes(final GL2 gl)
{
- float[] mat_ambient_red = { 1.0f, 0.0f, 0.0f, 1.0f };
- float[] mat_ambient_green = { 0.0f, 1.0f, 0.0f, 1.0f };
- float[] mat_ambient_blue = { 0.0f, 0.0f, 1.0f, 1.0f };
-
+ final float[] mat_ambient_red = { 1.0f, 0.0f, 0.0f, 1.0f };
+ final float[] mat_ambient_green = { 0.0f, 1.0f, 0.0f, 1.0f };
+ final float[] mat_ambient_blue = { 0.0f, 0.0f, 1.0f, 1.0f };
+
drawAxis(gl, 2, mat_ambient_red);
drawAxis(gl, 0, mat_ambient_blue);
@@ -413,36 +419,36 @@ public class BouncingText3D implements GLEventListener }
// draw a single striped pole axis
- private void drawAxis(GL2 gl, int rot, float[] material )
+ private void drawAxis(final GL2 gl, final int rot, final float[] material )
{
- float[] mat_ambient_grey = { 0.5f, 0.5f, 0.5f, 1.0f };
+ final float[] mat_ambient_grey = { 0.5f, 0.5f, 0.5f, 1.0f };
final double AXIS_RADIUS = 0.01;
final int AXIS_HEIGHT = 5;
final float AXIS_STEP = 0.25f;
gl.glPushMatrix();
-
+
if (rot == 1)
gl.glRotatef(90, 1, 0, 0);
else if (rot == 0)
gl.glRotatef(90, 0, 1, 0);
-
- gl.glTranslatef(0.0f, 0.0f, (float)-AXIS_HEIGHT/2.0f);
-
+
+ gl.glTranslatef(0.0f, 0.0f, -AXIS_HEIGHT/2.0f);
+
float pos = -AXIS_HEIGHT/2.0f;
int i = 0;
while ( pos < AXIS_HEIGHT/2.0f )
{
if ((i++ & 1)==0)
- gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT_AND_DIFFUSE, material, 0);
+ gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT_AND_DIFFUSE, material, 0);
else
- gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT_AND_DIFFUSE, mat_ambient_grey, 0);
-
+ gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT_AND_DIFFUSE, mat_ambient_grey, 0);
+
glu.gluCylinder(QUADRIC, AXIS_RADIUS, AXIS_RADIUS, AXIS_STEP, 8, 1);
gl.glTranslatef(0.0f, 0.0f, AXIS_STEP);
pos += AXIS_STEP;
}
-
+
gl.glPopMatrix();
}
}
\ No newline at end of file |