|
From: <kin...@us...> - 2004-02-19 04:10:00
|
Update of /cvsroot/teem/teem/src/bin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24494/bin Modified Files: mrender.c Log Message: mrender can now rendering vector and tensor datasets. Except that it doesn't work yet... Index: mrender.c =================================================================== RCS file: /cvsroot/teem/teem/src/bin/mrender.c,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** mrender.c 13 Feb 2004 23:01:12 -0000 1.29 --- mrender.c 19 Feb 2004 03:59:53 -0000 1.30 *************** *** 25,34 **** #include <teem/limn.h> #include <teem/hoover.h> #define MREND "mrender" char *info = ("A demonstration of hoover, gage, and nrrd measures. " ! "Uses hoover to cast rays through a scalar volume, gage to " "measure one of various quantities along the rays, and a " "specified nrrd measure to reduce all the values along a ray " --- 25,67 ---- #include <teem/limn.h> #include <teem/hoover.h> + #include <teem/ten.h> + int + probeParseKind(void *ptr, char *str, char err[AIR_STRLEN_HUGE]) { + char me[] = "probeParseKind"; + gageKind **kindP; + + if (!(ptr && str)) { + sprintf(err, "%s: got NULL pointer", me); + return 1; + } + kindP = ptr; + airToLower(str); + if (!strcmp("scalar", str)) { + *kindP = gageKindScl; + } else if (!strcmp("vector", str)) { + *kindP = gageKindVec; + } else if (!strcmp("tensor", str)) { + *kindP = tenGageKind; + } else { + sprintf(err, "%s: not \"scalar\", \"vector\", or \"tensor\"", me); + return 1; + } + + return 0; + } + + hestCB probeKindHestCB = { + sizeof(gageKind *), + "kind", + probeParseKind, + NULL + }; #define MREND "mrender" char *info = ("A demonstration of hoover, gage, and nrrd measures. " ! "Uses hoover to cast rays through a volume (scalar, vector, or " ! "tensor), gage to " "measure one of various quantities along the rays, and a " "specified nrrd measure to reduce all the values along a ray " *************** *** 46,49 **** --- 79,83 ---- typedef struct { Nrrd *nin; /* input volume to render */ + gageKind *kind; /* the kind of volume it is */ double rayStep, /* distance between sampling planes */ fromNaN; /* what to convert non-existent value to */ *************** *** 69,72 **** --- 103,107 ---- uu = (mrendUser *)calloc(1, sizeof(mrendUser)); uu->nin = NULL; + uu->kind = NULL; uu->rayStep = 0.0; uu->whatq = gageSclUnknown; *************** *** 98,104 **** char me[]="mrendUserCheck", err[AIR_STRLEN_MED]; ! if (3 != uu->nin->dim) { ! sprintf(err, "%s: input nrrd needs 3 dimensions, not %d", ! me, uu->nin->dim); biffAdd(MREND, err); return 1; } --- 133,139 ---- char me[]="mrendUserCheck", err[AIR_STRLEN_MED]; ! if (3 + uu->kind->baseDim != uu->nin->dim) { ! sprintf(err, "%s: input nrrd needs %d dimensions, not %d", ! me, + uu->kind->baseDim, uu->nin->dim); biffAdd(MREND, err); return 1; } *************** *** 111,117 **** biffAdd(MREND, err); return 1; } ! if (1 != gageKindScl->table[uu->whatq].answerLength) { ! sprintf(err, "%s: quantity %s isn't a scalar; can't render it\n", ! me, airEnumStr(gageKindScl->enm, uu->whatq)); biffAdd(MREND, err); return 1; } --- 146,153 ---- biffAdd(MREND, err); return 1; } ! if (1 != uu->kind->table[uu->whatq].answerLength) { ! sprintf(err, "%s: quantity %s (in %s volumes) isn't a scalar; " ! "can't render it", ! me, airEnumStr(uu->kind->enm, uu->whatq), uu->kind->name); biffAdd(MREND, err); return 1; } *************** *** 162,166 **** E = 0; ! if (!E) E |= !(pvl = gagePerVolumeNew(uu->gctx0, uu->nin, gageKindScl)); if (!E) E |= gagePerVolumeAttach(uu->gctx0, pvl); if (!E) E |= gageKernelSet(uu->gctx0, gageKernel00, --- 198,202 ---- E = 0; ! if (!E) E |= !(pvl = gagePerVolumeNew(uu->gctx0, uu->nin, uu->kind)); if (!E) E |= gagePerVolumeAttach(uu->gctx0, pvl); if (!E) E |= gageKernelSet(uu->gctx0, gageKernel00, *************** *** 348,351 **** --- 384,393 ---- /* -------------------------------------------------------------- */ + #if 0 + + this was nixed once mrender learned to handle volume of general + kind, instead of being restricted to scalars + + /* ** learned: if you're playing games with strings with two passes, where *************** *** 386,389 **** --- 428,433 ---- } + #endif + int main(int argc, char *argv[]) { *************** *** 391,395 **** hestParm *hparm; int E, Ecode, renorm; ! char *me, *errS, *buff; mrendUser *uu; airArray *mop; --- 435,439 ---- hestParm *hparm; int E, Ecode, renorm; ! char *me, *errS, *whatS; mrendUser *uu; airArray *mop; *************** *** 405,414 **** airMopAdd(mop, uu, (airMopper)mrendUserNix, airMopAlways); - buff = mrendGage("the quantity to measure at sample points along " \ - "rays. Possibilities include:"); - airMopAdd(mop, buff, airFree, airMopAlways); - hestOptAdd(&hopt, "i", "nin", airTypeOther, 1, 1, &(uu->nin), NULL, "input nrrd to render", NULL, NULL, nrrdHestNrrd); limnHestCameraOptAdd(&hopt, uu->hctx->cam, NULL, "0 0 0", "0 0 1", --- 449,457 ---- airMopAdd(mop, uu, (airMopper)mrendUserNix, airMopAlways); hestOptAdd(&hopt, "i", "nin", airTypeOther, 1, 1, &(uu->nin), NULL, "input nrrd to render", NULL, NULL, nrrdHestNrrd); + hestOptAdd(&hopt, "k", "kind", airTypeOther, 1, 1, &(uu->kind), NULL, + "\"kind\" of volume (\"scalar\", \"vector\", or \"tensor\")", + NULL, NULL, &probeKindHestCB); limnHestCameraOptAdd(&hopt, uu->hctx->cam, NULL, "0 0 0", "0 0 1", *************** *** 433,439 **** "\"Accurate\" kernels don't need this; doing it always " "makes things go slower"); ! hestOptAdd(&hopt, "q", "quantity", airTypeEnum, 1, 1, &(uu->whatq), NULL, ! buff, ! NULL, gageKindScl->enm); hestOptAdd(&hopt, "m", "measure", airTypeEnum, 1, 1, &(uu->measr), NULL, "how to collapse list of ray samples into one scalar. " --- 476,481 ---- "\"Accurate\" kernels don't need this; doing it always " "makes things go slower"); ! hestOptAdd(&hopt, "q", "query", airTypeString, 1, 1, &whatS, NULL, ! "the quantity (scalar, vector, or matrix) to learn by probing"); hestOptAdd(&hopt, "m", "measure", airTypeEnum, 1, 1, &(uu->measr), NULL, "how to collapse list of ray samples into one scalar. " *************** *** 459,462 **** --- 501,515 ---- airMopAdd(mop, hopt, (airMopper)hestParseFree, airMopAlways); + uu->whatq = airEnumVal(uu->kind->enm, whatS); + if (-1 == uu->whatq) { + /* -1 indeed always means "unknown" for any gageKind */ + fprintf(stderr, "%s: couldn't parse \"%s\" as measure of \"%s\" volume\n", + me, whatS, uu->kind->name); + hestUsage(stderr, hopt, me, hparm); + hestGlossary(stderr, hopt, hparm); + airMopError(mop); + return 1; + } + if (mrendUserCheck(uu)) { fprintf(stderr, "%s: problem with input parameters:\n%s\n", *************** *** 468,474 **** gageParmSet(uu->gctx0, gageParmRequireAllSpacings, AIR_FALSE); gageParmSet(uu->gctx0, gageParmRenormalize, renorm); ! fprintf(stderr, "%s: will render %s of %s\n", me, airEnumStr(nrrdMeasure, uu->measr), ! airEnumStr(gageKindScl->enm, uu->whatq)); /* set remaining fields of hoover context */ --- 521,527 ---- gageParmSet(uu->gctx0, gageParmRequireAllSpacings, AIR_FALSE); gageParmSet(uu->gctx0, gageParmRenormalize, renorm); ! fprintf(stderr, "%s: will render %s of %s in %s volume\n", me, airEnumStr(nrrdMeasure, uu->measr), ! airEnumStr(uu->kind->enm, uu->whatq), uu->kind->name); /* set remaining fields of hoover context */ |