blob: db654b1b900711bf41c990d9d39d8e38022885a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.opengl.examples;
import org.eclipse.opengl.*;
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
class ReflectionTab extends OpenGLTab {
private float ballY = 0.0f;
private float ballZ = 1.6666666f;
private float ballX = 0.0f;
private float ballRot = 0.0f;
private float cubeX = 2.5f;
private float cubeY = -2.0f;
private float cubeZ = 2.0f;
private float xPos = 0.0f;
private float yPos = 0.0f;
private float zPos = 22.0f;
private float ballRotSpeed = 0.0f;
private int quadratic;
private int[] textures = new int[3];
private final static int
LIST_INDEX_BALL = 1,LIST_INDEX_BOX = 2,
LIST_INDEX_MIRROR = 3, LIST_INDEX_ROOM = 4;
private final static int
TEXTURE_INDEX_BALL = 0, TEXTURE_INDEX_FLOOR = 1,
TEXTURE_INDEX_BOX = 2;
private final static String[] IMAGES = {
"images/Ball.jpg", "images/Floor.jpg", "images/Box.bmp" };
private final static int SLEEP_LENGTH = 50;
/**
* Draws the ball
*/
void createBall() {
GL.glNewList(LIST_INDEX_BALL, GL.GL_COMPILE);
GL.glColor3f(1.0f, 1.0f, 1.0f);
GL.glBindTexture(GL.GL_TEXTURE_2D, textures[TEXTURE_INDEX_BALL]);
GLU.gluSphere(quadratic, 0.35f, 32, 16);
GL.glDisable(GL.GL_BLEND);
GL.glEndList();
}
/**
* Draws the box
*/
void createBox() {
float size = 1.0f;
GL.glNewList(LIST_INDEX_BOX, GL.GL_COMPILE);
GL.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
GL.glBindTexture(GL.GL_TEXTURE_2D, textures[TEXTURE_INDEX_BOX]);
GL.glBegin(GL.GL_QUADS);
// front
GL.glNormal3f(0.0f, 0.0f, 1.0f);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-size, -size, size);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(size, -size, size);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(size, size, size);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(-size, size, size);
// back
GL.glNormal3f(0.0f, 0.0f, -1.0f);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-size, -size, -size);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(size, -size, -size);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(size, size, -size);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(-size, size, -size);
// left
GL.glNormal3f(-1.0f, 0.0f, 0.0f);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-size, -size, -size);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(-size, -size, size);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(-size, size, size);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(-size, size, -size);
// right
GL.glNormal3f(1.0f, 0.0f, 0.0f);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(size, -size, -size);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(size, -size, size);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(size, size, size);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(size, size, -size);
// top
GL.glNormal3f(0.0f, 1.0f, 0.0f);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(size, size, -size);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(-size, size, -size);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(-size, size, size);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(size, size, size);
// bottom
GL.glNormal3f(0.0f, -1.0f, 0.0f);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(size, -size, -size);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(-size, -size, -size);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(-size, -size, size);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(size, -size, size);
GL.glEnd();
GL.glEndList();
}
/**
* @see OpenGLTab#createControls(Composite)
*/
void createControls(Composite composite) {
Group ballTranslation = new Group(composite, SWT.NONE);
ballTranslation.setLayout(new GridLayout(2, false));
ballTranslation.setText("Ball Translation");
new Label(ballTranslation, SWT.NONE).setText("X:");
final Slider ballXPosSlider = new Slider(ballTranslation, SWT.NONE);
ballXPosSlider.setIncrement(1);
ballXPosSlider.setMaximum(38);
ballXPosSlider.setMinimum(0);
ballXPosSlider.setThumb(2);
ballXPosSlider.setPageIncrement(2);
ballXPosSlider.setSelection(18);
ballXPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
ballX = (float) (ballXPosSlider.getSelection() - 18) / 5;
}
});
new Label(ballTranslation, SWT.NONE).setText("Y:");
final Slider ballYPosSlider = new Slider(ballTranslation, SWT.NONE);
ballYPosSlider.setIncrement(1);
ballYPosSlider.setMaximum(38);
ballYPosSlider.setMinimum(0);
ballYPosSlider.setThumb(2);
ballYPosSlider.setPageIncrement(2);
ballYPosSlider.setSelection(18);
ballYPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
ballY = (float) (ballYPosSlider.getSelection() - 18) / 5;
}
});
new Label(ballTranslation, SWT.NONE).setText("Z:");
final Slider ballZPosSlider = new Slider(ballTranslation, SWT.NONE);
ballZPosSlider.setIncrement(1);
ballZPosSlider.setMaximum(24);
ballZPosSlider.setMinimum(0);
ballZPosSlider.setThumb(1);
ballZPosSlider.setPageIncrement(2);
ballZPosSlider.setSelection(4);
ballZPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
ballZ = (float) (ballZPosSlider.getSelection() + 1) / 3;
}
});
Group cubeTranslation = new Group(composite, SWT.NONE);
cubeTranslation.setLayout(new GridLayout(2, false));
cubeTranslation.setText("Cube Translation");
new Label(cubeTranslation, SWT.NONE).setText("X:");
final Slider cubeXPosSlider = new Slider(cubeTranslation, SWT.NONE);
cubeXPosSlider.setIncrement(1);
cubeXPosSlider.setMaximum(14);
cubeXPosSlider.setMinimum(0);
cubeXPosSlider.setThumb(2);
cubeXPosSlider.setPageIncrement(2);
cubeXPosSlider.setSelection(11);
cubeXPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
cubeX = (float) (cubeXPosSlider.getSelection() - 6) / 2;
}
});
new Label(cubeTranslation, SWT.NONE).setText("Y:");
final Slider cubeYPosSlider = new Slider(cubeTranslation, SWT.NONE);
cubeYPosSlider.setIncrement(1);
cubeYPosSlider.setMaximum(14);
cubeYPosSlider.setMinimum(0);
cubeYPosSlider.setThumb(2);
cubeYPosSlider.setPageIncrement(2);
cubeYPosSlider.setSelection(2);
cubeYPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
cubeY = (float) (cubeYPosSlider.getSelection() - 6) / 2;
}
});
new Label(cubeTranslation, SWT.NONE).setText("Z:");
final Slider cubeZPosSlider = new Slider(cubeTranslation, SWT.NONE);
cubeZPosSlider.setIncrement(1);
cubeZPosSlider.setMaximum(10);
cubeZPosSlider.setMinimum(1);
cubeZPosSlider.setThumb(1);
cubeZPosSlider.setPageIncrement(2);
cubeZPosSlider.setSelection(2);
cubeZPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
cubeZ = (float) (cubeZPosSlider.getSelection() + 2) / 2;
}
});
Group movementGroup = new Group(composite, SWT.NONE);
movementGroup.setLayout(new GridLayout(2, false));
movementGroup.setText("Room Rotation");
new Label(movementGroup, SWT.NONE).setText("X:");
final Slider screenXPosSlider = new Slider(movementGroup, SWT.NONE);
screenXPosSlider.setIncrement(1);
screenXPosSlider.setMaximum(42);
screenXPosSlider.setMinimum(0);
screenXPosSlider.setThumb(2);
screenXPosSlider.setPageIncrement(2);
screenXPosSlider.setSelection(20);
screenXPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
xPos = screenXPosSlider.getSelection() - 20;
}
});
new Label(movementGroup, SWT.NONE).setText("Y:");
final Slider screenYPosSlider = new Slider(movementGroup, SWT.NONE);
screenYPosSlider.setIncrement(1);
screenYPosSlider.setMaximum(42);
screenYPosSlider.setMinimum(0);
screenYPosSlider.setThumb(2);
screenYPosSlider.setPageIncrement(2);
screenYPosSlider.setSelection(20);
screenYPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
yPos = screenYPosSlider.getSelection() - 20;
}
});
new Label(movementGroup, SWT.NONE).setText("Z:");
final Slider screenZPosSlider = new Slider(movementGroup, SWT.NONE);
screenZPosSlider.setIncrement(1);
screenZPosSlider.setMaximum(42);
screenZPosSlider.setMinimum(0);
screenZPosSlider.setThumb(2);
screenZPosSlider.setPageIncrement(2);
screenZPosSlider.setSelection(20);
screenZPosSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
zPos = screenZPosSlider.getSelection() + 2;
}
});
new Label(composite, SWT.NONE).setText("Ball Rotation Speed:");
final Slider ballRotSlider = new Slider(composite, SWT.NONE);
ballRotSlider.setIncrement(1);
ballRotSlider.setMaximum(22);
ballRotSlider.setMinimum(0);
ballRotSlider.setThumb(2);
ballRotSlider.setPageIncrement(2);
ballRotSlider.setSelection(0);
ballRotSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
ballRotSpeed = ballRotSlider.getSelection();
}
});
}
/**
* Draws the mirror
*/
void createMirror() {
GL.glNewList(LIST_INDEX_MIRROR, GL.GL_COMPILE);
GL.glDisable(GL.GL_TEXTURE_2D);
GL.glColor4f(1.0f, 1.0f, 1.0f, 0.4f);
GL.glNormal3f(0.0f, 0.0f, 1.0f);
GL.glBegin(GL.GL_QUADS);
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-2.0f, 2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(-2.0f, -2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(2.0f, -2.0f, 0.0f);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(2.0f, 2.0f, 0.0f);
GL.glEnd();
GL.glEnable(GL.GL_TEXTURE_2D);
GL.glEndList();
}
/**
* Draws the room
*/
void createRoom() {
GL.glNewList(LIST_INDEX_ROOM, GL.GL_COMPILE);
GL.glDisable(GL.GL_TEXTURE_2D);
GL.glBegin(GL.GL_QUADS);
// left wall
GL.glNormal3f(1.0f, 0.0f, 0.0f);
GL.glVertex3f(-4.0f, 4.0f, 0.0f);
GL.glVertex3f(-4.0f, 4.0f, 6.0f);
GL.glVertex3f(-4.0f, -4.0f, 6.0f);
GL.glVertex3f(-4.0f, -4.0f, 0.0f);
// right wall
GL.glNormal3f(-1.0f, 0.0f, 01.0f);
GL.glVertex3f(4.0f, 4.0f, 0.0f);
GL.glVertex3f(4.0f, 4.0f, 6.0f);
GL.glVertex3f(4.0f, -4.0f, 6.0f);
GL.glVertex3f(4.0f, -4.0f, 0.0f);
// ceiling
GL.glNormal3f(0.0f, -1.0f, 0.0f);
GL.glColor3f(0.9f, 0.9f, 0.9f);
GL.glVertex3f(-4.0f, 4.0f, 0.0f);
GL.glVertex3f(-4.0f, 4.0f, 6.0f);
GL.glVertex3f(4.0f, 4.0f, 6.0f);
GL.glVertex3f(4.0f, 4.0f, 0.0f);
GL.glEnd();
// back wall with triangle strip to illiminate t-intersections
GL.glBegin(GL.GL_TRIANGLE_STRIP);
GL.glNormal3f(0.0f, 0.0f, 1.0f);
GL.glVertex3d(-4.0, -4.0, 0.0);
GL.glVertex3d(-2.2, -4.0, 0.0);
GL.glVertex3d(-2.2, -2.2, 0.0);
GL.glVertex3d(2.2, -4.0, 0.0);
GL.glVertex3d(2.2, -2.2, 0.0);
GL.glVertex3d(4.0, -4.0, 0.0);
GL.glVertex3d(2.2, -2.2, 0.0);
GL.glVertex3d(4.0, -2.2, 0.0);
GL.glVertex3d(2.2, 2.2, 0.0);
GL.glVertex3d(4.0, 2.2, 0.0);
GL.glVertex3d(2.2, 2.2, 0.0);
GL.glVertex3d(4.0, 4.0, 0.0);
GL.glVertex3d(2.2, 2.2, 0.0);
GL.glVertex3d(2.2, 4.0, 0.0);
GL.glVertex3d(-2.2, 2.2, 0.0);
GL.glVertex3d(-2.2, 4.0, 0.0);
GL.glVertex3d(-4.0, 4.0, 0.0);
GL.glVertex3d(-2.2, 2.2, 0.0);
GL.glVertex3d(-4.0, 2.2, 0.0);
GL.glVertex3d(-2.2, -2.2, 0.0);
GL.glVertex3d(-4.0, -2.2, 0.0);
GL.glVertex3d(-4.0, -4.0, 0.0);
GL.glEnd();
GL.glEnable(GL.GL_TEXTURE_2D);
// draw floor
GL.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
GL.glBindTexture(GL.GL_TEXTURE_2D, textures[TEXTURE_INDEX_FLOOR]);
GL.glNormal3f(0.0f, 1.0f, 0.0f);
GL.glBegin(GL.GL_QUADS);
// floor
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-4.0f, -4.0f, 6.0f);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(-4.0f, -4.0f, 0.0f);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(4.0f, -4.0f, 0.0f);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(4.0f, -4.0f, 6.0f);
GL.glEnd();
// draw mirror frame
GL.glBindTexture(GL.GL_TEXTURE_2D, textures[TEXTURE_INDEX_BOX]);
GL.glNormal3f(0.0f, 0.0f, 1.0f);
GL.glBegin(GL.GL_QUADS);
// top
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-2.2f, 2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(2.2f, 2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(2.2f, 2.2f, 0.0f);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(-2.2f, 2.2f, 0.0f);
// right
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(2.0f, 2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(2.0f, -2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(2.2f, -2.0f, 0.0f);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(2.2f, 2.0f, 0.0f);
// bottom
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-2.2f, -2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(2.2f, -2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(2.2f, -2.2f, 0.0f);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(-2.2f, -2.2f, 0.0f);
// left
GL.glTexCoord2f(0.0f, 0.0f);
GL.glVertex3f(-2.0f, 2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 0.0f);
GL.glVertex3f(-2.0f, -2.0f, 0.0f);
GL.glTexCoord2f(1.0f, 1.0f);
GL.glVertex3f(-2.2f, -2.0f, 0.0f);
GL.glTexCoord2f(0.0f, 1.0f);
GL.glVertex3f(-2.2f, 2.0f, 0.0f);
GL.glEnd();
GL.glEndList();
}
/**
* @see OpenGLTab#dispose()
*/
void dispose() {
super.dispose();
GLU.gluDeleteQuadric(quadratic);
GL.glDeleteLists(LIST_INDEX_BALL, 1);
GL.glDeleteLists(LIST_INDEX_BOX, 1);
GL.glDeleteLists(LIST_INDEX_MIRROR, 1);
GL.glDeleteLists(LIST_INDEX_ROOM, 1);
}
/**
* @see OpenGLTab#getSleepLength()
*/
int getSleepLength() {
return SLEEP_LENGTH;
}
/**
* @see OpenGLTab#getTabText()
*/
String getTabText() {
return "Reflection";
}
/**
* @see OpenGLTab#init()
*/
void init() {
if (!hasStencilSupport()) return;
GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
GL.glClearDepth(1.0f);
GL.glClearStencil(0);
GL.glGenTextures(IMAGES.length, textures);
for (int i = 0; i < IMAGES.length; i++) {
loadTexture(getGlCanvas(), IMAGES[i], i, textures);
}
GL.glShadeModel(GL.GL_SMOOTH);
quadratic = GLU.gluNewQuadric();
GLU.gluQuadricNormals(quadratic, GL.GL_SMOOTH);
GLU.gluQuadricTexture(quadratic, true);
GL.glDepthFunc(GL.GL_LEQUAL);
GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
// set up the lights
float[] LightAmb = { 0.7f, 0.7f, 0.7f, 1.0f };
float[] LightDif = { 1.0f, 1.0f, 1.0f, 1.0f };
float[] lightsAmbient = { 0.5f, 0.5f, 0.5f, 1.0f };
GL.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, lightsAmbient);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, LightAmb);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, LightDif);
GL.glEnable(GL.GL_LIGHT0);
GL.glEnable(GL.GL_LIGHTING);
GL.glEnable(GL.GL_LINE_SMOOTH);
GL.glEnable(GL.GL_DEPTH_TEST);
GL.glEnable(GL.GL_TEXTURE_2D);
GL.glEnable(GL.GL_BLEND);
createRoom();
createBall();
createBox();
createMirror();
}
/**
* @see OpenGLTab#isStencilSupportNeeded
*/
boolean isStencilSupportNeeded() {
return true;
}
/**
* @see OpenGLTab#renderScene()
*/
void renderScene() {
GL.glClear(
GL.GL_COLOR_BUFFER_BIT
| GL.GL_DEPTH_BUFFER_BIT
| GL.GL_STENCIL_BUFFER_BIT);
GL.glLoadIdentity();
GLU.gluLookAt(xPos, yPos, zPos, 0, 0, 0, 0, 1, 0);
// clip plane equation
double clipEquation[] = { 0.0f, 0.0f, -1.0f, 0.0f };
float[] LightPos = { 0.0f, 2.0f, 7.0f, 1.0f };
GL.glColorMask(false, false, false, false);
// enable stencil buffer for "marking" the mirror
GL.glEnable(GL.GL_STENCIL_TEST);
// set the stencil buffer to 1 where a polygon is drawn
GL.glStencilFunc(GL.GL_ALWAYS, 1, 1);
GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_REPLACE);
GL.glDisable(GL.GL_DEPTH_TEST);
GL.glCallList(LIST_INDEX_MIRROR);
GL.glEnable(GL.GL_DEPTH_TEST);
GL.glColorMask(true, true, true, true);
GL.glStencilFunc(GL.GL_EQUAL, 1, 1);
// draw where the stencil is 1
GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_KEEP);
GL.glEnable(GL.GL_CLIP_PLANE0);
GL.glClipPlane(GL.GL_CLIP_PLANE0, clipEquation);
GL.glPushMatrix();
GL.glScalef(1.0f, 1.0f, -1.0f);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, LightPos);
GL.glCallList(LIST_INDEX_ROOM); // reflection
GL.glPushMatrix();
GL.glTranslatef(cubeX, cubeY, cubeZ);
GL.glCallList(LIST_INDEX_BOX); // reflection
GL.glPopMatrix();
GL.glTranslatef(ballX, ballY, ballZ);
GL.glRotatef(ballRot, 1.0f, 0.0f, 0.0f);
GL.glCallList(LIST_INDEX_BALL); // reflection
GL.glPopMatrix();
GL.glDisable(GL.GL_CLIP_PLANE0);
GL.glDisable(GL.GL_STENCIL_TEST);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, LightPos);
GL.glEnable(GL.GL_BLEND);
GL.glDisable(GL.GL_LIGHTING);
GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
GL.glCallList(LIST_INDEX_MIRROR);
GL.glEnable(GL.GL_LIGHTING);
GL.glDisable(GL.GL_BLEND);
GL.glCallList(LIST_INDEX_ROOM);
GL.glPushMatrix();
GL.glTranslatef(cubeX, cubeY, cubeZ);
GL.glCallList(LIST_INDEX_BOX);
GL.glPopMatrix();
GL.glTranslatef(ballX, ballY, ballZ);
GL.glRotatef(ballRot, 1.0f, 0.0f, 0.0f);
GL.glCallList(LIST_INDEX_BALL);
ballRot += ballRotSpeed;
}
}