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  * api.cpp - This file contains all of the API calls that are defined for
48d86ed7fbStbbdev  *         external driver code to use.
49d86ed7fbStbbdev  */
50d86ed7fbStbbdev 
51d86ed7fbStbbdev #include "machine.hpp"
52d86ed7fbStbbdev #include "types.hpp"
53d86ed7fbStbbdev #include "macros.hpp"
54d86ed7fbStbbdev 
55d86ed7fbStbbdev #include "box.hpp"
56d86ed7fbStbbdev #include "cylinder.hpp"
57d86ed7fbStbbdev #include "plane.hpp"
58d86ed7fbStbbdev #include "quadric.hpp"
59d86ed7fbStbbdev #include "ring.hpp"
60d86ed7fbStbbdev #include "sphere.hpp"
61d86ed7fbStbbdev #include "triangle.hpp"
62d86ed7fbStbbdev #include "vol.hpp"
63d86ed7fbStbbdev #include "extvol.hpp"
64d86ed7fbStbbdev 
65d86ed7fbStbbdev #include "texture.hpp"
66d86ed7fbStbbdev #include "light.hpp"
67d86ed7fbStbbdev #include "render.hpp"
68d86ed7fbStbbdev #include "camera.hpp"
69d86ed7fbStbbdev #include "vector.hpp"
70d86ed7fbStbbdev #include "intersect.hpp"
71d86ed7fbStbbdev #include "shade.hpp"
72d86ed7fbStbbdev #include "util.hpp"
73d86ed7fbStbbdev #include "imap.hpp"
74d86ed7fbStbbdev #include "global.hpp"
75d86ed7fbStbbdev 
76d86ed7fbStbbdev #include "tachyon_video.hpp"
77d86ed7fbStbbdev 
78d86ed7fbStbbdev typedef void *SceneHandle;
79d86ed7fbStbbdev #include "api.hpp"
80d86ed7fbStbbdev 
rt_vector(apiflt x,apiflt y,apiflt z)81d86ed7fbStbbdev vector rt_vector(apiflt x, apiflt y, apiflt z) {
82d86ed7fbStbbdev     vector v;
83d86ed7fbStbbdev 
84d86ed7fbStbbdev     v.x = x;
85d86ed7fbStbbdev     v.y = y;
86d86ed7fbStbbdev     v.z = z;
87d86ed7fbStbbdev 
88d86ed7fbStbbdev     return v;
89d86ed7fbStbbdev }
90d86ed7fbStbbdev 
rt_color(apiflt r,apiflt g,apiflt b)91d86ed7fbStbbdev color rt_color(apiflt r, apiflt g, apiflt b) {
92d86ed7fbStbbdev     color c;
93d86ed7fbStbbdev 
94d86ed7fbStbbdev     c.r = r;
95d86ed7fbStbbdev     c.g = g;
96d86ed7fbStbbdev     c.b = b;
97d86ed7fbStbbdev 
98d86ed7fbStbbdev     return c;
99d86ed7fbStbbdev }
100d86ed7fbStbbdev 
rt_initialize()101d86ed7fbStbbdev void rt_initialize() {
102d86ed7fbStbbdev     rpcmsg msg;
103d86ed7fbStbbdev 
104d86ed7fbStbbdev     reset_object();
105d86ed7fbStbbdev     reset_lights();
106d86ed7fbStbbdev     InitTextures();
107d86ed7fbStbbdev 
108d86ed7fbStbbdev     if (!parinitted) {
109d86ed7fbStbbdev         parinitted = 1;
110d86ed7fbStbbdev 
111d86ed7fbStbbdev         msg.type = 1; /* setup a ping message */
112d86ed7fbStbbdev     }
113d86ed7fbStbbdev }
114d86ed7fbStbbdev 
rt_renderscene(SceneHandle voidscene)115d86ed7fbStbbdev void rt_renderscene(SceneHandle voidscene) {
116d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
117d86ed7fbStbbdev     renderscene(*scene);
118d86ed7fbStbbdev }
119d86ed7fbStbbdev 
rt_camerasetup(SceneHandle voidscene,apiflt zoom,apiflt aspectratio,int antialiasing,int raydepth,vector camcent,vector viewvec,vector upvec)120d86ed7fbStbbdev void rt_camerasetup(SceneHandle voidscene,
121d86ed7fbStbbdev                     apiflt zoom,
122d86ed7fbStbbdev                     apiflt aspectratio,
123d86ed7fbStbbdev                     int antialiasing,
124d86ed7fbStbbdev                     int raydepth,
125d86ed7fbStbbdev                     vector camcent,
126d86ed7fbStbbdev                     vector viewvec,
127d86ed7fbStbbdev                     vector upvec) {
128d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
129d86ed7fbStbbdev 
130d86ed7fbStbbdev     vector newupvec;
131d86ed7fbStbbdev     vector newviewvec;
132d86ed7fbStbbdev     vector newrightvec;
133d86ed7fbStbbdev 
134d86ed7fbStbbdev     VCross((vector *)&upvec, &viewvec, &newrightvec);
135d86ed7fbStbbdev     VNorm(&newrightvec);
136d86ed7fbStbbdev 
137d86ed7fbStbbdev     VCross((vector *)&viewvec, &newrightvec, &newupvec);
138d86ed7fbStbbdev     VNorm(&newupvec);
139d86ed7fbStbbdev 
140d86ed7fbStbbdev     newviewvec = viewvec;
141d86ed7fbStbbdev     VNorm(&newviewvec);
142d86ed7fbStbbdev 
143d86ed7fbStbbdev     scene->camzoom = zoom;
144d86ed7fbStbbdev     scene->aspectratio = aspectratio;
145d86ed7fbStbbdev     scene->antialiasing = antialiasing;
146d86ed7fbStbbdev     scene->raydepth = raydepth;
147d86ed7fbStbbdev     scene->camcent = camcent;
148d86ed7fbStbbdev     scene->camviewvec = newviewvec;
149d86ed7fbStbbdev     scene->camrightvec = newrightvec;
150d86ed7fbStbbdev     scene->camupvec = newupvec;
151d86ed7fbStbbdev }
152d86ed7fbStbbdev 
rt_outputfile(SceneHandle voidscene,const char * outname)153d86ed7fbStbbdev void rt_outputfile(SceneHandle voidscene, const char *outname) {
154d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
155d86ed7fbStbbdev     strcpy((char *)&scene->outfilename, outname);
156d86ed7fbStbbdev }
157d86ed7fbStbbdev 
rt_resolution(SceneHandle voidscene,int hres,int vres)158d86ed7fbStbbdev void rt_resolution(SceneHandle voidscene, int hres, int vres) {
159d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
160d86ed7fbStbbdev     scene->hres = hres;
161d86ed7fbStbbdev     scene->vres = vres;
162d86ed7fbStbbdev }
163d86ed7fbStbbdev 
rt_verbose(SceneHandle voidscene,int v)164d86ed7fbStbbdev void rt_verbose(SceneHandle voidscene, int v) {
165d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
166d86ed7fbStbbdev     scene->verbosemode = v;
167d86ed7fbStbbdev }
168d86ed7fbStbbdev 
rt_rawimage(SceneHandle voidscene,unsigned char * rawimage)169d86ed7fbStbbdev void rt_rawimage(SceneHandle voidscene, unsigned char *rawimage) {
170d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
171d86ed7fbStbbdev     scene->rawimage = rawimage;
172d86ed7fbStbbdev }
173d86ed7fbStbbdev 
rt_background(SceneHandle voidscene,color col)174d86ed7fbStbbdev void rt_background(SceneHandle voidscene, color col) {
175d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
176d86ed7fbStbbdev     scene->background.r = col.r;
177d86ed7fbStbbdev     scene->background.g = col.g;
178d86ed7fbStbbdev     scene->background.b = col.b;
179d86ed7fbStbbdev }
180d86ed7fbStbbdev 
rt_boundmode(SceneHandle voidscene,int mode)181d86ed7fbStbbdev void rt_boundmode(SceneHandle voidscene, int mode) {
182d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
183d86ed7fbStbbdev     scene->boundmode = mode;
184d86ed7fbStbbdev }
185d86ed7fbStbbdev 
rt_boundthresh(SceneHandle voidscene,int threshold)186d86ed7fbStbbdev void rt_boundthresh(SceneHandle voidscene, int threshold) {
187d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
188d86ed7fbStbbdev 
189d86ed7fbStbbdev     if (threshold > 1) {
190d86ed7fbStbbdev         scene->boundthresh = threshold;
191d86ed7fbStbbdev     }
192d86ed7fbStbbdev     else {
193d86ed7fbStbbdev         rtmesg("Ignoring out-of-range automatic bounding threshold.\n");
194d86ed7fbStbbdev         rtmesg("Automatic bounding threshold reset to default.\n");
195d86ed7fbStbbdev         scene->boundthresh = MAXOCTNODES;
196d86ed7fbStbbdev     }
197d86ed7fbStbbdev }
198d86ed7fbStbbdev 
rt_displaymode(SceneHandle voidscene,int mode)199d86ed7fbStbbdev void rt_displaymode(SceneHandle voidscene, int mode) {
200d86ed7fbStbbdev     scenedef *scene = (scenedef *)voidscene;
201d86ed7fbStbbdev     scene->displaymode = mode;
202d86ed7fbStbbdev }
203d86ed7fbStbbdev 
rt_scenesetup(SceneHandle voidscene,char * outname,int hres,int vres,int verbose)204d86ed7fbStbbdev void rt_scenesetup(SceneHandle voidscene, char *outname, int hres, int vres, int verbose) {
205d86ed7fbStbbdev     rt_outputfile(voidscene, outname);
206d86ed7fbStbbdev     rt_resolution(voidscene, hres, vres);
207d86ed7fbStbbdev     rt_verbose(voidscene, verbose);
208d86ed7fbStbbdev }
209d86ed7fbStbbdev 
rt_newscene(void)210d86ed7fbStbbdev SceneHandle rt_newscene(void) {
211d86ed7fbStbbdev     scenedef *scene;
212d86ed7fbStbbdev     SceneHandle voidscene;
213d86ed7fbStbbdev 
214d86ed7fbStbbdev     scene = (scenedef *)malloc(sizeof(scenedef));
215d86ed7fbStbbdev     memset(scene, 0, sizeof(scenedef)); /* clear all valuas to 0  */
216d86ed7fbStbbdev 
217d86ed7fbStbbdev     voidscene = (SceneHandle)scene;
218d86ed7fbStbbdev 
219d86ed7fbStbbdev     rt_outputfile(voidscene, "/dev/null"); /* default output file (.tga) */
220d86ed7fbStbbdev     rt_resolution(voidscene, 512, 512); /* 512x512 resolution */
221d86ed7fbStbbdev     rt_verbose(voidscene, 0); /* verbose messages off */
222d86ed7fbStbbdev     rt_rawimage(voidscene, nullptr); /* raw image output off */
223d86ed7fbStbbdev     rt_boundmode(voidscene, RT_BOUNDING_ENABLED); /* spatial subdivision on */
224d86ed7fbStbbdev     rt_boundthresh(voidscene, MAXOCTNODES); /* default threshold */
225d86ed7fbStbbdev     rt_displaymode(voidscene, RT_DISPLAY_ENABLED); /* video output on */
226d86ed7fbStbbdev     rt_camerasetup(voidscene,
227d86ed7fbStbbdev                    1.0,
228d86ed7fbStbbdev                    1.0,
229d86ed7fbStbbdev                    0,
230d86ed7fbStbbdev                    6,
231d86ed7fbStbbdev                    rt_vector(0.0, 0.0, 0.0),
232d86ed7fbStbbdev                    rt_vector(0.0, 0.0, 1.0),
233d86ed7fbStbbdev                    rt_vector(0.0, 1.0, 0.0));
234d86ed7fbStbbdev 
235d86ed7fbStbbdev     return scene;
236d86ed7fbStbbdev }
237d86ed7fbStbbdev 
rt_deletescene(SceneHandle scene)238d86ed7fbStbbdev void rt_deletescene(SceneHandle scene) {
239d86ed7fbStbbdev     if (scene != nullptr)
240d86ed7fbStbbdev         free(scene);
241d86ed7fbStbbdev }
242d86ed7fbStbbdev 
apitextotex(apitexture * apitex,texture * tex)243d86ed7fbStbbdev void apitextotex(apitexture *apitex, texture *tex) {
244d86ed7fbStbbdev     switch (apitex->texturefunc) {
245d86ed7fbStbbdev         case 0: tex->texfunc = (color(*)(void *, void *, void *))(standard_texture); break;
246d86ed7fbStbbdev 
247d86ed7fbStbbdev         case 1: tex->texfunc = (color(*)(void *, void *, void *))(checker_texture); break;
248d86ed7fbStbbdev 
249d86ed7fbStbbdev         case 2: tex->texfunc = (color(*)(void *, void *, void *))(grit_texture); break;
250d86ed7fbStbbdev 
251d86ed7fbStbbdev         case 3: tex->texfunc = (color(*)(void *, void *, void *))(marble_texture); break;
252d86ed7fbStbbdev 
253d86ed7fbStbbdev         case 4: tex->texfunc = (color(*)(void *, void *, void *))(wood_texture); break;
254d86ed7fbStbbdev 
255d86ed7fbStbbdev         case 5: tex->texfunc = (color(*)(void *, void *, void *))(gnoise_texture); break;
256d86ed7fbStbbdev 
257d86ed7fbStbbdev         case 6: tex->texfunc = (color(*)(void *, void *, void *))(cyl_checker_texture); break;
258d86ed7fbStbbdev 
259d86ed7fbStbbdev         case 7:
260d86ed7fbStbbdev             tex->texfunc = (color(*)(void *, void *, void *))(image_sphere_texture);
261d86ed7fbStbbdev             tex->img = AllocateImage((char *)apitex->imap);
262d86ed7fbStbbdev             break;
263d86ed7fbStbbdev 
264d86ed7fbStbbdev         case 8:
265d86ed7fbStbbdev             tex->texfunc = (color(*)(void *, void *, void *))(image_cyl_texture);
266d86ed7fbStbbdev             tex->img = AllocateImage((char *)apitex->imap);
267d86ed7fbStbbdev             break;
268d86ed7fbStbbdev 
269d86ed7fbStbbdev         case 9:
270d86ed7fbStbbdev             tex->texfunc = (color(*)(void *, void *, void *))(image_plane_texture);
271d86ed7fbStbbdev             tex->img = AllocateImage((char *)apitex->imap);
272d86ed7fbStbbdev             break;
273d86ed7fbStbbdev 
274d86ed7fbStbbdev         default: tex->texfunc = (color(*)(void *, void *, void *))(standard_texture); break;
275d86ed7fbStbbdev     }
276d86ed7fbStbbdev 
277d86ed7fbStbbdev     tex->ctr = apitex->ctr;
278d86ed7fbStbbdev     tex->rot = apitex->rot;
279d86ed7fbStbbdev     tex->scale = apitex->scale;
280d86ed7fbStbbdev     tex->uaxs = apitex->uaxs;
281d86ed7fbStbbdev     tex->vaxs = apitex->vaxs;
282d86ed7fbStbbdev     tex->ambient = apitex->ambient;
283d86ed7fbStbbdev     tex->diffuse = apitex->diffuse;
284d86ed7fbStbbdev     tex->specular = apitex->specular;
285d86ed7fbStbbdev     tex->opacity = apitex->opacity;
286d86ed7fbStbbdev     tex->col = apitex->col;
287d86ed7fbStbbdev 
288d86ed7fbStbbdev     tex->islight = 0;
289d86ed7fbStbbdev     tex->shadowcast = 1;
290d86ed7fbStbbdev     tex->phong = 0.0;
291d86ed7fbStbbdev     tex->phongexp = 0.0;
292d86ed7fbStbbdev     tex->phongtype = 0;
293d86ed7fbStbbdev }
294d86ed7fbStbbdev 
rt_texture(apitexture * apitex)295d86ed7fbStbbdev void *rt_texture(apitexture *apitex) {
296d86ed7fbStbbdev     texture *tex;
297d86ed7fbStbbdev 
298d86ed7fbStbbdev     tex = (texture *)rt_getmem(sizeof(texture));
299d86ed7fbStbbdev     apitextotex(apitex, tex);
300d86ed7fbStbbdev     return (tex);
301d86ed7fbStbbdev }
302d86ed7fbStbbdev 
rt_tex_color(void * voidtex,color col)303d86ed7fbStbbdev void rt_tex_color(void *voidtex, color col) {
304d86ed7fbStbbdev     texture *tex = (texture *)voidtex;
305d86ed7fbStbbdev     tex->col = col;
306d86ed7fbStbbdev }
307d86ed7fbStbbdev 
rt_tex_phong(void * voidtex,apiflt phong,apiflt phongexp,int type)308d86ed7fbStbbdev void rt_tex_phong(void *voidtex, apiflt phong, apiflt phongexp, int type) {
309d86ed7fbStbbdev     texture *tex = (texture *)voidtex;
310d86ed7fbStbbdev     tex->phong = phong;
311d86ed7fbStbbdev     tex->phongexp = phongexp;
312d86ed7fbStbbdev     tex->phongtype = type;
313d86ed7fbStbbdev }
314d86ed7fbStbbdev 
rt_light(void * tex,vector ctr,apiflt rad)315d86ed7fbStbbdev void rt_light(void *tex, vector ctr, apiflt rad) {
316d86ed7fbStbbdev     point_light *li;
317d86ed7fbStbbdev 
318d86ed7fbStbbdev     li = newlight(tex, (vector)ctr, rad);
319d86ed7fbStbbdev 
320d86ed7fbStbbdev     li->tex->islight = 1;
321d86ed7fbStbbdev     li->tex->shadowcast = 1;
322d86ed7fbStbbdev     li->tex->diffuse = 0.0;
323d86ed7fbStbbdev     li->tex->specular = 0.0;
324d86ed7fbStbbdev     li->tex->opacity = 1.0;
325d86ed7fbStbbdev 
326d86ed7fbStbbdev     add_light(li);
327d86ed7fbStbbdev     add_object((object *)li);
328d86ed7fbStbbdev }
329d86ed7fbStbbdev 
rt_scalarvol(void * tex,vector min,vector max,int xs,int ys,int zs,char * fname,void * invol)330d86ed7fbStbbdev void rt_scalarvol(void *tex,
331d86ed7fbStbbdev                   vector min,
332d86ed7fbStbbdev                   vector max,
333d86ed7fbStbbdev                   int xs,
334d86ed7fbStbbdev                   int ys,
335d86ed7fbStbbdev                   int zs,
336d86ed7fbStbbdev                   char *fname,
337d86ed7fbStbbdev                   void *invol) {
338d86ed7fbStbbdev     add_object((object *)newscalarvol(
339d86ed7fbStbbdev         tex, (vector)min, (vector)max, xs, ys, zs, fname, (scalarvol *)invol));
340d86ed7fbStbbdev }
341d86ed7fbStbbdev 
rt_extvol(void * tex,vector min,vector max,int samples,flt (* evaluator)(flt,flt,flt))342d86ed7fbStbbdev void rt_extvol(void *tex, vector min, vector max, int samples, flt (*evaluator)(flt, flt, flt)) {
343d86ed7fbStbbdev     add_object((object *)newextvol(tex, (vector)min, (vector)max, samples, evaluator));
344d86ed7fbStbbdev }
345d86ed7fbStbbdev 
rt_box(void * tex,vector min,vector max)346d86ed7fbStbbdev void rt_box(void *tex, vector min, vector max) {
347d86ed7fbStbbdev     add_object((object *)newbox(tex, (vector)min, (vector)max));
348d86ed7fbStbbdev }
349d86ed7fbStbbdev 
rt_cylinder(void * tex,vector ctr,vector axis,apiflt rad)350d86ed7fbStbbdev void rt_cylinder(void *tex, vector ctr, vector axis, apiflt rad) {
351d86ed7fbStbbdev     add_object(newcylinder(tex, (vector)ctr, (vector)axis, rad));
352d86ed7fbStbbdev }
353d86ed7fbStbbdev 
rt_fcylinder(void * tex,vector ctr,vector axis,apiflt rad)354d86ed7fbStbbdev void rt_fcylinder(void *tex, vector ctr, vector axis, apiflt rad) {
355d86ed7fbStbbdev     add_object(newfcylinder(tex, (vector)ctr, (vector)axis, rad));
356d86ed7fbStbbdev }
357d86ed7fbStbbdev 
rt_plane(void * tex,vector ctr,vector norm)358d86ed7fbStbbdev void rt_plane(void *tex, vector ctr, vector norm) {
359d86ed7fbStbbdev     add_object(newplane(tex, (vector)ctr, (vector)norm));
360d86ed7fbStbbdev }
361d86ed7fbStbbdev 
rt_ring(void * tex,vector ctr,vector norm,apiflt a,apiflt b)362d86ed7fbStbbdev void rt_ring(void *tex, vector ctr, vector norm, apiflt a, apiflt b) {
363d86ed7fbStbbdev     add_object(newring(tex, (vector)ctr, (vector)norm, a, b));
364d86ed7fbStbbdev }
365d86ed7fbStbbdev 
rt_sphere(void * tex,vector ctr,apiflt rad)366d86ed7fbStbbdev void rt_sphere(void *tex, vector ctr, apiflt rad) {
367d86ed7fbStbbdev     add_object(newsphere(tex, (vector)ctr, rad));
368d86ed7fbStbbdev }
369d86ed7fbStbbdev 
rt_tri(void * tex,vector v0,vector v1,vector v2)370d86ed7fbStbbdev void rt_tri(void *tex, vector v0, vector v1, vector v2) {
371d86ed7fbStbbdev     object *trn;
372d86ed7fbStbbdev 
373d86ed7fbStbbdev     trn = newtri(tex, (vector)v0, (vector)v1, (vector)v2);
374d86ed7fbStbbdev 
375d86ed7fbStbbdev     if (trn != nullptr) {
376d86ed7fbStbbdev         add_object(trn);
377d86ed7fbStbbdev     }
378d86ed7fbStbbdev }
379d86ed7fbStbbdev 
rt_stri(void * tex,vector v0,vector v1,vector v2,vector n0,vector n1,vector n2)380d86ed7fbStbbdev void rt_stri(void *tex, vector v0, vector v1, vector v2, vector n0, vector n1, vector n2) {
381d86ed7fbStbbdev     object *trn;
382d86ed7fbStbbdev 
383d86ed7fbStbbdev     trn = newstri(tex, (vector)v0, (vector)v1, (vector)v2, (vector)n0, (vector)n1, (vector)n2);
384d86ed7fbStbbdev 
385d86ed7fbStbbdev     if (trn != nullptr) {
386d86ed7fbStbbdev         add_object(trn);
387d86ed7fbStbbdev     }
388d86ed7fbStbbdev }
389d86ed7fbStbbdev 
rt_quadsphere(void * tex,vector ctr,apiflt rad)390d86ed7fbStbbdev void rt_quadsphere(void *tex, vector ctr, apiflt rad) {
391d86ed7fbStbbdev     quadric *q;
392d86ed7fbStbbdev     flt factor;
393d86ed7fbStbbdev     q = (quadric *)newquadric();
394d86ed7fbStbbdev     factor = 1.0 / (rad * rad);
395d86ed7fbStbbdev     q->tex = (texture *)tex;
396d86ed7fbStbbdev     q->ctr = ctr;
397d86ed7fbStbbdev 
398d86ed7fbStbbdev     q->mat.a = factor;
399d86ed7fbStbbdev     q->mat.b = 0.0;
400d86ed7fbStbbdev     q->mat.c = 0.0;
401d86ed7fbStbbdev     q->mat.d = 0.0;
402d86ed7fbStbbdev     q->mat.e = factor;
403d86ed7fbStbbdev     q->mat.f = 0.0;
404d86ed7fbStbbdev     q->mat.g = 0.0;
405d86ed7fbStbbdev     q->mat.h = factor;
406d86ed7fbStbbdev     q->mat.i = 0.0;
407d86ed7fbStbbdev     q->mat.j = -1.0;
408d86ed7fbStbbdev 
409d86ed7fbStbbdev     add_object((object *)q);
410d86ed7fbStbbdev }
411