Category : Printer + Display Graphics
Archive   : RAYSH386.ZIP
Filename : OFF2RAY.C

 
Output of file : OFF2RAY.C contained in archive : RAYSH386.ZIP
/*
* off2ray.c
*
* Convert OFF format objects to rayshade format.
*
* Warning! Hastily thrown-together code follows.
*
* usage:
* off2ray objname > objname.ray (default vertex order)
* or
* off2ray objnamne yes > objname.ray (reverse vertex order)
*
* Reads 'objname.geom', as well as 'objname.vnorm' and 'objname.pcol'
* if they exist, and writes a rayshade-compatible object description
* to the standard output.
*
* Note that you'll want to hand-tweak the surface definitions.
*
* Craig Kolb 12/89
*
* Indexed polygon color changes by Tom Friedel, 1/90
*/
#include

#define TRUE 1
#define FALSE 0
#define usage() fprintf(stderr,"usage: off2ray basename\n")

typedef struct {
float x, y, z;
} Vertex;

FILE *fgeom, *fnorm, *fpcol;
Vertex *vertices, *normals, *surfaces;
int Nvert, Nnorm, Npoly, Nsurface, *surfindex, Ncols;
int NoNormals, NoPcol, ReverseOrder;

main(argc, argv)
int argc;
char **argv;
{
char buf[BUFSIZ];
int porder, norder, pnum, nnum, junk, i, j;
float red, green, blue;

if (argc != 2 && argc != 3) {
usage();
exit(2);
}

if (argc == 3)
ReverseOrder = TRUE;

sprintf(buf,"%s.geom",argv[1]);
#ifdef __WATCOMC__
fgeom = fopen(buf, "rb");
#else
fgeom = fopen(buf, "r");
#endif
if (fgeom == (FILE *)NULL) {
fprintf(stderr,"Cannot open geometry file %s\n",buf);
exit(3);
}
/*
* Read geometry file header and read in vertices.
*/
fscanf(fgeom,"%d %d %d",&Nvert, &Npoly, &junk);
vertices = (Vertex *)malloc(Nvert * sizeof(Vertex));
for (i = 0; i < Nvert; i++)
fscanf(fgeom,"%f %f %f",&vertices[i].x, &vertices[i].y,
&vertices[i].z);

sprintf(buf,"%s.vnorm",argv[1]);
#ifdef __WATCOMC__
fnorm = fopen(buf, "rb");
#else
fnorm = fopen(buf, "r");
#endif
if (fnorm == (FILE *)NULL)
NoNormals = TRUE;
else {
/*
* Read normal file header and normals.
*/
fscanf(fnorm,"%d %d %d",&Nnorm, &Npoly, &junk);
normals = (Vertex *)malloc(Nnorm * sizeof(Vertex));
for (i = 0; i < Nnorm; i++)
fscanf(fnorm,"%f %f %f",&normals[i].x,
&normals[i].y,
&normals[i].z);
}

sprintf(buf,"%s.ipcol",argv[1]);
#ifdef __WATCOMC__
fpcol = fopen(buf, "rb");
#else
fpcol = fopen(buf, "r");
#endif
if (fpcol == (FILE *)NULL)
NoPcol = TRUE;
else {
fscanf(fpcol,"%d %d",&Ncols, &Npoly);
surfaces = (Vertex *)malloc(Npoly * sizeof(Vertex));
surfindex = (int *)malloc(Npoly * sizeof(int));
for (i = 0; i < Ncols; i++) {
fscanf(fpcol,"%f %f %f", &red, &green, &blue);
find_surface(red, green, blue);
}
for (i = 0; i < Npoly; i++) {
fscanf(fpcol,"%d", & surfindex[ i ] ) ;
surfindex[ i ] -- ;
}
print_surfaces();
}

for (i = 0; i < Npoly; i++) {
fscanf(fgeom,"%d",&porder);
if (!NoNormals) {
fscanf(fnorm, "%d",&porder);
if (porder != 3) {
fprintf(stderr,"%d-sided poly!\n",porder);
exit(10);
}
}
if (porder == 3)
printf("triangle ");
else
printf("poly ");
if (NoPcol)
printf("poly_surf ");
else
printf("poly_surf%d ",surfindex[i]);
print_poly(porder);
}
}

print_poly(order)
int order;
{
int pnum, nnum;

if (order == 0)
return;

fscanf(fgeom,"%d",&pnum);
pnum--;
if (!NoNormals) {
fscanf(fnorm,"%d",&nnum);
nnum--;
}
if (ReverseOrder)
print_poly(order -1);
printf("%f %f %f",vertices[pnum].x, vertices[pnum].y,
vertices[pnum].z);
if (NoNormals)
printf("\n");
else if (!ReverseOrder)
printf(" %f %f %f\n",-normals[nnum].x, -normals[nnum].y,
-normals[nnum].z);
else
printf(" %f %f %f\n",normals[nnum].x, normals[nnum].y,
normals[nnum].z);
if (!ReverseOrder)
print_poly(order -1);
}

find_surface(r, g, b)
float r, g, b;
{
surfaces[Nsurface].x = r;
surfaces[Nsurface].y = g;
surfaces[Nsurface].z = b;
Nsurface++;

}

print_surfaces()
{
int i;

for (i = 0; i < Nsurface; i++)
printf("surface poly_surf%d 0 0 0 %f %f %f 0 0 0 0 0 0 0\n",
i, surfaces[i].x, surfaces[i].y, surfaces[i].z);
}


  3 Responses to “Category : Printer + Display Graphics
Archive   : RAYSH386.ZIP
Filename : OFF2RAY.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/