// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" namespace UE::Math { template< typename T > FORCEINLINE TVector2 operator+( T S, const TVector2& V ) { return TVector2(S) + V; } template< typename T > FORCEINLINE TVector operator+( T S, const TVector & V ) { return TVector (S) + V; } template< typename T > FORCEINLINE TVector4 operator+( T S, const TVector4& V ) { return TVector4(S) + V; } template< typename T > FORCEINLINE TVector2 operator-( T S, const TVector2& V ) { return TVector2(S) - V; } template< typename T > FORCEINLINE TVector operator-( T S, const TVector & V ) { return TVector (S) - V; } template< typename T > FORCEINLINE TVector4 operator-( T S, const TVector4& V ) { return TVector4(S) - V; } template< typename T > FORCEINLINE TIntVector2 operator+( const TIntVector2& V, T S ) { return V + TIntVector2(S); } template< typename T > FORCEINLINE TIntVector3 operator+( const TIntVector3& V, T S ) { return V + TIntVector3(S); } template< typename T > FORCEINLINE TIntVector4 operator+( const TIntVector4& V, T S ) { return V + TIntVector4(S); } template< typename T > FORCEINLINE TIntVector2 operator-( const TIntVector2& V, T S ) { return V - TIntVector2(S); } template< typename T > FORCEINLINE TIntVector3 operator-( const TIntVector3& V, T S ) { return V - TIntVector3(S); } template< typename T > FORCEINLINE TIntVector4 operator-( const TIntVector4& V, T S ) { return V - TIntVector4(S); } template< typename T > FORCEINLINE TIntVector2 operator+( T S, const TIntVector2& V ) { return TIntVector2(S) + V; } template< typename T > FORCEINLINE TIntVector3 operator+( T S, const TIntVector3& V ) { return TIntVector3(S) + V; } template< typename T > FORCEINLINE TIntVector4 operator+( T S, const TIntVector4& V ) { return TIntVector4(S) + V; } template< typename T > FORCEINLINE TIntVector2 operator-( T S, const TIntVector2& V ) { return TIntVector2(S) - V; } template< typename T > FORCEINLINE TIntVector3 operator-( T S, const TIntVector3& V ) { return TIntVector3(S) - V; } template< typename T > FORCEINLINE TIntVector4 operator-( T S, const TIntVector4& V ) { return TIntVector4(S) - V; } template< typename T > FORCEINLINE TIntVector2 operator*( T S, const TIntVector2& V ) { return TIntVector2(S) * V; } template< typename T > FORCEINLINE TIntVector3 operator*( T S, const TIntVector3& V ) { return TIntVector3(S) * V; } template< typename T > FORCEINLINE TIntVector4 operator*( T S, const TIntVector4& V ) { return TIntVector4(S) * V; } template< typename T > FORCEINLINE FVector2f operator+( const TIntVector2& V, float S ) { return FVector2f(V) + S; } template< typename T > FORCEINLINE FVector3f operator+( const TIntVector3& V, float S ) { return FVector3f(V) + S; } template< typename T > FORCEINLINE FVector4f operator+( const TIntVector4& V, float S ) { return FVector4f(V) + S; } template< typename T > FORCEINLINE FVector2f operator-( const TIntVector2& V, float S ) { return FVector2f(V) - S; } template< typename T > FORCEINLINE FVector3f operator-( const TIntVector3& V, float S ) { return FVector3f(V) - S; } template< typename T > FORCEINLINE FVector4f operator-( const TIntVector4& V, float S ) { return FVector4f(V) - S; } template< typename T > FORCEINLINE FVector2f operator+( float S, const TIntVector2& V ) { return S + FVector2f(V); } template< typename T > FORCEINLINE FVector3f operator+( float S, const TIntVector3& V ) { return S + FVector3f(V); } template< typename T > FORCEINLINE FVector4f operator+( float S, const TIntVector4& V ) { return S + FVector4f(V); } template< typename T > FORCEINLINE FVector2f operator-( float S, const TIntVector2& V ) { return S - FVector2f(V); } template< typename T > FORCEINLINE FVector3f operator-( float S, const TIntVector3& V ) { return S - FVector3f(V); } template< typename T > FORCEINLINE FVector4f operator-( float S, const TIntVector4& V ) { return S - FVector4f(V); } template< typename T > FORCEINLINE FVector2f operator*( const TIntVector2& V, float S ) { return FVector2f(V) * S; } template< typename T > FORCEINLINE FVector3f operator*( const TIntVector3& V, float S ) { return FVector3f(V) * S; } template< typename T > FORCEINLINE FVector4f operator*( const TIntVector4& V, float S ) { return FVector4f(V) * S; } template< typename T > FORCEINLINE FVector2f operator*( float S, const TIntVector2& V ) { return S * FVector2f(V); } template< typename T > FORCEINLINE FVector3f operator*( float S, const TIntVector3& V ) { return S * FVector3f(V); } template< typename T > FORCEINLINE FVector4f operator*( float S, const TIntVector4& V ) { return S * FVector4f(V); } template< typename T > FORCEINLINE FVector2f operator/( float S, const TVector2& V ) { return TVector2( S / V.X, S / V.Y ); } template< typename T > FORCEINLINE FVector3f operator/( float S, const TVector & V ) { return TVector ( S / V.X, S / V.Y, S / V.Z ); } template< typename T > FORCEINLINE FVector4f operator/( float S, const TVector4& V ) { return TVector4( S / V.X, S / V.Y, S / V.Z, S / V.W ); } template< typename T > FORCEINLINE TIntVector2& operator+=( TIntVector2& V, T S ) { return V += TIntVector2(S); } template< typename T > FORCEINLINE TIntVector3& operator+=( TIntVector3& V, T S ) { return V += TIntVector3(S); } template< typename T > FORCEINLINE TIntVector4& operator+=( TIntVector4& V, T S ) { return V += TIntVector4(S); } template< typename T > FORCEINLINE TIntVector2& operator-=( TIntVector2& V, T S ) { return V -= TIntVector2(S); } template< typename T > FORCEINLINE TIntVector3& operator-=( TIntVector3& V, T S ) { return V -= TIntVector3(S); } template< typename T > FORCEINLINE TIntVector4& operator-=( TIntVector4& V, T S ) { return V -= TIntVector4(S); } template< typename T > FORCEINLINE TIntVector2 Abs( const TIntVector2& V ) { return TIntVector2( FMath::Abs( V.X ), FMath::Abs( V.Y ) ); } template< typename T > FORCEINLINE TIntVector3 Abs( const TIntVector3& V ) { return TIntVector3( FMath::Abs( V.X ), FMath::Abs( V.Y ), FMath::Abs( V.Z ) ); } template< typename T > FORCEINLINE TIntVector4 Abs( const TIntVector4& V ) { return TIntVector4( FMath::Abs( V.X ), FMath::Abs( V.Y ), FMath::Abs( V.Z ), FMath::Abs( V.W ) ); } template< typename T > FORCEINLINE TIntVector2 Min( const TIntVector2& A, const TIntVector2& B ) { return A.ComponentMin(B); } template< typename T > FORCEINLINE TIntVector3 Min( const TIntVector3& A, const TIntVector3& B ) { return A.ComponentMin(B); } template< typename T > FORCEINLINE TIntVector4 Min( const TIntVector4& A, const TIntVector4& B ) { return A.ComponentMin(B); } template< typename T > FORCEINLINE TIntVector2 Max( const TIntVector2& A, const TIntVector2& B ) { return A.ComponentMax(B); } template< typename T > FORCEINLINE TIntVector3 Max( const TIntVector3& A, const TIntVector3& B ) { return A.ComponentMax(B); } template< typename T > FORCEINLINE TIntVector4 Max( const TIntVector4& A, const TIntVector4& B ) { return A.ComponentMax(B); } template< typename T > FORCEINLINE TIntVector2 Min3( const TIntVector2& A, const TIntVector2& B, const TIntVector2& C ) { return A.ComponentMin(B).ComponentMin(C); } template< typename T > FORCEINLINE TIntVector3 Min3( const TIntVector3& A, const TIntVector3& B, const TIntVector3& C ) { return A.ComponentMin(B).ComponentMin(C); } template< typename T > FORCEINLINE TIntVector4 Min3( const TIntVector4& A, const TIntVector4& B, const TIntVector4& C ) { return A.ComponentMin(B).ComponentMin(C); } template< typename T > FORCEINLINE TIntVector2 Max3( const TIntVector2& A, const TIntVector2& B, const TIntVector2& C ) { return A.ComponentMax(B).ComponentMax(C); } template< typename T > FORCEINLINE TIntVector3 Max3( const TIntVector3& A, const TIntVector3& B, const TIntVector3& C ) { return A.ComponentMax(B).ComponentMax(C); } template< typename T > FORCEINLINE TIntVector4 Max3( const TIntVector4& A, const TIntVector4& B, const TIntVector4& C ) { return A.ComponentMax(B).ComponentMax(C); } template< typename T > FORCEINLINE TVector2 Abs( const TVector2& V ) { return TVector2( FMath::Abs( V.X ), FMath::Abs( V.Y ) ); } template< typename T > FORCEINLINE TVector Abs( const TVector & V ) { return TVector ( FMath::Abs( V.X ), FMath::Abs( V.Y ), FMath::Abs( V.Z ) ); } template< typename T > FORCEINLINE TVector4 Abs( const TVector4& V ) { return TVector4( FMath::Abs( V.X ), FMath::Abs( V.Y ), FMath::Abs( V.Z ), FMath::Abs( V.W ) ); } template< typename T > FORCEINLINE TVector2 Min( const TVector2& A, const TVector2& B ) { return A.ComponentMin(B); } template< typename T > FORCEINLINE TVector Min( const TVector & A, const TVector & B ) { return A.ComponentMin(B); } template< typename T > FORCEINLINE TVector4 Min( const TVector4& A, const TVector4& B ) { return A.ComponentMin(B); } template< typename T > FORCEINLINE TVector2 Max( const TVector2& A, const TVector2& B ) { return A.ComponentMax(B); } template< typename T > FORCEINLINE TVector Max( const TVector & A, const TVector & B ) { return A.ComponentMax(B); } template< typename T > FORCEINLINE TVector4 Max( const TVector4& A, const TVector4& B ) { return A.ComponentMax(B); } template< typename T > FORCEINLINE TVector2 Min3( const TVector2& A, const TVector2& B, const TVector2& C ) { return A.ComponentMin(B).ComponentMin(C); } template< typename T > FORCEINLINE TVector Min3( const TVector & A, const TVector & B, const TVector & C ) { return A.ComponentMin(B).ComponentMin(C); } template< typename T > FORCEINLINE TVector4 Min3( const TVector4& A, const TVector4& B, const TVector4& C ) { return A.ComponentMin(B).ComponentMin(C); } template< typename T > FORCEINLINE TVector2 Max3( const TVector2& A, const TVector2& B, const TVector2& C ) { return A.ComponentMax(B).ComponentMax(C); } template< typename T > FORCEINLINE TVector Max3( const TVector & A, const TVector & B, const TVector & C ) { return A.ComponentMax(B).ComponentMax(C); } template< typename T > FORCEINLINE TVector4 Max3( const TVector4& A, const TVector4& B, const TVector4& C ) { return A.ComponentMax(B).ComponentMax(C); } template< typename T > FORCEINLINE TVector2 Floor( const TVector2& V ) { return TVector2( FMath::FloorToFloat( V.X ), FMath::FloorToFloat( V.Y ) ); } template< typename T > FORCEINLINE TVector Floor( const TVector & V ) { return TVector ( FMath::FloorToFloat( V.X ), FMath::FloorToFloat( V.Y ), FMath::FloorToFloat( V.Z ) ); } template< typename T > FORCEINLINE TVector4 Floor( const TVector4& V ) { return TVector4( FMath::FloorToFloat( V.X ), FMath::FloorToFloat( V.Y ), FMath::FloorToFloat( V.Z ), FMath::FloorToFloat( V.W ) ); } template< typename T > FORCEINLINE TVector2 Ceil( const TVector2& V ) { return TVector2( FMath::CeilToFloat( V.X ), FMath::CeilToFloat( V.Y ) ); } template< typename T > FORCEINLINE TVector Ceil( const TVector & V ) { return TVector ( FMath::CeilToFloat( V.X ), FMath::CeilToFloat( V.Y ), FMath::CeilToFloat( V.Z ) ); } template< typename T > FORCEINLINE TVector4 Ceil( const TVector4& V ) { return TVector4( FMath::CeilToFloat( V.X ), FMath::CeilToFloat( V.Y ), FMath::CeilToFloat( V.Z ), FMath::CeilToFloat( V.W ) ); } FORCEINLINE FIntVector2 FloorToInt( const FVector2f& V ) { return FIntVector2( FMath::FloorToInt( V.X ), FMath::FloorToInt( V.Y ) ); } FORCEINLINE FIntVector3 FloorToInt( const FVector3f& V ) { return FIntVector3( FMath::FloorToInt( V.X ), FMath::FloorToInt( V.Y ), FMath::FloorToInt( V.Z ) ); } FORCEINLINE FIntVector4 FloorToInt( const FVector4f& V ) { return FIntVector4( FMath::FloorToInt( V.X ), FMath::FloorToInt( V.Y ), FMath::FloorToInt( V.Z ), FMath::FloorToInt( V.W ) ); } FORCEINLINE FIntVector2 RoundToInt( const FVector2f& V ) { return FIntVector2( FMath::RoundToInt( V.X ), FMath::RoundToInt( V.Y ) ); } FORCEINLINE FIntVector3 RoundToInt( const FVector3f& V ) { return FIntVector3( FMath::RoundToInt( V.X ), FMath::RoundToInt( V.Y ), FMath::RoundToInt( V.Z ) ); } FORCEINLINE FIntVector4 RoundToInt( const FVector4f& V ) { return FIntVector4( FMath::RoundToInt( V.X ), FMath::RoundToInt( V.Y ), FMath::RoundToInt( V.Z ), FMath::RoundToInt( V.W ) ); } FORCEINLINE FIntVector2 CeilToInt( const FVector2f& V ) { return FIntVector2( FMath::CeilToInt( V.X ), FMath::CeilToInt( V.Y ) ); } FORCEINLINE FIntVector3 CeilToInt( const FVector3f& V ) { return FIntVector3( FMath::CeilToInt( V.X ), FMath::CeilToInt( V.Y ), FMath::CeilToInt( V.Z ) ); } FORCEINLINE FIntVector4 CeilToInt( const FVector4f& V ) { return FIntVector4( FMath::CeilToInt( V.X ), FMath::CeilToInt( V.Y ), FMath::CeilToInt( V.Z ), FMath::CeilToInt( V.W ) ); } // Useful for templated code that uses both vector and scalar types namespace Scalar { template< typename T > FORCEINLINE T Abs( const T A ) { return FMath::Abs( A ); } template< typename T > FORCEINLINE T Min( const T A, const T B ) { return FMath::Min( A, B ); } template< typename T > FORCEINLINE T Max( const T A, const T B ) { return FMath::Max( A, B ); } template< typename T > FORCEINLINE T Min3( const T A, const T B, const T C ) { return FMath::Min3( A, B, C ); } template< typename T > FORCEINLINE T Max3( const T A, const T B, const T C ) { return FMath::Max3( A, B, C ); } template< typename T > FORCEINLINE int32 FloorToInt( const T A ) { return FMath::FloorToInt32( A ); } template< typename T > FORCEINLINE int32 RoundToInt( const T A ) { return FMath::RoundToInt32( A ); } template< typename T > FORCEINLINE int32 CeilToInt( const T A ) { return FMath::CeilToInt32( A ); } } } // namespace UE::Math