/* overlay.c
This program demonstrates how to use overlay bitplanes. */
#include <gl/gl.h> #include <gl/device.h>
main () { Colorindex heat; int i, xpos = 1013, ypos = 1013, rampup(); float xspd = 0.0, yspd = 0.0, yaccel = -1.0; float yacc = -.4, yreflect = -0.6;
prefposition(0, XMAXSCREEN, 0, YMAXSCREEN); winopen ("overlay"); doublebuffer (); overlay (2); gconfig (); get_cmap(); drawmode (OVERDRAW); /* Get into the overlay bitplanes */ mapcolor (1, 255, 0, 0); mapcolor (2, 0, 255, 0); mapcolor (3, 0, 255, 255); color (1); rectfi (200, 200, 300, 300); /* Draw some rectangles for a ball to roll under. */ color (2); rectfi (500, 500, 600, 600); color (3); rectfi (800, 800, 900, 900); rectfi (850, 500, 950, 600); rectfi (750, 400, 850, 500); rectfi (650, 300, 750, 400); drawmode (NORMALDRAW); mapcolor (0, 0, 0, 0); mapcolor (1, 255, 255, 0); mapcolor (10, 255, 255, 255); rampup(12, 82, 255, 255, 0, 255, 0, 0); setbell(1); while (!getbutton (MIDDLEMOUSE)) { for (i = 0; i < 1013 && !getbutton(MIDDLEMOUSE); i = i + 3) { color (BLUE); /* Roll the ball up and to the right */ clear (); if ((i==210) || (i==510) || (i==810)) ringbell(); /* Ring the bell everytime */ if ((i>250) && (i<550)) /* the ball gets to the */ color (2); /* next rectangle. */ else if ((i>550) && (i<850)) color (5); /* change the ball's color */ else if (i>850) color (10); else color (1); circfi (i, i, 10); swapbuffers (); }
yspd = 0.0; for (heat=82, ypos=1013; ypos>=5 && !getbutton(MIDDLEMOUSE); ypos+=yspd) { color (BLUE); /* drop the ball back to the bottom */ clear (); color (heat--); /* change the ball's color */ yspd += yacc; /* as it falls. */ circfi (1013, ypos, 10); swapbuffers (); }
yspd = -60.0; for (xpos=1013, ypos=10; xpos>=-0&& !getbutton(MIDDLEMOUSE); xpos -= 5) { if (ypos <= 10) /* roll the ball back to the beginning, */ yspd *= yreflect; /* and keep updating its' */ color (BLUE); /* bounce-ability per frame */ clear (); color (1); ypos += yspd; yspd += yaccel; circfi (xpos, ypos, 10); swapbuffers (); }
} drawmode (OVERDRAW); /* clean up the overlay bitplanes */ color (0); clear(); drawmode(NORMALDRAW); restore_cmap(); /* restore the color map */ greset(); gexit (); }
/* Make a color ramp. Make an interpolated ramp from the 1st arguement's index to the second one. The 3rd, and 4th are red's low and hi indexes (5&6 green's, 7&8 are blue's). */
#define round(n) ((int) (n + 0.5))
rampup(first_lutv,last_lutv,minR,maxR,minG,maxG,minB,maxB) unsigned short first_lutv, last_lutv, /* Start & end ramp values. */ minR, maxR, /* Low and high red, */ minG, maxG, /* green, */ minB, maxB; /* and blue values */ { unsigned short len_red, len_green, len_blue, /* Length of each color */ i; /* Counter for number of steps */ short red, gre, blu; /* lut values */ float rdx, gdx, bdx, /* Sizes of rgb increments */ r, g, b, /* A position on the ramp */ steps; /* No. of steps along the ramp at which intensity assignments will be made */ /* Determine length of ramp*/ steps = (float) (last_lutv-first_lutv + 1); len_red = (maxR - minR); /* determine length of red */ len_green = (maxG - minG); /* determine length of green */ len_blue = (maxB - minB); /* determine length of blue */ rdx = (float) len_red / steps; /* compute step */ gdx = (float) len_green / steps; /* sizes of r, g, */ bdx = (float) len_blue / steps; /* and b values */ r = minR; /* Assign starting */ g = minG; /* indexes for each */ b = minB; /* color value */ for (i = first_lutv; i <= last_lutv; i++) { red = (short) round(r); /* Round off the */ gre = (short) round(g); /* given r, g, */ blu = (short) round(b); /* and b values */ mapcolor(i, red, gre, blu); /* assign next color map index */ r += rdx; /* Increment the */ g += gdx; /* color indexes */ b += bdx; }
}
#define MAXCOLI 255
static short CarrayR[MAXCOLI+1], CarrayG[MAXCOLI+1], CarrayB[MAXCOLI+1];
unsigned short index;
get_cmap() { short rcomp, gcomp, bcomp; for (index=0; index<=MAXCOLI; index++) { getmcolor(index,&rcomp, &gcomp, &bcomp); CarrayR[index] = rcomp; CarrayG[index] = gcomp; CarrayB[index] = bcomp; }
}
restore_cmap() { for (index=0; index<=MAXCOLI; index++) mapcolor(index,CarrayR[index], CarrayG[index], CarrayB[index]); }
The gconfig subroutine, getmcolor subroutine, overlay subroutine.