transparency hack
Mike Gigante
mg at GODZILLA.CGL.RMIT.OZ.AU
Tue Nov 27 21:12:31 AEST 1990
you might find this useful if you want transparency on non GT/GTX/VGX
platforms. I whipped this up for our PIs.
It is a quick and dirty hack, but it works.
In your 3D code, do something like
if(material[X] < 1.0)
transp((int)(100*material[X]));
where X is the index of the float m.n in the material definition:
ALPHA, m.n,
To say state the obvious, this simulates transparency by useinh fill
patterns of varying percent coverages.
No guarantees of anything, take it or leave it.
Mike Gigante,
RMIT Australia
---
#include "stdio.h"
#include "gl.h"
#include "device.h"
int transp ( float percent );
void defhalftones ( void );
void sethalftone ( int index );
int main ( int argc , char **argv );
typedef struct {
int percent;
short pattern[16];
} pat;
#define NPATTERNS 17
pat patterns[NPATTERNS] = {
{0,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000},
{6,
0x1111, 0x0000, 0x0000, 0x0000,
0x1111, 0x0000, 0x0000, 0x0000,
0x1111, 0x0000, 0x0000, 0x0000,
0x1111, 0x0000, 0x0000, 0x0000},
{12,
0x2222, 0x0000, 0x8888, 0x0000,
0x2222, 0x0000, 0x8888, 0x0000,
0x2222, 0x0000, 0x8888, 0x0000,
0x2222, 0x0000, 0x8888, 0x0000},
{18,
0x8888, 0x2222, 0x0000, 0x1111,
0x8888, 0x2222, 0x0000, 0x1111,
0x8888, 0x2222, 0x0000, 0x1111,
0x8888, 0x2222, 0x0000, 0x1111},
{25,
0x4444, 0x1111, 0x4444, 0x1111,
0x4444, 0x1111, 0x4444, 0x1111,
0x4444, 0x1111, 0x4444, 0x1111,
0x4444, 0x1111, 0x4444, 0x1111},
{31,
0xAAAA, 0x1111, 0x4444, 0x8888,
0xAAAA, 0x1111, 0x4444, 0x8888,
0xAAAA, 0x1111, 0x4444, 0x8888,
0xAAAA, 0x1111, 0x4444, 0x8888},
{37,
0xAAAA, 0x2222, 0x9999, 0x4444,
0xAAAA, 0x2222, 0x9999, 0x4444,
0xAAAA, 0x2222, 0x9999, 0x4444,
0xAAAA, 0x2222, 0x9999, 0x4444},
{43,
0xBBBB, 0x6666, 0x9999, 0x4444,
0xBBBB, 0x6666, 0x9999, 0x4444,
0xBBBB, 0x6666, 0x9999, 0x4444,
0xBBBB, 0x6666, 0x9999, 0x4444},
{50,
0xAAAA, 0x5555, 0xAAAA, 0x5555,
0xAAAA, 0x5555, 0xAAAA, 0x5555,
0xAAAA, 0x5555, 0xAAAA, 0x5555,
0xAAAA, 0x5555, 0xAAAA, 0x5555},
{56,
0x4444, 0x9999, 0x6666, 0x7777,
0x4444, 0x9999, 0x6666, 0x7777,
0x4444, 0x9999, 0x6666, 0x7777,
0x4444, 0x9999, 0x6666, 0x7777},
{62,
0x5555, 0xDDDD, 0x6666, 0xBBBB,
0x5555, 0xDDDD, 0x6666, 0xBBBB,
0x5555, 0xDDDD, 0x6666, 0xBBBB,
0x5555, 0xDDDD, 0x6666, 0xBBBB},
{68,
0x5555, 0xEEEE, 0xBBBB, 0x7777,
0x5555, 0xEEEE, 0xBBBB, 0x7777,
0x5555, 0xEEEE, 0xBBBB, 0x7777,
0x5555, 0xEEEE, 0xBBBB, 0x7777},
{75,
0xDDDD, 0x7777, 0xDDDD, 0x7777,
0xDDDD, 0x7777, 0xDDDD, 0x7777,
0xDDDD, 0x7777, 0xDDDD, 0x7777,
0xDDDD, 0x7777, 0xDDDD, 0x7777},
{81,
0x7777, 0xDDDD, 0xFFFF, 0xEEEE,
0x7777, 0xDDDD, 0xFFFF, 0xEEEE,
0x7777, 0xDDDD, 0xFFFF, 0xEEEE,
0x7777, 0xDDDD, 0xFFFF, 0xEEEE},
{87,
0xEEEE, 0xFFFF, 0x7777, 0xFFFF,
0xEEEE, 0xFFFF, 0x7777, 0xFFFF,
0xEEEE, 0xFFFF, 0x7777, 0xFFFF,
0xEEEE, 0xFFFF, 0x7777, 0xFFFF},
{93,
0xEEEE, 0xFFFF, 0xFFFF, 0xFFFF,
0xEEEE, 0xFFFF, 0xFFFF, 0xFFFF,
0xEEEE, 0xFFFF, 0xFFFF, 0xFFFF,
0xEEEE, 0xFFFF, 0xFFFF, 0xFFFF},
{100,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}
};
int
transp(percent)
float percent;
{
int i;
#ifdef DEBUG
fprintf(stderr,"transp: %f\n", percent);
#endif
percent = 100.0 - percent;
if (percent < 0.0) {
sethalftone(0);
return 0;
}
for(i=1; i < NPATTERNS; i++) {
if (percent <= (float)patterns[i].percent) {
float d1, d2;
d1 = percent - patterns[i - 1].percent;
d2 = patterns[i].percent - percent;
if (d1 <= d2) {
sethalftone(i-1);
return patterns[i-1].percent;
} else {
sethalftone(i);
return patterns[i].percent;
}
}
}
if (percent > 100.0) {
sethalftone(16);
return 100;
}
}
void
defhalftones()
{
int i;
for(i=0; i < NPATTERNS; i++) {
defpattern( i+1 , PATTERN_16, patterns[i].pattern);
}
}
void
sethalftone(index)
int index;
{
setpattern(index+1);
#ifdef DEBUG
fprintf(stderr,"using pattern %d\n", index);
#endif
}
main(argc, argv)
int argc;
char **argv;
{
int i, j;
short val;
if(argc != 1) {
fprintf(stderr, "usage: %s\n", argv[0]);
exit(1);
}
keepaspect(1,1);
foreground();
winopen("transp");
defhalftones();
ortho2(-0.5, 10.5, -0.5, 10.5);
qdevice(ESCKEY);
color(BLACK);
clear();
color(RED);
for(i=0; i < 10; i++) {
for(j=0; j < 10; j++) {
float p;
p = i*10 + j;
transp(p);
rectfi(j,i, j+1, i+1);
}
}
while(qread(&val) != ESCKEY)
;
}
More information about the Comp.sys.sgi
mailing list