forked from AdaDoom3/AdaDoom3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
neo-library-vectors.ads
449 lines (440 loc) · 14.3 KB
/
neo-library-vectors.ads
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
with
Ada.Finalization,
Neo.Library.Mathmatics,
Neo.Foundation.Text_IO,
Neo.Foundation.Data_Types,
Neo.Foundation.Package_Testing;
use
Neo.Library.Mathmatics,
Neo.Foundation.Text_IO,
Neo.Foundation.Data_Types,
Neo.Foundation.Package_Testing;
package Neo.Library.Vectors
is
-------------
-- Records --
-------------
type Record_Vector
is private;
type Record_Vector_Polar
is record
ρ : Float_4_Positive := 1.0;
θ : Float_4_Real := 0.0;
ϕ : Float_4_Real := 0.0;
end record;
type Record_Vector_2
is record
X : Float_4_Real := 0.0;
Y : Float_4_Real := 0.0;
end record;
type Record_Vector_3
is record
X : Float_4_Real := 0.0;
Y : Float_4_Real := 0.0;
Z : Float_4_Real := 0.0;
end record;
type Record_Vector_4
is record
X : Float_4_Real := 0.0;
Y : Float_4_Real := 0.0;
Z : Float_4_Real := 0.0;
W : Float_4_Real := 0.0;
end record;
type Record_Vector_5
is record
X : Float_4_Real := 0.0;
Y : Float_4_Real := 0.0;
Z : Float_4_Real := 0.0;
S : Float_4_Real := 0.0;
T : Float_4_Real := 0.0;
end record;
type Record_Vector_6
is record
X : Float_4_Real := 0.0;
Y : Float_4_Real := 0.0;
Z : Float_4_Real := 0.0;
S : Float_4_Real := 0.0;
T : Float_4_Real := 0.0;
U : Float_4_Real := 0.0;
end record;
-----------------
-- Subprograms --
-----------------
procedure Test;
procedure Put(
Item : in Record_Vector_2);
procedure Put(
Item : in Record_Vector_3);
procedure Put(
Item : in Record_Vector_4);
procedure Put(
Item : in Record_Vector_5);
procedure Put(
Item : in Record_Vector_6);
function Get_Length(
Item : in Record_Vector_2)
return Float_4_Real;
function Get_Length(
Item : in Record_Vector_3)
return Float_4_Real;
function Get_Length(
Item : in Record_Vector_4)
return Float_4_Real;
function Get_Length(
Item : in Record_Vector_6)
return Float_4_Real;
function Get_Length_Quickly(
Item : in Record_Vector_2)
return Float_4_Real;
function Get_Length_Quickly(
Item : in Record_Vector_3)
return Float_4_Real;
function Get_Length_Quickly(
Item : in Record_Vector_4)
return Float_4_Real;
function Get_Length_Quickly(
Item : in Record_Vector_6)
return Float_4_Real;
function Get_Length_Squared(
Item : in Record_Vector_2)
return Float_4_Real;
function Get_Length_Squared(
Item : in Record_Vector_3)
return Float_4_Real;
function Get_Length_Squared(
Item : in Record_Vector_4)
return Float_4_Real;
function Get_Length_Squared(
Item : in Record_Vector_6)
return Float_4_Real;
function Normalize(
Item : in Record_Vector_2)
return Float_4_Real;
function Normalize(
Item : in Record_Vector_3)
return Float_4_Real;
function Normalize(
Item : in Record_Vector_4)
return Float_4_Real;
function Normalize(
Item : in Record_Vector_6)
return Float_4_Real;
function Normalize_Quickly(
Item : in Record_Vector_2)
return Float_4_Real;
function Normalize_Quickly(
Item : in Record_Vector_3)
return Float_4_Real;
function Normalize_Quickly(
Item : in Record_Vector_4)
return Float_4_Real;
function Normalize_Quickly(
Item : in Record_Vector_6)
return Float_4_Real;
function Are_Equal(
Item_A : in Record_Vector_2;
Item_B : in Record_Vector_2;
ε : in Float_4_Real)
return Boolean;
function Are_Equal(
Item_A : in Record_Vector_3;
Item_B : in Record_Vector_3;
ε : in Float_4_Real)
return Boolean;
function Are_Equal(
Item_A : in Record_Vector_4;
Item_B : in Record_Vector_4;
ε : in Float_4_Real)
return Boolean;
function Are_Equal(
Item_A : in Record_Vector_6;
Item_B : in Record_Vector_6;
ε : in Float_4_Real)
return Boolean;
function "-"(
Item : in Record_Vector_2)
return Record_Vector_2;
function "-"(
Item : in Record_Vector_3)
return Record_Vector_3;
function "-"(
Item : in Record_Vector_4)
return Record_Vector_4;
function "-"(
Item : in Record_Vector_6)
return Record_Vector_6;
function "-"(
Left : in Record_Vector_2;
Right : in Record_Vector_2)
return Record_Vector_2;
function "-"(
Left : in Record_Vector_3;
Right : in Record_Vector_3)
return Record_Vector_3;
function "-"(
Left : in Record_Vector_4;
Right : in Record_Vector_4)
return Record_Vector_4;
function "-"(
Left : in Record_Vector_6;
Right : in Record_Vector_6)
return Record_Vector_6;
function "+"(
Item : in Record_Vector_2)
return Record_Vector_2;
function "+"(
Item : in Record_Vector_3)
return Record_Vector_3;
function "+"(
Item : in Record_Vector_4)
return Record_Vector_4;
function "+"(
Item : in Record_Vector_6)
return Record_Vector_6;
function "+"(
Left : in Record_Vector_2;
Right : in Record_Vector_2)
return Record_Vector_2;
function "+"(
Left : in Record_Vector_3;
Right : in Record_Vector_3)
return Record_Vector_3;
function "+"(
Left : in Record_Vector_4;
Right : in Record_Vector_4)
return Record_Vector_4;
function "+"(
Left : in Record_Vector_6;
Right : in Record_Vector_6)
return Record_Vector_6;
function "*"(
Left : in Record_Vector_2;
Right : in Record_Vector_2);
return Float_4_Real;
function "*"(
Left : in Record_Vector_2;
Right : in Float_4_Real);
return Record_Vector_2;
function "*"(
Left : in Float_4_Real;
Right : in Record_Vector_2);
return Record_Vector_2;
function "*"(
Left : in Record_Vector_3;
Right : in Float_4_Real);
return Record_Vector_3;
function "*"(
Left : in Float_4_Real;
Right : in Record_Vector_3);
return Record_Vector_3;
function "*"(
Left : in Float_4_Real;
Right : in Float_4_Real);
return Record_Vector_3;
function "*"(
Left : in Record_Vector_4;
Right : in Float_4_Real);
return Record_Vector_4;
function "*"(
Left : in Float_4_Real;
Right : in Record_Vector_4);
return Record_Vector_4;
function "*"(
Left : in Float_4_Real;
Right : in Float_4_Real);
return Record_Vector_4;
function "*"(
Left : in Record_Vector_6;
Right : in Float_4_Real);
return Record_Vector_6;
function "*"(
Left : in Float_4_Real;
Right : in Record_Vector_6);
return Record_Vector_6;
function "*"(
Left : in Float_4_Real;
Right : in Float_4_Real);
return Record_Vector_6;
function "/"(
Left : in Record_Vector_2;
Right : in Float_4_Real)
return Record_Vector_2;
function "/"(
Left : in Float_4_Real;
Right : in Record_Vector_2)
return Record_Vector_2;
function "/"(
Left : in Record_Vector_3;
Right : in Float_4_Real)
return Record_Vector_3;
function "/"(
Left : in Float_4_Real;
Right : in Record_Vector_3)
return Record_Vector_3;
function "/"(
Left : in Record_Vector_4;
Right : in Float_4_Real)
return Record_Vector_4;
function "/"(
Left : in Float_4_Real;
Right : in Record_Vector_4)
return Record_Vector_4;
function "/"(
Left : in Record_Vector_6;
Right : in Float_4_Real)
return Record_Vector_6;
function "/"(
Left : in Float_4_Real;
Right : in Record_Vector_6)
return Record_Vector_6;
function "="(
Left : in Record_Vector_2;
Right : in Record_Vector_2)
return Boolean;
function "="(
Left : in Record_Vector_3;
Right : in Record_Vector_3)
return Boolean;
function "="(
Left : in Record_Vector_4;
Right : in Record_Vector_4)
return Boolean;
function "="(
Left : in Record_Vector_6;
Right : in Record_Vector_6)
return Boolean;
function Scale(
Item_A : in Record_Vector_2;
Item_B : in Record_Vector_)
return Record_Vector_2;
function Truncate(
Item : in Record_Vector_;
Length : in Float_4_Real)
return Record_Vector_2;
procedure Snap(
Item : in out Record_Vector_;
Do_Floor : in Boolean := False);
function Snap(
Item : in Record_Vector_
Do_Floor : in Boolean := False)
return Record_Vector_;
function Clamp(
Item : in Record_Vector_
Minimum : in Record_Vector_2;
Maximum : in Record_Vector_2)
return Record_Vector_;
procedure Clamp(
Item : in out Record_Vector_
Minimum : in Record_Vector_2;
Maximum : in Record_Vector_2);
-- idVec2 Scale( const idVec2 &a ) const;
-- idVec2 Truncate( float length ) const; -- cap length
-- void Clamp( const idVec2 &min, const idVec2 &max );
-- void Lerp( const idVec2 &v1, const idVec2 &v2, const float l );
-- bool FixDegenerateNormal(); -- fix degenerate axial cases
-- bool FixDenormals(); -- change tiny numbers to zero
-- idVec3 Cross( const idVec3 &a ) const;
-- idVec3 & Cross( const idVec3 &a, const idVec3 &b );
-- float Normalize(); -- returns length
-- float NormalizeFast(); -- returns length
-- idVec3 Truncate( float length ) const; -- cap length
-- void Clamp( const idVec3 &min, const idVec3 &max );
-- void Snap(); -- snap to closest integer value
-- void SnapInt(); -- snap towards integer (floor)
-- int GetDimension() const;
-- const char * ToString( int precision = 2 ) const;
-- void NormalVectors( idVec3 &left, idVec3 &down ) const; -- vector should be normalized
-- void OrthogonalBasis( idVec3 &left, idVec3 &up ) const;
-- void ProjectOntoPlane( const idVec3 &normal, const float overBounce = 1.0f );
-- bool ProjectAlongPlane( const idVec3 &normal, const float epsilon, const float overBounce = 1.0f );
-- void ProjectSelfOntoSphere( const float radius );
-- void Lerp( const idVec3 &v1, const idVec3 &v2, const float l );
-- void SLerp( const idVec3 &v1, const idVec3 &v2, const float l );
-- void Lerp( const idVec4 &v1, const idVec4 &v2, const float l );
-- void Lerp( const idVec5 &v1, const idVec5 &v2, const float l );
-- const idVec3 & SubVec3( int index ) const;
-- idVec3 & SubVec3( int index );
-- ID_INLINE idVecX();
-- ID_INLINE explicit idVecX( int length );
-- ID_INLINE explicit idVecX( int length, float *data );
-- ID_INLINE ~idVecX();
-- ID_INLINE float Get( int index ) const;
-- ID_INLINE float & Get( int index );
-- ID_INLINE float operator[]( const int index ) const;
-- ID_INLINE float & operator[]( const int index );
-- ID_INLINE idVecX operator-() const;
-- ID_INLINE idVecX & operator=( const idVecX &a );
-- ID_INLINE idVecX operator*( const float a ) const;
-- ID_INLINE idVecX operator/( const float a ) const;
-- ID_INLINE float operator*( const idVecX &a ) const;
-- ID_INLINE idVecX operator-( const idVecX &a ) const;
-- ID_INLINE idVecX operator+( const idVecX &a ) const;
-- ID_INLINE idVecX & operator*=( const float a );
-- ID_INLINE idVecX & operator/=( const float a );
-- ID_INLINE idVecX & operator+=( const idVecX &a );
-- ID_INLINE idVecX & operator-=( const idVecX &a );
-- friend ID_INLINE idVecX operator*( const float a, const idVecX &b );
-- ID_INLINE bool Compare( const idVecX &a ) const; -- exact compare, no epsilon
-- ID_INLINE bool Compare( const idVecX &a, const float epsilon ) const; -- compare with epsilon
-- ID_INLINE bool operator==( const idVecX &a ) const; -- exact compare, no epsilon
-- ID_INLINE bool operator!=( const idVecX &a ) const; -- exact compare, no epsilon
-- ID_INLINE void SetSize( int size );
-- ID_INLINE void ChangeSize( int size, bool makeZero = false );
-- ID_INLINE int GetSize() const { return size; }
-- ID_INLINE void SetData( int length, float *data );
-- ID_INLINE void Zero();
-- ID_INLINE void Random( int seed, float l = 0.0f, float u = 1.0f );
-- ID_INLINE void Random( int length, int seed, float l = 0.0f, float u = 1.0f );
-- ID_INLINE void Negate();
-- ID_INLINE void Clamp( float min, float max );
-- ID_INLINE idVecX & SwapElements( int e1, int e2 );
-- ID_INLINE float Length() const;
-- ID_INLINE float LengthSqr() const;
-- ID_INLINE idVecX Normalize() const;
-- ID_INLINE float NormalizeSelf();
-- ID_INLINE int GetDimension() const;
-- ID_INLINE void AddScaleAdd( const float scale, const idVecX & v0, const idVecX & v1 );
-- ID_INLINE const idVec3 & SubVec3( int index ) const;
-- ID_INLINE idVec3 & SubVec3( int index );
-- ID_INLINE const idVec6 & SubVec6( int index = 0 ) const;
-- ID_INLINE idVec6 & SubVec6( int index = 0 );
-- ID_INLINE const float * ToFloatPtr() const;
-- ID_INLINE float * ToFloatPtr();
-- const char * ToString( int precision = 2 ) const;
-------
private
-------
-------------
-- Records --
-------------
type Record_Vector
is new Ada.Finalization.Controlled
with record
int size; -- size of the vector
int alloced; -- if -1 p points to data set with SetData
float * p; -- memory the vector is stored
static float temp[VECX_MAX_TEMP+4]; -- used to store intermediate results
static float * tempPtr; -- pointer to 16 byte aligned temporary memory
static int tempIndex; -- index into memory pool, wraps around
end record;
-----------------
-- Subprograms --
-----------------
ID_INLINE void SetTempSize( int size );
end Neo.Library.Vectors;