MathgeomGLS
560 строк · 28.6 Кб
1const
2{$IFDEF FM_COLUMN_MAJOR}3LIB_FASTMATH = 'FastMathMacOS64CM.obj';4{$ELSE}5LIB_FASTMATH = 'FastMathMacOS64RM.obj';6{$ENDIF}7
8{ Angle and Trigonometry Functions }
9
10function Radians(const ADegrees: Single): Single;11begin
12Result := ADegrees * (Pi / 180);13end;14
15function Radians(const ADegrees: TVector2): TVector2; external LIB_FASTMATH name 'radians_vector2';16function Radians(const ADegrees: TVector3): TVector3; external LIB_FASTMATH name 'radians_vector3';17function Radians(const ADegrees: TVector4): TVector4; external LIB_FASTMATH name 'radians_vector4';18
19function Degrees(const ARadians: Single): Single;20begin
21Result := ARadians * (180 / Pi);22end;23
24function Degrees(const ARadians: TVector2): TVector2; external LIB_FASTMATH name 'degrees_vector2';25function Degrees(const ARadians: TVector3): TVector3; external LIB_FASTMATH name 'degrees_vector3';26function Degrees(const ARadians: TVector4): TVector4; external LIB_FASTMATH name 'degrees_vector4';27
28{ Exponential Functions }
29
30function Sqrt(const A: Single): Single; external LIB_FASTMATH name 'sqrt_single';31function Sqrt(const A: TVector2): TVector2; external LIB_FASTMATH name 'sqrt_vector2';32function Sqrt(const A: TVector3): TVector3; external LIB_FASTMATH name 'sqrt_vector3';33function Sqrt(const A: TVector4): TVector4; external LIB_FASTMATH name 'sqrt_vector4';34
35function InverseSqrt(const A: Single): Single; external LIB_FASTMATH name 'inverse_sqrt_single';36function InverseSqrt(const A: TVector2): TVector2; external LIB_FASTMATH name 'inverse_sqrt_vector2';37function InverseSqrt(const A: TVector3): TVector3; external LIB_FASTMATH name 'inverse_sqrt_vector3';38function InverseSqrt(const A: TVector4): TVector4; external LIB_FASTMATH name 'inverse_sqrt_vector4';39
40{ Fast approximate Functions }
41
42function FastSin(const ARadians: Single): Single; external LIB_FASTMATH name 'fast_sin_single';43function FastSin(const ARadians: TVector2): TVector2; external LIB_FASTMATH name 'fast_sin_vector2';44function FastSin(const ARadians: TVector3): TVector3; external LIB_FASTMATH name 'fast_sin_vector3';45function FastSin(const ARadians: TVector4): TVector4; external LIB_FASTMATH name 'fast_sin_vector4';46
47function FastCos(const ARadians: Single): Single; external LIB_FASTMATH name 'fast_cos_single';48function FastCos(const ARadians: TVector2): TVector2; external LIB_FASTMATH name 'fast_cos_vector2';49function FastCos(const ARadians: TVector3): TVector3; external LIB_FASTMATH name 'fast_cos_vector3';50function FastCos(const ARadians: TVector4): TVector4; external LIB_FASTMATH name 'fast_cos_vector4';51
52procedure FastSinCos(const ARadians: Single; out ASin, ACos: Single); external LIB_FASTMATH name 'fast_sin_cos_single';53procedure FastSinCos(const ARadians: TVector2; out ASin, ACos: TVector2); external LIB_FASTMATH name 'fast_sin_cos_vector2';54procedure FastSinCos(const ARadians: TVector3; out ASin, ACos: TVector3); external LIB_FASTMATH name 'fast_sin_cos_vector3';55procedure FastSinCos(const ARadians: TVector4; out ASin, ACos: TVector4); external LIB_FASTMATH name 'fast_sin_cos_vector4';56
57function FastExp(const A: Single): Single; external LIB_FASTMATH name 'fast_exp_single';58function FastExp(const A: TVector2): TVector2; external LIB_FASTMATH name 'fast_exp_vector2';59function FastExp(const A: TVector3): TVector3; external LIB_FASTMATH name 'fast_exp_vector3';60function FastExp(const A: TVector4): TVector4; external LIB_FASTMATH name 'fast_exp_vector4';61
62function FastLn(const A: Single): Single; external LIB_FASTMATH name 'fast_ln_single';63function FastLn(const A: TVector2): TVector2; external LIB_FASTMATH name 'fast_ln_vector2';64function FastLn(const A: TVector3): TVector3; external LIB_FASTMATH name 'fast_ln_vector3';65function FastLn(const A: TVector4): TVector4; external LIB_FASTMATH name 'fast_ln_vector4';66
67function FastLog2(const A: Single): Single; external LIB_FASTMATH name 'fast_log2_single';68function FastLog2(const A: TVector2): TVector2; external LIB_FASTMATH name 'fast_log2_vector2';69function FastLog2(const A: TVector3): TVector3; external LIB_FASTMATH name 'fast_log2_vector3';70function FastLog2(const A: TVector4): TVector4; external LIB_FASTMATH name 'fast_log2_vector4';71
72function FastExp2(const A: Single): Single; external LIB_FASTMATH name 'fast_exp2_single';73function FastExp2(const A: TVector2): TVector2; external LIB_FASTMATH name 'fast_exp2_vector2';74function FastExp2(const A: TVector3): TVector3; external LIB_FASTMATH name 'fast_exp2_vector3';75function FastExp2(const A: TVector4): TVector4; external LIB_FASTMATH name 'fast_exp2_vector4';76
77{ Common Functions }
78
79function Abs(const A: Single): Single;80begin
81Result := System.Abs(A);82end;83
84function Abs(const A: TVector2): TVector2;85begin
86Result.Init(System.Abs(A.X), System.Abs(A.Y));87end;88
89function Abs(const A: TVector3): TVector3; external LIB_FASTMATH name 'abs_vector3';90function Abs(const A: TVector4): TVector4; external LIB_FASTMATH name 'abs_vector4';91
92function Sign(const A: Single): Single; external LIB_FASTMATH name 'sign_single';93function Sign(const A: TVector2): TVector2; external LIB_FASTMATH name 'sign_vector2';94function Sign(const A: TVector3): TVector3; external LIB_FASTMATH name 'sign_vector3';95function Sign(const A: TVector4): TVector4; external LIB_FASTMATH name 'sign_vector4';96
97function Floor(const A: Single): Integer; external LIB_FASTMATH name 'floor_single';98function Floor(const A: TVector2): TIVector2; external LIB_FASTMATH name 'floor_vector2';99function Floor(const A: TVector3): TIVector3; external LIB_FASTMATH name 'floor_vector3';100function Floor(const A: TVector4): TIVector4; external LIB_FASTMATH name 'floor_vector4';101
102function Trunc(const A: Single): Integer; external LIB_FASTMATH name 'trunc_single';103function Trunc(const A: TVector2): TIVector2; external LIB_FASTMATH name 'trunc_vector2';104function Trunc(const A: TVector3): TIVector3; external LIB_FASTMATH name 'trunc_vector3';105function Trunc(const A: TVector4): TIVector4; external LIB_FASTMATH name 'trunc_vector4';106
107function Round(const A: Single): Integer; external LIB_FASTMATH name 'round_single';108function Round(const A: TVector2): TIVector2; external LIB_FASTMATH name 'round_vector2';109function Round(const A: TVector3): TIVector3; external LIB_FASTMATH name 'round_vector3';110function Round(const A: TVector4): TIVector4; external LIB_FASTMATH name 'round_vector4';111
112function Ceil(const A: Single): Integer; external LIB_FASTMATH name 'ceil_single';113function Ceil(const A: TVector2): TIVector2; external LIB_FASTMATH name 'ceil_vector2';114function Ceil(const A: TVector3): TIVector3; external LIB_FASTMATH name 'ceil_vector3';115function Ceil(const A: TVector4): TIVector4; external LIB_FASTMATH name 'ceil_vector4';116
117function Frac(const A: Single): Single;118begin
119Result := System.Frac(A);120end;121
122function Frac(const A: TVector2): TVector2; external LIB_FASTMATH name 'frac_vector2';123function Frac(const A: TVector3): TVector3; external LIB_FASTMATH name 'frac_vector3';124function Frac(const A: TVector4): TVector4; external LIB_FASTMATH name 'frac_vector4';125
126function FMod(const A, B: Single): Single;127begin
128Result := A - (B * Trunc(A / B));129end;130
131function FMod(const A: TVector2; const B: Single): TVector2; external LIB_FASTMATH name 'fmod_vector2_single';132function FMod(const A, B: TVector2): TVector2; external LIB_FASTMATH name 'fmod_vector2';133function FMod(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'fmod_vector3_single';134function FMod(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'fmod_vector3';135function FMod(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'fmod_vector4_single';136function FMod(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'fmod_vector4';137
138function ModF(const A: Single; out B: Integer): Single;139begin
140B := Trunc(A);141Result := Frac(A);142end;143
144function ModF(const A: TVector2; out B: TIVector2): TVector2; external LIB_FASTMATH name 'modf_vector2';145function ModF(const A: TVector3; out B: TIVector3): TVector3; external LIB_FASTMATH name 'modf_vector3';146function ModF(const A: TVector4; out B: TIVector4): TVector4; external LIB_FASTMATH name 'modf_vector4';147
148function Min(const A: TVector2; const B: Single): TVector2; external LIB_FASTMATH name 'min_vector2_single';149function Min(const A, B: TVector2): TVector2; external LIB_FASTMATH name 'min_vector2';150function Min(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'min_vector3_single';151function Min(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'min_vector3';152function Min(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'min_vector4_single';153function Min(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'min_vector4';154
155function Max(const A: TVector2; const B: Single): TVector2; external LIB_FASTMATH name 'max_vector2_single';156function Max(const A, B: TVector2): TVector2; external LIB_FASTMATH name 'max_vector2';157function Max(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'max_vector3_single';158function Max(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'max_vector3';159function Max(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'max_vector4_single';160function Max(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'max_vector4';161
162function EnsureRange(const A, AMin, AMax: Single): Single; external LIB_FASTMATH name 'ensure_range_single';163function EnsureRange(const A: TVector2; const AMin, AMax: Single): TVector2; external LIB_FASTMATH name 'ensure_range_vector2_single';164function EnsureRange(const A, AMin, AMax: TVector2): TVector2; external LIB_FASTMATH name 'ensure_range_vector2';165function EnsureRange(const A: TVector3; const AMin, AMax: Single): TVector3; external LIB_FASTMATH name 'ensure_range_vector3_single';166function EnsureRange(const A, AMin, AMax: TVector3): TVector3; external LIB_FASTMATH name 'ensure_range_vector3';167function EnsureRange(const A: TVector4; const AMin, AMax: Single): TVector4; external LIB_FASTMATH name 'ensure_range_vector4_single';168function EnsureRange(const A, AMin, AMax: TVector4): TVector4; external LIB_FASTMATH name 'ensure_range_vector4';169
170function Mix(const A, B: TVector2; const T: Single): TVector2;171begin
172Result.Init(Mix(A.X, B.X, T), Mix(A.Y, B.Y, T));173end;174
175function Mix(const A, B, T: TVector2): TVector2;176begin
177Result.Init(Mix(A.X, B.X, T.X), Mix(A.Y, B.Y, T.Y));178end;179
180function Mix(const A, B: TVector3; const T: Single): TVector3; external LIB_FASTMATH name 'mix_vector3_single';181function Mix(const A, B, T: TVector3): TVector3; external LIB_FASTMATH name 'mix_vector3';182function Mix(const A, B: TVector4; const T: Single): TVector4; external LIB_FASTMATH name 'mix_vector4_single';183function Mix(const A, B, T: TVector4): TVector4; external LIB_FASTMATH name 'mix_vector4';184
185function Step(const AEdge: Single; const A: TVector2): TVector2; external LIB_FASTMATH name 'step_single_vector2';186function Step(const AEdge, A: TVector2): TVector2; external LIB_FASTMATH name 'step_vector2';187function Step(const AEdge: Single; const A: TVector3): TVector3; external LIB_FASTMATH name 'step_single_vector3';188function Step(const AEdge, A: TVector3): TVector3; external LIB_FASTMATH name 'step_vector3';189function Step(const AEdge: Single; const A: TVector4): TVector4; external LIB_FASTMATH name 'step_single_vector4';190function Step(const AEdge, A: TVector4): TVector4; external LIB_FASTMATH name 'step_vector4';191
192function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector2): TVector2;193begin
194Result.Init(SmoothStep(AEdge0, AEdge1, A.X), SmoothStep(AEdge0, AEdge1, A.Y));195end;196
197function SmoothStep(const AEdge0, AEdge1, A: TVector2): TVector2;198begin
199Result.Init(SmoothStep(AEdge0.X, AEdge1.X, A.X), SmoothStep(AEdge0.Y, AEdge1.Y, A.Y));200end;201
202function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector3): TVector3; external LIB_FASTMATH name 'smooth_step_single_vector3';203function SmoothStep(const AEdge0, AEdge1, A: TVector3): TVector3; external LIB_FASTMATH name 'smooth_step_vector3';204function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector4): TVector4; external LIB_FASTMATH name 'smooth_step_single_vector4';205function SmoothStep(const AEdge0, AEdge1, A: TVector4): TVector4; external LIB_FASTMATH name 'smooth_step_vector4';206
207function FMA(const A, B, C: TVector2): TVector2; external LIB_FASTMATH name 'fma_vector2';208function FMA(const A, B, C: TVector3): TVector3; external LIB_FASTMATH name 'fma_vector3';209function FMA(const A, B, C: TVector4): TVector4; external LIB_FASTMATH name 'fma_vector4';210
211{ Matrix functions }
212
213function OuterProduct(const C, R: TVector2): TMatrix2; external LIB_FASTMATH name 'outer_product_matrix2';214function OuterProduct(const C, R: TVector3): TMatrix3; external LIB_FASTMATH name 'outer_product_matrix3';215function OuterProduct(const C, R: TVector4): TMatrix4; external LIB_FASTMATH name 'outer_product_matrix4';216
217{ TVector2 }
218
219class operator TVector2.Add(const A: TVector2; const B: Single): TVector2;220begin
221Result.X := A.X + B;222Result.Y := A.Y + B;223end;224
225class operator TVector2.Add(const A: Single; const B: TVector2): TVector2;226begin
227Result.X := A + B.X;228Result.Y := A + B.Y;229end;230
231class operator TVector2.Add(const A, B: TVector2): TVector2;232begin
233Result.X := A.X + B.X;234Result.Y := A.Y + B.Y;235end;236
237function TVector2.Distance(const AOther: TVector2): Single;238begin
239Result := (Self - AOther).Length;240end;241
242function TVector2.DistanceSquared(const AOther: TVector2): Single;243begin
244Result := (Self - AOther).LengthSquared;245end;246
247class operator TVector2.Divide(const A: TVector2; const B: Single): TVector2; external LIB_FASTMATH name 'vector2_div_single';248class operator TVector2.Divide(const A: Single; const B: TVector2): TVector2; external LIB_FASTMATH name 'single_div_vector2';249class operator TVector2.Divide(const A, B: TVector2): TVector2; external LIB_FASTMATH name 'vector2_div_vector2';250
251function TVector2.Dot(const AOther: TVector2): Single;252begin
253Result := (X * AOther.X) + (Y * AOther.Y);254end;255
256function TVector2.FaceForward(const I, NRef: TVector2): TVector2;257begin
258if (NRef.Dot(I) < 0) then259Result := Self260else261Result := -Self;262end;263
264function TVector2.GetLength: Single;265begin
266Result := Sqrt((X * X) + (Y * Y));267end;268
269function TVector2.GetLengthSquared: Single;270begin
271Result := (X * X) + (Y * Y);272end;273
274class operator TVector2.Multiply(const A: TVector2; const B: Single): TVector2;275begin
276Result.X := A.X * B;277Result.Y := A.Y * B;278end;279
280class operator TVector2.Multiply(const A: Single; const B: TVector2): TVector2;281begin
282Result.X := A * B.X;283Result.Y := A * B.Y;284end;285
286class operator TVector2.Multiply(const A, B: TVector2): TVector2;287begin
288Result.X := A.X * B.X;289Result.Y := A.Y * B.Y;290end;291
292function TVector2.NormalizeFast: TVector2; external LIB_FASTMATH name 'vector2_normalize_fast';293
294function TVector2.Reflect(const N: TVector2): TVector2;295begin
296Result := Self - ((2 * N.Dot(Self)) * N);297end;298
299function TVector2.Refract(const N: TVector2; const Eta: Single): TVector2;300var
301D, K: Single;302begin
303D := N.Dot(Self);304K := 1 - Eta * Eta * (1 - D * D);305if (K < 0) then306Result.Init307else308Result := (Eta * Self) - ((Eta * D + Sqrt(K)) * N);309end;310
311procedure TVector2.SetNormalizedFast; external LIB_FASTMATH name 'vector2_set_normalized_fast';312
313class operator TVector2.Subtract(const A: TVector2; const B: Single): TVector2;314begin
315Result.X := A.X - B;316Result.Y := A.Y - B;317end;318
319class operator TVector2.Subtract(const A: Single; const B: TVector2): TVector2;320begin
321Result.X := A - B.X;322Result.Y := A - B.Y;323end;324
325class operator TVector2.Subtract(const A, B: TVector2): TVector2;326begin
327Result.X := A.X - B.X;328Result.Y := A.Y - B.Y;329end;330
331{ TVector3 }
332
333class operator TVector3.Add(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'vector3_add_single';334class operator TVector3.Add(const A: Single; const B: TVector3): TVector3; external LIB_FASTMATH name 'single_add_vector3';335class operator TVector3.Add(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'vector3_add_vector3';336
337function TVector3.Distance(const AOther: TVector3): Single; external LIB_FASTMATH name 'vector3_distance';338function TVector3.DistanceSquared(const AOther: TVector3): Single; external LIB_FASTMATH name 'vector3_distance_squared';339
340class operator TVector3.Divide(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'vector3_div_single';341class operator TVector3.Divide(const A: Single; const B: TVector3): TVector3; external LIB_FASTMATH name 'single_div_vector3';342class operator TVector3.Divide(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'vector3_div_vector3';343
344function TVector3.Cross(const AOther: TVector3): TVector3;345begin
346Result.X := (Y * AOther.Z) - (AOther.Y * Z);347Result.Y := (Z * AOther.X) - (AOther.Z * X);348Result.Z := (X * AOther.Y) - (AOther.X * Y);349end;350
351function TVector3.Dot(const AOther: TVector3): Single;352begin
353Result := (X * AOther.X) + (Y * AOther.Y) + (Z * AOther.Z);354end;355
356function TVector3.FaceForward(const I, NRef: TVector3): TVector3;357begin
358if (NRef.Dot(I) < 0) then359Result := Self360else361Result := -Self;362end;363
364function TVector3.GetLength: Single; external LIB_FASTMATH name 'vector3_get_length';365function TVector3.GetLengthSquared: Single; external LIB_FASTMATH name 'vector3_get_length_squared';366
367class operator TVector3.Multiply(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'vector3_mul_single';368class operator TVector3.Multiply(const A: Single; const B: TVector3): TVector3; external LIB_FASTMATH name 'single_mul_vector3';369class operator TVector3.Multiply(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'vector3_mul_vector3';370
371class operator TVector3.Negative(const A: TVector3): TVector3;372begin
373Result.X := -A.X;374Result.Y := -A.Y;375Result.Z := -A.Z;376end;377
378function TVector3.NormalizeFast: TVector3; external LIB_FASTMATH name 'vector3_normalize_fast';379procedure TVector3.SetNormalizedFast; external LIB_FASTMATH name 'vector3_set_normalized_fast';380
381function TVector3.Reflect(const N: TVector3): TVector3; external LIB_FASTMATH name 'vector3_reflect';382function TVector3.Refract(const N: TVector3; const Eta: Single): TVector3; external LIB_FASTMATH name 'vector3_refract';383
384class operator TVector3.Subtract(const A: TVector3; const B: Single): TVector3; external LIB_FASTMATH name 'vector3_sub_single';385class operator TVector3.Subtract(const A: Single; const B: TVector3): TVector3; external LIB_FASTMATH name 'single_sub_vector3';386class operator TVector3.Subtract(const A, B: TVector3): TVector3; external LIB_FASTMATH name 'vector3_sub_vector3';387
388{ TVector4 }
389
390class operator TVector4.Add(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'vector4_add_single';391class operator TVector4.Add(const A: Single; const B: TVector4): TVector4; external LIB_FASTMATH name 'single_add_vector4';392class operator TVector4.Add(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'vector4_add_vector4';393
394function TVector4.Distance(const AOther: TVector4): Single; external LIB_FASTMATH name 'vector4_distance';395function TVector4.DistanceSquared(const AOther: TVector4): Single; external LIB_FASTMATH name 'vector4_distance_squared';396
397class operator TVector4.Divide(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'vector4_div_single';398class operator TVector4.Divide(const A: Single; const B: TVector4): TVector4; external LIB_FASTMATH name 'single_div_vector4';399class operator TVector4.Divide(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'vector4_div_vector4';400
401function TVector4.Dot(const AOther: TVector4): Single;402begin
403Result := (X * AOther.X) + (Y * AOther.Y) + (Z * AOther.Z) + (W * AOther.W);404end;405
406function TVector4.FaceForward(const I, NRef: TVector4): TVector4; external LIB_FASTMATH name 'vector4_face_forward';407
408function TVector4.GetLength: Single; external LIB_FASTMATH name 'vector4_get_length';409function TVector4.GetLengthSquared: Single; external LIB_FASTMATH name 'vector4_get_length_squared';410
411class operator TVector4.Multiply(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'vector4_mul_single';412class operator TVector4.Multiply(const A: Single; const B: TVector4): TVector4; external LIB_FASTMATH name 'single_mul_vector4';413class operator TVector4.Multiply(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'vector4_mul_vector4';414
415class operator TVector4.Negative(const A: TVector4): TVector4; external LIB_FASTMATH name 'vector4_negative';416
417function TVector4.NormalizeFast: TVector4; external LIB_FASTMATH name 'vector4_normalize_fast';418procedure TVector4.SetNormalizedFast; external LIB_FASTMATH name 'vector4_set_normalized_fast';419
420function TVector4.Reflect(const N: TVector4): TVector4; external LIB_FASTMATH name 'vector4_reflect';421function TVector4.Refract(const N: TVector4; const Eta: Single): TVector4; external LIB_FASTMATH name 'vector4_refract';422
423class operator TVector4.Subtract(const A: TVector4; const B: Single): TVector4; external LIB_FASTMATH name 'vector4_sub_single';424class operator TVector4.Subtract(const A: Single; const B: TVector4): TVector4; external LIB_FASTMATH name 'single_sub_vector4';425class operator TVector4.Subtract(const A, B: TVector4): TVector4; external LIB_FASTMATH name 'vector4_sub_vector4';426
427{ TQuaternion }
428
429class operator TQuaternion.Add(const A, B: TQuaternion): TQuaternion; external LIB_FASTMATH name 'vector4_add_vector4';430
431function TQuaternion.GetLength: Single; external LIB_FASTMATH name 'vector4_get_length';432
433function TQuaternion.GetLengthSquared: Single;434begin
435Result := (X * X) + (Y * Y) + (Z * Z) + (W * W);436end;437
438class operator TQuaternion.Multiply(const A: TQuaternion; const B: Single): TQuaternion; external LIB_FASTMATH name 'vector4_mul_single';439class operator TQuaternion.Multiply(const A: Single; const B: TQuaternion): TQuaternion; external LIB_FASTMATH name 'single_mul_vector4';440
441class operator TQuaternion.Multiply(const A, B: TQuaternion): TQuaternion;442begin
443Result.X := (A.W * B.X) + (A.X * B.W) + (A.Y * B.Z) - (A.Z * B.Y);444Result.Y := (A.W * B.Y) + (A.Y * B.W) + (A.Z * B.X) - (A.X * B.Z);445Result.Z := (A.W * B.Z) + (A.Z * B.W) + (A.X * B.Y) - (A.Y * B.X);446Result.W := (A.W * B.W) - (A.X * B.X) - (A.Y * B.Y) - (A.Z * B.Z);447end;448
449function TQuaternion.NormalizeFast: TQuaternion; external LIB_FASTMATH name 'vector4_normalize_fast';450procedure TQuaternion.SetNormalizedFast; external LIB_FASTMATH name 'vector4_set_normalized_fast';451
452{ TMatrix 2 }
453
454class operator TMatrix2.Add(const A: TMatrix2; const B: Single): TMatrix2; external LIB_FASTMATH name 'vector4_add_single';455class operator TMatrix2.Add(const A: Single; const B: TMatrix2): TMatrix2; external LIB_FASTMATH name 'single_add_vector4';456class operator TMatrix2.Add(const A, B: TMatrix2): TMatrix2; external LIB_FASTMATH name 'vector4_add_vector4';457
458function TMatrix2.CompMult(const AOther: TMatrix2): TMatrix2; external LIB_FASTMATH name 'vector4_mul_vector4';459
460class operator TMatrix2.Divide(const A: Single; const B: TMatrix2): TMatrix2; external LIB_FASTMATH name 'single_div_vector4';461class operator TMatrix2.Divide(const A: TMatrix2; const B: Single): TMatrix2; external LIB_FASTMATH name 'vector4_div_single';462
463class operator TMatrix2.Multiply(const A: Single; const B: TMatrix2): TMatrix2; external LIB_FASTMATH name 'single_mul_vector4';464class operator TMatrix2.Multiply(const A: TMatrix2; const B: Single): TMatrix2; external LIB_FASTMATH name 'vector4_mul_single';465
466class operator TMatrix2.Multiply(const A: TVector2; const B: TMatrix2): TVector2;467begin
468Result.X := (A.X * B.M[0,0]) + (A.Y * B.M[0,1]);469Result.Y := (A.X * B.M[1,0]) + (A.Y * B.M[1,1]);470end;471
472class operator TMatrix2.Multiply(const A: TMatrix2; const B: TVector2): TVector2;473begin
474Result.X := (A.M[0,0] * B.X) + (A.M[1,0] * B.Y);475Result.Y := (A.M[0,1] * B.X) + (A.M[1,1] * B.Y);476end;477
478class operator TMatrix2.Multiply(const A, B: TMatrix2): TMatrix2;479begin
480Result.M[0,0] := (A.M[0,0] * B.M[0,0]) + (A.M[1,0] * B.M[0,1]);481Result.M[0,1] := (A.M[0,1] * B.M[0,0]) + (A.M[1,1] * B.M[0,1]);482Result.M[1,0] := (A.M[0,0] * B.M[1,0]) + (A.M[1,0] * B.M[1,1]);483Result.M[1,1] := (A.M[0,1] * B.M[1,0]) + (A.M[1,1] * B.M[1,1]);484end;485
486class operator TMatrix2.Negative(const A: TMatrix2): TMatrix2; external LIB_FASTMATH name 'vector4_negative';487
488function TMatrix2.Transpose: TMatrix2;489begin
490Result.M[0,0] := M[0,0];491Result.M[0,1] := M[1,0];492
493Result.M[1,0] := M[0,1];494Result.M[1,1] := M[1,1];495end;496
497procedure TMatrix2.SetTransposed;498begin
499Self := Transpose;500end;501
502class operator TMatrix2.Subtract(const A: TMatrix2; const B: Single): TMatrix2; external LIB_FASTMATH name 'vector4_sub_single';503class operator TMatrix2.Subtract(const A: Single; const B: TMatrix2): TMatrix2; external LIB_FASTMATH name 'single_sub_vector4';504class operator TMatrix2.Subtract(const A, B: TMatrix2): TMatrix2; external LIB_FASTMATH name 'vector4_sub_vector4';505
506{ TMatrix3 }
507
508class operator TMatrix3.Add(const A: TMatrix3; const B: Single): TMatrix3; external LIB_FASTMATH name 'matrix3_add_single';509class operator TMatrix3.Add(const A: Single; const B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'single_add_matrix3';510class operator TMatrix3.Add(const A, B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'matrix3_add_matrix3';511
512function TMatrix3.CompMult(const AOther: TMatrix3): TMatrix3; external LIB_FASTMATH name 'matrix3_comp_mult';513
514class operator TMatrix3.Divide(const A: Single; const B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'single_div_matrix3';515class operator TMatrix3.Divide(const A: TMatrix3; const B: Single): TMatrix3; external LIB_FASTMATH name 'matrix3_div_single';516
517class operator TMatrix3.Multiply(const A: Single; const B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'single_mul_matrix3';518class operator TMatrix3.Multiply(const A: TMatrix3; const B: Single): TMatrix3; external LIB_FASTMATH name 'matrix3_mul_single';519class operator TMatrix3.Multiply(const A: TMatrix3; const B: TVector3): TVector3; external LIB_FASTMATH name 'matrix3_mul_vector3';520class operator TMatrix3.Multiply(const A: TVector3; const B: TMatrix3): TVector3; external LIB_FASTMATH name 'vector3_mul_matrix3';521class operator TMatrix3.Multiply(const A, B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'matrix3_mul_matrix3';522
523class operator TMatrix3.Negative(const A: TMatrix3): TMatrix3; external LIB_FASTMATH name 'matrix3_negative';524
525procedure TMatrix3.SetTransposed; external LIB_FASTMATH name 'matrix3_set_transposed';526
527class operator TMatrix3.Subtract(const A: TMatrix3; const B: Single): TMatrix3; external LIB_FASTMATH name 'matrix3_sub_single';528class operator TMatrix3.Subtract(const A: Single; const B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'single_sub_matrix3';529class operator TMatrix3.Subtract(const A, B: TMatrix3): TMatrix3; external LIB_FASTMATH name 'matrix3_sub_matrix3';530
531function TMatrix3.Transpose: TMatrix3; external LIB_FASTMATH name 'matrix3_transpose';532
533{ TMatrix 4 }
534
535class operator TMatrix4.Add(const A: TMatrix4; const B: Single): TMatrix4; external LIB_FASTMATH name 'matrix4_add_single';536class operator TMatrix4.Add(const A: Single; const B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'single_add_matrix4';537class operator TMatrix4.Add(const A, B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'matrix4_add_matrix4';538
539function TMatrix4.CompMult(const AOther: TMatrix4): TMatrix4; external LIB_FASTMATH name 'matrix4_comp_mult';540
541class operator TMatrix4.Divide(const A: TMatrix4; const B: Single): TMatrix4; external LIB_FASTMATH name 'matrix4_div_single';542class operator TMatrix4.Divide(const A: Single; const B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'single_div_matrix4';543
544function TMatrix4.Inverse: TMatrix4; external LIB_FASTMATH name 'matrix4_inverse';545procedure TMatrix4.SetInversed; external LIB_FASTMATH name 'matrix4_set_inversed';546
547class operator TMatrix4.Multiply(const A: TMatrix4; const B: Single): TMatrix4; external LIB_FASTMATH name 'matrix4_mul_single';548class operator TMatrix4.Multiply(const A: Single; const B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'single_mul_matrix4';549class operator TMatrix4.Multiply(const A: TMatrix4; const B: TVector4): TVector4; external LIB_FASTMATH name 'matrix4_mul_vector4';550class operator TMatrix4.Multiply(const A: TVector4; const B: TMatrix4): TVector4; external LIB_FASTMATH name 'vector4_mul_matrix4';551class operator TMatrix4.Multiply(const A, B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'matrix4_mul_matrix4';552
553class operator TMatrix4.Negative(const A: TMatrix4): TMatrix4; external LIB_FASTMATH name 'matrix4_negative';554
555class operator TMatrix4.Subtract(const A: TMatrix4; const B: Single): TMatrix4; external LIB_FASTMATH name 'matrix4_sub_single';556class operator TMatrix4.Subtract(const A: Single; const B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'single_sub_matrix4';557class operator TMatrix4.Subtract(const A, B: TMatrix4): TMatrix4; external LIB_FASTMATH name 'matrix4_sub_matrix4';558
559function TMatrix4.Transpose: TMatrix4; external LIB_FASTMATH name 'matrix4_transpose';560procedure TMatrix4.SetTransposed; external LIB_FASTMATH name 'matrix4_set_transposed';561
562