17#ifndef AGX_VEC3_TEMPLATE_H
18#define AGX_VEC3_TEMPLATE_H
44 template <
typename T >
60 template <
typename T2>
289 template <
typename T>
292 m_data[0] = copy.
m_data[0];
293 m_data[1] = copy.
m_data[1];
294 m_data[2] = copy.
m_data[2];
300 template <
typename T>
303 m_data[0] = copy.
m_data[0];
304 m_data[1] = copy.
m_data[1];
305 m_data[2] = copy.
m_data[2];
311 template <
typename T>
312 template <
typename T2>
315 m_data[ 0 ] = (T)copy[ 0 ];
316 m_data[ 1 ] = (T)copy[ 1 ];
317 m_data[ 2 ] = (T)copy[ 2 ];
322 template <
typename T>
331 template <
typename T>
334 m_data[0] = m_data[1] = m_data[2] = r;
347 template <
typename T>
356 template <
typename T>
359 m_data[0] = T(v2[0]);
360 m_data[1] = T(v2[1]);
365 template <
typename T>
368 return m_data[0] == v.
m_data[0] && m_data[1] == v.
m_data[1] && m_data[2] == v.
m_data[2];
371 template <
typename T>
374 return m_data[0] != v.
m_data[0] || m_data[1] != v.
m_data[1] || m_data[2] != v.
m_data[2];
378 template <
typename T>
381 return Vec3T<T>( std::min( v1[0], v2[0] ), std::min( v1[1], v2[1] ), std::min( v1[2], v2[2] ) );
384 template <
typename T>
387 return Vec3T<T>( std::max( v1[0], v2[0] ), std::max( v1[1], v2[1] ), std::max( v1[2], v2[2] ) );
390 template <
typename T>
393 return std::min(std::min(m_data[0], m_data[1]), m_data[2]);
396 template <
typename T>
399 return std::max(std::max(m_data[0], m_data[1]), m_data[2]);
402 template <
typename T>
405 T m = std::numeric_limits<T>::infinity();
407 for(
size_t i = 0; i < 3; i++) {
417 template <
typename T>
422 for(
size_t i = 0; i < 3; i++) {
432 template <
typename T>
440 template <
typename T>
446 template <
typename T>
452 template <
typename T>
458 template <
typename T>
466 template <
typename T>
469 m_data[0] = m_data[1] = m_data[2] = value;
472 template <
typename T>
475 m_data[0] = rhs.
m_data[0];
476 m_data[1] = rhs.
m_data[1];
477 m_data[2] = rhs.
m_data[2];
480 template <
typename T>
486 template <
typename T>
492 template <
typename T>
498 template <
typename T>
504 template <
typename T>
510 template <
typename T>
516 template <
typename T>
522 template <
typename T>
528 template <
typename T>
534 template <
typename T>
540 template <
typename T>
546 template <
typename T>
549 return T(m_data[0] * rhs.
m_data[0] + m_data[1] * rhs.
m_data[1] + m_data[2] * rhs.
m_data[2]);
552 template <
typename T>
557 m_data[0] * rhs.
m_data[1] - m_data[1] * rhs.
m_data[0] );
560 template <
typename T>
568 template <
typename T>
575 template <
typename T>
584 template <
typename T>
587 return Vec3T<T>( T(m_data[0] * rhs), T(m_data[1] * rhs), T(m_data[2] * rhs) );
591 template <
typename T>
594 m_data[0] = T(m_data[0] * rhs);
595 m_data[1] = T(m_data[1] * rhs);
596 m_data[2] = T(m_data[2] * rhs);
600 template <
typename T>
603 return Vec3T( T(m_data[0] / rhs), T(m_data[1] / rhs), T(m_data[2] / rhs) );
606 template <
typename T>
609 m_data[0] = T(m_data[0] / rhs);
610 m_data[1] = T(m_data[1] / rhs);
611 m_data[2] = T(m_data[2] / rhs);
616 template <
typename T>
619 return Vec3T( m_data[0] + rhs[0], m_data[1] + rhs[1], m_data[2] + rhs[2] );
622 template <
typename T>
625 m_data[0] += rhs.
m_data[0];
626 m_data[1] += rhs.
m_data[1];
627 m_data[2] += rhs.
m_data[2];
631 template <
typename T>
634 return Vec3T( m_data[0] - rhs[0], m_data[1] - rhs[1], m_data[2] - rhs[2] );
637 template <
typename T>
640 m_data[0] -= rhs.
m_data[0];
641 m_data[1] -= rhs.
m_data[1];
642 m_data[2] -= rhs.
m_data[2];
646 template <
typename T>
649 return Vec3T( m_data[0] + rhs, m_data[1] + rhs, m_data[2] + rhs );
652 template <
typename T>
661 template <
typename T>
664 return Vec3T( m_data[0] - rhs, m_data[1] - rhs, m_data[2] - rhs );
667 template <
typename T>
676 template <
typename T>
679 return Vec3T ( -m_data[0], -m_data[1], -m_data[2] );
682 template <
typename T>
685 return std::sqrt(
agx::Real(m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2]) );
688 template <
typename T>
691 return Real(m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2]);
694 template <
typename T>
697 return std::sqrt(distance2(v2));
700 template <
typename T>
703 return setLength((
Real) 1.0);
713 m_data[0] = T(m_data[0] * inv);
714 m_data[1] = T(m_data[1] * inv);
715 m_data[2] = T(m_data[2] * inv);
721 template <
typename T>
724 Vec3T normal = *
this;
738 tmp.
set(T(1), T(0), T(0));
740 tmp.
set(T(0), T(0), T(1));
743 tmp.
set(T(0), T(1), T(0));
746 tmp.
set(T(0), T(0), T(1));
763 return getPerpendicularUnitVector();
770 template <
typename T>
776 template <
typename T>
782 template <
typename T>
788 template <
typename T>
796 template <
typename T>
802 template <
typename T>
812 ::memcpy(storage, this->ptr(),
size_t(3)*
sizeof(T));
848 template <
typename T>
870 output << v[0] <<
" " << v[1] <<
" " << v[2];
887 (
UInt8) (std::max( m_data[1], v2.
m_data[1] ) - std::min( m_data[1], v2.
m_data[1] )),
888 (
UInt8) (std::max( m_data[2], v2.
m_data[2] ) - std::min( m_data[2], v2.
m_data[2] )) );
898 (
UInt16) (std::max( m_data[2], v2.
m_data[2] ) - std::min( m_data[2], v2.
m_data[2] )) );
906 Vec3T diff( std::max( m_data[0], v2.
m_data[0] ) - std::min( m_data[0], v2.
m_data[0] ),
907 std::max( m_data[1], v2.
m_data[1] ) - std::min( m_data[1], v2.
m_data[1] ),
908 std::max( m_data[2], v2.
m_data[2] ) - std::min( m_data[2], v2.
m_data[2] ) );
916 Vec3T diff( std::max( m_data[0], v2.
m_data[0] ) - std::min( m_data[0], v2.
m_data[0] ),
917 std::max( m_data[1], v2.
m_data[1] ) - std::min( m_data[1], v2.
m_data[1] ),
918 std::max( m_data[2], v2.
m_data[2] ) - std::min( m_data[2], v2.
m_data[2] ) );
922 template <
typename T>
926 result.
clamp(minimum, maximum);
A class holding 3 dimensional vectors and providing basic arithmetic.
Vec3T(const Vec3T ©, T value, size_t i)
Real normalize()
Normalize the vector so that it has length unity.
Vec3T(const Vec2 &v2, T zz)
Vec3T & operator-=(const Vec3T &rhs)
Unary vector subtract.
Real setLength(Real newLength)
Scale the vector so that is has the specified length.
const Vec3T operator-() const
Negation operator.
const Vec3T operator+(const Vec3T &rhs) const
Binary vector add.
static Vec3T div(const Vec3T &lhs, const Vec3T &rhs)
Element-wise-division.
static Vec3T random(const Vec3T< T > &min, const Vec3T< T > &max)
static Vec3T random(T min=T(0), T max=T(1))
bool operator==(const Vec3T &v) const
Equality test.
Real length() const
Length of the vector = sqrt( vec .
Vec3T(const Vec3T ©, Real length)
Vec3T getPerpendicularUnitVector(const Vec3T &v2) const
Return a unit vector perpendicular to this and another vector.
void store3(T *storage) const
Store the tree components to the given memory area.
bool operator!=(const Vec3T &v) const
In-equality test.
const Vec3T operator/(T rhs) const
Divide by scalar.
size_t minElement() const
Real distance2(const Vec3T &v2) const
Squared distance to another vector.
void set(const Vec3T &rhs)
static Vec3T mul(const Vec3T &lhs, const Vec3T &rhs)
Element-wise-multiplication.
Vec3T getPerpendicularUnitVector() const
size_t maxElement() const
const Vec3T cross(const Vec3T &rhs) const
Cross product method.
Real distance(const Vec3T &v2) const
Distance to another vector.
static Vec3T AXIS(size_t i)
Vec3T & operator/=(T rhs)
Unary divide by scalar.
void clamp(const Vec3T &min, const Vec3T &max)
Clamp a vector between a lower and upper bound (per component).
Real length2() const
Length squared of the vector = vec .
Vec3T & operator*=(T rhs)
Unary multiply by scalar.
static Vec3T componentMax(const Vec3T &v1, const Vec3T &v2)
Creates a new vector where each component is the maximum of this and the other vector.
const Vec3T operator^(const Vec3T &rhs) const
Cross product operator.
Vec3T & operator+=(const Vec3T &rhs)
Unary vector add.
Vec3T()
Default constructor.
Vec3T(const Vec3T< T2 > ©)
Copy constructor for other types.
static Vec3T componentMin(const Vec3T &v1, const Vec3T &v2)
Creates a new vector where each component is the minimum of this and the other vector.
Vec3T(const Vec3T ©)=default
Copy constructor.
T operator*(const Vec3T &rhs) const
Dot product.
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)
Real sinc(Real x, Real nearZero=Real(1E-4))
Sinc function.
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
Vec3T< T > asin(const agx::Vec3T< T > &a)
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)