nuclear@4: #include nuclear@4: #include "geomobj.h" nuclear@4: nuclear@4: static LambertRefl lambert; nuclear@4: nuclear@4: GeomObject::GeomObject() nuclear@4: { nuclear@4: brdf = &lambert; nuclear@4: } nuclear@4: nuclear@4: ObjType GeomObject::get_type() const nuclear@4: { nuclear@4: return ObjType::geom; nuclear@4: } nuclear@4: nuclear@4: bool GeomObject::intersect(const Ray &ray, RayHit *hit) const nuclear@4: { nuclear@4: return false; nuclear@4: } nuclear@4: nuclear@4: // --- class Sphere --- nuclear@4: nuclear@4: bool Sphere::intersect(const Ray &ray, RayHit *hit) const nuclear@4: { nuclear@4: // assumes center is the origin and radius is 1 nuclear@4: float a = dot_product(ray.dir, ray.dir); nuclear@4: float b = 2.0 * dot_product(ray.dir, ray.origin); nuclear@4: float c = dot_product(ray.origin, ray.origin) - 1.0; nuclear@4: nuclear@4: float d = b * b - 4.0 * a * c; nuclear@4: if(d < 1e-4) return false; nuclear@4: nuclear@4: float sqrt_d = sqrt(d); nuclear@4: float t0 = (-b + sqrt_d) / (2.0 * a); nuclear@4: float t1 = (-b - sqrt_d) / (2.0 * a); nuclear@4: nuclear@4: if(t0 < 1e-4) t0 = t1; nuclear@4: if(t1 < 1e-4) t1 = t0; nuclear@4: float t = t0 < t1 ? t0 : t1; nuclear@4: if(t < 1e-4) return false; nuclear@4: nuclear@4: if(hit) { nuclear@4: hit->dist = t; nuclear@4: hit->obj = this; nuclear@4: hit->subobj = 0; nuclear@4: } nuclear@4: return true; nuclear@4: } nuclear@4: nuclear@4: // --- class Box --- nuclear@4: nuclear@4: bool Box::intersect(const Ray &ray, RayHit *hit) const nuclear@4: { nuclear@4: return false; nuclear@4: } nuclear@4: nuclear@4: // --- class Triangle --- nuclear@4: nuclear@4: bool Triangle::intersect(const Ray &ray, RayHit *hit) const nuclear@4: { nuclear@4: return false; nuclear@4: } nuclear@4: nuclear@4: // --- class Mesh --- nuclear@4: nuclear@4: bool Mesh::intersect(const Ray &ray, RayHit *hit) const nuclear@4: { nuclear@4: RayHit nearest; nuclear@4: nearest.dist = FLT_MAX; nuclear@4: nuclear@4: for(size_t i=0; idist < nearest.dist) { nuclear@4: nearest = *hit; nuclear@4: } nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: if(nearest.dist < FLT_MAX) { nuclear@4: *hit = nearest; nuclear@4: hit->subobj = hit->obj; nuclear@4: hit->obj = this; nuclear@4: return true; nuclear@4: } nuclear@4: return false; nuclear@4: }