Changeset View
Changeset View
Standalone View
Standalone View
source/maths/Vector3D.h
Show All 16 Lines | |||||
/* | /* | ||||
* Provides an interface for a vector in R3 and allows vector and | * Provides an interface for a vector in R3 and allows vector and | ||||
* scalar operations on it | * scalar operations on it | ||||
*/ | */ | ||||
#ifndef INCLUDED_VECTOR3D | #ifndef INCLUDED_VECTOR3D | ||||
#define INCLUDED_VECTOR3D | #define INCLUDED_VECTOR3D | ||||
#include <immintrin.h> | |||||
class CFixedVector3D; | class CFixedVector3D; | ||||
class CVector3D | class CVector3D | ||||
{ | { | ||||
public: | public: | ||||
float X, Y, Z; | float X, Y, Z; | ||||
Show All 19 Lines | public: | ||||
bool operator!=(const CVector3D& vector) const | bool operator!=(const CVector3D& vector) const | ||||
{ | { | ||||
return !operator==(vector); | return !operator==(vector); | ||||
} | } | ||||
CVector3D operator+(const CVector3D& vector) const | CVector3D operator+(const CVector3D& vector) const | ||||
{ | { | ||||
return CVector3D(X + vector.X, Y + vector.Y, Z + vector.Z); | //PROFILE2("+"); | ||||
float result[3]; | |||||
__m128 vec = _mm_set_ps(0.0f, Z, Y, X); | |||||
__m128 vec2 = _mm_set_ps(0.0f, vector.Z, vector.Y, vector.X); | |||||
vec = _mm_add_ps(vec, vec2); | |||||
_mm_store_ps(result, vec); | |||||
return CVector3D(result[0], result[1], result[2]); | |||||
//return CVector3D(X + vector.X, Y + vector.Y, Z + vector.Z); | |||||
} | } | ||||
CVector3D& operator+=(const CVector3D& vector) | CVector3D& operator+=(const CVector3D& vector) | ||||
{ | { | ||||
X += vector.X; | //PROFILE2("+="); | ||||
Y += vector.Y; | float result[3]; | ||||
Z += vector.Z; | __m128 vec = _mm_set_ps(0.0f, Z, Y, X); | ||||
__m128 vec2 = _mm_set_ps(0.0f, vector.Z, vector.Y, vector.X); | |||||
vec = _mm_add_ps(vec, vec2); | |||||
_mm_store_ps(result, vec); | |||||
X = result[0]; | |||||
Y = result[1]; | |||||
Z = result[2]; | |||||
//X += vector.X; | |||||
//Y += vector.Y; | |||||
//Z += vector.Z; | |||||
return *this; | return *this; | ||||
} | } | ||||
CVector3D operator-(const CVector3D& vector) const | CVector3D operator-(const CVector3D& vector) const | ||||
{ | { | ||||
return CVector3D(X - vector.X, Y - vector.Y, Z - vector.Z); | //PROFILE2("-"); | ||||
float result[3]; | |||||
__m128 vec = _mm_set_ps(0.0f, Z, Y, X); | |||||
__m128 vec2 = _mm_set_ps(0.0f, vector.Z, vector.Y, vector.X); | |||||
vec = _mm_sub_ps(vec, vec2); | |||||
_mm_store_ps(result, vec); | |||||
return CVector3D(result[0], result[1], result[2]); | |||||
//return CVector3D(X - vector.X, Y - vector.Y, Z - vector.Z); | |||||
} | } | ||||
CVector3D& operator-=(const CVector3D& vector) | CVector3D& operator-=(const CVector3D& vector) | ||||
{ | { | ||||
X -= vector.X; | //PROFILE2("-="); | ||||
Y -= vector.Y; | float result[3]; | ||||
Z -= vector.Z; | __m128 vec = _mm_set_ps(0.0f, Z, Y, X); | ||||
__m128 vec2 = _mm_set_ps(0.0f, vector.Z, vector.Y, vector.X); | |||||
vec = _mm_sub_ps(vec, vec2); | |||||
_mm_store_ps(result, vec); | |||||
X = result[0]; | |||||
Y = result[1]; | |||||
Z = result[2]; | |||||
//X -= vector.X; | |||||
//Y -= vector.Y; | |||||
//Z -= vector.Z; | |||||
return *this; | return *this; | ||||
} | } | ||||
CVector3D operator*(float value) const | CVector3D operator*(float value) const | ||||
{ | { | ||||
return CVector3D(X * value, Y * value, Z * value); | //PROFILE2("*"); | ||||
float result[3]; | |||||
__m128 vec = _mm_set_ps(0.0f, Z, Y, X); | |||||
__m128 vec2 = _mm_set_ps1(value); | |||||
vec = _mm_mul_ps(vec, vec2); | |||||
_mm_store_ps(result, vec); | |||||
return CVector3D(result[0], result[1], result[2]); | |||||
//return CVector3D(X * value, Y * value, Z * value); | |||||
} | } | ||||
CVector3D& operator*=(float value) | CVector3D& operator*=(float value) | ||||
{ | { | ||||
X *= value; | //PROFILE2("*="); | ||||
Y *= value; | float result[3]; | ||||
Z *= value; | __m128 vec = _mm_set_ps(0.0f, Z, Y, X); | ||||
__m128 vec2 = _mm_set_ps1(value); | |||||
vec = _mm_mul_ps(vec, vec2); | |||||
_mm_store_ps(result, vec); | |||||
X = result[0]; | |||||
Y = result[1]; | |||||
Z = result[2]; | |||||
//X *= value; | |||||
//Y *= value; | |||||
//Z *= value; | |||||
return *this; | return *this; | ||||
} | } | ||||
CVector3D operator-() const | CVector3D operator-() const | ||||
{ | { | ||||
return CVector3D(-X, -Y, -Z); | //PROFILE2("Negate"); | ||||
float result[3]; | |||||
__m128 vec = _mm_set_ps(0.0f, Z, Y, X); | |||||
__m128 vec2 = _mm_setzero_ps(); | |||||
vec = _mm_sub_ps(vec2, vec); | |||||
_mm_store_ps(result, vec); | |||||
return CVector3D(result[0], result[1], result[2]); | |||||
//return CVector3D(-X, -Y, -Z); | |||||
} | } | ||||
public: | public: | ||||
float Dot (const CVector3D &vector) const | float Dot (const CVector3D &vector) const | ||||
{ | { | ||||
return ( X * vector.X + | //PROFILE2("Dot"); | ||||
Y * vector.Y + | __m128 vec = _mm_set_ps(0.0f, Z, Y, X); | ||||
Z * vector.Z ); | __m128 vec2 = _mm_set_ps(0.0f, vector.Z, vector.Y, vector.X); | ||||
__m128 temp = _mm_mul_ps(vec, vec2); | |||||
__m128 shuf = _mm_shuffle_ps(temp, temp, _MM_SHUFFLE(2, 3, 0, 1)); | |||||
__m128 sums = _mm_add_ps(temp, shuf); | |||||
shuf = _mm_movehl_ps(shuf, sums); | |||||
sums = _mm_add_ss(sums, shuf); | |||||
return _mm_cvtss_f32(sums); | |||||
//return (X * vector.X + | |||||
// Y * vector.Y + | |||||
// Z * vector.Z); | |||||
} | } | ||||
CVector3D Cross (const CVector3D &vector) const | CVector3D Cross (const CVector3D &vector) const | ||||
{ | { | ||||
CVector3D Temp; | //PROFILE2("Cross"); | ||||
Temp.X = (Y * vector.Z) - (Z * vector.Y); | float result[3]; | ||||
Temp.Y = (Z * vector.X) - (X * vector.Z); | __m128 vec = _mm_set_ps(0.0f, Z, Y, X); | ||||
Temp.Z = (X * vector.Y) - (Y * vector.X); | __m128 vec2 = _mm_set_ps(0.0f, vector.Z, vector.Y, vector.X); | ||||
return Temp; | __m128 temp = _mm_sub_ps( | ||||
_mm_mul_ps(_mm_shuffle_ps(vec, vec, _MM_SHUFFLE(3, 0, 2, 1)), _mm_shuffle_ps(vec2, vec2, _MM_SHUFFLE(3, 1, 0, 2))), | |||||
_mm_mul_ps(_mm_shuffle_ps(vec, vec, _MM_SHUFFLE(3, 1, 0, 2)), _mm_shuffle_ps(vec2, vec2, _MM_SHUFFLE(3, 0, 2, 1)))); | |||||
_mm_store_ps(result, temp); | |||||
return CVector3D(result[0], result[1], result[2]); | |||||
//CVector3D Temp; | |||||
//Temp.X = (Y * vector.Z) - (Z * vector.Y); | |||||
//Temp.Y = (Z * vector.X) - (X * vector.Z); | |||||
//Temp.Z = (X * vector.Y) - (Y * vector.X); | |||||
//return Temp; | |||||
} | } | ||||
float Length () const; | float Length () const; | ||||
float LengthSquared () const; | float LengthSquared () const; | ||||
void Normalize (); | void Normalize (); | ||||
CVector3D Normalized () const; | CVector3D Normalized () const; | ||||
// Returns 3 element array of floats, e.g. for glVertex3fv | // Returns 3 element array of floats, e.g. for glVertex3fv | ||||
const float* GetFloatArray() const { return &X; } | const float* GetFloatArray() const { return &X; } | ||||
}; | }; | ||||
extern float MaxComponent(const CVector3D& v); | extern float MaxComponent(const CVector3D& v); | ||||
#endif | #endif |
Wildfire Games · Phabricator