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