143 |
Nrrd *nin; |
Nrrd *nin; |
144 |
int status; |
int status; |
145 |
nin = nrrdNew(); |
nin = nrrdNew(); |
146 |
if(nin == NULL) |
if(nin == NULL) { |
|
{ |
|
147 |
err = biffGetDone(NRRD); |
err = biffGetDone(NRRD); |
148 |
fprintf(stderr, "Trouble allocating nrrd struct:\n%s", err); |
fprintf(stderr, "Trouble allocating nrrd struct:\n%s", err); |
149 |
free(err); |
free(err); |
152 |
|
|
153 |
|
|
154 |
status = nrrdLoad(nin, infile, NULL); |
status = nrrdLoad(nin, infile, NULL); |
155 |
if (status) |
if (status) { |
|
{ |
|
156 |
err = biffGetDone(NRRD); |
err = biffGetDone(NRRD); |
157 |
fprintf(stderr, "Trouble reading \"%s\":\n%s", infile, err); |
fprintf(stderr, "Trouble reading \"%s\":\n%s", infile, err); |
158 |
free(err); |
free(err); |
168 |
double kparm[NRRD_KERNEL_PARMS_NUM]; |
double kparm[NRRD_KERNEL_PARMS_NUM]; |
169 |
|
|
170 |
ctx = gageContextNew(); |
ctx = gageContextNew(); |
171 |
if(ctx == NULL) |
if(ctx == NULL) { |
|
{ |
|
172 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
173 |
fprintf(stderr, "Trouble allocating gage context:\n%s", err); |
fprintf(stderr, "Trouble allocating gage context:\n%s", err); |
174 |
free(err); |
free(err); |
177 |
} |
} |
178 |
|
|
179 |
pvl = gagePerVolumeNew(ctx, nin, gageKindScl); |
pvl = gagePerVolumeNew(ctx, nin, gageKindScl); |
180 |
if(pvl == NULL) |
if(pvl == NULL) { |
|
{ |
|
181 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
182 |
fprintf(stderr, "Trouble allocating gage PerVolume:\n%s", err); |
fprintf(stderr, "Trouble allocating gage PerVolume:\n%s", err); |
183 |
free(err); |
free(err); |
187 |
} |
} |
188 |
|
|
189 |
status = gagePerVolumeAttach(ctx, pvl); |
status = gagePerVolumeAttach(ctx, pvl); |
190 |
if(status) |
if(status) { |
|
{ |
|
191 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
192 |
fprintf(stderr, "Trouble attaching gage PerVolume:\n%s", err); |
fprintf(stderr, "Trouble attaching gage PerVolume:\n%s", err); |
193 |
free(err); |
free(err); |
198 |
|
|
199 |
// It's okay to use kparm unitialized here: gageKernelSet ignores it. |
// It's okay to use kparm unitialized here: gageKernelSet ignores it. |
200 |
status = gageKernelSet(ctx, gageKernel00, nrrdKernelBSpline3, kparm); |
status = gageKernelSet(ctx, gageKernel00, nrrdKernelBSpline3, kparm); |
201 |
if(status) |
if(status) { |
|
{ |
|
202 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
203 |
fprintf(stderr, "Trouble setting kernel:\n%s", err); |
fprintf(stderr, "Trouble setting kernel:\n%s", err); |
204 |
free(err); |
free(err); |
209 |
|
|
210 |
// It's okay to use kparm unitialized here: gageKernelSet ignores it. |
// It's okay to use kparm unitialized here: gageKernelSet ignores it. |
211 |
status = gageKernelSet(ctx, gageKernel11, nrrdKernelBSpline3D, kparm); |
status = gageKernelSet(ctx, gageKernel11, nrrdKernelBSpline3D, kparm); |
212 |
if(status) |
if(status) { |
|
{ |
|
213 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
214 |
fprintf(stderr, "Trouble setting kernel:\n%s", err); |
fprintf(stderr, "Trouble setting kernel:\n%s", err); |
215 |
free(err); |
free(err); |
219 |
} |
} |
220 |
|
|
221 |
status = gageQueryItemOn(ctx, pvl, gageSclValue); |
status = gageQueryItemOn(ctx, pvl, gageSclValue); |
222 |
if(status) |
if(status) { |
|
{ |
|
223 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
224 |
fprintf(stderr, "Trouble with gageQueryItemOn:\n%s", err); |
fprintf(stderr, "Trouble with gageQueryItemOn:\n%s", err); |
225 |
free(err); |
free(err); |
229 |
} |
} |
230 |
|
|
231 |
status = gageQueryItemOn(ctx, pvl, gageSclGradVec); |
status = gageQueryItemOn(ctx, pvl, gageSclGradVec); |
232 |
if(status) |
if(status) { |
|
{ |
|
233 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
234 |
fprintf(stderr, "Trouble with gageQueryItemOn:\n%s", err); |
fprintf(stderr, "Trouble with gageQueryItemOn:\n%s", err); |
235 |
free(err); |
free(err); |
239 |
} |
} |
240 |
|
|
241 |
status = gageUpdate(ctx); |
status = gageUpdate(ctx); |
242 |
if(status) |
if(status) { |
|
{ |
|
243 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
244 |
fprintf(stderr, "Trouble with gageUpdate:\n%s", err); |
fprintf(stderr, "Trouble with gageUpdate:\n%s", err); |
245 |
free(err); |
free(err); |
249 |
} |
} |
250 |
|
|
251 |
val = gageAnswerPointer(ctx, pvl, gageSclValue); |
val = gageAnswerPointer(ctx, pvl, gageSclValue); |
252 |
if(val == NULL) |
if(val == NULL) { |
|
{ |
|
253 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
254 |
fprintf(stderr, "Trouble getting answer pointer:\n%s", err); |
fprintf(stderr, "Trouble getting answer pointer:\n%s", err); |
255 |
free(err); |
free(err); |
259 |
} |
} |
260 |
|
|
261 |
grad = gageAnswerPointer(ctx, pvl, gageSclGradVec); |
grad = gageAnswerPointer(ctx, pvl, gageSclGradVec); |
262 |
if(grad == NULL) |
if(grad == NULL) { |
|
{ |
|
263 |
err = biffGetDone(GAGE); |
err = biffGetDone(GAGE); |
264 |
fprintf(stderr, "Trouble getting answer pointer:\n%s", err); |
fprintf(stderr, "Trouble getting answer pointer:\n%s", err); |
265 |
free(err); |
free(err); |
268 |
return -1; |
return -1; |
269 |
} |
} |
270 |
|
|
|
|
|
271 |
int ui, vi; |
int ui, vi; |
272 |
double rayU, rayV, rayN; |
double rayU, rayV, rayN; |
273 |
double rayVec[3]; |
double rayVec[3]; |
284 |
double max_gray = 0; |
double max_gray = 0; |
285 |
double min_gray = 0; |
double min_gray = 0; |
286 |
double *out_data = malloc(sizeof(double) * 4 * imgResU * imgResV); |
double *out_data = malloc(sizeof(double) * 4 * imgResU * imgResV); |
287 |
if(out_data == NULL) |
if(out_data == NULL) { |
|
{ |
|
288 |
fprintf(stderr, "Trouble with malloc.\n"); |
fprintf(stderr, "Trouble with malloc.\n"); |
289 |
gageContextNix(ctx); |
gageContextNix(ctx); |
290 |
nrrdNuke(nin); |
nrrdNuke(nin); |
291 |
return -1; |
return -1; |
292 |
} |
} |
293 |
|
|
294 |
double t0 = GetTime(); |
double t0 = GetTime(); // start timing |
295 |
for(vi = 0; vi < imgResV; vi++) |
for(vi = 0; vi < imgResV; vi++) { |
|
{ |
|
296 |
rayV = lerp(-camVmax, camVmax, -0.5, (double)(vi), (double)(imgResV) - 0.5); |
rayV = lerp(-camVmax, camVmax, -0.5, (double)(vi), (double)(imgResV) - 0.5); |
297 |
scale_vec3(rayV, camV, temp); |
scale_vec3(rayV, camV, temp); |
298 |
for(ui = 0; ui < imgResU; ui++) |
for(ui = 0; ui < imgResU; ui++) { |
|
{ |
|
299 |
rayU = lerp(-camUmax, camUmax, -0.5, (double)(ui), (double)(imgResU) - 0.5); |
rayU = lerp(-camUmax, camUmax, -0.5, (double)(ui), (double)(imgResU) - 0.5); |
300 |
scale_vec3(rayU, camU, temp2); |
scale_vec3(rayU, camU, temp2); |
301 |
add3(temp, temp2, temp2); |
add3(temp, temp2, temp2); |
309 |
output[1] = 0; |
output[1] = 0; |
310 |
output[2] = 0; |
output[2] = 0; |
311 |
output[3] = 0; |
output[3] = 0; |
312 |
for(rayN = camVspNear; rayN <= camVspFar; rayN += rayStep) |
for(rayN = camVspNear; rayN <= camVspFar; rayN += rayStep) { |
|
{ |
|
313 |
scale_vec3(rayN, rayDir, temp2); |
scale_vec3(rayN, rayDir, temp2); |
314 |
add3(temp2, camEye, rayPos); |
add3(temp2, camEye, rayPos); |
315 |
if(inside(rayPos)) |
if(inside(rayPos)) { |
|
{ |
|
316 |
status = gageProbe(ctx, rayPos[0], rayPos[1], rayPos[2]); |
status = gageProbe(ctx, rayPos[0], rayPos[1], rayPos[2]); |
317 |
if(status) |
if(status) { |
|
{ |
|
318 |
err = ctx->errStr; |
err = ctx->errStr; |
319 |
fprintf(stderr, "Trouble with gageProbe:\n%s", err); |
fprintf(stderr, "Trouble with gageProbe:\n%s", err); |
320 |
free(err); |
free(err); |
323 |
nrrdNuke(nin); |
nrrdNuke(nin); |
324 |
return -1; |
return -1; |
325 |
} |
} |
326 |
if(*val > valOpacMin) |
if(*val > valOpacMin) { |
|
{ |
|
327 |
temp2[0] = *(grad + 0); |
temp2[0] = *(grad + 0); |
328 |
temp2[1] = *(grad + 1); |
temp2[1] = *(grad + 1); |
329 |
temp2[2] = *(grad + 2); |
temp2[2] = *(grad + 2); |
346 |
transp *= 1 - alpha; |
transp *= 1 - alpha; |
347 |
} |
} |
348 |
} |
} |
349 |
if(transp < 0.01) |
if(transp < 0.01) { |
|
{ |
|
350 |
transp = 0; |
transp = 0; |
351 |
break; |
break; |
352 |
} |
} |
355 |
*(out_data + ui * imgResV * 4 + vi * 4 + 1) = gray; |
*(out_data + ui * imgResV * 4 + vi * 4 + 1) = gray; |
356 |
*(out_data + ui * imgResV * 4 + vi * 4 + 2) = gray; |
*(out_data + ui * imgResV * 4 + vi * 4 + 2) = gray; |
357 |
*(out_data + ui * imgResV * 4 + vi * 4 + 3) = 1.0f - transp; |
*(out_data + ui * imgResV * 4 + vi * 4 + 3) = 1.0f - transp; |
358 |
if(!set) |
if(!set) { |
|
{ |
|
359 |
max_gray = gray; |
max_gray = gray; |
360 |
min_gray = gray; |
min_gray = gray; |
361 |
set = true; |
set = true; |
366 |
} |
} |
367 |
|
|
368 |
unsigned char *uc_out_data = malloc(sizeof(unsigned char) * imgResU * imgResV); |
unsigned char *uc_out_data = malloc(sizeof(unsigned char) * imgResU * imgResV); |
369 |
for(vi = 0; vi < imgResV; vi++) |
for(vi = 0; vi < imgResV; vi++) { |
370 |
{ |
for(ui = 0; ui < imgResU; ui++) { |
|
for(ui = 0; ui < imgResU; ui++) |
|
|
{ |
|
371 |
*(uc_out_data + vi * imgResU + ui) = ulerp(min_gray, *(out_data + ui * imgResV * 4 + vi * 4 + 0), max_gray); |
*(uc_out_data + vi * imgResU + ui) = ulerp(min_gray, *(out_data + ui * imgResV * 4 + vi * 4 + 0), max_gray); |
372 |
} |
} |
373 |
} |
} |
|
double totalTime = GetTime() - t0; |
|
374 |
|
|
375 |
|
double totalTime = GetTime() - t0; |
376 |
printf("usr=%f\n", totalTime); |
printf("usr=%f\n", totalTime); |
377 |
|
|
378 |
// Write out data |
// Write out data |
379 |
Nrrd *nout; |
Nrrd *nout; |
380 |
nout = nrrdNew(); |
nout = nrrdNew(); |
381 |
if(nout == NULL) |
if(nout == NULL) { |
|
{ |
|
382 |
err = biffGetDone(NRRD); |
err = biffGetDone(NRRD); |
383 |
fprintf(stderr, "Trouble allocating nrrd struct:\n%s", err); |
fprintf(stderr, "Trouble allocating nrrd struct:\n%s", err); |
384 |
free(err); |
free(err); |
390 |
} |
} |
391 |
|
|
392 |
status = nrrdWrap_va(nout, uc_out_data, nrrdTypeUChar, 2, imgResU, imgResV); |
status = nrrdWrap_va(nout, uc_out_data, nrrdTypeUChar, 2, imgResU, imgResV); |
393 |
if(status) |
if(status) { |
|
{ |
|
394 |
err = biffGetDone(NRRD); |
err = biffGetDone(NRRD); |
395 |
fprintf(stderr, "Trouble wrapping nrrd struct:\n%s", err); |
fprintf(stderr, "Trouble wrapping nrrd struct:\n%s", err); |
396 |
free(err); |
free(err); |
402 |
} |
} |
403 |
|
|
404 |
status = nrrdSave(outfile, nout, NULL); |
status = nrrdSave(outfile, nout, NULL); |
405 |
if(status) |
if(status) { |
|
{ |
|
406 |
err = biffGetDone(NRRD); |
err = biffGetDone(NRRD); |
407 |
fprintf(stderr, "Trouble saving nrrd struct:\n%s", err); |
fprintf(stderr, "Trouble saving nrrd struct:\n%s", err); |
408 |
free(err); |
free(err); |