ftp.nice.ch/pub/next/graphics/3d/Raytracers.N.bs.tar.gz#/raytracers/ohta/src/input.c

This is input.c in view mode; [Download] [Up]

#include <math.h>
#include <stdio.h>

#include "ray.h"

input(s)
char *s;
{struct object *o;
FILE *f;
int i,sp,sd;
char c;
double fov;
	if((f=fopen(s,"r"))==0)
	{	perror(s);
		exit(1);
	}
	o=objects;
	if(fscanf(f," f %lf ",&fov)!=1||fov<=0||fov>=180)
	{	fprintf(stderr,"field of view format error\n");
		exit(1);
	}
	fovf=tan(fov*3.14159/360)/sqrt(2.0);
	o->flags=EYE;
	o->center.x=o->center.y=o->center.z=0;
	o->radius=0;
	o++;
	lights=0;
	while(fscanf(f," l %lf %lf %lf ",&o->center.x,&o->center.y,
		&o->center.z)==3)
	{	o->flags=LIGHT;
		o->radius=0;
		o++;
		lights++;
	}
	maxobj=lights+1;
	while(fscanf(f," o %d %d ",&sp,&sd)==2)
	{	if(maxobj==MAXOBJECTS)
		{	fprintf(stderr,"too many objects\n");
			exit(1);
		}
		if(sp<0||sp>=nshapetab)
		{	fprintf(stderr,"shape number range error\n");
			exit(1);
		}
		if(sd<0||sd>=nshadetab)
		{	fprintf(stderr,"shade number range error\n");
			exit(1);
		}
		o= &objects[maxobj];
		o->flags=0;

		o->shape=shapetab[sp].shapefunc;
		o->spparams=nalloc(double,shapetab[sp].nparams);
		for(i=0;i<shapetab[sp].nparams;i++)
		{	if(fscanf(f," %lf ",&o->spparams[i])!=1)
			{	fprintf(stderr,"shape parameter error\n");
				exit(1);
			}
		}
		(*shapetab[sp].shapeinitfunc)(o);

		o->shade=shadetab[sd].shadefunc;
		o->sdparams=nalloc(double,shadetab[sd].nparams);
		for(i=0;i<shadetab[sd].nparams;i++)
		{	if(fscanf(f," %lf ",&o->sdparams[i])!=1)
			{	fprintf(stderr,"shade parameter error\n");
				exit(1);
			}
		}
		(*shadetab[sd].shadeinitfunc)(o);

		maxobj++;
	}
	if(fscanf(f," %c",&c)!=1||c!='e')
	{	fprintf(stderr,"end command not found\n");
		exit(1);
	}
	(void) fclose(f);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.