All pastes #462028 Raw Edit

Unnamed

public text v1 · immutable
#462028 ·published 2007-04-28 00:21 UTC
rendered paste body
void makePlane(Object *obj, Vector *norm, Scalar d) {
        assert(obj != NULL);

        Plane *p = malloc(sizeof(Plane));
        p->norm = *norm;
        p->d = d;

        obj->priv = p;
        obj->type = PLANE;
        obj->hits = hitsPlane;
        obj->normalAt = normalAtPlane;
}

// Determine if the ray hits the plane
// If no intersection, NO_HIT is returned
// We are assuming one sided planes
Scalar hitsPlane(Object *obj, Ray *r)
{
        assert(obj != NULL);
        assert(r != NULL);
        assert(obj->type == PLANE);

        Plane *plane = (Plane *) obj->priv;
        Scalar v1= v3Dot(&r->dir, &plane->norm);
        // First, check for parallel rays, then check for hiting the wrong side
        if (fabs(v1) < THRESHOLD) {
                return NO_HIT;
        }

        Scalar v2 = -(v3Dot(&plane->norm, &r->p) + plane->d);
        return v2/v1;
}

// Return the Plane's normal
Vector normalAtPlane(Object *obj, Vector *hit)
{
        assert(obj != NULL);
        assert(obj->type == PLANE);
        Plane *plane = (Plane *) obj->priv;
        return plane->norm;
}