From 880653d31a8f1ff8384fdbc75b84934bceecfdb8 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 18 Nov 2000 06:43:49 +0000 Subject: Initial revision --- demos/MiscDemos/stencil.java | 342 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100644 demos/MiscDemos/stencil.java (limited to 'demos/MiscDemos/stencil.java') diff --git a/demos/MiscDemos/stencil.java b/demos/MiscDemos/stencil.java new file mode 100644 index 0000000..a2d163f --- /dev/null +++ b/demos/MiscDemos/stencil.java @@ -0,0 +1,342 @@ +/** + * @(#) stencil.java + * @(#) author: Silicon Graphics (converted to Java by Ron Cemer) + */ + +/* + * Copyright (c) 1993-1997, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(R) is a registered trademark of Silicon Graphics, Inc. + */ + +/* + * This program demonstrates use of the stencil buffer for + * masking nonrectangular regions. + * Whenever the window is redrawn, a value of 1 is drawn + * into a diamond-shaped region in the stencil buffer. + * Elsewhere in the stencil buffer, the value is 0. + * Then a blue sphere is drawn where the stencil value is 1, + * and yellow torii are drawn where the stencil value is not 1. + */ + +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; + +public class stencil extends Applet +{ + stencilCanvas canvas1 = null; + stencilCanvas canvas2 = null; + + Panel cvs = null; + + /* Initialize the applet */ + + + public void init() + { + Dimension d = getSize(); + setLayout(new BorderLayout()); + + canvas1 = new stencilCanvas(d.width, d.height, 0, false); + System.out.println("the left canvas has 0 stencil-bits, self-window"); + canvas2 = new stencilCanvas(d.width, d.height, 8, true); + System.out.println("the right canvas should have 8 stencil-bits, ownWindow"); + + cvs = new Panel(); + cvs.setLayout(new GridLayout(1,2)); + cvs.add(canvas1); + if(canvas2!=null) + cvs.add(canvas2); + add("Center", cvs); + } + + + public static void main( String args[] ) + { + Frame mainFrame = new Frame("stencil"); + + GLContext.gljNativeDebug = true; + GLContext.gljClassDebug = true; + + stencil applet = new stencil(); + + applet.setSize(400, 400); + applet.init(); + applet.start(); + + mainFrame.add(applet); + + mainFrame.pack(); + mainFrame.setVisible(true); + } + + /* Start the applet */ + + + public void start() + { + } + + + /* Stop the applet */ + + + public void stop() + { + } + + + /* Destroy the applet */ + + + + /* Local GLCanvas extension class */ + + + private class stencilCanvas extends GLCanvas + { + private static final float M_PI = 3.14159265359f; + private static final int YELLOWMAT = 1, BLUEMAT = 2; + private boolean initdone = false; + + public stencilCanvas(int w, int h, + int _stencilBits, + boolean _createOwnWindow) + { + super(w, h); + stencilBits = _stencilBits; + createOwnWindow = _createOwnWindow; + } + + public void preInit() + { + doubleBuffer = true; + stereoView = false; + } + + public void init() + { + // Examine some OpenGL properties + int [] res=new int[6]; + + gl.glGetIntegerv(GL_STENCIL_BITS,res); + + System.out.println("init(): " + this + "\n\t" + + "Stencil bits are "+res[0] +"\n\t" + + "IsOwnCreatedWindow: "+createOwnWindow); + + float yellow_diffuse[] = { 0.7f, 0.7f, 0.0f, 1.0f }; + float yellow_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; + + float blue_diffuse[] = { 0.1f, 0.1f, 0.7f, 1.0f }; + float blue_specular[] = { 0.1f, 1.0f, 1.0f, 1.0f }; + + float position_one[] = { 1.0f, 1.0f, 1.0f, 0.0f }; + + gl.glNewList(YELLOWMAT, GL_COMPILE); + gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow_diffuse); + gl.glMaterialfv(GL_FRONT, GL_SPECULAR, yellow_specular); + gl.glMaterialf(GL_FRONT, GL_SHININESS, 64.0f); + gl.glEndList(); + + gl.glNewList(BLUEMAT, GL_COMPILE); + gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, blue_diffuse); + gl.glMaterialfv(GL_FRONT, GL_SPECULAR, blue_specular); + gl.glMaterialf(GL_FRONT, GL_SHININESS, 45.0f); + gl.glEndList(); + + gl.glLightfv(GL_LIGHT0, GL_POSITION, position_one); + + gl.glEnable(GL_LIGHT0); + gl.glEnable(GL_LIGHTING); + gl.glEnable(GL_DEPTH_TEST); + + gl.glClearStencil(0); + gl.glEnable(GL_STENCIL_TEST); + + glj.gljCheckGL(); + + initdone = true; + reshape(getSize().width, getSize().height); + } + + public void cvsDispose() + { + System.out.println("destroy(): " + this); + super.cvsDispose(); + } + + public void reshape(int width, int height) + { + gl.glViewport(0,0,width,height); + + if (initdone) + { + /* create a diamond shaped stencil area */ + gl.glMatrixMode(GL_PROJECTION); + gl.glLoadIdentity(); + if (width <= height) + glu.gluOrtho2D + (-3.0f, + 3.0f, + -3.0f*(float)height/(float)width, + 3.0f*(float)height/(float)width); + else + glu.gluOrtho2D + (-3.0f*(float)width/(float)height, + 3.0f*(float)width/(float)height, + -3.0f, + 3.0f); + gl.glMatrixMode(GL_MODELVIEW); + gl.glLoadIdentity(); + + gl.glClear(GL_STENCIL_BUFFER_BIT); + gl.glStencilFunc(GL_ALWAYS, 1, 1); + gl.glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + gl.glBegin(GL_QUADS); + gl.glVertex2f(-1.0f, 0.0f); + gl.glVertex2f(0.0f, 1.0f); + gl.glVertex2f(1.0f, 0.0f); + gl.glVertex2f(0.0f, -1.0f); + gl.glEnd(); + } + + gl.glMatrixMode(GL_PROJECTION); + gl.glLoadIdentity(); + glu.gluPerspective(45.0f, (float)width/(float)height, 3.0f, 7.0f); + gl.glMatrixMode(GL_MODELVIEW); + gl.glLoadIdentity(); + gl.glTranslatef(0.0f, 0.0f, -5.0f); + } + + public void display() + { + if (glj.gljMakeCurrent() == false) return; + + /* Draw a sphere in a diamond-shaped section in the + * middle of a window with 2 torii. + */ + + gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + /* draw blue sphere where the stencil is 1 */ + gl.glStencilFunc(GL_EQUAL, 1, 1); + gl.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + gl.glCallList(BLUEMAT); + + int qobj = glu.gluNewQuadric(); + glu.gluQuadricOrientation(qobj,GLU_OUTSIDE); + glu.gluQuadricNormals(qobj,GLU_SMOOTH); + glu.gluQuadricTexture(qobj,false); + glu.gluSphere(qobj,0.5f,15,15); + glu.gluDeleteQuadric(qobj); + + /* draw the tori where the stencil is not 1 */ + gl.glStencilFunc(GL_NOTEQUAL, 1, 1); + gl.glPushMatrix(); + gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f); + gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); + gl.glCallList(YELLOWMAT); + glutSolidTorus(0.275f, 0.85f, 15, 15); + gl.glPushMatrix(); + gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + glutSolidTorus(0.275f, 0.85f, 15, 15); + gl.glPopMatrix(); + gl.glPopMatrix(); + + glj.gljSwap(); + glj.gljCheckGL(); + glj.gljFree(); + } + + // Imported from glut. + private void glutSolidTorus + (float innerRadius, + float outerRadius, + int nsides, + int rings) + { + doughnut(innerRadius, outerRadius, nsides, rings); + } + + // Imported from glut. + private void doughnut(float r, float R, int nsides, int rings) + { + int i, j; + float theta, phi, theta1; + float cosTheta, sinTheta; + float cosTheta1, sinTheta1; + float ringDelta, sideDelta; + + ringDelta = 2.0f * M_PI / rings; + sideDelta = 2.0f * M_PI / nsides; + + theta = 0.0f; + cosTheta = 1.0f; + sinTheta = 0.0f; + for (i = rings - 1; i >= 0; i--) + { + theta1 = theta + ringDelta; + cosTheta1 = (float)Math.cos(theta1); + sinTheta1 = (float)Math.sin(theta1); + gl.glBegin(GL_QUAD_STRIP); + phi = 0.0f; + for (j = nsides; j >= 0; j--) + { + float cosPhi, sinPhi, dist; + + phi += sideDelta; + cosPhi = (float)Math.cos(phi); + sinPhi = (float)Math.sin(phi); + dist = R + r * cosPhi; + + gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); + gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi); + gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); + gl.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi); + } + gl.glEnd(); + theta = theta1; + cosTheta = cosTheta1; + sinTheta = sinTheta1; + } + } + } +} -- cgit v1.2.3