Tachyon (current)  Current Main Branch
ring.c
Go to the documentation of this file.
1 /*
2  * ring.c - This file contains the functions for dealing with rings.
3  *
4  * (C) Copyright 1994-2022 John E. Stone
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  * $Id: ring.c,v 1.23 2022/02/18 17:55:28 johns Exp $
8  *
9  */
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <math.h>
15 
16 #define TACHYON_INTERNAL 1
17 #include "tachyon.h"
18 #include "macros.h"
19 #include "vector.h"
20 #include "intersect.h"
21 #include "util.h"
22 
23 #define RING_PRIVATE
24 #include "ring.h"
25 
26 static object_methods ring_methods = {
27  (void (*)(const void *, void *))(ring_intersect),
28  (void (*)(const void *, const void *, const void *, void *))(ring_normal),
29  ring_bbox,
30  free
31 };
32 
33 object * newring(void * tex, vector ctr, vector norm, flt inrad, flt outrad) {
34  ring * r;
35 
36  r=(ring *) malloc(sizeof(ring));
37  memset(r, 0, sizeof(ring));
38  r->methods = &ring_methods;
39 
40  r->tex = tex;
41  r->ctr = ctr;
42  r->norm = norm;
43  VNorm(&r->norm);
44  r->inrad = inrad;
45  r->outrad= outrad;
46 
47  return (object *) r;
48 }
49 
50 static int ring_bbox(void * obj, vector * min, vector * max) {
51  ring * r = (ring *) obj;
52 
53  min->x = r->ctr.x - r->outrad;
54  min->y = r->ctr.y - r->outrad;
55  min->z = r->ctr.z - r->outrad;
56  max->x = r->ctr.x + r->outrad;
57  max->y = r->ctr.y + r->outrad;
58  max->z = r->ctr.z + r->outrad;
59 
60  return 1;
61 }
62 
63 static void ring_intersect(const ring * rng, ray * ry) {
64  flt d;
65  flt t,td;
66  vector hit, pnt;
67 
68  d = -VDot(&(rng->ctr), &(rng->norm));
69 
70  t=-(d+VDot(&(rng->norm), &(ry->o)));
71  td=VDot(&(rng->norm),&(ry->d));
72  if (td != 0.0) {
73  t= t / td;
74  if (t>=0.0) {
75  hit=Raypnt(ry, t);
76  VSUB(hit, rng->ctr, pnt);
77  VDOT(td, pnt, pnt);
78  td=SQRT(td);
79  if ((td > rng->inrad) && (td < rng->outrad))
80  ry->add_intersection(t,(object *) rng, ry);
81  }
82  }
83 }
84 
85 static void ring_normal(const ring * rng, const vector * pnt, const ray * incident, vector * N) {
86  *N=rng->norm;
87 
88  /* Flip surface normal to point toward the viewer if necessary */
89  if (VDot(N, &(incident->d)) > 0.0) {
90  N->x=-N->x;
91  N->y=-N->y;
92  N->z=-N->z;
93  }
94 }
95 
object * newring(void *tex, vector ctr, vector norm, flt inrad, flt outrad)
Definition: ring.c:33
static void ring_normal(const ring *rng, const vector *pnt, const ray *incident, vector *N)
Definition: ring.c:85
void VNorm(apivector *)
#define VSUB(a, b, c)
Definition: macros.h:24
flt VDot(apivector *a, apivector *b)
double flt
generic floating point number, using double
Definition: tachyon.h:47
#define VDOT(return, a, b)
Definition: macros.h:15
Tachyon cross-platform timers, special math function wrappers, and RNGs.
static void ring_intersect(const ring *rng, ray *ry)
Definition: ring.c:63
static int ring_bbox(void *obj, vector *min, vector *max)
Definition: ring.c:50
#define SQRT(x)
Definition: util.h:31
vector Raypnt(const ray *a, flt t)
Definition: vector.c:63
static object_methods ring_methods
Definition: ring.c:26
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...