Tizen 2.1 base
[platform/upstream/libbullet.git] / Extras / sph / common / matrix.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 #include <stdio.h>
23 #include <stdlib.h>
24 #include <iostream>
25 #include <memory.h>
26 #include <math.h>
27
28 //*********** NOTE
29 //
30 // LOOK AT MovieTrackPoint. IN ORDER FOR VECTORS AND MATRICIES TO BE USED IN OBJECTS 
31 // THAT WILL BE USED IN stl::vectors, THEIR CONSTRUCTORS AND OPERATORS MUST TAKE ONLY
32 // const PARAMETERS. LOOK AT MatrixF and Vector2DF.. THIS WAS NOT YET DONE WITH
33 // THE OTHER MATRIX AND VECTOR CLASSES (Vector2DC, Vector2DI, MatrixC, MatrixI, ...)
34 //
35
36
37 #ifndef MATRIX_DEF
38         #define MATRIX_DEF
39                 
40         #include "vector.h"
41         #include "mdebug.h"     
42         
43         //#define MATRIX_INITIALIZE                             // Initializes vectors  
44
45         class MatrixC;                                                  // Forward Referencing
46         class MatrixI;
47         class MatrixF;
48
49         class Matrix {
50         public:
51                 // Member Virtual Functions             
52                 virtual Matrix &operator= (unsigned char c)=0;
53                 virtual Matrix &operator= (int c)=0;
54                 virtual Matrix &operator= (double c)=0;         
55                 virtual Matrix &operator= (MatrixC &op)=0;
56                 virtual Matrix &operator= (MatrixI &op)=0;
57                 virtual Matrix &operator= (MatrixF &op)=0;
58                 
59                 virtual Matrix &operator+= (unsigned char c)=0;
60                 virtual Matrix &operator+= (int c)=0;
61                 virtual Matrix &operator+= (double c)=0;                
62                 virtual Matrix &operator+= (MatrixC &op)=0;
63                 virtual Matrix &operator+= (MatrixI &op)=0;
64                 virtual Matrix &operator+= (MatrixF &op)=0;
65
66                 virtual Matrix &operator-= (unsigned char c)=0;
67                 virtual Matrix &operator-= (int c)=0;
68                 virtual Matrix &operator-= (double c)=0;                
69                 virtual Matrix &operator-= (MatrixC &op)=0;
70                 virtual Matrix &operator-= (MatrixI &op)=0;
71                 virtual Matrix &operator-= (MatrixF &op)=0;
72
73                 virtual Matrix &operator*= (unsigned char c)=0;
74                 virtual Matrix &operator*= (int c)=0;
75                 virtual Matrix &operator*= (double c)=0;                
76                 virtual Matrix &operator*= (MatrixC &op)=0;
77                 virtual Matrix &operator*= (MatrixI &op)=0;
78                 virtual Matrix &operator*= (MatrixF &op)=0;
79
80                 virtual Matrix &operator/= (unsigned char c)=0;
81                 virtual Matrix &operator/= (int c)=0;
82                 virtual Matrix &operator/= (double c)=0;                
83                 virtual Matrix &operator/= (MatrixC &op)=0;
84                 virtual Matrix &operator/= (MatrixI &op)=0;
85                 virtual Matrix &operator/= (MatrixF &op)=0;
86
87                 virtual Matrix &Multiply (MatrixF &op)=0;
88                 virtual Matrix &Resize (int x, int y)=0;
89                 virtual Matrix &ResizeSafe (int x, int y)=0;
90                 virtual Matrix &InsertRow (int r)=0;
91                 virtual Matrix &InsertCol (int c)=0;
92                 virtual Matrix &Transpose (void)=0;
93                 virtual Matrix &Identity (int order)=0;
94                 /*inline Matrix &RotateX (double ang);
95                 inline Matrix &RotateY (double ang);
96                 inline Matrix &RotateZ (double ang); */
97                 virtual Matrix &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3)=0;
98                 virtual Matrix &GaussJordan (MatrixF &b)                { return *this; }
99                 virtual Matrix &ConjugateGradient (MatrixF &b)  { return *this; }
100
101                 virtual int GetRows(void)=0;
102                 virtual int GetCols(void)=0;
103                 virtual int GetLength(void)=0;          
104
105                 virtual unsigned char *GetDataC (void)=0;
106                 virtual int     *GetDataI (void)=0;
107                 virtual double *GetDataF (void)=0;
108
109                 virtual double GetF (int r, int c);
110         };
111         
112         // MatrixC Declaration  
113         #define VNAME           C
114         #define VTYPE           unsigned char
115
116         class MatrixC {
117         public:
118                 VTYPE *data;
119                 int rows, cols, len;            
120
121                 // Constructors/Destructors
122                 inline MatrixC ();
123                 inline ~MatrixC ();
124                 inline MatrixC (int r, int c);
125
126                 // Member Functions
127                 inline VTYPE &operator () (int c, int r);
128                 inline MatrixC &operator= (unsigned char c);
129                 inline MatrixC &operator= (int c);
130                 inline MatrixC &operator= (double c);           
131                 inline MatrixC &operator= (MatrixC &op);
132                 inline MatrixC &operator= (MatrixI &op);
133                 inline MatrixC &operator= (MatrixF &op);
134                 
135                 inline MatrixC &operator+= (unsigned char c);
136                 inline MatrixC &operator+= (int c);
137                 inline MatrixC &operator+= (double c);          
138                 inline MatrixC &operator+= (MatrixC &op);
139                 inline MatrixC &operator+= (MatrixI &op);
140                 inline MatrixC &operator+= (MatrixF &op);
141
142                 inline MatrixC &operator-= (unsigned char c);
143                 inline MatrixC &operator-= (int c);
144                 inline MatrixC &operator-= (double c);          
145                 inline MatrixC &operator-= (MatrixC &op);
146                 inline MatrixC &operator-= (MatrixI &op);
147                 inline MatrixC &operator-= (MatrixF &op);
148
149                 inline MatrixC &operator*= (unsigned char c);
150                 inline MatrixC &operator*= (int c);
151                 inline MatrixC &operator*= (double c);          
152                 inline MatrixC &operator*= (MatrixC &op);
153                 inline MatrixC &operator*= (MatrixI &op);
154                 inline MatrixC &operator*= (MatrixF &op);
155
156                 inline MatrixC &operator/= (unsigned char c);
157                 inline MatrixC &operator/= (int c);
158                 inline MatrixC &operator/= (double c);          
159                 inline MatrixC &operator/= (MatrixC &op);
160                 inline MatrixC &operator/= (MatrixI &op);
161                 inline MatrixC &operator/= (MatrixF &op);
162
163                 inline MatrixC &Multiply (MatrixF &op);
164                 inline MatrixC &Resize (int x, int y);
165                 inline MatrixC &ResizeSafe (int x, int y);
166                 inline MatrixC &InsertRow (int r);
167                 inline MatrixC &InsertCol (int c);
168                 inline MatrixC &Transpose (void);
169                 inline MatrixC &Identity (int order);           
170                 inline MatrixC &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3);
171                 inline MatrixC &GaussJordan (MatrixF &b);
172
173                 inline int GetX();
174                 inline int GetY();      
175                 inline int GetRows(void);
176                 inline int GetCols(void);
177                 inline int GetLength(void);
178                 inline VTYPE *GetData(void);
179
180                 inline unsigned char *GetDataC (void)   {return data;}
181                 inline int *GetDataI (void)                             {return NULL;}
182                 inline double *GetDataF (void)                  {return NULL;}          
183
184                 inline double GetF (int r, int c);
185         };
186         #undef VNAME
187         #undef VTYPE
188
189         // MatrixI Declaration  
190         #define VNAME           I
191         #define VTYPE           int
192
193         class MatrixI {
194         public:
195                 VTYPE *data;
196                 int rows, cols, len;            
197         
198                 // Constructors/Destructors
199                 inline MatrixI ();
200                 inline ~MatrixI ();
201                 inline MatrixI (int r, int c);
202
203                 // Member Functions
204                 inline VTYPE &operator () (int c, int r);
205                 inline MatrixI &operator= (unsigned char c);
206                 inline MatrixI &operator= (int c);
207                 inline MatrixI &operator= (double c);           
208                 inline MatrixI &operator= (MatrixC &op);
209                 inline MatrixI &operator= (MatrixI &op);
210                 inline MatrixI &operator= (MatrixF &op);
211                 
212                 inline MatrixI &operator+= (unsigned char c);
213                 inline MatrixI &operator+= (int c);
214                 inline MatrixI &operator+= (double c);          
215                 inline MatrixI &operator+= (MatrixC &op);
216                 inline MatrixI &operator+= (MatrixI &op);
217                 inline MatrixI &operator+= (MatrixF &op);
218
219                 inline MatrixI &operator-= (unsigned char c);
220                 inline MatrixI &operator-= (int c);
221                 inline MatrixI &operator-= (double c);          
222                 inline MatrixI &operator-= (MatrixC &op);
223                 inline MatrixI &operator-= (MatrixI &op);
224                 inline MatrixI &operator-= (MatrixF &op);
225
226                 inline MatrixI &operator*= (unsigned char c);
227                 inline MatrixI &operator*= (int c);
228                 inline MatrixI &operator*= (double c);          
229                 inline MatrixI &operator*= (MatrixC &op);
230                 inline MatrixI &operator*= (MatrixI &op);
231                 inline MatrixI &operator*= (MatrixF &op);
232
233                 inline MatrixI &operator/= (unsigned char c);
234                 inline MatrixI &operator/= (int c);
235                 inline MatrixI &operator/= (double c);          
236                 inline MatrixI &operator/= (MatrixC &op);
237                 inline MatrixI &operator/= (MatrixI &op);
238                 inline MatrixI &operator/= (MatrixF &op);
239
240                 inline MatrixI &Multiply (MatrixF &op);
241                 inline MatrixI &Resize (int x, int y);
242                 inline MatrixI &ResizeSafe (int x, int y);
243                 inline MatrixI &InsertRow (int r);
244                 inline MatrixI &InsertCol (int c);
245                 inline MatrixI &Transpose (void);
246                 inline MatrixI &Identity (int order);           
247                 inline MatrixI &Basis (Vector3DF &c1, Vector3DF &c2, Vector3DF &c3);
248                 inline MatrixI &GaussJordan (MatrixF &b);
249
250                 inline int GetX();
251                 inline int GetY();      
252                 inline int GetRows(void);
253                 inline int GetCols(void);
254                 inline int GetLength(void);
255                 inline VTYPE *GetData(void);
256
257                 inline unsigned char *GetDataC (void)   {return NULL;}
258                 inline int *GetDataI (void)                             {return data;}
259                 inline double *GetDataF (void)                  {return NULL;}
260                 
261                 inline double GetF (int r, int c);
262         };
263         #undef VNAME
264         #undef VTYPE
265
266         // MatrixF Declaration  
267         #define VNAME           F
268         #define VTYPE           double
269
270         class MatrixF {
271         public: 
272                 VTYPE *data;
273                 int rows, cols, len;            
274
275                 // Constructors/Destructors             
276                 inline MatrixF ();
277                 inline ~MatrixF ();
278                 inline MatrixF (const int r, const int c);
279
280                 // Member Functions
281                 inline VTYPE GetVal ( int c, int r );
282                 inline VTYPE &operator () (const int c, const int r);
283                 inline MatrixF &operator= (const unsigned char c);
284                 inline MatrixF &operator= (const int c);
285                 inline MatrixF &operator= (const double c);             
286                 inline MatrixF &operator= (const MatrixC &op);
287                 inline MatrixF &operator= (const MatrixI &op);
288                 inline MatrixF &operator= (const MatrixF &op);
289                 
290                 inline MatrixF &operator+= (const unsigned char c);
291                 inline MatrixF &operator+= (const int c);
292                 inline MatrixF &operator+= (const double c);            
293                 inline MatrixF &operator+= (const MatrixC &op);
294                 inline MatrixF &operator+= (const MatrixI &op);
295                 inline MatrixF &operator+= (const MatrixF &op);
296
297                 inline MatrixF &operator-= (const unsigned char c);
298                 inline MatrixF &operator-= (const int c);
299                 inline MatrixF &operator-= (const double c);            
300                 inline MatrixF &operator-= (const MatrixC &op);
301                 inline MatrixF &operator-= (const MatrixI &op);
302                 inline MatrixF &operator-= (const MatrixF &op);
303
304                 inline MatrixF &operator*= (const unsigned char c);
305                 inline MatrixF &operator*= (const int c);
306                 inline MatrixF &operator*= (const double c);            
307                 inline MatrixF &operator*= (const MatrixC &op);
308                 inline MatrixF &operator*= (const MatrixI &op);
309                 inline MatrixF &operator*= (const MatrixF &op);         
310
311                 inline MatrixF &operator/= (const unsigned char c);
312                 inline MatrixF &operator/= (const int c);
313                 inline MatrixF &operator/= (const double c);            
314                 inline MatrixF &operator/= (const MatrixC &op);
315                 inline MatrixF &operator/= (const MatrixI &op);
316                 inline MatrixF &operator/= (const MatrixF &op);
317
318                 inline MatrixF &Multiply4x4 (const MatrixF &op);
319                 inline MatrixF &Multiply (const MatrixF &op);
320                 inline MatrixF &Resize (const int x, const int y);
321                 inline MatrixF &ResizeSafe (const int x, const int y);
322                 inline MatrixF &InsertRow (const int r);
323                 inline MatrixF &InsertCol (const int c);
324                 inline MatrixF &Transpose (void);
325                 inline MatrixF &Identity (const int order);
326                 inline MatrixF &RotateX (const double ang);
327                 inline MatrixF &RotateY (const double ang);
328                 inline MatrixF &RotateZ (const double ang);
329                 inline MatrixF &Ortho (double sx, double sy, double n, double f);               
330                 inline MatrixF &Translate (double tx, double ty, double tz);
331                 inline MatrixF &Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3);
332                 inline MatrixF &GaussJordan (MatrixF &b);
333                 inline MatrixF &ConjugateGradient (MatrixF &b);
334                 inline MatrixF &Submatrix ( MatrixF& b, int mx, int my);
335                 inline MatrixF &MatrixVector5 (MatrixF& x, int mrows, MatrixF& b );
336                 inline MatrixF &ConjugateGradient5 (MatrixF &b, int mrows );
337                 inline double Dot ( MatrixF& b );
338
339                 inline void Print ( char* fname );
340
341                 inline int GetX();
342                 inline int GetY();      
343                 inline int GetRows(void);
344                 inline int GetCols(void);
345                 inline int GetLength(void);
346                 inline VTYPE *GetData(void);
347                 inline void GetRowVec (int r, Vector3DF &v);
348
349                 inline unsigned char *GetDataC (void) const     {return NULL;}
350                 inline int *GetDataI (void)     const                   {return NULL;}
351                 inline double *GetDataF (void) const            {return data;}
352
353                 inline double GetF (const int r, const int c);
354         };
355         #undef VNAME
356         #undef VTYPE
357
358         // MatrixF Declaration  
359         #define VNAME           F
360         #define VTYPE           float
361
362         class Matrix4F {
363         public: 
364                 VTYPE   data[16];               
365
366                 // Constructors/Destructors             
367                 inline Matrix4F ();             
368
369                 // Member Functions
370                 inline VTYPE &operator () (const int n)                                 { return data[n]; }
371                 inline VTYPE &operator () (const int c, const int r)    { return data[ (r<<2)+c ]; }
372                 inline Matrix4F &operator= (const unsigned char c);
373                 inline Matrix4F &operator= (const int c);
374                 inline Matrix4F &operator= (const double c);                            
375                 inline Matrix4F &operator+= (const unsigned char c);
376                 inline Matrix4F &operator+= (const int c);
377                 inline Matrix4F &operator+= (const double c);                           
378                 inline Matrix4F &operator-= (const unsigned char c);
379                 inline Matrix4F &operator-= (const int c);
380                 inline Matrix4F &operator-= (const double c);
381                 inline Matrix4F &operator*= (const unsigned char c);
382                 inline Matrix4F &operator*= (const int c);
383                 inline Matrix4F &operator*= (const double c);
384                 inline Matrix4F &operator/= (const unsigned char c);
385                 inline Matrix4F &operator/= (const int c);
386                 inline Matrix4F &operator/= (const double c);           
387                 
388                 inline Matrix4F &Multiply (const Matrix4F &op);
389                 inline Matrix4F &Transpose (void);
390                 inline Matrix4F &Identity (const int order);
391                 inline Matrix4F &RotateX (const double ang);
392                 inline Matrix4F &RotateY (const double ang);
393                 inline Matrix4F &RotateZ (const double ang);
394                 inline Matrix4F &Ortho (double sx, double sy, double n, double f);              
395                 inline Matrix4F &Translate (double tx, double ty, double tz);
396                 inline Matrix4F &Basis (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3);         
397
398                 // Scale-Rotate-Translate (compound matrix)
399                 inline Matrix4F &SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s);
400                 inline Matrix4F &SRT (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s);
401
402                 // invTranslate-invRotate-invScale (compound matrix)
403                 inline Matrix4F &InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const Vector3DF& s);
404                 inline Matrix4F &InvTRS (const Vector3DF &c1, const Vector3DF &c2, const Vector3DF &c3, const Vector3DF& t, const float s);
405
406                 inline int GetX()                       { return 4; }
407                 inline int GetY()                       { return 4; }
408                 inline int GetRows(void)        { return 4; }
409                 inline int GetCols(void)        { return 4; }   
410                 inline int GetLength(void)      { return 16; }
411                 inline VTYPE *GetData(void)     { return data; }
412                 inline void GetRowVec (int r, Vector3DF &v);
413
414                 inline unsigned char *GetDataC (void) const     {return NULL;}
415                 inline int *GetDataI (void)     const                   {return NULL;}
416                 inline float *GetDataF (void) const             {return (float*) data;}
417
418                 inline float GetF (const int r, const int c);
419         };
420         #undef VNAME
421         #undef VTYPE
422
423
424     // Matrix Code Definitions (Inlined)
425
426         #include "matrix.cci"
427
428 #endif
429