This is readfile.c in view mode; [Download] [Up]
/*
* (c) 1988 by George Kyriazis
*/
/*
* read the input file of the ray-tracer
*/
#include <stdio.h>
#include <math.h>
#include "ray.h"
readfile(fname)
char *fname;
{
FILE *f;
int i, j;
int nos, nosq;
char s[10];
f = fopen(fname,"r");
if(f == NULL) {
perror("fopen");
exit(1);
}
/* file format is:
* <fov> field of view
* <eyex eyey eyez> position of the eye
* <dirx diry dirz> dorection of view
* <upx upy upz> up vector
* <time1 time2> time limits
* <#> background cuing
* <iter> number of iterations per pixel
* <x y z angle> coordinates and angle of the light source
* number or spheres number of squares
* <x y z r [ambient] [diff] [spec] refl r g b refr r g b
* width index refl_diffuse refr_diffuse tx ty tz>
* for every sphere
* <x y z x y z x y z [ambient] [diff] [spec]
* refl r g b refr r g b with index
* refl_diffuse refr_diffuse tx ty tz>
* for every square
*/
/* viewing transform */
fscanf(f, "%lf", &fov);
fov = tan( fov * M_PI / 180 ) / sqrt(2.0);
fscanf(f, "%lf %lf %lf", &eye.x, &eye.y, &eye.z);
fscanf(f, "%lf %lf %lf", &eye_dir.x, &eye_dir.y, &eye_dir.z);
fscanf(f, "%lf %lf %lf", &up.x, &up.y, &up.z);
/* time information */
fscanf(f, "%lf %lf", &time1, &time2);
/* the background flag */
fscanf(f, "%s", s);
if( *s == 'n' ) bgflag = NONE;
if( *s == 'x' ) bgflag = X;
if( *s == 'y' ) bgflag = Y;
if( *s == 'z' ) bgflag = Z;
/* how many samples per pixel? */
fscanf(f, "%d", &tries);
/* now the light source */
fscanf(f, "%lf %lf %lf %lf", &light.org.x, &light.org.y,
&light.org.z, &light.angle);
light.angle *= M_PI/180;
fscanf(f, "%d %d", &nos, &nosq);
noo = nos + nosq;
obj = (struct obj *)malloc(noo * sizeof(struct obj) );
if(obj == NULL) {
perror("malloc");
exit(1);
}
i = 0;
for(j = 0; j < nos; j++) {
obj[i].type = SPHERE;
fscanf(f, "%lf %lf %lf %lf", &obj[i].data.sphere.center.x,
&obj[i].data.sphere.center.y,
&obj[i].data.sphere.center.z,
&obj[i].data.sphere.radius );
fscanf(f, "%lf %lf %lf", &obj[i].ambient.r,
&obj[i].ambient.g,
&obj[i].ambient.b);
fscanf(f, "%lf %lf %lf", &obj[i].diffuse.r,
&obj[i].diffuse.g,
&obj[i].diffuse.b);
fscanf(f, "%lf %lf %lf", &obj[i].specular.r,
&obj[i].specular.g,
&obj[i].specular.b);
fscanf(f, "%lf %lf %lf %lf", &obj[i].reflection,
&obj[i].refl_color.r,
&obj[i].refl_color.g,
&obj[i].refl_color.b);
fscanf(f, "%lf %lf %lf %lf", &obj[i].refraction,
&obj[i].refr_color.r,
&obj[i].refr_color.g,
&obj[i].refr_color.b);
fscanf(f, "%lf %lf", &obj[i].width, &obj[i].index);
fscanf(f, "%lf %lf", &obj[i].refl_diffuse,
&obj[i].refr_diffuse);
obj[i].refl_diffuse *= M_PI / 180;
obj[i].refr_diffuse *= M_PI / 180;
fscanf(f, "%lf %lf %lf", &obj[i].time.x,
&obj[i].time.y, &obj[i].time.z);
i++;
}
for( j = 0; j < nosq; j++) {
obj[i].type = SQUARE;
fscanf(f, "%lf %lf %lf", &obj[i].data.quad.p1.x,
&obj[i].data.quad.p1.y,
&obj[i].data.quad.p1.z);
fscanf(f, "%lf %lf %lf", &obj[i].data.quad.p2.x,
&obj[i].data.quad.p2.y,
&obj[i].data.quad.p2.z);
fscanf(f, "%lf %lf %lf", &obj[i].data.quad.p3.x,
&obj[i].data.quad.p3.y,
&obj[i].data.quad.p3.z);
fscanf(f, "%lf %lf %lf", &obj[i].ambient.r,
&obj[i].ambient.g,
&obj[i].ambient.b);
fscanf(f, "%lf %lf %lf", &obj[i].diffuse.r,
&obj[i].diffuse.g,
&obj[i].diffuse.b);
fscanf(f, "%lf %lf %lf", &obj[i].specular.r,
&obj[i].specular.g,
&obj[i].specular.b);
fscanf(f, "%lf %lf %lf %lf", &obj[i].reflection,
&obj[i].refl_color.r,
&obj[i].refl_color.g,
&obj[i].refl_color.b);
fscanf(f, "%lf %lf %lf %lf", &obj[i].refraction,
&obj[i].refr_color.r,
&obj[i].refr_color.g,
&obj[i].refr_color.b);
fscanf(f, "%lf %lf", &obj[i].width, &obj[i].index);
fscanf(f, "%lf %lf", &obj[i].refl_diffuse,
&obj[i].refr_diffuse);
obj[i].refl_diffuse *= M_PI / 180;
obj[i].refr_diffuse *= M_PI / 180;
fscanf(f, "%lf %lf %lf", &obj[i].time.x,
&obj[i].time.y, &obj[i].time.z);
i++;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.