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