home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
hensa
/
graphics
/
a090_1
/
c
/
shape
< prev
Wrap
Text File
|
1992-04-12
|
2KB
|
60 lines
/**** shape.c ****/
/* By Paul Field
* See !ReadMe file for distribution/modification restrictions
*/
#include "shape.h"
static euclid_coord vertex[8]; /* Vertices of the cube */
static euclid_coord *face[6][4] = /* Pointers to the vertices making up each face */
{ { &vertex[0], &vertex[1], &vertex[3], &vertex[2] },
{ &vertex[0], &vertex[4], &vertex[5], &vertex[1] },
{ &vertex[0], &vertex[2], &vertex[6], &vertex[4] },
{ &vertex[2], &vertex[3], &vertex[7], &vertex[6] },
{ &vertex[3], &vertex[7], &vertex[5], &vertex[1] },
{ &vertex[7], &vertex[6], &vertex[4], &vertex[5] }
};
os_error *shape_makecube(euclid_header *h, unsigned int size, euclid_solid **cube)
{ os_error *e;
if ((e = euclid_create(6, h, eid_solid, cube))==NULL)
{ int fno, vno;
euclid_coord *v;
(*cube)->boundingradius = +(17321 * size)/10000; /* size * sqrt(3) */
/* euclid_create makes boundingcentre = {0,0,0} */
size /= 2;
for (vno = 0, v = vertex; vno < 8; vno++, v++)
{ v->x = (vno % 2 == 0) ? size : -size;
v->y = (vno % 8 < 4) ? size : -size;
v->z = (vno % 4 >= 2) ? size : -size;
}
for (fno = 0; fno <= 5 && !e; fno++)
{ euclid_plane *p;
if ((e = euclid_create(4, h, eid_plane, &p)) == NULL)
{ euclid_coord *points, **fpoints;
int cno;
(*cube)->var[fno].plane = p;
points = p->point;
fpoints = face[fno];
for (cno = 3; cno >= 0; cno--)
{ *points++ = **fpoints++;
}
}
}
if (e)
{ for (--fno; fno >= 0; fno--)
{ euclid_destroy(h, (*cube)->var[fno].plane);
}
euclid_destroy(h, *cube);
}
}
return(e);
}