3DCoat Core API
The 3DCoat API documentation.
Loading...
Searching...
No Matches
cVec4.h
1#pragma once
2
3template<class Type, int Dim>
4struct cVec;
5
9class APICALL cVec4 {
10public:
11 float x;
12 float y;
13 float z;
14 float w;
15
16 cVec4();
17 explicit cVec4(const float S);
18 cVec4(const float X, const float Y, const float Z, const float W);
19 cVec4(const cVec2 &XY, const float Z, const float W);
20 cVec4(const cVec2 &XY, const cVec2 &ZW);
21 cVec4(const cVec3 &XYZ, const float W);
22 cVec4(const cVec4& v) :x(v.x), y(v.y), z(v.z), w(v.w) {}
23
24 void SetZero();
25 void Set(const float S);
26 void Set(const float X, const float Y, const float Z, const float W);
27 void Set(const cVec2 &XY, const float Z, const float W);
28 void Set(const cVec2 &XY, const cVec2 &ZW);
29 void Set(const cVec3 &XYZ, const float W);
30
31 void Copy(const float *pSrc);
32
33 float & operator [] (const int index);
34 float operator [] (const int index) const;
35
36 const cVec4 operator - () const;
37
38 cVec4& operator += (const cVec4 &);
39 cVec4& operator -= (const cVec4 &);
40 cVec4& operator *= (const cVec4 &);
41 cVec4& operator *= (const float);
42 cVec4& operator /= (const cVec4 &);
43 cVec4& operator /= (const float);
44
45 void Transform(const cMat4 &);
46 void operator *= (const cMat4 &);
47
48 const cVec4 & operator = (const cVec3 &);
49 const cVec4 operator + (const cVec4 &) const;
50 const cVec4 operator - (const cVec4 &) const;
51 const cVec4 operator * (const cVec4 &) const;
52 const cVec4 operator * (const float) const;
53 friend const cVec4 operator * (const float, const cVec4 &);
54 const cVec4 operator / (const cVec4 &) const;
55 const cVec4 operator / (const float) const;
56 friend const cVec4 operator / (const float, const cVec4 &);
57
58 static const cVec4 Transform(const cVec4 &, const cMat4 &);
59 const cVec4 operator * (const cMat4 &) const;
60
61 bool operator == (const cVec4 &) const;
62 bool operator != (const cVec4 &) const;
63 static bool Equals(const cVec4 &, const cVec4 &, const float Eps = cMath::Epsilon);
64
65 float Length() const;
66 float LengthSq() const;
67 float Normalize();
68 float NormalizeSafe(const cVec4 &Fallback = cVec4::AxisW);
69 bool IsNormalized(const float Eps = cMath::Epsilon) const;
70 bool IsZero(const float Eps = cMath::Epsilon) const;
71
72 static const cVec4 Abs(const cVec4 &);
73 static float Dot(const cVec4 &, const cVec4 &);
74// static cVec4 BaryCentric(const cVec4 &, const cVec4 &, const cVec4 &, const float, const float);
75// static cVec4 Clamp(const cVec4 &, const cVec4 &, const cVec4 &);
76// static cVec4 Cross(const cVec4 &, const cVec4 &, const cVec4 &);
77 static float Length(const cVec4 &);
78 static float LengthSq(const cVec4 &);
79 static const cVec4 Lerp(const cVec4 &, const cVec4 &, const float);
80 static const cVec4 Max(const cVec4 &, const cVec4 &);
81 static const cVec4 Min(const cVec4 &, const cVec4 &);
82 static const cVec4 Normalize(const cVec4 &);
83
84 std::tuple<float, float, float, float> __getstate__();
85 void __setstate__(const std::tuple<float, float, float, float>& state);
86 const std::string __repr__() const;
87
88 static const cVec4 Zero;
89 static const cVec4 One;
90 static const cVec4 Infinity;
91 static const cVec4 AxisX;
92 static const cVec4 AxisY;
93 static const cVec4 AxisZ;
94 static const cVec4 AxisW;
95 static const cVec4 AxisNegX;
96 static const cVec4 AxisNegY;
97 static const cVec4 AxisNegZ;
98 static const cVec4 AxisNegW;
99
100 const float * ToFloatPtr() const;
101 float * ToFloatPtr();
102
103 const cVec2 & ToVec2() const;
104 cVec2 & ToVec2();
105
106 const cVec3 & ToVec3() const;
107 cVec3 & ToVec3();
108
109 template<class Type>
110 operator cVec<Type, 4>() const;
111
112 int GetDimension() const;
113 const cStr ToString(const int Prec = 2) const;
114
116 // for compatibility with OpenSubdiv ////
117 inline void Clear(void* = 0) {
118 x = y = z = w = 0.0f;
119 }
120 inline void AddWithWeight(cVec4 const& src, float weight) {
121 x += weight * src.x;
122 y += weight * src.y;
123 z += weight * src.z;
124 w += weight * src.w;
125 }
126 inline void SetPosition(float aX, float aY, float aZ, float aW) {
127 x = aX;
128 y = aY;
129 z = aZ;
130 w = aW;
131 }
132 inline const float* GetPosition() const {
133 return &x;
134 }
135 // for compatibility with OpenSubdiv //
137
138};
139
140// cVec4.ctor : ()
141inline cVec4::cVec4() {
142}
143
144// cVec4.ctor : (const float)
145inline cVec4::cVec4(const float S)
146: x(S), y(S), z(S), w(S) {}
147
148// cVec4.ctor : (const float, const float, const float, const float)
149inline cVec4::cVec4(const float X, const float Y, const float Z, const float W)
150: x(X), y(Y), z(Z), w(W) {}
151
152// cVec4.ctor : (const cVec2 &, const float, const float)
153inline cVec4::cVec4(const cVec2 &XY, const float Z, const float W)
154: x(XY.x), y(XY.y), z(Z), w(W) {}
155
156// cVec4.ctor : (const cVec2 &, const cVec2 &)
157inline cVec4::cVec4(const cVec2 &XY, const cVec2 &ZW)
158: x(XY.x), y(XY.y), z(ZW.x), w(ZW.y) {}
159
160// cVec4.ctor : (const cVec3 &, const float)
161inline cVec4::cVec4(const cVec3 &XYZ, const float W)
162: x(XYZ.x), y(XYZ.y), z(XYZ.z), w(W) {}
163
164// cVec4::SetZero : void ()
165inline void cVec4::SetZero() {
166 x = y = z = w = 0.0f;
167}
168
169// cVec4::Set : void (const float)
170inline void cVec4::Set(const float S) {
171 x = y = z = w = S;
172}
173
174// cVec4::Set : void (const float, const float, const float, const float)
175inline void cVec4::Set(const float X, const float Y, const float Z, const float W) {
176 x = X;
177 y = Y;
178 z = Z;
179 w = W;
180}
181
182// cVec4::Set : void (const cVec2 &, const float, const float)
183inline void cVec4::Set(const cVec2 &XY, const float Z, const float W) {
184 x = XY.x;
185 y = XY.y;
186 z = Z;
187 w = W;
188}
189
190// cVec4::Set : (const cVec2 &, const cVec2 &)
191inline void cVec4::Set(const cVec2 &XY, const cVec2 &ZW) {
192 x = XY.x;
193 y = XY.y;
194 z = ZW.x;
195 w = ZW.y;
196}
197
198// cVec4::Set : void (const cVec3 &, const float)
199inline void cVec4::Set(const cVec3 &XYZ, const float W) {
200 x = XYZ.x;
201 y = XYZ.y;
202 z = XYZ.z;
203 w = W;
204}
205
206// cVec4::Copy : void (const float *)
207inline void cVec4::Copy(const float *pSrc) {
208 cAssert(pSrc);
209 x = pSrc[0];
210 y = pSrc[1];
211 z = pSrc[2];
212 w = pSrc[3];
213}
214
215// cVec4::operator [] : float & (const int)
216inline float & cVec4::operator [] (const int index) {
217 cAssert(index >= 0 && index < 4);
218 return (&x)[index];
219}
220
221// cVec4::operator [] : float (const int) const
222inline float cVec4::operator [] (const int index) const {
223 cAssert(index >= 0 && index < 4);
224 return (&x)[index];
225}
226
227// cVec4::operator - : const cVec4 () const
228inline const cVec4 cVec4::operator - () const {
229 return cVec4(-x, -y, -z, -w);
230}
231
232// cVec4::operator += : void (const cVec4 &)
233inline cVec4& cVec4::operator += (const cVec4 &u) {
234 x += u.x;
235 y += u.y;
236 z += u.z;
237 w += u.w;
238 return *this;
239}
240
241// cVec4::operator -= : void (const cVec4 &)
242inline cVec4& cVec4::operator -= (const cVec4 &u) {
243 x -= u.x;
244 y -= u.y;
245 z -= u.z;
246 w -= u.w;
247 return *this;
248}
249
250// cVec4::operator *= : void (const cVec4 &)
251inline cVec4& cVec4::operator *= (const cVec4 &u) {
252 x *= u.x;
253 y *= u.y;
254 z *= u.z;
255 w *= u.w;
256 return *this;
257}
258
259// cVec4::operator *= : void (const float)
260inline cVec4& cVec4::operator *= (const float s) {
261 x *= s;
262 y *= s;
263 z *= s;
264 w *= s;
265 return *this;
266}
267
268// cVec4::operator /= : void (const cVec4 &)
269inline cVec4& cVec4::operator /= (const cVec4 &u) {
270 x /= u.x;
271 y /= u.y;
272 z /= u.z;
273 w /= u.w;
274 return *this;
275}
276
277// cVec4::operator /= : void (const float)
278inline cVec4& cVec4::operator /= (const float s) {
279 float is = 1.0f / s;
280 x *= is;
281 y *= is;
282 z *= is;
283 w *= is;
284 return *this;
285}
286
287// cVec4::operator + : const cVec4 (const cVec4 &) const
288inline const cVec4 cVec4::operator + (const cVec4 &u) const {
289 return cVec4(x + u.x, y + u.y, z + u.z, w + u.w);
290}
291
292// cVec4::operator - : const cVec4 (const cVec4 &) const
293inline const cVec4 cVec4::operator - (const cVec4 &u) const {
294 return cVec4(x - u.x, y - u.y, z - u.z, w - u.w);
295}
296
297// cVec4::operator * : const cVec4 (const cVec4 &) const
298inline const cVec4 cVec4::operator * (const cVec4 &u) const {
299 return cVec4(x * u.x, y * u.y, z * u.z, w * u.w);
300}
301
302// cVec4::operator * : const cVec4 (const float) const
303inline const cVec4 cVec4::operator * (const float s) const {
304 return cVec4(x * s, y * s, z * s, w * s);
305}
306
307// cVec4::friend operator * : const cVec4 (const float, const cVec4 &)
308inline const cVec4 operator * (const float s, const cVec4 &u) {
309 return cVec4(s * u.x, s * u.y, s * u.z, s * u.w);
310}
311
312// cVec4::operator / : const cVec4 (const cVec4 &) const
313inline const cVec4 cVec4::operator / (const cVec4 &u) const {
314 return cVec4(x / u.x, y / u.y, z / u.z, w / u.w);
315}
316
317// cVec4::operator / : const cVec4 (const float) const
318inline const cVec4 cVec4::operator / (const float s) const {
319 float is = 1.0f / s;
320 return cVec4(x * is, y * is, z * is, w * is);
321}
322
323// cVec4::friend operator / : const cVec4 (const float, const cVec4 &)
324inline const cVec4 operator / (const float s, const cVec4 &u) {
325 return cVec4(s / u.x, s / u.y, s / u.z, s / u.w);
326}
327
328// cVec4::operator == : bool (const cVec4 &) const
329inline bool cVec4::operator == (const cVec4 &u) const {
330 return x == u.x && y == u.y && z == u.z && w == u.w;
331}
332
333// cVec4::operator != : bool (const cVec4 &) const
334inline bool cVec4::operator != (const cVec4 &u) const {
335 return x != u.x || y != u.y || z != u.z || w != u.w;
336}
337
338// cVec4::Equals : bool (const cVec4 &, const cVec4 &, const float)
339inline bool cVec4::Equals(const cVec4 &u, const cVec4 &v, const float Eps /*= cMath::Epsilon*/) {
340 if(cMath::Abs(u.x - v.x) > Eps) {
341 return false;
342 }
343 if(cMath::Abs(u.y - v.y) > Eps) {
344 return false;
345 }
346 if(cMath::Abs(u.z - v.z) > Eps) {
347 return false;
348 }
349 if(cMath::Abs(u.w - v.w) > Eps) {
350 return false;
351 }
352 return true;
353}
354
355// cVec4::Length : float () const
356inline float cVec4::Length() const {
357 return sqrtf(x * x + y * y + z * z + w * w);
358}
359
360// cVec4::LengthSq : float () const
361inline float cVec4::LengthSq() const {
362 return x * x + y * y + z * z + w * w;
363}
364
365// cVec4::Normalize : float ()
366inline float cVec4::Normalize() {
367 const float l = Length();
368 if(l > 0.0f) {
369 (*this) /= l;
370 }
371 return l;
372}
373
374// cVec4::NormalizeSafe : float (const cVec4 &)
375inline float cVec4::NormalizeSafe(const cVec4 &Fallback /*= cVec4::wAxis*/) {
376 const float l = Length();
377 if(l < cMath::Epsilon) {
378 *this = Fallback;
379 cAssert(IsNormalized());
380 return 0.0f;
381 } else {
382 (*this) /= l;
383 cAssert(IsNormalized());
384 return l;
385 }
386}
387
388// cVec4::IsNormalized : bool (const float) const
389inline bool cVec4::IsNormalized(const float Eps) const {
390 return cMath::IsOne(LengthSq(), Eps);
391}
392
393// cVec4::IsZero : bool(const float) const
394inline bool cVec4::IsZero(const float Eps) const {
395 if(!cMath::IsZero(x, Eps)) {
396 return false;
397 }
398 if(!cMath::IsZero(y, Eps)) {
399 return false;
400 }
401 if(!cMath::IsZero(z, Eps)) {
402 return false;
403 }
404 if(!cMath::IsZero(w, Eps)) {
405 return false;
406 }
407 return true;
408}
409
410// cVec4::Abs : const cVec4 (const cVec4 &)
411inline const cVec4 cVec4::Abs(const cVec4 &u) {
412 return cVec4(cMath::Abs(u.x), cMath::Abs(u.y), cMath::Abs(u.z), cMath::Abs(u.w));
413}
414
415// cVec4::Dot : float (const cVec4 &, const cVec4 &)
416inline float cVec4::Dot(const cVec4 &u, const cVec4 &v) {
417 return u.x * v.x + u.y * v.y + u.z * v.z + u.w * v.w;
418}
419
420// cVec4::Length : float (const cVec4 &)
421inline float cVec4::Length(const cVec4 &u) {
422 return cMath::Sqrt(u.x * u.x + u.y * u.y + u.z * u.z + u.w * u.w);
423}
424
425// cVec4::LengthSq : float (const cVec4 &)
426inline float cVec4::LengthSq(const cVec4 &u) {
427 return u.x * u.x + u.y * u.y + u.z * u.z + u.w * u.w;
428}
429
430// cVec4::Lerp : const cVec4 (const cVec4 &, const cVec4 &, const float)
431inline const cVec4 cVec4::Lerp(const cVec4 &u, const cVec4 &v, const float s) {
432 cVec4 r;
433 r.x = u.x + s * (v.x - u.x);
434 r.y = u.y + s * (v.y - u.y);
435 r.z = u.z + s * (v.z - u.z);
436 r.w = u.w + s * (v.w - u.w);
437 return r;
438}
439
440// cVec4::Max : const cVec4 (const cVec4 &, const cVec4 &)
441inline const cVec4 cVec4::Max(const cVec4 &u, const cVec4 &v) {
442 cVec4 r;
443 r.x = u.x > v.x ? u.x : v.x;
444 r.y = u.y > v.y ? u.y : v.y;
445 r.z = u.z > v.z ? u.z : v.z;
446 r.w = u.w > v.w ? u.w : v.w;
447 return r;
448}
449
450// cVec4::Min : const cVec4 (const cVec4 &, const cVec4 &)
451inline const cVec4 cVec4::Min(const cVec4 &u, const cVec4 &v) {
452 cVec4 r;
453 r.x = u.x < v.x ? u.x : v.x;
454 r.y = u.y < v.y ? u.y : v.y;
455 r.z = u.z < v.z ? u.z : v.z;
456 r.w = u.w < v.w ? u.w : v.w;
457 return r;
458}
459
460// cVec4::Normalize : const cVec4 (const cVec4 &)
461inline const cVec4 cVec4::Normalize(const cVec4 &u) {
462 const float l = cMath::Sqrt(u.x * u.x + u.y * u.y + u.z * u.z + u.w * u.w);
463 if(l > 0.0f) {
464 const float il = 1.0f / l;
465 return cVec4(u.x * il, u.y * il, u.z * il, u.w * il);
466 }
467 return u;
468}
469
470inline std::tuple<float, float, float, float> cVec4::__getstate__() {
471 return std::make_tuple(x, y, z, w);
472}
473
474inline void cVec4::__setstate__(const std::tuple<float, float, float, float>& state) {
475 x = std::get<0>(state);
476 y = std::get<1>(state);
477 z = std::get<2>(state);
478 w = std::get<3>(state);
479}
480
481// cVec4::ToFloatPtr : const float * () const
482inline const float * cVec4::ToFloatPtr() const {
483 return (const float *)&x;
484}
485
486// cVec4::ToFloatPtr : float * ()
487inline float * cVec4::ToFloatPtr() {
488 return (float *)&x;
489}
490
491// cVec4::ToVec2 : const cVec2 & () const
492inline const cVec2 & cVec4::ToVec2() const {
493 return *reinterpret_cast<const cVec2 *>(this);
494}
495
496// cVec4::ToVec2 : cVec2 & ()
497inline cVec2 & cVec4::ToVec2() {
498 return *reinterpret_cast<cVec2 *>(this);
499}
500
501// cVec4::ToVec3 : const cVec3 & () const
502inline const cVec3 & cVec4::ToVec3() const {
503 return *reinterpret_cast<const cVec3 *>(this);
504}
505
506// cVec4::ToVec3 : cVec3 & ()
507inline cVec3 & cVec4::ToVec3() {
508 return *reinterpret_cast<cVec3 *>(this);
509}
510
511// cVec3::operator cVec<Type, 4>
512template<class Type>
513cVec4::operator cVec<Type, 4>() const {
514 return cVec<Type, 4>( ( Type )x, ( Type )y, ( Type )z, ( Type )w );
515}
516
517// cVec4::GetDimension : int() const
518inline int cVec4::GetDimension() const {
519 return 4;
520}
The 4D-matrix, refer it as coat::mat4 in the Core API.
Definition cMat4.h:6
Definition cStr.h:6
The 2D-vector, refer it as coat::vec2 in the Core API.
Definition cVec2.h:9
The 3D-vector, refer it as coat::vec3 in the Core API.
Definition cVec3.h:10
The 4D-vector, refer it as coat::vec4 in the Core API.
Definition cVec4.h:9