/* ** exact same precautions about utility of this as with gageContextCopy!!! ** So: only after tenFiberUpdate, and don't touch anything, and don't ** call anything except tenFiberTrace and tenFiberContextNix */ tenFiberContext * tenFiberContextCopy(tenFiberContext *oldTfx) { char me[]="tenFiberContextCopy"; tenFiberContext *tfx; if (oldTfx->useDwi) { fprintf(stderr, "!%s: sorry, can't copy DWI contexts; bye.\n", me); exit(1); } tfx = (tenFiberContext *)calloc(1, sizeof(tenFiberContext)); memcpy(tfx, oldTfx, sizeof(tenFiberContext)); tfx->ksp = nrrdKernelSpecCopy(oldTfx->ksp); tfx->gtx = gageContextCopy(oldTfx->gtx); tfx->pvl = tfx->gtx->pvl[0]; /* HEY! gage API sucks */ tfx->gageTen = gageAnswerPointer(tfx->gtx, tfx->pvl, tenGageTensor); tfx->gageEval = gageAnswerPointer(tfx->gtx, tfx->pvl, tenGageEval0); /* HEY: COPY AND PASTE */ tfx->gageEvec = gageAnswerPointer(tfx->gtx, tfx->pvl, (tenFiberTypeEvec0 == tfx->fiberType ? tenGageEvec0 : (tenFiberTypeEvec1 == tfx->fiberType ? tenGageEvec1 : tenGageEvec2))); tfx->gageAnisoStop = gageAnswerPointer(tfx->gtx, tfx->pvl, tfx->anisoStopType); tfx->gageAnisoSpeed = (tfx->anisoSpeedType ? gageAnswerPointer(tfx->gtx, tfx->pvl, tfx->anisoSpeedType) : NULL); return tfx; }
/* ******** miteThreadBegin() ** ** this has some of the body of what would be miteThreadInit */ int miteThreadBegin(miteThread **mttP, miteRender *mrr, miteUser *muu, int whichThread) { char me[]="miteThreadBegin", err[BIFF_STRLEN]; /* 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 */ (*mttP)->gctx = muu->gctx0; } else { /* we have to generate a new gageContext */ (*mttP)->gctx = gageContextCopy(muu->gctx0); if (!(*mttP)->gctx) { sprintf(err, "%s: couldn't set up thread %d", me, whichThread); biffMove(MITE, err, GAGE); return 1; } } if (-1 != mrr->sclPvlIdx) { (*mttP)->ansScl = (*mttP)->gctx->pvl[mrr->sclPvlIdx]->answer; (*mttP)->nPerp = ((*mttP)->ansScl + gageKindAnswerOffset(gageKindScl, gageSclNPerp)); (*mttP)->geomTens = ((*mttP)->ansScl + gageKindAnswerOffset(gageKindScl, gageSclGeomTens)); } else { (*mttP)->ansScl = NULL; (*mttP)->nPerp = NULL; (*mttP)->geomTens = 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); (*mttP)->thrid = whichThread; (*mttP)->raySample = 0; (*mttP)->samples = 0; (*mttP)->verbose = 0; (*mttP)->skip = 0; (*mttP)->_normal = _miteAnswerPointer(*mttP, mrr->normalSpec); /* set up shading answers */ switch(mrr->shadeSpec->method) { case miteShadeMethodNone: /* nothing to do */ break; case miteShadeMethodPhong: (*mttP)->shadeVec0 = _miteAnswerPointer(*mttP, mrr->shadeSpec->vec0); break; case miteShadeMethodLitTen: (*mttP)->shadeVec0 = _miteAnswerPointer(*mttP, mrr->shadeSpec->vec0); (*mttP)->shadeVec1 = _miteAnswerPointer(*mttP, mrr->shadeSpec->vec1); (*mttP)->shadeScl0 = _miteAnswerPointer(*mttP, mrr->shadeSpec->scl0); (*mttP)->shadeScl1 = _miteAnswerPointer(*mttP, mrr->shadeSpec->scl1); break; default: sprintf(err, "%s: shade method %d not implemented!", me, mrr->shadeSpec->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; }