/*******************************************************************************
* 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.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
class LightTab extends OpenGLTab {
private float[] materialShininess = { 25.0f };
private float[] lightPosition = { 0.0f, 0.0f, 0.0f, 1.0f };
private float[][] colorValues = {
{ 1.0f, 1.0f, 1.0f, 1.0f }, // light diffuse
{ 1.0f, 1.0f, 1.0f, 1.0f }, // light ambient
{ 1.0f, 1.0f, 1.0f, 1.0f }, // light specular
{ 0.5f, 0.5f, 0.5f, 1.0f }, // light main ambient
{ 0.0f, 0.0f, 1.0f, 1.0f }, // material diffuse
{ 0.3f, 0.3f, 0.3f, 1.0f }, // material ambient
{ 1.0f, 1.0f, 1.0f, 1.0f } // material specular
};
private float yPos = 0.0f, xPos = 0.0f, zPos = -20.0f;
private int quadratic, sphere;
/**
* @see OpenGLTab#createControls(Composite)
*/
void createControls(Composite composite) {
Group movementGroup = new Group(composite, SWT.NONE);
movementGroup.setText("Translation");
movementGroup.setLayout(new GridLayout(2, false));
new Label(movementGroup, SWT.NONE).setText("X:");
final Slider xMove = new Slider(movementGroup, SWT.NONE);
xMove.setIncrement(1);
xMove.setMaximum(22);
xMove.setMinimum(0);
xMove.setThumb(2);
xMove.setPageIncrement(2);
xMove.setSelection(10);
xMove.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
xPos = xMove.getSelection() - 10;
}
});
new Label(movementGroup, SWT.NONE).setText("Y:");
final Slider yMove = new Slider(movementGroup, SWT.NONE);
yMove.setIncrement(1);
yMove.setMaximum(22);
yMove.setMinimum(0);
yMove.setThumb(2);
yMove.setPageIncrement(2);
yMove.setSelection(10);
yMove.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
yPos = yMove.getSelection() - 10;
}
});
new Label(movementGroup, SWT.NONE).setText("Z:");
final Slider zMove = new Slider(movementGroup, SWT.NONE);
zMove.setIncrement(1);
zMove.setMaximum(22);
zMove.setMinimum(0);
zMove.setThumb(2);
zMove.setPageIncrement(2);
zMove.setSelection(10);
zMove.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
zPos = zMove.getSelection() - 30;
}
});
Group positionGroup = new Group(composite, SWT.NONE);
positionGroup.setText("Light Position");
positionGroup.setLayout(new GridLayout(2, false));
new Label(positionGroup, SWT.NONE).setText("X:");
final Slider lightX = new Slider(positionGroup, SWT.NONE);
lightX.setIncrement(1);
lightX.setMaximum(22);
lightX.setMinimum(0);
lightX.setThumb(2);
lightX.setPageIncrement(2);
lightX.setSelection(10);
lightX.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
lightPosition[0] = ((float) lightX.getSelection() * 10) - 100;
}
});
new Label(positionGroup, SWT.NONE).setText("Y:");
final Slider lightY = new Slider(positionGroup, SWT.NONE);
lightY.setIncrement(1);
lightY.setMaximum(22);
lightY.setMinimum(0);
lightY.setThumb(2);
lightY.setPageIncrement(2);
lightY.setSelection(10);
lightY.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
lightPosition[1] = ((float) lightY.getSelection() * 10) - 100;
}
});
new Label(positionGroup, SWT.NONE).setText("Z:");
final Slider lightZ = new Slider(positionGroup, SWT.NONE);
lightZ.setIncrement(1);
lightZ.setMaximum(22);
lightZ.setMinimum(0);
lightZ.setThumb(2);
lightZ.setPageIncrement(2);
lightZ.setSelection(10);
lightZ.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
lightPosition[2] = ((float) lightZ.getSelection() * 10) - 20;
}
});
Group lightColorsGroup = new Group(composite, SWT.NONE);
lightColorsGroup.setText("Light Colors");
lightColorsGroup.setLayout(new GridLayout());
GridData data = new GridData(GridData.FILL_BOTH);
lightColorsGroup.setLayoutData(data);
ColorSelectionGroup lightDiffuseButton =
new ColorSelectionGroup(lightColorsGroup, SWT.NONE);
lightDiffuseButton.setText("Diffuse");
lightDiffuseButton.setRGB(
new RGB(
(int) (colorValues[0][0] * 255),
(int) (colorValues[0][1] * 255),
(int) (colorValues[0][2] * 255)));
lightDiffuseButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[0][0] = ((float) rgb.red) / 255;
colorValues[0][1] = ((float) rgb.green) / 255;
colorValues[0][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
ColorSelectionGroup lightAmbientButton =
new ColorSelectionGroup(lightColorsGroup, SWT.NONE);
lightAmbientButton.setText("Ambient");
lightAmbientButton.setRGB(
new RGB(
(int) (colorValues[1][0] * 255),
(int) (colorValues[1][1] * 255),
(int) (colorValues[1][2] * 255)));
lightAmbientButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[1][0] = ((float) rgb.red) / 255;
colorValues[1][1] = ((float) rgb.green) / 255;
colorValues[1][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
ColorSelectionGroup lightSpecularButton =
new ColorSelectionGroup(lightColorsGroup, SWT.NONE);
lightSpecularButton.setText("Specular");
lightSpecularButton.setRGB(
new RGB(
(int) (colorValues[2][0] * 255),
(int) (colorValues[2][1] * 255),
(int) (colorValues[2][2] * 255)));
lightSpecularButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[2][0] = ((float) rgb.red) / 255;
colorValues[2][1] = ((float) rgb.green) / 255;
colorValues[2][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
ColorSelectionGroup lightMainAmbientButton =
new ColorSelectionGroup(lightColorsGroup, SWT.NONE);
lightMainAmbientButton.setText("Main Ambient");
lightMainAmbientButton.setRGB(
new RGB(
(int) (colorValues[3][0] * 255),
(int) (colorValues[3][1] * 255),
(int) (colorValues[3][2] * 255)));
lightMainAmbientButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[3][0] = ((float) rgb.red) / 255;
colorValues[3][1] = ((float) rgb.green) / 255;
colorValues[3][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
Group materialColorsGroup = new Group(composite, SWT.NONE);
materialColorsGroup.setText("Material Colors");
materialColorsGroup.setLayout(new GridLayout());
data = new GridData(GridData.FILL_BOTH);
materialColorsGroup.setLayoutData(data);
ColorSelectionGroup materialDiffuseButton =
new ColorSelectionGroup(materialColorsGroup, SWT.NONE);
materialDiffuseButton.setText("Diffuse");
materialDiffuseButton.setRGB(
new RGB(
(int) (colorValues[4][0] * 255),
(int) (colorValues[4][1] * 255),
(int) (colorValues[4][2] * 255)));
materialDiffuseButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[4][0] = ((float) rgb.red) / 255;
colorValues[4][1] = ((float) rgb.green) / 255;
colorValues[4][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
ColorSelectionGroup materialAmbientButton =
new ColorSelectionGroup(materialColorsGroup, SWT.NONE);
materialAmbientButton.setText("Ambient");
materialAmbientButton.setRGB(
new RGB(
(int) (colorValues[5][0] * 255),
(int) (colorValues[5][1] * 255),
(int) (colorValues[5][2] * 255)));
materialAmbientButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[5][0] = ((float) rgb.red) / 255;
colorValues[5][1] = ((float) rgb.green) / 255;
colorValues[5][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
ColorSelectionGroup materialSpecularButton =
new ColorSelectionGroup(materialColorsGroup, SWT.NONE);
materialSpecularButton.setText("Specular");
materialSpecularButton.setRGB(
new RGB(
(int) (colorValues[6][0] * 255),
(int) (colorValues[6][1] * 255),
(int) (colorValues[6][2] * 255)));
materialSpecularButton
.addColorSelectionListener(new IColorSelectionListener() {
public void handleColorSelection(RGB rgb) {
colorValues[6][0] = ((float) rgb.red) / 255;
colorValues[6][1] = ((float) rgb.green) / 255;
colorValues[6][2] = ((float) rgb.blue) / 255;
setColorValues();
}
});
new Label(composite, SWT.NONE).setText("Material Shininess:");
final Slider shineSlider = new Slider(composite, SWT.NONE);
shineSlider.setIncrement(5);
shineSlider.setMaximum(102);
shineSlider.setMinimum(0);
shineSlider.setThumb(2);
shineSlider.setPageIncrement(10);
shineSlider.setSelection(25);
shineSlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
materialShininess[0] = shineSlider.getSelection();
GL.glMaterialfv(GL.GL_FRONT_AND_BACK,
GL.GL_SHININESS,
materialShininess);
}
});
}
/**
* @see OpenGLTab#dispose()
*/
void dispose() {
super.dispose();
GLU.gluDeleteQuadric(quadratic);
GL.glDeleteLists(sphere, 1);
}
/**
* @see OpenGLTab#getTabText()
*/
String getTabText() {
return "Light";
}
/**
* @see OpenGLTab#init()
*/
void init() {
GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
GL.glClearDepth(1.0);
setColorValues();
GL.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SHININESS, materialShininess);
quadratic = GLU.gluNewQuadric();
GLU.gluQuadricNormals(quadratic, GLU.GLU_SMOOTH);
GL.glHint(GL.GL_LINE_SMOOTH_HINT, GL.GL_NICEST);
GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
GL.glPointSize(2.0f);
GL.glEnable(GL.GL_LIGHTING);
GL.glEnable(GL.GL_LIGHT0);
GL.glEnable(GL.GL_DEPTH_TEST);
sphere = GL.glGenLists(1);
GL.glNewList(sphere, GL.GL_COMPILE);
GLU.gluSphere(quadratic, 3, 32, 32);
GL.glEndList();
}
/**
* @see OpenGLTab#renderScene()
*/
void renderScene() {
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
GL.glLoadIdentity();
GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, lightPosition);
GL.glTranslatef(xPos, yPos, zPos);
GL.glCallList(sphere);
}
/**
* Sets the current color values into the rendered display.
*/
void setColorValues() {
GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, colorValues[0]);
GL.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, colorValues[4]);
GL.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, colorValues[5]);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, colorValues[1]);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, colorValues[2]);
GL.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SPECULAR, colorValues[6]);
GL.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, colorValues[3]);
GL.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SHININESS, materialShininess);
}
}