Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Extras / sph / common / vector.h
1 /*
2   FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU
3   Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com
4
5   ZLib license
6   This software is provided 'as-is', without any express or implied
7   warranty.  In no event will the authors be held liable for any damages
8   arising from the use of this software.
9
10   Permission is granted to anyone to use this software for any purpose,
11   including commercial applications, and to alter it and redistribute it
12   freely, subject to the following restrictions:
13
14   1. The origin of this software must not be misrepresented; you must not
15      claim that you wrote the original software. If you use this software
16      in a product, an acknowledgment in the product documentation would be
17      appreciated but is not required.
18   2. Altered source versions must be plainly marked as such, and must not be
19      misrepresented as being the original software.
20   3. This notice may not be removed or altered from any source distribution.
21 */
22 // ** NOTES **
23 // Vector code CANNOT be inlined in header file because of dependencies
24 //    across vector classes (error generated: "Use of undeclared class..")
25 // 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <iostream>
29 #include <memory.h>
30 #include <math.h>
31
32 #ifndef VECTOR_DEF
33         #define VECTOR_DEF
34
35         //#define VECTOR_INITIALIZE                             // Initializes vectors  
36                                                                                                                                 
37         class Vector2DC;                                                // Forward Referencing
38         class Vector2DI;
39         class Vector2DF;
40         class Vector3DC;
41         class Vector3DI;
42         class Vector3DF;
43         class Vector4DF;        
44         class MatrixF;
45         class Matrix4F;
46
47         // Vector2DC Declaration
48         
49         #define VNAME           2DC
50         #define VTYPE           unsigned char
51
52         class Vector2DC {
53         public:
54                 VTYPE x, y;
55
56                 // Constructors/Destructors
57                 inline Vector2DC();
58                 inline ~Vector2DC();
59                 inline Vector2DC (VTYPE xa, VTYPE ya);
60                 inline Vector2DC (Vector2DC &op);       
61                 inline Vector2DC (Vector2DI &op);       
62                 inline Vector2DC (Vector2DF &op);       
63                 inline Vector2DC (Vector3DC &op);       
64                 inline Vector2DC (Vector3DI &op);       
65                 inline Vector2DC (Vector3DF &op);       
66                 inline Vector2DC (Vector4DF &op);
67
68                 // Member Functions
69                 inline Vector2DC &operator= (Vector2DC &op);
70                 inline Vector2DC &operator= (Vector2DI &op);
71                 inline Vector2DC &operator= (Vector2DF &op);
72                 inline Vector2DC &operator= (Vector3DC &op);
73                 inline Vector2DC &operator= (Vector3DI &op);
74                 inline Vector2DC &operator= (Vector3DF &op);
75                 inline Vector2DC &operator= (Vector4DF &op);
76                 
77                 inline Vector2DC &operator+= (Vector2DC &op);
78                 inline Vector2DC &operator+= (Vector2DI &op);
79                 inline Vector2DC &operator+= (Vector2DF &op);
80                 inline Vector2DC &operator+= (Vector3DC &op);
81                 inline Vector2DC &operator+= (Vector3DI &op);
82                 inline Vector2DC &operator+= (Vector3DF &op);
83                 inline Vector2DC &operator+= (Vector4DF &op);
84
85                 inline Vector2DC &operator-= (Vector2DC &op);
86                 inline Vector2DC &operator-= (Vector2DI &op);
87                 inline Vector2DC &operator-= (Vector2DF &op);
88                 inline Vector2DC &operator-= (Vector3DC &op);
89                 inline Vector2DC &operator-= (Vector3DI &op);
90                 inline Vector2DC &operator-= (Vector3DF &op);
91                 inline Vector2DC &operator-= (Vector4DF &op);
92         
93                 inline Vector2DC &operator*= (Vector2DC &op);
94                 inline Vector2DC &operator*= (Vector2DI &op);
95                 inline Vector2DC &operator*= (Vector2DF &op);
96                 inline Vector2DC &operator*= (Vector3DC &op);
97                 inline Vector2DC &operator*= (Vector3DI &op);
98                 inline Vector2DC &operator*= (Vector3DF &op);
99                 inline Vector2DC &operator*= (Vector4DF &op);
100
101                 inline Vector2DC &operator/= (Vector2DC &op);
102                 inline Vector2DC &operator/= (Vector2DI &op);
103                 inline Vector2DC &operator/= (Vector2DF &op);
104                 inline Vector2DC &operator/= (Vector3DC &op);
105                 inline Vector2DC &operator/= (Vector3DI &op);
106                 inline Vector2DC &operator/= (Vector3DF &op);
107                 inline Vector2DC &operator/= (Vector4DF &op);
108
109                 // Note: Cross product does not exist for 2D vectors (only 3D)
110                 
111                 inline double Dot(Vector2DC &v);
112                 inline double Dot(Vector2DI &v);
113                 inline double Dot(Vector2DF &v);
114
115                 inline double Dist (Vector2DC &v);
116                 inline double Dist (Vector2DI &v);
117                 inline double Dist (Vector2DF &v);
118                 inline double Dist (Vector3DC &v);
119                 inline double Dist (Vector3DI &v);
120                 inline double Dist (Vector3DF &v);
121                 inline double Dist (Vector4DF &v);
122
123                 inline double DistSq (Vector2DC &v);            
124                 inline double DistSq (Vector2DI &v);            
125                 inline double DistSq (Vector2DF &v);            
126                 inline double DistSq (Vector3DC &v);            
127                 inline double DistSq (Vector3DI &v);            
128                 inline double DistSq (Vector3DF &v);            
129                 inline double DistSq (Vector4DF &v);
130
131                 inline Vector2DC &Normalize (void);
132                 inline double Length (void);
133
134                 inline VTYPE &X(void);
135                 inline VTYPE &Y(void);
136                 inline VTYPE Z(void);
137                 inline VTYPE W(void);
138                 inline const VTYPE &X(void) const;                      
139                 inline const VTYPE &Y(void) const;                      
140                 inline const VTYPE Z(void) const;                       
141                 inline const VTYPE W(void) const;
142                 inline VTYPE *Data (void);
143         };
144         
145         #undef VNAME
146         #undef VTYPE
147
148         // Vector2DI Declaration
149
150         #define VNAME           2DI
151         #define VTYPE           int
152
153         class Vector2DI {
154         public:
155                 VTYPE x, y;
156
157                 // Constructors/Destructors
158                 inline Vector2DI();                                                     
159                 inline ~Vector2DI();                    
160                 inline Vector2DI (VTYPE xa, VTYPE ya);
161                 inline Vector2DI (Vector2DC &op);                               
162                 inline Vector2DI (Vector2DI &op);                               
163                 inline Vector2DI (Vector2DF &op);                               
164                 inline Vector2DI (Vector3DC &op);                               
165                 inline Vector2DI (Vector3DI &op);                               
166                 inline Vector2DI (Vector3DF &op);                               
167                 inline Vector2DI (Vector4DF &op);
168
169                 // Member Functions
170                 inline Vector2DI &operator= (Vector2DC &op);
171                 inline Vector2DI &operator= (Vector2DI &op);
172                 inline Vector2DI &operator= (Vector2DF &op);
173                 inline Vector2DI &operator= (Vector3DC &op);
174                 inline Vector2DI &operator= (Vector3DI &op);
175                 inline Vector2DI &operator= (Vector3DF &op);
176                 inline Vector2DI &operator= (Vector4DF &op);
177
178                 inline Vector2DI &operator+= (Vector2DC &op);
179                 inline Vector2DI &operator+= (Vector2DI &op);
180                 inline Vector2DI &operator+= (Vector2DF &op);
181                 inline Vector2DI &operator+= (Vector3DC &op);
182                 inline Vector2DI &operator+= (Vector3DI &op);
183                 inline Vector2DI &operator+= (Vector3DF &op);
184                 inline Vector2DI &operator+= (Vector4DF &op);
185
186                 inline Vector2DI &operator-= (Vector2DC &op);
187                 inline Vector2DI &operator-= (Vector2DI &op);
188                 inline Vector2DI &operator-= (Vector2DF &op);
189                 inline Vector2DI &operator-= (Vector3DC &op);
190                 inline Vector2DI &operator-= (Vector3DI &op);
191                 inline Vector2DI &operator-= (Vector3DF &op);
192                 inline Vector2DI &operator-= (Vector4DF &op);
193         
194                 inline Vector2DI &operator*= (Vector2DC &op);
195                 inline Vector2DI &operator*= (Vector2DI &op);
196                 inline Vector2DI &operator*= (Vector2DF &op);
197                 inline Vector2DI &operator*= (Vector3DC &op);
198                 inline Vector2DI &operator*= (Vector3DI &op);
199                 inline Vector2DI &operator*= (Vector3DF &op);
200                 inline Vector2DI &operator*= (Vector4DF &op);
201
202                 inline Vector2DI &operator/= (Vector2DC &op);
203                 inline Vector2DI &operator/= (Vector2DI &op);
204                 inline Vector2DI &operator/= (Vector2DF &op);
205                 inline Vector2DI &operator/= (Vector3DC &op);
206                 inline Vector2DI &operator/= (Vector3DI &op);
207                 inline Vector2DI &operator/= (Vector3DF &op);
208                 inline Vector2DI &operator/= (Vector4DF &op);
209
210
211                 // Note: Cross product does not exist for 2D vectors (only 3D)
212                 
213                 inline double Dot(Vector2DC &v);
214                 inline double Dot(Vector2DI &v);
215                 inline double Dot(Vector2DF &v);
216
217                 inline double Dist (Vector2DC &v);
218                 inline double Dist (Vector2DI &v);
219                 inline double Dist (Vector2DF &v);
220                 inline double Dist (Vector3DC &v);
221                 inline double Dist (Vector3DI &v);
222                 inline double Dist (Vector3DF &v);
223                 inline double Dist (Vector4DF &v);
224
225                 inline double DistSq (Vector2DC &v);
226                 inline double DistSq (Vector2DI &v);
227                 inline double DistSq (Vector2DF &v);
228                 inline double DistSq (Vector3DC &v);
229                 inline double DistSq (Vector3DI &v);
230                 inline double DistSq (Vector3DF &v);
231                 inline double DistSq (Vector4DF &v);
232                 
233                 inline Vector2DI &Normalize (void);
234                 inline double Length (void);
235
236                 inline VTYPE &X(void);
237                 inline VTYPE &Y(void);
238                 inline VTYPE Z(void);
239                 inline VTYPE W(void);
240                 inline const VTYPE &X(void) const;
241                 inline const VTYPE &Y(void) const;
242                 inline const VTYPE Z(void) const;
243                 inline const VTYPE W(void) const;
244                 inline VTYPE *Data (void);
245         };
246         
247         #undef VNAME
248         #undef VTYPE
249
250         // Vector2DF Declarations
251
252         #define VNAME           2DF
253         #define VTYPE           double
254
255         class Vector2DF {
256         public:
257                 VTYPE x, y;
258
259                 // Constructors/Destructors
260                  Vector2DF ();
261                  ~Vector2DF ();
262                  Vector2DF (const VTYPE xa, const VTYPE ya);
263                  Vector2DF (const Vector2DC &op);
264                  Vector2DF (const Vector2DI &op);
265                  Vector2DF (const Vector2DF &op);
266                  Vector2DF (const Vector3DC &op);
267                  Vector2DF (const Vector3DI &op);
268                  Vector2DF (const Vector3DF &op);
269                  Vector2DF (const Vector4DF &op);
270
271                 // Member Functions
272                  Vector2DF &operator= (const Vector2DC &op);
273                  Vector2DF &operator= (const Vector2DI &op);
274                  Vector2DF &operator= (const Vector2DF &op);
275                  Vector2DF &operator= (const Vector3DC &op);
276                  Vector2DF &operator= (const Vector3DI &op);
277                  Vector2DF &operator= (const Vector3DF &op);
278                  Vector2DF &operator= (const Vector4DF &op);
279                 
280                  Vector2DF &operator+= (const Vector2DC &op);
281                  Vector2DF &operator+= (const Vector2DI &op);
282                  Vector2DF &operator+= (const Vector2DF &op);
283                  Vector2DF &operator+= (const Vector3DC &op);
284                  Vector2DF &operator+= (const Vector3DI &op);
285                  Vector2DF &operator+= (const Vector3DF &op);
286                  Vector2DF &operator+= (const Vector4DF &op);
287
288                  Vector2DF &operator-= (const Vector2DC &op);
289                  Vector2DF &operator-= (const Vector2DI &op);
290                  Vector2DF &operator-= (const Vector2DF &op);
291                  Vector2DF &operator-= (const Vector3DC &op);
292                  Vector2DF &operator-= (const Vector3DI &op);
293                  Vector2DF &operator-= (const Vector3DF &op);
294                  Vector2DF &operator-= (const Vector4DF &op);
295
296                  Vector2DF &operator*= (const Vector2DC &op);
297                  Vector2DF &operator*= (const Vector2DI &op);
298                  Vector2DF &operator*= (const Vector2DF &op);
299                  Vector2DF &operator*= (const Vector3DC &op);
300                  Vector2DF &operator*= (const Vector3DI &op);
301                  Vector2DF &operator*= (const Vector3DF &op);
302                  Vector2DF &operator*= (const Vector4DF &op);
303
304                  Vector2DF &operator/= (const Vector2DC &op);
305                  Vector2DF &operator/= (const Vector2DI &op);
306                  Vector2DF &operator/= (const Vector2DF &op);
307                  Vector2DF &operator/= (const Vector3DC &op);
308                  Vector2DF &operator/= (const Vector3DI &op);
309                  Vector2DF &operator/= (const Vector3DF &op);
310                  Vector2DF &operator/= (const Vector4DF &op);
311
312                  Vector2DF &operator/= (const double v)         {x /= v; y /= v; return *this;}
313
314                 // Note: Cross product does not exist for 2D vectors (only 3D)
315                 
316                  double Dot(const Vector2DC &v);
317                  double Dot(const Vector2DI &v);
318                  double Dot(const Vector2DF &v);
319
320                  double Dist (const Vector2DC &v);
321                  double Dist (const Vector2DI &v);
322                  double Dist (const Vector2DF &v);
323                  double Dist (const Vector3DC &v);
324                  double Dist (const Vector3DI &v);
325                  double Dist (const Vector3DF &v);
326                  double Dist (const Vector4DF &v);
327
328                  double DistSq (const Vector2DC &v);
329                  double DistSq (const Vector2DI &v);
330                  double DistSq (const Vector2DF &v);
331                  double DistSq (const Vector3DC &v);
332                  double DistSq (const Vector3DI &v);
333                  double DistSq (const Vector3DF &v);
334                  double DistSq (const Vector4DF &v);
335
336                  Vector2DF &Normalize (void);
337                  double Length (void);
338
339                  VTYPE &X(void);
340                  VTYPE &Y(void);
341                  VTYPE Z(void);
342                  VTYPE W(void);
343                  const VTYPE &X(void) const;
344                  const VTYPE &Y(void) const;
345                  const VTYPE Z(void) const;
346                  const VTYPE W(void) const;
347                  VTYPE *Data (void);
348         };
349         
350         #undef VNAME
351         #undef VTYPE
352
353         // Vector3DC Declaration
354         
355         #define VNAME           3DC
356         #define VTYPE           unsigned char
357
358         class Vector3DC {
359         public: 
360                 VTYPE x, y, z;
361         
362                 // Constructors/Destructors
363                 inline Vector3DC();
364                 inline ~Vector3DC();
365                 inline Vector3DC (VTYPE xa, VTYPE ya, VTYPE za);
366                 inline Vector3DC (Vector2DC &op);
367                 inline Vector3DC (Vector2DI &op);
368                 inline Vector3DC (Vector2DF &op);
369                 inline Vector3DC (Vector3DC &op);
370                 inline Vector3DC (Vector3DI &op);
371                 inline Vector3DC (Vector3DF &op);
372                 inline Vector3DC (Vector4DF &op);
373
374                 // Member Functions
375                 inline Vector3DC &Set (VTYPE xa, VTYPE ya, VTYPE za);
376                 
377                 inline Vector3DC &operator= (Vector2DC &op);
378                 inline Vector3DC &operator= (Vector2DI &op);
379                 inline Vector3DC &operator= (Vector2DF &op);
380                 inline Vector3DC &operator= (Vector3DC &op);
381                 inline Vector3DC &operator= (Vector3DI &op);
382                 inline Vector3DC &operator= (Vector3DF &op);
383                 inline Vector3DC &operator= (Vector4DF &op);
384                 
385                 inline Vector3DC &operator+= (Vector2DC &op);
386                 inline Vector3DC &operator+= (Vector2DI &op);
387                 inline Vector3DC &operator+= (Vector2DF &op);
388                 inline Vector3DC &operator+= (Vector3DC &op);
389                 inline Vector3DC &operator+= (Vector3DI &op);
390                 inline Vector3DC &operator+= (Vector3DF &op);
391                 inline Vector3DC &operator+= (Vector4DF &op);
392
393                 inline Vector3DC &operator-= (Vector2DC &op);
394                 inline Vector3DC &operator-= (Vector2DI &op);
395                 inline Vector3DC &operator-= (Vector2DF &op);
396                 inline Vector3DC &operator-= (Vector3DC &op);
397                 inline Vector3DC &operator-= (Vector3DI &op);
398                 inline Vector3DC &operator-= (Vector3DF &op);
399                 inline Vector3DC &operator-= (Vector4DF &op);
400         
401                 inline Vector3DC &operator*= (Vector2DC &op);
402                 inline Vector3DC &operator*= (Vector2DI &op);
403                 inline Vector3DC &operator*= (Vector2DF &op);
404                 inline Vector3DC &operator*= (Vector3DC &op);
405                 inline Vector3DC &operator*= (Vector3DI &op);
406                 inline Vector3DC &operator*= (Vector3DF &op);
407                 inline Vector3DC &operator*= (Vector4DF &op);
408
409                 inline Vector3DC &operator/= (Vector2DC &op);
410                 inline Vector3DC &operator/= (Vector2DI &op);
411                 inline Vector3DC &operator/= (Vector2DF &op);
412                 inline Vector3DC &operator/= (Vector3DC &op);
413                 inline Vector3DC &operator/= (Vector3DI &op);
414                 inline Vector3DC &operator/= (Vector3DF &op);
415                 inline Vector3DC &operator/= (Vector4DF &op);
416
417                 inline Vector3DC &Cross (Vector3DC &v);
418                 inline Vector3DC &Cross (Vector3DI &v);
419                 inline Vector3DC &Cross (Vector3DF &v); 
420                 
421                 inline double Dot(Vector3DC &v);
422                 inline double Dot(Vector3DI &v);
423                 inline double Dot(Vector3DF &v);
424
425                 inline double Dist (Vector2DC &v);
426                 inline double Dist (Vector2DI &v);
427                 inline double Dist (Vector2DF &v);
428                 inline double Dist (Vector3DC &v);
429                 inline double Dist (Vector3DI &v);
430                 inline double Dist (Vector3DF &v);
431                 inline double Dist (Vector4DF &v);
432
433                 inline double DistSq (Vector2DC &v);
434                 inline double DistSq (Vector2DI &v);
435                 inline double DistSq (Vector2DF &v);
436                 inline double DistSq (Vector3DC &v);
437                 inline double DistSq (Vector3DI &v);
438                 inline double DistSq (Vector3DF &v);
439                 inline double DistSq (Vector4DF &v);
440
441                 inline Vector3DC &Normalize (void);
442                 inline double Length (void);
443
444                 inline VTYPE &X(void);
445                 inline VTYPE &Y(void);
446                 inline VTYPE &Z(void);
447                 inline VTYPE W(void);
448                 inline const VTYPE &X(void) const;
449                 inline const VTYPE &Y(void) const;
450                 inline const VTYPE &Z(void) const;
451                 inline const VTYPE W(void) const;
452                 inline VTYPE *Data (void);
453         };
454         
455         #undef VNAME
456         #undef VTYPE
457
458         // Vector3DI Declaration
459
460         #define VNAME           3DI
461         #define VTYPE           int
462
463         class Vector3DI {
464         public:
465                 VTYPE x, y, z;
466         
467                 // Constructors/Destructors
468                 inline Vector3DI();
469                 inline ~Vector3DI();
470                 inline Vector3DI (VTYPE xa, VTYPE ya, VTYPE za);
471                 inline Vector3DI (Vector2DC &op);
472                 inline Vector3DI (Vector2DI &op);
473                 inline Vector3DI (Vector2DF &op);
474                 inline Vector3DI (Vector3DC &op);
475                 inline Vector3DI (Vector3DI &op);
476                 inline Vector3DI (Vector3DF &op);
477                 inline Vector3DI (Vector4DF &op);
478
479                 // Set Functions
480                 inline Vector3DI &Set (const int xa, const int ya, const int za);
481
482                 // Member Functions
483                 inline Vector3DI &operator= (Vector2DC &op);
484                 inline Vector3DI &operator= (Vector2DI &op);
485                 inline Vector3DI &operator= (Vector2DF &op);
486                 inline Vector3DI &operator= (Vector3DC &op);
487                 inline Vector3DI &operator= (Vector3DI &op);
488                 inline Vector3DI &operator= (Vector3DF &op);
489                 inline Vector3DI &operator= (Vector4DF &op);
490                 
491                 inline Vector3DI &operator+= (Vector2DC &op);
492                 inline Vector3DI &operator+= (Vector2DI &op);
493                 inline Vector3DI &operator+= (Vector2DF &op);
494                 inline Vector3DI &operator+= (Vector3DC &op);
495                 inline Vector3DI &operator+= (Vector3DI &op);
496                 inline Vector3DI &operator+= (Vector3DF &op);
497                 inline Vector3DI &operator+= (Vector4DF &op);
498
499                 inline Vector3DI &operator-= (Vector2DC &op);
500                 inline Vector3DI &operator-= (Vector2DI &op);
501                 inline Vector3DI &operator-= (Vector2DF &op);
502                 inline Vector3DI &operator-= (Vector3DC &op);
503                 inline Vector3DI &operator-= (Vector3DI &op);
504                 inline Vector3DI &operator-= (Vector3DF &op);
505                 inline Vector3DI &operator-= (Vector4DF &op);
506         
507                 inline Vector3DI &operator*= (Vector2DC &op);
508                 inline Vector3DI &operator*= (Vector2DI &op);
509                 inline Vector3DI &operator*= (Vector2DF &op);
510                 inline Vector3DI &operator*= (Vector3DC &op);
511                 inline Vector3DI &operator*= (Vector3DI &op);
512                 inline Vector3DI &operator*= (Vector3DF &op);
513                 inline Vector3DI &operator*= (Vector4DF &op);
514
515                 inline Vector3DI &operator/= (Vector2DC &op);
516                 inline Vector3DI &operator/= (Vector2DI &op);
517                 inline Vector3DI &operator/= (Vector2DF &op);
518                 inline Vector3DI &operator/= (Vector3DC &op);
519                 inline Vector3DI &operator/= (Vector3DI &op);
520                 inline Vector3DI &operator/= (Vector3DF &op);
521                 inline Vector3DI &operator/= (Vector4DF &op);
522
523                 inline Vector3DI &Cross (Vector3DC &v);
524                 inline Vector3DI &Cross (Vector3DI &v);
525                 inline Vector3DI &Cross (Vector3DF &v); 
526                 
527                 inline double Dot(Vector3DC &v);
528                 inline double Dot(Vector3DI &v);
529                 inline double Dot(Vector3DF &v);
530
531                 inline double Dist (Vector2DC &v);
532                 inline double Dist (Vector2DI &v);
533                 inline double Dist (Vector2DF &v);
534                 inline double Dist (Vector3DC &v);
535                 inline double Dist (Vector3DI &v);
536                 inline double Dist (Vector3DF &v);
537                 inline double Dist (Vector4DF &v);
538
539                 inline double DistSq (Vector2DC &v);
540                 inline double DistSq (Vector2DI &v);
541                 inline double DistSq (Vector2DF &v);
542                 inline double DistSq (Vector3DC &v);
543                 inline double DistSq (Vector3DI &v);
544                 inline double DistSq (Vector3DF &v);
545                 inline double DistSq (Vector4DF &v);
546
547                 inline Vector3DI &Normalize (void);
548                 inline double Length (void);
549
550                 inline VTYPE &X(void);
551                 inline VTYPE &Y(void);
552                 inline VTYPE &Z(void);
553                 inline VTYPE W(void);
554                 inline const VTYPE &X(void) const;
555                 inline const VTYPE &Y(void) const;
556                 inline const VTYPE &Z(void) const;
557                 inline const VTYPE W(void) const;
558                 inline VTYPE *Data (void);
559         };
560         
561         #undef VNAME
562         #undef VTYPE
563
564         // Vector3DF Declarations
565
566         #define VNAME           3DF
567         #define VTYPE           float
568
569         class Vector3DF {
570         public:
571                 VTYPE x, y, z;
572         
573                 // Constructors/Destructors
574                 inline Vector3DF();
575                 inline ~Vector3DF();
576                 inline Vector3DF (const VTYPE xa, const VTYPE ya, const VTYPE za);
577                 inline Vector3DF (const Vector2DC &op);
578                 inline Vector3DF (const Vector2DI &op);
579                 inline Vector3DF (const Vector2DF &op);
580                 inline Vector3DF (const Vector3DC &op);
581                 inline Vector3DF (const Vector3DI &op);
582                 inline Vector3DF (const Vector3DF &op);
583                 inline Vector3DF (const Vector4DF &op);
584
585                 // Set Functions
586                 inline Vector3DF &Set (const double xa, const double ya, const double za);
587                 
588                 // Member Functions
589                 inline Vector3DF &operator= (const int op);
590                 inline Vector3DF &operator= (const double op);
591                 inline Vector3DF &operator= (const Vector2DC &op);
592                 inline Vector3DF &operator= (const Vector2DI &op);
593                 inline Vector3DF &operator= (const Vector2DF &op);
594                 inline Vector3DF &operator= (const Vector3DC &op);
595                 inline Vector3DF &operator= (const Vector3DI &op);
596                 inline Vector3DF &operator= (const Vector3DF &op);
597                 inline Vector3DF &operator= (const Vector4DF &op);
598
599                 inline Vector3DF &operator+= (const int op);
600                 inline Vector3DF &operator+= (const double op);
601                 inline Vector3DF &operator+= (const Vector2DC &op);
602                 inline Vector3DF &operator+= (const Vector2DI &op);
603                 inline Vector3DF &operator+= (const Vector2DF &op);
604                 inline Vector3DF &operator+= (const Vector3DC &op);
605                 inline Vector3DF &operator+= (const Vector3DI &op);
606                 inline Vector3DF &operator+= (const Vector3DF &op);
607                 inline Vector3DF &operator+= (const Vector4DF &op);
608
609                 inline Vector3DF &operator-= (const int op);
610                 inline Vector3DF &operator-= (const double op);
611                 inline Vector3DF &operator-= (const Vector2DC &op);
612                 inline Vector3DF &operator-= (const Vector2DI &op);
613                 inline Vector3DF &operator-= (const Vector2DF &op);
614                 inline Vector3DF &operator-= (const Vector3DC &op);
615                 inline Vector3DF &operator-= (const Vector3DI &op);
616                 inline Vector3DF &operator-= (const Vector3DF &op);
617                 inline Vector3DF &operator-= (const Vector4DF &op);
618         
619                 inline Vector3DF &operator*= (const int op);
620                 inline Vector3DF &operator*= (const double op);
621                 inline Vector3DF &operator*= (const Vector2DC &op);
622                 inline Vector3DF &operator*= (const Vector2DI &op);
623                 inline Vector3DF &operator*= (const Vector2DF &op);
624                 inline Vector3DF &operator*= (const Vector3DC &op);
625                 inline Vector3DF &operator*= (const Vector3DI &op);
626                 inline Vector3DF &operator*= (const Vector3DF &op);
627                 inline Vector3DF &operator*= (const Vector4DF &op);
628                 Vector3DF &operator*= (const Matrix4F &op);
629                 Vector3DF &operator*= (const MatrixF &op);                              // see vector.cpp
630
631                 inline Vector3DF &operator/= (const int op);
632                 inline Vector3DF &operator/= (const double op);
633                 inline Vector3DF &operator/= (const Vector2DC &op);
634                 inline Vector3DF &operator/= (const Vector2DI &op);
635                 inline Vector3DF &operator/= (const Vector2DF &op);
636                 inline Vector3DF &operator/= (const Vector3DC &op);
637                 inline Vector3DF &operator/= (const Vector3DI &op);
638                 inline Vector3DF &operator/= (const Vector3DF &op);
639                 inline Vector3DF &operator/= (const Vector4DF &op);
640
641                 inline Vector3DF &Cross (const Vector3DC &v);
642                 inline Vector3DF &Cross (const Vector3DI &v);
643                 inline Vector3DF &Cross (const Vector3DF &v);   
644                 
645                 inline double Dot(const Vector3DC &v);
646                 inline double Dot(const Vector3DI &v);
647                 inline double Dot(const Vector3DF &v);
648
649                 inline double Dist (const Vector2DC &v);
650                 inline double Dist (const Vector2DI &v);
651                 inline double Dist (const Vector2DF &v);
652                 inline double Dist (const Vector3DC &v);
653                 inline double Dist (const Vector3DI &v);
654                 inline double Dist (const Vector3DF &v);
655                 inline double Dist (const Vector4DF &v);
656
657                 inline double DistSq (const Vector2DC &v);
658                 inline double DistSq (const Vector2DI &v);
659                 inline double DistSq (const Vector2DF &v);
660                 inline double DistSq (const Vector3DC &v);
661                 inline double DistSq (const Vector3DI &v);
662                 inline double DistSq (const Vector3DF &v);
663                 inline double DistSq (const Vector4DF &v);
664                 
665                 inline Vector3DF &Normalize (void);
666                 inline double Length (void);
667
668                 inline VTYPE &X();
669                 inline VTYPE &Y();
670                 inline VTYPE &Z();
671                 inline VTYPE W();
672                 inline const VTYPE &X() const;
673                 inline const VTYPE &Y() const;
674                 inline const VTYPE &Z() const;
675                 inline const VTYPE W() const;
676                 inline VTYPE *Data ();
677         };
678         
679         #undef VNAME
680         #undef VTYPE
681
682         // Vector4DF Declarations
683
684         #define VNAME           4DF
685         #define VTYPE           double
686
687         class Vector4DF {
688         public:
689                 VTYPE x, y, z, w;
690         
691                 // Constructors/Destructors
692                 inline Vector4DF();
693                 inline ~Vector4DF();
694                 inline Vector4DF (VTYPE xa, VTYPE ya, VTYPE za, VTYPE wa);
695                 inline Vector4DF (Vector2DC &op);
696                 inline Vector4DF (Vector2DI &op);
697                 inline Vector4DF (Vector2DF &op);
698                 inline Vector4DF (Vector3DC &op);
699                 inline Vector4DF (Vector3DI &op);
700                 inline Vector4DF (Vector3DF &op);
701                 inline Vector4DF (Vector4DF &op);
702
703                 // Member Functions
704                 inline Vector4DF &operator= (int op);
705                 inline Vector4DF &operator= (double op);
706                 inline Vector4DF &operator= (Vector2DC &op);
707                 inline Vector4DF &operator= (Vector2DI &op);
708                 inline Vector4DF &operator= (Vector2DF &op);
709                 inline Vector4DF &operator= (Vector3DC &op);
710                 inline Vector4DF &operator= (Vector3DI &op);
711                 inline Vector4DF &operator= (Vector3DF &op);
712                 inline Vector4DF &operator= (Vector4DF &op);
713
714                 inline Vector4DF &operator+= (int op);
715                 inline Vector4DF &operator+= (double op);
716                 inline Vector4DF &operator+= (Vector2DC &op);
717                 inline Vector4DF &operator+= (Vector2DI &op);
718                 inline Vector4DF &operator+= (Vector2DF &op);
719                 inline Vector4DF &operator+= (Vector3DC &op);
720                 inline Vector4DF &operator+= (Vector3DI &op);
721                 inline Vector4DF &operator+= (Vector3DF &op);
722                 inline Vector4DF &operator+= (Vector4DF &op);
723
724                 inline Vector4DF &operator-= (int op);
725                 inline Vector4DF &operator-= (double op);
726                 inline Vector4DF &operator-= (Vector2DC &op);
727                 inline Vector4DF &operator-= (Vector2DI &op);
728                 inline Vector4DF &operator-= (Vector2DF &op);
729                 inline Vector4DF &operator-= (Vector3DC &op);
730                 inline Vector4DF &operator-= (Vector3DI &op);
731                 inline Vector4DF &operator-= (Vector3DF &op);
732                 inline Vector4DF &operator-= (Vector4DF &op);
733         
734                 inline Vector4DF &operator*= (int op);
735                 inline Vector4DF &operator*= (double op);
736                 inline Vector4DF &operator*= (Vector2DC &op);
737                 inline Vector4DF &operator*= (Vector2DI &op);
738                 inline Vector4DF &operator*= (Vector2DF &op);
739                 inline Vector4DF &operator*= (Vector3DC &op);
740                 inline Vector4DF &operator*= (Vector3DI &op);
741                 inline Vector4DF &operator*= (Vector3DF &op);
742                 inline Vector4DF &operator*= (Vector4DF &op);
743                 Vector4DF &operator*= (const Matrix4F &op);
744                 Vector4DF &operator*= (const MatrixF &op);                              // see vector.cpp
745
746                 inline Vector4DF &operator/= (int op);
747                 inline Vector4DF &operator/= (double op);
748                 inline Vector4DF &operator/= (Vector2DC &op);
749                 inline Vector4DF &operator/= (Vector2DI &op);
750                 inline Vector4DF &operator/= (Vector2DF &op);
751                 inline Vector4DF &operator/= (Vector3DC &op);
752                 inline Vector4DF &operator/= (Vector3DI &op);
753                 inline Vector4DF &operator/= (Vector3DF &op);
754                 inline Vector4DF &operator/= (Vector4DF &op);
755
756                 inline Vector4DF &Cross (Vector4DF &v); 
757                 
758                 inline double Dot(Vector4DF &v);
759
760                 inline double Dist (Vector4DF &v);
761
762                 inline double DistSq (Vector4DF &v);
763
764                 inline Vector4DF &Normalize (void);
765                 inline double Length (void);
766
767                 inline VTYPE &X(void);
768                 inline VTYPE &Y(void);
769                 inline VTYPE &Z(void);
770                 inline VTYPE &W(void);
771                 inline const VTYPE &X(void) const;
772                 inline const VTYPE &Y(void) const;
773                 inline const VTYPE &Z(void) const;
774                 inline const VTYPE &W(void) const;
775                 inline VTYPE *Data (void);
776         };
777         
778         #undef VNAME
779         #undef VTYPE
780
781     // Vector Code Definitions (Inlined)
782         #include "vector.cci"
783
784 #endif
785