nuclear@4: #include nuclear@4: #include "bvol.h" nuclear@4: nuclear@4: BSphere::BSphere() nuclear@4: { nuclear@4: radius = 1.0f; nuclear@4: } nuclear@4: nuclear@4: BSphere::BSphere(const Vector3 &c, float rad) nuclear@4: : center(c) nuclear@4: { nuclear@4: radius = rad; nuclear@4: } nuclear@4: nuclear@4: void BSphere::set_center(const Vector3 ¢er) nuclear@4: { nuclear@4: this->center = center; nuclear@4: } nuclear@4: nuclear@4: const Vector3 &BSphere::get_center() const nuclear@4: { nuclear@4: return center; nuclear@4: } nuclear@4: nuclear@4: void BSphere::set_radius(float rad) nuclear@4: { nuclear@4: radius = rad; nuclear@4: } nuclear@4: nuclear@4: float BSphere::get_radius() const nuclear@4: { nuclear@4: return radius; nuclear@4: } nuclear@4: nuclear@4: bool BSphere::intersect(const Ray &ray, HitPoint *hit) const nuclear@4: { nuclear@4: float a = dot(ray.dir, ray.dir); nuclear@4: float b = 2.0 * dot(ray.dir, ray.origin - center); nuclear@4: float c = dot(ray.origin, ray.origin) + dot(center, center) - nuclear@4: 2.0 * dot(ray.origin, center) - radius * radius; nuclear@4: nuclear@4: float disc = b * b - 4.0f * a * c; nuclear@4: if(disc < 1e-6) { nuclear@4: return false; nuclear@4: } nuclear@4: nuclear@4: float sqrt_disc = sqrt(disc); nuclear@4: float x1 = (-b + sqrt_disc) / (2.0f * a); nuclear@4: float x2 = (-b - sqrt_disc) / (2.0f * a); nuclear@4: nuclear@4: if(x1 < 1e-6) x1 = x2; nuclear@4: if(x2 < 1e-6) x2 = x1; nuclear@4: nuclear@4: float t = x1 < x2 ? x1 : x2; nuclear@4: if(t < 1e-6) { nuclear@4: return false; nuclear@4: } nuclear@4: nuclear@4: hit->t = t; nuclear@4: hit->pos = ray.origin + ray.dir * t; nuclear@4: return true; nuclear@4: }