Graphics database manipulation programs: code
Ken Turkowski
ken at turtleva.UUCP
Sat Dec 17 07:29:19 AEST 1983
echo x - data/code
mkdir data/code
echo x - data/code/bb_to_txtr.c
cat >data/code/bb_to_txtr.c <<'!Funky!Stuff!'
/* bb_to_txtr.c - convert a portion of the big frame buffer memory to a
texture image file - uses screen ofsets given by bbzoom
to select 128X128 area of screen to use */
#include <stdio.h>
#define TXTR_CODE 0x72747874
#define LINE_LENGTH 81
#define TX_RES 128
static long buffer[TX_RES];
static short texture[TX_RES][TX_RES][5];
main(argc,argv)
int argc; char **argv;
{ short size,j,i,Xofset,Yofset,zoom,hres,vres;
double atof(); char instrg[LINE_LENGTH];
FILE *output; long array[4],code;
bbopen(); /* get Big Buffer */
if (argc < 2)
{ printf(" texture image file name: ");
if ((output = fopen(gets(instrg),"w")) == NULL) error("can't open file");
}
else if ((output = fopen(argv[1],"w")) == NULL) error("can't open file");
bbread(1,501,array,3); /* get zoom and pan */
zoom = array[0]; hres = 640/zoom; vres = 484/zoom;
Xofset = 20 * array[1] + hres/2 - TX_RES/2;
Yofset = (483 - array[2]) - vres/2 - TX_RES/2;
printf(" zoom %d xofset %d yofset %d \n",zoom,Xofset,Yofset);
for (i=0; i<TX_RES; i++)
{ bbread(Xofset,Yofset+i,buffer,TX_RES); /* read buffer */
for (j=0; j<TX_RES; j++)
{ texture[i][j][0] = (buffer[j] >> 16) & 255;
texture[i][j][1] = (buffer[j] >> 8) & 255;
texture[i][j][2] = (buffer[j] ) & 255;
texture[i][j][3] = (buffer[j] >> 24) & 255;
texture[i][j][4] = 255;
}
}
code = TXTR_CODE;
fwrite(&code,4,1,output);
size = 128;
fwrite(&size,2,1,output);
fwrite(texture,2,TX_RES*TX_RES*5,output);
fclose(output);
}
!Funky!Stuff!
echo x - data/code/bin_tags.c
cat >data/code/bin_tags.c <<'!Funky!Stuff!'
/* add magic number tags to binary files */
#include <stdio.h>
#define DET_CODE 0x20746564
#define PCL_CODE 0x206C6370
#define VCL_CODE 0x206C6376
#define TXC_CODE 0x20637874
#define TXTR_CODE 0x72747874
#define FB_CODE 0x20206266
#define BB_CODE 0x20206262
#define FBL_CODE 0x206C6266
#define BBL_CODE 0x206C6262
#define AED_CODE 0x20646561
main(argc,argv)
int argc; char **argv;
{ FILE *output,*input; short i,npts,npolys,nvtx,p[10]; long code;
char filnam[81],savnam[81],string[81],*strptr,*strcat(),*strncpy(),*rindex();
/* nocore(); prevent core dumps */
printf("WARNING!!!!! Do not make a habit of using this program.\n");
printf(" It will disappear when no longer necessary.\n");
if (argc < 2)
{ printf("file name: "); gets(filnam); } /* get output filename */
else strcpy(filnam,argv[1]);
if ((strptr = rindex(filnam,'.')) == 0)
error("Non standard filename extension - %s\nStandard extensions are .det,.pcl,.vcl,.txc,.txtr,.fb,.bb,.fbl,.bbl,.aed\n",filnam); /*no extension*/
else
if (strcmp(strptr,".det") == 0) code = DET_CODE;
else if (strcmp(strptr,".pcl") == 0) code = PCL_CODE;
else if (strcmp(strptr,".vcl") == 0) code = VCL_CODE;
else if (strcmp(strptr,".txc") == 0) code = TXC_CODE;
else if (strcmp(strptr,".txtr") == 0) code = TXTR_CODE;
else if (strcmp(strptr,".fb") == 0) code = FB_CODE;
else if (strcmp(strptr,".bb") == 0) code = BB_CODE;
else if (strcmp(strptr,".fbl") == 0) code = FBL_CODE;
else if (strcmp(strptr,".bbl") == 0) code = BBL_CODE;
else if (strcmp(strptr,".aed") == 0) code = AED_CODE;
else if (strcmp(strptr,".obj") == 0)
error("This doesn't fix .obj files. Just edit out all the '512's to fix them.");
else error("Non standard filename extension - %s\nStandard extensions are .det,.pcl,.vcl,.txc,.txtr,.fb,.bb,.fbl,.bbl,.aed\n",filnam); /*no extension*/
if ((input = fopen(filnam,"r")) == NULL)
error("unable to open %s\n",filnam);
else
{ short word,length; char tag[5];
fread(tag,1,4,input); tag[4] = '\0';
printf("Tag field now contains \"%s\". Do you wish to tag this file? ",tag);
if (strcmp(gets(string),"yes") != 0)
{ close(input); error("Since you didn't reply 'yes', I quit! File not fixed."); }
else
{ close(input); input = fopen(filnam,"r"); }
output = fopen("bin_tags.tmp","w");
fwrite(&code,4,1,output); /* insert tag */
while (fread(&word,2,1,input) != 0)
fwrite(&word,2,1,output);
close(output); close(input);
length = strlen(filnam) - strlen(strptr);
strncpy(savnam,filnam,length); strptr = strcat(savnam,".bak");
system(sprintf(string," mv %s %s",filnam,strptr));
system(sprintf(string," mv bin_tags.tmp %s",filnam));
printf("%s replaced with tagged file - original file in %s\n",filnam,savnam);
}
}
!Funky!Stuff!
echo x - data/code/circle_eye.c
cat >data/code/circle_eye.c <<'!Funky!Stuff!'
/* circle_eye.c - makes circular path moves for scn_assmblr */
#include <stdio.h>
#define pi 3.14159
main()
{ char instrg[81],filename[81]; FILE *output;
short i,j,k,numfrm,divisions;
double dx,dy,dz,start[3],middle[3],end[3],sin(),cos(),sqrt(),ceil();
printf(" output file name : "); gets(filename);
output = fopen(filename,"w");
printf(" start point (rt,out,up) : ");
sscanf(gets(instrg),"%f %f %f",&start[0],&start[1],&start[2]);
printf(" no. of frames : "); sscanf(gets(instrg),"%hd",&numfrm);
divisions = ceil(numfrm/4.);
for (k=0; k<numfrm; k++)
{ double alph,px,py,pz,fac;
alph = 2.*pi*k/(numfrm-1);
px = start[0]*cos(alph) - start[1]*sin(alph);
py = start[0]*sin(alph) + start[1]*cos(alph);
pz = start[2];
fprintf(output,"place eyepoint at %g %g %g\n",px,py,pz);
fprintf(output,"display_on bb 8 %d %d\n",divisions,k);
}
}
!Funky!Stuff!
echo x - data/code/color_bin.c
cat >data/code/color_bin.c <<'!Funky!Stuff!'
/* color_bin.c - make binary standard color files from ASCII standard files */
#include <stdio.h>
#define PCL_CODE 0x206C6370
#define VCL_CODE 0x206C6376
main()
{ FILE *output; short i,npts,dum,p[64]; long code;
float point[4]; char string[512],str2[512];
do gets(string); /* read until EOF or "data" keyword */
while ((*string != NULL) && (strncmp(string,"data",4) != 0) &&
(strncmp(string,"DATA",4) != 0));
code = PCL_CODE; fwrite(&code,4,1,stdout);
sscanf(string,"%s %hd %hd",str2,&npts,&dum);
fwrite(&npts,2,1,stdout);
for (i=0; i<npts; i++) /* read in and copy out points */
{ gets(string);
sscanf(string,"%f %f %f %f",&point[0],&point[1],&point[2],&point[3]);
if ((point[0] < 0.) || (point[0] > 1.)) error(" value > 1. or < 0.");
if ((point[1] < 0.) || (point[1] > 1.)) error(" value > 1. or < 0.");
if ((point[2] < 0.) || (point[2] > 1.)) error(" value > 1. or < 0.");
if ((point[3] < 0.) || (point[3] > 1.)) error(" value > 1. or < 0.");
fwrite(point,4,4,stdout);
}
}
!Funky!Stuff!
echo x - data/code/make_bin.c
cat >data/code/make_bin.c <<'!Funky!Stuff!'
/* make_bin.c - make binary standard polygon data files ASCII standard files */
#include <stdio.h>
#define DET_CODE 0x20746564
main()
{ FILE *output; short i,npts,npolys,nvtx,p[64]; long code;
float point[3]; char string[512],str2[512];
/* nocore(); prevent core dumps */
do gets(string); /* read until EOF or "data" keyword */
while ((*string != NULL) && (strncmp(string,"data",4) != 0) &&
(strncmp(string,"DATA",4) != 0));
code = DET_CODE; /* put on magic number tag */
fwrite(&code,4,1,stdout);
sscanf(string,"%s %hd %hd",str2,&npts,&npolys);
fwrite(&npts,2,1,stdout);
fwrite(&npolys,2,1,stdout);
for (i=0; i<npts; i++) /* read in and copy out points */
{ gets(string);
sscanf(string,"%f %f %f",&point[0],&point[1],&point[2]);
fwrite(point,4,3,stdout);
}
for (i=0; i<npolys; i++) /* do polygons */
{ short j,k;
gets(string);
j = 0; while(string[j] == ' ') j++; /* ignore blanks */
nvtx = atoi(&string[j]); /* get number of vertices */
for (k=0; k<nvtx; k++)
{ while(string[j] != ' ') j++; p[k] = atoi(&string[j]);
while(string[j] == ' ') j++; /* look for blank, read number */
}
fwrite(&nvtx,2,1,stdout);
for (j=0; j<nvtx; j++) fwrite(&p[j],2,1,stdout); /* write out polygon */
}
}
!Funky!Stuff!
echo x - data/code/make_obj.c
cat >data/code/make_obj.c <<'!Funky!Stuff!'
/* make object description files */
#include <stdio.h>
#define MAXPTS 32768
#define DET_CODE 0x20746564
main()
{ FILE *output,*input; short i,npts,npolys,nvtx,p[10]; long code;
char filnam[81],string[81],str2[81],*substr;
struct { float x,y,z; } pts[MAXPTS];
/* nocore(); prevent core dumps */
printf("object name: "); gets(filnam); /* get output filename */
if (index(filnam,'.') != 0) output = fopen(filnam,"w");
else output = fopen(strcat(filnam,".obj"),"w"); /*add ".obj" if no ext.*/
printf("title: "); gets(string); /* get title, copy to output */
fputs("title\t\t",output); fputs(string,output); fputs("\n",output);
printf("display routine: "); gets(string);
fputs("display\t\t",output);
fputs(strcat(str2,string),output); fputs("\n",output);
printf("detail file: "); gets(string);
fputs("detail\t\t",output);
fputs(string,output); fputs("\n",output);
fputs("type\t\tpolygon\n",output);
if ( (input = fopen(string,"r")) != NULL)
{ fread(&code,4,1,input);
if (code != DET_CODE)
{ fprintf(stderr,"warning!! %s not tagged as detail file\n",string);
close(input); fopen(string,"r");
}
fread(&npts,2,1,input); fread(&npolys,2,1,input);
if ( npts <= MAXPTS ) for (i=0; i<npts; i++)
{ double xmin,xmax,ymin,ymax,zmin,zmax;
fread(&pts[i],4,3,input);
if (i==0)
{ xmin=xmax=pts[0].x; ymin=ymax=pts[0].y; zmin=zmax=pts[0].z; }
else
{ if (pts[i].x < xmin) xmin = pts[i].x;
else if (pts[i].x > xmax) xmax = pts[i].x;
if (pts[i].y < ymin) ymin = pts[i].y;
else if (pts[i].y > ymax) ymax = pts[i].y;
if (pts[i].z < zmin) zmin = pts[i].z;
else if (pts[i].z > zmax) zmax = pts[i].z;
}
if (i == npts-1)
fprintf(output,"bounding_box\t%g %g %g %g %g %g\n",
xmin,xmax,ymin,ymax,zmin,zmax);
}
else printf("Too many vertices. %d is > 32768 \n",npts);
}
else printf("unable to open %s\n",string);
}
!Funky!Stuff!
echo x - data/code/make_texture.c
cat >data/code/make_texture.c <<'!Funky!Stuff!'
/* make_texture.c - build a 5 x 128 x 128 array representing a smoothish
image of texture
- the 5 parameters are R,G,B,Transmittance & Gloss - all
vary from 0 to 255.
*/
#include <stdio.h>
#define TXTR_CODE 0x72747874
#define sqr(x) ((x)*(x))
static short texture[128][128][5];
main()
{ short size,i,j; long code; FILE *output; double sin(),pow();
code = TXTR_CODE; size = 128;
/* output = fopen("spots.txtr","w");
for (i=0; i<128; i++) for (j=0; j<128; j++)
{ texture[i][j][0] = texture[i][j][1] = texture[i][j][2] =
texture[i][j][3] = texture[i][j][4] =
128. + 128. * sin(i*3.1416/16.) * sin(j*3.1416/16.);
}
fwrite(&code,4,1,output); fwrite(&size,2,1,output);
fwrite(texture,2,128*128*5,output);
fclose(output); */
/* output = fopen("stripes.txtr","w");
for (i=0; i<128; i++) for (j=0; j<128; j++)
{ double temp;
texture[i][j][0] = texture[i][j][4] = 255;
temp = sin(((i+j)%256) * 3.1416/32.);
temp = (temp > 0.)? 255. * (1. - pow(temp,.5)) : 255.;
texture[i][j][1] = texture[i][j][2] = texture[i][j][3] = temp;
}
fwrite(&code,4,1,output); fwrite(&size,2,1,output);
fwrite(texture,2,128*128*5,output);
fclose(output); */
output = fopen("hatching.txtr","w");
for (i=0; i<128; i++) for (j=0; j<128; j++)
{ double temp,temp2;
temp = sin(i*3.1416/8.); temp2 = sin(j*3.1416/8.);
temp = (temp > 0.)? 1. : 0.;
temp2 = (temp2 > 0.)? 1. : 0.; /* pow(temp2,2.) */
if (temp2 > temp) temp = temp2;
texture[i][j][0] = texture[i][j][1] = texture[i][j][2] = 255. * temp;
texture[i][j][3] = texture[i][j][4] = 255. * (1. - temp);
}
fwrite(&code,4,1,output); fwrite(&size,2,1,output);
fwrite(texture,2,128*128*5,output);
fclose(output);
}
!Funky!Stuff!
echo x - data/code/makefile
cat >data/code/makefile <<'!Funky!Stuff!'
CFLAGS = -O
make_obj: make_obj.o
cc make_obj.o -lm -o make_obj
rm make_obj
rm make_obj.o
make_bin: make_bin.o
cc make_bin.o -lm -o make_bin
rm make_bin
rm make_bin.o
dg_bin: dg_bin.o
cc dg_bin.o -lm -o dg_bin
rm dg_bin
rm dg_bin.o
color_bin: color_bin.o
cc color_bin.o -lm -o color_bin
rm color_bin
rm color_bin.o
txtr_bin: txtr_bin.o
cc txtr_bin.o -lm -o txtr_bin
rm txtr_bin
rm txtr_bin.o
mk_txcoords: mk_txcoords.o
cc mk_txcoords.o -lm -o mk_txcoords
rm mk_txcoords
rm mk_txcoords.o
bb_to_txtr: bb_to_txtr.o
cc bb_to_txtr.o -lm -lbb -o bb_to_txtr
rm bb_to_txtr
rm bb_to_txtr.o
make_texture: make_texture.o
cc make_texture.o -lm -o make_texture
bin_tags: bin_tags.o
cc bin_tags.o -o bin_tags
rm bin_tags
rm bin_tags.o
!Funky!Stuff!
echo x - data/code/mk_txcoords.c
cat >data/code/mk_txcoords.c <<'!Funky!Stuff!'
/* mk_txcoords.c - make binary standard polygon texture coordinate files to
map onto surfaces which are described by a rectangular
array of vertices (eg. terrains and surfaces of revolution)
Polygon array is characterized by the number of polygons in a strip
and the number of strips. Texture coordinates are given for the
beginning and end of the first and last strips respectively.
*/
#include <stdio.h>
#define TXC_CODE 0x20637874
main(argc,argv)
int argc; char **argv;
{ FILE *output; short i,npolys,nvtx,pols_in_strip,num_strips; long code;
struct { float x,y; } p[4],beg_fstrp,end_fstrp,beg_lstrp,end_lstrp;
double atof(),x_beg_inc,y_beg_inc,x_end_inc,y_end_inc,
x_beg, y_beg, x_end, y_end ;
char filename[80];
if (argc != 12) error(" Usage: filename #_per_strip #_strips 4 corner_coords");
output = fopen(argv[1],"w");
pols_in_strip = atoi(argv[2]); num_strips = atoi(argv[3]);
beg_fstrp.x = atof(argv[4]); beg_fstrp.y = atof(argv[5]);
end_fstrp.x = atof(argv[6]); end_fstrp.y = atof(argv[7]);
beg_lstrp.x = atof(argv[8]); beg_lstrp.y = atof(argv[9]);
end_lstrp.x = atof(argv[10]); end_lstrp.y = atof(argv[11]);
code = TXC_CODE;
fwrite(&code,4,1,output);
npolys = pols_in_strip * num_strips;
fwrite(&npolys,2,1,output);
nvtx = 4;
x_beg_inc = (beg_lstrp.x - beg_fstrp.x) / num_strips;
y_beg_inc = (beg_lstrp.y - beg_fstrp.y) / num_strips;
x_end_inc = (end_lstrp.x - end_fstrp.x) / num_strips;
y_end_inc = (end_lstrp.y - end_fstrp.y) / num_strips;
y_beg = beg_fstrp.y; y_end = end_fstrp.y;
x_beg = beg_fstrp.x; x_end = end_fstrp.x;
for (i=0; i<num_strips; i++) /* do polygons */
{ short j,k; double xfst,xlst,yfst,ylst,xfinc,yfinc,xlinc,ylinc;
xfst = x_beg; xfinc = (x_end - x_beg) / (pols_in_strip);
yfst = y_beg; yfinc = (y_end - y_beg) / (pols_in_strip);
xlst = x_beg + x_beg_inc;
xlinc = ((x_end + x_end_inc) - (x_beg + x_beg_inc)) / (pols_in_strip);
ylst = y_beg + y_beg_inc;
ylinc = ((y_end + y_end_inc) - (y_beg + y_beg_inc)) / (pols_in_strip);
for (j=0; j<pols_in_strip; j++)
{ fwrite(&nvtx,2,1,output);
p[0].x = xfst; p[0].y = yfst;
p[3].x = xlst; p[3].y = ylst;
p[2].x = xlst + xlinc; p[2].y = ylst + ylinc;
p[1].x = xfst + xfinc; p[1].y = yfst + yfinc;
fwrite(p,4,nvtx*2,output); /* write out polygon */
xfst += xfinc; xlst += xlinc;
yfst += yfinc; ylst += ylinc;
}
x_beg += x_beg_inc; y_beg += y_beg_inc;
x_end += x_end_inc; y_end += y_end_inc;
}
}
!Funky!Stuff!
echo x - data/code/move_eye.c
cat >data/code/move_eye.c <<'!Funky!Stuff!'
/* move_eye.c - makes path moves for scn_assmblr */
#include <stdio.h>
#define pi 3.14159
main()
{ char instrg[81],filename[81]; FILE *output;
short i,j,k,numfrm,divisions;
double dx,dy,dz,start[3],middle[3],end[3],sin(),cos(),sqrt(),ceil();
printf(" output file name : "); gets(filename);
output = fopen(filename,"w");
printf(" start point (rt,out,up) : ");
sscanf(gets(instrg),"%f %f %f",&start[0],&start[1],&start[2]);
printf(" middle point : ");
sscanf(gets(instrg),"%f %f %f",&middle[0],&middle[1],&middle[2]);
printf(" end point : ");
sscanf(gets(instrg),"%f %f %f",&end[0],&end[1],&end[2]);
printf(" no. of frames : "); sscanf(gets(instrg),"%hd",&numfrm);
divisions = ceil(numfrm/4.);
dx = middle[0] - (end[0]+start[0])/2.;
dy = middle[1] - (end[1]+start[1])/2.;
dz = middle[2] - (end[2]+start[2])/2.;
for (k=0; k<numfrm; k++)
{ double alph,px,py,pz,fac;
alph = pi*k/(numfrm-1);
fac = .5*(1. - cos(alph)); /* ranges 0 to 1 */
px = start[0]*(1.-fac) + end[0]*fac;
py = start[1]*(1.-fac) + end[1]*fac;
pz = start[2]*(1.-fac) + end[2]*fac;
fac = sin(alph);
px = px + dx*fac;
py = py + dy*fac;
pz = pz + dz*fac;
fprintf(output,"place eyepoint at %g %g %g\n",px,py,pz);
fprintf(output,"display_on bb 8 %d %d\n",divisions,k);
}
}
!Funky!Stuff!
echo x - data/code/rescale_bin.c
cat >data/code/rescale_bin.c <<'!Funky!Stuff!'
/* bbox_bin.c - make binary standard polygon data files from Wayne's output
and scale to unit length in z (-.5 to .5) */
#include <stdio.h>
main()
{ FILE *output; short i,npts,npolys,nvtx,p[64];
float point[3]; char string[512],str2[512];
double x1,x2,y1,y2,z1,z2,zscale;
do
{ gets(string); /* read until EOF or "data" keyword */
if (strncmp(string,"BOUNDING BOX",12) == 0)
sscanf(string,"%s %s %f %f %f %f %f %f",str2,str2,&x1,&x2,&z1,&z2,&y1,&y2);
}
while ((*string != NULL) && (strncmp(string,"data",4) != 0) &&
(strncmp(string,"DATA",4) != 0));
sscanf(string,"%s %hd %hd",str2,&npts,&npolys);
fwrite(&npts,2,1,stdout);
fwrite(&npolys,2,1,stdout);
zscale = 1. / (z2 - z1); z1 = (z2 - z1)/2. + z1;
for (i=0; i<npts; i++) /* read in and copy out points */
{ gets(string);
sscanf(string,"%f %f %f",&point[0],&point[2],&point[1]);
point[2] = zscale * (point[2] - z1);
point[2] = -point[2];
fwrite(point,4,3,stdout);
}
for (i=0; i<npolys; i++) /* do polygons */
{ short j,k;
gets(string);
j = 0; while(string[j] == ' ') j++; /* ignore blanks */
nvtx = atoi(&string[j]); /* get number of vertices */
for (k=0; k<nvtx; k++)
{ while(string[j] != ' ') j++; p[k] = atoi(&string[j]);
while(string[j] == ' ') j++; /* look for blank, read number */
}
fwrite(&nvtx,2,1,stdout);
for (j=0; j<nvtx; j++) fwrite(&p[j],2,1,stdout); /* write out polygon */
}
}
!Funky!Stuff!
echo x - data/code/txtr_bin.c
cat >data/code/txtr_bin.c <<'!Funky!Stuff!'
/* txtr_bin.c - make binary standard polygon texture coordinate files from
ASCII files of the same format */
#include <stdio.h>
#define TXC_CODE 0x20637874
main()
{ FILE *output; short i,npolys,nvtx; long code;
struct { float x,y; } p[64];
char string[512],str2[512];
do gets(string); /* read until EOF or "data" keyword */
while ((*string != NULL) && (strncmp(string,"data",4) != 0) &&
(strncmp(string,"DATA",4) != 0));
code = TXC_CODE; fwrite(&code,4,1,stdout);
sscanf(string,"%s %hd",str2,&npolys);
fwrite(&npolys,2,1,stdout);
for (i=0; i<npolys; i++) /* do polygons */
{ short j,k; double atof();
gets(string);
j = 0; while(string[j] == ' ') j++; /* ignore blanks */
nvtx = atoi(&string[j]); /* get number of vertices */
for (k=0; k<nvtx; k++)
{ while(string[j] != ' ') j++; p[k].x = atof(&string[j]);
while(string[j] == ' ') j++; /* ignore blanks */
while(string[j] != ' ') j++; p[k].y = atof(&string[j]);
while(string[j] == ' ') j++; /* ignore blanks */
/* look for blank, read number */
}
fwrite(&nvtx,2,1,stdout);
fwrite(p,4,nvtx*2,stdout); /* write out polygon */
}
}
!Funky!Stuff!
More information about the Comp.sources.unix
mailing list