AGX Dynamics 2.40.0.0
Loading...
Searching...
No Matches
Vec4Template.h
Go to the documentation of this file.
1/*
2Copyright 2007-2025. Algoryx Simulation AB.
3
4All AGX source code, intellectual property, documentation, sample code,
5tutorials, scene files and technical white papers, are copyrighted, proprietary
6and confidential material of Algoryx Simulation AB. You may not download, read,
7store, distribute, publish, copy or otherwise disseminate, use or expose this
8material unless having a written signed agreement with Algoryx Simulation AB, or having been
9advised so by Algoryx Simulation AB for a time limited evaluation, or having purchased a
10valid commercial license from Algoryx Simulation AB.
11
12Algoryx Simulation AB disclaims all responsibilities for loss or damage caused
13from using this software, unless otherwise stated in written agreements with
14Algoryx Simulation AB.
15*/
16
17#ifndef AGX_VEC4_TEMPLATE_H
18#define AGX_VEC4_TEMPLATE_H
19
21
22#include <iosfwd>
23
24#include <agx/agx.h>
25#include <agx/Vec3.h>
26#include <agx/Math.h>
27
28namespace agx
29{
33 template <typename T>
34 class Vec4T
35 {
36 public:
37 typedef T Type;
38
39 public:
40
42 Vec4T(const Vec4T& copy ) = default;
43
45 template<typename T2>
46 explicit Vec4T(const Vec4T<T2>& copy );
47
51 Vec4T();
52
54 explicit Vec4T( T r );
55
57 Vec4T( T x, T y, T z, T w );
58
60 explicit Vec4T(const T v[4] );
61
63 Vec4T( const Vec3T<T>& v3, T w );
64
66 static Vec4T random(T min, T max);
67
69 static Vec4T random(const Vec4T& min, const Vec4T& max);
70
74 bool operator == ( const Vec4T& v ) const;
75
79 bool operator != ( const Vec4T& v ) const;
80
84 static Vec4T componentMin(const Vec4T& v1, const Vec4T& v2);
85
89 static Vec4T componentMax(const Vec4T& v1, const Vec4T& v2);
90
94 T minComponent() const;
95
99 T maxComponent() const;
100
104 size_t minElement() const;
105
109 size_t maxElement() const;
110
114 void clamp(const Vec4T& min, const Vec4T& max);
115
119 bool equalsZero() const;
120
124 T* ptr();
125
129 const T* ptr() const;
130
132 void set( T x, T y, T z, T w );
133
135 void set( T value );
136
138 void set( const Vec4T& rhs );
139
141 T& operator [] ( size_t i );
142
144 const T& operator [] ( size_t i ) const;
145
147 T& x();
148
150 T& y();
151
153 T& z();
154
156 T& w();
157
159 T x() const;
160
162 T y() const;
163
165 T z() const;
166
168 T w() const;
169
171 bool isValid() const;
172
174 bool isNaN() const;
175
177 bool isFinite() const;
178
182 T operator * ( const Vec4T& rhs ) const;
183
187 const Vec4T operator | ( const Vec4T& rhs ) const;
188
192 const Vec4T operator * ( T rhs ) const;
193
197 Vec4T& operator *= ( T rhs );
198
202 const Vec4T operator / ( T rhs ) const;
203
207 Vec4T& operator /= ( T rhs );
208
213 const Vec4T operator + ( const Vec4T& rhs ) const;
214
219 Vec4T& operator += ( const Vec4T& rhs );
220
224 const Vec4T operator - ( const Vec4T& rhs ) const;
225
229 Vec4T& operator -= ( const Vec4T& rhs );
230
234 const Vec4T operator + ( const T& rhs ) const;
235
240 Vec4T& operator += ( const T& rhs );
241
245 const Vec4T operator - ( const T& rhs ) const;
246
250 Vec4T& operator -= ( const T& rhs );
251
255 const Vec4T operator - () const;
256
260 Real length() const;
261
265 Real length2() const;
266
270 Real distance2(const Vec4T& v2) const;
271
275 Real distance(const Vec4T& v2) const;
276
281 Real normalize();
282
286 Vec3T< T > asVec3() const;
287
288 private:
289 T m_data[4];
290 }; // end of class Vec4T_template
291
292
293 /* Implementation */
294
295
296 template <typename T>
297 template<typename T2>
299 {
300 //memcpy(&m_data, copy.m_data, sizeof(agx::Real)*3);
301 m_data[ 0 ] = (T)copy[ 0 ];
302 m_data[ 1 ] = (T)copy[ 1 ];
303 m_data[ 2 ] = (T)copy[ 2 ];
304 m_data[ 3 ] = (T)copy[ 3 ];
305 }
306
307
308 template <typename T>
310 {
311 m_data[0] = T();
312 m_data[1] = T();
313 m_data[2] = T();
314 m_data[3] = T();
315 }
316
317 template <typename T>
319 {
320 m_data[0] = m_data[1] = m_data[2] = m_data[3] = r;
321 }
322
323 template <typename T>
324 AGX_FORCE_INLINE Vec4T<T>::Vec4T( T x, T y, T z, T w )
325 {
326 m_data[0] = x;
327 m_data[1] = y;
328 m_data[2] = z;
329 m_data[3] = w;
330 }
331
332 template <typename T>
334 {
335 m_data[0] = v[0];
336 m_data[1] = v[1];
337 m_data[2] = v[2];
338 m_data[3] = v[3];
339 }
340
341 template <typename T>
343 {
344 m_data[0] = T(v3[0]);
345 m_data[1] = T(v3[1]);
346 m_data[2] = T(v3[2]);
347 m_data[3] = w;
348 }
349
350
351 template <typename T>
353 {
354 return m_data[0] == v.m_data[0] && m_data[1] == v.m_data[1] && m_data[2] == v.m_data[2] && m_data[3] == v.m_data[3];
355 }
356
357 template <typename T>
359 {
360 return m_data[0] != v.m_data[0] || m_data[1] != v.m_data[1] || m_data[2] != v.m_data[2] || m_data[3] != v.m_data[3];
361 }
362
363
364 template <typename T>
366 {
367 return Vec4T(std::min(v1[0], v2[0]), std::min(v1[1], v2[1]), std::min(v1[2], v2[2]), std::min(v1[3], v2[3]));
368 }
369
370 template <typename T>
372 {
373 return Vec4T(std::max(v1[0], v2[0]), std::max(v1[1], v2[1]), std::max(v1[2], v2[2]), std::max(v1[3], v2[3]));
374 }
375
376 template <typename T>
378 {
379 return std::min(std::min(std::min(m_data[0], m_data[1]), m_data[2]), m_data[3]);
380 }
381
382 template <typename T>
384 {
385 return std::max(std::max(std::max(m_data[0], m_data[1]), m_data[2]), m_data[3]);
386 }
387
388 template <typename T>
390 {
391 T m = std::numeric_limits<T>::infinity();
392 size_t idx = 0;
393 for(size_t i = 0; i < 4; i++) {
394 T a = agx::absolute(m_data[i]);
395 if ( a < m) {
396 idx = i;
397 m = a;
398 }
399 }
400 return idx;
401 }
402
403 template <typename T>
405 {
406 T m = 0;
407 size_t idx = 0;
408 for(size_t i = 0; i < 4; i++) {
409 T a = agx::absolute(m_data[i]);
410 if ( a > m) {
411 idx = i;
412 m = a;
413 }
414 }
415 return idx;
416 }
417
418 template <typename T>
420 {
421 m_data[0] = agx::clamp( m_data[0], min.m_data[0], max.m_data[0] );
422 m_data[1] = agx::clamp( m_data[1], min.m_data[1], max.m_data[1] );
423 m_data[2] = agx::clamp( m_data[2], min.m_data[2], max.m_data[2] );
424 m_data[3] = agx::clamp( m_data[3], min.m_data[3], max.m_data[3] );
425 }
426
427
428 template <typename T>
430 {
431 return (agx::equalsZero(m_data[0]) && agx::equalsZero(m_data[1]) && agx::equalsZero(m_data[2]) && agx::equalsZero(m_data[3]));
432 }
433
434
435 template <typename T>
437 {
438 return m_data;
439 }
440
441 template <typename T>
443 {
444 return m_data;
445 }
446
447 template <typename T>
448 AGX_FORCE_INLINE void Vec4T<T>::set( T x, T y, T z, T w )
449 {
450 m_data[0] = x;
451 m_data[1] = y;
452 m_data[2] = z;
453 m_data[3] = w;
454 }
455
456 template <typename T>
458 {
459 m_data[0] = m_data[1] = m_data[2] = m_data[3] = value;
460 }
461
462 template <typename T>
464 {
465 m_data[0] = rhs.m_data[0];
466 m_data[1] = rhs.m_data[1];
467 m_data[2] = rhs.m_data[2];
468 m_data[3] = rhs.m_data[3];
469 }
470
471 template <typename T>
473 {
474 return m_data[i];
475 }
476
477 template <typename T>
478 AGX_FORCE_INLINE const T& Vec4T<T>::operator [] ( size_t i ) const
479 {
480 return m_data[i];
481 }
482
483 template <typename T>
485 {
486 return m_data[0];
487 }
488
489 template <typename T>
491 {
492 return m_data[1];
493 }
494
495 template <typename T>
497 {
498 return m_data[2];
499 }
500
501 template <typename T>
503 {
504 return m_data[3];
505 }
506
507 template <typename T>
509 {
510 return m_data[0];
511 }
512
513 template <typename T>
515 {
516 return m_data[1];
517 }
518 template <typename T>
520 {
521 return m_data[2];
522 }
523
524 template <typename T>
526 {
527 return m_data[3];
528 }
529
530 template <typename T>
532 {
533 return !isNaN();
534 }
535
536 template <typename T>
538 {
539 return agx::isNaN( m_data[0] ) || agx::isNaN( m_data[1] ) || agx::isNaN( m_data[2] ) || agx::isNaN( m_data[3] );
540 }
541
542 template <typename T>
544 {
545 return agx::isFinite( m_data[0] ) && agx::isFinite( m_data[1] ) && agx::isFinite( m_data[2] ) && agx::isFinite( m_data[3] );
546 }
547
548 template <typename T>
550 {
551 return m_data[0] * rhs.m_data[0] + m_data[1] * rhs.m_data[1] + m_data[2] * rhs.m_data[2] + m_data[3] * rhs.m_data[3];
552 }
553
554 template <typename T>
556 {
557 return Vec4T( m_data[0] * rhs.m_data[0],
558 m_data[1] * rhs.m_data[1],
559 m_data[2] * rhs.m_data[2],
560 m_data[3] * rhs.m_data[3] );
561 }
562
563 template <typename T>
565 {
566 return Vec4T( m_data[0] * rhs, m_data[1] * rhs, m_data[2] * rhs, m_data[3] * rhs );
567 }
568
569
570 template <typename T>
572 {
573 m_data[0] = m_data[0] * rhs;
574 m_data[1] = m_data[1] * rhs;
575 m_data[2] = m_data[2] * rhs;
576 m_data[3] = m_data[3] * rhs;
577 return *this;
578 }
579
580 template <typename T>
582 {
583 return Vec4T( m_data[0] / rhs, m_data[1] / rhs, m_data[2] / rhs, m_data[3] / rhs );
584 }
585
586 template <typename T>
588 {
589 m_data[0] = m_data[0] / rhs;
590 m_data[1] = m_data[1] / rhs;
591 m_data[2] = m_data[2] / rhs;
592 m_data[3] = m_data[3] / rhs;
593 return *this;
594 }
595
596
597 template <typename T>
599 {
600 return Vec4T( m_data[0] + rhs.m_data[0], m_data[1] + rhs.m_data[1], m_data[2] + rhs.m_data[2], m_data[3] + rhs.m_data[3] );
601 }
602
603 template <typename T>
605 {
606 m_data[0] += rhs.m_data[0];
607 m_data[1] += rhs.m_data[1];
608 m_data[2] += rhs.m_data[2];
609 m_data[3] += rhs.m_data[3];
610 return *this;
611 }
612
613 template <typename T>
615 {
616 return Vec4T( m_data[0] - rhs.m_data[0], m_data[1] - rhs.m_data[1], m_data[2] - rhs.m_data[2], m_data[3] - rhs.m_data[3] );
617 }
618
619 template <typename T>
621 {
622 m_data[0] -= rhs.m_data[0];
623 m_data[1] -= rhs.m_data[1];
624 m_data[2] -= rhs.m_data[2];
625 m_data[3] -= rhs.m_data[3];
626 return *this;
627 }
628
629 template <typename T>
631 {
632 return Vec4T( m_data[0] + rhs, m_data[1] + rhs, m_data[2] + rhs, m_data[3] + rhs );
633 }
634
635 template <typename T>
637 {
638 m_data[0] += rhs;
639 m_data[1] += rhs;
640 m_data[2] += rhs;
641 m_data[3] += rhs;
642 return *this;
643 }
644
645 template <typename T>
647 {
648 return Vec4T( m_data[0] - rhs, m_data[1] - rhs, m_data[2] - rhs, m_data[3] - rhs );
649 }
650
651 template <typename T>
653 {
654 m_data[0] -= rhs;
655 m_data[1] -= rhs;
656 m_data[2] -= rhs;
657 m_data[3] -= rhs;
658 return *this;
659 }
660
661 template <typename T>
663 {
664 return Vec4T ( -m_data[0], -m_data[1], -m_data[2], -m_data[3] );
665 }
666
667 template <typename T>
669 {
670 return std::sqrt( length2() );
671 }
672
673 template <typename T>
675 {
676 return Real(m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2] + m_data[3] * m_data[3]);
677 }
678
679
680 template <typename T>
682 {
683 return std::sqrt(distance2(v2));
684 }
685
686
687 template <typename T>
689 {
690 Real norm = Vec4T::length();
691 if ( norm > 0.0 ) {
692 Real inv = Real(1.0) / norm;
693 m_data[0] = T(m_data[0] * inv);
694 m_data[1] = T(m_data[1] * inv);
695 m_data[2] = T(m_data[2] * inv);
696 m_data[3] = T(m_data[3] * inv);
697 }
698 return( norm );
699 }
700
701 template <typename T>
703 {
704 return Vec3T<T>( m_data[0], m_data[1], m_data[2] );
705 }
706
707 template <typename T>
709 {
711 }
712
713 template <typename T>
715 {
716 return Vec4T(agx::random(min[0], max[0]), agx::random(min[1], max[1]), agx::random(min[2], max[2]), agx::random(min[3], max[3]));
717 }
718
719
720 template<typename T>
722 {
723 return agx::equivalent(a[0], b[0], epsilon) &&
724 agx::equivalent(a[1], b[1], epsilon) &&
725 agx::equivalent(a[2], b[2], epsilon) &&
726 agx::equivalent(a[3], b[3], epsilon);
727 }
728
729 template<typename T>
731 {
732 return Vec4T<T>(std::abs(a[0]),
733 std::abs(a[1]),
734 std::abs(a[2]),
735 std::abs(a[3]));
736 }
737
738 template<typename T>
739 AGX_FORCE_INLINE std::ostream& operator << ( std::ostream& output, const Vec4T<T>& v )
740 {
741 output << v[0] << " " << v[1] << " " << v[2] << " " << v[3];
742 return output;
743 }
744
745
747 template <typename T>
749 {
750 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + rhs[3];
751 }
752
754 template <typename T>
756 {
757 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + lhs[3];
758 }
759
760
761 template <typename T>
763 {
764 Vec4T diff(m_data[0] - v2.m_data[0], m_data[1] - v2.m_data[1], m_data[2] - v2.m_data[2], m_data[3] - v2.m_data[3]);
765 return diff.length2();
766 }
767
768
769 template<>
771 {
772 // Template specialization to avoid underflow in unsigned types.
773 Vec4T diff( (UInt8) (std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] )),
774 (UInt8) (std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] )),
775 (UInt8) (std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] )),
776 (UInt8) (std::max( m_data[3], v2.m_data[3] ) - std::min( m_data[3], v2.m_data[3] )) );
777 return diff.length2();
778 }
779
780
781 template<>
783 {
784 // Template specialization to avoid underflow in unsigned types.
785 Vec4T diff( (UInt16) (std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] )),
786 (UInt16) (std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] )),
787 (UInt16) (std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] )),
788 (UInt16) (std::max( m_data[3], v2.m_data[3] ) - std::min( m_data[3], v2.m_data[3] )) );
789 return diff.length2();
790 }
791
792
793 template<>
795 {
796 // Template specialization to avoid underflow in unsigned types.
797 Vec4T diff( std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] ),
798 std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] ),
799 std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] ),
800 std::max( m_data[3], v2.m_data[3] ) - std::min( m_data[3], v2.m_data[3] ) );
801 return diff.length2();
802 }
803
804
805 template<>
807 {
808 // Template specialization to avoid underflow in unsigned types.
809 Vec4T diff( std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] ),
810 std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] ),
811 std::max( m_data[2], v2.m_data[2] ) - std::min( m_data[2], v2.m_data[2] ),
812 std::max( m_data[3], v2.m_data[3] ) - std::min( m_data[3], v2.m_data[3] ) );
813 return diff.length2();
814 }
815
816 template <typename T>
817 AGX_FORCE_INLINE Vec4T<T> clamp( const Vec4T<T>& vec, const Vec4T<T>& minimum, const Vec4T<T>& maximum )
818 {
819 Vec4T<T> result = vec;
820 result.clamp(minimum, maximum);
821 return result;
822 }
823
824} // end of namespace agx
825
826#endif
A class holding 3 dimensional vectors and providing basic arithmetic.
Definition: Vec3Template.h:46
A class holding 4 dimensional vectors and providing basic arithmetic.
Definition: Vec4Template.h:35
bool isFinite() const
Definition: Vec4Template.h:543
void set(T x, T y, T z, T w)
Set the elements of the vector.
Definition: Vec4Template.h:448
bool operator==(const Vec4T &v) const
Equality test.
Definition: Vec4Template.h:352
T maxComponent() const
Definition: Vec4Template.h:383
Real normalize()
Normalize the vector so that it has length unity.
Definition: Vec4Template.h:688
Vec3T< T > asVec3() const
Definition: Vec4Template.h:702
Vec4T & operator*=(T rhs)
Definition: Vec4Template.h:571
const Vec4T operator-() const
Negation operator.
Definition: Vec4Template.h:662
const Vec4T operator+(const Vec4T &rhs) const
Binary vector add.
Definition: Vec4Template.h:598
static Vec4T componentMax(const Vec4T &v1, const Vec4T &v2)
Definition: Vec4Template.h:371
Real length2() const
Definition: Vec4Template.h:674
static Vec4T componentMin(const Vec4T &v1, const Vec4T &v2)
Definition: Vec4Template.h:365
Vec4T & operator+=(const Vec4T &rhs)
Unary vector add.
Definition: Vec4Template.h:604
static Vec4T random(T min, T max)
Definition: Vec4Template.h:708
bool isValid() const
Definition: Vec4Template.h:531
Vec4T & operator/=(T rhs)
Definition: Vec4Template.h:587
bool operator!=(const Vec4T &v) const
In-equality test.
Definition: Vec4Template.h:358
Vec4T & operator-=(const Vec4T &rhs)
Unary vector subtract.
Definition: Vec4Template.h:620
const Vec4T operator|(const Vec4T &rhs) const
Definition: Vec4Template.h:555
T operator*(const Vec4T &rhs) const
Definition: Vec4Template.h:549
size_t maxElement() const
Definition: Vec4Template.h:404
T & operator[](size_t i)
Definition: Vec4Template.h:472
bool isNaN() const
Definition: Vec4Template.h:537
Vec4T()
Default constructor.
Definition: Vec4Template.h:309
void clamp(const Vec4T &min, const Vec4T &max)
Clamp a vector between a lower and upper bound (per component).
Definition: Vec4Template.h:419
const Vec4T operator/(T rhs) const
Divide by scalar.
Definition: Vec4Template.h:581
size_t minElement() const
Definition: Vec4Template.h:389
T minComponent() const
Definition: Vec4Template.h:377
Real distance2(const Vec4T &v2) const
Definition: Vec4Template.h:762
bool equalsZero() const
Definition: Vec4Template.h:429
Real length() const
Definition: Vec4Template.h:668
Vec4T(const Vec4T &copy)=default
Copy constructor.
Real distance(const Vec4T &v2) const
Definition: Vec4Template.h:681
#define AGX_FORCE_INLINE
Definition: macros.h:58
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
uint16_t UInt16
Definition: Integer.h:31
T absolute(T v)
return the absolute value.
Definition: Math.h:291
Vec3T< T > operator*(const Vec3T< T > &v, const AffineMatrix4x4T< T > &m)
bool isNaN(T v)
Definition: Math.h:303
T1 clamp(T1 v, T2 minimum, T3 maximum)
Definition: Math.h:318
Vec3T< T > min(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
Definition: Vec3Template.h:861
AGXPHYSICS_EXPORT agx::Bool equalsZero(const agx::AddedMassInteraction::Matrix6x6 &matrix, agx::Real eps=agx::RealEpsilon)
std::ostream & operator<<(std::ostream &os, const agx::AddedMassInteraction::Matrix6x6 &m)
Vec3T< T > max(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
Definition: Vec3Template.h:855
T random(T min, T max)
Definition: Math.h:555
double Real
Definition: Real.h:42
uint8_t UInt8
Definition: Integer.h:30
static constexpr Real AGX_EQUIVALENT_EPSILON
Definition: Math.h:57
bool isFinite(T v)
Definition: Math.h:309
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)