Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/src/include/Diderot/inline-matrix.h
ViewVC logotype

Annotation of /trunk/src/include/Diderot/inline-matrix.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1115 - (view) (download) (as text)

1 : jhr 1115 /*! \file inline-matrix.h
2 :     *
3 :     * \author John Reppy
4 :     */
5 :    
6 :     /*
7 :     * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu)
8 :     * All rights reserved.
9 :     */
10 :    
11 :     #ifndef _DIDEROT_INLINE_MATRIX_H_
12 :     #define _DIDEROT_INLINE_MATRIX_H_
13 :    
14 :     #ifndef _DIDEROT_TYPES_H_
15 :     #include "types.h"
16 :     #endif
17 :     #ifndef _DIDEROT_INLINE_VEC2_H_
18 :     # include "inline-vec2.h"
19 :     #endif
20 :     #ifndef _DIDEROT_INLINE_VEC3_H_
21 :     # include "inline-vec3.h"
22 :     #endif
23 :     #ifndef _DIDEROT_INLINE_VEC4_H_
24 :     # include "inline-vec4.h"
25 :     #endif
26 :    
27 :    
28 :     /********** 2x2 matrix functions **********/
29 :    
30 :     STATIC_INLINE void zero2x2f (Diderot_Mat2x2_t dst)
31 :     {
32 :     dst[0].v = vec2f(0.0, 0.0);
33 :     dst[1].v = vec2f(0.0, 0.0);
34 :     }
35 :    
36 :     STATIC_INLINE void identity2x2f (Diderot_Mat2x2_t dst)
37 :     {
38 :     dst[0].v = vec2f(1.0, 0.0);
39 :     dst[1].v = vec2f(0.0, 1.0);
40 :     }
41 :    
42 :     STATIC_INLINE vec2f_t column2x2f (Diderot_Mat2x2_t m, int i)
43 :     {
44 :     return vec2f(m[0].r[i], m[1].r[i]);
45 :     }
46 :    
47 :     STATIC_INLINE void copy2x2f (Diderot_Mat2x2_t dst, Diderot_Mat2x2_t src)
48 :     {
49 :     dst[0].v = src[0].v;
50 :     dst[1].v = src[1].v;
51 :     }
52 :    
53 :     STATIC_INLINE void scale2x2f (Diderot_Mat2x2_t dst, float s, Diderot_Mat2x2_t src)
54 :     {
55 :     vec2f_t scale = vec2f(s, s);
56 :     dst[0].v = scale * src[0].v;
57 :     dst[1].v = scale * src[1].v;
58 :     }
59 :    
60 :     STATIC_INLINE void add2x2f (Diderot_Mat2x2_t dst, Diderot_Mat2x2_t a, Diderot_Mat2x2_t b)
61 :     {
62 :     dst[0].v = a[0].v + b[0].v;
63 :     dst[1].v = a[1].v + b[1].v;
64 :     }
65 :    
66 :     STATIC_INLINE void sub2x2f (Diderot_Mat2x2_t dst, Diderot_Mat2x2_t a, Diderot_Mat2x2_t b)
67 :     {
68 :     dst[0].v = a[0].v - b[0].v;
69 :     dst[1].v = a[1].v - b[1].v;
70 :     }
71 :    
72 :     STATIC_INLINE vec2f_t mulVec3Mat2x2f (vec2f_t v, Diderot_Mat2x2_t m)
73 :     {
74 :     return vec2f(
75 :     dot2f(v, column2x2f(m, 0)),
76 :     dot2f(v, column2x2f(m, 1)));
77 :     }
78 :    
79 :     STATIC_INLINE vec2f_t mulMat2x2Vec2f (Diderot_Mat2x2_t m, vec2f_t v)
80 :     {
81 :     return vec2f(dot2f(m[0].v, v), dot2f(m[1].v, v));
82 :     }
83 :    
84 :     STATIC_INLINE void mulMat2x2Mat2x2f (Diderot_Mat2x2_t dst, Diderot_Mat2x2_t m1, Diderot_Mat2x2_t m2)
85 :     {
86 :     dst[0].v = vec2f(
87 :     dot2f(m1[0].v, column2x2f(m2, 0)),
88 :     dot2f(m1[0].v, column2x2f(m2, 1)));
89 :     dst[1].v = vec2f(
90 :     dot2f(m1[1].v, column2x2f(m2, 0)),
91 :     dot2f(m1[1].v, column2x2f(m2, 1)));
92 :     }
93 :    
94 :     STATIC_INLINE void transpose2x2f (Diderot_Mat2x2_t dst, Diderot_Mat2x2_t src)
95 :     {
96 :     dst[0].v = column2x2f(src, 0);
97 :     dst[1].v = column2x2f(src, 1);
98 :     }
99 :    
100 :     STATIC_INLINE float trace2x2f (Diderot_Mat2x2_t m)
101 :     {
102 :     return m[0].r[0] + m[1].r[1];
103 :     }
104 :    
105 :     // The Frobenius norm of a matrix is the sqrt of the sum of the squares of the elements
106 :     STATIC_INLINE float norm2x2f (Diderot_Mat2x2_t m)
107 :     {
108 :     return sqrtf(dot2f(m[0].v,m[0].v) + dot2f(m[1].v,m[1].v));
109 :     }
110 :    
111 :    
112 :     /********** 3x3 matrix functions **********/
113 :    
114 :     STATIC_INLINE void zero3x3f (Diderot_Mat3x3_t dst)
115 :     {
116 :     dst[0].v = vec3f(0.0, 0.0, 0.0);
117 :     dst[1].v = vec3f(0.0, 0.0, 0.0);
118 :     dst[2].v = vec3f(0.0, 0.0, 0.0);
119 :     }
120 :    
121 :     STATIC_INLINE void identity3x3f (Diderot_Mat3x3_t dst)
122 :     {
123 :     dst[0].v = vec3f(1.0, 0.0, 0.0);
124 :     dst[1].v = vec3f(0.0, 1.0, 0.0);
125 :     dst[2].v = vec3f(0.0, 0.0, 1.0);
126 :     }
127 :    
128 :     STATIC_INLINE vec3f_t column3x3f (Diderot_Mat3x3_t m, int i)
129 :     {
130 :     return vec3f(m[0].r[i], m[1].r[i], m[2].r[i]);
131 :     }
132 :    
133 :     STATIC_INLINE void copy3x3f (Diderot_Mat3x3_t dst, Diderot_Mat3x3_t src)
134 :     {
135 :     dst[0].v = src[0].v;
136 :     dst[1].v = src[1].v;
137 :     dst[2].v = src[2].v;
138 :     }
139 :    
140 :     STATIC_INLINE void scale3x3f (Diderot_Mat3x3_t dst, float s, Diderot_Mat3x3_t src)
141 :     {
142 :     vec3f_t scale = vec3f(s, s, s);
143 :     dst[0].v = scale * src[0].v;
144 :     dst[1].v = scale * src[1].v;
145 :     dst[2].v = scale * src[2].v;
146 :     }
147 :    
148 :     STATIC_INLINE void add3x3f (Diderot_Mat3x3_t dst, Diderot_Mat3x3_t a, Diderot_Mat3x3_t b)
149 :     {
150 :     dst[0].v = a[0].v + b[0].v;
151 :     dst[1].v = a[1].v + b[1].v;
152 :     dst[2].v = a[2].v + b[2].v;
153 :     }
154 :    
155 :     STATIC_INLINE void sub3x3f (Diderot_Mat3x3_t dst, Diderot_Mat3x3_t a, Diderot_Mat3x3_t b)
156 :     {
157 :     dst[0].v = a[0].v - b[0].v;
158 :     dst[1].v = a[1].v - b[1].v;
159 :     dst[2].v = a[2].v - b[2].v;
160 :     }
161 :    
162 :     STATIC_INLINE vec3f_t mulVec3Mat3x3f (vec3f_t v, Diderot_Mat3x3_t m)
163 :     {
164 :     return vec3f(
165 :     dot3f(v, column3x3f(m, 0)),
166 :     dot3f(v, column3x3f(m, 1)),
167 :     dot3f(v, column3x3f(m, 2)));
168 :     }
169 :    
170 :     STATIC_INLINE vec3f_t mulMat3x3Vec3f (Diderot_Mat3x3_t m, vec3f_t v)
171 :     {
172 :     return vec3f(dot3f(m[0].v, v), dot3f(m[1].v, v), dot3f(m[2].v, v));
173 :     }
174 :    
175 :     STATIC_INLINE void mulMat3x3Mat3x3f (Diderot_Mat3x3_t dst, Diderot_Mat3x3_t m1, Diderot_Mat3x3_t m2)
176 :     {
177 :     dst[0].v = vec3f(
178 :     dot3f(m1[0].v, column3x3f(m2, 0)),
179 :     dot3f(m1[0].v, column3x3f(m2, 1)),
180 :     dot3f(m1[0].v, column3x3f(m2, 2)));
181 :     dst[1].v = vec3f(
182 :     dot3f(m1[1].v, column3x3f(m2, 0)),
183 :     dot3f(m1[1].v, column3x3f(m2, 1)),
184 :     dot3f(m1[1].v, column3x3f(m2, 2)));
185 :     dst[2].v = vec3f(
186 :     dot3f(m1[2].v, column3x3f(m2, 0)),
187 :     dot3f(m1[2].v, column3x3f(m2, 1)),
188 :     dot3f(m1[2].v, column3x3f(m2, 2)));
189 :     }
190 :    
191 :     STATIC_INLINE void transpose3x3f (Diderot_Mat3x3_t dst, Diderot_Mat3x3_t src)
192 :     {
193 :     dst[0].v = column3x3f(src, 0);
194 :     dst[1].v = column3x3f(src, 1);
195 :     dst[2].v = column3x3f(src, 2);
196 :     }
197 :    
198 :     STATIC_INLINE float trace3x3f (Diderot_Mat3x3_t m)
199 :     {
200 :     return m[0].r[0] + m[1].r[1] + m[2].r[2];
201 :     }
202 :    
203 :     // The Frobenius norm of a matrix is the sqrt of the sum of the squares of the elements
204 :     STATIC_INLINE float norm3x3f (Diderot_Mat3x3_t m)
205 :     {
206 :     return sqrtf(dot3f(m[0].v,m[0].v) + dot3f(m[1].v,m[1].v) + dot3f(m[2].v,m[2].v));
207 :     }
208 :    
209 :    
210 :     /********** 4x4 matrix functions **********/
211 :    
212 :     STATIC_INLINE void copy4x4f (Diderot_Mat4x4_t dst, Diderot_Mat4x4_t src)
213 :     {
214 :     dst[0].v = src[0].v;
215 :     dst[1].v = src[1].v;
216 :     dst[2].v = src[2].v;
217 :     dst[3].v = src[3].v;
218 :     }
219 :    
220 :     STATIC_INLINE vec4f_t column4x4f (Diderot_Mat4x4_t m, int i)
221 :     {
222 :     return vec4f(m[0].r[i], m[1].r[i], m[2].r[i], m[3].r[i]);
223 :     }
224 :    
225 :     STATIC_INLINE void transpose4x4f (Diderot_Mat4x4_t dst, Diderot_Mat4x4_t src)
226 :     {
227 :     dst[0].v = column4x4f(src, 0);
228 :     dst[1].v = column4x4f(src, 1);
229 :     dst[2].v = column4x4f(src, 2);
230 :     dst[3].v = column4x4f(src, 3);
231 :     }
232 :    
233 :     STATIC_INLINE float trace4x4f (Diderot_Mat4x4_t m)
234 :     {
235 :     return m[0].r[0] + m[1].r[1] + m[2].r[2] + m[3].r[3];
236 :     }
237 :    
238 :     // The Frobenius norm of a matrix is the sqrt of the sum of the squares of the elements
239 :     STATIC_INLINE float norm4x4f (Diderot_Mat4x4_t m)
240 :     {
241 :     return sqrt(dot4f(m[0].v,m[0].v) + dot4f(m[1].v,m[1].v) + dot4f(m[2].v,m[2].v) + dot4f(m[3].v,m[3].v));
242 :     }
243 :    
244 :     #endif /* !_DIDEROT_INLINE_MATRIX_H_ */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0