17#ifndef AGX_VEC4_TEMPLATE_H
18#define AGX_VEC4_TEMPLATE_H
54 explicit Vec4T( T r );
60 explicit Vec4T(
const T v[4] );
129 const T*
ptr()
const;
132 void set( T
x, T
y, T
z, T
w );
296 template <
typename T>
297 template<
typename T2>
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 ];
308 template <
typename T>
317 template <
typename T>
320 m_data[0] = m_data[1] = m_data[2] = m_data[3] = r;
323 template <
typename T>
332 template <
typename T>
341 template <
typename T>
344 m_data[0] = T(v3[0]);
345 m_data[1] = T(v3[1]);
346 m_data[2] = T(v3[2]);
351 template <
typename T>
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];
357 template <
typename T>
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];
364 template <
typename T>
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]));
370 template <
typename T>
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]));
376 template <
typename T>
379 return std::min(std::min(std::min(m_data[0], m_data[1]), m_data[2]), m_data[3]);
382 template <
typename T>
385 return std::max(std::max(std::max(m_data[0], m_data[1]), m_data[2]), m_data[3]);
388 template <
typename T>
391 T m = std::numeric_limits<T>::infinity();
393 for(
size_t i = 0; i < 4; i++) {
403 template <
typename T>
408 for(
size_t i = 0; i < 4; i++) {
418 template <
typename T>
428 template <
typename T>
435 template <
typename T>
441 template <
typename T>
447 template <
typename T>
456 template <
typename T>
459 m_data[0] = m_data[1] = m_data[2] = m_data[3] = value;
462 template <
typename T>
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];
471 template <
typename T>
477 template <
typename T>
483 template <
typename T>
489 template <
typename T>
495 template <
typename T>
501 template <
typename T>
507 template <
typename T>
513 template <
typename T>
518 template <
typename T>
524 template <
typename T>
530 template <
typename T>
536 template <
typename T>
542 template <
typename T>
548 template <
typename T>
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];
554 template <
typename T>
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] );
563 template <
typename T>
566 return Vec4T( m_data[0] * rhs, m_data[1] * rhs, m_data[2] * rhs, m_data[3] * rhs );
570 template <
typename T>
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;
580 template <
typename T>
583 return Vec4T( m_data[0] / rhs, m_data[1] / rhs, m_data[2] / rhs, m_data[3] / rhs );
586 template <
typename T>
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;
597 template <
typename T>
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] );
603 template <
typename T>
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];
613 template <
typename T>
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] );
619 template <
typename T>
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];
629 template <
typename T>
632 return Vec4T( m_data[0] + rhs, m_data[1] + rhs, m_data[2] + rhs, m_data[3] + rhs );
635 template <
typename T>
645 template <
typename T>
648 return Vec4T( m_data[0] - rhs, m_data[1] - rhs, m_data[2] - rhs, m_data[3] - rhs );
651 template <
typename T>
661 template <
typename T>
664 return Vec4T ( -m_data[0], -m_data[1], -m_data[2], -m_data[3] );
667 template <
typename T>
670 return std::sqrt( length2() );
673 template <
typename T>
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]);
680 template <
typename T>
683 return std::sqrt(distance2(v2));
687 template <
typename T>
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);
701 template <
typename T>
704 return Vec3T<T>( m_data[0], m_data[1], m_data[2] );
707 template <
typename T>
713 template <
typename T>
741 output << v[0] <<
" " << v[1] <<
" " << v[2] <<
" " << v[3];
747 template <
typename T>
750 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + rhs[3];
754 template <
typename T>
757 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + lhs[3];
761 template <
typename T>
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]);
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] )) );
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] )) );
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] ) );
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] ) );
816 template <
typename T>
820 result.
clamp(minimum, maximum);
A class holding 3 dimensional vectors and providing basic arithmetic.
A class holding 4 dimensional vectors and providing basic arithmetic.
void set(T x, T y, T z, T w)
Set the elements of the vector.
bool operator==(const Vec4T &v) const
Equality test.
Real normalize()
Normalize the vector so that it has length unity.
Vec3T< T > asVec3() const
Vec4T & operator*=(T rhs)
const Vec4T operator-() const
Negation operator.
const Vec4T operator+(const Vec4T &rhs) const
Binary vector add.
static Vec4T componentMax(const Vec4T &v1, const Vec4T &v2)
static Vec4T componentMin(const Vec4T &v1, const Vec4T &v2)
Vec4T & operator+=(const Vec4T &rhs)
Unary vector add.
static Vec4T random(T min, T max)
Vec4T & operator/=(T rhs)
bool operator!=(const Vec4T &v) const
In-equality test.
Vec4T & operator-=(const Vec4T &rhs)
Unary vector subtract.
const Vec4T operator|(const Vec4T &rhs) const
T operator*(const Vec4T &rhs) const
size_t maxElement() const
Vec4T()
Default constructor.
void clamp(const Vec4T &min, const Vec4T &max)
Clamp a vector between a lower and upper bound (per component).
const Vec4T operator/(T rhs) const
Divide by scalar.
size_t minElement() const
Real distance2(const Vec4T &v2) const
Vec4T(const Vec4T ©)=default
Copy constructor.
Real distance(const Vec4T &v2) const
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
T absolute(T v)
return the absolute value.
Vec3T< T > operator*(const Vec3T< T > &v, const AffineMatrix4x4T< T > &m)
T1 clamp(T1 v, T2 minimum, T3 maximum)
Vec3T< T > min(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
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)
static constexpr Real AGX_EQUIVALENT_EPSILON
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)