1 /*
2  * setup.c
3  *
4  * Copyright (C) 1989, 1991, Craig E. Kolb
5  * All rights reserved.
6  *
7  * This software may be freely copied, modified, and redistributed
8  * provided that this copyright notice is preserved on all copies.
9  *
10  * You may not distribute this software, in whole or in part, as part of
11  * any commercial product without the express consent of the authors.
12  *
13  * There is no warranty or other guarantee of fitness of this software
14  * for any purpose.  It is provided solely "as is".
15  *
16  * $Id: setup.c,v 4.0.1.2 92/01/14 18:29:35 cek Exp Locker: cek $
17  *
18  * $Log:	setup.c,v $
19  * Revision 4.0.1.2  92/01/14  18:29:35  cek
20  * patch3: Added initialization of cpp option.
21  *
22  * Revision 4.0.1.1  91/09/29  15:52:20  cek
23  * patch1: Added crop window initialization.
24  * patch1: Moved RSViewing call to appropriate location.
25  *
26  * Revision 4.0  91/07/17  14:47:24  kolb
27  * Initial version.
28  *
29  */
30 #include "rayshade.h"
31 #include "defaults.h"
32 #include "libsurf/surface.h"
33 #include "libsurf/atmosphere.h"
34 #include "liblight/light.h"
35 #include "liblight/infinite.h"
36 #include "libobj/list.h"
37 #include "options.h"
38 #include "stats.h"
39 #include "viewing.h"
40 #include "picture.h"
41 
42 #ifdef MULTIMAX
43 #include <parallel.h>
44 #define SHARED_BYTES	23	/* 2^23 bytes of shared memory */
45 #endif
46 
47 extern GeomList *Defstack;
48 
49 static void SetupWorld();
50 
51 /*
52  * Set default parameters
53  */
54 void
RSSetup()55 RSSetup()
56 {
57 	extern SurfList *CurSurf;
58 	extern Medium TopMedium;
59 	extern void NoiseInit();
60 #ifdef MULTIMAX
61 	unsigned int bytes;
62 
63 	/*
64 	 * Initialize shared memory stuff.
65 	 */
66 	bytes = 1 << SHARED_BYTES;
67 	if (share_malloc_init(bytes) == -1) {
68 		RLerror(RL_PANIC, "Cannot share_malloc %d bytes.\n",bytes);
69 	} else
70 		fprintf(fstats,"Malloced %d bytes of shared memory.\n",
71 				bytes);
72 #endif
73 
74 	Camera.hfov = HFOV;
75 	Camera.vfov = UNSET;
76 	Camera.pos.x = EYEX;
77 	Camera.pos.y = EYEY;
78 	Camera.pos.z = EYEZ;
79 	Camera.lookp.x = LOOKX;
80 	Camera.lookp.y = LOOKY;
81 	Camera.lookp.z = LOOKZ;
82 	Camera.up.x = UPX;
83 	Camera.up.y = UPY;
84 	Camera.up.z = UPZ;
85 	Camera.focaldist = UNSET;
86 	Camera.aperture = 0.;
87 
88 	Screen.xres = Screen.yres = UNSET;
89 
90 	Options.cpp = TRUE;
91 	Options.maxdepth = MAXDEPTH;
92 	Options.report_freq = REPORTFREQ;
93 	Options.jitter = TRUE;
94 	Options.samples = UNSET;
95 	Options.gaussian = GAUSSIAN;
96 	Options.filterwidth = UNSET;
97 	Options.contrast.r = UNSET;
98 	Options.ambient.r = Options.ambient.g =
99 		Options.ambient.b = 1.0;
100 	Options.cutoff.r = UNSET;
101 	Options.cache = TRUE;
102 	Options.shadowtransp = TRUE;
103 	Options.crop[LOW][X] = Options.crop[LOW][Y] = 0.;
104 	Options.crop[HIGH][X] = Options.crop[HIGH][Y] = 1.;
105 	Stats.fstats = stderr;
106 	Options.pictfile = stdout;
107 #ifdef URT
108 	Options.alpha = TRUE;
109 	Options.exp_output = FALSE;
110 #endif
111 	Options.gamma = GAMMA;
112 	Options.eyesep = UNSET;
113 #ifdef LINDA
114 	Options.workers = WORKERS;
115 #endif
116 
117 	Options.totalframes = 1;
118 	Options.startframe = 0;
119 	Options.starttime = 0.;
120 	Options.framelength = 1.;
121 	Options.shutterspeed = 0.;
122 
123 	TopMedium.index = DEFAULT_INDEX;
124 	TopMedium.statten = 1.0;
125 	NoiseInit();			/* Initialize values for Noise() */
126 
127 	/*
128 	 * Top of object definition stack points to the World object.
129 	 * The World object is always a list.
130 	 */
131 	Defstack = GeomStackPush(GeomListCreate(), (GeomList *)NULL);
132 	Defstack->obj->name = strsave("World");
133 	/* Initialize surface stack */
134 	CurSurf = SurfPush((Surface *)NULL, (SurfList *)NULL);
135 }
136 
137 /*
138  * cleanup()
139  *
140  * Initialize options/variables not set on command line or in input file.
141  * Perform sanity checks on widow dimension, maxdepth, etc.
142  */
143 void
RSCleanup()144 RSCleanup()
145 {
146 	extern Light *Lights;
147 	extern void OpenStatsFile();
148 	extern FILE *yyin;
149 
150 	yyin = (FILE *)NULL;	/* mark that we're done reading input */
151 
152 	if (Options.samples == UNSET)
153 		Options.samples = DEFSAMPLES;
154 
155 	if (Options.filterwidth == UNSET) {
156 		if (Options.gaussian)
157 			Options.filterwidth = FILTERWIDTH;
158 		else
159 			/* Default box filter width of 1.0 */
160 			Options.filterwidth = 1.0;
161 	}
162 
163 	Options.endframe = Options.startframe + Options.totalframes -1;
164 
165 	OpenStatsFile();
166 
167 	ViewingSetup();
168 
169 	if (Options.cutoff.r == UNSET)
170 		Options.cutoff.r = Options.cutoff.g =
171 			Options.cutoff.b = DEFCUTOFF;
172 
173 	/*
174 	 * Set contrast.
175 	 */
176 	if (Options.contrast.r == UNSET) {
177 		Options.contrast.r = DEFREDCONT;
178 		Options.contrast.g = DEFGREENCONT;
179 		Options.contrast.b = DEFBLUECONT;
180 	}
181 
182 	/*
183 	 * Image gamma is inverse of display gamma.
184 	 */
185 	if (fabs(Options.gamma) > EPSILON)
186 		Options.gamma = 1. / Options.gamma;
187 	else
188 		Options.gamma = FAR_AWAY;
189 
190 	if (Options.maxdepth < 0)
191 		Options.maxdepth = 0;
192 
193 
194 	LightSetup();
195 }
196 
197 void
RSStartFrame(frame)198 RSStartFrame(frame)
199 int frame;
200 {
201 	/*
202 	 * Set the frame start time
203 	 */
204 	Options.framenum = frame;
205 	Options.framestart = Options.starttime +
206 			Options.framenum*Options.framelength;
207 	SamplingSetTime(Options.framestart, Options.shutterspeed,
208 			Options.framenum);
209 	/*
210 	 * Set up viewing parameters.
211 	 * Can't animate camera yet; when possible, this will
212 	 * need to be much smarter.
213 	 * RSViewing();
214 	 */
215 
216 	/*
217 	 * Initialize world
218 	 */
219 	WorldSetup();
220 }
221 
222 /*
223  * Initialize non-time-varying goodies.
224  */
225 void
RSInitialize(argc,argv)226 RSInitialize(argc, argv)
227 int argc;
228 char **argv;
229 {
230 	/*
231  	 * Initialize variables, etc.
232 	 */
233 	RSSetup();
234 	/*
235 	 * Parse options from command line.
236 	 */
237 	RSOptionsSet(argc, argv);
238 	/*
239 	 * Process input file.
240 	 */
241 	if (Options.verbose) {
242 		VersionPrint();
243 		fprintf(Stats.fstats,"Reading input file...\n");
244 		(void)fflush(Stats.fstats);
245 	}
246 	RSReadInputFile();
247 	/*
248 	 * Set variables that weren't set on command line
249 	 * or in input file.
250 	 */
251 	RSCleanup();
252 	/*
253 	 * Set sampling options.
254 	 */
255 	SamplingSetOptions(Options.samples, Options.gaussian,
256 			   Options.filterwidth);
257 	/*
258 	 * Camera is currently static; initialize it here.
259 	 */
260 	RSViewing();
261 }
262