nuclear@0: #include "plane.h" nuclear@0: nuclear@0: Plane::Plane() nuclear@0: : normal(0.0, 1.0, 0.0) nuclear@0: { nuclear@0: dist = 0.0; nuclear@0: } nuclear@0: nuclear@0: Plane::Plane(const Vector3 &norm, float dist) nuclear@0: : normal(norm) nuclear@0: { nuclear@0: normal.normalize(); nuclear@0: this->dist = dist; nuclear@0: } nuclear@0: nuclear@0: bool Plane::intersect(const Ray &inray, HitPoint *pt) const nuclear@0: { nuclear@0: Ray ray = inray.transformed(inv_xform); nuclear@0: nuclear@0: float ndotdir = dot_product(normal, ray.dir); nuclear@0: if(fabs(ndotdir) < 1e-5) { nuclear@0: return false; // ray parallel to the plane nuclear@0: } nuclear@0: nuclear@0: Vector3 planept = normal * dist; nuclear@0: Vector3 pptdir = planept - ray.origin; nuclear@0: nuclear@0: float t = dot_product(normal, pptdir) / ndotdir; nuclear@0: if(t < 1e-4) { nuclear@0: return false; // discard intersections behind the origin nuclear@0: } nuclear@0: nuclear@0: // fill the HitPoint structure nuclear@0: pt->obj = this; nuclear@0: pt->dist = t; nuclear@0: nuclear@0: pt->pos = ray.origin + ray.dir * t; nuclear@0: nuclear@0: pt->texcoord.x = pt->pos.x; nuclear@0: pt->texcoord.y = pt->pos.z; nuclear@0: nuclear@0: pt->pos.transform(xform); nuclear@0: pt->normal = normal.transformed(dir_xform);//.normalized(); nuclear@0: return true; nuclear@0: }