2 FLUIDS v.1 - SPH Fluid Simulator for CPU and GPU
3 Copyright (C) 2009. Rama Hoetzlein, http://www.rchoetzlein.com
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.
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:
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.
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, ...)
43 //#define MATRIX_INITIALIZE // Initializes vectors
45 class MatrixC; // Forward Referencing
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;
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;
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;
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;
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;
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; }
101 virtual int GetRows(void)=0;
102 virtual int GetCols(void)=0;
103 virtual int GetLength(void)=0;
105 virtual unsigned char *GetDataC (void)=0;
106 virtual int *GetDataI (void)=0;
107 virtual double *GetDataF (void)=0;
109 virtual double GetF (int r, int c);
112 // MatrixC Declaration
114 #define VTYPE unsigned char
121 // Constructors/Destructors
124 inline MatrixC (int r, int c);
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);
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);
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);
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);
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);
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);
175 inline int GetRows(void);
176 inline int GetCols(void);
177 inline int GetLength(void);
178 inline VTYPE *GetData(void);
180 inline unsigned char *GetDataC (void) {return data;}
181 inline int *GetDataI (void) {return NULL;}
182 inline double *GetDataF (void) {return NULL;}
184 inline double GetF (int r, int c);
189 // MatrixI Declaration
198 // Constructors/Destructors
201 inline MatrixI (int r, int c);
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);
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);
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);
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);
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);
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);
252 inline int GetRows(void);
253 inline int GetCols(void);
254 inline int GetLength(void);
255 inline VTYPE *GetData(void);
257 inline unsigned char *GetDataC (void) {return NULL;}
258 inline int *GetDataI (void) {return data;}
259 inline double *GetDataF (void) {return NULL;}
261 inline double GetF (int r, int c);
266 // MatrixF Declaration
275 // Constructors/Destructors
278 inline MatrixF (const int r, const int c);
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);
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);
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);
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);
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);
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 );
339 inline void Print ( char* fname );
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);
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;}
353 inline double GetF (const int r, const int c);
358 // MatrixF Declaration
366 // Constructors/Destructors
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);
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);
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);
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);
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);
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;}
418 inline float GetF (const int r, const int c);
424 // Matrix Code Definitions (Inlined)
426 #include "matrix.cci"