DBL IsoSurface::Float_Function(ISO_ThreadData& itd, DBL t) const { Vector3d VTmp; VTmp = itd.Pglobal + t * itd.Dglobal; return ((DBL)itd.Inv3 * (Evaluate_Function(Function, itd.ctx, VTmp) - threshold)); }
void IsoSurface::Normal(Vector3d& Result, Intersection *Inter, TraceThreadData *Thread) const { Vector3d New_Point, TPoint; DBL funct; bool containerHit = Inter->i1; if (containerHit) { container->Normal(Inter->IPoint, Trans, Inter->i2, Result); } else { /* Transform the point into the isosurface space */ if(Trans != NULL) MInvTransPoint(New_Point, Inter->IPoint, Trans); else New_Point = Inter->IPoint; TPoint = New_Point; funct = Evaluate_Function(Function, Thread->functionContext, TPoint); TPoint = New_Point; TPoint[X] += accuracy; Result[X] = Evaluate_Function(Function, Thread->functionContext, TPoint) - funct; TPoint = New_Point; TPoint[Y] += accuracy; Result[Y] = Evaluate_Function(Function, Thread->functionContext, TPoint) - funct; TPoint = New_Point; TPoint[Z] += accuracy; Result[Z] = Evaluate_Function(Function, Thread->functionContext, TPoint) - funct; if((Result[X] == 0) && (Result[Y] == 0) && (Result[Z] == 0)) Result[X] = 1.0; Result.normalize(); /* Transform the point into the boxes space. */ if(Trans != NULL) { MTransNormal(Result, Result, Trans); Result.normalize(); } } }
inline DBL Float_IsoSurface_Function(ISOSURFACE* ISOSRF, DBL* t) { VECTOR VTmp; VEvaluateRay(VTmp, ISOSRF->P, *t, ISOSRF->D); return ((DBL)(ISOSRF->Inv3) * (Evaluate_Function(*(ISOSRF->Function), VTmp) - ISOSRF->threshold)); }
DBL IsoSurface::Vector_Function(GenericFunctionContextPtr ctx, const Vector3d& VPos) const { return Evaluate_Function(Function, ctx, VPos) - threshold; }
static void IsoSurface_Normal(VECTOR Result, OBJECT* Object, INTERSECTION* Inter) { VECTOR New_Point, TPoint; ISOSURFACE *Isosrf = (ISOSURFACE *)Object; FUNCTION Function = *(((ISOSURFACE *)Object)->Function); DBL funct; switch (Inter->i1) { case SIDE_X_0: Make_Vector(Result, -1.0, 0.0, 0.0); break; case SIDE_X_1: Make_Vector(Result, 1.0, 0.0, 0.0); break; case SIDE_Y_0: Make_Vector(Result, 0.0, -1.0, 0.0); break; case SIDE_Y_1: Make_Vector(Result, 0.0, 1.0, 0.0); break; case SIDE_Z_0: Make_Vector(Result, 0.0, 0.0, -1.0); break; case SIDE_Z_1: Make_Vector(Result, 0.0, 0.0, 1.0); break; default: /* Transform the point into the isosurface space */ if(((ISOSURFACE *)Object)->Trans != NULL) MInvTransPoint(New_Point, Inter->IPoint, Isosrf->Trans); else Assign_Vector(New_Point, Inter->IPoint); if(Isosrf->container_shape) { VSub(Result, New_Point, Isosrf->container.sphere.center); VLength(funct, Result); if(fabs(funct - Isosrf->container.sphere.radius) < EPSILON) { VInverseScaleEq(Result, Isosrf->container.sphere.radius); break; } } Assign_Vector(TPoint, New_Point); funct = Evaluate_Function(Function, TPoint); Assign_Vector(TPoint, New_Point); TPoint[X] += Isosrf->accuracy; Result[X] = Evaluate_Function(Function, TPoint) - funct; Assign_Vector(TPoint, New_Point); TPoint[Y] += Isosrf->accuracy; Result[Y] = Evaluate_Function(Function, TPoint) - funct; Assign_Vector(TPoint, New_Point); TPoint[Z] += Isosrf->accuracy; Result[Z] = Evaluate_Function(Function, TPoint) - funct; if((Result[X] == 0) && (Result[Y] == 0) && (Result[Z] == 0)) Result[X] = 1.0; VNormalize(Result, Result); } /* Transform the point into the boxes space. */ if(((ISOSURFACE *)Object)->Trans != NULL) { MTransNormal(Result, Result, ((ISOSURFACE *)Object)->Trans); VNormalize(Result, Result); } }
inline DBL Vector_IsoSurface_Function(ISOSURFACE* ISOSRF, VECTOR VPos) { return Evaluate_Function(*(ISOSRF->Function), VPos) - ISOSRF->threshold; }