Created
February 10, 2015 21:49
-
-
Save slacy/5ec0b38e8fe4da52f40e to your computer and use it in GitHub Desktop.
IRIX twilight.c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* cc twilight.c -lgl_s -lm -o twilight | |
* | |
* Copyright (c) 1991, 1992 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 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. | |
*/ | |
/* | |
* A background/root window that looks like the twilight sky. | |
* Howard Look | |
*/ | |
#include <gl/gl.h> | |
#include <gl/device.h> | |
#include <math.h> | |
/* prototypes */ | |
void draw_background(float x, float y, Boolean rgb_mode); | |
long star_color(float y, float max_y); | |
/* point in y where color transition occurs */ | |
#define TRANSITION 0.2 | |
#define NUM_SMALL_STARS 2500 | |
#define NUM_BIG_STARS 200 | |
/* colors */ | |
static long orange[] = {255,72,0}; | |
static long blueish[] = {0,110,189}; | |
static long black[] = {0,0,0}; | |
static unsigned short half[16] = { | |
0x5555, 0xAAAA, 0x5555, 0xAAAA, | |
0x5555, 0xAAAA, 0x5555, 0xAAAA, | |
0x5555, 0xAAAA, 0x5555, 0xAAAA, | |
0x5555, 0xAAAA, 0x5555, 0xAAAA}; | |
main() | |
{ | |
long gid, sizex, sizey; | |
Boolean redraw_needed = FALSE; | |
Boolean rgb_mode; | |
short val; | |
long dev; | |
rgb_mode = | |
getgdesc(GD_BITS_NORM_SNG_RED) && | |
getgdesc(GD_BITS_NORM_SNG_GREEN) && | |
getgdesc(GD_BITS_NORM_SNG_BLUE); | |
imakebackground(); | |
gid = winopen(""); | |
if (rgb_mode) | |
RGBmode(); | |
gconfig(); | |
if (!rgb_mode) | |
defpattern(1,16,half); | |
qenter(REDRAW,gid); | |
while (1) | |
{ | |
if (redraw_needed) | |
{ | |
getsize(&sizex, &sizey); | |
ortho2(-.5, (float)sizex-.5, -.5, (float)sizey-.5); | |
viewport(0, sizex-1, 0, sizey-1); | |
draw_background((float)sizex, (float)sizey, rgb_mode); | |
redraw_needed = FALSE; | |
} | |
while (qtest() || (! redraw_needed)) | |
{ | |
dev = qread(&val); | |
if (dev == REDRAW) | |
redraw_needed = TRUE; | |
} | |
} | |
} | |
void draw_background(float x, float y, Boolean rgb_mode) | |
{ | |
int i,j; | |
float v1[2],v2[2],v3[2],v4[2]; | |
v1[0] = v4[0] = 0.0; | |
v2[0] = v3[0] = x; | |
v1[1] = v2[1] = 0.0; | |
v3[1] = v4[1] = y*TRANSITION; | |
if (rgb_mode) | |
{ | |
bgnpolygon(); | |
c3i(orange); | |
v2f(v1); | |
v2f(v2); | |
c3i(blueish); | |
v2f(v3); | |
v2f(v4); | |
endpolygon(); | |
v1[1] = v2[1] = y; | |
bgnpolygon(); | |
c3i(blueish); | |
v2f(v4); | |
v2f(v3); | |
c3i(black); | |
v2f(v2); | |
v2f(v1); | |
endpolygon(); | |
} | |
else | |
{ | |
color(BLACK); | |
clear(); | |
color(BLUE); | |
setpattern(1); | |
clear(); | |
setpattern(0); | |
} | |
srand48(0); /* seed so stars are always the same */ | |
bgnpoint(); | |
for (i = 0; i < NUM_SMALL_STARS; i++) | |
{ | |
float v[2]; | |
v[0] = x*drand48(); | |
v[1] = y*drand48(); | |
if (rgb_mode) | |
cpack(star_color(v[1], y)); | |
else | |
color(WHITE); | |
v2f(v); | |
} | |
endpoint(); | |
for (i = 0; i < NUM_BIG_STARS; i++) | |
{ | |
float v[2], size; | |
v[0] = x*drand48(); | |
v[1] = y*drand48(); | |
size = drand48(); | |
pushmatrix(); | |
translate(v[0],v[1],0.0); | |
scale(size,size,size); | |
if (rgb_mode) | |
cpack(star_color(v[1], y)); | |
else | |
color(WHITE); | |
sboxf(0.0,1.0,3.0,2.0); | |
sboxf(1.0,0.0,2.0,3.0); | |
popmatrix(); | |
} | |
swapbuffers(); | |
} | |
long | |
star_color(float y, float max_y) | |
{ | |
int r,g,b; | |
float a; | |
float ratio; | |
if (y > max_y/2) | |
return(0xFFFFFF); | |
if (y < TRANSITION*max_y) | |
{ | |
ratio = y / (max_y * TRANSITION); | |
r = orange[0]*(1.0 - ratio) + blueish[0]*ratio; | |
g = orange[1]*(1.0 - ratio) + blueish[1]*ratio; | |
b = orange[2]*(1.0 - ratio) + blueish[2]*ratio; | |
} | |
else | |
{ | |
ratio = (y - max_y*TRANSITION)/(max_y - max_y*TRANSITION); | |
r = blueish[0]*(1.0 - ratio) + black[0]*ratio; | |
g = blueish[1]*(1.0 - ratio) + black[1]*ratio; | |
b = blueish[2]*(1.0 - ratio) + black[2]*ratio; | |
} | |
/* r,g and b are now the sky color at y, now blend with white */ | |
a = (y/(max_y/2.0)); | |
r = r*(1.0-a) + 255*a; | |
g = g*(1.0-a) + 255*a; | |
b = b*(1.0-a) + 255*a; | |
return (r&0xff) + ((g&0xff)<<8) + ((b&0xff)<<16); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment