Update of /cvsroot/teem/teem/src/mite In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13401 Modified Files: GNUmakefile mite.h privateMite.h ray.c renderMite.c thread.c txf.c user.c Log Message: begin valgrind debugging of new miter: bigger, better, stronger, slower Index: GNUmakefile =================================================================== RCS file: /cvsroot/teem/teem/src/mite/GNUmakefile,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** GNUmakefile 13 Feb 2004 22:58:40 -0000 1.15 --- GNUmakefile 26 Feb 2004 06:26:10 -0000 1.16 *************** *** 47,51 **** $(L).PUBLIC_HEADERS = mite.h $(L).PRIVATE_HEADERS = privateMite.h ! $(L).OBJS = defaultsMite.o kindnot.o renderMite.o thread.o ray.o txf.o user.o #### #### --- 47,52 ---- $(L).PUBLIC_HEADERS = mite.h $(L).PRIVATE_HEADERS = privateMite.h ! $(L).OBJS = defaultsMite.o kindnot.o txf.o shade.o \ ! user.o renderMite.o thread.o ray.o #### #### Index: mite.h =================================================================== RCS file: /cvsroot/teem/teem/src/mite/mite.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** mite.h 19 Feb 2004 03:52:47 -0000 1.26 --- mite.h 26 Feb 2004 06:26:10 -0000 1.27 *************** *** 110,127 **** *nvin, /* 3-vector volume being rendered */ *ntin, /* tensor volume being rendered */ ! **ntxf, /* array of nrrds containing transfer functions, ! these are never altered (in contrast to ntxf ! in miteRender) */ *nout; /* output image container, for five-channel output RGBAZ. We'll nrrdMaybeAlloc all the image data and put it in here, but we won't nrrdNuke(nout), ! just like we won't nrrdNuke nsin, ntin, or any of ! the ntxf[i] */ int ntxfNum; /* allocated and valid length of ntxf[] */ char shadeStr[AIR_STRLEN_MED]; /* how to do shading */ /* for each possible element of the txf range, what value should it ! start at prior to multiplying by the values (if any) learned from ! the txf. Mainly needed to store non-unity values for the ! quantities not covered by a transfer function */ mite_t rangeInit[MITE_RANGE_NUM]; double refStep, /* length of "unity" for doing opacity correction */ --- 110,127 ---- *nvin, /* 3-vector volume being rendered */ *ntin, /* tensor volume being rendered */ ! **ntxf, /* array of pointers to nrrds containing transfer ! functions, these are never altered (the ntxf ! in miteRender, however, is created and altered ! based on this ntxf) */ *nout; /* output image container, for five-channel output RGBAZ. We'll nrrdMaybeAlloc all the image data and put it in here, but we won't nrrdNuke(nout), ! just like we won't nrrdNuke nsin, nvin, ntin, or ! any of the ntxf[i] */ int ntxfNum; /* allocated and valid length of ntxf[] */ char shadeStr[AIR_STRLEN_MED]; /* how to do shading */ /* for each possible element of the txf range, what value should it ! start at prior to rendering. Mainly needed to store non-unity values ! for the quantities not covered by a transfer function */ mite_t rangeInit[MITE_RANGE_NUM]; double refStep, /* length of "unity" for doing opacity correction */ *************** *** 144,152 **** int normalSide, /* determines direction of gradient that is used as normal for shading: ! 1: normal points to lower values (higher values are more "inside"); 0: "two-sided": dot-products are abs()'d -1: normal points to higher values ! (lower values more "inside") */ verbUi, verbVi; /* pixel coordinate for which to turn on verbosity */ airArray *umop; /* for things allocated which are used across --- 144,155 ---- int normalSide, /* determines direction of gradient that is used as normal for shading: ! 1: the standard way: normal points to lower values (higher values are more "inside"); 0: "two-sided": dot-products are abs()'d -1: normal points to higher values ! (lower values more "inside") ! Setting up the values this way allows for idioms ! like "if (muu->normalSide) ...", meaning, if the ! lighting is one-sided */ verbUi, verbVi; /* pixel coordinate for which to turn on verbosity */ airArray *umop; /* for things allocated which are used across *************** *** 154,158 **** /* output information from last rendering */ double rendTime, /* rendering time, in seconds */ ! sampRate; /* rate (KHz) at which sampler callback was called */ } miteUser; --- 157,161 ---- /* output information from last rendering */ double rendTime, /* rendering time, in seconds */ ! sampRate; /* rate (KHz) at which samples were rendered */ } miteUser; *************** *** 167,172 **** miteShadeMethodUnknown, miteShadeMethodNone, /* 1: no direction shading based on anything ! in the miteShadeSpec: just ambient ! (though still using over operator) */ miteShadeMethodPhong, /* 2: what mite has been doing all along */ miteShadeMethodLitTen, /* 3: (tensor-based) lit-tensors */ --- 170,177 ---- miteShadeMethodUnknown, miteShadeMethodNone, /* 1: no direction shading based on anything ! in the miteShadeSpec: just ambient, though ! things are still compositited with the over ! operator, and transfer functions are free ! to implement whatever shading they can */ miteShadeMethodPhong, /* 2: what mite has been doing all along */ miteShadeMethodLitTen, /* 3: (tensor-based) lit-tensors */ *************** *** 184,189 **** */ typedef struct { ! int shadeMethod; /* from miteShadeMethod* enum */ ! gageQuerySpec *vec0, *vec1, *scl0, *scl1; /* things to use for shading. How these are interpreted is determined by shadeMethod: --- 189,194 ---- */ typedef struct { ! int method; /* from miteShadeMethod* enum */ ! gageItemSpec *vec0, *vec1, *scl0, *scl1; /* things to use for shading. How these are interpreted is determined by shadeMethod: *************** *** 197,201 **** ** ** rendering-parameter-set-specific (but non-thread-specific) state, ! ** used internally by mite */ typedef struct { --- 202,208 ---- ** ** rendering-parameter-set-specific (but non-thread-specific) state, ! ** used internally by mite. The primary role here is to store information ! ** derived from the miteUser, in a form which is more immediately useful ! ** for rendering. */ typedef struct { *************** *** 207,210 **** --- 214,221 ---- type mite_t */ int ntxfNum; /* allocated and valid length of ntxf[] */ + int sclPvlIdx, vecPvlIdx, + tenPvlIdx; /* indices of the different gageKinds of + volumes in the gageContext's array of + gagePerVolumes. Probably a hack */ miteShadeSpec *shpec; /* information based on muu->shadeStr */ double time0; /* rendering start time */ *************** *** 228,233 **** enum { miteStageOpUnknown, ! miteStageOpAdd, miteStageOpMax, miteStageOpMultiply, miteStageOpLast --- 239,245 ---- enum { miteStageOpUnknown, ! miteStageOpMin, miteStageOpMax, + miteStageOpAdd, miteStageOpMultiply, miteStageOpLast *************** *** 238,242 **** gage or by mite. This points into the answer vector in one of the thread's ! pervolumes */ int size, /* number of entries along this txf axis */ op, /* from miteStageOp* enum. Note that this --- 250,256 ---- gage or by mite. This points into the answer vector in one of the thread's ! pervolumes, or into ansMiteVal in the ! miteThread. It can be either a scalar ! or a vector */ int size, /* number of entries along this txf axis */ op, /* from miteStageOp* enum. Note that this *************** *** 244,254 **** adjusted by this txf (can't add color while multiplying opacity) */ ! (*qn)(gage_t *); /* callback for doing vector quantization of ! vector-valued txf domain variables, or ! NULL if this is a scalar variable */ ! double min, max; /* min, max (copied from nrrd axis) */ mite_t *data; /* pointer to txf data. If non-NULL, the ! rest of the variables are meaningful */ ! int rangeIdx[MITE_RANGE_NUM], /* indices into miteThread's range */ rangeNum; /* number of range variables set by the txf == number of pointers in range[] to use */ --- 258,271 ---- adjusted by this txf (can't add color while multiplying opacity) */ ! (*qn)(gage_t *); /* if non-NULL: callback for doing vector ! quantization of vector-valued txf domain ! variables */ ! double min, max; /* quantization range of values which is ! covered by this axis of the txf; copied ! from corresponding axis of the nrrd */ mite_t *data; /* pointer to txf data. If non-NULL, the ! following fields are meaningful */ ! int rangeIdx[MITE_RANGE_NUM], /* indices into miteThread's range, so that ! we know which quantities to update */ rangeNum; /* number of range variables set by the txf == number of pointers in range[] to use */ *************** *** 267,284 **** enum { miteValUnknown=-1, /* -1: nobody knows */ ! miteValXw, /* 0: "Xw", X position, world space (*gage_t) */ ! miteValXi, /* 1: "Xi", X " , index " (*gage_t) */ ! miteValYw, /* 2: "Yw", Y " , world " (*gage_t) */ ! miteValYi, /* 3: "Yi", Y " , index " (*gage_t) */ ! miteValZw, /* 4: "Zw", Z " , world " (*gage_t) */ ! miteValZi, /* 5: "Zi", Z " , index " (*gage_t) */ ! miteValTw, /* 6: "Tw", ray position (*gage_t) */ ! miteValTi, /* 7: "Ti", ray index (ray sample #) (*gage_t) */ miteValNdotV, /* 8: "NdotV", surface normal dotted w/ view vector ! (towards eye) (*gage_t) */ miteValNdotL, /* 9: "NdotL", surface normal dotted w/ light vector ! (towards the light source) (*gage_t) */ ! miteValGTdotV, /* 10: "GTdotV", normal curvature in view direction ! (*gage_t) */ miteValVrefN, /* 11: "VrefN", view vector (towards eye) reflected across surface normal (gage_t[3]) */ --- 284,302 ---- enum { miteValUnknown=-1, /* -1: nobody knows */ ! miteValXw, /* 0: "Xw", X position, world space (gage_t[1]) */ ! miteValXi, /* 1: "Xi", X " , index " (gage_t[1]) */ ! miteValYw, /* 2: "Yw", Y " , world " (gage_t[1]) */ ! miteValYi, /* 3: "Yi", Y " , index " (gage_t[1]) */ ! miteValZw, /* 4: "Zw", Z " , world " (gage_t[1]) */ ! miteValZi, /* 5: "Zi", Z " , index " (gage_t[1]) */ ! miteValTw, /* 6: "Tw", ray position (gage_t[1]) */ ! miteValTi, /* 7: "Ti", ray index (ray sample #) (gage_t[1]) */ miteValNdotV, /* 8: "NdotV", surface normal dotted w/ view vector ! (towards eye) (gage_t[1]) */ miteValNdotL, /* 9: "NdotL", surface normal dotted w/ light vector ! (towards the light source) (gage_t[1]) */ ! miteValGTdotV, /* 10: "GTdotV", normal curvature in view direction, ! the contraction of the geometry tensor along ! the view vector (gage_t[1]) */ miteValVrefN, /* 11: "VrefN", view vector (towards eye) reflected across surface normal (gage_t[3]) */ *************** *** 287,295 **** miteValVdefTdotV, /* 13: "VdefTdotV", VdefT dotted back with V, not the same as the tensor contraction along V, ! (*gage_t) */ miteValLast }; ! #define MITE_VAL_MAX 13 ! #define MITE_VAL_TOTAL_ANS_LENGTH 18 /* --- 305,312 ---- miteValVdefTdotV, /* 13: "VdefTdotV", VdefT dotted back with V, not the same as the tensor contraction along V, ! (gage_t[1]) */ miteValLast }; ! #define MITE_VAL_ITEM_MAX 13 /* *************** *** 300,312 **** typedef struct miteThread_t { gageContext *gctx; /* per-thread context */ ! gage_t *ansScl, /* shortcut to scalar answer vector */ ! *ansVec, /* shortcut to vector answer vector */ ! *ansTen, /* shortcut to tensor answer vector */ ! *vec0, *vec1, *scl0, *scl1, /* shortcuts vectors/scalars used for ! shading; explained with miteShadeSpec */ ! ansMiteVal[MITE_VAL_TOTAL_ANS_LENGTH]; /* room for all the miteVal */ ! int verbose, /* blah blah blah */ thrid, /* thread ID */ ! ui, vi, /* image coords */ samples; /* number of samples handled so far by this thread */ --- 317,332 ---- typedef struct miteThread_t { gageContext *gctx; /* per-thread context */ ! gage_t *ansScl, /* pointer to gageKindScl answer vector */ ! *ansVec, /* pointer to gageKindVec answer vector */ ! *ansTen, /* pointer to tenGageKind answer vector */ ! *ansMiteVal, /* room for all the miteVal answers, which ! unlike ans{Scl,Vec,Ten} is allocated by ! mite instead of by gage */ ! *shadeVec0, *shadeVec1, ! *shadeScl0, *shadeScl1; /* pointers into the ans* arrays above, ! used for shading */ ! int verbose, /* blah, blah, blah */ thrid, /* thread ID */ ! ui, vi, /* image coords of current ray */ samples; /* number of samples handled so far by this thread */ *************** *** 336,342 **** /* txf.c */ TEEM_API char miteRangeChar[MITE_RANGE_NUM]; ! TEEM_API void miteVariablePrint(char *buff, const gageQuerySpec *qsp); ! TEEM_API int miteVariableParse(gageQuerySpec *qsp, const char *label); TEEM_API int miteNtxfCheck(const Nrrd *ntxf); /* user.c */ --- 356,366 ---- /* txf.c */ TEEM_API char miteRangeChar[MITE_RANGE_NUM]; ! TEEM_API int miteVariableParse(gageItemSpec *isp, const char *label); ! TEEM_API void miteVariablePrint(char *buff, const gageItemSpec *isp); TEEM_API int miteNtxfCheck(const Nrrd *ntxf); + TEEM_API void miteQueryAdd(gageQuery queryScl, + gageQuery queryVec, + gageQuery queryTen, gageItemSpec *isp); + /* user.c */ *************** *** 344,355 **** TEEM_API miteUser *miteUserNix(miteUser *muu); ! /* renderMite.c */ TEEM_API miteShadeSpec *miteShadeSpecNew(); TEEM_API miteShadeSpec *miteShadeSpecNix(miteShadeSpec *); ! TEEM_API int miteShadeParse(miteShadeSpec *shpec, char *shadeStr); TEEM_API int miteRenderBegin(miteRender **mrrP, miteUser *muu); TEEM_API int miteRenderEnd(miteRender *mrr, miteUser *muu); /* thread.c */ TEEM_API int miteThreadBegin(miteThread **mttP, miteRender *mrr, miteUser *muu, int whichThread); --- 368,387 ---- TEEM_API miteUser *miteUserNix(miteUser *muu); ! /* shade.c */ TEEM_API miteShadeSpec *miteShadeSpecNew(); TEEM_API miteShadeSpec *miteShadeSpecNix(miteShadeSpec *); ! TEEM_API int miteShadeSpecParse(miteShadeSpec *shpec, char *shadeStr); ! TEEM_API void miteShadeSpecPrint(char *buff, const miteShadeSpec *shpec); ! TEEM_API void miteShadeSpecQueryAdd(gageQuery queryScl, ! gageQuery queryVec, ! gageQuery queryTen, miteShadeSpec *shpec); ! ! /* renderMite.c */ TEEM_API int miteRenderBegin(miteRender **mrrP, miteUser *muu); TEEM_API int miteRenderEnd(miteRender *mrr, miteUser *muu); /* thread.c */ + TEEM_API miteThread *miteThreadNew(); + TEEM_API miteThread *miteThreadNix(miteThread *mtt); TEEM_API int miteThreadBegin(miteThread **mttP, miteRender *mrr, miteUser *muu, int whichThread); Index: privateMite.h =================================================================== RCS file: /cvsroot/teem/teem/src/mite/privateMite.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** privateMite.h 13 Feb 2004 22:58:40 -0000 1.4 --- privateMite.h 26 Feb 2004 06:26:10 -0000 1.5 *************** *** 32,38 **** /* txf.c */ ! extern void _miteQuery(unsigned int *queryScl, ! unsigned int *queryVec, ! unsigned int *queryTen, gageQuerySpec *qsp); extern int _miteNtxfAlphaAdjust(miteRender *mrr, miteUser *muu); extern int _miteStageSet(miteThread *mtt, miteRender *mrr); --- 32,36 ---- /* txf.c */ ! extern gage_t *_miteAnswerPointer(miteThread *mtt, gageItemSpec *isp); extern int _miteNtxfAlphaAdjust(miteRender *mrr, miteUser *muu); extern int _miteStageSet(miteThread *mtt, miteRender *mrr); Index: ray.c =================================================================== RCS file: /cvsroot/teem/teem/src/mite/ray.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** ray.c 13 Feb 2004 22:58:40 -0000 1.17 --- ray.c 26 Feb 2004 06:26:10 -0000 1.18 *************** *** 62,71 **** ks = mtt->range[miteRangeKs]; ELL_3V_SCALE(ad, ka, muu->lit->amb); ! if (miteShadeMethodPhong == mrr->shpec->shadeMethod) { if (kd || ks) { if (muu->normalSide) { ! ELL_3V_SCALE(N, -muu->normalSide, mtt->vec0); } else { ! ELL_3V_COPY(N, mtt->vec0); } if (kd) { --- 62,77 ---- ks = mtt->range[miteRangeKs]; ELL_3V_SCALE(ad, ka, muu->lit->amb); ! switch (mrr->shpec->method) { ! case miteShadeMethodNone: ! /* nothing to do */ ! break; ! case miteShadeMethodPhong: ! /* this is dicey- we're *writing* to the answer buffer */ if (kd || ks) { + ELL_3V_NORM(mtt->shadeVec0, mtt->shadeVec0, tmp); if (muu->normalSide) { ! ELL_3V_SCALE(N, -muu->normalSide, mtt->shadeVec0); } else { ! ELL_3V_COPY(N, mtt->shadeVec0); } if (kd) { *************** *** 75,79 **** } if (LdotN > 0) { ! ELL_3V_SCALE_ADD2(ad, 1.0, ad, LdotN*kd, muu->lit->col[0]); } } --- 81,85 ---- } if (LdotN > 0) { ! ELL_3V_SCALE_INCR(ad, LdotN*kd, muu->lit->col[0]); } } *************** *** 92,101 **** } } ! } else if (miteShadeMethodLitTen == mrr->shpec->shadeMethod) { ! ! } else { fprintf(stderr, "!%s: PANIC, shadeMethod %d unimplemented\n", ! me, mrr->shpec->shadeMethod); exit(1); } *R = (E - 1 + ad[0])*col[0] + s[0]; --- 98,110 ---- } } ! break; ! case miteShadeMethodLitTen: ! fprintf(stderr, "!%s: lit-tensor not yet implemented\n", me); ! break; ! default: fprintf(stderr, "!%s: PANIC, shadeMethod %d unimplemented\n", ! me, mrr->shpec->method); exit(1); + break; } *R = (E - 1 + ad[0])*col[0] + s[0]; *************** *** 149,163 **** mtt->ansMiteVal[miteValTw] = rayT; mtt->ansMiteVal[miteValTi] = num; ! mtt->ansMiteVal[miteValNdotV] = -muu->normalSide*ELL_3V_DOT(mtt->V, mtt->vec0); ! mtt->ansMiteVal[miteValNdotL] = -muu->normalSide*ELL_3V_DOT(mtt->vec0, ! muu->lit->dir[0]); if (!muu->normalSide) { mtt->ansMiteVal[miteValNdotV] = AIR_ABS(mtt->ansMiteVal[miteValNdotV]); mtt->ansMiteVal[miteValNdotL] = AIR_ABS(mtt->ansMiteVal[miteValNdotL]); } ELL_3MV_MUL(kn, mtt->nPerp, mtt->V); ELL_3V_NORM(kn, kn, len); ELL_3MV_MUL(knd, mtt->gten, kn); mtt->ansMiteVal[miteValGTdotV] = ELL_3V_DOT(knd, kn); memcpy(mtt->range, muu->rangeInit, MITE_RANGE_NUM*sizeof(mite_t)); --- 158,183 ---- mtt->ansMiteVal[miteValTw] = rayT; mtt->ansMiteVal[miteValTi] = num; ! #if 0 ! ! what if shading is none? ! ! mtt->ansMiteVal[miteValNdotV] = ! -muu->normalSide*ELL_3V_DOT(mtt->V, mtt->shadeVec0); ! mtt->ansMiteVal[miteValNdotL] = ! -muu->normalSide*ELL_3V_DOT(mtt->shadeVec0, muu->lit->dir[0]); ! #endif if (!muu->normalSide) { mtt->ansMiteVal[miteValNdotV] = AIR_ABS(mtt->ansMiteVal[miteValNdotV]); mtt->ansMiteVal[miteValNdotL] = AIR_ABS(mtt->ansMiteVal[miteValNdotL]); } + + #if 0 + this is bullshit + ELL_3MV_MUL(kn, mtt->nPerp, mtt->V); ELL_3V_NORM(kn, kn, len); ELL_3MV_MUL(knd, mtt->gten, kn); mtt->ansMiteVal[miteValGTdotV] = ELL_3V_DOT(knd, kn); + #endif memcpy(mtt->range, muu->rangeInit, MITE_RANGE_NUM*sizeof(mite_t)); *************** *** 193,199 **** A = 1 - mtt->TT; if (A) { ! ELL_4V_SET(imgData + 4*idx, mtt->RR/A, mtt->GG/A, mtt->BB/A, A); } else { ! ELL_4V_SET(imgData + 4*idx, 0, 0, 0, 0); } return 0; --- 213,219 ---- A = 1 - mtt->TT; if (A) { ! ELL_4V_SET(imgData + 5*idx, mtt->RR/A, mtt->GG/A, mtt->BB/A, A); } else { ! ELL_4V_SET(imgData + 5*idx, 0, 0, 0, 0); } return 0; Index: renderMite.c =================================================================== RCS file: /cvsroot/teem/teem/src/mite/renderMite.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** renderMite.c 13 Feb 2004 22:58:40 -0000 1.10 --- renderMite.c 26 Feb 2004 06:26:10 -0000 1.11 *************** *** 21,56 **** #include "privateMite.h" - miteShadeSpec * - miteShadeSpecNew(void) { - miteShadeSpec *shpec; - - shpec = (miteShadeSpec *)calloc(1, sizeof(miteShadeSpec)); - if (shpec) { - shpec->shadeMethod = miteShadeMethodUnknown; - shpec->vec0 = gageQuerySpecNew(); - shpec->vec1 = gageQuerySpecNew(); - shpec->scl0 = gageQuerySpecNew(); - shpec->scl1 = gageQuerySpecNew(); - if (!( shpec->vec0 && shpec->vec1 && - shpec->scl0 && shpec->scl1 )) { - return NULL; - } - } - return shpec; - } - - miteShadeSpec * - miteShadeSpecNix(miteShadeSpec *shpec) { - - if (shpec) { - shpec->vec0 = gageQuerySpecNix(shpec->vec0); - shpec->vec1 = gageQuerySpecNix(shpec->vec1); - shpec->scl0 = gageQuerySpecNix(shpec->scl0); - shpec->scl1 = gageQuerySpecNix(shpec->scl1); - AIR_FREE(shpec); - } - return NULL; - } - miteRender * _miteRenderNew(void) { --- 21,24 ---- *************** *** 64,68 **** --- 32,41 ---- return mrr; } + mrr->ntxf = NULL; + mrr->ntxfNum = 0; mrr->shpec = miteShadeSpecNew(); + mrr->sclPvlIdx = -1; + mrr->vecPvlIdx = -1; + mrr->tenPvlIdx = -1; airMopAdd(mrr->rmop, mrr->shpec, (airMopper)miteShadeSpecNix, airMopAlways); *************** *** 81,186 **** } - int - miteShadeParse(miteShadeSpec *shpec, char *shadeStr) { - char me[]="miteShadeParse", err[AIR_STRLEN_MED], *buff, *qstr, *tok, *state; - airArray *mop; - int ansLength; - - mop = airMopNew(); - if (!( shpec && airStrlen(shadeStr) )) { - sprintf(err, "%s: got NULL pointer and/or empty string", me); - biffAdd(MITE, err); airMopError(mop); return 1; - } - buff = airToLower(airStrdup(shadeStr)); - if (!buff) { - sprintf(err, "%s: couldn't strdup shading spec", me); - biffAdd(MITE, err); airMopError(mop); return 1; - } - airMopAdd(mop, buff, airFree, airMopAlways); - if (!strcmp("none", buff)) { - shpec->shadeMethod = miteShadeMethodNone; - } else if (buff == strstr("phong:", buff)) { - qstr = buff + strlen("phong:"); - if (miteVariableParse(shpec->vec0, qstr)) { - sprintf(err, "%s: couldn't parse \"%s\" as shading vector", me, qstr); - biffAdd(MITE, err); airMopError(mop); return 1; - } - ansLength = shpec->vec0->kind->ansLength[shpec->vec0->query]; - if (3 != ansLength) { - sprintf(err, "%s: \"%s\" isn't a vector (answer length is %d, not 3)", - me, qstr, ansLength); - biffAdd(MITE, err); airMopError(mop); return 1; - } - fprintf(stderr, "!%s: got phong:%s(%s)\n", me, - shpec->vec0->kind->name, - airEnumStr(shpec->vec0->kind->enm, shpec->vec0->query)); - } else if (buff == strstr("litten:", buff)) { - qstr = buff + strlen("litten:"); - /* ---- first vector */ - tok = airStrtok(qstr, ",", &state); - if (miteVariableParse(shpec->vec0, tok)) { - sprintf(err, "%s: couldn't parse \"%s\" as lit-tensor vector", me, tok); - biffAdd(MITE, err); airMopError(mop); return 1; - } - ansLength = shpec->vec0->kind->ansLength[shpec->vec0->query]; - if (3 != ansLength) { - sprintf(err, "%s: \"%s\" isn't a vector (answer length is %d, not 3)", - me, qstr, ansLength); - biffAdd(MITE, err); airMopError(mop); return 1; - } - /* ---- second vector */ - tok = airStrtok(qstr, ",", &state); - if (miteVariableParse(shpec->vec1, tok)) { - sprintf(err, "%s: couldn't parse \"%s\" as lit-tensor vector", me, tok); - biffAdd(MITE, err); airMopError(mop); return 1; - } - ansLength = shpec->vec1->kind->ansLength[shpec->vec1->query]; - if (3 != ansLength) { - sprintf(err, "%s: \"%s\" isn't a vector (answer length is %d, not 3)", - me, qstr, ansLength); - biffAdd(MITE, err); airMopError(mop); return 1; - } - /* ---- first scalar */ - tok = airStrtok(qstr, ",", &state); - if (miteVariableParse(shpec->scl0, tok)) { - sprintf(err, "%s: couldn't parse \"%s\" as lit-tensor scalar", me, tok); - biffAdd(MITE, err); airMopError(mop); return 1; - } - ansLength = shpec->scl0->kind->ansLength[shpec->scl0->query]; - if (1 != ansLength) { - sprintf(err, "%s: \"%s\" isn't a scalar (answer length is %d, not 1)", - me, qstr, ansLength); - biffAdd(MITE, err); airMopError(mop); return 1; - } - /* ---- second scalar */ - tok = airStrtok(qstr, ",", &state); - if (miteVariableParse(shpec->scl1, tok)) { - sprintf(err, "%s: couldn't parse \"%s\" as lit-tensor scalar", me, tok); - biffAdd(MITE, err); airMopError(mop); return 1; - } - ansLength = shpec->scl1->kind->ansLength[shpec->scl1->query]; - if (1 != ansLength) { - sprintf(err, "%s: \"%s\" isn't a scalar (answer length is %d, not 1)", - me, qstr, ansLength); - biffAdd(MITE, err); airMopError(mop); return 1; - } - fprintf(stderr, "!%s: got litten:%s(%s),\n", me, - shpec->vec0->kind->name, - airEnumStr(shpec->vec0->kind->enm, shpec->vec0->query)); - } else { - sprintf(err, "%s: shading specification \"%s\" not understood", - me, shadeStr); - biffAdd(MITE, err); airMopError(mop); return 1; - } - airMopOkay(mop); - return 0; - } - int miteRenderBegin(miteRender **mrrP, miteUser *muu) { char me[]="miteRenderBegin", err[AIR_STRLEN_MED]; gagePerVolume *pvl; ! int E, T, thr, axi; ! unsigned int queryScl, queryVec, queryTen; if (!(mrrP && muu)) { --- 54,64 ---- } int miteRenderBegin(miteRender **mrrP, miteUser *muu) { char me[]="miteRenderBegin", err[AIR_STRLEN_MED]; gagePerVolume *pvl; ! int E, T, thr, axi, pvlIdx; ! gageQuery queryScl, queryVec, queryTen; ! gageItemSpec isp; if (!(mrrP && muu)) { *************** *** 201,226 **** } ! queryScl = 0; ! queryTen = 0; for (T=0; T<muu->ntxfNum; T++) { ! for (axi=1; axi<=muu->ntxf[T]->dim-1; axi++) { ! _miteNtxfQuery(&queryScl, &queryVec, &queryTen, ! muu->ntxf[T]->axis[axi]->label); ! } ! if (!muu->noDirLight) { ! query |= 1<<gageSclNormal; } ! /* ! fprintf(stderr, "!%s: gageScl query: \n", me); ! gageQueryPrint(stderr, gageKindScl, query); ! */ E = 0; ! if (!muu->nsin) { ! sprintf(err, "%s: sorry- can't proceed without scalar volume", me); ! biffAdd(MITE, err); return 1; } - if (!E) E |= !(pvl = gagePerVolumeNew(muu->gctx0, muu->nsin, gageKindScl)); - if (!E) E |= gagePerVolumeAttach(muu->gctx0, pvl); if (!E) E |= gageKernelSet(muu->gctx0, gageKernel00, muu->ksp[gageKernel00]->kernel, --- 79,114 ---- } ! GAGE_QUERY_RESET(queryScl); ! GAGE_QUERY_RESET(queryVec); ! GAGE_QUERY_RESET(queryTen); for (T=0; T<muu->ntxfNum; T++) { ! for (axi=1; axi<muu->ntxf[T]->dim; axi++) { ! miteVariableParse(&isp, muu->ntxf[T]->axis[axi].label); ! miteQueryAdd(queryScl, queryVec, queryTen, &isp); ! } } ! miteShadeSpecParse((*mrrP)->shpec, muu->shadeStr); ! miteShadeSpecQueryAdd(queryScl, queryVec, queryTen, (*mrrP)->shpec); E = 0; ! pvlIdx = 0; ! if (muu->nsin) { ! if (!E) E |= !(pvl = gagePerVolumeNew(muu->gctx0, muu->nsin, gageKindScl)); ! if (!E) E |= gageQuerySet(muu->gctx0, pvl, queryScl); ! if (!E) E |= gagePerVolumeAttach(muu->gctx0, pvl); ! if (!E) (*mrrP)->sclPvlIdx = pvlIdx++; ! } ! if (muu->nvin) { ! if (!E) E |= !(pvl = gagePerVolumeNew(muu->gctx0, muu->nvin, gageKindVec)); ! if (!E) E |= gageQuerySet(muu->gctx0, pvl, queryVec); ! if (!E) E |= gagePerVolumeAttach(muu->gctx0, pvl); ! if (!E) (*mrrP)->vecPvlIdx = pvlIdx++; ! } ! if (muu->ntin) { ! if (!E) E |= !(pvl = gagePerVolumeNew(muu->gctx0, muu->ntin, tenGageKind)); ! if (!E) E |= gageQuerySet(muu->gctx0, pvl, queryTen); ! if (!E) E |= gagePerVolumeAttach(muu->gctx0, pvl); ! if (!E) (*mrrP)->tenPvlIdx = pvlIdx++; } if (!E) E |= gageKernelSet(muu->gctx0, gageKernel00, muu->ksp[gageKernel00]->kernel, *************** *** 232,236 **** muu->ksp[gageKernel22]->kernel, muu->ksp[gageKernel22]->parm); - if (!E) E |= gageQuerySet(muu->gctx0, pvl, query); if (!E) E |= gageUpdate(muu->gctx0); if (E) { --- 120,123 ---- *************** *** 241,245 **** me, GAGE_FD(muu->gctx0)); ! if (nrrdMaybeAlloc(muu->nout, mite_nt, 3, 4, muu->hctx->imgSize[0], muu->hctx->imgSize[1])) { sprintf(err, "%s: nrrd trouble", me); --- 128,132 ---- me, GAGE_FD(muu->gctx0)); ! if (nrrdMaybeAlloc(muu->nout, mite_nt, 3, 5 /* RGBAZ */ , muu->hctx->imgSize[0], muu->hctx->imgSize[1])) { sprintf(err, "%s: nrrd trouble", me); *************** *** 255,260 **** for (thr=0; thr<muu->hctx->numThreads; thr++) { ! (*mrrP)->tt[thr] = (miteThread *)calloc(1, sizeof(miteThread)); ! airMopAdd((*mrrP)->rmop, (*mrrP)->tt[thr], airFree, airMopAlways); } --- 142,152 ---- for (thr=0; thr<muu->hctx->numThreads; thr++) { ! (*mrrP)->tt[thr] = miteThreadNew(); ! if (!((*mrrP)->tt[thr])) { ! sprintf(err, "%s: couldn't allocate thread[%d]", me, thr); ! biffAdd(MITE, err); return 1; ! } ! airMopAdd((*mrrP)->rmop, (*mrrP)->tt[thr], ! (airMopper)miteThreadNix, airMopAlways); } Index: thread.c =================================================================== RCS file: /cvsroot/teem/teem/src/mite/thread.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** thread.c 13 Feb 2004 22:58:40 -0000 1.9 --- thread.c 26 Feb 2004 06:26:10 -0000 1.10 *************** *** 21,28 **** #include "privateMite.h" /* ******** miteThreadBegin() ** ! ** this has the body of what would be miteThreadInit */ int --- 21,63 ---- #include "privateMite.h" + miteThread * + miteThreadNew() { + miteThread *mtt; + + mtt = (miteThread *)calloc(1, sizeof(miteThread)); + if (!mtt) { + return NULL; + } + + mtt->gctx = NULL; + mtt->ansScl = mtt->ansVec = mtt->ansTen = NULL; + mtt->shadeVec0 = mtt->shadeVec1 = NULL; + mtt->shadeScl0 = mtt->shadeScl1 = NULL; + mtt->ansMiteVal = + (gage_t *)calloc(gageKindTotalAnswerLength(miteValGageKind), + sizeof(gage_t)); + mtt->verbose = 0; + mtt->thrid = -1; + mtt->ui = mtt->vi = -1; + mtt->samples = 0; + mtt->stage = NULL; + /* mtt->range[], rayStep, V, RR, GG, BB, TT initialized in + miteRayBegin or in miteSample */ + + return mtt; + } + + miteThread * + miteThreadNix(miteThread *mtt) { + + AIR_FREE(mtt->ansMiteVal); + AIR_FREE(mtt); + return NULL; + } + /* ******** miteThreadBegin() ** ! ** this has some of the body of what would be miteThreadInit */ int *************** *** 30,36 **** miteUser *muu, int whichThread) { char me[]="miteThreadBegin", err[AIR_STRLEN_MED]; ! int msi; ! (*mttP) = mrr->tt[whichThread]; if (!whichThread) { /* this is the first thread- it just points to the parent gageContext */ --- 65,72 ---- miteUser *muu, int whichThread) { char me[]="miteThreadBegin", err[AIR_STRLEN_MED]; ! ! /* all the miteThreads have already been allocated */ (*mttP) = mrr->tt[whichThread]; + if (!whichThread) { /* this is the first thread- it just points to the parent gageContext */ *************** *** 44,58 **** } } ! (*mttP)->ansScl = (*mttP)->gctx->pvl[0]->ans; ! (*mttP)->norm = (*mttP)->ans + gageKindScl->ansOffset[gageSclNormal]; (*mttP)->nPerp = (*mttP)->ans + gageKindScl->ansOffset[gageSclNPerp]; (*mttP)->gten = (*mttP)->ans + gageKindScl->ansOffset[gageSclGeomTens]; ! for (msi=0; msi<=MITE_SCL_MAX; msi++) { ! (*mttP)->mscl[msi] = 0.0; ! } (*mttP)->thrid = whichThread; (*mttP)->samples = 0; (*mttP)->verbose = 0; ! _miteStageSet(*mttP, mrr, gageKindScl); return 0; } --- 80,128 ---- } } ! ! (*mttP)->ansScl = (-1 != mrr->sclPvlIdx ! ? (*mttP)->gctx->pvl[mrr->sclPvlIdx]->answer ! : NULL); ! (*mttP)->ansVec = (-1 != mrr->vecPvlIdx ! ? (*mttP)->gctx->pvl[mrr->vecPvlIdx]->answer ! : NULL); ! (*mttP)->ansTen = (-1 != mrr->tenPvlIdx ! ? (*mttP)->gctx->pvl[mrr->tenPvlIdx]->answer ! : NULL); ! ! #if 0 (*mttP)->nPerp = (*mttP)->ans + gageKindScl->ansOffset[gageSclNPerp]; (*mttP)->gten = (*mttP)->ans + gageKindScl->ansOffset[gageSclGeomTens]; ! #endif ! (*mttP)->thrid = whichThread; (*mttP)->samples = 0; (*mttP)->verbose = 0; ! ! /* set up shading answers */ ! switch(mrr->shpec->method) { ! case miteShadeMethodNone: ! /* nothing to do */ ! break; ! case miteShadeMethodPhong: ! (*mttP)->shadeVec0 = _miteAnswerPointer(*mttP, mrr->shpec->vec0); ! break; ! case miteShadeMethodLitTen: ! (*mttP)->shadeVec0 = _miteAnswerPointer(*mttP, mrr->shpec->vec0); ! (*mttP)->shadeVec1 = _miteAnswerPointer(*mttP, mrr->shpec->vec1); ! (*mttP)->shadeScl0 = _miteAnswerPointer(*mttP, mrr->shpec->scl0); ! (*mttP)->shadeScl1 = _miteAnswerPointer(*mttP, mrr->shpec->scl1); ! break; ! default: ! sprintf(err, "%s: shade method %d not implemented!", ! me, mrr->shpec->method); ! biffAdd(MITE, err); return 1; ! break; ! } ! ! if (_miteStageSet(*mttP, mrr)) { ! sprintf(err, "%s: trouble setting up stage array", me); ! biffAdd(MITE, err); return 1; ! } return 0; } Index: txf.c =================================================================== RCS file: /cvsroot/teem/teem/src/mite/txf.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** txf.c 13 Feb 2004 22:58:41 -0000 1.13 --- txf.c 26 Feb 2004 06:26:10 -0000 1.14 *************** *** 29,64 **** miteRangeChar[MITE_RANGE_NUM] = "ARGBEadsp"; - void - miteVariablePrint(char *buff, const gageQuerySpec *qsp) { - char me[]="miteVariablePrint"; - - if (gageKindScl == qsp->kind - || gageKindVec == qsp->kind - || tenGageKind == qsp->kind) { - sprintf(buff, "gage(%s:%s)", qsp->kind->name, - airEnumStr(qsp->kind->enm, qsp->query)); - } else if (miteValGageKind == qsp->kind) { - sprintf(buff, "%s(%s)", qsp->kind->name, - airEnumStr(qsp->kind->enm, qsp->query)); - } else { - sprintf(buff, "(%s: unknown variable!)", me); - } - return; - } - - /* ******** miteVariableParse() ** ** takes a string (usually the label from a nrrd axis) and parses it ! ** to determine the gageQuerySpec from it (which means finding the ! ** kind and query). The valid formats are (currently): ** ! ** <query> : miteValGageKind (DEPRECATED) ! ** gage(<query>) : gageKindScl (DEPRECATED) ! ** gage(scalar:<query>) : gageKindScl (preferred) ! ** gage(vector:<query>) : gageKindVec ! ** gage(tensor:<query>) : tenGageKind ! ** mite(<query>) : miteValGageKind ** ** Notice that "scalar", "vector", and "tensor" to NOT refer to the type --- 29,45 ---- miteRangeChar[MITE_RANGE_NUM] = "ARGBEadsp"; /* ******** miteVariableParse() ** ** takes a string (usually the label from a nrrd axis) and parses it ! ** to determine the gageItemSpec from it (which means finding the ! ** kind and item). The valid formats are: ** ! ** <item> : miteValGageKind (DEPRECATED) ! ** mite(<item>) : miteValGageKind ! ** gage(<item>) : gageKindScl (DEPRECATED) ! ** gage(scalar:<item>) : gageKindScl ! ** gage(vector:<item>) : gageKindVec ! ** gage(tensor:<item>) : tenGageKind ** ** Notice that "scalar", "vector", and "tensor" to NOT refer to the type *************** *** 67,76 **** */ int ! miteVariableParse(gageQuerySpec *qsp, const char *label) { char me[]="miteVariableParse", err[AIR_STRLEN_MED], *buff, *endparen, *kqstr, *col, *kstr, *qstr; airArray *mop; ! if (!( qsp && label )) { sprintf(err, "%s: got NULL pointer", me); biffAdd(MITE, err); return 1; --- 48,57 ---- */ int ! miteVariableParse(gageItemSpec *isp, const char *label) { char me[]="miteVariableParse", err[AIR_STRLEN_MED], *buff, *endparen, *kqstr, *col, *kstr, *qstr; airArray *mop; ! if (!( isp && label )) { sprintf(err, "%s: got NULL pointer", me); biffAdd(MITE, err); return 1; *************** *** 91,98 **** *endparen = 0; kqstr = buff + strlen("gage("); ! /* first see if its a gageKindScl specification */ ! qsp->query = airEnumVal(gageScl, kqstr); ! if (-1 != qsp->query) { ! qsp->kind = gageKindScl; fprintf(stderr, "\n%s: WARNING: deprecated use of txf domain " "\"gage(%s)\" without explicit gage kind specification; " --- 72,79 ---- *endparen = 0; kqstr = buff + strlen("gage("); ! /* first see if its a (deprecated) gageKindScl specification */ ! isp->item = airEnumVal(gageScl, kqstr); ! if (-1 != isp->item) { ! isp->kind = gageKindScl; fprintf(stderr, "\n%s: WARNING: deprecated use of txf domain " "\"gage(%s)\" without explicit gage kind specification; " *************** *** 100,108 **** me, kqstr, gageKindScl->name, kqstr); } else { ! /* should be of form "<kind>:<query>" */ col = strstr(kqstr, ":"); if (!col) { sprintf(err, "%s: didn't see \":\" seperator between gage " ! "kind and query", me); biffAdd(MITE, err); airMopError(mop); return 1; } --- 81,89 ---- me, kqstr, gageKindScl->name, kqstr); } else { ! /* should be of form "<kind>:<item>" */ col = strstr(kqstr, ":"); if (!col) { sprintf(err, "%s: didn't see \":\" seperator between gage " ! "kind and item", me); biffAdd(MITE, err); airMopError(mop); return 1; } *************** *** 111,127 **** qstr = col+1; if (!strcmp(gageKindScl->name, kstr)) { ! qsp->kind = gageKindScl; } else if (!strcmp(gageKindVec->name, kstr)) { ! qsp->kind = gageKindVec; } else if (!strcmp(tenGageKind->name, kstr)) { ! qsp->kind = tenGageKind; } else { sprintf(err, "%s: don't recognized \"%s\" gage kind", me, kstr); biffAdd(MITE, err); airMopError(mop); return 1; } ! qsp->query = airEnumVal(qsp->kind->enm, qstr); ! if (-1 == qsp->query) { sprintf(err, "%s: couldn't parse \"%s\" as a %s varable", ! me, qstr, qsp->kind->name); biffAdd(MITE, err); airMopError(mop); return 1; } --- 92,108 ---- qstr = col+1; if (!strcmp(gageKindScl->name, kstr)) { ! isp->kind = gageKindScl; } else if (!strcmp(gageKindVec->name, kstr)) { ! isp->kind = gageKindVec; } else if (!strcmp(tenGageKind->name, kstr)) { ! isp->kind = tenGageKind; } else { sprintf(err, "%s: don't recognized \"%s\" gage kind", me, kstr); biffAdd(MITE, err); airMopError(mop); return 1; } ! isp->item = airEnumVal(isp->kind->enm, qstr); ! if (-1 == isp->item) { sprintf(err, "%s: couldn't parse \"%s\" as a %s varable", ! me, qstr, isp->kind->name); biffAdd(MITE, err); airMopError(mop); return 1; } *************** *** 134,151 **** } *endparen = 0; ! kqstr = buff + strlen("mite("); ! qsp->query = airEnumVal(miteVal, kqstr); ! if (-1 == qsp->query) { sprintf(err, "%s: couldn't parse \"%s\" as a miteVal variable", ! me, kqstr); biffAdd(MITE, err); airMopError(mop); return 1; } ! qsp->kind = miteValGageKind; } else { /* didn't start with "gage(" or "mite(" */ ! qsp->query = airEnumVal(miteVal, label); ! if (-1 != qsp->query) { /* its measured by mite */ ! qsp->kind = miteValGageKind; fprintf(stderr, "\n%s: WARNING: deprecated use of txf domain " "\"%s\"; should use \"mite(%s)\" instead\n\n", --- 115,132 ---- } *endparen = 0; ! qstr = buff + strlen("mite("); ! isp->item = airEnumVal(miteVal, qstr); ! if (-1 == isp->item) { sprintf(err, "%s: couldn't parse \"%s\" as a miteVal variable", ! me, qstr); biffAdd(MITE, err); airMopError(mop); return 1; } ! isp->kind = miteValGageKind; } else { /* didn't start with "gage(" or "mite(" */ ! isp->item = airEnumVal(miteVal, label); ! if (-1 != isp->item) { /* its measured by mite */ ! isp->kind = miteValGageKind; fprintf(stderr, "\n%s: WARNING: deprecated use of txf domain " "\"%s\"; should use \"mite(%s)\" instead\n\n", *************** *** 160,167 **** } int miteNtxfCheck(const Nrrd *ntxf) { ! char me[]="miteNtxfCheck", err[AIR_STRLEN_MED], *range, *domS; ! gageQuerySpec qsp; int rii, axi; --- 141,166 ---- } + void + miteVariablePrint(char *buff, const gageItemSpec *isp) { + char me[]="miteVariablePrint"; + + if (gageKindScl == isp->kind + || gageKindVec == isp->kind + || tenGageKind == isp->kind) { + sprintf(buff, "gage(%s:%s)", isp->kind->name, + airEnumStr(isp->kind->enm, isp->item)); + } else if (miteValGageKind == isp->kind) { + sprintf(buff, "%s(%s)", isp->kind->name, + airEnumStr(isp->kind->enm, isp->item)); + } else { + sprintf(buff, "(%s: unknown gageKind!)", me); + } + return; + } + int miteNtxfCheck(const Nrrd *ntxf) { ! char me[]="miteNtxfCheck", err[AIR_STRLEN_MED], *rangeStr, *domStr; ! gageItemSpec isp; int rii, axi; *************** *** 185,203 **** biffAdd(MITE, err); return 1; } ! range = ntxf->axis[0].label; ! if (0 == airStrlen(range)) { sprintf(err, "%s: axis[0]'s label doesn't specify txf range", me); biffAdd(MITE, err); return 1; } ! if (airStrlen(range) != ntxf->axis[0].size) { sprintf(err, "%s: axis[0]'s size is %d, but label specifies %d values", ! me, ntxf->axis[0].size, (int)airStrlen(range)); biffAdd(MITE, err); return 1; } ! for (rii=0; rii<airStrlen(range); rii++) { ! if (!strchr(miteRangeChar, range[rii])) { sprintf(err, "%s: char %d of axis[0]'s label (\"%c\") isn't a valid " "transfer function range specifier (not in \"%s\")", ! me, rii, range[rii], miteRangeChar); biffAdd(MITE, err); return 1; } --- 184,202 ---- biffAdd(MITE, err); return 1; } ! rangeStr = ntxf->axis[0].label; ! if (0 == airStrlen(rangeStr)) { sprintf(err, "%s: axis[0]'s label doesn't specify txf range", me); biffAdd(MITE, err); return 1; } ! if (airStrlen(rangeStr) != ntxf->axis[0].size) { sprintf(err, "%s: axis[0]'s size is %d, but label specifies %d values", ! me, ntxf->axis[0].size, (int)airStrlen(rangeStr)); biffAdd(MITE, err); return 1; } ! for (rii=0; rii<airStrlen(rangeStr); rii++) { ! if (!strchr(miteRangeChar, rangeStr[rii])) { sprintf(err, "%s: char %d of axis[0]'s label (\"%c\") isn't a valid " "transfer function range specifier (not in \"%s\")", ! me, rii, rangeStr[rii], miteRangeChar); biffAdd(MITE, err); return 1; } *************** *** 218,239 **** biffAdd(MITE, err); return 1; } ! domS = ntxf->axis[axi].label; ! if (0 == airStrlen(domS)) { sprintf(err, "%s: axis[%d] of txf didn't specify a domain variable", me, axi); biffAdd(MITE, err); return 1; } ! if (miteVariableParse(&qsp, domS)) { sprintf(err, "%s: couldn't parse txf domain \"%s\" for axis %d\n", ! me, domS, axi); biffAdd(MITE, err); return 1; } ! if (!( 1 == qsp.kind->ansLength[qsp.query] || ! 3 == qsp.kind->ansLength[qsp.query] )) { sprintf(err, "%s: %s not a scalar or vector: can't be a txf " ! "domain variable", me, domS); biffAdd(MITE, err); return 1; } ! if (3 == qsp.kind->ansLength[qsp.query]) { /* has to be right length for one of the quantization schemes */ if (!( limnQNBins[limnQN16checker] == ntxf->axis[axi].size || --- 217,238 ---- biffAdd(MITE, err); return 1; } ! domStr = ntxf->axis[axi].label; ! if (0 == airStrlen(domStr)) { sprintf(err, "%s: axis[%d] of txf didn't specify a domain variable", me, axi); biffAdd(MITE, err); return 1; } ! if (miteVariableParse(&isp, domStr)) { sprintf(err, "%s: couldn't parse txf domain \"%s\" for axis %d\n", ! me, domStr, axi); biffAdd(MITE, err); return 1; } ! if (!( 1 == isp.kind->table[isp.item].answerLength || ! 3 == isp.kind->table[isp.item].answerLength )) { sprintf(err, "%s: %s not a scalar or vector: can't be a txf " ! "domain variable", me, domStr); biffAdd(MITE, err); return 1; } ! if (3 == isp.kind->table[isp.item].answerLength) { /* has to be right length for one of the quantization schemes */ if (!( limnQNBins[limnQN16checker] == ntxf->axis[axi].size || *************** *** 241,245 **** limnQNBins[limnQN12checker] == ntxf->axis[axi].size )) { sprintf(err, "%s: vector %s can be quantized into %d, %d, or %d bins " ! "but not %d", me, domS, limnQNBins[limnQN16checker], limnQNBins[limnQN14checker], limnQNBins[limnQN12checker], ntxf->axis[axi].size); --- 240,244 ---- limnQNBins[limnQN12checker] == ntxf->axis[axi].size )) { sprintf(err, "%s: vector %s can be quantized into %d, %d, or %d bins " ! "but not %d", me, domStr, limnQNBins[limnQN16checker], limnQNBins[limnQN14checker], limnQNBins[limnQN12checker], ntxf->axis[axi].size); *************** *** 253,264 **** /* ! ** _miteQuery() ** ! ** This looks a given gageQuerySpec and sets the bits in the ** gageKindScl and tenGageKind queries that are required to calculate ** the quantity ** ! ** NOTE: This does NOT initialize the *query{Scl,Vec,Ten}: it ! ** just bit-wise or's on new stuff ** ** HEY: this is really unfortunate: each new gage type use for --- 252,263 ---- /* ! ******** miteQueryAdd() ** ! ** This looks a given gageItemSpec and sets the bits in the ** gageKindScl and tenGageKind queries that are required to calculate ** the quantity ** ! ** NOTE: This does NOT initialize the query{Scl,Vec,Ten}: it ! ** just adds on new items to the existing queries ** ** HEY: this is really unfortunate: each new gage type use for *************** *** 266,306 **** ** arguments here, which is part of the reason that mite may end ** up explicitly depending on the libraries supplying those gageKinds ! ** (like how new mite depends on ten) */ void ! _miteQuery(unsigned int *queryScl, ! unsigned int *queryVec, ! unsigned int *queryTen, gageQuerySpec *qsp) { ! char me[]="_miteQuery"; ! /* ! for (i=1; i<ntxf->dim; i++) { ! miteVariableParse(qsp, ntxf->axis[i].label); ! */ ! if (gageKindScl == qsp->kind) { ! *queryScl |= 1 << qsp->query; ! } else if (gageKindVec == qsp->kind) { ! *queryVec |= 1 << qsp->query; ! } else if (tenGageKind == qsp->kind) { ! *queryTen |= 1 << qsp->query; ! } else if (miteValGageKind == qsp->kind) { ! /* HEY: the first of these two have useful analogs for tensor ! data, but I won't be able to express them ... */ ! switch(qsp->query) { case miteValNdotV: ! *queryScl |= 1 << gageSclNormal; break; case miteValNdotL: ! *queryScl |= 1 << gageSclNormal; break; case miteValGTdotV: ! *queryScl |= 1 << gageSclGeomTens; break; case miteValVrefN: ! *queryScl |= 1 << gageSclNormal; break; case miteValVdefT: case miteValVdefTdotV: ! *queryTen |= 1 << tenGageTensor; break; } --- 265,305 ---- ** arguments here, which is part of the reason that mite may end ** up explicitly depending on the libraries supplying those gageKinds ! ** (like how mite now must depend on ten) */ void ! miteQueryAdd(gageQuery queryScl, ! gageQuery queryVec, ! gageQuery queryTen, gageItemSpec *isp) { ! char me[]="miteQueryAdd"; ! if (gageKindScl == isp->kind) { ! GAGE_QUERY_ITEM_ON(queryScl, isp->item); ! } else if (gageKindVec == isp->kind) { ! GAGE_QUERY_ITEM_ON(queryVec, isp->item); ! } else if (tenGageKind == isp->kind) { ! GAGE_QUERY_ITEM_ON(queryTen, isp->item); ! } else if (miteValGageKind == isp->kind) { ! /* HEY: some these have useful analogs for tensor data, but I ! won't be able to express them. This means that while Phong ! shading of *scalar* volumes can be implemented with transfer ! functions, it is currently not possible in *tensor* volumes ! (for instance, using the gradient of fractional anisotropy) */ ! switch(isp->item) { case miteValNdotV: ! GAGE_QUERY_ITEM_ON(queryScl, gageSclNormal); break; case miteValNdotL: ! GAGE_QUERY_ITEM_ON(queryScl, gageSclNormal); break; case miteValGTdotV: ! GAGE_QUERY_ITEM_ON(queryScl, gageSclGeomTens); break; case miteValVrefN: ! GAGE_QUERY_ITEM_ON(queryScl, gageSclNormal); break; case miteValVdefT: + GAGE_QUERY_ITEM_ON(queryTen, tenGageTensor); case miteValVdefTdotV: ! GAGE_QUERY_ITEM_ON(queryTen, tenGageTensor); break; } *************** *** 418,421 **** --- 417,446 ---- } + gage_t * + _miteAnswerPointer(miteThread *mtt, gageItemSpec *isp) { + char me[]="_miteAnswerPointer"; + gage_t *ret; + + if (gageKindScl == isp->kind) { + ret = mtt->ansScl; + } else if (gageKindVec == isp->kind) { + ret = mtt->ansVec; + } else if (tenGageKind == isp->kind) { + ret = mtt->ansTen; + } else if (miteValGageKind == isp->kind) { + ret = mtt->ansMiteVal; + } else { + fprintf(stderr, "\nPANIC: %s: unknown gageKind!\n", me); + exit(1); + } + ret += gageKindAnswerOffset(isp->kind, isp->item); + return ret; + } + + /* + ** _miteStageSet + ** + ** ALLOCATES and initializes stage array in a miteThread + */ int _miteStageSet(miteThread *mtt, miteRender *mrr) { *************** *** 424,428 **** Nrrd *ntxf; miteStage *stage; ! gageQuerySpec qsp; char rc; --- 449,453 ---- Nrrd *ntxf; miteStage *stage; ! gageItemSpec isp; char rc; *************** *** 442,460 **** stage = mtt->stage + stageIdx; _miteStageInit(stage); ! miteVariableParse(&qsp, ntxf->axis[di].label); ! if (gageKindScl == qsp.kind) { ! stage->val = mtt->ansScl; ! } else if (gageKindVec == qsp.kind) { ! stage->val = mtt->ansVec; ! } else if (tenGageKind == qsp.kind) { ! stage->val = mtt->ansTen; ! } else if (miteValGageKind == qsp.kind) { ! stage->val = mtt->ansMiteVal; ! } else { ! sprintf(err, "%s: don't handle gageKind for \"%s\"", ! me, ntxf->axis[di].label); ! biffAdd(MITE, err); return 1; ! } ! stage->val += qsp.kind->ansOffset[qsp.query]; /* fprintf(stderr, "!%s: ans=%p + offset[%d]=%d == %p\n", me, --- 467,472 ---- stage = mtt->stage + stageIdx; _miteStageInit(stage); ! miteVariableParse(&isp, ntxf->axis[di].label); ! stage->val = _miteAnswerPointer(mtt, &isp); /* fprintf(stderr, "!%s: ans=%p + offset[%d]=%d == %p\n", me, *************** *** 469,475 **** stage->data = ntxf->data; stage->op = miteStageOpMultiply; ! if (1 == qsp.kind->ansLength[qsp.query]) { stage->qn = NULL; ! } else if (3 == 1 == qsp.kind->ansLength[qsp.query]) { if (limnQNBins[limnQN16checker] == ntxf->axis[di].size) { stage->qn = limnVtoQN_GT[limnQN16checker]; --- 481,487 ---- stage->data = ntxf->data; stage->op = miteStageOpMultiply; ! if (1 == isp.kind->table[isp.item].answerLength) { stage->qn = NULL; ! } else if (3 == isp.kind->table[isp.item].answerLength) { if (limnQNBins[limnQN16checker] == ntxf->axis[di].size) { stage->qn = limnVtoQN_GT[limnQN16checker]; *************** *** 487,491 **** sprintf(err, "%s: %s not scalar or vector (len = %d): can't be " "a txf domain variable", me, ! ntxf->axis[di].label, qsp.kind->ansLength[qsp.query]); biffAdd(MITE, err); return 1; } --- 499,504 ---- sprintf(err, "%s: %s not scalar or vector (len = %d): can't be " "a txf domain variable", me, ! ntxf->axis[di].label, ! isp.kind->table[isp.item].answerLength); biffAdd(MITE, err); return 1; } *************** *** 528,532 **** for (rii=0; rii<stage->rangeNum; rii++) { ri = stage->rangeIdx[rii]; ! mtt->range[ri] *= rangeData[rii]; } finalIdx = 0; --- 541,559 ---- for (rii=0; rii<stage->rangeNum; rii++) { ri = stage->rangeIdx[rii]; ! switch(stage->op) { ! case miteStageOpMin: ! mtt->range[ri] = AIR_MIN(mtt->range[ri], rangeData[rii]); ! break; ! case miteStageOpMax: ! mtt->range[ri] = AIR_MAX(mtt->range[ri], rangeData[rii]); ! break; ! case miteStageOpAdd: ! mtt->range[ri] += rangeData[rii]; ! break; ! case miteStageOpMultiply: ! default: ! mtt->range[ri] *= rangeData[rii]; ! break; ! } } finalIdx = 0; Index: user.c =================================================================== RCS file: /cvsroot/teem/teem/src/mite/user.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** user.c 13 Feb 2004 22:58:41 -0000 1.14 --- user.c 26 Feb 2004 06:26:10 -0000 1.15 *************** *** 44,48 **** muu->refStep = miteDefRefStep; muu->rayStep = AIR_NAN; ! muu->near1 = miteDefNear1; muu->hctx = hooverContextNew(); airMopAdd(muu->umop, muu->hctx, (airMopper)hooverContextNix, airMopAlways); --- 44,49 ---- muu->refStep = miteDefRefStep; muu->rayStep = AIR_NAN; ! muu->opacMatters = miteDefOpacMatters; ! muu->opacNear1 = miteDefOpacNear1; muu->hctx = hooverContextNew(); airMopAdd(muu->umop, muu->hctx, (airMopper)hooverContextNix, airMopAlways); *************** *** 75,79 **** _miteUserCheck(miteUser *muu) { char me[]="miteUserCheck", err[AIR_STRLEN_MED]; ! int T, gotOpac; if (!muu) { --- 76,84 ---- _miteUserCheck(miteUser *muu) { char me[]="miteUserCheck", err[AIR_STRLEN_MED]; ! int T, axi, gotOpac; ! gageItemSpec isp; ! gageQuery queryScl, queryVec, queryTen; ! miteShadeSpec *shpec; ! airArray *mop; if (!muu) { *************** *** 81,94 **** biffAdd(MITE, err); return 1; } if (!( muu->ntxfNum >= 1 )) { sprintf(err, "%s: need at least one transfer function", me); ! biffAdd(MITE, err); return 1; } gotOpac = AIR_FALSE; for (T=0; T<muu->ntxfNum; T++) { if (miteNtxfCheck(muu->ntxf[T])) { sprintf(err, "%s: ntxf[%d] (%d of %d) can't be used as a txf", me, T, T+1, muu->ntxfNum); ! biffAdd(MITE, err); return 1; } gotOpac |= !!strchr(muu->ntxf[T]->axis[0].label, 'A'); --- 86,108 ---- biffAdd(MITE, err); return 1; } + mop = airMopNew(); if (!( muu->ntxfNum >= 1 )) { sprintf(err, "%s: need at least one transfer function", me); ! biffAdd(MITE, err); airMopError(mop); return 1; } gotOpac = AIR_FALSE; + GAGE_QUERY_RESET(queryScl); + GAGE_QUERY_RESET(queryVec); + GAGE_QUERY_RESET(queryTen); for (T=0; T<muu->ntxfNum; T++) { if (miteNtxfCheck(muu->ntxf[T])) { sprintf(err, "%s: ntxf[%d] (%d of %d) can't be used as a txf", me, T, T+1, muu->ntxfNum); ! biffAdd(MITE, err); airMopError(mop); return 1; ! } ! /* NOTE: no error checking because miteNtxfCheck succeeded */ ! for (axi=1; axi<muu->ntxf[T]->dim; axi++) { ! miteVariableParse(&isp, muu->ntxf[T]->axis[axi].label); ! miteQueryAdd(queryScl, queryVec, queryTen, &isp); } gotOpac |= !!strchr(muu->ntxf[T]->axis[0].label, 'A'); *************** *** 102,125 **** "************************\n\n\n", me); } if (!muu->nout) { sprintf(err, "%s: rendered image nrrd is NULL", me); ! biffAdd(MITE, err); return 1; ! } ! if (!(muu->nsin || muu->ntin)) { ! sprintf(err, "%s: got neither scalar nor tensor volume", me); ! biffAdd(MITE, err); return 1; } if (muu->nsin) { if (gageVolumeCheck(muu->gctx0, muu->nsin, gageKindScl)) { ! sprintf(err, "%s: trouble with input scalar volume", me); ! biffMove(MITE, err, GAGE); return 1; } ! } else { if (gageVolumeCheck(muu->gctx0, muu->ntin, tenGageKind)) { ! sprintf(err, "%s: trouble with input tensor volume", me); ! biffMove(MITE, err, GAGE); return 1; } } ! return 0; } --- 116,168 ---- "************************\n\n\n", me); } + shpec = miteShadeSpecNew(); + airMopAdd(mop, shpec, (airMopper)miteShadeSpecNix, airMopAlways); + if (miteShadeSpecParse(shpec, muu->shadeStr)) { + sprintf(err, "%s: couldn't parse shading spec \"%s\"", + me, muu->shadeStr); + biffAdd(MITE, err); airMopError(mop); return 1; + } + miteShadeSpecQueryAdd(queryScl, queryVec, queryTen, shpec); + if (GAGE_QUERY_NONZERO(queryScl) && !(muu->nsin)) { + sprintf(err, "%s: txf or shading require %s volume, but don't have one", + me, gageKindScl->name); + biffAdd(MITE, err); airMopError(mop); return 1; + } + if (GAGE_QUERY_NONZERO(queryVec) && !(muu->nvin)) { + sprintf(err, "%s: txf or shading require %s volume, but don't have one", + me, gageKindVec->name); + biffAdd(MITE, err); airMopError(mop); return 1; + } + if (GAGE_QUERY_NONZERO(queryTen) && !(muu->ntin)) { + sprintf(err, "%s: txf or shading require %s volume, but don't have one", + me, tenGageKind->name); + biffAdd(MITE, err); airMopError(mop); return 1; + } if (!muu->nout) { sprintf(err, "%s: rendered image nrrd is NULL", me); ! biffAdd(MITE, err); airMopError(mop); return 1; } if (muu->nsin) { if (gageVolumeCheck(muu->gctx0, muu->nsin, gageKindScl)) { ! sprintf(err, "%s: trouble with input %s volume", ! me, gageKindScl->name); ! biffMove(MITE, err, GAGE); airMopError(mop); return 1; } ! } ! if (muu->nvin) { ! if (gageVolumeCheck(muu->gctx0, muu->nvin, gageKindVec)) { ! sprintf(err, "%s: trouble with input %s volume", ! me, gageKindVec->name); ! biffMove(MITE, err, GAGE); airMopError(mop); return 1; ! } ! } ! if (muu->ntin) { if (gageVolumeCheck(muu->gctx0, muu->ntin, tenGageKind)) { ! sprintf(err, "%s: trouble with input %s volume", ! me, tenGageK... [truncated message content] |