diff options
author | Sven Gothel <[email protected]> | 2000-11-18 06:43:49 +0000 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2000-11-18 06:43:49 +0000 |
commit | 880653d31a8f1ff8384fdbc75b84934bceecfdb8 (patch) | |
tree | bdafb71416f176d2a4b73bf716c9dc3f13685a8b /demos/MiscDemos/alpha3D.java |
Initial revision
Diffstat (limited to 'demos/MiscDemos/alpha3D.java')
-rw-r--r-- | demos/MiscDemos/alpha3D.java | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/demos/MiscDemos/alpha3D.java b/demos/MiscDemos/alpha3D.java new file mode 100644 index 0000000..a982375 --- /dev/null +++ b/demos/MiscDemos/alpha3D.java @@ -0,0 +1,287 @@ +/** + * @(#) alpha3D.java + * @(#) author: Silicon Graphics, Inc. (converted to Java by Sven Goethel) + */ + +/* + * This program demonstrates lots of material properties. + * A single light source illuminates the objects. + */ + +import java.applet.*; +import java.awt.*; +import java.awt.event.*; +import java.lang.*; +import java.util.*; +import java.io.*; +import java.util.*; +import gl4java.GLContext; +import gl4java.awt.GLCanvas; +import gl4java.awt.GLAnimCanvas; +import gl4java.applet.SimpleGLAnimApplet1; + +import gl4java.utils.glut.*; + +public class alpha3D extends SimpleGLAnimApplet1 +{ + static final float MAXZ = 8.0f; + static final float MINZ = -8.0f; + static final float ZINC = 0.4f; + + /* Initialize the applet */ + + + public void init() + { + super.init(); + Dimension d = getSize(); + canvas = new alpha3DCanvas(d.width, d.height); + add("Center", canvas); + } + + + public static void main( String args[] ) { + alpha3D applet = + new alpha3D(); + + Frame f = new Frame("alpha3D"); + + f.addWindowListener( new WindowAdapter() + { + public void windowClosed(WindowEvent e) + { + System.exit(0); + } + public void windowClosing(WindowEvent e) + { + windowClosed(e); + } + } + ); + + f.setLayout(new BorderLayout()); + f.add("Center", applet); + applet.setSize(500,300); + applet.init(); + applet.start(); + Dimension ps = applet.getPreferredSize(); + f.setBounds(-100,-100,99,99); + f.setVisible(true); + f.setVisible(false); + Insets i = f.getInsets(); + f.setBounds(0,0, + ps.width+i.left+i.right, + ps.height+i.top+i.bottom); + f.setVisible(true); + } + /* Local GLCanvas extension class */ + + + private class alpha3DCanvas extends GLAnimCanvas + implements MouseListener, ActionListener + { + private PopupMenu menu = null; + private boolean menu_showing = false; + private boolean save_suspended = false; + private final String MENUE_0 = "Alpha Mode"; + private final String MENUE_1 = "Real Mode"; + + GLUTFunc glut = null; + + float solidZ = MAXZ; + float transparentZ = MINZ; + int sphereList, cubeList; + + public alpha3DCanvas(int w, int h) + { + super(w, h); + GLContext.gljNativeDebug = false; + GLContext.gljClassDebug = false; + setAnimateFps(30.0); + } + + public void preInit() + { + doubleBuffer = true; + stereoView = false; + } + + + public void init() + { + glut = new GLUTFuncLightImpl(gl, glu); + + reshape(getSize().width, getSize().height); + + float mat_specular[] = { 1.0f, 1.0f, 1.0f, 0.15f }; + float mat_shininess[] = { 100.0f }; + float position[] = { 0.5f, 0.5f, 1.0f, 0.0f }; + + gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); + gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); + gl.glLightfv(GL_LIGHT0, GL_POSITION, position); + + gl.glEnable(GL_LIGHTING); + gl.glEnable(GL_LIGHT0); + gl.glEnable(GL_DEPTH_TEST); + + sphereList = gl.glGenLists(1); + gl.glNewList(sphereList, GL_COMPILE); + glut.glutSolidSphere (0.4f, 16, 16); + gl.glEndList(); + + cubeList = gl.glGenLists(1); + gl.glNewList(cubeList, GL_COMPILE); + glut.glutSolidCube (0.6f); + gl.glEndList(); + + menu = new PopupMenu("Options"); + menu.add(MENUE_0); + menu.add(MENUE_1); + menu.addActionListener(this); + add(menu); + + addMouseListener(this); + } + + public void display() + { + if (glj.gljMakeCurrent() == false) return; + + float mat_solid[] = { 0.75f, 0.75f, 0.0f, 1.0f }; + float mat_zero[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + float mat_transparent[] = { 0.0f, 0.8f, 0.8f, 0.6f }; + float mat_emission[] = { 0.0f, 0.3f, 0.3f, 0.6f }; + + gl.glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + gl.glPushMatrix (); + gl.glTranslatef (-0.15f, -0.15f, solidZ); + gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_zero); + gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_solid); + gl.glCallList (sphereList); + gl.glPopMatrix (); + + gl.glPushMatrix (); + gl.glTranslatef (0.15f, 0.15f, transparentZ); + gl.glRotatef (15.0f, 1.0f, 1.0f, 0.0f); + gl.glRotatef (30.0f, 0.0f, 1.0f, 0.0f); + gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); + gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_transparent); + gl.glEnable (GL_BLEND); + gl.glDepthMask (GL_FALSE); + gl.glBlendFunc (GL_SRC_ALPHA, GL_ONE); + gl.glCallList (cubeList); + gl.glDepthMask (GL_TRUE); + gl.glDisable (GL_BLEND); + gl.glPopMatrix (); + + glj.gljSwap(); + glj.gljCheckGL(); + glj.gljFree(); + + animate(); + } + + public void reshape(int w, int h) + { + gl.glViewport(0, 0, (int) w, (int) h); + gl.glMatrixMode(GL_PROJECTION); + gl.glLoadIdentity(); + if (w <= h) + gl.glOrtho (-1.5f, 1.5f, -1.5f*(float)h/(float)w, + 1.5f*(float)h/(float)w, -10.0f, 10.0f); + else + gl.glOrtho (-1.5f*(float)w/(float)h, + 1.5f*(float)w/(float)h, -1.5f, 1.5f, -10.0f, 10.0f); + gl.glMatrixMode(GL_MODELVIEW); + gl.glLoadIdentity(); + } + + void animate() + { + if (solidZ <= MINZ || transparentZ >= MAXZ) + setSuspended(true); + else { + solidZ -= ZINC; + transparentZ += ZINC; + } + } + + // Methods required for the implementation of MouseListener + public void mouseEntered(MouseEvent evt) + { + } + + public void mouseExited(MouseEvent evt) + { + } + + public void mousePressed(MouseEvent evt) + { + if (!menu_showing) + { + if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0) + { + menu_showing = true; + save_suspended = isSuspended(); + if (!save_suspended) + { + setSuspended(true); + repaint(100); + try + { + Thread.currentThread().sleep(200); + } + catch (Exception e) + { } + } + menu.show(this,evt.getX(),evt.getY()); + } + else + { + // Must be left button. + if (isSuspended()) repaint(); + } + } + else + { + menu_showing = false; + setSuspended(save_suspended); + } + } + + public void mouseReleased(MouseEvent evt) + { + } + + public void mouseClicked(MouseEvent evt) + { + } + + // Method required for the implementation of ActionListener + public void actionPerformed(ActionEvent evt) + { + String c = evt.getActionCommand(); + if (c.equals(MENUE_0)) + { + solidZ = MAXZ; + transparentZ = MINZ; + setSuspended(false); + return ; + } + else if (c.equals(MENUE_1)) + { + solidZ = MAXZ; + transparentZ = MINZ; + setSuspended(true); + repaint(); + } + if (menu_showing) + { + menu_showing = false; + setSuspended(save_suspended); + } + } + } +} |