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