blob: 4d9db539270271e69e7dd4ef245ca8bce4b9d034 [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 TransparencyTab extends OpenGLTab {
private float[] alphas = { 0.3f, 0.5f, 1.0f };
private int quadratic;
private int currentSelection = 1;
private final static int
INDEX_TRIANGLE = 1, INDEX_SPHERE = 2, INDEX_DISK = 3;
private final static String[] OBJECTS = {"Triangle", "Sphere", "Disk" };
/**
* @see OpenGLTab#createControls(Composite)
*/
void createControls(Composite composite) {
Composite objectGroup = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
objectGroup.setLayout(layout);
objectGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
new Label(objectGroup, SWT.NONE).setText("Object:");
final Combo objectCombo = new Combo(objectGroup, SWT.READ_ONLY);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
data.grabExcessHorizontalSpace = true;
objectCombo.setLayoutData(data);
objectCombo.setItems(OBJECTS);
objectCombo.select(0);
new Label(composite, SWT.NONE).setText("Transparency:");
final Slider transparencySlider = new Slider(composite, SWT.HORIZONTAL);
transparencySlider.setValues(0, 0, 11, 1, 1, 2);
transparencySlider.setSelection(7);
transparencySlider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
float alpha = transparencySlider.getSelection();
alpha = 1.0f - alpha / 10;
alphas[currentSelection - 1] = alpha;
}
});
objectCombo.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
currentSelection = objectCombo.getSelectionIndex() + 1;
transparencySlider.setSelection(
(int) ((1.0f - alphas[currentSelection - 1]) * 10));
}
});
}
/**
* @see OpenGLTab#dispose()
*/
void dispose() {
super.dispose();
GLU.gluDeleteQuadric(quadratic);
GL.glDeleteLists(INDEX_DISK, 1);
GL.glDeleteLists(INDEX_SPHERE, 1);
GL.glDeleteLists(INDEX_TRIANGLE, 1);
}
/**
* @see OpenGLTab#getTabText()
*/
String getTabText() {
return "Transparency";
}
/**
* @see OpenGLTab#init()
*/
void init() {
GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
quadratic = GLU.gluNewQuadric();
GLU.gluQuadricNormals(quadratic, GLU.GLU_SMOOTH);
GL.glEnable(GL.GL_CULL_FACE);
GL.glEnable(GL.GL_DEPTH_TEST);
GL.glEnable(GL.GL_BLEND);
// create display lists
GL.glNewList(INDEX_SPHERE, GL.GL_COMPILE);
GLU.gluQuadricDrawStyle(quadratic, GLU.GLU_FILL);
GLU.gluSphere(quadratic, 1.5, 32, 32);
GL.glEndList();
GL.glNewList(INDEX_DISK, GL.GL_COMPILE);
GLU.gluQuadricDrawStyle(quadratic, GLU.GLU_FILL);
GLU.gluDisk(quadratic, 1.0, 3, 32, 32);
GL.glEndList();
GL.glNewList(INDEX_TRIANGLE, GL.GL_COMPILE);
GL.glBegin(GL.GL_TRIANGLES);
GL.glVertex3f(0.0f, 2.0f, 0.0f);
GL.glVertex3f(-2.0f, -2.0f, 2.0f);
GL.glVertex3f(2.0f, -2.0f, 2.0f);
GL.glEnd();
GL.glEndList();
}
/**
* @see SelectionTab.processPick (int[], int)
*/
void processPick(int[] pSelectBuff, int hits) {
int zDepth;
int tempSelection = pSelectBuff[3];
zDepth = pSelectBuff[2];
// pick object with largest z value
for (int i = 4; i <= 4 * (hits - 1); i = i + 4) {
if (zDepth > pSelectBuff[i + 2]) {
zDepth = pSelectBuff[i + 2];
tempSelection = pSelectBuff[i + 3];
}
}
if (tempSelection > 0) currentSelection = tempSelection;
}
/**
* @see OpenGLTab#renderScene()
*/
void renderScene() {
// draw items with transparent qualities in reverse Z order
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
GL.glLoadIdentity();
GL.glTranslatef(0.0f, 0.0f, -14.0f);
GL.glPushName(0);
// draw disk
GL.glPushMatrix();
GL.glTranslatef(-1.0f, 0.0f, 1.0f);
GL.glColor4f(0.0f, 1.0f, 0.0f, alphas[2]);
GL.glLoadName(INDEX_DISK);
GL.glCallList(INDEX_DISK);
if (currentSelection == INDEX_DISK) {
GL.glColor3f(1.0f, 0.0f, 0.0f);
GLU.gluQuadricDrawStyle(quadratic, GLU.GLU_LINE);
GLU.gluDisk(quadratic, 0.98, 3.02, 32, 32);
}
GL.glPopMatrix();
// draw triangle
GL.glTranslatef(0.0f, 0.0f, +3.0f);
GL.glLoadName(INDEX_TRIANGLE);
GL.glColor4f(1.0f, 0.0f, 0.0f, alphas[0]);
GL.glCallList(INDEX_TRIANGLE);
GL.glPointSize(5.0f);
if (currentSelection == INDEX_TRIANGLE) {
GL.glBegin(GL.GL_POINTS);
GL.glColor3f(1.0f, 0.0f, 0.0f);
GL.glVertex3f(0.0f, 2.0f, 0.0f);
GL.glVertex3f(-2.0f, -2.0f, 2.0f);
GL.glVertex3f(2.0f, -2.0f, 2.0f);
GL.glEnd();
}
// draw sphere
GL.glPushMatrix();
GL.glTranslatef(1.0f, 0.0f, +3.0f);
GL.glColor4f(0.0f, 0.0f, 1.0f, alphas[1]);
GL.glLoadName(INDEX_SPHERE);
GL.glCallList(INDEX_SPHERE);
if (currentSelection == INDEX_SPHERE) {
GL.glColor3f(1.0f, 0.0f, 0.0f);
GLU.gluQuadricDrawStyle(quadratic, GLU.GLU_LINE);
GLU.gluSphere(quadratic, 1.51, 8, 8);
}
GL.glPopMatrix();
}
}