MathgeomGLS
1399 строк · 30.4 Кб
1{ Angle and Trigonometry Functions }
2
3function Radians(const ADegrees: Single): Single;
4begin
5Result := _radians_scalar(ADegrees);
6end;
7
8function Radians(const ADegrees: TVector2): TVector2;
9begin
10_radians_vector2(@ADegrees, @Result);
11end;
12
13function Radians(const ADegrees: TVector3): TVector3;
14begin
15_radians_vector3(@ADegrees, @Result);
16end;
17
18function Radians(const ADegrees: TVector4): TVector4;
19begin
20_radians_vector4(@ADegrees, @Result);
21end;
22
23function Degrees(const ARadians: Single): Single;
24begin
25Result := _degrees_scalar(ARadians);
26end;
27
28function Degrees(const ARadians: TVector2): TVector2;
29begin
30_degrees_vector2(@ARadians, @Result);
31end;
32
33function Degrees(const ARadians: TVector3): TVector3;
34begin
35_degrees_vector3(@ARadians, @Result);
36end;
37
38function Degrees(const ARadians: TVector4): TVector4;
39begin
40_degrees_vector4(@ARadians, @Result);
41end;
42
43{ Exponential Functions }
44
45function Sqrt(const A: Single): Single;
46begin
47Result := _sqrt_scalar(A);
48end;
49
50function Sqrt(const A: TVector2): TVector2;
51begin
52_sqrt_vector2(@A, @Result);
53end;
54
55function Sqrt(const A: TVector3): TVector3;
56begin
57_sqrt_vector3(@A, @Result);
58end;
59
60function Sqrt(const A: TVector4): TVector4;
61begin
62_sqrt_vector4(@A, @Result);
63end;
64
65function InverseSqrt(const A: Single): Single;
66begin
67Result := _inverse_sqrt_scalar(A);
68end;
69
70function InverseSqrt(const A: TVector2): TVector2;
71begin
72_inverse_sqrt_vector2(@A, @Result);
73end;
74
75function InverseSqrt(const A: TVector3): TVector3;
76begin
77_inverse_sqrt_vector3(@A, @Result);
78end;
79
80function InverseSqrt(const A: TVector4): TVector4;
81begin
82_inverse_sqrt_vector4(@A, @Result);
83end;
84
85{ Fast approximate Functions }
86
87function FastSin(const ARadians: Single): Single;
88var
89C: Single;
90begin
91_fast_sincos_scalar(ARadians, @Result, @C);
92end;
93
94function FastSin(const ARadians: TVector2): TVector2;
95var
96C: TVector2;
97begin
98_fast_sincos_vector2(@ARadians, @Result, @C);
99end;
100
101function FastSin(const ARadians: TVector3): TVector3;
102var
103C: TVector3;
104begin
105_fast_sincos_vector3(@ARadians, @Result, @C);
106end;
107
108function FastSin(const ARadians: TVector4): TVector4;
109var
110C: TVector4;
111begin
112_fast_sincos_vector4(@ARadians, @Result, @C);
113end;
114
115function FastCos(const ARadians: Single): Single;
116var
117S: Single;
118begin
119_fast_sincos_scalar(ARadians, @S, @Result);
120end;
121
122function FastCos(const ARadians: TVector2): TVector2;
123var
124S: TVector2;
125begin
126_fast_sincos_vector2(@ARadians, @S, @Result);
127end;
128
129function FastCos(const ARadians: TVector3): TVector3;
130var
131S: TVector3;
132begin
133_fast_sincos_vector3(@ARadians, @S, @Result);
134end;
135
136function FastCos(const ARadians: TVector4): TVector4;
137var
138S: TVector4;
139begin
140_fast_sincos_vector4(@ARadians, @S, @Result);
141end;
142
143procedure FastSinCos(const ARadians: Single; out ASin, ACos: Single);
144begin
145_fast_sincos_scalar(ARadians, @ASin, @ACos);
146end;
147
148procedure FastSinCos(const ARadians: TVector2; out ASin, ACos: TVector2);
149begin
150_fast_sincos_vector2(@ARadians, @ASin, @ACos);
151end;
152
153procedure FastSinCos(const ARadians: TVector3; out ASin, ACos: TVector3);
154begin
155_fast_sincos_vector3(@ARadians, @ASin, @ACos);
156end;
157
158procedure FastSinCos(const ARadians: TVector4; out ASin, ACos: TVector4);
159begin
160_fast_sincos_vector4(@ARadians, @ASin, @ACos);
161end;
162
163function FastExp(const A: Single): Single;
164begin
165Result := _fast_exp_scalar(A);
166end;
167
168function FastExp(const A: TVector2): TVector2;
169begin
170_fast_exp_vector2(@A, @Result);
171end;
172
173function FastExp(const A: TVector3): TVector3;
174begin
175_fast_exp_vector3(@A, @Result);
176end;
177
178function FastExp(const A: TVector4): TVector4;
179begin
180_fast_exp_vector4(@A, @Result);
181end;
182
183function FastLn(const A: Single): Single;
184begin
185Result := _fast_ln_scalar(A);
186end;
187
188function FastLn(const A: TVector2): TVector2;
189begin
190_fast_ln_vector2(@A, @Result);
191end;
192
193function FastLn(const A: TVector3): TVector3;
194begin
195_fast_ln_vector3(@A, @Result);
196end;
197
198function FastLn(const A: TVector4): TVector4;
199begin
200_fast_ln_vector4(@A, @Result);
201end;
202
203function FastLog2(const A: Single): Single;
204begin
205Result := _fast_log2_scalar(A);
206end;
207
208function FastLog2(const A: TVector2): TVector2;
209begin
210_fast_log2_vector2(@A, @Result);
211end;
212
213function FastLog2(const A: TVector3): TVector3;
214begin
215_fast_log2_vector3(@A, @Result);
216end;
217
218function FastLog2(const A: TVector4): TVector4;
219begin
220_fast_log2_vector4(@A, @Result);
221end;
222
223function FastExp2(const A: Single): Single;
224begin
225Result := _fast_exp2_scalar(A);
226end;
227
228function FastExp2(const A: TVector2): TVector2;
229begin
230_fast_exp2_vector2(@A, @Result);
231end;
232
233function FastExp2(const A: TVector3): TVector3;
234begin
235_fast_exp2_vector3(@A, @Result);
236end;
237
238function FastExp2(const A: TVector4): TVector4;
239begin
240_fast_exp2_vector4(@A, @Result);
241end;
242
243{ Common Functions }
244
245function Abs(const A: Single): Single;
246begin
247Result := _abs_scalar(A);
248end;
249
250function Abs(const A: TVector2): TVector2;
251begin
252_abs_vector2(@A, @Result);
253end;
254
255function Abs(const A: TVector3): TVector3;
256begin
257_abs_vector3(@A, @Result);
258end;
259
260function Abs(const A: TVector4): TVector4;
261begin
262_abs_vector4(@A, @Result);
263end;
264
265function Sign(const A: Single): Single;
266begin
267Result := _sign_scalar(A);
268end;
269
270function Sign(const A: TVector2): TVector2;
271begin
272_sign_vector2(@A, @Result);
273end;
274
275function Sign(const A: TVector3): TVector3;
276begin
277_sign_vector3(@A, @Result);
278end;
279
280function Sign(const A: TVector4): TVector4;
281begin
282_sign_vector4(@A, @Result);
283end;
284
285function Floor(const A: Single): Integer;
286begin
287Result := _floor_scalar(A);
288end;
289
290function Floor(const A: TVector2): TIVector2;
291begin
292_floor_vector2(@A, @Result);
293end;
294
295function Floor(const A: TVector3): TIVector3;
296begin
297_floor_vector3(@A, @Result);
298end;
299
300function Floor(const A: TVector4): TIVector4;
301begin
302_floor_vector4(@A, @Result);
303end;
304
305function Trunc(const A: Single): Integer;
306begin
307Result := _trunc_scalar(A);
308end;
309
310function Trunc(const A: TVector2): TIVector2;
311begin
312_trunc_vector2(@A, @Result);
313end;
314
315function Trunc(const A: TVector3): TIVector3;
316begin
317_trunc_vector3(@A, @Result);
318end;
319
320function Trunc(const A: TVector4): TIVector4;
321begin
322_trunc_vector4(@A, @Result);
323end;
324
325function Round(const A: Single): Integer;
326begin
327Result := _round_scalar(A);
328end;
329
330function Round(const A: TVector2): TIVector2;
331begin
332_round_vector2(@A, @Result);
333end;
334
335function Round(const A: TVector3): TIVector3;
336begin
337_round_vector3(@A, @Result);
338end;
339
340function Round(const A: TVector4): TIVector4;
341begin
342_round_vector4(@A, @Result);
343end;
344
345function Ceil(const A: Single): Integer;
346begin
347Result := _ceil_scalar(A);
348end;
349
350function Ceil(const A: TVector2): TIVector2;
351begin
352_ceil_vector2(@A, @Result);
353end;
354
355function Ceil(const A: TVector3): TIVector3;
356begin
357_ceil_vector3(@A, @Result);
358end;
359
360function Ceil(const A: TVector4): TIVector4;
361begin
362_ceil_vector4(@A, @Result);
363end;
364
365function Frac(const A: Single): Single;
366begin
367Result := _frac_scalar(A);
368end;
369
370function Frac(const A: TVector2): TVector2;
371begin
372_frac_vector2(@A, @Result);
373end;
374
375function Frac(const A: TVector3): TVector3;
376begin
377_frac_vector3(@A, @Result);
378end;
379
380function Frac(const A: TVector4): TVector4;
381begin
382_frac_vector4(@A, @Result);
383end;
384
385function FMod(const A, B: Single): Single;
386begin
387Result := _fmod_scalar(A, B);
388end;
389
390function FMod(const A: TVector2; const B: Single): TVector2;
391begin
392_fmod_vector2_scalar(@A, B, @Result);
393end;
394
395function FMod(const A, B: TVector2): TVector2;
396begin
397_fmod_vector2(@A, @B, @Result);
398end;
399
400function FMod(const A: TVector3; const B: Single): TVector3;
401begin
402_fmod_vector3_scalar(@A, B, @Result);
403end;
404
405function FMod(const A, B: TVector3): TVector3;
406begin
407_fmod_vector3(@A, @B, @Result);
408end;
409
410function FMod(const A: TVector4; const B: Single): TVector4;
411begin
412_fmod_vector4_scalar(@A, B, @Result);
413end;
414
415function FMod(const A, B: TVector4): TVector4;
416begin
417_fmod_vector4(@A, @B, @Result);
418end;
419
420function ModF(const A: Single; out B: Integer): Single;
421begin
422Result := _modf_scalar(A, @B);
423end;
424
425function ModF(const A: TVector2; out B: TIVector2): TVector2;
426begin
427_modf_vector2(@A, @B, @Result);
428end;
429
430function ModF(const A: TVector3; out B: TIVector3): TVector3;
431begin
432_modf_vector3(@A, @B, @Result);
433end;
434
435function ModF(const A: TVector4; out B: TIVector4): TVector4;
436begin
437_modf_vector4(@A, @B, @Result);
438end;
439
440function Min(const A: TVector2; const B: Single): TVector2;
441begin
442_min_vector2_scalar(@A, B, @Result);
443end;
444
445function Min(const A, B: TVector2): TVector2;
446begin
447_min_vector2(@A, @B, @Result);
448end;
449
450function Min(const A: TVector3; const B: Single): TVector3;
451begin
452_min_vector3_scalar(@A, B, @Result);
453end;
454
455function Min(const A, B: TVector3): TVector3;
456begin
457_min_vector3(@A, @B, @Result);
458end;
459
460function Min(const A: TVector4; const B: Single): TVector4;
461begin
462_min_vector4_scalar(@A, B, @Result);
463end;
464
465function Min(const A, B: TVector4): TVector4;
466begin
467_min_vector4(@A, @B, @Result);
468end;
469
470function Max(const A: TVector2; const B: Single): TVector2;
471begin
472_max_vector2_scalar(@A, B, @Result);
473end;
474
475function Max(const A, B: TVector2): TVector2;
476begin
477_max_vector2(@A, @B, @Result);
478end;
479
480function Max(const A: TVector3; const B: Single): TVector3;
481begin
482_max_vector3_scalar(@A, B, @Result);
483end;
484
485function Max(const A, B: TVector3): TVector3;
486begin
487_max_vector3(@A, @B, @Result);
488end;
489
490function Max(const A: TVector4; const B: Single): TVector4;
491begin
492_max_vector4_scalar(@A, B, @Result);
493end;
494
495function Max(const A, B: TVector4): TVector4;
496begin
497_max_vector4(@A, @B, @Result);
498end;
499
500function EnsureRange(const A, AMin, AMax: Single): Single;
501begin
502Result := _ensure_range_scalar(A, AMin, AMax);
503end;
504
505function EnsureRange(const A: TVector2; const AMin, AMax: Single): TVector2;
506begin
507_ensure_range_vector2_scalar(@A, AMin, AMax, @Result);
508end;
509
510function EnsureRange(const A, AMin, AMax: TVector2): TVector2;
511begin
512_ensure_range_vector2(@A, @AMin, @AMax, @Result);
513end;
514
515function EnsureRange(const A: TVector3; const AMin, AMax: Single): TVector3;
516begin
517_ensure_range_vector3_scalar(@A, AMin, AMax, @Result);
518end;
519
520function EnsureRange(const A, AMin, AMax: TVector3): TVector3;
521begin
522_ensure_range_vector3(@A, @AMin, @AMax, @Result);
523end;
524
525function EnsureRange(const A: TVector4; const AMin, AMax: Single): TVector4;
526begin
527_ensure_range_vector4_scalar(@A, AMin, AMax, @Result);
528end;
529
530function EnsureRange(const A, AMin, AMax: TVector4): TVector4;
531begin
532_ensure_range_vector4(@A, @AMin, @AMax, @Result);
533end;
534
535function Mix(const A, B: TVector2; const T: Single): TVector2;
536begin
537_mix_vector2_scalar(@A, @B, T, @Result);
538end;
539
540function Mix(const A, B, T: TVector2): TVector2;
541begin
542_mix_vector2(@A, @B, @T, @Result);
543end;
544
545function Mix(const A, B: TVector3; const T: Single): TVector3;
546begin
547_mix_vector3_scalar(@A, @B, T, @Result);
548end;
549
550function Mix(const A, B, T: TVector3): TVector3;
551begin
552_mix_vector3(@A, @B, @T, @Result);
553end;
554
555function Mix(const A, B: TVector4; const T: Single): TVector4;
556begin
557_mix_vector4_scalar(@A, @B, T, @Result);
558end;
559
560function Mix(const A, B, T: TVector4): TVector4;
561begin
562_mix_vector4(@A, @B, @T, @Result);
563end;
564
565function Step(const AEdge: Single; const A: TVector2): TVector2;
566begin
567_step_scalar_vector2(AEdge, @A, @Result);
568end;
569
570function Step(const AEdge, A: TVector2): TVector2;
571begin
572_step_vector2(@AEdge, @A, @Result);
573end;
574
575function Step(const AEdge: Single; const A: TVector3): TVector3;
576begin
577_step_scalar_vector3(AEdge, @A, @Result);
578end;
579
580function Step(const AEdge, A: TVector3): TVector3;
581begin
582_step_vector3(@AEdge, @A, @Result);
583end;
584
585function Step(const AEdge: Single; const A: TVector4): TVector4;
586begin
587_step_scalar_vector4(AEdge, @A, @Result);
588end;
589
590function Step(const AEdge, A: TVector4): TVector4;
591begin
592_step_vector4(@AEdge, @A, @Result);
593end;
594
595function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector2): TVector2;
596begin
597Result.Init(SmoothStep(AEdge0, AEdge1, A.X), SmoothStep(AEdge0, AEdge1, A.Y));
598end;
599
600function SmoothStep(const AEdge0, AEdge1, A: TVector2): TVector2;
601begin
602Result.Init(SmoothStep(AEdge0.X, AEdge1.X, A.X), SmoothStep(AEdge0.Y, AEdge1.Y, A.Y));
603end;
604
605function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector3): TVector3;
606begin
607Result.Init(SmoothStep(AEdge0, AEdge1, A.X), SmoothStep(AEdge0, AEdge1, A.Y), SmoothStep(AEdge0, AEdge1, A.Z));
608end;
609
610function SmoothStep(const AEdge0, AEdge1, A: TVector3): TVector3;
611begin
612Result.Init(SmoothStep(AEdge0.X, AEdge1.X, A.X), SmoothStep(AEdge0.Y, AEdge1.Y, A.Y), SmoothStep(AEdge0.Z, AEdge1.Z, A.Z));
613end;
614
615function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector4): TVector4;
616begin
617Result.Init(SmoothStep(AEdge0, AEdge1, A.X), SmoothStep(AEdge0, AEdge1, A.Y), SmoothStep(AEdge0, AEdge1, A.Z), SmoothStep(AEdge0, AEdge1, A.W));
618end;
619
620{function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector2): TVector2;
621begin
622_smoothstep_scalar_vector2(AEdge0, AEdge1, @A, @Result);
623end;
624
625function SmoothStep(const AEdge0, AEdge1, A: TVector2): TVector2;
626begin
627_smoothstep_vector2(@AEdge0, @AEdge1, @A, @Result);
628end;
629
630function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector3): TVector3;
631begin
632_smoothstep_scalar_vector3(AEdge0, AEdge1, @A, @Result);
633end;
634
635function SmoothStep(const AEdge0, AEdge1, A: TVector3): TVector3;
636begin
637_smoothstep_vector3(@AEdge0, @AEdge1, @A, @Result);
638end;
639
640function SmoothStep(const AEdge0, AEdge1: Single; const A: TVector4): TVector4;
641begin
642_smoothstep_scalar_vector4(AEdge0, AEdge1, @A, @Result);
643end;}
644
645function SmoothStep(const AEdge0, AEdge1, A: TVector4): TVector4;
646begin
647_smoothstep_vector4(@AEdge0, @AEdge1, @A, @Result);
648end;
649
650function FMA(const A, B, C: TVector2): TVector2;
651begin
652_fma_vector2(@A, @B, @C, @Result);
653end;
654
655function FMA(const A, B, C: TVector3): TVector3;
656begin
657_fma_vector3(@A, @B, @C, @Result);
658end;
659
660function FMA(const A, B, C: TVector4): TVector4;
661begin
662_fma_vector4(@A, @B, @C, @Result);
663end;
664
665{ Matrix functions }
666
667function OuterProduct(const C, R: TVector2): TMatrix2;
668begin
669{$IFDEF FM_COLUMN_MAJOR}
670_outer_product_matrix2(@R, @C, @Result);
671{$ELSE}
672_outer_product_matrix2(@C, @R, @Result);
673{$ENDIF}
674end;
675
676function OuterProduct(const C, R: TVector3): TMatrix3;
677begin
678{$IFDEF FM_COLUMN_MAJOR}
679_outer_product_matrix3(@R, @C, @Result);
680{$ELSE}
681_outer_product_matrix3(@C, @R, @Result);
682{$ENDIF}
683end;
684
685function OuterProduct(const C, R: TVector4): TMatrix4;
686begin
687{$IFDEF FM_COLUMN_MAJOR}
688_outer_product_matrix4(@R, @C, @Result);
689{$ELSE}
690_outer_product_matrix4(@C, @R, @Result);
691{$ENDIF}
692end;
693
694{ TVector2 }
695
696class operator TVector2.Add(const A: TVector2; const B: Single): TVector2;
697begin
698_vector2_add_scalar(@A, B, @Result);
699end;
700
701class operator TVector2.Add(const A: Single; const B: TVector2): TVector2;
702begin
703_scalar_add_vector2(A, @B, @Result);
704end;
705
706class operator TVector2.Add(const A, B: TVector2): TVector2;
707begin
708_vector2_add_vector2(@A, @B, @Result);
709end;
710
711function TVector2.Distance(const AOther: TVector2): Single;
712begin
713Result := _vector2_distance(@Self, @AOther);
714end;
715
716function TVector2.DistanceSquared(const AOther: TVector2): Single;
717begin
718Result := _vector2_distance_squared(@Self, @AOther);
719end;
720
721class operator TVector2.Divide(const A: TVector2; const B: Single): TVector2;
722begin
723_vector2_div_scalar(@A, B, @Result);
724end;
725
726class operator TVector2.Divide(const A: Single; const B: TVector2): TVector2;
727begin
728_scalar_div_vector2(A, @B, @Result);
729end;
730
731class operator TVector2.Divide(const A, B: TVector2): TVector2;
732begin
733_vector2_div_vector2(@A, @B, @Result);
734end;
735
736function TVector2.Dot(const AOther: TVector2): Single;
737begin
738Result := _vector2_dot(@Self, @AOther);
739end;
740
741function TVector2.FaceForward(const I, NRef: TVector2): TVector2;
742begin
743_vector2_faceforward(@Self, @I, @NRef, @Result);
744end;
745
746function TVector2.GetLength: Single;
747begin
748Result := _vector2_length(@Self);
749end;
750
751function TVector2.GetLengthSquared: Single;
752begin
753Result := _vector2_dot(@Self, @Self);
754end;
755
756class operator TVector2.Multiply(const A: TVector2; const B: Single): TVector2;
757begin
758_vector2_mul_scalar(@A, B, @Result);
759end;
760
761class operator TVector2.Multiply(const A: Single; const B: TVector2): TVector2;
762begin
763_scalar_mul_vector2(A, @B, @Result);
764end;
765
766class operator TVector2.Multiply(const A, B: TVector2): TVector2;
767begin
768_vector2_mul_vector2(@A, @B, @Result);
769end;
770
771function TVector2.NormalizeFast: TVector2;
772begin
773_vector2_normalize_fast(@Self, @Result);
774end;
775
776function TVector2.Reflect(const N: TVector2): TVector2;
777begin
778_vector2_reflect(@Self, @N, @Result);
779end;
780
781function TVector2.Refract(const N: TVector2; const Eta: Single): TVector2;
782begin
783_vector2_refract(@Self, @N, Eta, @Result);
784end;
785
786procedure TVector2.SetNormalizedFast;
787begin
788_vector2_normalize_fast(@Self, @Self);
789end;
790
791class operator TVector2.Subtract(const A: TVector2; const B: Single): TVector2;
792begin
793_vector2_sub_scalar(@A, B, @Result);
794end;
795
796class operator TVector2.Subtract(const A: Single; const B: TVector2): TVector2;
797begin
798_scalar_sub_vector2(A, @B, @Result);
799end;
800
801class operator TVector2.Subtract(const A, B: TVector2): TVector2;
802begin
803_vector2_sub_vector2(@A, @B, @Result);
804end;
805
806{ TVector3 }
807
808class operator TVector3.Add(const A: TVector3; const B: Single): TVector3;
809begin
810_vector3_add_scalar(@A, B, @Result);
811end;
812
813class operator TVector3.Add(const A: Single; const B: TVector3): TVector3;
814begin
815_scalar_add_vector3(A, @B, @Result);
816end;
817
818class operator TVector3.Add(const A, B: TVector3): TVector3;
819begin
820_vector3_add_vector3(@A, @B, @Result);
821end;
822
823function TVector3.Distance(const AOther: TVector3): Single;
824begin
825Result := _vector3_distance(@Self, @AOther);
826end;
827
828function TVector3.DistanceSquared(const AOther: TVector3): Single;
829begin
830Result := _vector3_distance_squared(@Self, @AOther);
831end;
832
833function TVector3.Cross(const AOther: TVector3): TVector3;
834begin
835_vector3_cross(@Self, @AOther, @Result);
836end;
837
838class operator TVector3.Divide(const A: TVector3; const B: Single): TVector3;
839begin
840_vector3_div_scalar(@A, B, @Result);
841end;
842
843class operator TVector3.Divide(const A: Single; const B: TVector3): TVector3;
844begin
845_scalar_div_vector3(A, @B, @Result);
846end;
847
848class operator TVector3.Divide(const A, B: TVector3): TVector3;
849begin
850_vector3_div_vector3(@A, @B, @Result);
851end;
852
853function TVector3.Dot(const AOther: TVector3): Single;
854begin
855Result := _vector3_dot(@Self, @AOther);
856end;
857
858function TVector3.FaceForward(const I, NRef: TVector3): TVector3;
859begin
860_vector3_faceforward(@Self, @I, @NRef, @Result);
861end;
862
863function TVector3.GetLength: Single;
864begin
865Result := _vector3_length(@Self);
866end;
867
868function TVector3.GetLengthSquared: Single;
869begin
870Result := _vector3_dot(@Self, @Self);
871end;
872
873class operator TVector3.Multiply(const A: TVector3; const B: Single): TVector3;
874begin
875_vector3_mul_scalar(@A, B, @Result);
876end;
877
878class operator TVector3.Multiply(const A: Single; const B: TVector3): TVector3;
879begin
880_scalar_mul_vector3(A, @B, @Result);
881end;
882
883class operator TVector3.Multiply(const A, B: TVector3): TVector3;
884begin
885_vector3_mul_vector3(@A, @B, @Result);
886end;
887
888class operator TVector3.Negative(const A: TVector3): TVector3;
889begin
890_neg_vector3(@A, @Result);
891end;
892
893function TVector3.NormalizeFast: TVector3;
894begin
895_vector3_normalize_fast(@Self, @Result);
896end;
897
898function TVector3.Reflect(const N: TVector3): TVector3;
899begin
900_vector3_reflect(@Self, @N, @Result);
901end;
902
903function TVector3.Refract(const N: TVector3; const Eta: Single): TVector3;
904begin
905_vector3_refract(@Self, @N, Eta, @Result);
906end;
907
908procedure TVector3.SetNormalizedFast;
909begin
910_vector3_normalize_fast(@Self, @Self);
911end;
912
913class operator TVector3.Subtract(const A: TVector3; const B: Single): TVector3;
914begin
915_vector3_sub_scalar(@A, B, @Result);
916end;
917
918class operator TVector3.Subtract(const A: Single; const B: TVector3): TVector3;
919begin
920_scalar_sub_vector3(A, @B, @Result);
921end;
922
923class operator TVector3.Subtract(const A, B: TVector3): TVector3;
924begin
925_vector3_sub_vector3(@A, @B, @Result);
926end;
927
928{ TVector4 }
929
930class operator TVector4.Add(const A: TVector4; const B: Single): TVector4;
931begin
932_vector4_add_scalar(@A, B, @Result);
933end;
934
935class operator TVector4.Add(const A: Single; const B: TVector4): TVector4;
936begin
937_scalar_add_vector4(A, @B, @Result);
938end;
939
940class operator TVector4.Add(const A, B: TVector4): TVector4;
941begin
942_vector4_add_vector4(@A, @B, @Result);
943end;
944
945function TVector4.Distance(const AOther: TVector4): Single;
946begin
947Result := _vector4_distance(@Self, @AOther);
948end;
949
950function TVector4.DistanceSquared(const AOther: TVector4): Single;
951begin
952Result := _vector4_distance_squared(@Self, @AOther);
953end;
954
955class operator TVector4.Divide(const A: TVector4; const B: Single): TVector4;
956begin
957_vector4_div_scalar(@A, B, @Result);
958end;
959
960class operator TVector4.Divide(const A: Single; const B: TVector4): TVector4;
961begin
962_scalar_div_vector4(A, @B, @Result);
963end;
964
965class operator TVector4.Divide(const A, B: TVector4): TVector4;
966begin
967_vector4_div_vector4(@A, @B, @Result);
968end;
969
970function TVector4.Dot(const AOther: TVector4): Single;
971begin
972Result := _vector4_dot(@Self, @AOther);
973end;
974
975function TVector4.FaceForward(const I, NRef: TVector4): TVector4;
976begin
977_vector4_faceforward(@Self, @I, @NRef, @Result);
978end;
979
980function TVector4.GetLength: Single;
981begin
982Result := _vector4_length(@Self);
983end;
984
985function TVector4.GetLengthSquared: Single;
986begin
987Result := _vector4_dot(@Self, @Self);
988end;
989
990class operator TVector4.Multiply(const A: TVector4; const B: Single): TVector4;
991begin
992_vector4_mul_scalar(@A, B, @Result);
993end;
994
995class operator TVector4.Multiply(const A: Single; const B: TVector4): TVector4;
996begin
997_scalar_mul_vector4(A, @B, @Result);
998end;
999
1000class operator TVector4.Multiply(const A, B: TVector4): TVector4;
1001begin
1002_vector4_mul_vector4(@A, @B, @Result);
1003end;
1004
1005class operator TVector4.Negative(const A: TVector4): TVector4;
1006begin
1007_neg_vector4(@A, @Result);
1008end;
1009
1010function TVector4.NormalizeFast: TVector4;
1011begin
1012_vector4_normalize_fast(@Self, @Result);
1013end;
1014
1015function TVector4.Reflect(const N: TVector4): TVector4;
1016begin
1017_vector4_reflect(@Self, @N, @Result);
1018end;
1019
1020function TVector4.Refract(const N: TVector4; const Eta: Single): TVector4;
1021begin
1022_vector4_refract(@Self, @N, Eta, @Result);
1023end;
1024
1025procedure TVector4.SetNormalizedFast;
1026begin
1027_vector4_normalize_fast(@Self, @Self);
1028end;
1029
1030class operator TVector4.Subtract(const A: TVector4; const B: Single): TVector4;
1031begin
1032_vector4_sub_scalar(@A, B, @Result);
1033end;
1034
1035class operator TVector4.Subtract(const A: Single; const B: TVector4): TVector4;
1036begin
1037_scalar_sub_vector4(A, @B, @Result);
1038end;
1039
1040class operator TVector4.Subtract(const A, B: TVector4): TVector4;
1041begin
1042_vector4_sub_vector4(@A, @B, @Result);
1043end;
1044
1045{ TQuaternion }
1046
1047{ Most implementations here are the same as for TVector4 }
1048
1049class operator TQuaternion.Add(const A, B: TQuaternion): TQuaternion;
1050begin
1051_vector4_add_vector4(@A, @B, @Result);
1052end;
1053
1054function TQuaternion.GetLength: Single;
1055begin
1056Result := _vector4_length(@Self);
1057end;
1058
1059function TQuaternion.GetLengthSquared: Single;
1060begin
1061Result := _vector4_dot(@Self, @Self);
1062end;
1063
1064class operator TQuaternion.Multiply(const A: TQuaternion; const B: Single): TQuaternion;
1065begin
1066_vector4_mul_scalar(@A, B, @Result);
1067end;
1068
1069class operator TQuaternion.Multiply(const A: Single; const B: TQuaternion): TQuaternion;
1070begin
1071_scalar_mul_vector4(A, @B, @Result);
1072end;
1073
1074class operator TQuaternion.Multiply(const A, B: TQuaternion): TQuaternion;
1075begin
1076Result.X := (A.W * B.X) + (A.X * B.W) + (A.Y * B.Z) - (A.Z * B.Y);
1077Result.Y := (A.W * B.Y) + (A.Y * B.W) + (A.Z * B.X) - (A.X * B.Z);
1078Result.Z := (A.W * B.Z) + (A.Z * B.W) + (A.X * B.Y) - (A.Y * B.X);
1079Result.W := (A.W * B.W) - (A.X * B.X) - (A.Y * B.Y) - (A.Z * B.Z);
1080end;
1081
1082function TQuaternion.NormalizeFast: TQuaternion;
1083begin
1084_vector4_normalize_fast(@Self, @Result);
1085end;
1086
1087procedure TQuaternion.SetNormalizedFast;
1088begin
1089_vector4_normalize_fast(@Self, @Self);
1090end;
1091
1092{ TMatrix 2 }
1093
1094class operator TMatrix2.Add(const A: TMatrix2; const B: Single): TMatrix2;
1095begin
1096_matrix2_add_scalar(@A, B, @Result);
1097end;
1098
1099class operator TMatrix2.Add(const A: Single; const B: TMatrix2): TMatrix2;
1100begin
1101_scalar_add_matrix2(A, @B, @Result);
1102end;
1103
1104class operator TMatrix2.Add(const A, B: TMatrix2): TMatrix2;
1105begin
1106_matrix2_add_matrix2(@A, @B, @Result);
1107end;
1108
1109function TMatrix2.CompMult(const AOther: TMatrix2): TMatrix2;
1110begin
1111_matrix2_comp_mult(@Self, @AOther, @Result);
1112end;
1113
1114class operator TMatrix2.Divide(const A: Single; const B: TMatrix2): TMatrix2;
1115begin
1116_scalar_div_matrix2(A, @B, @Result);
1117end;
1118
1119class operator TMatrix2.Divide(const A: TMatrix2; const B: Single): TMatrix2;
1120begin
1121_matrix2_div_scalar(@A, B, @Result);
1122end;
1123
1124class operator TMatrix2.Multiply(const A: TMatrix2; const B: Single): TMatrix2;
1125begin
1126_matrix2_mul_scalar(@A, B, @Result);
1127end;
1128
1129class operator TMatrix2.Multiply(const A: Single; const B: TMatrix2): TMatrix2;
1130begin
1131_scalar_mul_matrix2(A, @B, @Result);
1132end;
1133
1134class operator TMatrix2.Multiply(const A: TVector2; const B: TMatrix2): TVector2;
1135begin
1136_vector2_mul_matrix2(@A, @B, @Result);
1137end;
1138
1139class operator TMatrix2.Multiply(const A: TMatrix2; const B: TVector2): TVector2;
1140begin
1141_matrix2_mul_vector2(@A, @B, @Result);
1142end;
1143
1144class operator TMatrix2.Multiply(const A, B: TMatrix2): TMatrix2;
1145begin
1146_matrix2_mul_matrix2(@A, @B, @Result);
1147end;
1148
1149class operator TMatrix2.Negative(const A: TMatrix2): TMatrix2;
1150begin
1151_neg_matrix2(@A, @Result);
1152end;
1153
1154procedure TMatrix2.SetTransposed;
1155begin
1156_matrix2_transpose(@Self, @Self);
1157end;
1158
1159class operator TMatrix2.Subtract(const A: TMatrix2; const B: Single): TMatrix2;
1160begin
1161_matrix2_sub_scalar(@A, B, @Result);
1162end;
1163
1164class operator TMatrix2.Subtract(const A: Single; const B: TMatrix2): TMatrix2;
1165begin
1166_scalar_sub_matrix2(A, @B, @Result);
1167end;
1168
1169class operator TMatrix2.Subtract(const A, B: TMatrix2): TMatrix2;
1170begin
1171_matrix2_sub_matrix2(@A, @B, @Result);
1172end;
1173
1174function TMatrix2.Transpose: TMatrix2;
1175begin
1176_matrix2_transpose(@Self, @Result);
1177end;
1178
1179{ TMatrix3 }
1180
1181class operator TMatrix3.Add(const A: TMatrix3; const B: Single): TMatrix3;
1182begin
1183_matrix3_add_scalar(@A, B, @Result);
1184end;
1185
1186class operator TMatrix3.Add(const A: Single; const B: TMatrix3): TMatrix3;
1187begin
1188_scalar_add_matrix3(A, @B, @Result);
1189end;
1190
1191class operator TMatrix3.Add(const A, B: TMatrix3): TMatrix3;
1192begin
1193_matrix3_add_matrix3(@A, @B, @Result);
1194end;
1195
1196function TMatrix3.CompMult(const AOther: TMatrix3): TMatrix3;
1197begin
1198_matrix3_comp_mult(@Self, @AOther, @Result);
1199end;
1200
1201class operator TMatrix3.Divide(const A: TMatrix3; const B: Single): TMatrix3;
1202begin
1203_matrix3_div_scalar(@A, B, @Result);
1204end;
1205
1206class operator TMatrix3.Divide(const A: Single; const B: TMatrix3): TMatrix3;
1207begin
1208_scalar_div_matrix3(A, @B, @Result);
1209end;
1210
1211class operator TMatrix3.Multiply(const A: TMatrix3; const B: Single): TMatrix3;
1212begin
1213_matrix3_mul_scalar(@A, B, @Result);
1214end;
1215
1216class operator TMatrix3.Multiply(const A: Single; const B: TMatrix3): TMatrix3;
1217begin
1218_scalar_mul_matrix3(A, @B, @Result);
1219end;
1220
1221class operator TMatrix3.Multiply(const A: TVector3; const B: TMatrix3): Tvector3;
1222begin
1223{$IFDEF FM_COLUMN_MAJOR}
1224_matrix3_mul_vector3(@B, @A, @Result);
1225{$ELSE}
1226_vector3_mul_matrix3(@A, @B, @Result);
1227{$ENDIF}
1228end;
1229
1230class operator TMatrix3.Multiply(const A: TMatrix3; const B: Tvector3): Tvector3;
1231begin
1232{$IFDEF FM_COLUMN_MAJOR}
1233_vector3_mul_matrix3(@B, @A, @Result);
1234{$ELSE}
1235_matrix3_mul_vector3(@A, @B, @Result);
1236{$ENDIF}
1237end;
1238
1239class operator TMatrix3.Multiply(const A, B: TMatrix3): TMatrix3;
1240begin
1241{$IFDEF FM_COLUMN_MAJOR}
1242_matrix3_mul_matrix3(@B, @A, @Result);
1243{$ELSE}
1244_matrix3_mul_matrix3(@A, @B, @Result);
1245{$ENDIF}
1246end;
1247
1248class operator TMatrix3.Negative(const A: TMatrix3): TMatrix3;
1249begin
1250_neg_matrix3(@A, @Result);
1251end;
1252
1253procedure TMatrix3.SetTransposed;
1254begin
1255_matrix3_transpose(@Self, @Self);
1256end;
1257
1258class operator TMatrix3.Subtract(const A: TMatrix3; const B: Single): TMatrix3;
1259begin
1260_matrix3_sub_scalar(@A, B, @Result);
1261end;
1262
1263class operator TMatrix3.Subtract(const A: Single; const B: TMatrix3): TMatrix3;
1264begin
1265_scalar_sub_matrix3(A, @B, @Result);
1266end;
1267
1268class operator TMatrix3.Subtract(const A, B: TMatrix3): TMatrix3;
1269begin
1270_matrix3_sub_matrix3(@A, @B, @Result);
1271end;
1272
1273function TMatrix3.Transpose: TMatrix3;
1274begin
1275Result.M[0,0] := M[0,0];
1276Result.M[0,1] := M[1,0];
1277Result.M[0,2] := M[2,0];
1278
1279Result.M[1,0] := M[0,1];
1280Result.M[1,1] := M[1,1];
1281Result.M[1,2] := M[2,1];
1282
1283Result.M[2,0] := M[0,2];
1284Result.M[2,1] := M[1,2];
1285Result.M[2,2] := M[2,2];
1286end;
1287{function TMatrix3.Transpose: TMatrix3;
1288begin
1289_matrix3_transpose(@Self, @Result);
1290end;}
1291
1292{ TMatrix4 }
1293
1294class operator TMatrix4.Add(const A: TMatrix4; const B: Single): TMatrix4;
1295begin
1296_matrix4_add_scalar(@A, B, @Result);
1297end;
1298
1299class operator TMatrix4.Add(const A: Single; const B: TMatrix4): TMatrix4;
1300begin
1301_scalar_add_matrix4(A, @B, @Result);
1302end;
1303
1304class operator TMatrix4.Add(const A, B: TMatrix4): TMatrix4;
1305begin
1306_matrix4_add_matrix4(@A, @B, @Result);
1307end;
1308
1309function TMatrix4.CompMult(const AOther: TMatrix4): TMatrix4;
1310begin
1311_matrix4_comp_mult(@Self, @AOther, @Result);
1312end;
1313
1314class operator TMatrix4.Divide(const A: TMatrix4; const B: Single): TMatrix4;
1315begin
1316_matrix4_div_scalar(@A, B, @Result);
1317end;
1318
1319class operator TMatrix4.Divide(const A: Single; const B: TMatrix4): TMatrix4;
1320begin
1321_scalar_div_matrix4(A, @B, @Result);
1322end;
1323
1324function TMatrix4.Inverse: TMatrix4;
1325begin
1326_matrix4_inverse(@Self, @Result);
1327end;
1328
1329class operator TMatrix4.Multiply(const A: TMatrix4; const B: Single): TMatrix4;
1330begin
1331_matrix4_mul_scalar(@A, B, @Result);
1332end;
1333
1334class operator TMatrix4.Multiply(const A: Single; const B: TMatrix4): TMatrix4;
1335begin
1336_scalar_mul_matrix4(A, @B, @Result);
1337end;
1338
1339class operator TMatrix4.Multiply(const A: TVector4; const B: TMatrix4): TVector4;
1340begin
1341{$IFDEF FM_COLUMN_MAJOR}
1342_matrix4_mul_vector4(@B, @A, @Result);
1343{$ELSE}
1344_vector4_mul_matrix4(@A, @B, @Result);
1345{$ENDIF}
1346end;
1347
1348class operator TMatrix4.Multiply(const A: TMatrix4; const B: TVector4): TVector4;
1349begin
1350{$IFDEF FM_COLUMN_MAJOR}
1351_vector4_mul_matrix4(@B, @A, @Result);
1352{$ELSE}
1353_matrix4_mul_vector4(@A, @B, @Result);
1354{$ENDIF}
1355end;
1356
1357class operator TMatrix4.Multiply(const A, B: TMatrix4): TMatrix4;
1358begin
1359{$IFDEF FM_COLUMN_MAJOR}
1360_matrix4_mul_matrix4(@B, @A, @Result);
1361{$ELSE}
1362_matrix4_mul_matrix4(@A, @B, @Result);
1363{$ENDIF}
1364end;
1365
1366class operator TMatrix4.Negative(const A: TMatrix4): TMatrix4;
1367begin
1368_neg_matrix4(@A, @Result);
1369end;
1370
1371procedure TMatrix4.SetInversed;
1372begin
1373_matrix4_inverse(@Self, @Self);
1374end;
1375
1376procedure TMatrix4.SetTransposed;
1377begin
1378_matrix4_transpose(@Self, @Self);
1379end;
1380
1381class operator TMatrix4.Subtract(const A: TMatrix4; const B: Single): TMatrix4;
1382begin
1383_matrix4_sub_scalar(@A, B, @Result);
1384end;
1385
1386class operator TMatrix4.Subtract(const A: Single; const B: TMatrix4): TMatrix4;
1387begin
1388_scalar_sub_matrix4(A, @B, @Result);
1389end;
1390
1391class operator TMatrix4.Subtract(const A, B: TMatrix4): TMatrix4;
1392begin
1393_matrix4_sub_matrix4(@A, @B, @Result);
1394end;
1395
1396function TMatrix4.Transpose: TMatrix4;
1397begin
1398_matrix4_transpose(@Self, @Result);
1399end;
1400