Newer
Older
#include "CirclePlane.h"
namespace shapes {
CirclePlane::CirclePlane (float radius, const std::shared_ptr<material::Material>& material)
:radius_ (radius), material_ (material)
{}
std::shared_ptr<cam::Hit> CirclePlane::intersect (const cam::Ray& r)
{
util::Vec3 n (0, 1, 0);
util::Vec3 x0 = r.x0_;
util::Vec3 d = r.d_;
if (util::dot (d, n) > 0) {
n = n * -1;
}
float a = util::dot (d, n);
if (a == 0) {
return nullptr;
}
else {
float t = -x0[1] / d[1];
util::Vec3 t_hitpoint = r (t);
if (r.in_range (t) && t_hitpoint.length () <= radius_) {
return std::make_shared<cam::Hit> (cam::Hit (t_hitpoint, n, t, material_));
}
else {
return nullptr;
}
}
}
}