UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RenderTransform.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Math/Box.h"
8#include "Math/Float32.h"
9#include "Math/Matrix.h"
10#include "Math/NumericLimits.h"
11#include "Math/UnrealMathSSE.h"
12#include "Math/Vector.h"
13#include "Math/Vector2D.h"
14#include "Math/VectorRegister.h"
18
19// TODO: Further compress data size with tighter encoding
20// LWC_TODO: Rebasing support (no 64bit types in here)
21// TODO: Optimization (avoid full 4x4 math)
23{
26
27public:
28 FRenderTransform() = default;
33
41
43 {
44 TransformRows[0] = FVector3f(M.M[0][0], M.M[0][1], M.M[0][2]);
45 TransformRows[1] = FVector3f(M.M[1][0], M.M[1][1], M.M[1][2]);
46 TransformRows[2] = FVector3f(M.M[2][0], M.M[2][1], M.M[2][2]);
47 Origin = FVector3f(M.M[3][0], M.M[3][1], M.M[3][2]);
48 }
49
51 {
52 // LWC_TODO: Precision loss
53 TransformRows[0] = FVector3f((float)M.M[0][0], (float)M.M[0][1], (float)M.M[0][2]);
54 TransformRows[1] = FVector3f((float)M.M[1][0], (float)M.M[1][1], (float)M.M[1][2]);
55 TransformRows[2] = FVector3f((float)M.M[2][0], (float)M.M[2][1], (float)M.M[2][2]);
56 Origin = FVector3f((float)M.M[3][0], (float)M.M[3][1], (float)M.M[3][2]);
57 }
58
60 {
61 TransformRows[0] = FVector3f(From.M[0][0], From.M[0][1], From.M[0][2]);
62 TransformRows[1] = FVector3f(From.M[1][0], From.M[1][1], From.M[1][2]);
63 TransformRows[2] = FVector3f(From.M[2][0], From.M[2][1], From.M[2][2]);
64 Origin = FVector3f(From.M[3][0], From.M[3][1], From.M[3][2]);
65 return *this;
66 }
67
69 {
70 // LWC_TODO: Precision loss
71 TransformRows[0] = FVector3f((float)From.M[0][0], (float)From.M[0][1], (float)From.M[0][2]);
72 TransformRows[1] = FVector3f((float)From.M[1][0], (float)From.M[1][1], (float)From.M[1][2]);
73 TransformRows[2] = FVector3f((float)From.M[2][0], (float)From.M[2][1], (float)From.M[2][2]);
74 Origin = FVector3f((float)From.M[3][0], (float)From.M[3][1], (float)From.M[3][2]);
75 return *this;
76 }
77
78 inline bool Equals(const FRenderTransform& Other, float Tolerance = UE_KINDA_SMALL_NUMBER) const
79 {
80 return
81 TransformRows[0].Equals(Other.TransformRows[0], Tolerance) &&
82 TransformRows[1].Equals(Other.TransformRows[1], Tolerance) &&
83 TransformRows[2].Equals(Other.TransformRows[2], Tolerance) &&
84 Origin.Equals(Other.Origin, Tolerance);
85 }
86
87 inline FMatrix44f ToMatrix44f() const
88 {
90 #if PLATFORM_ENABLE_VECTORINTRINSICS
91 VectorRegister4Float Row0 = VectorSet_W0(VectorLoad(&TransformRows[0].X)); // Intentionally loads W from the next row (then set to 0)
92 VectorRegister4Float Row1 = VectorSet_W0(VectorLoad(&TransformRows[1].X)); // Intentionally loads W from the next row (then set to 0)
93 VectorRegister4Float Row2 = VectorSet_W0(VectorLoad(&TransformRows[2].X)); // Intentionally loads W from the next row (then set to 0)
94 VectorRegister4Float Row3 = MakeVectorRegisterFloat(Origin.X, Origin.Y, Origin.Z, 1.0f); // Do not read past Origin
95
96 float* RESTRICT Dest = &Matrix.M[0][0];
97 VectorStore(Row0, &Dest[0]);
98 VectorStore(Row1, &Dest[4]);
99 VectorStore(Row2, &Dest[8]);
100 VectorStore(Row3, &Dest[12]);
101 #else
102 Matrix.M[0][0] = TransformRows[0].X;
103 Matrix.M[0][1] = TransformRows[0].Y;
104 Matrix.M[0][2] = TransformRows[0].Z;
105 Matrix.M[0][3] = 0.0f;
106 Matrix.M[1][0] = TransformRows[1].X;
107 Matrix.M[1][1] = TransformRows[1].Y;
108 Matrix.M[1][2] = TransformRows[1].Z;
109 Matrix.M[1][3] = 0.0f;
110 Matrix.M[2][0] = TransformRows[2].X;
111 Matrix.M[2][1] = TransformRows[2].Y;
112 Matrix.M[2][2] = TransformRows[2].Z;
113 Matrix.M[2][3] = 0.0f;
114 Matrix.M[3][0] = Origin.X;
115 Matrix.M[3][1] = Origin.Y;
116 Matrix.M[3][2] = Origin.Z;
117 Matrix.M[3][3] = 1.0f;
118 #endif
119 return Matrix;
120 }
121
122 inline FMatrix ToMatrix() const
123 {
124 return (FMatrix)ToMatrix44f();
125 }
126
127 inline void To3x4MatrixTranspose(float* Result) const
128 {
129 float* RESTRICT Dest = Result;
130
131 #if PLATFORM_ENABLE_VECTORINTRINSICS
132 VectorRegister4Float InRow0 = VectorLoad(&TransformRows[0].X); // Intentionally loads W from the next row (discarded)
133 VectorRegister4Float InRow1 = VectorLoad(&TransformRows[1].X); // Intentionally loads W from the next row (discarded)
134 VectorRegister4Float InRow2 = VectorLoad(&TransformRows[2].X); // Intentionally loads W from the next row (discarded)
135 VectorRegister4Float InRow3 = MakeVectorRegisterFloat(Origin.X, Origin.Y, Origin.Z, 0.0f); // Do not read past Origin
136
141
142 VectorRegister4Float Row0, Row1, Row2, Row3;
143 VectorDeinterleave(Row0, Row1, Temp0, Temp1);
145
146 VectorStore(Row0, &Dest[0]);
147 VectorStore(Row1, &Dest[4]);
148 VectorStore(Row2, &Dest[8]);
149 #else
150 Dest[ 0] = TransformRows[0].X; // [0][0]
151 Dest[ 1] = TransformRows[1].X; // [1][0]
152 Dest[ 2] = TransformRows[2].X; // [2][0]
153 Dest[ 3] = Origin.X; // [3][0]
154
155 Dest[ 4] = TransformRows[0].Y; // [0][1]
156 Dest[ 5] = TransformRows[1].Y; // [1][1]
157 Dest[ 6] = TransformRows[2].Y; // [2][1]
158 Dest[ 7] = Origin.Y; // [3][1]
159
160 Dest[ 8] = TransformRows[0].Z; // [0][2]
161 Dest[ 9] = TransformRows[1].Z; // [1][2]
162 Dest[10] = TransformRows[2].Z; // [2][2]
163 Dest[11] = Origin.Z; // [3][2]
164 #endif
165 }
166
168 {
169 // Use vectorized 4x4 implementation
170 const FMatrix44f LHS = ToMatrix44f();
171 const FMatrix44f RHS = Other.ToMatrix44f();
172 return (LHS * RHS);
173 }
174
176 {
177 // Use vectorized 4x4 implementation
178 const FMatrix44f LHS = ToMatrix44f();
179 return (LHS * Other);
180 }
181
182 inline float RotDeterminant() const
183 {
184 return
188 }
189
191 {
192 // Use vectorized 4x4 implementation
193 return ToMatrix44f().Inverse();
194 }
195
197 {
198 // Use vectorized 4x4 implementation
199 return ToMatrix44f().InverseFast();
200 }
201
202 inline FVector3f GetScale() const
203 {
204 // Extract per axis scales
206 Scale.X = TransformRows[0].Size();
207 Scale.Y = TransformRows[1].Size();
208 Scale.Z = TransformRows[2].Size();
209 return Scale;
210 }
211
212 inline bool IsScaleNonUniform() const
213 {
214 const FVector3f Scale = GetScale();
215 return
216 (
220 );
221 }
222
223 inline void Orthogonalize()
224 {
228
229 if (X.IsZero() || Y.IsZero())
230 {
231 return;
232 }
233
234 // Modified Gram-Schmidt orthogonalization
235 Y -= (Y | X) / (X | X) * X;
236 Z -= (Z | X) / (X | X) * X;
237 Z -= (Z | Y) / (Y | Y) * Y;
238
239 TransformRows[0] = X;
240 TransformRows[1] = Y;
241 TransformRows[2] = Z;
242 }
243
244 inline void SetIdentity()
245 {
246 TransformRows[0] = FVector3f(1.0f, 0.0f, 0.0f);
247 TransformRows[1] = FVector3f(0.0f, 1.0f, 0.0f);
248 TransformRows[2] = FVector3f(0.0f, 0.0f, 1.0f);
250 }
251
260 {
261 Ar << T.TransformRows[0].X << T.TransformRows[0].Y << T.TransformRows[0].Z;
262 Ar << T.TransformRows[1].X << T.TransformRows[1].Y << T.TransformRows[1].Z;
263 Ar << T.TransformRows[2].X << T.TransformRows[2].Y << T.TransformRows[2].Z;
264 Ar << T.Origin.X << T.Origin.Y << T.Origin.Z;
265 return Ar;
266 }
267
269};
270
272{
275
276public:
279 , Max(-MAX_flt, -MAX_flt, -MAX_flt)
280 {
281 }
282
284 : Min(InMin)
285 , Max(InMax)
286 {
287 }
288
289 inline FRenderBounds(const FBox& Box)
290 {
291 Min = FVector3f(Box.Min); //LWC_TODO: Precision loss
292 Max = FVector3f(Box.Max); //LWC_TODO: Precision loss
293 }
294
295 inline FRenderBounds(const FBoxSphereBounds& Bounds)
296 {
297 Min = FVector3f(Bounds.Origin - Bounds.BoxExtent); //LWC_TODO: Precision loss
298 Max = FVector3f(Bounds.Origin + Bounds.BoxExtent); //LWC_TODO: Precision loss
299 }
300
301 inline FBox ToBox() const
302 {
303 return FBox(FVector(Min), FVector(Max));
304 }
305
307 {
308 return FBoxSphereBounds(ToBox());
309 }
310
312 {
313 Min = Other;
314 Max = Other;
315 return *this;
316 }
317
325
332
334 {
335 return FRenderBounds(*this) += Other;
336 }
337
338 inline bool Equals(const FRenderBounds& Other, float Tolerance = UE_KINDA_SMALL_NUMBER) const
339 {
340 return Min.Equals(Other.Min, Tolerance) && Max.Equals(Other.Max, Tolerance);
341 }
342
343 inline const FVector3f& GetMin() const
344 {
345 return Min;
346 }
347
348 inline const FVector3f& GetMax() const
349 {
350 return Max;
351 }
352
353 inline FVector3f GetCenter() const
354 {
355 return (Max + Min) * 0.5f;
356 }
357
358 inline FVector3f GetExtent() const
359 {
360 return (Max - Min) * 0.5f;
361 }
362
363 inline float GetSurfaceArea() const
364 {
365 FVector3f Size = Max - Min;
366 return 0.5f * (Size.X * Size.Y + Size.X * Size.Z + Size.Y * Size.Z);
367 }
368
377
385
393 {
394 FVector3f AxisDistances = (Point - GetCenter()).GetAbs() - GetExtent();
397 }
398
407 {
408 Ar << B.Min;
409 Ar << B.Max;
410 return Ar;
411 }
412};
413
414
415// [Frisvad 2012, "Building an Orthonormal Basis from a 3D Unit Vector Without Normalization"]
417{
418 float A = 1.0f / ( 1.0f + BasisZ.Z );
419 float B = -BasisZ.X * BasisZ.Y * A;
420 BasisX = FVector3f( 1.0f - BasisZ.X * BasisZ.X * A, B, -BasisZ.X );
421 BasisY = FVector3f( B, 1.0f - BasisZ.Y * BasisZ.Y * A, -BasisZ.Y );
422}
423
425{
426 float Sum = FMath::Abs( N.X ) + FMath::Abs( N.Y ) + FMath::Abs( N.Z );
427 return FVector2f( N.X + N.Y, N.X - N.Y ) / Sum;
428}
429
431{
432 FVector3f N;
433 N.X = Oct.X + Oct.Y;
434 N.Y = Oct.X - Oct.Y;
435 N.Z = 2.0f - FMath::Abs( N.X ) - FMath::Abs( N.Y );
436 return N.GetUnsafeNormal();
437}
438
440{
441 static constexpr uint32 ExpBits = 8;
442 static constexpr uint32 ExpBias = ( 1 << (ExpBits - 1) ) - 1;
443 static constexpr uint32 SignMantissaBits = 16;
444 static constexpr uint32 SignMantissaMask = (1 << SignMantissaBits) - 1;
445 static constexpr uint32 MantissaBits = SignMantissaBits - 1;
446
447 FVector3f Translation; // 4B padding
448 uint16 Rotation[4]; // 2B padding
449 uint16 Scale_SharedExp[4]; // 1B padding if SignMantissaBits == 16
450
453 {
454 Translation = In.Origin;
455
457 FVector3f Axis[3];
458 for( int i = 0; i < 3; i++ )
459 {
460 Axis[i] = In.TransformRows[i];
461 Scale[i] = Axis[i].Size();
462 Axis[i] /= (Scale[i] != 0.f) ? Scale[i] : 1.f;
463 }
464
465 // Rotation
466 {
467 if( Axis[2].Z < 0.0f )
468 {
469 Axis[2] *= -1.0f;
470 Scale[2] *= -1.0f;
471 }
472
474
477
478 float X = Axis[0] | BasisX;
479 float Y = Axis[0] | BasisY;
480
481 float aX = FMath::Abs( X );
482 float aY = FMath::Abs( Y );
483
484 bool bSpinIsX = aX < aY;
485 float Spin0 = bSpinIsX ? X : Y;
486 float Spin1 = bSpinIsX ? Y : X;
487 float Sign1 = Spin1 < 0.0f ? -1.0f : 1.0f;
488
489 //Axis[0] *= Sign1;
490 Scale[0]*= Sign1;
491 Spin0 *= Sign1;
492
493 FVector3f GeneratedY = Axis[2] ^ Axis[0];
494 Scale[1] *= ( Axis[1] | GeneratedY ) < 0.0f ? -Sign1 : Sign1;
495
496#if 1
497 // Avoid sign extension in shader by biasing
498 Rotation[0] = static_cast<uint16>(FMath::RoundToInt( OctZ.X * 32767.0f ) + 32768);
499 Rotation[1] = static_cast<uint16>(FMath::RoundToInt( OctZ.Y * 32767.0f ) + 32768);
500 Rotation[2] = static_cast<uint16>(FMath::RoundToInt( Spin0 * 16383.0f * 1.41421356f )); // sqrt(2)
501
502 Rotation[2] = ( Rotation[2] + 16384 ) & 0x7fff;
503 Rotation[2] |= bSpinIsX ? (1 << 15) : 0;
504#else
505 Rotation[0] = ( FMath::RoundToInt( OctZ.X * 32767.0f ) + 32768 ) << 0;
506 Rotation[0] |= ( FMath::RoundToInt( OctZ.Y * 32767.0f ) + 32768 ) << 16;
507 Rotation[1] = FMath::RoundToInt( Spin0 * 16383.0f * 1.41421356f ); // sqrt(2)
508
509 Rotation[1] = ( Rotation[1] + 16384 ) & 0x7fff;
510 Rotation[1] |= bSpinIsX ? (1 << 15) : 0;
511#endif
512 }
513
514 // Scale
515 {
516 FFloat32 MaxComponent = Scale.GetAbsMax();
517
518 // Need +1 because of losing the implicit leading bit of mantissa
519 // TODO assumes ExpBits == 8
520 // TODO clamp to expressable range
522
523 FFloat32 ExpScale( 1.0f );
524 ExpScale.Components.Exponent = 127 + ExpBias + MantissaBits - SharedExp;
525
526 if( FMath::RoundToInt( MaxComponent.FloatValue * ExpScale.FloatValue ) == (1 << MantissaBits) )
527 {
528 // Mantissa rounded up
529 SharedExp++;
530 ExpScale.FloatValue *= 0.5f;
531 }
532
533#if 0
535 for( int i = 0; i < 3; i++ )
536 {
537 uint32 Mantissa = FMath::RoundToInt( Scale[i] * ExpScale.FloatValue ) + (1 << MantissaBits);
538 Scale_SharedExp |= (uint64)Mantissa << ( SignMantissaBits * i );
539 }
540#else
542 for( int i = 0; i < 3; i++ )
543 {
544 Scale_SharedExp[i] = static_cast<uint16>(FMath::RoundToInt( Scale[i] * ExpScale.FloatValue ) + (1 << MantissaBits));
545 }
546#endif
547 }
548 }
549
551 {
553
554 Out.Origin = Translation;
555
556 // Rotation
557 {
559 float Spin0;
560 OctZ.X = float( (int32)Rotation[0] - 32768 ) * (1.0f / 32767.0f);
561 OctZ.Y = float( (int32)Rotation[1] - 32768 ) * (1.0f / 32767.0f);
562 Spin0 = float( (int32)( Rotation[2] & 0x7fff ) - 16384 ) * (0.70710678f / 16383.0f); // rsqrt(2)
563 bool bSpinIsX = Rotation[2] > 0x7fff;
564
566
569
570 float Spin1 = FMath::Sqrt( 1.0f - Spin0 * Spin0 );
571 float X = bSpinIsX ? Spin0 : Spin1;
572 float Y = bSpinIsX ? Spin1 : Spin0;
573
574 Out.TransformRows[0] = BasisX * X + BasisY * Y;
575 Out.TransformRows[1] = Out.TransformRows[2] ^ Out.TransformRows[0];
576 }
577
578 // Scale
579 {
580 //uint32 SharedExp = Scale_SharedExp >> ( SignMantissaBits * 3 );
582
583 FFloat32 ExpScale( 1.0f );
584 ExpScale.Components.Exponent = 127 - ExpBias - MantissaBits + SharedExp;
585
586#if 0
587 for( int i = 0; i < 3; i++ )
588 {
589 int32 Mantissa = ( Scale_SharedExp >> ( SignMantissaBits * i ) ) & SignMantissaMask;
590 float Scale = Mantissa - (1 << MantissaBits);
591 Scale *= ExpScale.FloatValue;
592 Out.TransformRows[i] *= Scale;
593 }
594#else
595 for( int i = 0; i < 3; i++ )
596 {
597 float Scale = static_cast<float>(int32(Scale_SharedExp[i]) - (1 << MantissaBits));
598 Scale *= ExpScale.FloatValue;
599 Out.TransformRows[i] *= Scale;
600 }
601#endif
602 }
603
604 return Out;
605 }
606};
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define RESTRICT
Definition Platform.h:706
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47
#define FVector
Definition IOSSystemIncludes.h:8
UE::Math::TVector2< float > FVector2f
Definition MathFwd.h:74
UE::Math::TBox< double > FBox
Definition MathFwd.h:55
FBoxSphereBounds3d FBoxSphereBounds
Definition MathFwd.h:142
UE::Math::TVector< float > FVector3f
Definition MathFwd.h:73
#define MAX_flt
Definition NumericLimits.h:29
void GetHemiOrthoBasis(FVector3f &BasisX, FVector3f &BasisY, const FVector3f &BasisZ)
Definition RenderTransform.h:416
FVector3f HemiOctahedronToUnitVector(const FVector2f &Oct)
Definition RenderTransform.h:430
FVector2f UnitVectorToHemiOctahedron(const FVector3f &N)
Definition RenderTransform.h:424
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
FORCEINLINE void VectorDeinterleave(VectorRegister4Float &RESTRICT OutEvens, VectorRegister4Float &RESTRICT OutOdds, const VectorRegister4Float &RESTRICT Lo, const VectorRegister4Float &RESTRICT Hi)
Definition UnrealMathFPU.h:1777
FORCEINLINE VectorRegister4Double VectorLoadFloat3(const double *Ptr)
Definition UnrealMathFPU.h:427
FORCEINLINE VectorRegister4Float VectorMin(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1686
FORCEINLINE VectorRegister4Float VectorMax(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1713
FORCEINLINE VectorRegister4Float VectorCombineLow(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1757
FORCEINLINE void VectorStore(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:566
FORCEINLINE VectorRegister4Float VectorCombineHigh(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:1740
FORCEINLINE VectorRegister4Float VectorSet_W0(const VectorRegister4Float &Vec)
Definition UnrealMathFPU.h:1391
FORCEINLINE VectorRegister4Float VectorLoad(const float *Ptr)
Definition UnrealMathFPU.h:394
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloat(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:175
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
uint32 Size
Definition VulkanMemory.cpp:4034
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition Float32.h:11
uint32 Exponent
Definition Float32.h:24
struct FFloat32::@237::@240 Components
Definition RenderTransform.h:440
static constexpr uint32 SignMantissaMask
Definition RenderTransform.h:444
uint16 Scale_SharedExp[4]
Definition RenderTransform.h:449
static constexpr uint32 ExpBias
Definition RenderTransform.h:442
static constexpr uint32 ExpBits
Definition RenderTransform.h:441
FCompressedTransform()
Definition RenderTransform.h:451
static constexpr uint32 MantissaBits
Definition RenderTransform.h:445
FRenderTransform ToRenderTransform() const
Definition RenderTransform.h:550
static constexpr uint32 SignMantissaBits
Definition RenderTransform.h:443
FCompressedTransform(const FRenderTransform &In)
Definition RenderTransform.h:452
FVector3f Translation
Definition RenderTransform.h:447
uint16 Rotation[4]
Definition RenderTransform.h:448
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
Definition RenderTransform.h:272
FBoxSphereBounds ToBoxSphereBounds() const
Definition RenderTransform.h:306
FVector3f Min
Definition RenderTransform.h:273
FRenderBounds & operator+=(const FVector3f &Other)
Definition RenderTransform.h:318
FVector3f GetExtent() const
Definition RenderTransform.h:358
FRenderBounds(const FVector3f &InMin, const FVector3f &InMax)
Definition RenderTransform.h:283
FRenderBounds(const FBoxSphereBounds &Bounds)
Definition RenderTransform.h:295
friend FArchive & operator<<(FArchive &Ar, FRenderBounds &B)
Definition RenderTransform.h:406
float GetSurfaceArea() const
Definition RenderTransform.h:363
FRenderBounds(const FBox &Box)
Definition RenderTransform.h:289
FVector3f Max
Definition RenderTransform.h:274
float ComputeSquaredDistanceToPoint(const FVector3f &Point) const
Definition RenderTransform.h:392
FBox ToBox() const
Definition RenderTransform.h:301
FRenderBounds & operator=(const FVector3f &Other)
Definition RenderTransform.h:311
bool Equals(const FRenderBounds &Other, float Tolerance=UE_KINDA_SMALL_NUMBER) const
Definition RenderTransform.h:338
RENDERCORE_API FRenderBounds TransformBy(const FMatrix44f &M) const
Definition RenderTransform.cpp:7
const FVector3f & GetMax() const
Definition RenderTransform.h:348
FRenderBounds operator+(const FRenderBounds &Other) const
Definition RenderTransform.h:333
FRenderBounds()
Definition RenderTransform.h:277
const FVector3f & GetMin() const
Definition RenderTransform.h:343
FVector3f GetCenter() const
Definition RenderTransform.h:353
Definition RenderTransform.h:23
bool Equals(const FRenderTransform &Other, float Tolerance=UE_KINDA_SMALL_NUMBER) const
Definition RenderTransform.h:78
void SetIdentity()
Definition RenderTransform.h:244
FMatrix44f ToMatrix44f() const
Definition RenderTransform.h:87
FRenderTransform(const FRenderTransform &)=default
FRenderTransform(FRenderTransform &&)=default
bool IsScaleNonUniform() const
Definition RenderTransform.h:212
FRenderTransform Inverse() const
Definition RenderTransform.h:190
void Orthogonalize()
Definition RenderTransform.h:223
FVector3f GetScale() const
Definition RenderTransform.h:202
FRenderTransform(const FMatrix44f &M)
Definition RenderTransform.h:42
FRenderTransform InverseFast() const
Definition RenderTransform.h:196
FRenderTransform(const FVector3f &InXAxis, const FVector3f &InYAxis, const FVector3f &InZAxis, const FVector3f &InOrigin)
Definition RenderTransform.h:34
FRenderTransform & operator=(const FMatrix44f &From)
Definition RenderTransform.h:59
FRenderTransform & operator=(FRenderTransform &&)=default
friend FArchive & operator<<(FArchive &Ar, FRenderTransform &T)
Definition RenderTransform.h:259
FRenderTransform & operator=(const FMatrix44d &From)
Definition RenderTransform.h:68
float RotDeterminant() const
Definition RenderTransform.h:182
FRenderTransform operator*(const FRenderTransform &Other) const
Definition RenderTransform.h:167
FRenderTransform()=default
void To3x4MatrixTranspose(float *Result) const
Definition RenderTransform.h:127
FVector3f TransformRows[3]
Definition RenderTransform.h:24
FRenderTransform & operator=(const FRenderTransform &)=default
static RENDERCORE_API FRenderTransform Identity
Definition RenderTransform.h:268
FRenderTransform(const FMatrix44d &M)
Definition RenderTransform.h:50
FVector3f Origin
Definition RenderTransform.h:25
FMatrix ToMatrix() const
Definition RenderTransform.h:122
Definition BoxSphereBounds.h:25
TVector< TExtent > BoxExtent
Definition BoxSphereBounds.h:32
TVector< T > Origin
Definition BoxSphereBounds.h:29
TMatrix< T > Inverse() const
Definition Matrix.inl:384
T M[4][4]
Definition Matrix.h:49
TMatrix< T > InverseFast() const
Definition Matrix.inl:357
T X
Definition Vector2D.h:49
T Z
Definition Vector.h:68
TVector< T > GetUnsafeNormal() const
Definition Vector.h:1841
T Y
Definition Vector.h:65
static CORE_API const TVector< float > ZeroVector
Definition Vector.h:79
static TVector< float > Max(const TVector< float > &A, const TVector< float > &B)
Definition Vector.h:2506
T X
Definition Vector.h:62
UE_FORCEINLINE_HINT bool Equals(const TVector< T > &V, T Tolerance=UE_KINDA_SMALL_NUMBER) const
Definition Vector.h:1601
T Size() const
Definition Vector.h:1716
Definition UnrealMathFPU.h:42
Definition UnrealMathFPU.h:20