GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/echo/bounds.c Lines: 0 13 0.0 %
Date: 2017-05-26 Branches: 0 146 0.0 %

Line Branch Exec Source
1
/*
2
  Teem: Tools to process and visualize scientific data and images             .
3
  Copyright (C) 2013, 2012, 2011, 2010, 2009  University of Chicago
4
  Copyright (C) 2008, 2007, 2006, 2005  Gordon Kindlmann
5
  Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998  University of Utah
6
7
  This library is free software; you can redistribute it and/or
8
  modify it under the terms of the GNU Lesser General Public License
9
  (LGPL) as published by the Free Software Foundation; either
10
  version 2.1 of the License, or (at your option) any later version.
11
  The terms of redistributing and/or modifying this software also
12
  include exceptions to the LGPL that facilitate static linking.
13
14
  This library is distributed in the hope that it will be useful,
15
  but WITHOUT ANY WARRANTY; without even the implied warranty of
16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
  Lesser General Public License for more details.
18
19
  You should have received a copy of the GNU Lesser General Public License
20
  along with this library; if not, write to Free Software Foundation, Inc.,
21
  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22
*/
23
24
#include "echo.h"
25
#include "privateEcho.h"
26
27
typedef void (*_echoBoundsGet_t)(echoPos_t lo[3], echoPos_t hi[3],
28
                                 echoObject *obj);
29
30
extern _echoBoundsGet_t _echoBoundsGet[ECHO_TYPE_NUM];
31
32
#define BNDS_TMPL(TYPE, BODY)                                             \
33
void                                                                      \
34
_echo##TYPE##_bounds(echoPos_t lo[3], echoPos_t hi[3], echo##TYPE *obj) { \
35
  int dummy=0;                                                            \
36
                                                                          \
37
  do { BODY dummy=dummy;} while (0);                                      \
38
  lo[0] -= ECHO_EPSILON;                                                  \
39
  lo[1] -= ECHO_EPSILON;                                                  \
40
  lo[2] -= ECHO_EPSILON;                                                  \
41
  hi[0] += ECHO_EPSILON;                                                  \
42
  hi[1] += ECHO_EPSILON;                                                  \
43
  hi[2] += ECHO_EPSILON;                                                  \
44
  return;                                                                 \
45
}
46
47
BNDS_TMPL(Sphere,
48
          lo[0] = obj->pos[0] - obj->rad;
49
          lo[1] = obj->pos[1] - obj->rad;
50
          lo[2] = obj->pos[2] - obj->rad;
51
          hi[0] = obj->pos[0] + obj->rad;
52
          hi[1] = obj->pos[1] + obj->rad;
53
          hi[2] = obj->pos[2] + obj->rad;
54
          )
55
56
BNDS_TMPL(Cylinder,
57
          AIR_UNUSED(obj);
58
          ELL_3V_SET(lo, -1, -1, -1);
59
          ELL_3V_SET(hi,  1,  1,  1);
60
          )
61
62
BNDS_TMPL(Superquad,
63
          AIR_UNUSED(obj);
64
          ELL_3V_SET(lo, -1, -1, -1);
65
          ELL_3V_SET(hi,  1,  1,  1);
66
          )
67
68
BNDS_TMPL(Cube,
69
          AIR_UNUSED(obj);
70
          ELL_3V_SET(lo, -1, -1, -1);
71
          ELL_3V_SET(hi,  1,  1,  1);
72
          )
73
74
BNDS_TMPL(Triangle,
75
          ELL_3V_COPY(lo, obj->vert[0]);
76
          ELL_3V_MIN(lo, lo, obj->vert[1]);
77
          ELL_3V_MIN(lo, lo, obj->vert[2]);
78
          ELL_3V_COPY(hi, obj->vert[0]);
79
          ELL_3V_MAX(hi, hi, obj->vert[1]);
80
          ELL_3V_MAX(hi, hi, obj->vert[2]);
81
          )
82
83
BNDS_TMPL(Rectangle,
84
          echoPos_t v[3][3];
85
86
          ELL_3V_COPY(lo, obj->origin);
87
          ELL_3V_ADD2(v[0], lo, obj->edge0);
88
          ELL_3V_ADD2(v[1], lo, obj->edge1);
89
          ELL_3V_ADD2(v[2], v[0], obj->edge1);
90
          ELL_3V_MIN(lo, lo, v[0]);
91
          ELL_3V_MIN(lo, lo, v[1]);
92
          ELL_3V_MIN(lo, lo, v[2]);
93
          ELL_3V_COPY(hi, obj->origin);
94
          ELL_3V_MAX(hi, hi, v[0]);
95
          ELL_3V_MAX(hi, hi, v[1]);
96
          ELL_3V_MAX(hi, hi, v[2]);
97
          )
98
99
BNDS_TMPL(TriMesh,
100
          ELL_3V_COPY(lo, obj->min);
101
          ELL_3V_COPY(hi, obj->max);
102
          )
103
104
BNDS_TMPL(Isosurface,
105
          AIR_UNUSED(obj);
106
          fprintf(stderr, "_echoIsosurface_bounds: unimplemented!\n");
107
          )
108
109
BNDS_TMPL(AABBox,
110
          ELL_3V_COPY(lo, obj->min);
111
          ELL_3V_COPY(hi, obj->max);
112
          )
113
114
BNDS_TMPL(List,
115
          unsigned int i;
116
          echoPos_t l[3];
117
          echoPos_t h[3];
118
          echoObject *o;
119
120
          ELL_3V_SET(lo, ECHO_POS_MAX, ECHO_POS_MAX, ECHO_POS_MAX);
121
          ELL_3V_SET(hi, ECHO_POS_MIN, ECHO_POS_MIN, ECHO_POS_MIN);
122
          for (i=0; i<obj->objArr->len; i++) {
123
            o = obj->obj[i];
124
            _echoBoundsGet[o->type](l, h, o);
125
            ELL_3V_MIN(lo, lo, l);
126
            ELL_3V_MAX(hi, hi, h);
127
          }
128
          )
129
130
BNDS_TMPL(Split,
131
          AIR_UNUSED(obj);
132
          fprintf(stderr, "_echoSplit_bounds: unimplemented!\n");
133
          )
134
135
BNDS_TMPL(Instance,
136
          echoPos_t a[8][4];
137
          echoPos_t b[8][4];
138
          echoPos_t l[3];
139
          echoPos_t h[3];
140
141
          _echoBoundsGet[obj->obj->type](l, h, obj->obj);
142
          ELL_4V_SET(a[0], l[0], l[1], l[2], 1);
143
          ELL_4V_SET(a[1], h[0], l[1], l[2], 1);
144
          ELL_4V_SET(a[2], l[0], h[1], l[2], 1);
145
          ELL_4V_SET(a[3], h[0], h[1], l[2], 1);
146
          ELL_4V_SET(a[4], l[0], l[1], h[2], 1);
147
          ELL_4V_SET(a[5], h[0], l[1], h[2], 1);
148
          ELL_4V_SET(a[6], l[0], h[1], h[2], 1);
149
          ELL_4V_SET(a[7], h[0], h[1], h[2], 1);
150
          ELL_4MV_MUL(b[0], obj->M, a[0]); ELL_4V_HOMOG(b[0], b[0]);
151
          ELL_4MV_MUL(b[1], obj->M, a[1]); ELL_4V_HOMOG(b[1], b[1]);
152
          ELL_4MV_MUL(b[2], obj->M, a[2]); ELL_4V_HOMOG(b[2], b[2]);
153
          ELL_4MV_MUL(b[3], obj->M, a[3]); ELL_4V_HOMOG(b[3], b[3]);
154
          ELL_4MV_MUL(b[4], obj->M, a[4]); ELL_4V_HOMOG(b[4], b[4]);
155
          ELL_4MV_MUL(b[5], obj->M, a[5]); ELL_4V_HOMOG(b[5], b[5]);
156
          ELL_4MV_MUL(b[6], obj->M, a[6]); ELL_4V_HOMOG(b[6], b[6]);
157
          ELL_4MV_MUL(b[7], obj->M, a[7]); ELL_4V_HOMOG(b[7], b[7]);
158
          ELL_3V_MIN(lo, b[0], b[1]);
159
          ELL_3V_MIN(lo, lo, b[2]);
160
          ELL_3V_MIN(lo, lo, b[3]);
161
          ELL_3V_MIN(lo, lo, b[4]);
162
          ELL_3V_MIN(lo, lo, b[5]);
163
          ELL_3V_MIN(lo, lo, b[6]);
164
          ELL_3V_MIN(lo, lo, b[7]);
165
          ELL_3V_MAX(hi, b[0], b[1]);
166
          ELL_3V_MAX(hi, hi, b[2]);
167
          ELL_3V_MAX(hi, hi, b[3]);
168
          ELL_3V_MAX(hi, hi, b[4]);
169
          ELL_3V_MAX(hi, hi, b[5]);
170
          ELL_3V_MAX(hi, hi, b[6]);
171
          ELL_3V_MAX(hi, hi, b[7]);
172
          )
173
174
_echoBoundsGet_t
175
_echoBoundsGet[ECHO_TYPE_NUM] = {
176
  (_echoBoundsGet_t)_echoSphere_bounds,
177
  (_echoBoundsGet_t)_echoCylinder_bounds,
178
  (_echoBoundsGet_t)_echoSuperquad_bounds,
179
  (_echoBoundsGet_t)_echoCube_bounds,
180
  (_echoBoundsGet_t)_echoTriangle_bounds,
181
  (_echoBoundsGet_t)_echoRectangle_bounds,
182
  (_echoBoundsGet_t)_echoTriMesh_bounds,
183
  (_echoBoundsGet_t)_echoIsosurface_bounds,
184
  (_echoBoundsGet_t)_echoAABBox_bounds,
185
  (_echoBoundsGet_t)_echoSplit_bounds,
186
  (_echoBoundsGet_t)_echoList_bounds,
187
  (_echoBoundsGet_t)_echoInstance_bounds,
188
};
189
190
void
191
echoBoundsGet(echoPos_t *lo, echoPos_t *hi, echoObject *obj) {
192
  _echoBoundsGet[obj->type](lo, hi, obj);
193
}