OpenBarnyard
 
Loading...
Searching...
No Matches
TVector4.h
Go to the documentation of this file.
1#pragma once
2#include "Math/TVector3.h"
3#include "Math/TVector2.h"
4
6
8{
9public:
10 constexpr TVector4() = default;
11 constexpr TVector4( TFLOAT a_fX, TFLOAT a_fY, TFLOAT a_fZ, TFLOAT a_fW = 1.0f )
12 : x( a_fX ), y( a_fY ), z( a_fZ ), w( a_fW )
13 {}
14
15 constexpr TVector4( TFLOAT a_pFloats[ 4 ] )
16 : x( a_pFloats[ 0 ] ), y( a_pFloats[ 1 ] ), z( a_pFloats[ 2 ] ), w( a_pFloats[ 3 ] )
17 {}
18
19 constexpr TVector4( const TVector3& a_rcOther )
20 : x( a_rcOther.x ), y( a_rcOther.y ), z( a_rcOther.z ), w( 1.0f )
21 {}
22
23 constexpr TVector4( const TVector4& a_rcOther )
24 : x( a_rcOther.x ), y( a_rcOther.y ), z( a_rcOther.z ), w( a_rcOther.w )
25 {}
26
27 constexpr void Set( const TVector3& vec )
28 {
29 TVector4::x = vec.x;
30 TVector4::y = vec.y;
31 TVector4::z = vec.z;
32 TVector4::w = 1.0f;
33 }
34
35 // $Barnyard: FUNCTION 0046b360
36 constexpr void Set( const TVector4& vec )
37 {
38 TVector4::x = vec.x;
39 TVector4::y = vec.y;
40 TVector4::z = vec.z;
41 TVector4::w = vec.w;
42 }
43
44 constexpr void Set( TFLOAT floats[ 4 ] )
45 {
46 TVector4::x = floats[ 0 ];
47 TVector4::y = floats[ 1 ];
48 TVector4::z = floats[ 2 ];
49 TVector4::w = floats[ 3 ];
50 }
51
52 constexpr void Set( TFLOAT x, TFLOAT y, TFLOAT z, TFLOAT w )
53 {
54 TVector4::x = x;
55 TVector4::y = y;
56 TVector4::z = z;
57 TVector4::w = w;
58 }
59
61 void Normalise();
62 void Normalise4();
63 constexpr TBOOL isNormalised( TFLOAT fVal = 0.05f ) const { return ( ( ( 1.0f - fVal ) * ( 1.0f - fVal ) ) < MagnitudeSq() ) && ( ( ( 1.0f + fVal ) * ( 1.0f + fVal ) ) >= MagnitudeSq() ); }
64
65 void ProjectNormalToPlane( const TVector4& vec, const TVector4& vec2 );
66
67 constexpr void Add( const TVector3& vec )
68 {
69 x += vec.x;
70 y += vec.y;
71 z += vec.z;
72 }
73
74 constexpr void Add( const TVector4& vec )
75 {
76 x += vec.x;
77 y += vec.y;
78 z += vec.z;
79 }
80
81 constexpr void Add4( const TVector4& vec )
82 {
83 x += vec.x;
84 y += vec.y;
85 z += vec.z;
86 w += vec.w;
87 }
88
89 // $Barnyard: FUNCTION 0043cce0
90 constexpr void Add( const TVector4& a, const TVector4& b )
91 {
92 Set( a + b );
93 w = a.w;
94 }
95
96 constexpr void Add4( const TVector4& a, const TVector4& b )
97 {
98 Set( a );
99 Add4( b );
100 }
101
102 constexpr void Substract4( const TVector4& vec )
103 {
104 x -= vec.x;
105 y -= vec.y;
106 z -= vec.z;
107 w -= vec.w;
108 }
109
110 constexpr void Substract( const TVector4& vec )
111 {
112 x -= vec.x;
113 y -= vec.y;
114 z -= vec.z;
115 }
116
117 // $Barnyard: FUNCTION 0041cd70
118 constexpr void Substract( const TVector4& a, const TVector4& b )
119 {
120 Set( a - b );
121 w = a.w;
122 }
123
124 constexpr void Substract4( const TVector4& a, const TVector4& b )
125 {
126 Set( a );
127 Substract4( b );
128 }
129
130 constexpr void Divide( const TVector4& vec )
131 {
132 x /= vec.x;
133 y /= vec.y;
134 z /= vec.z;
135 }
136
137 constexpr void Divide( TFLOAT scalar )
138 {
139 TFLOAT ratio = 1.0f / scalar;
140 x *= ratio;
141 y *= ratio;
142 z *= ratio;
143 }
144
145 // $Barnyard: FUNCTION 006c9250
146 constexpr void Divide4( TFLOAT scalar )
147 {
148 if ( scalar != 0.0f )
149 {
150 TFLOAT ratio = 1.0f / scalar;
151 x *= ratio;
152 y *= ratio;
153 z *= ratio;
154 w *= ratio;
155 }
156 }
157
158 constexpr void Divide( const TVector4& vec1, const TVector4& vec2 )
159 {
160 Set( vec1 / vec2 );
161 }
162
163 constexpr void Divide( const TVector4& vec, TFLOAT scalar )
164 {
165 Set( vec );
166 Divide( scalar );
167 }
168
169 // $Barnyard: FUNCTION 006c7430
170 constexpr void Multiply( const TVector4& vec )
171 {
172 x *= vec.x;
173 y *= vec.y;
174 z *= vec.z;
175 }
176
177 // $Barnyard: FUNCTION 006c7450
178 constexpr void Multiply( TFLOAT scalar )
179 {
180 x *= scalar;
181 y *= scalar;
182 z *= scalar;
183 }
184
185 // $Barnyard: FUNCTION 006c7380
186 constexpr void Multiply( const TVector4& vec, TFLOAT scalar )
187 {
188 Set( vec );
189 Multiply( scalar );
190 }
191
192 constexpr void Multiply4( const TVector4& vec )
193 {
194 x *= vec.x;
195 y *= vec.y;
196 z *= vec.z;
197 w *= vec.w;
198 }
199
200 constexpr void Multiply4( TFLOAT scalar )
201 {
202 x *= scalar;
203 y *= scalar;
204 z *= scalar;
205 w *= scalar;
206 }
207
208 constexpr void Multiply4( const TVector4& vec, TFLOAT scalar )
209 {
210 Set( vec );
211 Multiply4( scalar );
212 }
213
214 void Cos( const TVector4& vec )
215 {
216 x = TMath::Cos( vec.x );
217 y = TMath::Cos( vec.y );
218 z = TMath::Cos( vec.z );
219 w = TMath::Cos( vec.w );
220 }
221
222 // $Barnyard: FUNCTION 006c7740
223 void CrossProduct( const TVector4& vec1, const TVector4& vec2 )
224 {
225 x = vec2.z * vec1.y - vec2.y * vec1.z;
226 y = vec1.z * vec2.x - vec2.z * vec1.x;
227 z = vec1.x * vec2.y - vec1.y * vec2.x;
228 w = vec1.w;
229 }
230
231 constexpr void Lerp3( const TVector4& finish, TFLOAT t ) { Lerp3( *this, finish, t ); }
232
233 // $Barnyard: FUNCTION 006c77e0
234 constexpr void Lerp3( const TVector4& start, const TVector4& finish, TFLOAT t )
235 {
236 TVector4::x = ( finish.x - start.x ) * t + start.x;
237 TVector4::y = ( finish.y - start.y ) * t + start.y;
238 TVector4::z = ( finish.z - start.z ) * t + start.z;
239 TVector4::w = start.w;
240 }
241
242 constexpr void Lerp4( const TVector4& finish, TFLOAT t ) { Lerp4( *this, finish, t ); }
243
244 // $Barnyard: FUNCTION 006c7790
245 constexpr void Lerp4( const TVector4& start, const TVector4& finish, TFLOAT t )
246 {
247 TVector4::x = ( finish.x - start.x ) * t + start.x;
248 TVector4::y = ( finish.y - start.y ) * t + start.y;
249 TVector4::z = ( finish.z - start.z ) * t + start.z;
250 TVector4::w = ( finish.w - start.w ) * t + start.w;
251 }
252
253 constexpr double GetScalarProjectionOnUnit( const TVector4& vec )
254 {
255 return (double)( TVector4::z * vec.z + TVector4::x * vec.x + TVector4::y * vec.y );
256 }
257
258 void Abs( const TVector4& vec4 ) { Set( TMath::Abs( vec4.x ), TMath::Abs( vec4.y ), TMath::Abs( vec4.z ), w ); }
259 void Abs() { Set( TMath::Abs( x ), TMath::Abs( y ), TMath::Abs( z ), w ); }
260
261 constexpr void Negate( const TVector4& vec ) { Negate3( vec ); }
262 constexpr void Negate() { Negate3(); }
263
264 // $Barnyard: FUNCTION 005f1740
265 constexpr void Negate3( const TVector4& vec ) { Set( -vec.x, -vec.y, -vec.z, vec.w ); }
266
267 constexpr void Negate3()
268 {
269 x = -x;
270 y = -y;
271 z = -z;
272 }
273
274 constexpr void Negate4( const TVector4& vec ) { Set( -vec.x, -vec.y, -vec.z, -vec.w ); }
275 constexpr void Negate4() { Set( -x, -y, -z, -w ); }
276
277 TFLOAT Magnitude() const { return TMath::Sqrt( x * x + y * y + z * z ); }
278 TFLOAT Magnitude4() const { return TMath::Sqrt( w * w + x * x + y * y + z * z ); }
279 constexpr TFLOAT MagnitudeSq() const { return x * x + y * y + z * z; }
280 constexpr TFLOAT MagnitudeSq4() const { return w * w + x * x + y * y + z * z; }
281 TFLOAT MagnitudeXZ() const { return TMath::Sqrt( x * x + z * z ); }
282 constexpr TFLOAT MagnitudeSqXZ() const { return x * x + z * z; }
283
284 // $Barnyard: FUNCTION 006c92f0
285 constexpr TBOOL IsEqual( const TVector4& a_rcVec ) const
286 {
287 return a_rcVec.x == x && a_rcVec.y == y && a_rcVec.z == z;
288 }
289
290 constexpr TVector4 operator+( const TVector3& other ) const { return { x + other.x, y + other.y, z + other.z, w }; }
291 constexpr TVector4 operator-( const TVector3& other ) const { return { x - other.x, y - other.y, z - other.z, w }; }
292 constexpr TVector4 operator*( const TVector3& other ) const { return { x * other.x, y * other.y, z * other.z, w }; }
293 constexpr TVector4 operator/( const TVector3& other ) const { return { x / other.x, y / other.y, z / other.z, w }; }
294
295 constexpr TVector4 operator+( const TVector4& other ) const { return { x + other.x, y + other.y, z + other.z, other.w }; }
296 constexpr TVector4 operator-( const TVector4& other ) const { return { x - other.x, y - other.y, z - other.z, other.w }; }
297
298 // $Barnyard: FUNCTION 004159e0
299 constexpr TVector4 operator*( const TVector4& other ) const { return { x * other.x, y * other.y, z * other.z, other.w }; }
300 constexpr TVector4 operator/( const TVector4& other ) const { return { x / other.x, y / other.y, z / other.z, other.w }; }
301
302 void operator=( const TVector3& other ) { Set( other ); }
303 void operator=( const TVector4& other ) { Set( other ); }
304 void operator+=( const TVector4& other ) { Add( other ); }
305
306 TVector4& operator-=( const TVector4& other )
307 {
308 Substract( other );
309 return *this;
310 }
311
312 void operator/=( const TVector4& other ) { Divide( other ); }
313 void operator*=( const TVector4& other ) { Multiply( other ); }
314
315 void operator/=( TFLOAT a_fScalar ) { Divide( a_fScalar ); }
316 void operator*=( TFLOAT a_fScalar ) { Multiply( a_fScalar ); }
317
318 TFLOAT* AsArray() { return TREINTERPRETCAST( TFLOAT*, this ); }
319 const TFLOAT* AsArray() const { return TREINTERPRETCAST( const TFLOAT*, this ); }
320
321 TVector3& AsVector3() { return TREINTERPRETCAST( TVector3&, *this ); }
322 const TVector3& AsVector3() const { return TREINTERPRETCAST( const TVector3&, *this ); }
323
324 TVector2& AsVector2() { return TREINTERPRETCAST( TVector2&, *this ); }
325 const TVector2& AsVector2() const { return TREINTERPRETCAST( const TVector2&, *this ); }
326
327public:
328 static TFLOAT Distance( const TVector4& vec1, const TVector4& vec2 ) { return ( vec2 - vec1 ).Magnitude(); }
329
330 // $Barnyard: FUNCTION 006c76c0
331 static constexpr TFLOAT DistanceSq( const TVector4& vec1, const TVector4& vec2 ) { return ( vec2 - vec1 ).MagnitudeSq(); }
332 // $Barnyard: FUNCTION 006cbaf0
333 static TFLOAT DistanceXZ( const TVector4& vec1, const TVector4& vec2 ) { return ( vec2 - vec1 ).MagnitudeXZ(); }
334 static constexpr TFLOAT DistanceSqXZ( const TVector4& vec1, const TVector4& vec2 ) { return ( vec2 - vec1 ).MagnitudeSqXZ(); }
335
336 TFLOAT constexpr DotProduct( const TVector4& vec ) const { return DotProduct3( *this, vec ); }
337 static constexpr TFLOAT DotProduct( const TVector4& vec1, const TVector4& vec2 ) { return DotProduct3( vec1, vec2 ); }
338
339 TFLOAT constexpr DotProduct3( const TVector4& vec ) const { return DotProduct3( *this, vec ); }
340
341 // $Barnyard: FUNCTION 006c7670
342 static constexpr TFLOAT DotProduct3( const TVector4& vec1, const TVector4& vec2 ) { return vec1.x * vec2.x + vec1.y * vec2.y + vec1.z * vec2.z; }
343
344 TFLOAT constexpr DotProduct4( const TVector4& vec ) const { return DotProduct4( *this, vec ); }
345
346 // $Barnyard: FUNCTION 006c7690
347 static constexpr TFLOAT DotProduct4( const TVector4& vec1, const TVector4& vec2 ) { return vec1.x * vec2.x + vec1.y * vec2.y + vec1.z * vec2.z + vec1.w * vec2.w; }
348
349 // $Barnyard: FUNCTION 006085d0
350 static void Swap( TVector4& a_rVec1, TVector4& a_rVec2 )
351 {
352 TVector4 temp = a_rVec1;
353 a_rVec1 = a_rVec2;
354 a_rVec2 = temp;
355 }
356
357public:
358 static const constinit TVector4 VEC_ZERO;
359 static const constinit TVector4 VEC_POSX;
360 static const constinit TVector4 VEC_POSY;
361 static const constinit TVector4 VEC_POSZ;
362 static const constinit TVector4 VEC_NEGX;
363 static const constinit TVector4 VEC_NEGY;
364 static const constinit TVector4 VEC_NEGZ;
365
366public:
368};
369
3D vector implementation for the Toshi engine
#define TREINTERPRETCAST(TYPE, VALUE)
Definition Defines.h:68
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
float TFLOAT
Definition Typedefs.h:4
bool TBOOL
Definition Typedefs.h:6
TFORCEINLINE TFLOAT Abs(TFLOAT fVal)
Definition TMathInline.h:63
TFORCEINLINE TFLOAT Cos(TFLOAT fVal)
Definition TMathInline.h:43
TFORCEINLINE TFLOAT Sqrt(TFLOAT a_fX)
Definition TMathInline.h:84
TFLOAT y
Definition TVector3.h:163
TFLOAT z
Definition TVector3.h:163
TFLOAT x
Definition TVector3.h:163
constexpr TFLOAT MagnitudeSqXZ() const
Definition TVector4.h:282
constexpr TBOOL isNormalised(TFLOAT fVal=0.05f) const
Definition TVector4.h:63
static constexpr TFLOAT DistanceSqXZ(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:334
TVector2 & AsVector2()
Definition TVector4.h:324
constexpr void Lerp4(const TVector4 &start, const TVector4 &finish, TFLOAT t)
Definition TVector4.h:245
TFLOAT * AsArray()
Definition TVector4.h:318
constexpr void Negate4(const TVector4 &vec)
Definition TVector4.h:274
constexpr TVector4 operator/(const TVector3 &other) const
Definition TVector4.h:293
TVector3 & AsVector3()
Definition TVector4.h:321
TFLOAT MagnitudeXZ() const
Definition TVector4.h:281
constexpr void Add4(const TVector4 &vec)
Definition TVector4.h:81
static const constinit TVector4 VEC_POSZ
Definition TVector4.h:361
constexpr void Negate(const TVector4 &vec)
Definition TVector4.h:261
void operator*=(const TVector4 &other)
Definition TVector4.h:313
static constexpr TFLOAT DistanceSq(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:331
TVector4 & operator-=(const TVector4 &other)
Definition TVector4.h:306
static const constinit TVector4 VEC_ZERO
Definition TVector4.h:358
constexpr void Substract(const TVector4 &a, const TVector4 &b)
Definition TVector4.h:118
void Cos(const TVector4 &vec)
Definition TVector4.h:214
TFLOAT NormaliseMag()
Definition TVector4.cpp:15
TFLOAT constexpr DotProduct4(const TVector4 &vec) const
Definition TVector4.h:344
constexpr double GetScalarProjectionOnUnit(const TVector4 &vec)
Definition TVector4.h:253
constexpr void Substract(const TVector4 &vec)
Definition TVector4.h:110
void Normalise4()
Definition TVector4.cpp:64
constexpr void Multiply(const TVector4 &vec)
Definition TVector4.h:170
constexpr TVector4(const TVector4 &a_rcOther)
Definition TVector4.h:23
static void Swap(TVector4 &a_rVec1, TVector4 &a_rVec2)
Definition TVector4.h:350
constexpr void Add(const TVector3 &vec)
Definition TVector4.h:67
constexpr void Negate3()
Definition TVector4.h:267
constexpr void Substract4(const TVector4 &vec)
Definition TVector4.h:102
void ProjectNormalToPlane(const TVector4 &vec, const TVector4 &vec2)
Definition TVector4.cpp:55
constexpr void Divide(const TVector4 &vec)
Definition TVector4.h:130
constexpr TVector4(TFLOAT a_pFloats[4])
Definition TVector4.h:15
constexpr void Substract4(const TVector4 &a, const TVector4 &b)
Definition TVector4.h:124
constexpr void Negate()
Definition TVector4.h:262
constexpr void Divide(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:158
constexpr TVector4 operator+(const TVector3 &other) const
Definition TVector4.h:290
constexpr void Add(const TVector4 &a, const TVector4 &b)
Definition TVector4.h:90
TFLOAT w
Definition TVector4.h:367
constexpr void Negate4()
Definition TVector4.h:275
constexpr void Set(const TVector4 &vec)
Definition TVector4.h:36
constexpr void Lerp3(const TVector4 &start, const TVector4 &finish, TFLOAT t)
Definition TVector4.h:234
static TFLOAT DistanceXZ(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:333
constexpr TBOOL IsEqual(const TVector4 &a_rcVec) const
Definition TVector4.h:285
TFLOAT x
Definition TVector4.h:367
constexpr TVector4()=default
void operator=(const TVector4 &other)
Definition TVector4.h:303
const TVector2 & AsVector2() const
Definition TVector4.h:325
void operator*=(TFLOAT a_fScalar)
Definition TVector4.h:316
static constexpr TFLOAT DotProduct4(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:347
constexpr TVector4 operator-(const TVector3 &other) const
Definition TVector4.h:291
static const constinit TVector4 VEC_POSY
Definition TVector4.h:360
TFLOAT y
Definition TVector4.h:367
constexpr TVector4(TFLOAT a_fX, TFLOAT a_fY, TFLOAT a_fZ, TFLOAT a_fW=1.0f)
Definition TVector4.h:11
constexpr void Multiply4(TFLOAT scalar)
Definition TVector4.h:200
constexpr TFLOAT MagnitudeSq() const
Definition TVector4.h:279
TFLOAT Magnitude() const
Definition TVector4.h:277
constexpr void Add(const TVector4 &vec)
Definition TVector4.h:74
constexpr void Multiply4(const TVector4 &vec)
Definition TVector4.h:192
constexpr TVector4(const TVector3 &a_rcOther)
Definition TVector4.h:19
constexpr void Set(TFLOAT floats[4])
Definition TVector4.h:44
static const constinit TVector4 VEC_NEGY
Definition TVector4.h:363
constexpr void Divide(const TVector4 &vec, TFLOAT scalar)
Definition TVector4.h:163
constexpr void Divide4(TFLOAT scalar)
Definition TVector4.h:146
constexpr void Set(TFLOAT x, TFLOAT y, TFLOAT z, TFLOAT w)
Definition TVector4.h:52
void CrossProduct(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:223
void operator+=(const TVector4 &other)
Definition TVector4.h:304
constexpr TVector4 operator+(const TVector4 &other) const
Definition TVector4.h:295
TFLOAT Magnitude4() const
Definition TVector4.h:278
constexpr void Divide(TFLOAT scalar)
Definition TVector4.h:137
constexpr TVector4 operator*(const TVector3 &other) const
Definition TVector4.h:292
static const constinit TVector4 VEC_NEGX
Definition TVector4.h:362
void operator/=(TFLOAT a_fScalar)
Definition TVector4.h:315
static const constinit TVector4 VEC_NEGZ
Definition TVector4.h:364
void Abs()
Definition TVector4.h:259
static constexpr TFLOAT DotProduct(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:337
static TFLOAT Distance(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:328
static constexpr TFLOAT DotProduct3(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:342
constexpr void Multiply4(const TVector4 &vec, TFLOAT scalar)
Definition TVector4.h:208
void operator/=(const TVector4 &other)
Definition TVector4.h:312
void operator=(const TVector3 &other)
Definition TVector4.h:302
void Abs(const TVector4 &vec4)
Definition TVector4.h:258
constexpr void Negate3(const TVector4 &vec)
Definition TVector4.h:265
constexpr void Multiply(const TVector4 &vec, TFLOAT scalar)
Definition TVector4.h:186
void Normalise()
Definition TVector4.cpp:36
constexpr void Lerp4(const TVector4 &finish, TFLOAT t)
Definition TVector4.h:242
constexpr TVector4 operator*(const TVector4 &other) const
Definition TVector4.h:299
constexpr void Multiply(TFLOAT scalar)
Definition TVector4.h:178
constexpr TVector4 operator-(const TVector4 &other) const
Definition TVector4.h:296
constexpr TVector4 operator/(const TVector4 &other) const
Definition TVector4.h:300
TFLOAT z
Definition TVector4.h:367
constexpr void Set(const TVector3 &vec)
Definition TVector4.h:27
static const constinit TVector4 VEC_POSX
Definition TVector4.h:359
constexpr void Lerp3(const TVector4 &finish, TFLOAT t)
Definition TVector4.h:231
constexpr TFLOAT MagnitudeSq4() const
Definition TVector4.h:280
constexpr void Add4(const TVector4 &a, const TVector4 &b)
Definition TVector4.h:96
const TFLOAT * AsArray() const
Definition TVector4.h:319
TFLOAT constexpr DotProduct(const TVector4 &vec) const
Definition TVector4.h:336
TFLOAT constexpr DotProduct3(const TVector4 &vec) const
Definition TVector4.h:339
const TVector3 & AsVector3() const
Definition TVector4.h:322