HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GEO_ImplicitBasicSurfaces.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: GEO_ImplicitBasicSurfaces.h
7  *
8  * COMMENTS: C++ implementations of basic implicit surface SDFs.
9  */
10 
11 #pragma once
12 
13 #ifndef __GEO_ImplicitBasicSurfaces_h__
14 #define __GEO_ImplicitBasicSurfaces_h__
15 
16 #include <VEX/VEX_PodTypes.h>
17 #include <UT/UT_BoundingBox.h>
18 #include <UT/UT_Interval.h>
19 
20 //////////////////////////////////////////////////////////////////////////////
21 // GEO_ImplicitBox
22 //////////////////////////////////////////////////////////////////////////////
23 
24 template <VEX_Precision PREC>
26 {
27 public:
28  VEXvec3<PREC> size = {1, 1, 1};
29  bool invert = false;
30 
31  GEO_ImplicitBox(const VEXvec3<PREC> &size, bool invert = false)
32  : size(size), invert(invert) {}
33 
34  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXvec3<PREC> *size_grad) const;
35 
38  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXvec3<PREC> &size_grad) const;
41 };
42 
43 //////////////////////////////////////////////////////////////////////////////
44 // GEO_ImplicitRoundedBox
45 //////////////////////////////////////////////////////////////////////////////
46 
47 template <VEX_Precision PREC>
49 {
50 public:
51  VEXvec3<PREC> size = {1, 1, 1};
53  bool invert = false;
54 
56  : size(size), radius(radius), invert(invert) {}
57 
58  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXvec3<PREC> *size_grad, VEXfloat<PREC> *radius_grad) const;
59 
62  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXvec3<PREC> &size_grad, VEXfloat<PREC> &radius_grad) const;
65 };
66 
67 //////////////////////////////////////////////////////////////////////////////
68 // GEO_ImplicitPlane
69 //////////////////////////////////////////////////////////////////////////////
70 
71 template <VEX_Precision PREC>
73 {
74 public:
75  bool invert = false;
76 
77  GEO_ImplicitPlane(bool invert = false) : invert(invert) {}
78 
79  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad) const;
80 
85 };
86 
87 //////////////////////////////////////////////////////////////////////////////
88 // GEO_ImplicitBall
89 //////////////////////////////////////////////////////////////////////////////
90 
91 template <VEX_Precision PREC>
93 {
94 public:
96  bool invert = false;
97 
99  : radius(radius), invert(invert) {}
100 
101  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXfloat<PREC> *radius_grad) const;
102 
103  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
105  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXfloat<PREC> &radius_grad) const;
108 };
109 
110 //////////////////////////////////////////////////////////////////////////////
111 // GEO_ImplicitTorus
112 //////////////////////////////////////////////////////////////////////////////
113 
114 template <VEX_Precision PREC>
116 {
117 public:
118  VEXfloat<PREC> ra = 1; // major radius
119  VEXfloat<PREC> rb = 0.25; // minor radius
120  bool invert = false;
121 
123  : ra(ra), rb(rb), invert(invert) {}
124 
125  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXfloat<PREC> *ra_grad, VEXfloat<PREC> *rb_grad) const;
126 
127  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
129  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXfloat<PREC> &ra_grad, VEXfloat<PREC> &rb_grad) const;
132 };
133 
134 //////////////////////////////////////////////////////////////////////////////
135 // GEO_ImplicitSegment (capsule with uniform radius)
136 //////////////////////////////////////////////////////////////////////////////
137 
138 template <VEX_Precision PREC>
140 {
141 public:
144  bool invert = false;
145 
147  : height(height), radius(radius), invert(invert) {}
148 
149  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXfloat<PREC> *height_grad, VEXfloat<PREC> *radius_grad) const;
150 
151  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
153  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXfloat<PREC> &height_grad, VEXfloat<PREC> &radius_grad) const;
156 };
157 
158 //////////////////////////////////////////////////////////////////////////////
159 // GEO_ImplicitEllipsoid (approximate SDF)
160 //////////////////////////////////////////////////////////////////////////////
161 
162 template <VEX_Precision PREC>
164 {
165 public:
166  VEXvec3<PREC> radii = {1, 1, 1};
167  bool invert = false;
168 
170  : radii(radii), invert(invert) {}
171 
172  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXvec3<PREC> *radii_grad) const;
173 
174  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
176  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXvec3<PREC> &radii_grad) const;
179 };
180 
181 //////////////////////////////////////////////////////////////////////////////
182 // GEO_ImplicitLink (chain link shape)
183 //////////////////////////////////////////////////////////////////////////////
184 
185 template <VEX_Precision PREC>
187 {
188 public:
189  VEXfloat<PREC> length = 0.5; // half-length along y
190  VEXfloat<PREC> r1 = 0.5; // major radius (torus radius)
191  VEXfloat<PREC> r2 = 0.1; // minor radius (tube radius)
192  bool invert = false;
193 
195  : length(length), r1(r1), r2(r2), invert(invert) {}
196 
198  VEXfloat<PREC> *length_grad, VEXfloat<PREC> *r1_grad, VEXfloat<PREC> *r2_grad) const;
199 
200  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
203  VEXfloat<PREC> &length_grad, VEXfloat<PREC> &r1_grad, VEXfloat<PREC> &r2_grad) const;
206 };
207 
208 //////////////////////////////////////////////////////////////////////////////
209 // GEO_ImplicitCapsule (rounded cone with varying radii)
210 //////////////////////////////////////////////////////////////////////////////
211 
212 template <VEX_Precision PREC>
214 {
215 public:
216  VEXfloat<PREC> height = 1; // total height, sphere centers at y = ±height/2
217  VEXfloat<PREC> r1 = 0.5; // radius at +y end (sphere b)
218  VEXfloat<PREC> r2 = 0.25; // radius at -y end (sphere a)
219  bool invert = false;
220 
222  : height(height), r1(r1), r2(r2), invert(invert) {}
223 
225  VEXfloat<PREC> *height_grad, VEXfloat<PREC> *r1_grad, VEXfloat<PREC> *r2_grad) const;
226 
227  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
230  VEXfloat<PREC> &height_grad, VEXfloat<PREC> &r1_grad, VEXfloat<PREC> &r2_grad) const;
233 };
234 
235 //////////////////////////////////////////////////////////////////////////////
236 // GEO_ImplicitCylinder
237 //////////////////////////////////////////////////////////////////////////////
238 
239 template <VEX_Precision PREC>
241 {
242 public:
245  bool invert = false;
246 
248  : height(height), radius(radius), invert(invert) {}
249 
250  VEXfloat<PREC> eval(const VEXvec3<PREC> p, VEXvec3<PREC> *grad, VEXfloat<PREC> *height_grad, VEXfloat<PREC> *radius_grad) const;
251 
252  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
254  VEXfloat<PREC> operator()(const VEXvec3<PREC> p, VEXvec3<PREC> &grad, VEXfloat<PREC> &height_grad, VEXfloat<PREC> &radius_grad) const;
257 };
258 
259 //////////////////////////////////////////////////////////////////////////////
260 // GEO_ImplicitCappedCone (cone with independent top/bottom radii)
261 //////////////////////////////////////////////////////////////////////////////
262 
263 template <VEX_Precision PREC>
265 {
266 public:
267  VEXfloat<PREC> height = 1; // total height, endpoints at y = ±height/2
268  VEXfloat<PREC> r1 = 0.5; // radius at +y end (top)
269  VEXfloat<PREC> r2 = 0.25; // radius at -y end (bottom)
270  bool invert = false;
271 
273  : height(height), r1(r1), r2(r2), invert(invert) {}
274 
276  VEXfloat<PREC> *height_grad, VEXfloat<PREC> *r1_grad, VEXfloat<PREC> *r2_grad) const;
277 
278  VEXfloat<PREC> operator()(const VEXvec3<PREC> p) const;
281  VEXfloat<PREC> &height_grad, VEXfloat<PREC> &r1_grad, VEXfloat<PREC> &r2_grad) const;
284 };
285 
286 #endif // __GEO_ImplicitBasicSurfaces_h__
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXfloat< PREC > *height_grad, VEXfloat< PREC > *r1_grad, VEXfloat< PREC > *r2_grad) const
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXfloat< PREC > *height_grad, VEXfloat< PREC > *radius_grad) const
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXfloat< PREC > *height_grad, VEXfloat< PREC > *r1_grad, VEXfloat< PREC > *r2_grad) const
Axis-aligned bounding box (AABB).
Definition: GEO_Detail.h:41
GLboolean invert
Definition: glcorearb.h:549
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXfloat< PREC > *ra_grad, VEXfloat< PREC > *rb_grad) const
GEO_ImplicitCylinder(VEXfloat< PREC > height, VEXfloat< PREC > radius, bool invert=false)
GLuint GLsizei GLsizei * length
Definition: glcorearb.h:795
GEO_ImplicitEllipsoid(const VEXvec3< PREC > &radii, bool invert=false)
GEO_ImplicitTorus(VEXfloat< PREC > ra, VEXfloat< PREC > rb, bool invert=false)
typename VEX_PrecisionResolver< P >::vec3_type VEXvec3
Definition: VEX_PodTypes.h:70
GEO_ImplicitBox(const VEXvec3< PREC > &size, bool invert=false)
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXfloat< PREC > *radius_grad) const
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXvec3< PREC > *size_grad) const
GEO_ImplicitPlane(bool invert=false)
GLint GLsizei GLsizei height
Definition: glcorearb.h:103
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad) const
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXvec3< PREC > *radii_grad) const
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXvec3< PREC > *size_grad, VEXfloat< PREC > *radius_grad) const
GEO_ImplicitCapsule(VEXfloat< PREC > height, VEXfloat< PREC > r1, VEXfloat< PREC > r2, bool invert=false)
typename VEX_PrecisionResolver< P >::float_type VEXfloat
Definition: VEX_PodTypes.h:67
VEXfloat< PREC > eval(const VEXvec3< PREC > p, VEXvec3< PREC > *grad, VEXfloat< PREC > *height_grad, VEXfloat< PREC > *radius_grad) const
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
GLsizeiptr size
Definition: glcorearb.h:664
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
GEO_ImplicitSegment(VEXfloat< PREC > height, VEXfloat< PREC > radius, bool invert=false)
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const
GEO_ImplicitRoundedBox(const VEXvec3< PREC > &size, VEXfloat< PREC > radius, bool invert=false)
GEO_ImplicitBall(VEXfloat< PREC > radius, bool invert=false)
GEO_ImplicitCappedCone(VEXfloat< PREC > height, VEXfloat< PREC > r1, VEXfloat< PREC > r2, bool invert=false)
VEXfloat< PREC > operator()(const VEXvec3< PREC > p) const