8 |
* All rights reserved. |
* All rights reserved. |
9 |
*/ |
*/ |
10 |
|
|
11 |
#include "diderot.h" |
#include "Diderot/diderot.h" |
12 |
#include <teem/nrrd.h> |
#include <teem/nrrd.h> |
13 |
|
|
|
/* load image data from Nrrd files */ |
|
|
Status_t Diderot_LoadImage1D (Diderot_string_t name, Diderot_image1D_t *img); |
|
|
Status_t Diderot_LoadImage2D (Diderot_string_t name, Diderot_image2D_t *img); |
|
|
Status_t Diderot_LoadImage3D (Diderot_string_t name, Diderot_image3D_t *img) |
|
|
{ |
|
|
Nrrd *nin = loadNrrdFile (name); |
|
|
|
|
|
img->dim = 3; |
|
|
img->size[0] = nin->axis[0].size; |
|
|
img->size[1] = nin->axis[1].size; |
|
|
img->size[2] = nin->axis[2].size; |
|
|
img->data = nin->data; |
|
|
|
|
|
loadTransformMatrix (nin, transformMatrix); |
|
|
InvertM (transformMatrix, inverseMatrix); |
|
|
|
|
|
} |
|
|
|
|
|
/* functions to get input-parameter values */ |
|
|
extern Status_t Diderot_InputString (const char *, const char **, bool); |
|
|
extern Status_t Diderot_InputReal (const char *, Diderot_real_t *, bool); |
|
|
extern Status_t Diderot_InputVec3 (const char *, Diderot_vec3_t *v); |
|
|
|
|
14 |
/* Transformation matrix operations */ |
/* Transformation matrix operations */ |
15 |
|
|
16 |
STATIC_INLINE Diderot_real_t DetM3x3 ( |
STATIC_INLINE Diderot_real_t DetM3x3 ( |
26 |
- (a)*(h)*(f)); |
- (a)*(h)*(f)); |
27 |
} |
} |
28 |
|
|
29 |
Diderot_real_t DetM4x4 (Diderot_Mat4x4_t m) |
static Diderot_real_t DetM4x4 (Diderot_Mat4x4_t m) |
30 |
{ |
{ |
31 |
return (m[ 0] * DetM3x3(m[ 5], m[ 6], m[ 7], |
#define M(i) m[(i)>>2].r[(i)&3] |
32 |
m[ 9], m[10], m[11], |
return (M( 0) * DetM3x3(M( 5), M( 6), M( 7), |
33 |
m[13], m[14], m[15]) |
M( 9), M(10), M(11), |
34 |
- m[ 1] * DetM3x3(m[ 4], m[ 6], m[ 7], |
M(13), M(14), M(15)) |
35 |
m[ 8], m[10], m[11], |
- M( 1) * DetM3x3(M( 4), M( 6), M( 7), |
36 |
m[12], m[14], m[15]) |
M( 8), M(10), M(11), |
37 |
+ m[ 2] * DetM3x3(m[ 4], m[ 5], m[ 7], |
M(12), M(14), M(15)) |
38 |
m[ 8], m[ 9], m[11], |
+ M( 2) * DetM3x3(M( 4), M( 5), M( 7), |
39 |
m[12], m[13], m[15]) |
M( 8), M( 9), M(11), |
40 |
- m[ 3] * DetM3x3(m[ 4], m[ 5], m[ 6], |
M(12), M(13), M(15)) |
41 |
m[ 8], m[ 9], m[10], |
- M( 3) * DetM3x3(M( 4), M( 5), M( 6), |
42 |
m[12], m[13], m[14])); |
M( 8), M( 9), M(10), |
43 |
|
M(12), M(13), M(14))); |
44 |
|
#undef M |
45 |
|
|
46 |
} |
} |
47 |
|
|
49 |
* \param m the matrix to invert |
* \param m the matrix to invert |
50 |
* \param i the inverted matrix |
* \param i the inverted matrix |
51 |
*/ |
*/ |
52 |
void InvertM4x4 (Diderot_Mat4x4_t i, Diderot_Mat4x4_t m) |
static void InvertM4x4 (Diderot_Mat4x4_t i, Diderot_Mat4x4_t m) |
53 |
{ |
{ |
54 |
Diderot_real_t scale = 1.0 / DetM4x4(m); |
Diderot_real_t scale = 1.0 / DetM4x4(m); |
55 |
|
|
56 |
i[0] = DetM3x3(m[5],m[ 6],m[ 7], |
#define M(i) m[(i)>>2].r[(i)&3] |
57 |
m[ 9],m[10],m[11], |
#define I(j) i[(j)>>2].r[(j)&3] |
58 |
m[13],m[14],m[15]) * scale; |
I( 0) = DetM3x3(M( 5),M( 6),M( 7), |
59 |
|
M( 9),M(10),M(11), |
60 |
i[ 1] = -DetM3x3(m[ 1],m[ 2],m[ 3], |
M(13),M(14),M(15)) * scale; |
61 |
m[ 9],m[10],m[11], |
|
62 |
m[13],m[14],m[15]) * scale; |
I( 1) = -DetM3x3(M( 1),M( 2),M( 3), |
63 |
|
M( 9),M(10),M(11), |
64 |
i[ 2] = DetM3x3(m[ 1],m[ 2],m[ 3], |
M(13),M(14),M(15)) * scale; |
65 |
m[ 5],m[ 6],m[ 7], |
|
66 |
m[13],m[14],m[15]) * scale; |
I( 2) = DetM3x3(M( 1),M( 2),M( 3), |
67 |
|
M( 5),M( 6),M( 7), |
68 |
i[ 3] = -DetM3x3(m[ 1],m[ 2],m[ 3], |
M(13),M(14),M(15)) * scale; |
69 |
m[ 5],m[ 6],m[ 7], |
|
70 |
m[ 9],m[10],m[11]) * scale; |
I( 3) = -DetM3x3(M( 1),M( 2),M( 3), |
71 |
|
M( 5),M( 6),M( 7), |
72 |
i[ 4] = -DetM3x3(m[ 4],m[ 6],m[ 7], |
M( 9),M(10),M(11)) * scale; |
73 |
m[ 8],m[10],m[11], |
|
74 |
m[12],m[14],m[15]) * scale; |
I( 4) = -DetM3x3(M( 4),M( 6),M( 7), |
75 |
|
M( 8),M(10),M(11), |
76 |
i[ 5] = DetM3x3(m[ 0],m[ 2],m[ 3], |
M(12),M(14),M(15)) * scale; |
77 |
m[ 8],m[10],m[11], |
|
78 |
m[12],m[14],m[15]) * scale; |
I( 5) = DetM3x3(M( 0),M( 2),M( 3), |
79 |
|
M( 8),M(10),M(11), |
80 |
i[ 6] = -DetM3x3(m[ 0],m[ 2],m[ 3], |
M(12),M(14),M(15)) * scale; |
81 |
m[ 4],m[ 6],m[ 7], |
|
82 |
m[12],m[14],m[15]) * scale; |
I( 6) = -DetM3x3(M( 0),M( 2),M( 3), |
83 |
|
M( 4),M( 6),M( 7), |
84 |
i[ 7] = DetM3x3(m[ 0],m[ 2],m[ 3], |
M(12),M(14),M(15)) * scale; |
85 |
m[ 4],m[ 6],m[ 7], |
|
86 |
m[ 8],m[10],m[11]) * scale; |
I( 7) = DetM3x3(M( 0),M( 2),M( 3), |
87 |
|
M( 4),M( 6),M( 7), |
88 |
i[ 8] = DetM3x3(m[ 4],m[ 5],m[ 7], |
M( 8),M(10),M(11)) * scale; |
89 |
m[ 8],m[ 9],m[11], |
|
90 |
m[12],m[13],m[15]) * scale; |
I( 8) = DetM3x3(M( 4),M( 5),M( 7), |
91 |
|
M( 8),M( 9),M(11), |
92 |
i[ 9] = -DetM3x3(m[ 0],m[ 1],m[ 3], |
M(12),M(13),M(15)) * scale; |
93 |
m[ 8],m[ 9],m[11], |
|
94 |
m[12],m[13],m[15]) * scale; |
I( 9) = -DetM3x3(M( 0),M( 1),M( 3), |
95 |
|
M( 8),M( 9),M(11), |
96 |
i[10] = DetM3x3(m[ 0],m[ 1],m[ 3], |
M(12),M(13),M(15)) * scale; |
97 |
m[ 4],m[ 5],m[ 7], |
|
98 |
m[12],m[13],m[15]) * scale; |
I(10) = DetM3x3(M( 0),M( 1),M( 3), |
99 |
|
M( 4),M( 5),M( 7), |
100 |
i[11] = -DetM3x3(m[ 0],m[ 1],m[ 3], |
M(12),M(13),M(15)) * scale; |
101 |
m[ 4],m[ 5],m[ 7], |
|
102 |
m[ 8],m[ 9],m[11]) * scale; |
I(11) = -DetM3x3(M( 0),M( 1),M( 3), |
103 |
|
M( 4),M( 5),M( 7), |
104 |
i[12] = -DetM3x3(m[ 4],m[ 5],m[ 6], |
M( 8),M( 9),M(11)) * scale; |
105 |
m[ 8],m[ 9],m[10], |
|
106 |
m[12],m[13],m[14]) * scale; |
I(12) = -DetM3x3(M( 4),M( 5),M( 6), |
107 |
|
M( 8),M( 9),M(10), |
108 |
i[13] = DetM3x3(m[ 0],m[ 1],m[ 2], |
M(12),M(13),M(14)) * scale; |
109 |
m[ 8],m[ 9],m[10], |
|
110 |
m[12],m[13],m[14]) * scale; |
I(13) = DetM3x3(M( 0),M( 1),M( 2), |
111 |
|
M( 8),M( 9),M(10), |
112 |
i[14] = -DetM3x3(m[ 0],m[ 1],m[ 2], |
M(12),M(13),M(14)) * scale; |
113 |
m[ 4],m[ 5],m[ 6], |
|
114 |
m[12],m[13],m[14]) * scale; |
I(14) = -DetM3x3(M( 0),M( 1),M( 2), |
115 |
|
M( 4),M( 5),M( 6), |
116 |
i[15] = DetM3x3(m[ 0],m[ 1],m[ 2], |
M(12),M(13),M(14)) * scale; |
117 |
m[ 4],m[ 5],m[ 6], |
|
118 |
m[ 8],m[ 9],m[10]) * scale; |
I(15) = DetM3x3(M( 0),M( 1),M( 2), |
119 |
|
M( 4),M( 5),M( 6), |
120 |
|
M( 8),M( 9),M(10)) * scale; |
121 |
|
#undef M |
122 |
|
#undef I |
123 |
} |
} |
124 |
|
|
125 |
/*! \brief compute the inverse transpose of \arg m, storing the result in \arg i. |
/*! \brief compute the inverse transpose of \arg m, storing the result in \arg i. |
126 |
* \param m the matrix to invert |
* \param m the matrix to invert |
127 |
* \param i the inverted matrix |
* \param i the inverted matrix |
128 |
*/ |
*/ |
129 |
void InvertTransposeM4x4 (Matrix4x4_t i, Matrix4x4_t m) |
static void InvertTransposeM4x4 (Diderot_Mat4x4_t i, Diderot_Mat4x4_t m) |
130 |
{ |
{ |
131 |
Diderot_real_t scale = 1.0 / DetM4x4(m); |
Diderot_real_t scale = 1.0 / DetM4x4(m); |
132 |
|
|
133 |
i[0] = DetM3x3(m[5],m[ 6],m[ 7], |
#define M(i) m[(i)>>2].r[(i)&3] |
134 |
m[ 9],m[10],m[11], |
#define I(j) i[(j)>>2].r[(j)&3] |
135 |
m[13],m[14],m[15]) * scale; |
I( 0) = DetM3x3(M( 5),M( 6),M( 7), |
136 |
|
M( 9),M(10),M(11), |
137 |
i[ 4] = -DetM3x3(m[ 1],m[ 2],m[ 3], |
M(13),M(14),M(15)) * scale; |
138 |
m[ 9],m[10],m[11], |
|
139 |
m[13],m[14],m[15]) * scale; |
I( 4) = -DetM3x3(M( 1),M( 2),M( 3), |
140 |
|
M( 9),M(10),M(11), |
141 |
i[ 8] = DetM3x3(m[ 1],m[ 2],m[ 3], |
M(13),M(14),M(15)) * scale; |
142 |
m[ 5],m[ 6],m[ 7], |
|
143 |
m[13],m[14],m[15]) * scale; |
I( 8) = DetM3x3(M( 1),M( 2),M( 3), |
144 |
|
M( 5),M( 6),M( 7), |
145 |
i[12] = -DetM3x3(m[ 1],m[ 2],m[ 3], |
M(13),M(14),M(15)) * scale; |
146 |
m[ 5],m[ 6],m[ 7], |
|
147 |
m[ 9],m[10],m[11]) * scale; |
I(12) = -DetM3x3(M( 1),M( 2),M( 3), |
148 |
|
M( 5),M( 6),M( 7), |
149 |
i[ 1] = -DetM3x3(m[ 4],m[ 6],m[ 7], |
M( 9),M(10),M(11)) * scale; |
150 |
m[ 8],m[10],m[11], |
|
151 |
m[12],m[14],m[15]) * scale; |
I( 1) = -DetM3x3(M( 4),M( 6),M( 7), |
152 |
|
M( 8),M(10),M(11), |
153 |
i[ 5] = DetM3x3(m[ 0],m[ 2],m[ 3], |
M(12),M(14),M(15)) * scale; |
154 |
m[ 8],m[10],m[11], |
|
155 |
m[12],m[14],m[15]) * scale; |
I( 5) = DetM3x3(M( 0),M( 2),M( 3), |
156 |
|
M( 8),M(10),M(11), |
157 |
i[ 9] = -DetM3x3(m[ 0],m[ 2],m[ 3], |
M(12),M(14),M(15)) * scale; |
158 |
m[ 4],m[ 6],m[ 7], |
|
159 |
m[12],m[14],m[15]) * scale; |
I( 9) = -DetM3x3(M( 0),M( 2),M( 3), |
160 |
|
M( 4),M( 6),M( 7), |
161 |
i[ 7] = DetM3x3(m[ 0],m[ 2],m[ 3], |
M(12),M(14),M(15)) * scale; |
162 |
m[ 4],m[ 6],m[ 7], |
|
163 |
m[ 8],m[10],m[11]) * scale; |
I( 7) = DetM3x3(M( 0),M( 2),M( 3), |
164 |
|
M( 4),M( 6),M( 7), |
165 |
i[ 2] = DetM3x3(m[ 4],m[ 5],m[ 7], |
M( 8),M(10),M(11)) * scale; |
166 |
m[ 8],m[ 9],m[11], |
|
167 |
m[12],m[13],m[15]) * scale; |
I( 2) = DetM3x3(M( 4),M( 5),M( 7), |
168 |
|
M( 8),M( 9),M(11), |
169 |
i[ 6] = -DetM3x3(m[ 0],m[ 1],m[ 3], |
M(12),M(13),M(15)) * scale; |
170 |
m[ 8],m[ 9],m[11], |
|
171 |
m[12],m[13],m[15]) * scale; |
I( 6) = -DetM3x3(M( 0),M( 1),M( 3), |
172 |
|
M( 8),M( 9),M(11), |
173 |
i[10] = DetM3x3(m[ 0],m[ 1],m[ 3], |
M(12),M(13),M(15)) * scale; |
174 |
m[ 4],m[ 5],m[ 7], |
|
175 |
m[12],m[13],m[15]) * scale; |
I(10) = DetM3x3(M( 0),M( 1),M( 3), |
176 |
|
M( 4),M( 5),M( 7), |
177 |
i[14] = -DetM3x3(m[ 0],m[ 1],m[ 3], |
M(12),M(13),M(15)) * scale; |
178 |
m[ 4],m[ 5],m[ 7], |
|
179 |
m[ 8],m[ 9],m[11]) * scale; |
I(14) = -DetM3x3(M( 0),M( 1),M( 3), |
180 |
|
M( 4),M( 5),M( 7), |
181 |
i[ 3] = -DetM3x3(m[ 4],m[ 5],m[ 6], |
M( 8),M( 9),M(11)) * scale; |
182 |
m[ 8],m[ 9],m[10], |
|
183 |
m[12],m[13],m[14]) * scale; |
I( 3) = -DetM3x3(M( 4),M( 5),M( 6), |
184 |
|
M( 8),M( 9),M(10), |
185 |
i[ 7] = DetM3x3(m[ 0],m[ 1],m[ 2], |
M(12),M(13),M(14)) * scale; |
186 |
m[ 8],m[ 9],m[10], |
|
187 |
m[12],m[13],m[14]) * scale; |
I( 7) = DetM3x3(M( 0),M( 1),M( 2), |
188 |
|
M( 8),M( 9),M(10), |
189 |
i[11] = -DetM3x3(m[ 0],m[ 1],m[ 2], |
M(12),M(13),M(14)) * scale; |
190 |
m[ 4],m[ 5],m[ 6], |
|
191 |
m[12],m[13],m[14]) * scale; |
I(11) = -DetM3x3(M( 0),M( 1),M( 2), |
192 |
|
M( 4),M( 5),M( 6), |
193 |
i[15] = DetM3x3(m[ 0],m[ 1],m[ 2], |
M(12),M(13),M(14)) * scale; |
194 |
m[ 4],m[ 5],m[ 6], |
|
195 |
m[ 8],m[ 9],m[10]) * scale; |
I(15) = DetM3x3(M( 0),M( 1),M( 2), |
196 |
|
M( 4),M( 5),M( 6), |
197 |
|
M( 8),M( 9),M(10)) * scale; |
198 |
|
|
199 |
|
#undef M |
200 |
|
#undef I |
201 |
|
} |
202 |
|
|
203 |
|
/* load image data from Nrrd files */ |
204 |
|
//Status_t Diderot_LoadImage1D (Diderot_string_t name, Diderot_image1D_t *img); |
205 |
|
//Status_t Diderot_LoadImage2D (Diderot_string_t name, Diderot_image2D_t *img); |
206 |
|
|
207 |
|
Status_t Diderot_LoadImage3D (Diderot_string_t name, Diderot_image3D_t **imgOut) |
208 |
|
{ |
209 |
|
Nrrd *nin = loadNrrdFile (name); |
210 |
|
Diderot_image3D_t *img = (Diderot_image3D_t *)malloc(sizeof(Diderot_image3D_t)); |
211 |
|
|
212 |
|
img->dim = 3; |
213 |
|
img->size[0] = nin->axis[0].size; |
214 |
|
img->size[1] = nin->axis[1].size; |
215 |
|
img->size[2] = nin->axis[2].size; |
216 |
|
img->data = nin->data; |
217 |
|
|
218 |
|
loadTransformMatrix (nin, img->m); |
219 |
|
InvertM4x4 (img->m, img->mInv); |
220 |
|
InvertTransposeM4x4 (img->m, img->mInvT); |
221 |
|
|
222 |
|
*imgOut = img; |
223 |
|
return DIDEROT_OK; |
224 |
|
} |
225 |
|
|
226 |
|
/* functions to get input-parameter values */ |
227 |
|
Status_t Diderot_InputString (const char *name, const char **v, bool hasDflt) |
228 |
|
{ |
229 |
|
return DIDEROT_OK; |
230 |
|
} |
231 |
|
|
232 |
|
Status_t Diderot_Inputf (const char *name, float *v, bool hasDflt) |
233 |
|
{ |
234 |
|
return DIDEROT_OK; |
235 |
|
} |
236 |
|
|
237 |
|
Status_t Diderot_InputVec3f (const char *name, vec3f_t *v, bool hasDflt) |
238 |
|
{ |
239 |
|
return DIDEROT_OK; |
240 |
} |
} |