/*******************************************************************************
 * 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;
	}
}
