7#include "MRPch/MRBindingMacros.h"
25#pragma warning(disable: 4804)
26#pragma warning(disable: 4146)
44 static_assert(
elements == 3,
"Invalid number of elements" );
63 constexpr explicit Vector3(
const Vector3<U> & v ) noexcept :
x( T( v.x ) ),
y( T( v.y ) ),
z( T( v.z ) ) { }
82 return ( 1 / len ) * (*this);
95 return xf ? ( *xf )( *this ) : *
this;
101 for (
auto i = 0; i <
elements; ++i )
102 if ( (*
this)[i] == 0.f && std::signbit( (*
this)[i] ) )
108 return std::isfinite(
x ) && std::isfinite(
y ) && std::isfinite(
z );
117 [[nodiscard]]
friend constexpr auto operator -(
const Vector3<T> & a ) ->
Vector3<
decltype( -std::declval<T>() )> {
return { -a.x, -a.y, -a.z }; }
125 if constexpr ( std::is_integral_v<T> )
126 return { b.x / a, b.y / a, b.z / a };
128 return b * ( 1 / a );
136 if constexpr ( std::is_integral_v<T> )
137 { a.
x /= b; a.
y /= b; a.
z /= b;
return a; }
139 return a *= ( 1 / b );
144 return s << vec.
x <<
' ' << vec.
y <<
' ' << vec.
z;
149 return s >> vec.
x >> vec.
y >> vec.
z;
170 return ( a - b ).lengthSq();
177 return ( a - b ).length();
185 a.
y * b.
z - a.
z * b.
y,
186 a.
z * b.
x - a.
x * b.
z,
187 a.
x * b.
y - a.
y * b.
x
195 return a.x * b.x + a.y * b.y + a.z * b.z;
216 return { a.
x * b.
x,a.
y * b.
y,a.
z * b.
z };
223 return { a.
x / b.
x, a.
y / b.
y, a.
z / b.
z };
242 if ( abs( x ) < abs( y ) )
243 return ( abs( x ) < abs( z ) ) ?
Vector3( 1, 0, 0 ) :
Vector3( 0, 0, 1 );
245 return ( abs( y ) < abs( z ) ) ?
Vector3( 0, 1, 0 ) :
Vector3( 0, 0, 1 );
249inline std::pair<Vector3<T>, Vector3<T>> Vector3<T>::perpendicular() const
MR_REQUIRES_IF_SUPPORTED( std::floating_point<T> )
251 std::pair<Vector3<T>, Vector3<T>> res;
252 auto c1 = furthestBasisVector();
253 res.first =
cross( *
this, c1 ).normalized();
254 res.second =
cross( *
this, res.first ).normalized();
262 const auto zenithAngle = T( PI2 ) - altitude;
265 std::sin( zenithAngle ) * std::cos( azimuth ),
266 std::sin( zenithAngle ) * std::sin( azimuth ),
267 std::cos( zenithAngle )
280struct std::hash<
MR::Vector3f>
282 size_t operator()( MR::Vector3f
const& p )
const noexcept
288 static_assert(
sizeof( float ) ==
sizeof( std::uint32_t ) );
289 std::memcpy( &xy, &p.x,
sizeof( std::uint64_t ) );
290 std::memcpy( &z, &p.z,
sizeof( std::uint32_t ) );
291 return size_t( xy ) ^ ( size_t( z ) << 16 );
#define MR_REQUIRES_IF_SUPPORTED(...)
Definition MRMacros.h:33
static constexpr Vector3 plusX() noexcept
Definition MRVector3.h:53
void unsignZeroValues() MR_REQUIRES_IF_SUPPORTED(std
get rid of signed zero values to be sure that equal vectors have identical binary representation
Definition MRVector3.h:99
static constexpr Vector3 minusX() noexcept MR_REQUIRES_IF_SUPPORTED(!std
Definition MRVector3.h:56
auto dot(const Vector3< T > &a, const Vector3< T > &b) -> decltype(a.x *b.x)
dot product
Definition MRVector3.h:193
Vector3< T > unitVector3(T azimuth, T altitude)
returns a point on unit sphere given two angles
Definition MRVector3.h:260
T distanceSq(const Vector3< T > &a, const Vector3< T > &b)
squared distance between two points, which is faster to compute than just distance
Definition MRVector3.h:168
SymMatrix3< Int128 > SymMatrixType
Definition MRVector3.h:36
friend constexpr bool operator!=(const Vector3< T > &a, const Vector3< T > &b)
Definition MRVector3.h:112
MR_BIND_IGNORE friend auto end(const Vector3 &v)
Definition MRVector3.h:158
static constexpr Vector3 minusY() noexcept MR_REQUIRES_IF_SUPPORTED(!std
Definition MRVector3.h:57
static constexpr Vector3 minusZ() noexcept MR_REQUIRES_IF_SUPPORTED(!std
Definition MRVector3.h:58
MR_BIND_IGNORE friend auto begin(const Vector3 &v)
Definition MRVector3.h:156
Vector3< T > div(const Vector3< T > &a, const Vector3< T > &b)
per component division
Definition MRVector3.h:221
friend constexpr auto operator*(T a, const Vector3< T > &b) -> Vector3< decltype(std::declval< T >() *std::declval< T >())>
Definition MRVector3.h:121
auto dot(const Matrix2< T > &a, const Matrix2< T > &b) -> decltype(dot(a.x, b.x))
double-dot product: x = a : b
Definition MRMatrix2.h:142
friend constexpr auto operator-(const Vector3< T > &a) -> Vector3< decltype(-std::declval< T >())>
Definition MRVector3.h:117
Int128 x
Definition MRVector3.h:39
Int128 y
Definition MRVector3.h:39
static constexpr int elements
Definition MRVector3.h:37
friend std::istream & operator>>(std::istream &s, Vector3 &vec)
Definition MRVector3.h:147
friend std::ostream & operator<<(std::ostream &s, const Vector3 &vec)
Definition MRVector3.h:142
MR_BIND_IGNORE friend auto end(Vector3 &v)
Definition MRVector3.h:159
friend constexpr const Vector3< T > & operator+(const Vector3< T > &a)
NOTE: We use std::declval() in the operators below because libclang 18 in our binding generator is bu...
Definition MRVector3.h:116
Matrix3< Int128 > MatrixType
Definition MRVector3.h:35
friend constexpr Vector3< T > & operator/=(Vector3< T > &a, T b)
Definition MRVector3.h:134
MR_REQUIRES_IF_SUPPORTED(!std::is_same_v< T, U >) const expr explicit Vector3(const Vector3< U > &v) noexcept
Definition MRVector3.h:62
Vector3(NoInit) noexcept
Definition MRVector3.h:46
Int128 ValueType
Definition MRVector3.h:34
constexpr const T & operator[](int e) const noexcept
Definition MRVector3.h:65
auto length() const
Definition MRVector3.h:69
MR_REQUIRES_IF_SUPPORTED(std::constructible_from< T, U >) explicit const expr Vector3(const Vector2< U > &v) noexcept
Definition MRVector3.h:49
constexpr Vector3(T x, T y, T z) noexcept
Definition MRVector3.h:47
friend constexpr bool operator==(const Vector3< T > &a, const Vector3< T > &b)
Definition MRVector3.h:111
friend constexpr Vector3< T > & operator*=(Vector3< T > &a, T b)
Definition MRVector3.h:133
T distance(const Vector3< T > &a, const Vector3< T > &b)
distance between two points, better use distanceSq for higher performance
Definition MRVector3.h:175
T mixed(const Vector3< T > &a, const Vector3< T > &b, const Vector3< T > &c)
mixed product
Definition MRVector3.h:207
static constexpr Vector3 plusZ() noexcept
Definition MRVector3.h:55
Vector3 normalized() const MR_REQUIRES_IF_SUPPORTED(std
Definition MRVector3.h:77
friend constexpr auto operator/(Vector3< T > b, T a) -> Vector3< decltype(std::declval< T >()/std::declval< T >())>
Definition MRVector3.h:123
T sqr(const Vector3< T > &a)
squared length
Definition MRVector3.h:200
MR_BIND_IGNORE friend auto begin(Vector3 &v)
Definition MRVector3.h:157
std::array< Vector3f, 3 > MR_BIND_IGNORE
Definition MRMeshBuilderTypes.h:13
T angle(const Vector3< T > &a, const Vector3< T > &b)
Definition MRVector3.h:230
Vector3 furthestBasisVector() const MR_REQUIRES_IF_SUPPORTED(!std std::pair< Vector3, Vector3 > perpendicular() const MR_REQUIRES_IF_SUPPORTED(std Vector3 transformed(const AffineXf3OrPlaceholder< Int128 > *xf) const MR_REQUIRES_IF_SUPPORTED(std
Definition MRVector3.h:93
constexpr Vector3() noexcept
Definition MRVector3.h:41
typename detail::AffineXf3f::TypeOrPlaceholder< Vector3< T > >::type AffineXf3OrPlaceholder
Definition MRMeshFwd.h:306
Vector3< T > mult(const Vector3< T > &a, const Vector3< T > &b)
per component multiplication
Definition MRVector3.h:214
Int128 z
Definition MRVector3.h:39
friend constexpr Vector3< T > & operator-=(Vector3< T > &a, const Vector3< T > &b)
Definition MRVector3.h:132
T lengthSq() const
Definition MRVector3.h:68
static constexpr Vector3 plusY() noexcept
Definition MRVector3.h:54
bool isFinite() const MR_REQUIRES_IF_SUPPORTED(std
Definition MRVector3.h:106
static constexpr Vector3 diagonal(T a) noexcept
Definition MRVector3.h:52
Vector3< T > cross(const Vector3< T > &a, const Vector3< T > &b)
cross product
Definition MRVector3.h:182
length
Definition MRObjectDimensionsEnum.h:17
friend constexpr Vector3< T > & operator+=(Vector3< T > &a, const Vector3< T > &b)
Definition MRVector3.h:131
MR_REQUIRES_IF_SUPPORTED(detail::AffineXf3f::IsValidTemplateArg< V >) struct AffineXf
Definition MRAffineXf.h:24
constexpr T abs(T value)
Definition MRUnsigned.h:18
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRMatrix3.h:24
Definition MRMeshFwd.h:99
Definition MRSymMatrix3.h:18
Definition MRVector2.h:29
T cross(const Vector2< T > &a, const Vector2< T > &b)
cross product
Definition MRVector2.h:160
Definition MRVector3.h:33