|
This might work.
wz
/* * Created on Jul 7, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */
/** * @author w0zhang * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */
import java.awt.*; import java.awt.event.*;
import net.java.games.jogl.*; import net.java.games.jogl.util.*;
public class JoglTest implements GLEventListener, MouseListener, MouseMotionListener, KeyListener {
private Frame frame;
private Animator animator;
private GLCanvas canvas;
private float prevMouseX, prevMouseY; private float mouseX, mouseY; private float transX = 0f, transY = 0f, transZ = -10.0f; private boolean picked; private int pickedName;
private float view_rotX_1 = 0.0f, view_rotY_1 = 0.0f, view_rotZ = 0.0f; private float view_rotX_2 = 0.0f, view_rotY_2 = 0.0f; private final int test = 1;
private float fAspect;
float lambr = 0.0f; float lambg = 0.0f; float lambb = 0.0f; float ldifr = 1.0f; float ldifg = 1.0f; float ldifb = 1.0f; float lsper = 1.0f; float lspeg = 1.0f; float lspeb = 1.0f; float lposx = 0.8f; float lposy = 0.8f; float lposz = 0.8f;
float light_ambient[] = { lambr, lambg, lambb, 1.0f }; float light_diffuse[] = { ldifr, ldifg, ldifb, 1.0f }; float light_specular[] = { lsper, lspeg, lspeb, 1.0f }; float light_position[] = { lposx, lposy, lposz }; float global_ambient[] = { 0.75f, 0.75f, 0.75f, 1.0f }; float mambr = 0.25f; float mambg = 0.2f; float mambb = 0.074f; float mdifr = 0.57f; float mdifg = 0.14f; float mdifb = 0.17f; float msper = 0.8f; float mspeg = 0.65f; float mspeb = 0.25f; float ambient[] = { mambr, mambg, mambb, 1.0f }; float diffuse[] = { mdifr, mdifg, mdifb, 1.0f }; float specular[] = { msper, mspeg, mspeb, 1.0f }; float shininess = 20.0f;
private JoglTest() { System.out.println("JoglTest instance created");
// Canvas setup GLCapabilities caps = new GLCapabilities(); caps.setDoubleBuffered(true); caps.setAlphaBits(8); caps.setStencilBits(8); canvas = GLDrawableFactory.getFactory().createGLCanvas(caps);
canvas.addGLEventListener(this); canvas.setGL(new DebugGL(canvas.getGL())); canvas.addMouseListener(this); canvas.addMouseMotionListener(this); canvas.addKeyListener(this);
// Frame setup frame = new Frame("Vectrix"); frame.add(canvas); frame.setSize(800, 600);
frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { animator.stop(); System.exit(0); } });
// Event handlers animator = new Animator(canvas); }
public void initialiseDisplay() { frame.show(); }
public void run() { animator.start(); }
public static void main(String[] args) { System.out.println("Vectrix starting...");
JoglTest app = new JoglTest(); app.initialiseDisplay();
// Other loading/initialisation // ..
// Start main game loop app.run(); }
// GL Event Listener methods
// Called when GL has been initialised for the first time. public void init(GLDrawable drawable) { System.out.println("Vectrix.init(): GL init event");
GL gl = drawable.getGL();
// light properties gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light_ambient); gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, light_diffuse); gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, light_specular); gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_position); gl.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, global_ambient); // material properties gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, ambient); gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, diffuse); gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, specular); gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, shininess);
// various OpenGL states gl.glFrontFace(GL.GL_CW); gl.glEnable(GL.GL_LIGHTING); gl.glEnable(GL.GL_LIGHT0); gl.glEnable(GL.GL_AUTO_NORMAL); gl.glEnable(GL.GL_NORMALIZE); gl.glDepthFunc(GL.GL_LESS); gl.glEnable(GL.GL_DEPTH_TEST);
gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); gl.glMatrixMode(GL.GL_TEXTURE); gl.glLoadIdentity(); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity();
}
public void display(GLDrawable drawable) {
//System.err.println("DISPLAY THREAD: " + Thread.currentThread()); draw(drawable);
if (picked) processSelection(drawable, mouseX, mouseY); }
public void draw(GLDrawable drawable) {
//System.err.println("DISPLAY THREAD: " + Thread.currentThread()); GL gl = drawable.getGL(); GLU glu = drawable.getGLU(); //setLightmat(gl);
gl.glClearColor(0.2f, 0.2f, 0.2f, 0.0f); gl.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);
//gl.glColor3f(1f, 0f, 0f); float ambient[] = { 0.4f, 0.4f, 0.4f, 1.0f }; gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, ambient);
GLUT glut = new GLUT();
gl.glPushMatrix(); gl.glTranslatef(transX, transY, transZ); gl.glRotatef(view_rotX_1, 1.0f, 0.0f, 0.0f); gl.glRotatef(view_rotY_1, 0.0f, 1.0f, 0.0f); gl.glRotatef(view_rotZ, 0.0f, 0.0f, 1.0f);
//gl.glPushMatrix();
//gl.glTranslatef(0f, 0f, -3f); //gl.glRotatef(30f, 0f, 1f, 0f); gl.glInitNames(); gl.glPushName(0); gl.glLoadName(1); glut.glutWireSphere(glu, 0.5, 100, 100);
//gl.glPopMatrix(); //gl.glPopName(); gl.glPopMatrix();
gl.glPushMatrix(); gl.glTranslatef(transX - 2, transY, transZ); gl.glRotatef(view_rotX_2, 1.0f, 0.0f, 0.0f); gl.glRotatef(view_rotY_2, 0.0f, 1.0f, 0.0f); gl.glRotatef(view_rotZ, 0.0f, 0.0f, 1.0f);
//gl.glPushMatrix();
//gl.glTranslatef(0f, 0f, -3f); //gl.glRotatef(30f, 0f, 1f, 0f);
gl.glLoadName(2);
glut.glutSolidTetrahedron(gl);
//gl.glPopMatrix(); //gl.glPopName(); gl.glPopMatrix(); gl.glFlush();
}
public void reshape( GLDrawable drawable, int x, int y, int width, int height) { //System.err.println("RESHAPE THREAD: " + Thread.currentThread()); GL gl = drawable.getGL(); GLU glu = drawable.getGLU(); fAspect = (float) width / (float) height;
// l/r b/t near/far //gl.glMatrixMode(GL.GL_PROJECTION); //gl.glOrtho(0, 4, 0, 3, -8, 8);
gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(30.0, (float) width / (float) height, 1.0, 50); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); //glu.gluLookAt(0.0, 0, 10, 0, 0, 0, 0, 1, 0);
}
public void displayChanged(GLDrawable arg0, boolean arg1, boolean arg2) { }
public void processSelection(GLDrawable drawable, float x, float y) { GL gl = drawable.getGL(); GLU glu = drawable.getGLU(); int[] selectBuff = new int[64]; int hits = 0; int[] viewport = new int[4];
gl.glSelectBuffer(64, selectBuff); gl.glGetIntegerv(GL.GL_VIEWPORT, viewport); gl.glMatrixMode(GL.GL_PROJECTION); gl.glPushMatrix();
gl.glRenderMode(GL.GL_SELECT); gl.glLoadIdentity(); glu.gluPickMatrix(x, viewport[3] - y, 5, 5, viewport); glu.gluPerspective(30.0f, fAspect, 1.0, 50); draw(drawable); hits = gl.glRenderMode(GL.GL_RENDER); if (hits > 0) { int count = selectBuff[0]; pickedName = selectBuff[3]; System.out.println(count + " " + pickedName);
} else { System.out.println("no hit"); pickedName = 0; }
gl.glMatrixMode(GL.GL_PROJECTION); gl.glPopMatrix(); gl.glMatrixMode(GL.GL_MODELVIEW); picked = false;
}
public void processKey(KeyEvent event) { int key = event.getKeyCode();
if (event.isControlDown() && key == KeyEvent.VK_DOWN) { transY -= 0.1f; } else if (event.isControlDown() && key == KeyEvent.VK_UP) { transY += 0.1f; } else if (key == KeyEvent.VK_DOWN) { transZ += 0.1f; } else if (key == KeyEvent.VK_UP) { transZ -= 0.1f; } else if (key == KeyEvent.VK_LEFT) { transX -= 0.1f; } else if (key == KeyEvent.VK_RIGHT) { transX += 0.1f; } }
public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { prevMouseX = e.getX(); prevMouseY = e.getY(); mouseX = e.getX(); mouseY = e.getY(); picked = true; }
public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) { int x = e.getX(); int y = e.getY();
Dimension size = e.getComponent().getSize(); //System.out.println(size.width + " " + size.height);
float thetaY = 360.0f * (float) (x - prevMouseX) / (float) size.width; float thetaX = 360.0f * (float) (prevMouseY - y) / (float) size.height;
prevMouseX = x; prevMouseY = y;
switch(pickedName){ case 1: view_rotX_1 += thetaX; view_rotY_1 += thetaY; break; case 2: view_rotX_2 += thetaX; view_rotY_2 += thetaY; break; } }
public void mouseMoved(MouseEvent e) { }
public void keyPressed(KeyEvent e) { processKey(e); }
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
} }
|