Esempio n. 1
0
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));
}
Esempio n. 2
0
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();
        }
    }
}
Esempio n. 3
0
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));
}
Esempio n. 4
0
DBL IsoSurface::Vector_Function(GenericFunctionContextPtr ctx, const Vector3d& VPos) const
{
    return Evaluate_Function(Function, ctx, VPos) - threshold;
}
Esempio n. 5
0
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);
	}
}
Esempio n. 6
0
inline DBL Vector_IsoSurface_Function(ISOSURFACE* ISOSRF, VECTOR VPos)
{
	return Evaluate_Function(*(ISOSRF->Function), VPos) - ISOSRF->threshold;
}