1d86ed7fbStbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2005-2021 Intel Corporation
3d86ed7fbStbbdev 
4d86ed7fbStbbdev     Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev     you may not use this file except in compliance with the License.
6d86ed7fbStbbdev     You may obtain a copy of the License at
7d86ed7fbStbbdev 
8d86ed7fbStbbdev         http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev 
10d86ed7fbStbbdev     Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev     distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev     See the License for the specific language governing permissions and
14d86ed7fbStbbdev     limitations under the License.
15d86ed7fbStbbdev */
16d86ed7fbStbbdev 
17d86ed7fbStbbdev /*
18d86ed7fbStbbdev     The original source for this example is
19d86ed7fbStbbdev     Copyright (c) 1994-2008 John E. Stone
20d86ed7fbStbbdev     All rights reserved.
21d86ed7fbStbbdev 
22d86ed7fbStbbdev     Redistribution and use in source and binary forms, with or without
23d86ed7fbStbbdev     modification, are permitted provided that the following conditions
24d86ed7fbStbbdev     are met:
25d86ed7fbStbbdev     1. Redistributions of source code must retain the above copyright
26d86ed7fbStbbdev        notice, this list of conditions and the following disclaimer.
27d86ed7fbStbbdev     2. Redistributions in binary form must reproduce the above copyright
28d86ed7fbStbbdev        notice, this list of conditions and the following disclaimer in the
29d86ed7fbStbbdev        documentation and/or other materials provided with the distribution.
30d86ed7fbStbbdev     3. The name of the author may not be used to endorse or promote products
31d86ed7fbStbbdev        derived from this software without specific prior written permission.
32d86ed7fbStbbdev 
33d86ed7fbStbbdev     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
34d86ed7fbStbbdev     OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35d86ed7fbStbbdev     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36d86ed7fbStbbdev     ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37d86ed7fbStbbdev     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38d86ed7fbStbbdev     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39d86ed7fbStbbdev     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40d86ed7fbStbbdev     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41d86ed7fbStbbdev     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42d86ed7fbStbbdev     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43d86ed7fbStbbdev     SUCH DAMAGE.
44d86ed7fbStbbdev */
45d86ed7fbStbbdev 
46d86ed7fbStbbdev /*
47d86ed7fbStbbdev  * parse.cpp - an UltraLame (tm) parser for simple data files...
48d86ed7fbStbbdev  */
49d86ed7fbStbbdev 
50d86ed7fbStbbdev // Try preventing lots of GCC warnings about ignored results of fscanf etc.
51d86ed7fbStbbdev #ifdef __GNUC__
52d86ed7fbStbbdev // Starting from 4.5, GCC has a suppression option
53d86ed7fbStbbdev #pragma GCC diagnostic ignored "-Wunused-result"
54d86ed7fbStbbdev #endif
55d86ed7fbStbbdev 
56d86ed7fbStbbdev #include <cstdio>
57d86ed7fbStbbdev #include <cmath>
58d86ed7fbStbbdev #include <cstring>
59d86ed7fbStbbdev #include <cstdlib>
60d86ed7fbStbbdev #include <cctype> /* needed for toupper(), macro.. */
61d86ed7fbStbbdev 
62d86ed7fbStbbdev #include "types.hpp"
63d86ed7fbStbbdev #include "api.hpp" /* rendering API */
64d86ed7fbStbbdev 
65d86ed7fbStbbdev #define PARSE_INTERNAL
66d86ed7fbStbbdev #include "parse.hpp" /* self protos */
67d86ed7fbStbbdev #undef PARSE_INTERNAL
68d86ed7fbStbbdev 
69d86ed7fbStbbdev static texentry textable[NUMTEXS]; /* texture lookup table */
70d86ed7fbStbbdev static texentry defaulttex; /* The default texture when a lookup fails */
71d86ed7fbStbbdev static int numtextures; /* number of TEXDEF textures */
72d86ed7fbStbbdev static int numobjectsparsed; /* total number of objects parsed so far */
73d86ed7fbStbbdev static color scenebackcol; /* scene background color */
74d86ed7fbStbbdev 
stringcmp(const char * a,const char * b)75d86ed7fbStbbdev static int stringcmp(const char *a, const char *b) {
76d86ed7fbStbbdev     std::size_t i, s, l;
77d86ed7fbStbbdev 
78d86ed7fbStbbdev     s = strlen(a);
79d86ed7fbStbbdev     l = strlen(b);
80d86ed7fbStbbdev 
81d86ed7fbStbbdev     if (s != l)
82d86ed7fbStbbdev         return 1;
83d86ed7fbStbbdev 
84d86ed7fbStbbdev     for (i = 0; i < s; i++) {
85d86ed7fbStbbdev         if (toupper(a[i]) != toupper(b[i])) {
86d86ed7fbStbbdev             return 1;
87d86ed7fbStbbdev         }
88d86ed7fbStbbdev     }
89d86ed7fbStbbdev     return 0;
90d86ed7fbStbbdev }
91d86ed7fbStbbdev 
reset_tex_table(void)92d86ed7fbStbbdev static void reset_tex_table(void) {
93d86ed7fbStbbdev     apitexture apitex;
94d86ed7fbStbbdev 
95d86ed7fbStbbdev     numtextures = 0;
96d86ed7fbStbbdev     memset(&textable, 0, sizeof(textable));
97d86ed7fbStbbdev 
98d86ed7fbStbbdev     apitex.col.r = 1.0;
99d86ed7fbStbbdev     apitex.col.g = 1.0;
100d86ed7fbStbbdev     apitex.col.b = 1.0;
101d86ed7fbStbbdev     apitex.ambient = 0.1;
102d86ed7fbStbbdev     apitex.diffuse = 0.9;
103d86ed7fbStbbdev     apitex.specular = 0.0;
104d86ed7fbStbbdev     apitex.opacity = 1.0;
105d86ed7fbStbbdev     apitex.texturefunc = 0;
106d86ed7fbStbbdev 
107d86ed7fbStbbdev     defaulttex.tex = rt_texture(&apitex);
108d86ed7fbStbbdev }
109d86ed7fbStbbdev 
add_texture(void * tex,char name[TEXNAMELEN])110d86ed7fbStbbdev static errcode add_texture(void *tex, char name[TEXNAMELEN]) {
111d86ed7fbStbbdev     textable[numtextures].tex = tex;
112d86ed7fbStbbdev     strcpy(textable[numtextures].name, name);
113d86ed7fbStbbdev 
114d86ed7fbStbbdev     numtextures++;
115d86ed7fbStbbdev     if (numtextures > NUMTEXS) {
116d86ed7fbStbbdev         fprintf(stderr, "Parse: %d textures allocated, texture slots full!\n", numtextures);
117d86ed7fbStbbdev         numtextures--; /* keep writing over last texture if we've run out.. */
118d86ed7fbStbbdev         return PARSEALLOCERR;
119d86ed7fbStbbdev     }
120d86ed7fbStbbdev 
121d86ed7fbStbbdev     return PARSENOERR;
122d86ed7fbStbbdev }
123d86ed7fbStbbdev 
find_texture(char name[TEXNAMELEN])124d86ed7fbStbbdev static void *find_texture(char name[TEXNAMELEN]) {
125d86ed7fbStbbdev     int i;
126d86ed7fbStbbdev 
127d86ed7fbStbbdev     for (i = 0; i < numtextures; i++) {
128d86ed7fbStbbdev         if (strcmp(name, textable[i].name) == 0)
129d86ed7fbStbbdev             return textable[i].tex;
130d86ed7fbStbbdev     }
131d86ed7fbStbbdev     fprintf(stderr, "Undefined texture '%s', using default. \n", name);
132d86ed7fbStbbdev     return (defaulttex.tex);
133d86ed7fbStbbdev }
134d86ed7fbStbbdev 
degtorad(apiflt deg)135d86ed7fbStbbdev apiflt degtorad(apiflt deg) {
136d86ed7fbStbbdev     apiflt tmp;
137d86ed7fbStbbdev     tmp = deg * 3.1415926 / 180.0;
138d86ed7fbStbbdev     return tmp;
139d86ed7fbStbbdev }
140d86ed7fbStbbdev 
degvectoradvec(vector * degvec)141d86ed7fbStbbdev static void degvectoradvec(vector *degvec) {
142d86ed7fbStbbdev     vector tmp;
143d86ed7fbStbbdev 
144d86ed7fbStbbdev     tmp.x = degtorad(degvec->x);
145d86ed7fbStbbdev     tmp.y = degtorad(degvec->y);
146d86ed7fbStbbdev     tmp.z = degtorad(degvec->z);
147d86ed7fbStbbdev     *degvec = tmp;
148d86ed7fbStbbdev }
149d86ed7fbStbbdev 
InitRot3d(RotMat * rot,apiflt x,apiflt y,apiflt z)150d86ed7fbStbbdev static void InitRot3d(RotMat *rot, apiflt x, apiflt y, apiflt z) {
151d86ed7fbStbbdev     rot->rx1 = cos(y) * cos(z);
152d86ed7fbStbbdev     rot->rx2 = sin(x) * sin(y) * cos(z) - cos(x) * sin(z);
153d86ed7fbStbbdev     rot->rx3 = sin(x) * sin(z) + cos(x) * cos(z) * sin(y);
154d86ed7fbStbbdev 
155d86ed7fbStbbdev     rot->ry1 = cos(y) * sin(z);
156d86ed7fbStbbdev     rot->ry2 = cos(x) * cos(z) + sin(x) * sin(y) * sin(z);
157d86ed7fbStbbdev     rot->ry3 = cos(x) * sin(y) * sin(z) - sin(x) * cos(z);
158d86ed7fbStbbdev 
159d86ed7fbStbbdev     rot->rz1 = sin(y);
160d86ed7fbStbbdev     rot->rz2 = sin(x) * cos(y);
161d86ed7fbStbbdev     rot->rz3 = cos(x) * cos(y);
162d86ed7fbStbbdev }
163d86ed7fbStbbdev 
Rotate3d(RotMat * rot,vector * vec)164d86ed7fbStbbdev static void Rotate3d(RotMat *rot, vector *vec) {
165d86ed7fbStbbdev     vector tmp;
166d86ed7fbStbbdev     tmp.x = (vec->x * (rot->rx1) + vec->y * (rot->rx2) + vec->z * (rot->rx3));
167d86ed7fbStbbdev     tmp.y = (vec->x * (rot->ry1) + vec->y * (rot->ry2) + vec->z * (rot->ry3));
168d86ed7fbStbbdev     tmp.z = (vec->x * (rot->rz1) + vec->y * (rot->rz2) + vec->z * (rot->rz3));
169d86ed7fbStbbdev     *vec = tmp;
170d86ed7fbStbbdev }
171d86ed7fbStbbdev 
Scale3d(vector * scale,vector * vec)172d86ed7fbStbbdev static void Scale3d(vector *scale, vector *vec) {
173d86ed7fbStbbdev     vec->x = vec->x * scale->x;
174d86ed7fbStbbdev     vec->y = vec->y * scale->y;
175d86ed7fbStbbdev     vec->z = vec->z * scale->z;
176d86ed7fbStbbdev }
177d86ed7fbStbbdev 
Trans3d(vector * trans,vector * vec)178d86ed7fbStbbdev static void Trans3d(vector *trans, vector *vec) {
179d86ed7fbStbbdev     vec->x += trans->x;
180d86ed7fbStbbdev     vec->y += trans->y;
181d86ed7fbStbbdev     vec->z += trans->z;
182d86ed7fbStbbdev }
183d86ed7fbStbbdev 
GetString(FILE * dfile,const char * string)184d86ed7fbStbbdev static errcode GetString(FILE *dfile, const char *string) {
185d86ed7fbStbbdev     char data[255];
186d86ed7fbStbbdev 
187d86ed7fbStbbdev     fscanf(dfile, "%s", data);
188d86ed7fbStbbdev     if (stringcmp(data, string) != 0) {
189d86ed7fbStbbdev         fprintf(stderr, "parse: Expected %s, got %s \n", string, data);
190d86ed7fbStbbdev         fprintf(stderr, "parse: Error while parsing object: %d \n", numobjectsparsed);
191d86ed7fbStbbdev         return PARSEBADSYNTAX;
192d86ed7fbStbbdev     }
193d86ed7fbStbbdev 
194d86ed7fbStbbdev     return PARSENOERR;
195d86ed7fbStbbdev }
196d86ed7fbStbbdev 
readmodel(char * modelfile,SceneHandle scene)197d86ed7fbStbbdev unsigned int readmodel(char *modelfile, SceneHandle scene) {
198d86ed7fbStbbdev     FILE *dfile;
199d86ed7fbStbbdev     errcode rc;
200d86ed7fbStbbdev 
201d86ed7fbStbbdev     reset_tex_table();
202d86ed7fbStbbdev     dfile = nullptr;
203d86ed7fbStbbdev 
204d86ed7fbStbbdev     dfile = fopen(modelfile, "r");
205d86ed7fbStbbdev     if (dfile == nullptr) {
206d86ed7fbStbbdev         return PARSEBADFILE;
207d86ed7fbStbbdev     }
208d86ed7fbStbbdev 
209d86ed7fbStbbdev     rc = GetScenedefs(dfile, scene);
210d86ed7fbStbbdev     if (rc != PARSENOERR) {
211d86ed7fbStbbdev         fclose(dfile);
212d86ed7fbStbbdev         return rc;
213d86ed7fbStbbdev     }
214d86ed7fbStbbdev 
215d86ed7fbStbbdev     scenebackcol.r = 0.0; /* default background is black */
216d86ed7fbStbbdev     scenebackcol.g = 0.0;
217d86ed7fbStbbdev     scenebackcol.b = 0.0;
218d86ed7fbStbbdev 
219d86ed7fbStbbdev     numobjectsparsed = 0;
220d86ed7fbStbbdev     while ((rc = GetObject(dfile, scene)) == PARSENOERR) {
221d86ed7fbStbbdev         numobjectsparsed++;
222d86ed7fbStbbdev     }
223d86ed7fbStbbdev     fclose(dfile);
224d86ed7fbStbbdev 
225d86ed7fbStbbdev     if (rc == PARSEEOF)
226d86ed7fbStbbdev         rc = PARSENOERR;
227d86ed7fbStbbdev 
228d86ed7fbStbbdev     rt_background(scene, scenebackcol);
229d86ed7fbStbbdev 
230d86ed7fbStbbdev     return rc;
231d86ed7fbStbbdev }
232d86ed7fbStbbdev 
GetScenedefs(FILE * dfile,SceneHandle scene)233d86ed7fbStbbdev static errcode GetScenedefs(FILE *dfile, SceneHandle scene) {
234d86ed7fbStbbdev     vector Ccenter, Cview, Cup;
235d86ed7fbStbbdev     apiflt zoom, aspectratio;
236d86ed7fbStbbdev     int raydepth, antialiasing;
237d86ed7fbStbbdev     char outfilename[200];
238d86ed7fbStbbdev     int xres, yres, verbose;
239d86ed7fbStbbdev     float a, b, c;
240d86ed7fbStbbdev     errcode rc = PARSENOERR;
241d86ed7fbStbbdev 
242d86ed7fbStbbdev     rc |= GetString(dfile, "BEGIN_SCENE");
243d86ed7fbStbbdev 
244d86ed7fbStbbdev     rc |= GetString(dfile, "OUTFILE");
245d86ed7fbStbbdev     fscanf(dfile, "%s", outfilename);
246d86ed7fbStbbdev #ifdef _WIN32
247d86ed7fbStbbdev     if (strcmp(outfilename, "/dev/null") == 0) {
248d86ed7fbStbbdev         strcpy(outfilename, "NUL:");
249d86ed7fbStbbdev     }
250d86ed7fbStbbdev #endif
251d86ed7fbStbbdev 
252d86ed7fbStbbdev     rc |= GetString(dfile, "RESOLUTION");
253d86ed7fbStbbdev     fscanf(dfile, "%d %d", &xres, &yres);
254d86ed7fbStbbdev 
255d86ed7fbStbbdev     rc |= GetString(dfile, "VERBOSE");
256d86ed7fbStbbdev     fscanf(dfile, "%d", &verbose);
257d86ed7fbStbbdev 
258d86ed7fbStbbdev     rt_scenesetup(scene, outfilename, xres, yres, verbose);
259d86ed7fbStbbdev 
260d86ed7fbStbbdev     rc |= GetString(dfile, "CAMERA");
261d86ed7fbStbbdev 
262d86ed7fbStbbdev     rc |= GetString(dfile, "ZOOM");
263d86ed7fbStbbdev     fscanf(dfile, "%f", &a);
264d86ed7fbStbbdev     zoom = a;
265d86ed7fbStbbdev 
266d86ed7fbStbbdev     rc |= GetString(dfile, "ASPECTRATIO");
267d86ed7fbStbbdev     fscanf(dfile, "%f", &b);
268d86ed7fbStbbdev     aspectratio = b;
269d86ed7fbStbbdev 
270d86ed7fbStbbdev     rc |= GetString(dfile, "ANTIALIASING");
271d86ed7fbStbbdev     fscanf(dfile, "%d", &antialiasing);
272d86ed7fbStbbdev 
273d86ed7fbStbbdev     rc |= GetString(dfile, "RAYDEPTH");
274d86ed7fbStbbdev     fscanf(dfile, "%d", &raydepth);
275d86ed7fbStbbdev 
276d86ed7fbStbbdev     rc |= GetString(dfile, "CENTER");
277d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &a, &b, &c);
278d86ed7fbStbbdev     Ccenter.x = a;
279d86ed7fbStbbdev     Ccenter.y = b;
280d86ed7fbStbbdev     Ccenter.z = c;
281d86ed7fbStbbdev 
282d86ed7fbStbbdev     rc |= GetString(dfile, "VIEWDIR");
283d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &a, &b, &c);
284d86ed7fbStbbdev     Cview.x = a;
285d86ed7fbStbbdev     Cview.y = b;
286d86ed7fbStbbdev     Cview.z = c;
287d86ed7fbStbbdev 
288d86ed7fbStbbdev     rc |= GetString(dfile, "UPDIR");
289d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &a, &b, &c);
290d86ed7fbStbbdev     Cup.x = a;
291d86ed7fbStbbdev     Cup.y = b;
292d86ed7fbStbbdev     Cup.z = c;
293d86ed7fbStbbdev 
294d86ed7fbStbbdev     rc |= GetString(dfile, "END_CAMERA");
295d86ed7fbStbbdev 
296d86ed7fbStbbdev     rt_camerasetup(scene, zoom, aspectratio, antialiasing, raydepth, Ccenter, Cview, Cup);
297d86ed7fbStbbdev 
298d86ed7fbStbbdev     return rc;
299d86ed7fbStbbdev }
300d86ed7fbStbbdev 
GetObject(FILE * dfile,SceneHandle scene)301d86ed7fbStbbdev static errcode GetObject(FILE *dfile, SceneHandle scene) {
302d86ed7fbStbbdev     char objtype[80];
303d86ed7fbStbbdev 
304d86ed7fbStbbdev     fscanf(dfile, "%s", objtype);
305d86ed7fbStbbdev     if (!stringcmp(objtype, "END_SCENE")) {
306d86ed7fbStbbdev         return PARSEEOF; /* end parsing */
307d86ed7fbStbbdev     }
308d86ed7fbStbbdev     if (!stringcmp(objtype, "TEXDEF")) {
309d86ed7fbStbbdev         return GetTexDef(dfile);
310d86ed7fbStbbdev     }
311d86ed7fbStbbdev     if (!stringcmp(objtype, "TEXALIAS")) {
312d86ed7fbStbbdev         return GetTexAlias(dfile);
313d86ed7fbStbbdev     }
314d86ed7fbStbbdev     if (!stringcmp(objtype, "BACKGROUND")) {
315d86ed7fbStbbdev         return GetBackGnd(dfile);
316d86ed7fbStbbdev     }
317d86ed7fbStbbdev     if (!stringcmp(objtype, "CYLINDER")) {
318d86ed7fbStbbdev         return GetCylinder(dfile);
319d86ed7fbStbbdev     }
320d86ed7fbStbbdev     if (!stringcmp(objtype, "FCYLINDER")) {
321d86ed7fbStbbdev         return GetFCylinder(dfile);
322d86ed7fbStbbdev     }
323d86ed7fbStbbdev     if (!stringcmp(objtype, "POLYCYLINDER")) {
324d86ed7fbStbbdev         return GetPolyCylinder(dfile);
325d86ed7fbStbbdev     }
326d86ed7fbStbbdev     if (!stringcmp(objtype, "SPHERE")) {
327d86ed7fbStbbdev         return GetSphere(dfile);
328d86ed7fbStbbdev     }
329d86ed7fbStbbdev     if (!stringcmp(objtype, "PLANE")) {
330d86ed7fbStbbdev         return GetPlane(dfile);
331d86ed7fbStbbdev     }
332d86ed7fbStbbdev     if (!stringcmp(objtype, "RING")) {
333d86ed7fbStbbdev         return GetRing(dfile);
334d86ed7fbStbbdev     }
335d86ed7fbStbbdev     if (!stringcmp(objtype, "BOX")) {
336d86ed7fbStbbdev         return GetBox(dfile);
337d86ed7fbStbbdev     }
338d86ed7fbStbbdev     if (!stringcmp(objtype, "SCALARVOL")) {
339d86ed7fbStbbdev         return GetVol(dfile);
340d86ed7fbStbbdev     }
341d86ed7fbStbbdev     if (!stringcmp(objtype, "TRI")) {
342d86ed7fbStbbdev         return GetTri(dfile);
343d86ed7fbStbbdev     }
344d86ed7fbStbbdev     if (!stringcmp(objtype, "STRI")) {
345d86ed7fbStbbdev         return GetSTri(dfile);
346d86ed7fbStbbdev     }
347d86ed7fbStbbdev     if (!stringcmp(objtype, "LIGHT")) {
348d86ed7fbStbbdev         return GetLight(dfile);
349d86ed7fbStbbdev     }
350d86ed7fbStbbdev     if (!stringcmp(objtype, "SCAPE")) {
351d86ed7fbStbbdev         return GetLandScape(dfile);
352d86ed7fbStbbdev     }
353d86ed7fbStbbdev     if (!stringcmp(objtype, "TPOLYFILE")) {
354d86ed7fbStbbdev         return GetTPolyFile(dfile);
355d86ed7fbStbbdev     }
356d86ed7fbStbbdev 
357d86ed7fbStbbdev     fprintf(stderr, "Found bad token: %s expected an object type\n", objtype);
358d86ed7fbStbbdev     return PARSEBADSYNTAX;
359d86ed7fbStbbdev }
360d86ed7fbStbbdev 
GetVector(FILE * dfile,vector * v1)361d86ed7fbStbbdev static errcode GetVector(FILE *dfile, vector *v1) {
362d86ed7fbStbbdev     float a, b, c;
363d86ed7fbStbbdev 
364d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &a, &b, &c);
365d86ed7fbStbbdev     v1->x = a;
366d86ed7fbStbbdev     v1->y = b;
367d86ed7fbStbbdev     v1->z = c;
368d86ed7fbStbbdev 
369d86ed7fbStbbdev     return PARSENOERR;
370d86ed7fbStbbdev }
371d86ed7fbStbbdev 
GetColor(FILE * dfile,color * c1)372d86ed7fbStbbdev static errcode GetColor(FILE *dfile, color *c1) {
373d86ed7fbStbbdev     float r, g, b;
374d86ed7fbStbbdev     int rc;
375d86ed7fbStbbdev 
376d86ed7fbStbbdev     rc = GetString(dfile, "COLOR");
377d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &r, &g, &b);
378d86ed7fbStbbdev     c1->r = r;
379d86ed7fbStbbdev     c1->g = g;
380d86ed7fbStbbdev     c1->b = b;
381d86ed7fbStbbdev 
382d86ed7fbStbbdev     return rc;
383d86ed7fbStbbdev }
384d86ed7fbStbbdev 
GetTexDef(FILE * dfile)385d86ed7fbStbbdev static errcode GetTexDef(FILE *dfile) {
386d86ed7fbStbbdev     char texname[TEXNAMELEN];
387d86ed7fbStbbdev 
388d86ed7fbStbbdev     fscanf(dfile, "%s", texname);
389d86ed7fbStbbdev     add_texture(GetTexBody(dfile), texname);
390d86ed7fbStbbdev 
391d86ed7fbStbbdev     return PARSENOERR;
392d86ed7fbStbbdev }
393d86ed7fbStbbdev 
GetTexAlias(FILE * dfile)394d86ed7fbStbbdev static errcode GetTexAlias(FILE *dfile) {
395d86ed7fbStbbdev     char texname[TEXNAMELEN];
396d86ed7fbStbbdev     char aliasname[TEXNAMELEN];
397d86ed7fbStbbdev 
398d86ed7fbStbbdev     fscanf(dfile, "%s", texname);
399d86ed7fbStbbdev     fscanf(dfile, "%s", aliasname);
400d86ed7fbStbbdev     add_texture(find_texture(aliasname), texname);
401d86ed7fbStbbdev 
402d86ed7fbStbbdev     return PARSENOERR;
403d86ed7fbStbbdev }
404d86ed7fbStbbdev 
GetTexture(FILE * dfile,void ** tex)405d86ed7fbStbbdev static errcode GetTexture(FILE *dfile, void **tex) {
406d86ed7fbStbbdev     char tmp[255];
407d86ed7fbStbbdev     errcode rc = PARSENOERR;
408d86ed7fbStbbdev 
409d86ed7fbStbbdev     fscanf(dfile, "%s", tmp);
410d86ed7fbStbbdev     if (!stringcmp("TEXTURE", tmp)) {
411d86ed7fbStbbdev         *tex = GetTexBody(dfile);
412d86ed7fbStbbdev     }
413d86ed7fbStbbdev     else
414d86ed7fbStbbdev         *tex = find_texture(tmp);
415d86ed7fbStbbdev 
416d86ed7fbStbbdev     return rc;
417d86ed7fbStbbdev }
418d86ed7fbStbbdev 
GetTexBody(FILE * dfile)419d86ed7fbStbbdev void *GetTexBody(FILE *dfile) {
420d86ed7fbStbbdev     char tmp[255];
421d86ed7fbStbbdev     float a, b, c, d, phong, phongexp, phongtype;
422d86ed7fbStbbdev     apitexture tex;
423d86ed7fbStbbdev     void *voidtex;
424d86ed7fbStbbdev     errcode rc;
425d86ed7fbStbbdev 
426d86ed7fbStbbdev     rc = GetString(dfile, "AMBIENT");
427d86ed7fbStbbdev     fscanf(dfile, "%f", &a);
428d86ed7fbStbbdev     tex.ambient = a;
429d86ed7fbStbbdev 
430d86ed7fbStbbdev     rc |= GetString(dfile, "DIFFUSE");
431d86ed7fbStbbdev     fscanf(dfile, "%f", &b);
432d86ed7fbStbbdev     tex.diffuse = b;
433d86ed7fbStbbdev 
434d86ed7fbStbbdev     rc |= GetString(dfile, "SPECULAR");
435d86ed7fbStbbdev     fscanf(dfile, "%f", &c);
436d86ed7fbStbbdev     tex.specular = c;
437d86ed7fbStbbdev 
438d86ed7fbStbbdev     rc |= GetString(dfile, "OPACITY");
439d86ed7fbStbbdev     fscanf(dfile, "%f", &d);
440d86ed7fbStbbdev     tex.opacity = d;
441d86ed7fbStbbdev 
442d86ed7fbStbbdev     fscanf(dfile, "%s", tmp);
443d86ed7fbStbbdev     if (!stringcmp("PHONG", tmp)) {
444d86ed7fbStbbdev         fscanf(dfile, "%s", tmp);
445d86ed7fbStbbdev         if (!stringcmp("METAL", tmp)) {
446d86ed7fbStbbdev             phongtype = RT_PHONG_METAL;
447d86ed7fbStbbdev         }
448d86ed7fbStbbdev         else if (!stringcmp("PLASTIC", tmp)) {
449d86ed7fbStbbdev             phongtype = RT_PHONG_PLASTIC;
450d86ed7fbStbbdev         }
451d86ed7fbStbbdev         else {
452d86ed7fbStbbdev             phongtype = RT_PHONG_PLASTIC;
453d86ed7fbStbbdev         }
454d86ed7fbStbbdev 
455d86ed7fbStbbdev         fscanf(dfile, "%f", &phong);
456d86ed7fbStbbdev         GetString(dfile, "PHONG_SIZE");
457d86ed7fbStbbdev         fscanf(dfile, "%f", &phongexp);
458d86ed7fbStbbdev         fscanf(dfile, "%s", tmp);
459d86ed7fbStbbdev     }
460d86ed7fbStbbdev     else {
461d86ed7fbStbbdev         phong = 0.0;
462d86ed7fbStbbdev         phongexp = 100.0;
463d86ed7fbStbbdev         phongtype = RT_PHONG_PLASTIC;
464d86ed7fbStbbdev     }
465d86ed7fbStbbdev 
466d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &a, &b, &c);
467d86ed7fbStbbdev     tex.col.r = a;
468d86ed7fbStbbdev     tex.col.g = b;
469d86ed7fbStbbdev     tex.col.b = c;
470d86ed7fbStbbdev 
471d86ed7fbStbbdev     rc |= GetString(dfile, "TEXFUNC");
472d86ed7fbStbbdev     fscanf(dfile, "%d", &tex.texturefunc);
473d86ed7fbStbbdev     if (tex.texturefunc >= 7) { /* if its an image map, we need a filename */
474d86ed7fbStbbdev         fscanf(dfile, "%s", tex.imap);
475d86ed7fbStbbdev     }
476d86ed7fbStbbdev     if (tex.texturefunc != 0) {
477d86ed7fbStbbdev         rc |= GetString(dfile, "CENTER");
478d86ed7fbStbbdev         rc |= GetVector(dfile, &tex.ctr);
479d86ed7fbStbbdev         rc |= GetString(dfile, "ROTATE");
480d86ed7fbStbbdev         rc |= GetVector(dfile, &tex.rot);
481d86ed7fbStbbdev         rc |= GetString(dfile, "SCALE");
482d86ed7fbStbbdev         rc |= GetVector(dfile, &tex.scale);
483d86ed7fbStbbdev     }
484d86ed7fbStbbdev     if (tex.texturefunc == 9) {
485d86ed7fbStbbdev         rc |= GetString(dfile, "UAXIS");
486d86ed7fbStbbdev         rc |= GetVector(dfile, &tex.uaxs);
487d86ed7fbStbbdev         rc |= GetString(dfile, "VAXIS");
488d86ed7fbStbbdev         rc |= GetVector(dfile, &tex.vaxs);
489d86ed7fbStbbdev     }
490d86ed7fbStbbdev 
491d86ed7fbStbbdev     voidtex = rt_texture(&tex);
492d86ed7fbStbbdev     rt_tex_phong(voidtex, phong, phongexp, (int)phongtype);
493d86ed7fbStbbdev 
494d86ed7fbStbbdev     return voidtex;
495d86ed7fbStbbdev }
496d86ed7fbStbbdev 
GetLight(FILE * dfile)497d86ed7fbStbbdev static errcode GetLight(FILE *dfile) {
498d86ed7fbStbbdev     apiflt rad;
499d86ed7fbStbbdev     vector ctr;
500d86ed7fbStbbdev     apitexture tex;
501d86ed7fbStbbdev     float a;
502d86ed7fbStbbdev     errcode rc;
503d86ed7fbStbbdev 
504d86ed7fbStbbdev     memset(&tex, 0, sizeof(apitexture));
505d86ed7fbStbbdev 
506d86ed7fbStbbdev     rc = GetString(dfile, "CENTER");
507d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
508d86ed7fbStbbdev     rc |= GetString(dfile, "RAD");
509d86ed7fbStbbdev     fscanf(dfile, "%f", &a); /* read in radius */
510d86ed7fbStbbdev     rad = a;
511d86ed7fbStbbdev 
512d86ed7fbStbbdev     rc |= GetColor(dfile, &tex.col);
513d86ed7fbStbbdev 
514d86ed7fbStbbdev     rt_light(rt_texture(&tex), ctr, rad);
515d86ed7fbStbbdev 
516d86ed7fbStbbdev     return rc;
517d86ed7fbStbbdev }
518d86ed7fbStbbdev 
GetBackGnd(FILE * dfile)519d86ed7fbStbbdev static errcode GetBackGnd(FILE *dfile) {
520d86ed7fbStbbdev     float r, g, b;
521d86ed7fbStbbdev 
522d86ed7fbStbbdev     fscanf(dfile, "%f %f %f", &r, &g, &b);
523d86ed7fbStbbdev 
524d86ed7fbStbbdev     scenebackcol.r = r;
525d86ed7fbStbbdev     scenebackcol.g = g;
526d86ed7fbStbbdev     scenebackcol.b = b;
527d86ed7fbStbbdev 
528d86ed7fbStbbdev     return PARSENOERR;
529d86ed7fbStbbdev }
530d86ed7fbStbbdev 
GetCylinder(FILE * dfile)531d86ed7fbStbbdev static errcode GetCylinder(FILE *dfile) {
532d86ed7fbStbbdev     apiflt rad;
533d86ed7fbStbbdev     vector ctr, axis;
534d86ed7fbStbbdev     void *tex;
535d86ed7fbStbbdev     float a;
536d86ed7fbStbbdev     errcode rc;
537d86ed7fbStbbdev 
538d86ed7fbStbbdev     rc = GetString(dfile, "CENTER");
539d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
540d86ed7fbStbbdev     rc |= GetString(dfile, "AXIS");
541d86ed7fbStbbdev     rc |= GetVector(dfile, &axis);
542d86ed7fbStbbdev     rc |= GetString(dfile, "RAD");
543d86ed7fbStbbdev     fscanf(dfile, "%f", &a);
544d86ed7fbStbbdev     rad = a;
545d86ed7fbStbbdev 
546d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
547d86ed7fbStbbdev     rt_cylinder(tex, ctr, axis, rad);
548d86ed7fbStbbdev 
549d86ed7fbStbbdev     return rc;
550d86ed7fbStbbdev }
551d86ed7fbStbbdev 
GetFCylinder(FILE * dfile)552d86ed7fbStbbdev static errcode GetFCylinder(FILE *dfile) {
553d86ed7fbStbbdev     apiflt rad;
554d86ed7fbStbbdev     vector ctr, axis;
555d86ed7fbStbbdev     vector pnt1, pnt2;
556d86ed7fbStbbdev     void *tex;
557d86ed7fbStbbdev     float a;
558d86ed7fbStbbdev     errcode rc;
559d86ed7fbStbbdev 
560d86ed7fbStbbdev     rc = GetString(dfile, "BASE");
561d86ed7fbStbbdev     rc |= GetVector(dfile, &pnt1);
562d86ed7fbStbbdev     rc |= GetString(dfile, "APEX");
563d86ed7fbStbbdev     rc |= GetVector(dfile, &pnt2);
564d86ed7fbStbbdev 
565d86ed7fbStbbdev     ctr = pnt1;
566d86ed7fbStbbdev     axis.x = pnt2.x - pnt1.x;
567d86ed7fbStbbdev     axis.y = pnt2.y - pnt1.y;
568d86ed7fbStbbdev     axis.z = pnt2.z - pnt1.z;
569d86ed7fbStbbdev 
570d86ed7fbStbbdev     rc |= GetString(dfile, "RAD");
571d86ed7fbStbbdev     fscanf(dfile, "%f", &a);
572d86ed7fbStbbdev     rad = a;
573d86ed7fbStbbdev 
574d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
575d86ed7fbStbbdev     rt_fcylinder(tex, ctr, axis, rad);
576d86ed7fbStbbdev 
577d86ed7fbStbbdev     return rc;
578d86ed7fbStbbdev }
579d86ed7fbStbbdev 
GetPolyCylinder(FILE * dfile)580d86ed7fbStbbdev static errcode GetPolyCylinder(FILE *dfile) {
581d86ed7fbStbbdev     apiflt rad;
582d86ed7fbStbbdev     vector *temp;
583d86ed7fbStbbdev     void *tex;
584d86ed7fbStbbdev     float a;
585d86ed7fbStbbdev     int numpts, i;
586d86ed7fbStbbdev     errcode rc;
587d86ed7fbStbbdev 
588d86ed7fbStbbdev     rc = GetString(dfile, "POINTS");
589d86ed7fbStbbdev     fscanf(dfile, "%d", &numpts);
590d86ed7fbStbbdev 
591d86ed7fbStbbdev     temp = (vector *)malloc(numpts * sizeof(vector));
592d86ed7fbStbbdev 
593d86ed7fbStbbdev     for (i = 0; i < numpts; i++) {
594d86ed7fbStbbdev         rc |= GetVector(dfile, &temp[i]);
595d86ed7fbStbbdev     }
596d86ed7fbStbbdev 
597d86ed7fbStbbdev     rc |= GetString(dfile, "RAD");
598d86ed7fbStbbdev     fscanf(dfile, "%f", &a);
599d86ed7fbStbbdev     rad = a;
600d86ed7fbStbbdev 
601d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
602d86ed7fbStbbdev     rt_polycylinder(tex, temp, numpts, rad);
603d86ed7fbStbbdev 
604d86ed7fbStbbdev     free(temp);
605d86ed7fbStbbdev 
606d86ed7fbStbbdev     return rc;
607d86ed7fbStbbdev }
608d86ed7fbStbbdev 
GetSphere(FILE * dfile)609d86ed7fbStbbdev static errcode GetSphere(FILE *dfile) {
610d86ed7fbStbbdev     apiflt rad;
611d86ed7fbStbbdev     vector ctr;
612d86ed7fbStbbdev     void *tex;
613d86ed7fbStbbdev     float a;
614d86ed7fbStbbdev     errcode rc;
615d86ed7fbStbbdev 
616d86ed7fbStbbdev     rc = GetString(dfile, "CENTER");
617d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
618d86ed7fbStbbdev     rc |= GetString(dfile, "RAD");
619d86ed7fbStbbdev     fscanf(dfile, "%f", &a);
620d86ed7fbStbbdev     rad = a;
621d86ed7fbStbbdev 
622d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
623d86ed7fbStbbdev 
624d86ed7fbStbbdev     rt_sphere(tex, ctr, rad);
625d86ed7fbStbbdev 
626d86ed7fbStbbdev     return rc;
627d86ed7fbStbbdev }
628d86ed7fbStbbdev 
GetPlane(FILE * dfile)629d86ed7fbStbbdev static errcode GetPlane(FILE *dfile) {
630d86ed7fbStbbdev     vector normal;
631d86ed7fbStbbdev     vector ctr;
632d86ed7fbStbbdev     void *tex;
633d86ed7fbStbbdev     errcode rc;
634d86ed7fbStbbdev 
635d86ed7fbStbbdev     rc = GetString(dfile, "CENTER");
636d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
637d86ed7fbStbbdev     rc |= GetString(dfile, "NORMAL");
638d86ed7fbStbbdev     rc |= GetVector(dfile, &normal);
639d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
640d86ed7fbStbbdev 
641d86ed7fbStbbdev     rt_plane(tex, ctr, normal);
642d86ed7fbStbbdev 
643d86ed7fbStbbdev     return rc;
644d86ed7fbStbbdev }
645d86ed7fbStbbdev 
GetVol(FILE * dfile)646d86ed7fbStbbdev static errcode GetVol(FILE *dfile) {
647d86ed7fbStbbdev     vector min, max;
648d86ed7fbStbbdev     int x, y, z;
649d86ed7fbStbbdev     char fname[255];
650d86ed7fbStbbdev     void *tex;
651d86ed7fbStbbdev     errcode rc;
652d86ed7fbStbbdev 
653d86ed7fbStbbdev     rc = GetString(dfile, "MIN");
654d86ed7fbStbbdev     rc |= GetVector(dfile, &min);
655d86ed7fbStbbdev     rc |= GetString(dfile, "MAX");
656d86ed7fbStbbdev     rc |= GetVector(dfile, &max);
657d86ed7fbStbbdev     rc |= GetString(dfile, "DIM");
658d86ed7fbStbbdev     fscanf(dfile, "%d %d %d ", &x, &y, &z);
659d86ed7fbStbbdev     rc |= GetString(dfile, "FILE");
660d86ed7fbStbbdev     fscanf(dfile, "%s", fname);
661d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
662d86ed7fbStbbdev 
663d86ed7fbStbbdev     rt_scalarvol(tex, min, max, x, y, z, fname, nullptr);
664d86ed7fbStbbdev 
665d86ed7fbStbbdev     return rc;
666d86ed7fbStbbdev }
667d86ed7fbStbbdev 
GetBox(FILE * dfile)668d86ed7fbStbbdev static errcode GetBox(FILE *dfile) {
669d86ed7fbStbbdev     vector min, max;
670d86ed7fbStbbdev     void *tex;
671d86ed7fbStbbdev     errcode rc;
672d86ed7fbStbbdev 
673d86ed7fbStbbdev     rc = GetString(dfile, "MIN");
674d86ed7fbStbbdev     rc |= GetVector(dfile, &min);
675d86ed7fbStbbdev     rc |= GetString(dfile, "MAX");
676d86ed7fbStbbdev     rc |= GetVector(dfile, &max);
677d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
678d86ed7fbStbbdev 
679d86ed7fbStbbdev     rt_box(tex, min, max);
680d86ed7fbStbbdev 
681d86ed7fbStbbdev     return rc;
682d86ed7fbStbbdev }
683d86ed7fbStbbdev 
GetRing(FILE * dfile)684d86ed7fbStbbdev static errcode GetRing(FILE *dfile) {
685d86ed7fbStbbdev     vector normal;
686d86ed7fbStbbdev     vector ctr;
687d86ed7fbStbbdev     void *tex;
688d86ed7fbStbbdev     float a, b;
689d86ed7fbStbbdev     errcode rc;
690d86ed7fbStbbdev 
691d86ed7fbStbbdev     rc = GetString(dfile, "CENTER");
692d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
693d86ed7fbStbbdev     rc |= GetString(dfile, "NORMAL");
694d86ed7fbStbbdev     rc |= GetVector(dfile, &normal);
695d86ed7fbStbbdev     rc |= GetString(dfile, "INNER");
696d86ed7fbStbbdev     fscanf(dfile, " %f ", &a);
697d86ed7fbStbbdev     rc |= GetString(dfile, "OUTER");
698d86ed7fbStbbdev     fscanf(dfile, " %f ", &b);
699d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
700d86ed7fbStbbdev 
701d86ed7fbStbbdev     rt_ring(tex, ctr, normal, a, b);
702d86ed7fbStbbdev 
703d86ed7fbStbbdev     return rc;
704d86ed7fbStbbdev }
705d86ed7fbStbbdev 
GetTri(FILE * dfile)706d86ed7fbStbbdev static errcode GetTri(FILE *dfile) {
707d86ed7fbStbbdev     vector v0, v1, v2;
708d86ed7fbStbbdev     void *tex;
709d86ed7fbStbbdev     errcode rc;
710d86ed7fbStbbdev 
711d86ed7fbStbbdev     rc = GetString(dfile, "V0");
712d86ed7fbStbbdev     rc |= GetVector(dfile, &v0);
713d86ed7fbStbbdev 
714d86ed7fbStbbdev     rc |= GetString(dfile, "V1");
715d86ed7fbStbbdev     rc |= GetVector(dfile, &v1);
716d86ed7fbStbbdev 
717d86ed7fbStbbdev     rc |= GetString(dfile, "V2");
718d86ed7fbStbbdev     rc |= GetVector(dfile, &v2);
719d86ed7fbStbbdev 
720d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
721d86ed7fbStbbdev 
722d86ed7fbStbbdev     rt_tri(tex, v0, v1, v2);
723d86ed7fbStbbdev 
724d86ed7fbStbbdev     return rc;
725d86ed7fbStbbdev }
726d86ed7fbStbbdev 
GetSTri(FILE * dfile)727d86ed7fbStbbdev static errcode GetSTri(FILE *dfile) {
728d86ed7fbStbbdev     vector v0, v1, v2, n0, n1, n2;
729d86ed7fbStbbdev     void *tex;
730d86ed7fbStbbdev     errcode rc;
731d86ed7fbStbbdev 
732d86ed7fbStbbdev     rc = GetString(dfile, "V0");
733d86ed7fbStbbdev     rc |= GetVector(dfile, &v0);
734d86ed7fbStbbdev 
735d86ed7fbStbbdev     rc |= GetString(dfile, "V1");
736d86ed7fbStbbdev     rc |= GetVector(dfile, &v1);
737d86ed7fbStbbdev 
738d86ed7fbStbbdev     rc |= GetString(dfile, "V2");
739d86ed7fbStbbdev     rc |= GetVector(dfile, &v2);
740d86ed7fbStbbdev 
741d86ed7fbStbbdev     rc |= GetString(dfile, "N0");
742d86ed7fbStbbdev     rc |= GetVector(dfile, &n0);
743d86ed7fbStbbdev 
744d86ed7fbStbbdev     rc |= GetString(dfile, "N1");
745d86ed7fbStbbdev     rc |= GetVector(dfile, &n1);
746d86ed7fbStbbdev 
747d86ed7fbStbbdev     rc |= GetString(dfile, "N2");
748d86ed7fbStbbdev     rc |= GetVector(dfile, &n2);
749d86ed7fbStbbdev 
750d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
751d86ed7fbStbbdev 
752d86ed7fbStbbdev     rt_stri(tex, v0, v1, v2, n0, n1, n2);
753d86ed7fbStbbdev 
754d86ed7fbStbbdev     return rc;
755d86ed7fbStbbdev }
756d86ed7fbStbbdev 
GetLandScape(FILE * dfile)757d86ed7fbStbbdev static errcode GetLandScape(FILE *dfile) {
758d86ed7fbStbbdev     void *tex;
759d86ed7fbStbbdev     vector ctr;
760d86ed7fbStbbdev     apiflt wx, wy;
761d86ed7fbStbbdev     int m, n;
762d86ed7fbStbbdev     float a, b;
763d86ed7fbStbbdev     errcode rc;
764d86ed7fbStbbdev 
765d86ed7fbStbbdev     rc = GetString(dfile, "RES");
766d86ed7fbStbbdev     fscanf(dfile, "%d %d", &m, &n);
767d86ed7fbStbbdev 
768d86ed7fbStbbdev     rc |= GetString(dfile, "SCALE");
769d86ed7fbStbbdev     fscanf(dfile, "%f %f", &a, &b);
770d86ed7fbStbbdev     wx = a;
771d86ed7fbStbbdev     wy = b;
772d86ed7fbStbbdev 
773d86ed7fbStbbdev     rc |= GetString(dfile, "CENTER");
774d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
775d86ed7fbStbbdev 
776d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
777d86ed7fbStbbdev 
778d86ed7fbStbbdev     rt_landscape(tex, m, n, ctr, wx, wy);
779d86ed7fbStbbdev 
780d86ed7fbStbbdev     return rc;
781d86ed7fbStbbdev }
782d86ed7fbStbbdev 
GetTPolyFile(FILE * dfile)783d86ed7fbStbbdev static errcode GetTPolyFile(FILE *dfile) {
784d86ed7fbStbbdev     void *tex;
785d86ed7fbStbbdev     vector ctr, rot, scale;
786d86ed7fbStbbdev     vector v1, v2, v0;
787d86ed7fbStbbdev     char ifname[255];
788d86ed7fbStbbdev     FILE *ifp;
789d86ed7fbStbbdev     int v, totalpolys;
790d86ed7fbStbbdev     RotMat RotA;
791d86ed7fbStbbdev     errcode rc;
792d86ed7fbStbbdev 
793d86ed7fbStbbdev     totalpolys = 0;
794d86ed7fbStbbdev 
795d86ed7fbStbbdev     rc = GetString(dfile, "SCALE");
796d86ed7fbStbbdev     rc |= GetVector(dfile, &scale);
797d86ed7fbStbbdev 
798d86ed7fbStbbdev     rc |= GetString(dfile, "ROT");
799d86ed7fbStbbdev     rc |= GetVector(dfile, &rot);
800d86ed7fbStbbdev 
801d86ed7fbStbbdev     degvectoradvec(&rot);
802d86ed7fbStbbdev     InitRot3d(&RotA, rot.x, rot.y, rot.z);
803d86ed7fbStbbdev 
804d86ed7fbStbbdev     rc |= GetString(dfile, "CENTER");
805d86ed7fbStbbdev     rc |= GetVector(dfile, &ctr);
806d86ed7fbStbbdev 
807d86ed7fbStbbdev     rc |= GetString(dfile, "FILE");
808d86ed7fbStbbdev     fscanf(dfile, "%s", ifname);
809d86ed7fbStbbdev 
810d86ed7fbStbbdev     rc |= GetTexture(dfile, &tex);
811d86ed7fbStbbdev 
812d86ed7fbStbbdev     if ((ifp = fopen(ifname, "r")) == nullptr) {
813d86ed7fbStbbdev         fprintf(stderr, "Can't open data file %s for input!! Aborting...\n", ifname);
814d86ed7fbStbbdev         return PARSEBADSUBFILE;
815d86ed7fbStbbdev     }
816d86ed7fbStbbdev 
817d86ed7fbStbbdev     while (!feof(ifp)) {
818d86ed7fbStbbdev         fscanf(ifp, "%d", &v);
819d86ed7fbStbbdev         if (v != 3) {
820d86ed7fbStbbdev             break;
821d86ed7fbStbbdev         }
822d86ed7fbStbbdev 
823d86ed7fbStbbdev         totalpolys++;
824d86ed7fbStbbdev         v = 0;
825d86ed7fbStbbdev 
826d86ed7fbStbbdev         rc |= GetVector(ifp, &v0);
827d86ed7fbStbbdev         rc |= GetVector(ifp, &v1);
828d86ed7fbStbbdev         rc |= GetVector(ifp, &v2);
829d86ed7fbStbbdev 
830d86ed7fbStbbdev         Scale3d(&scale, &v0);
831d86ed7fbStbbdev         Scale3d(&scale, &v1);
832d86ed7fbStbbdev         Scale3d(&scale, &v2);
833d86ed7fbStbbdev 
834d86ed7fbStbbdev         Rotate3d(&RotA, &v0);
835d86ed7fbStbbdev         Rotate3d(&RotA, &v1);
836d86ed7fbStbbdev         Rotate3d(&RotA, &v2);
837d86ed7fbStbbdev 
838d86ed7fbStbbdev         Trans3d(&ctr, &v0);
839d86ed7fbStbbdev         Trans3d(&ctr, &v1);
840d86ed7fbStbbdev         Trans3d(&ctr, &v2);
841d86ed7fbStbbdev 
842d86ed7fbStbbdev         rt_tri(tex, v1, v0, v2);
843d86ed7fbStbbdev     }
844d86ed7fbStbbdev 
845d86ed7fbStbbdev     fclose(ifp);
846d86ed7fbStbbdev 
847d86ed7fbStbbdev     return rc;
848d86ed7fbStbbdev }
849