bahilchie@watnot.UUCP (Brian Hilchie) (08/22/86)
Here is a program to convert output from the ray tracing program (v2.0) recently posted to net.sources into a format suitable for display on a C64. Enclosed is a shell archive containing: tracer.c, macros.h -- Modified versions of files originally distributed with the tracer program. The program must be remade with these new versions. cnv.c -- The conversion program. This program takes as input the output file produced by the tracer program annd writes as output a file which may displayed on a 64. The default input and output files are data.dis and and pic64, but these may be changed with the options -i filename and -o filename. display.uue -- A uuencoded BASIC program to display pictures output by cnv on a C64. Brian Hilchie ...ihnp4!watmath!watnot!bahilchie ------------------------------------------------------------------------------- # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by watnot!bahilchie on Thu Aug 21 22:10:16 EDT 1986 # Contents: tracer.c macros.h cnv.c display.uue echo x - tracer.c sed 's/^@//' > "tracer.c" <<'@//E*O*F tracer.c//' /*************************************************************** * basic ray tracing package tracer2.0 * * version 0.0 done 6/1/86-6/10/86 * * version 1.0 released 6/29/86 * * version 2.0 released 7/5/86 * * by friedrich knauss (one tired programmer) * ***************************************************************/ #include <stdio.h> #include <math.h> #include "rtd.h" #include "macros.h" #define XSIZE 160 #define YSIZE 200 FILE * fp; double suzie[300][300], sam = 1.0; int xsue, ysue; struct ball *bl[150]; int level, nob; struct sphere ls; main (argc, argv) int argc; char **argv; { FILE * df, *texfile; static double xco, yco; struct ray rr; struct vector vp; double x, y, z; double xfac, yfac, offset; int i, in = 0, out = 0, tex = 0, xc, yc; int c; /* command interp */ for (i = 1; i < argc; i++) { if (argv[i][0] != '-') booboo ("Options strt with a '-' bozo"); c = argv[i][1]; switch (c) { case ('i'): /* input file */ if (in) booboo ("Sorry, but you may only have one input file"); in = 1; if ((i + 1) >= argc || argv[i + 1][0] == '-')/* no arg */ df = stdin; else if ((df = fopen (argv[++i], "r")) == NULL) booboo ("input file not found"); break; case ('o'): /* output file */ if (out) booboo ("Sorry, but you may have only one output file"); out = 1; if ((i + 1) >= argc || argv[i + 1][0] == '-')/* no arg */ fp = stdout; else fp = fopen (argv[++i], "w"); break; case ('s'): /* susie file */ if (tex) booboo ("Sorry, but you may have only one image file"); if ((i + 1) >= argc || argv[i + 1][0] == '-')/* no arg */ booboo ("-s requires an argument"); tex = 1; if ((texfile = fopen (argv[++i], "r")) == NULL) booboo ("image file not found"); break; booboo ("this line shouldn't do anything"); case ('S'): /* amount of susie */ if (argv[i][2] < '0' || argv[i][2] > 9) booboo ("-S needs a numerical argument"); sam = atof (&(argv[i][2])); break; default: booboo ("Unrecognized option. Better try again"); } } if (!in) if ((df = fopen ("bdata.i", "r")) == NULL) booboo ("bdata.i not found"); if (!out) fp = fopen ("data.dis", "w"); if (!tex) if ((texfile = fopen ("pat.def", "r")) == NULL) booboo ("pat.def not found"); /* if you can't figure *this* out, you should go home */ nob = g_bal (df); g_bod (texfile); MV (95.0, 140.0, -200.0, vp); MV (0.0, 900.0, 0.0, ls.cent); ls.rad = 40; fprintf (fp, "%d %d\n", XSIZE, YSIZE); xfac = (XMAX-XMIN)/SCALE; yfac = (YMAX-YMIN)/SCALE; offset = (SCALE-1.0)/2.0; for (yc = YSIZE-1; yc >= 0; yc--) for (xc = 0; xc < XSIZE; xc++) { xco = (double) xc/(XSIZE-1)*xfac + XMIN + xfac*offset; yco = (double) yc/(YSIZE-1)*yfac + YMIN + yfac*offset; MV (xco, yco, 0.0, rr.org); SV (rr.dir, rr.org, vp); fprintf (fp, "%c", shade (&rr)); } } booboo (str) char *str; { printf ("%s\n", str); exit (-1); } @//E*O*F tracer.c// chmod u=rw,g=r,o=r tracer.c echo x - macros.h sed 's/^@//' > "macros.h" <<'@//E*O*F macros.h//' /* some of the most important stuff in the program */ #define DOT(v1,v2) (v1.x*v2.x+v1.y*v2.y+v1.z*v2.z) /* returns dot product of two vectors */ #define LN2(v) (DOT(v,v)) /* returns the square of the length of a vector */ #define LEN(v) sqrt(LN2(v)) /* guess */ #define XZL(v) sqrt(v.x*v.x+v.z*v.z) /* returns the component in the xz plane of a vector */ #define SCMLT(sc,vct) vct.x*= sc;vct.y*= sc;vct.z*= sc;vct.l*= sc; /* multiplies a vetor by a scalar */ #define MV(a,b,c,v) v.x= a;v.y= b;v.z= c; /* makes a vector. wouldn't need this with c++ */ #define SV(t,u,v) t.x=u.x-v.x;t.y=u.y-v.y;t.z=u.z-v.z; /*subtract vector t=u-v */ #define AV(t,u,v) t.x=u.x+v.x;t.y=u.y+v.y;t.z=u.z+v.z; /* add vector t=u+v */ #define MTV(v1,m,v2) MV(DOT(m.x,v2),DOT(m.y,v2),DOT(m.z,v2),v1) /* multiply transpose matrix by vector. v1=m*v2 */ #define LEVEL 5/* levels of recursion */ #define RLEV 3/*don't want as many inside the ball, takes forever as it is*/ #define XMIN 10.0 #define XMAX 220.0 #define YMIN 10.0 #define YMAX 170.0 /* window size, virtual units */ #define SCALE 1.0 /* maginification factor */ @//E*O*F macros.h// chmod u=rw,g=r,o=r macros.h echo x - cnv.c sed 's/^@//' > "cnv.c" <<'@//E*O*F cnv.c//' #include <stdio.h> #define XSIZE 160 #define YSIZE 200 #define NBLOCKS 1000 #define block(x,y) ( (y/8)*40 + x/4 ) #define cnvcol(x) ( x/51 <= 4 ? x/51 : 4 ) int colmap[] = { 0, 11, 12, 15, 1 }; struct { int nasgn; /* numbers of colours used */ int cols[3]; } colasgn[NBLOCKS]; int bitmap[XSIZE][YSIZE]; main (argc, argv) int argc; char **argv; { FILE *f; int c; int x, y; char *infile = "data.dis"; char *outfile = "pic64"; while (--argc > 0) if (strcmp (*++argv, "-i") == 0) if (--argc > 0) infile = *++argv; else error ("Missing input file name"); else if (strcmp (*argv, "-o") == 0) if (--argc > 0) outfile = *++argv; else error ("Missing output file name"); else error ("Unknown option"); f = fopen (infile, "r"); if (f == NULL) error ("Can't open input file"); while ( (c = getc(f)) != '\n') ; for (c = 0; c < NBLOCKS; c++) { colasgn[c].nasgn = 0; colasgn[c].cols[0] = 0; colasgn[c].cols[1] = 0; colasgn[c].cols[2] = 0; } for (y = 0; y < YSIZE; y++) for (x = 0; x < XSIZE; x++) insert (getc(f), x, y); fclose (f); f = fopen (outfile, "w"); if (f == NULL) error ("Can't open output file"); output (f); fclose (f); } error (str) char *str; { fprintf (stderr, "%s\n", str); exit (1); } insert (byte, x, y) { int c, col; col = cnvcol (byte); c = find (col, x, y); if (c < 0) c = find (col-1, x, y); bitmap[x][y] = c; } find (col, x, y) { int blk, i, c; if (col == 0) c = 0; else { blk = block (x, y); for (i = 0; i < colasgn[blk].nasgn && colasgn[blk].cols[i] != col; i++) ; if (i < colasgn[blk].nasgn) c = i + 1; else if (colasgn[blk].nasgn < 3) { i = colasgn[blk].nasgn++; colasgn[blk].cols[i] = col; c = i + 1; } else c = -1; } } output (f) FILE *f; { int blk, row, column, x, y, byte; for (blk = 0; blk < NBLOCKS; blk++) for (row = 0; row < 8; row++) { byte = 0; for (column = 0; column < 4; column++) { x = (blk%40)*4 + column; y = (blk/40)*8 + row; byte = ( byte << 2 ) | bitmap[x][y]; } putc (byte, f); } for (blk = 0; blk < NBLOCKS; blk++) putc ((colmap[colasgn[blk].cols[0]] << 4) | colmap[colasgn[blk].cols[1]], f); for (blk = 0; blk < NBLOCKS; blk++) putc (colmap[colasgn[blk].cols[2]], f); } @//E*O*F cnv.c// chmod u=rw,g=r,o=r cnv.c echo x - display.uue sed 's/^@//' > "display.uue" <<'@//E*O*F display.uue//' begin 644 display M 0@K" H A2*3$1$1$1$1$1$1$1$1!5!)0U154D4@1DE,12!.04U%(CM.) !! M"!0 ES4S,C@P+# ZES4S,C@Q+# 5P@> )<U,S(W,BS"*#4S,C<R*; X ($( M* "7-3,R-C4LPB@U,S(V-2FP,S(ZES4S,C<P+,(H-3,R-S IL#$V (\(,@"? M,BPX+#(L3B0 F0@\ )XR,S T * (1@"@,@"R"% H4XD.HM.)+(B(HDX, #* M"%H ES4S,C<R+,(H-3,R-S(IKS(T-P#V"&0 ES4S,C8U+,(H-3,R-C4IKS(R M,SJ7-3,R-S LPB@U,S(W,"FO,C,Y /X(;@"),3 "B B#&_ZD@A?R@ (3[ M(,__D?O(T +F_,! T/*E_,D_T.RI!(7\H "$^R#/_Y'[R- "YOS Z-#RI?S) F!]#LJ=B%_* A/L@S_^1^\C0 N;\P.C0\J7\R=O0["#,_V"JJJK end @//E*O*F display.uue// chmod u=rw,g=r,o=r display.uue exit 0