bool SmoothMeshTriangle::intersects(const Rayd& ray, State& state) const { int ku = mod3[k + 1]; int kv = mod3[k + 2]; const Vector4d& O = ray.origin(); const Vector3d& D = ray.direction(); const Vector3d& A = m_mesh->vertices[m_index0].point; const double lnd = 1.0f / (D[k] + nu * D[ku] + nv * D[kv]); const double t = (nd - O[k] - nu * O[ku] - nv * O[kv]) * lnd; if (t < 0) { state.shadowMiss("SmoothMeshTriangle, behind ray"); return false; } const double hu = O[ku] + t * D[ku] - A[ku]; const double hv = O[kv] + t * D[kv] - A[kv]; const double beta = hv * bnu + hu * bnv; if (beta < 0 || beta > 1) { state.shadowMiss("SmoothMeshTriangle, beta not in [0, 1]"); return false; } const double gamma = hu * cnu + hv * cnv; if (gamma < 0 || (beta + gamma) > 1) { state.shadowMiss("SmoothMeshTriangle, gamma < 0 or beta + gamma > 1"); return false; } state.shadowHit("SmoothMeshTriangle"); return true; }
bool Sphere::intersects(const Rayd& ray, State& state) const { const Vector3d& o = ray.origin() - m_origin, d = ray.direction(); double od = o * d, dd = d * d; double discriminant = od * od - dd * (o * o - m_radius * m_radius); if (discriminant < 0) { state.shadowMiss(this, "Sphere, ray miss"); return false; } else if (discriminant > 0) { double discriminantRoot = sqrt(discriminant); double t1 = (-od - discriminantRoot) / dd; double t2 = (-od + discriminantRoot) / dd; if (t1 <= 0 && t2 <= 0) { state.shadowMiss(this, "Sphere, behind ray"); return false; } state.shadowHit(this, "Sphere"); return true; } state.shadowMiss(this, "Sphere, ray miss"); return false; }