Vuo  2.3.2
VuoPoint3d.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include "VuoReal.h"
13 #include "VuoBoolean.h"
14 #include <math.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
31 typedef float __attribute__((ext_vector_type(3))) VuoPoint3d;
32 
34 typedef const struct VuoList_VuoPoint3d_struct { void *l; } * VuoList_VuoPoint3d;
35 #define VuoList_VuoPoint3d_TYPE_DEFINED
37 
41 typedef struct
42 {
43  VuoPoint3d center;
44  VuoPoint3d size;
45 } VuoBox;
46 
47 VuoPoint3d VuoPoint3d_makeFromJson(struct json_object * js);
48 struct json_object * VuoPoint3d_getJson(const VuoPoint3d value);
49 char * VuoPoint3d_getSummary(const VuoPoint3d value);
50 
51 #define VuoPoint3d_SUPPORTS_COMPARISON
52 bool VuoPoint3d_areEqual(const VuoPoint3d value1, const VuoPoint3d value2);
53 bool VuoPoint3d_areEqualListWithinTolerance(VuoList_VuoPoint3d values, VuoPoint3d tolerance);
54 bool VuoPoint3d_isLessThan(const VuoPoint3d a, const VuoPoint3d b);
55 bool VuoPoint3d_isWithinRange(VuoPoint3d value, VuoPoint3d minimum, VuoPoint3d maximum);
56 
57 VuoPoint3d VuoPoint3d_minList(VuoList_VuoPoint3d values, VuoInteger *outputPosition);
58 VuoPoint3d VuoPoint3d_maxList(VuoList_VuoPoint3d values, VuoInteger *outputPosition);
59 VuoPoint3d VuoPoint3d_average(VuoList_VuoPoint3d values);
60 
61 VuoPoint3d VuoPoint3d_random(const VuoPoint3d minimum, const VuoPoint3d maximum);
62 VuoPoint3d VuoPoint3d_randomWithState(unsigned short state[3], const VuoPoint3d minimum, const VuoPoint3d maximum);
63 
65 
68 VuoPoint3d VuoPoint3d_makeFromString(const char *str);
69 char * VuoPoint3d_getString(const VuoPoint3d value);
70 void VuoPoint3d_retain(VuoPoint3d value);
71 void VuoPoint3d_release(VuoPoint3d value);
73 
77 static inline VuoPoint3d VuoPoint3d_make(float x, float y, float z) __attribute__((const));
78 static inline VuoPoint3d VuoPoint3d_make(float x, float y, float z)
79 {
80  return (VuoPoint3d){x, y, z};
81 }
82 
88 static inline VuoPoint3d VuoPoint3d_makeFromArray(float *f)
89 {
90  return (VuoPoint3d){ f[0], f[1], f[2] };
91 }
92 
98 static inline void VuoPoint3d_setArray(float *f, VuoPoint3d p)
99 {
100  f[0] = p.x;
101  f[1] = p.y;
102  f[2] = p.z;
103 }
104 
108 static inline VuoBox VuoBox_make(VuoPoint3d center, VuoPoint3d size) __attribute__((const));
109 static inline VuoBox VuoBox_make(VuoPoint3d center, VuoPoint3d size)
110 {
111  return (VuoBox){ center, size };
112 }
113 
117 static inline VuoBox VuoBox_makeWithPoints(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) __attribute__((const));
118 static inline VuoBox VuoBox_makeWithPoints(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
119 {
120  return (VuoBox){
121  (VuoPoint3d){ (xmin+xmax)/2.f, (ymin+ymax)/2.f, (zmin+zmax)/2.f },
122  (VuoPoint3d){ xmax-xmin, ymax-ymin, zmax-zmin }
123  };
124 }
125 
129 static inline VuoPoint3d VuoPoint3d_crossProduct(VuoPoint3d u, VuoPoint3d v) __attribute__((const));
130 static inline VuoPoint3d VuoPoint3d_crossProduct(VuoPoint3d u, VuoPoint3d v)
131 {
132  return (VuoPoint3d){
133  u.y*v.z - u.z*v.y,
134  u.z*v.x - u.x*v.z,
135  u.x*v.y - u.y*v.x
136  };
137 }
138 
142 static inline float VuoPoint3d_dotProduct(VuoPoint3d u, VuoPoint3d v) __attribute__((const));
143 static inline float VuoPoint3d_dotProduct(VuoPoint3d u, VuoPoint3d v)
144 {
145  return u.x*v.x+u.y*v.y+u.z*v.z;
146 }
147 
151 static inline float VuoPoint3d_magnitude(VuoPoint3d a) __attribute__((const));
152 static inline float VuoPoint3d_magnitude(VuoPoint3d a)
153 {
154  return sqrtf(a.x*a.x + a.y*a.y + a.z*a.z);
155 }
156 
160 static inline VuoPoint3d VuoPoint3d_normalize(VuoPoint3d a) __attribute__((const));
161 static inline VuoPoint3d VuoPoint3d_normalize(VuoPoint3d a)
162 {
163  return a / sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);
164 }
165 
169 static inline VuoPoint3d VuoPoint3d_add(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
170 static inline VuoPoint3d VuoPoint3d_add(VuoPoint3d a, VuoPoint3d b)
171 {
172  return a + b;
173 }
174 
178 static inline VuoPoint3d VuoPoint3d_subtract(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
179 static inline VuoPoint3d VuoPoint3d_subtract(VuoPoint3d a, VuoPoint3d b)
180 {
181  return a - b;
182 }
183 
184 
188 static inline float VuoPoint3d_squaredMagnitude(VuoPoint3d a) __attribute__((const));
189 static inline float VuoPoint3d_squaredMagnitude(VuoPoint3d a)
190 {
191  return (a.x*a.x + a.y*a.y + a.z*a.z);
192 }
193 
197 static inline VuoPoint3d VuoPoint3d_divide(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
198 static inline VuoPoint3d VuoPoint3d_divide(VuoPoint3d a, VuoPoint3d b)
199 {
200  return a / b;
201 }
202 
206 static inline VuoPoint3d VuoPoint3d_multiply(VuoPoint3d a, float b) __attribute__((const));
207 static inline VuoPoint3d VuoPoint3d_multiply(VuoPoint3d a, float b)
208 {
209  return a * b;
210 }
211 
215 static inline VuoPoint3d VuoPoint3d_min(const VuoPoint3d l, const VuoPoint3d r) __attribute__((const));
216 static inline VuoPoint3d VuoPoint3d_min(const VuoPoint3d l, const VuoPoint3d r)
217 {
218  return (VuoPoint3d){
219  fminf(l.x, r.x),
220  fminf(l.y, r.y),
221  fminf(l.z, r.z)};
222 }
223 
227 static inline VuoPoint3d VuoPoint3d_max(const VuoPoint3d l, const VuoPoint3d r) __attribute__((const));
228 static inline VuoPoint3d VuoPoint3d_max(const VuoPoint3d l, const VuoPoint3d r)
229 {
230  return (VuoPoint3d){
231  fmaxf(l.x, r.x),
232  fmaxf(l.y, r.y),
233  fmaxf(l.z, r.z)};
234 }
235 
239 static inline VuoPoint3d VuoPoint3d_makeNonzero(VuoPoint3d a) __attribute__((const));
240 static inline VuoPoint3d VuoPoint3d_makeNonzero(VuoPoint3d a)
241 {
242  if (fabs(a.x) < 0.000001)
243  a.x = copysign(0.000001, a.x);
244  if (fabs(a.y) < 0.000001)
245  a.y = copysign(0.000001, a.y);
246  if (fabs(a.z) < 0.000001)
247  a.z = copysign(0.000001, a.z);
248  return a;
249 }
250 
254 static inline float VuoPoint3d_distance(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
255 static inline float VuoPoint3d_distance(VuoPoint3d a, VuoPoint3d b)
256 {
257  return sqrtf((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + (a.z-b.z)*(a.z-b.z));
258 }
259 
263 static inline VuoPoint3d VuoPoint3d_lerp(VuoPoint3d a, VuoPoint3d b, float t) __attribute__((const));
264 static inline VuoPoint3d VuoPoint3d_lerp(VuoPoint3d a, VuoPoint3d b, float t)
265 {
266  return a * (1 - t) + b * t;
267 }
268 
272 static inline VuoPoint3d VuoPoint3d_scale(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
273 static inline VuoPoint3d VuoPoint3d_scale(VuoPoint3d a, VuoPoint3d b)
274 {
275  return a * b;
276 }
277 
286 static inline VuoPoint3d VuoPoint3d_mod(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
287 static inline VuoPoint3d VuoPoint3d_mod(VuoPoint3d a, VuoPoint3d b)
288 {
289  return (VuoPoint3d){
290  a.x - b.x * floorf(a.x / b.x),
291  a.y - b.y * floorf(a.y / b.y),
292  a.z - b.z * floorf(a.z / b.z)
293  };
294 }
295 
299 static inline VuoPoint3d VuoPoint3d_spring(VuoReal timeSinceDrop, VuoPoint3d dropPosition, VuoPoint3d restingPosition, VuoReal period, VuoReal damping)
300 {
301  VuoPoint3d p;
302  p.x = VuoReal_spring(timeSinceDrop, dropPosition.x, restingPosition.x, period, damping);
303  p.y = VuoReal_spring(timeSinceDrop, dropPosition.y, restingPosition.y, period, damping);
304  p.z = VuoReal_spring(timeSinceDrop, dropPosition.z, restingPosition.z, period, damping);
305  return p;
306 }
307 
311 static inline VuoPoint3d VuoPoint3d_clamp(VuoPoint3d point, VuoReal limitA, VuoReal limitB)
312 {
313  return (VuoPoint3d){
314  (float)VuoReal_clamp(point.x, limitA, limitB),
315  (float)VuoReal_clamp(point.y, limitA, limitB),
316  (float)VuoReal_clamp(point.z, limitA, limitB)
317  };
318 }
319 
323 static inline VuoPoint3d VuoPoint3d_clampn(VuoPoint3d point, VuoPoint3d limitA, VuoPoint3d limitB)
324 {
325  return (VuoPoint3d){
326  (float)VuoReal_clamp(point.x, limitA.x, limitB.x),
327  (float)VuoReal_clamp(point.y, limitA.y, limitB.y),
328  (float)VuoReal_clamp(point.z, limitA.z, limitB.z)
329  };
330 }
331 
341 static inline VuoPoint3d VuoPoint3d_bezier3(VuoPoint3d p0, VuoPoint3d p1, VuoPoint3d p2, VuoPoint3d p3, VuoReal time)
342 {
343  return (VuoPoint3d) {
344  (float)VuoReal_bezier3(p0.x,p1.x,p2.x,p3.x,time),
345  (float)VuoReal_bezier3(p0.y,p1.y,p2.y,p3.y,time),
346  (float)VuoReal_bezier3(p0.z,p1.z,p2.z,p3.z,time)
347  };
348 }
349 
353 static inline VuoPoint3d VuoPoint3d_snap(VuoPoint3d a, VuoPoint3d center, VuoPoint3d snap)
354 {
355  VuoPoint3d nonzeroSnap = VuoPoint3d_makeNonzero(snap);
356  return (VuoPoint3d) {
357  center.x + nonzeroSnap.x * (int)round( (a.x-center.x) / nonzeroSnap.x ),
358  center.y + nonzeroSnap.y * (int)round( (a.y-center.y) / nonzeroSnap.y ),
359  center.z + nonzeroSnap.z * (int)round( (a.z-center.z) / nonzeroSnap.z )
360  };
361 }
362 
367 {
368  float xmin, ymin, zmin, xmax, ymax, zmax;
369 
370  VuoPoint3d extents_a = VuoPoint3d_multiply(a.size, .5);
371  VuoPoint3d extents_b = VuoPoint3d_multiply(b.size, .5);
372 
373  xmin = fmin(a.center.x - extents_a.x, b.center.x - extents_b.x);
374  xmax = fmax(a.center.x + extents_a.x, b.center.x + extents_b.x);
375 
376  ymin = fmin(a.center.y - extents_a.y, b.center.y - extents_b.y);
377  ymax = fmax(a.center.y + extents_a.y, b.center.y + extents_b.y);
378 
379  zmin = fmin(a.center.z - extents_a.z, b.center.z - extents_b.z);
380  zmax = fmax(a.center.z + extents_a.z, b.center.z + extents_b.z);
381 
382  return VuoBox_makeWithPoints( xmin, xmax, ymin, ymax, zmin, zmax );
383 }
384 
388 static inline VuoBoolean VuoBox_contains(VuoBox aabb, VuoPoint3d point)
389 {
390  VuoPoint3d exents = (VuoPoint3d){aabb.size.x / 2.f, aabb.size.y / 2.f};
391  VuoPoint3d min = aabb.center - exents;
392  VuoPoint3d max = aabb.center + exents;
393 
394  return point.x > min.x && point.x < max.x &&
395  point.y > min.y && point.y < max.y &&
396  point.z > min.z && point.z < max.z;
397 }
398 
403 {
404  VuoPoint3d dist = VuoPoint3d_subtract(a.center, b.center);
405  VuoPoint3d size = VuoPoint3d_add(a.size, b.size);
406 
407  return fabs(dist.x) * 2 < size.x &&
408  fabs(dist.y) * 2 < size.y &&
409  fabs(dist.z) * 2 < size.z;
410 }
411 
416 #ifdef __cplusplus
417 }
418 #endif