2 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
4 * Permission to use, copy, modify, distribute, and sell this software and
5 * its documentation for any purpose is hereby granted without fee, provided
6 * that (i) the above copyright notices and this permission notice appear in
7 * all copies of the software and related documentation, and (ii) the name of
8 * Silicon Graphics may not be used in any advertising or
9 * publicity relating to the software without the specific, prior written
10 * permission of Silicon Graphics.
12 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
17 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
33 #define PI 3.141592657
49 #define MAXANGLES 6000
52 typedef struct _starRec
{
54 float x
[2], y
[2], z
[2];
55 float offsetX
, offsetY
, offsetR
, rotation
;
63 GLint starCount
= MAXSTARS
/ 2;
66 starRec stars
[MAXSTARS
];
67 float sinTable
[MAXANGLES
];
70 float Sin(float angle
)
73 return (sinTable
[(GLint
)angle
]);
76 float Cos(float angle
)
79 return (sinTable
[((GLint
)angle
+(MAXANGLES
/4))%MAXANGLES
]);
82 void NewStar(GLint n
, GLint d
)
86 stars
[n
].type
= CIRCLE
;
88 stars
[n
].type
= STREAK
;
90 stars
[n
].x
[0] = (float)(rand() % MAXPOS
- MAXPOS
/ 2);
91 stars
[n
].y
[0] = (float)(rand() % MAXPOS
- MAXPOS
/ 2);
92 stars
[n
].z
[0] = (float)(rand() % MAXPOS
+ d
);
93 if (rand()%4 == 0 && flag
== WEIRD
) {
94 stars
[n
].offsetX
= (float)(rand() % 100 - 100 / 2);
95 stars
[n
].offsetY
= (float)(rand() % 100 - 100 / 2);
96 stars
[n
].offsetR
= (float)(rand() % 25 - 25 / 2);
98 stars
[n
].offsetX
= 0.0;
99 stars
[n
].offsetY
= 0.0;
100 stars
[n
].offsetR
= 0.0;
104 void RotatePoint(float *x
, float *y
, float rotation
)
108 tmpX
= *x
* Cos(rotation
) - *y
* Sin(rotation
);
109 tmpY
= *y
* Cos(rotation
) + *x
* Sin(rotation
);
118 static double t0
= -1.;
120 t
= glutGet(GLUT_ELAPSED_TIME
) / 1000.;
126 offset
= speed
* 60.0;
128 for (n
= 0; n
< starCount
; n
++) {
129 stars
[n
].x
[1] = stars
[n
].x
[0];
130 stars
[n
].y
[1] = stars
[n
].y
[0];
131 stars
[n
].z
[1] = stars
[n
].z
[0];
132 stars
[n
].x
[0] += stars
[n
].offsetX
*dt
;
133 stars
[n
].y
[0] += stars
[n
].offsetY
*dt
;
134 stars
[n
].z
[0] -= offset
*dt
;
135 stars
[n
].rotation
+= stars
[n
].offsetR
*dt
;
136 if (stars
[n
].rotation
> MAXANGLES
) {
137 stars
[n
].rotation
= 0.0;
139 else if (stars
[n
].rotation
< 0.0) {
140 stars
[n
].rotation
+= 360.0;
145 GLenum
StarPoint(GLint n
)
147 float x0
, y0
, x1
, y1
, width
;
150 x0
= stars
[n
].x
[0] * windW
/ stars
[n
].z
[0];
151 y0
= stars
[n
].y
[0] * windH
/ stars
[n
].z
[0];
152 RotatePoint(&x0
, &y0
, stars
[n
].rotation
);
156 if (x0
>= 0.0 && x0
< windW
&& y0
>= 0.0 && y0
< windH
) {
157 if (stars
[n
].type
== STREAK
) {
158 x1
= stars
[n
].x
[1] * windW
/ stars
[n
].z
[1];
159 y1
= stars
[n
].y
[1] * windH
/ stars
[n
].z
[1];
160 RotatePoint(&x1
, &y1
, stars
[n
].rotation
);
164 glLineWidth(MAXPOS
/100.0/stars
[n
].z
[0]+1.0);
165 glColor3f(1.0, (MAXWARP
-speed
)/MAXWARP
, (MAXWARP
-speed
)/MAXWARP
);
166 if (fabs(x0
-x1
) < 1.0 && fabs(y0
-y1
) < 1.0) {
177 width
= MAXPOS
/ 10.0 / stars
[n
].z
[0] + 1.0;
178 glColor3f(1.0, 0.0, 0.0);
180 for (i
= 0; i
< 8; i
++) {
181 float x
= x0
+ width
* Cos((float)i
*MAXANGLES
/8.0);
182 float y
= y0
+ width
* Sin((float)i
*MAXANGLES
/8.0);
197 glClear(GL_COLOR_BUFFER_BIT
);
199 for (n
= 0; n
< starCount
; n
++) {
200 if (stars
[n
].z
[0] > speed
|| (stars
[n
].z
[0] > 0.0 && speed
< MAXWARP
)) {
201 if (StarPoint(n
) == GL_FALSE
) {
210 static void Init(void)
215 srand((unsigned int) glutGet(GLUT_ELAPSED_TIME
) );
217 for (n
= 0; n
< MAXSTARS
; n
++) {
222 for (n
= 0; n
< MAXANGLES
; n
++) {
223 sinTable
[n
] = sin(angle
);
224 angle
+= PI
/ (MAXANGLES
/ 2.0);
227 glClearColor(0.0, 0.0, 0.0, 0.0);
229 glDisable(GL_DITHER
);
232 void Reshape(int width
, int height
)
235 windW
= (GLint
)width
;
236 windH
= (GLint
)height
;
238 glViewport(0, 0, windW
, windH
);
240 glMatrixMode(GL_PROJECTION
);
242 gluOrtho2D(-0.5, windW
+0.5, -0.5, windH
+0.5);
243 glMatrixMode(GL_MODELVIEW
);
246 static void Key(unsigned char key
, int x
, int y
)
253 flag
= (flag
== NORMAL
) ? WEIRD
: NORMAL
;
269 speed
= (float)(nitro
/ 10) + 1.0;
270 if (speed
> MAXWARP
) {
273 if (++nitro
> MAXWARP
*10) {
276 } else if (nitro
< 0) {
278 speed
= (float)(-nitro
/ 10) + 1.0;
279 if (speed
> MAXWARP
) {
290 static GLenum
Args(int argc
, char **argv
)
294 doubleBuffer
= GL_TRUE
;
296 for (i
= 1; i
< argc
; i
++) {
297 if (strcmp(argv
[i
], "-sb") == 0) {
298 doubleBuffer
= GL_FALSE
;
299 } else if (strcmp(argv
[i
], "-db") == 0) {
300 doubleBuffer
= GL_TRUE
;
306 #if !defined(GLUTCALLBACK)
310 void GLUTCALLBACK
glut_post_redisplay_p(void)
315 int main(int argc
, char **argv
)
319 glutInit(&argc
, argv
);
321 if (Args(argc
, argv
) == GL_FALSE
) {
327 glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
330 type
|= (doubleBuffer
) ? GLUT_DOUBLE
: GLUT_SINGLE
;
331 glutInitDisplayMode(type
);
333 if (glutCreateWindow("Stars") == GL_FALSE
) {
339 glutReshapeFunc(Reshape
);
340 glutKeyboardFunc(Key
);
341 glutDisplayFunc(Draw
);
342 glutIdleFunc(glut_post_redisplay_p
);