Vuo 2.4.4
Loading...
Searching...
No Matches
VuoPoint3d.h
Go to the documentation of this file.
1
10#ifndef VuoPoint3d_h
11#define VuoPoint3d_h
12
13#include "VuoReal.h"
14#include "VuoBoolean.h"
15#include <math.h>
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
32typedef float __attribute__((ext_vector_type(3))) VuoPoint3d;
33
34#define VuoPoint3d_SUPPORTS_COMPARISON
35#include "VuoList_VuoPoint3d.h"
36
40typedef struct
41{
42 VuoPoint3d center;
43 VuoPoint3d size;
44} VuoBox;
45
46VuoPoint3d VuoPoint3d_makeFromJson(struct json_object * js);
47struct json_object * VuoPoint3d_getJson(const VuoPoint3d value);
48char * VuoPoint3d_getSummary(const VuoPoint3d value);
49
50bool VuoPoint3d_areEqual(const VuoPoint3d value1, const VuoPoint3d value2);
51bool VuoPoint3d_areEqualListWithinTolerance(VuoList_VuoPoint3d values, VuoPoint3d tolerance);
52bool VuoPoint3d_isLessThan(const VuoPoint3d a, const VuoPoint3d b);
53bool VuoPoint3d_isWithinRange(VuoPoint3d value, VuoPoint3d minimum, VuoPoint3d maximum);
54
55VuoPoint3d VuoPoint3d_minList(VuoList_VuoPoint3d values, VuoInteger *outputPosition);
56VuoPoint3d VuoPoint3d_maxList(VuoList_VuoPoint3d values, VuoInteger *outputPosition);
57VuoPoint3d VuoPoint3d_average(VuoList_VuoPoint3d values);
58
59VuoPoint3d VuoPoint3d_random(const VuoPoint3d minimum, const VuoPoint3d maximum);
60VuoPoint3d VuoPoint3d_randomWithState(unsigned short state[3], const VuoPoint3d minimum, const VuoPoint3d maximum);
61
63
66char * VuoPoint3d_getString(const VuoPoint3d value);
67void VuoPoint3d_retain(VuoPoint3d value);
68void VuoPoint3d_release(VuoPoint3d value);
70
74static inline VuoPoint3d VuoPoint3d_make(float x, float y, float z) __attribute__((const));
75static inline VuoPoint3d VuoPoint3d_make(float x, float y, float z)
76{
77 return (VuoPoint3d){x, y, z};
78}
79
85static inline VuoPoint3d VuoPoint3d_makeFromArray(float *f)
86{
87 return (VuoPoint3d){ f[0], f[1], f[2] };
88}
89
95static inline void VuoPoint3d_setArray(float *f, VuoPoint3d p)
96{
97 f[0] = p.x;
98 f[1] = p.y;
99 f[2] = p.z;
100}
101
105static inline VuoBox VuoBox_make(VuoPoint3d center, VuoPoint3d size) __attribute__((const));
106static inline VuoBox VuoBox_make(VuoPoint3d center, VuoPoint3d size)
107{
108 return (VuoBox){ center, size };
109}
110
114static inline VuoBox VuoBox_makeWithPoints(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) __attribute__((const));
115static inline VuoBox VuoBox_makeWithPoints(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
116{
117 return (VuoBox){
118 (VuoPoint3d){ (xmin+xmax)/2.f, (ymin+ymax)/2.f, (zmin+zmax)/2.f },
119 (VuoPoint3d){ xmax-xmin, ymax-ymin, zmax-zmin }
120 };
121}
122
126static inline VuoPoint3d VuoPoint3d_crossProduct(VuoPoint3d u, VuoPoint3d v) __attribute__((const));
127static inline VuoPoint3d VuoPoint3d_crossProduct(VuoPoint3d u, VuoPoint3d v)
128{
129 return (VuoPoint3d){
130 u.y*v.z - u.z*v.y,
131 u.z*v.x - u.x*v.z,
132 u.x*v.y - u.y*v.x
133 };
134}
135
139static inline float VuoPoint3d_dotProduct(VuoPoint3d u, VuoPoint3d v) __attribute__((const));
140static inline float VuoPoint3d_dotProduct(VuoPoint3d u, VuoPoint3d v)
141{
142 return u.x*v.x+u.y*v.y+u.z*v.z;
143}
144
148static inline float VuoPoint3d_magnitude(VuoPoint3d a) __attribute__((const));
149static inline float VuoPoint3d_magnitude(VuoPoint3d a)
150{
151 return sqrtf(a.x*a.x + a.y*a.y + a.z*a.z);
152}
153
157static inline VuoPoint3d VuoPoint3d_normalize(VuoPoint3d a) __attribute__((const));
158static inline VuoPoint3d VuoPoint3d_normalize(VuoPoint3d a)
159{
160 return a / sqrtf(a.x * a.x + a.y * a.y + a.z * a.z);
161}
162
166static inline VuoPoint3d VuoPoint3d_add(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
167static inline VuoPoint3d VuoPoint3d_add(VuoPoint3d a, VuoPoint3d b)
168{
169 return a + b;
170}
171
175static inline VuoPoint3d VuoPoint3d_subtract(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
176static inline VuoPoint3d VuoPoint3d_subtract(VuoPoint3d a, VuoPoint3d b)
177{
178 return a - b;
179}
180
181
185static inline float VuoPoint3d_squaredMagnitude(VuoPoint3d a) __attribute__((const));
186static inline float VuoPoint3d_squaredMagnitude(VuoPoint3d a)
187{
188 return (a.x*a.x + a.y*a.y + a.z*a.z);
189}
190
194static inline VuoPoint3d VuoPoint3d_divide(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
195static inline VuoPoint3d VuoPoint3d_divide(VuoPoint3d a, VuoPoint3d b)
196{
197 return a / b;
198}
199
203static inline VuoPoint3d VuoPoint3d_multiply(VuoPoint3d a, float b) __attribute__((const));
204static inline VuoPoint3d VuoPoint3d_multiply(VuoPoint3d a, float b)
205{
206 return a * b;
207}
208
212static inline VuoPoint3d VuoPoint3d_min(const VuoPoint3d l, const VuoPoint3d r) __attribute__((const));
213static inline VuoPoint3d VuoPoint3d_min(const VuoPoint3d l, const VuoPoint3d r)
214{
215 return (VuoPoint3d){
216 fminf(l.x, r.x),
217 fminf(l.y, r.y),
218 fminf(l.z, r.z)};
219}
220
224static inline VuoPoint3d VuoPoint3d_max(const VuoPoint3d l, const VuoPoint3d r) __attribute__((const));
225static inline VuoPoint3d VuoPoint3d_max(const VuoPoint3d l, const VuoPoint3d r)
226{
227 return (VuoPoint3d){
228 fmaxf(l.x, r.x),
229 fmaxf(l.y, r.y),
230 fmaxf(l.z, r.z)};
231}
232
236static inline VuoPoint3d VuoPoint3d_makeNonzero(VuoPoint3d a) __attribute__((const));
237static inline VuoPoint3d VuoPoint3d_makeNonzero(VuoPoint3d a)
238{
239 if (fabs(a.x) < 0.000001)
240 a.x = copysign(0.000001, a.x);
241 if (fabs(a.y) < 0.000001)
242 a.y = copysign(0.000001, a.y);
243 if (fabs(a.z) < 0.000001)
244 a.z = copysign(0.000001, a.z);
245 return a;
246}
247
251static inline float VuoPoint3d_distance(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
252static inline float VuoPoint3d_distance(VuoPoint3d a, VuoPoint3d b)
253{
254 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));
255}
256
260static inline VuoPoint3d VuoPoint3d_lerp(VuoPoint3d a, VuoPoint3d b, float t) __attribute__((const));
261static inline VuoPoint3d VuoPoint3d_lerp(VuoPoint3d a, VuoPoint3d b, float t)
262{
263 return a * (1 - t) + b * t;
264}
265
269static inline VuoPoint3d VuoPoint3d_scale(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
270static inline VuoPoint3d VuoPoint3d_scale(VuoPoint3d a, VuoPoint3d b)
271{
272 return a * b;
273}
274
283static inline VuoPoint3d VuoPoint3d_mod(VuoPoint3d a, VuoPoint3d b) __attribute__((const));
284static inline VuoPoint3d VuoPoint3d_mod(VuoPoint3d a, VuoPoint3d b)
285{
286 return (VuoPoint3d){
287 a.x - b.x * floorf(a.x / b.x),
288 a.y - b.y * floorf(a.y / b.y),
289 a.z - b.z * floorf(a.z / b.z)
290 };
291}
292
296static inline VuoPoint3d VuoPoint3d_spring(VuoReal timeSinceDrop, VuoPoint3d dropPosition, VuoPoint3d restingPosition, VuoReal period, VuoReal damping)
297{
298 VuoPoint3d p;
299 p.x = VuoReal_spring(timeSinceDrop, dropPosition.x, restingPosition.x, period, damping);
300 p.y = VuoReal_spring(timeSinceDrop, dropPosition.y, restingPosition.y, period, damping);
301 p.z = VuoReal_spring(timeSinceDrop, dropPosition.z, restingPosition.z, period, damping);
302 return p;
303}
304
308static inline VuoPoint3d VuoPoint3d_clamp(VuoPoint3d point, VuoReal limitA, VuoReal limitB)
309{
310 return (VuoPoint3d){
311 (float)VuoReal_clamp(point.x, limitA, limitB),
312 (float)VuoReal_clamp(point.y, limitA, limitB),
313 (float)VuoReal_clamp(point.z, limitA, limitB)
314 };
315}
316
320static inline VuoPoint3d VuoPoint3d_clampn(VuoPoint3d point, VuoPoint3d limitA, VuoPoint3d limitB)
321{
322 return (VuoPoint3d){
323 (float)VuoReal_clamp(point.x, limitA.x, limitB.x),
324 (float)VuoReal_clamp(point.y, limitA.y, limitB.y),
325 (float)VuoReal_clamp(point.z, limitA.z, limitB.z)
326 };
327}
328
338static inline VuoPoint3d VuoPoint3d_bezier3(VuoPoint3d p0, VuoPoint3d p1, VuoPoint3d p2, VuoPoint3d p3, VuoReal time)
339{
340 return (VuoPoint3d) {
341 (float)VuoReal_bezier3(p0.x,p1.x,p2.x,p3.x,time),
342 (float)VuoReal_bezier3(p0.y,p1.y,p2.y,p3.y,time),
343 (float)VuoReal_bezier3(p0.z,p1.z,p2.z,p3.z,time)
344 };
345}
346
350static inline VuoPoint3d VuoPoint3d_snap(VuoPoint3d a, VuoPoint3d center, VuoPoint3d snap)
351{
352 VuoPoint3d nonzeroSnap = VuoPoint3d_makeNonzero(snap);
353 return (VuoPoint3d) {
354 center.x + nonzeroSnap.x * (int)round( (a.x-center.x) / nonzeroSnap.x ),
355 center.y + nonzeroSnap.y * (int)round( (a.y-center.y) / nonzeroSnap.y ),
356 center.z + nonzeroSnap.z * (int)round( (a.z-center.z) / nonzeroSnap.z )
357 };
358}
359
364{
365 float xmin, ymin, zmin, xmax, ymax, zmax;
366
367 VuoPoint3d extents_a = VuoPoint3d_multiply(a.size, .5);
368 VuoPoint3d extents_b = VuoPoint3d_multiply(b.size, .5);
369
370 xmin = fmin(a.center.x - extents_a.x, b.center.x - extents_b.x);
371 xmax = fmax(a.center.x + extents_a.x, b.center.x + extents_b.x);
372
373 ymin = fmin(a.center.y - extents_a.y, b.center.y - extents_b.y);
374 ymax = fmax(a.center.y + extents_a.y, b.center.y + extents_b.y);
375
376 zmin = fmin(a.center.z - extents_a.z, b.center.z - extents_b.z);
377 zmax = fmax(a.center.z + extents_a.z, b.center.z + extents_b.z);
378
379 return VuoBox_makeWithPoints( xmin, xmax, ymin, ymax, zmin, zmax );
380}
381
385static inline VuoBoolean VuoBox_contains(VuoBox aabb, VuoPoint3d point)
386{
387 VuoPoint3d exents = (VuoPoint3d){aabb.size.x / 2.f, aabb.size.y / 2.f};
388 VuoPoint3d min = aabb.center - exents;
389 VuoPoint3d max = aabb.center + exents;
390
391 return point.x > min.x && point.x < max.x &&
392 point.y > min.y && point.y < max.y &&
393 point.z > min.z && point.z < max.z;
394}
395
400{
401 VuoPoint3d dist = VuoPoint3d_subtract(a.center, b.center);
402 VuoPoint3d size = VuoPoint3d_add(a.size, b.size);
403
404 return fabs(dist.x) * 2 < size.x &&
405 fabs(dist.y) * 2 < size.y &&
406 fabs(dist.z) * 2 < size.z;
407}
408
413#ifdef __cplusplus
414}
415#endif
416
417#endif