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/RonsDemos/star.java | 349 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 demos/RonsDemos/star.java (limited to 'demos/RonsDemos/star.java') diff --git a/demos/RonsDemos/star.java b/demos/RonsDemos/star.java new file mode 100644 index 0000000..3017b51 --- /dev/null +++ b/demos/RonsDemos/star.java @@ -0,0 +1,349 @@ +/** + * @(#) star.java + * @(#) author: Silicon Graphics (converted to Java by Ron Cemer) + */ + +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "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 BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +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.GLAnimCanvas; +import gl4java.applet.SimpleGLAnimApplet1; + +public class star extends SimpleGLAnimApplet1 +{ + /* Initialize the applet */ + + + public void init() + { + super.init(); + Dimension d = getSize(); + canvas = new starCanvas(d.width, d.height); + add("Center", canvas); + } + + + /* Local GLAnimCanvas extension class */ + + + private class starCanvas extends GLAnimCanvas implements MouseListener + { + private static final float M_PI = 3.14159265359f; + private static final int NORMAL = 0, WEIRD = 1; + private static final int STREAK = 0, CIRCLE = 1; + private static final int MAXSTARS = 400; + private static final int MAXPOS = 10000; + private static final int MAXWARP = 10; + private static final int MAXANGLES = 6000; + private int windW, windH; + private int flag = NORMAL; + private int starCount = MAXSTARS / 2; + private float speed = 1.0f; + private int nitro = 0; + private starRec stars[]; + private float sinTable[]; + private Random rand = null; + + private class starRec + { + protected int type; + protected float x[], y[], z[]; + protected float offsetX, offsetY, offsetR, rotation; + + public starRec() + { + x = new float[2]; + y = new float[2]; + z = new float[2]; + } + } + + public starCanvas(int w, int h) + { + super(w, h); + GLContext.gljNativeDebug = false; + GLContext.gljClassDebug = false; + setAnimateFps(30.0); + + stars = new starRec[MAXSTARS]; + sinTable = new float[MAXANGLES]; + } + + public void preInit() + { + doubleBuffer = true; + stereoView = false; + } + + public void init() + { + System.out.println("init(): " + this); + reshape(getSize().width, getSize().height); + + Date dt = new Date(); + rand = new Random(dt.getTime()); + + int n; + for (n = 0; n < MAXSTARS; n++) + NewStar(n, 100); + float angle = 0.0f; + for (n = 0; n < MAXANGLES ; n++) + { + sinTable[n] = (float)Math.sin(angle); + angle += M_PI / (MAXANGLES / 2.0f); + } + gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + gl.glDisable(GL_DITHER); + + glj.gljCheckGL(); + + addMouseListener(this); + } + + public void doCleanup() + { + System.out.println("destroy(): " + this); + removeMouseListener(this); + } + + public void reshape(int width, int height) + { + windW = width; + windH = height; + + gl.glViewport(0,0,width,height); + gl.glMatrixMode(GL_PROJECTION); + gl.glLoadIdentity(); + glu.gluOrtho2D(-0.5,(double)width+0.5,-0.5,(double)height+0.5); + gl.glMatrixMode(GL_MODELVIEW); + } + + public void display() + { + if (glj.gljMakeCurrent() == false) return; + + MoveStars(); + ShowStars(); + if (nitro > 0) + { + speed = (float)(nitro / 10) + 1.0f; + if (speed > MAXWARP) speed = MAXWARP; + if (++nitro > MAXWARP*10) nitro = -nitro; + } + else if (nitro < 0) + { + nitro++; + speed = (float)(-nitro / 10) + 1.0f; + if (speed > MAXWARP) speed = MAXWARP; + } + + glj.gljSwap(); + glj.gljCheckGL(); + glj.gljFree(); + + //if (!isSuspended()) repaint(); // Animate at full speed. + } + + private float Sin(float angle) + { + int ang; + ang = (int)angle; + while (ang < 0) ang += MAXANGLES; + while (ang >= MAXANGLES) ang -= MAXANGLES; + return (sinTable[ang]); + } + + private float Cos(float angle) + { + return Sin(angle+(((float)MAXANGLES)*0.25f)); + } + + private void NewStar(int n, int d) + { + stars[n] = new starRec(); + if (rand.nextInt() % 4 == 0) + stars[n].type = CIRCLE; + else + stars[n].type = STREAK; + stars[n].x[0] = (float)(rand.nextInt() % MAXPOS - MAXPOS / 2); + stars[n].y[0] = (float)(rand.nextInt() % MAXPOS - MAXPOS / 2); + stars[n].z[0] = (float)(rand.nextInt() % MAXPOS + d); + if ( (rand.nextInt() % 4 == 0) && (flag == WEIRD) ) + { + stars[n].offsetX = (float)(rand.nextInt() % 100 - 100 / 2); + stars[n].offsetY = (float)(rand.nextInt() % 100 - 100 / 2); + stars[n].offsetR = (float)(rand.nextInt() % 25 - 25 / 2); + } + else + { + stars[n].offsetX = 0.0f; + stars[n].offsetY = 0.0f; + stars[n].offsetR = 0.0f; + } + } + + private void RotatePoint(float[] x, float[] y, float rotation) + { + float tmpX, tmpY; + + tmpX = x[0] * Cos(rotation) - y[0] * Sin(rotation); + tmpY = y[0] * Cos(rotation) + x[0] * Sin(rotation); + x[0] = tmpX; + y[0] = tmpY; + } + + private void MoveStars() + { + float offset; + int n; + + offset = speed * 60.0f; + + for (n = 0; n < starCount; n++) + { + stars[n].x[1] = stars[n].x[0]; + stars[n].y[1] = stars[n].y[0]; + stars[n].z[1] = stars[n].z[0]; + stars[n].x[0] += stars[n].offsetX; + stars[n].y[0] += stars[n].offsetY; + stars[n].z[0] -= offset; + int rot = (int)(stars[n].rotation = stars[n].offsetR); + while (rot < 0) rot += MAXANGLES; + while (rot >= MAXANGLES) rot -= MAXANGLES; + stars[n].rotation = (float)rot; + } + } + + private boolean StarPoint(int n) + { + float x0, y0, x1, y1, width; + float xbuf[] = new float[1], ybuf[] = new float[1]; + int i; + + x0 = stars[n].x[0] * windW / stars[n].z[0]; + y0 = stars[n].y[0] * windH / stars[n].z[0]; + xbuf[0] = x0; + ybuf[0] = y0; + RotatePoint(xbuf, ybuf, stars[n].rotation); + x0 = xbuf[0]; + y0 = ybuf[0]; + x0 += windW / 2.0f; + y0 += windH / 2.0f; + + if ( (x0 >= 0.0f) && (x0 < windW) && (y0 >= 0.0f) && (y0 < windH) ) + { + if (stars[n].type == STREAK) + { + x1 = stars[n].x[1] * windW / stars[n].z[1]; + y1 = stars[n].y[1] * windH / stars[n].z[1]; + xbuf[0] = x1; + ybuf[0] = y1; + RotatePoint(xbuf, ybuf, stars[n].rotation); + x1 = xbuf[0]; + y1 = ybuf[0]; + x1 += windW / 2.0f; + y1 += windH / 2.0f; + + gl.glLineWidth(MAXPOS/100.0f/stars[n].z[0]+1.0f); + gl.glColor3f(1.0f, (MAXWARP-speed)/MAXWARP, (MAXWARP-speed)/MAXWARP); + if (Math.abs(x0-x1) < 1.0f && Math.abs(y0-y1) < 1.0f) + { + gl.glBegin(GL_POINTS); + gl.glVertex2f(x0, y0); + gl.glEnd(); + } + else + { + gl.glBegin(GL_LINES); + gl.glVertex2f(x0, y0); + gl.glVertex2f(x1, y1); + gl.glEnd(); + } + } + else + { + width = MAXPOS / 10.0f / stars[n].z[0] + 1.0f; + gl.glColor3f(1.0f, 0.0f, 0.0f); + gl.glBegin(GL_POLYGON); + for (i = 0; i < 8; i++) + { + float x = x0 + width * Cos((float)i*MAXANGLES/8.0f); + float y = y0 + width * Sin((float)i*MAXANGLES/8.0f); + gl.glVertex2f(x, y); + }; + gl.glEnd(); + } + + return true; + } + return false; + } + + private void ShowStars() + { + gl.glClear(GL_COLOR_BUFFER_BIT); + for (int n = 0; n < starCount; n++) + { + if ( (stars[n].z[0] > speed) + || ( (stars[n].z[0] > 0.0f) && (speed < MAXWARP) ) ) + { + if (!StarPoint(n)) + NewStar(n, MAXPOS); + } + else + NewStar(n, MAXPOS); + } + } + + // Methods required for the implementation of MouseListener + public void mouseEntered( MouseEvent evt ) + { + } + + public void mouseExited( MouseEvent evt ) + { + } + + public void mousePressed( MouseEvent evt ) + { + flag = (flag == NORMAL) ? WEIRD : NORMAL; + } + + public void mouseReleased( MouseEvent evt ) + { + } + + public void mouseClicked( MouseEvent evt ) + { + } + } +} -- cgit v1.2.3