This is scan.c in view mode; [Download] [Up]
#include <stdio.h> #include <math.h> #include "ray.h" int res = 128, xres, yres; #define MAXRES 2048 typedef struct {int xres, yres;} pichead; typedef unsigned char icolor[3]; char aaflag[5][4*MAXRES+1]; icolor aabuf[5][4*MAXRES+1]; pixel(ic,x,y) icolor ic; register double x,y; {register double t; struct ray r; struct color c; register double m; x*=fovf; y*=fovf; r.obj=0; r.a.x=r.a.y=r.a.z=0; t=1/sqrt(x*x+y*y+1); r.l.x=x*t; r.l.y=y*t; r.l.z=t; c=trace(0,r); m=c.r; if(m<c.g) m=c.g; if(m<c.b) m=c.b; if(m>1.0) { c.r/=m; c.g/=m; c.b/=m; } ic[0]=c.r*255; ic[1]=c.g*255; ic[2]=c.b*255; } aapixel2(ic,i,j) icolor ic; register int i,j; {register double x,y; x=((double)(j-2*xres))/(2*xres); y=((double)(2*yres-i))/(2*yres); pixel(ic,x,y); } aapixel(ic,i,j,ai,s) icolor ic; register int i,j,ai,s; {register int k; icolor c,c00,c01,c10,c11; if(!aaflag[ai][j]) { aapixel2(aabuf[ai][j],i,j); aaflag[ai][j]=1; } if(!aaflag[ai+s][j]) { aapixel2(aabuf[ai+s][j],i+s,j); aaflag[ai+s][j]=1; } if(!aaflag[ai][j+s]) { aapixel2(aabuf[ai][j+s],i,j+s); aaflag[ai][j+s]=1; } if(!aaflag[ai+s][j+s]) { aapixel2(aabuf[ai+s][j+s],i+s,j+s); aaflag[ai+s][j+s]=1; } for(k=0;k<3;k++) { c00[k]=aabuf[ai][j][k]; c10[k]=aabuf[ai+s][j][k]; c01[k]=aabuf[ai][j+s][k]; c11[k]=aabuf[ai+s][j+s][k]; } c[0]=(c00[0]+c01[0]+c10[0]+c11[0])/4; c[1]=(c00[1]+c01[1]+c10[1]+c11[1])/4; c[2]=(c00[2]+c01[2]+c10[2]+c11[2])/4; if(s==1||nearc(c,c00)&&nearc(c,c01)&&nearc(c,c10)&&nearc(c,c11)) { ic[0]=c[0]; ic[1]=c[1]; ic[2]=c[2]; return; } s/=2; aapixel(c00,i,j,ai,s); aapixel(c01,i+s,j,ai+s,s); aapixel(c10,i,j+s,ai,s); aapixel(c11,i+s,j+s,ai+s,s); ic[0]=(c00[0]+c01[0]+c10[0]+c11[0])/4; ic[1]=(c00[1]+c01[1]+c10[1]+c11[1])/4; ic[2]=(c00[2]+c01[2]+c10[2]+c11[2])/4; } scan(f) register int f; {register int i,j; register double x,y; icolor buf[MAXRES]; scaninit(f); for(i=0;i<yres;i++) { for(j=0;j<xres;j++) { x=(2*j-xres+0.5)/xres; y=(yres-2*i-0.5)/yres; pixel(buf[j],x,y); } (void) write(f,(char *)buf,xres*sizeof(icolor)); } } ascan(f) register int f; {icolor buf[MAXRES]; register double x,y; register int i,j,ai; scaninit(f); for(ai=0;ai<5;ai++) for(j=0;j<=4*xres;j++) aaflag[ai][j]=0; for(j=0;j<=4*xres;j+=4) { x=((double)(j-2*xres))/(2*xres); y=1; pixel(aabuf[0][j],x,y); aaflag[0][j]=1; } for(i=0;i<4*yres;i+=4) { for(j=0;j<=4*xres;j+=4) { x=((double)(j-2*xres))/(2*xres); y=((double)(2*yres-(i+4)))/(2*yres); pixel(aabuf[4][j],x,y); aaflag[4][j]=1; } for(j=0;j<4*xres;j+=4) aapixel(buf[j/4],i,j,0,4); (void) write(f,(char *)buf,xres*sizeof(icolor)); for(j=0;j<=4*xres;j++) { aabuf[0][j][0]=aabuf[4][j][0]; aabuf[0][j][1]=aabuf[4][j][1]; aabuf[0][j][2]=aabuf[4][j][2]; aaflag[0][j]=aaflag[4][j]; } for(ai=1;ai<5;ai++) { for(j=0;j<=4*xres;j++) aaflag[ai][j]=0; } } } scaninit(f) int f; {pichead head; if (res>MAXRES) { fprintf(stderr, "res=%d too large, must be less than %d\n", res, MAXRES); exit(1); } head.xres = xres = res; head.yres = yres = res; (void) write(f,(char *)&head,sizeof head); } nearc(c0,c1) icolor c0,c1; {register int d; d=abs(c0[0]-c1[0])+abs(c0[1]-c1[1])+abs(c0[2]-c1[2]); return d<15; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.