package demo;
import java.awt.*; // for java Font class
import java.awt.event.*; // for handling keystrokes
import java.util.ArrayList;
import javax.media.opengl.*;
import jocode.*;
import jomodel.*;
/**
* Render 2D text using texture mapping. Text is drawn over a simple 3D
* scene and is incorporated into the scene as a texture on an object.
*
* The JOApp.buildfont() function creates a character set by texture-mapping
* images of characters onto quads.
*
* JOApp.print(String) renders text strings as a series of texture-mapped quads.
*
* The JOFont class takes a similar approach, but builds a character set
* dynamically using the Java Font class. Character images can drawn using
* any font that your system supports, with italics, bold, and in a wide
* ranges of sizes.
*
* Special thanks to NeHe and Giuseppe D'Agata for the "2D Texture Font"
* tutorial (http://nehe.gamedev.net).
*
* napier at potatoland dot org
*/
public class DemoText extends JOApp {
// Light position: if last value is 0, then this describes light direction. If 1, then light position.
float lightPosition[]= { 0f, 2f, 2f, 0f };
// sphere displaylist
int sphereDL;
// holds a texture mapped font
JOFont font;
// will hold the last characters typed
ArrayList toAdd = new ArrayList();
ArrayList lastchars = new ArrayList();
/**
* Start the application.
*/
public static void main(String args[]) {
DemoText demo = new DemoText();
windowTitle = "JOApp Text Demo";
displayWidth = 800;
displayHeight = 600;
demo.run();
}
/**
* Initialize the scene. Called by GLApp.run()
*/
@Override
public void setup() {
// setup and enable perspective
setPerspective();
// Create a white light
setLight(GL.GL_LIGHT1,
new float[] { 1f, 1f, 1f, 1f }, // diffuse
new float[] { .8f, .8f, .8f, 1f }, // ambient
new float[] { 1f, 1f, 1f, 1f }, // specular
lightPosition );
// off-white material, very shiny
setMaterial(new float[] {.6f,.6f,.45f,1}, 1f);
// lighten up the shadows a bit
setAmbientLight(new float[] {.35f, .45f, .5f, 1f});
// make a sphere display list
sphereDL = beginDisplayList(); {
renderSphere();
}
endDisplayList();
// Make a font object to render text
font = new JOFont( new Font("Trebuchet", Font.BOLD, 18) );
}
/**
* set the field of view and view depth.
*/
public void setPerspective() {
setPerspective(40f, .1f, 500f);
}
/**
* Render one frame. Called by GLApp.run().
*/
@Override
public void draw() {
// clear depth buffer and color
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
// select model view for subsequent transforms
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
// do gluLookAt() with viewpoint position, direction, orientation
glu.gluLookAt(0f, -3f, 33f, // where is the eye
0f, -3f, 0f, // what point are we looking at
0f, 1f, 0f); // which way is up
// create any new characters that were typed
for (String c : toAdd) createChar(c);
toAdd.clear();
// draw the scene
drawSpheres();
// Place the light.
setLightPosition(GL.GL_LIGHT1, lightPosition);
// render some text using a font
font.print(40, viewportH-100, "Type something:");
// render some text using texture-mapped font
print( 40, 210, "Text rendered with the default JOApp.print() function uses");
print( 40, 190, "a texture mapped fixed width font, loaded from an image file.");
// render some text using the GLFont class
font.print( 40,125, "Text rendered with the GLFont class generates a proportional spaced");
font.print( 40,100, "character set from a Java Font object.");
}
public void createChar(String c) {
// pick a font:
//Font font = new Font("Times New Roman", Font.BOLD, 120);
Font font = new Font("Comic Sans MS", Font.BOLD, 120);
//Font font = new Font("Courier New", Font.BOLD, 120);
// make a texture image of the character
int textureHandle = JOFont.makeCharTexture(font, c, JOMaterial.colorBlack, JOMaterial.colorWhite);
lastchars.add(textureHandle);
if (lastchars.size() > 7) {
int oldTxtr = lastchars.get(0);
deleteTexture(oldTxtr);
lastchars.remove(0);
}
}
public void drawSpheres() {
int leftpos = -12;
int texture = 0;
gl.glEnable(GL.GL_LIGHTING);
for (int i=0; i < 7; i++) {
texture = 0;
if (lastchars.size() > i) {
texture = ((Integer)lastchars.get(i)).intValue();
}
gl.glBindTexture(GL.GL_TEXTURE_2D, texture);
gl.glPushMatrix();
{
gl.glTranslatef(leftpos, 0, 0); // move
gl.glScalef(2f, 2f, 2f); // scale up
callDisplayList(sphereDL);
}
gl.glPopMatrix();
leftpos += 4;
}
}
/**
* Store keys as they are typed
*/
public void keyPressed(KeyEvent e) {
//super.keyPressed(e);
if (e.getKeyCode() >= KeyEvent.VK_SPACE) { // only printable characters
toAdd.add(String.valueOf(e.getKeyChar()));
}
}
}