double r2 = m_radius*m_radius; Vector3 M = m_center-ray.point; Vector3 P = ray.direction * (M).dot(ray.direction); double d = (M-P).lengthSquared(); double t = P.length(); if (d > r2) return false; if (d < r2) { P = P - ray.direction * sqrt(r2-d*d); } if (t < iData->t && t > ray.min_t && t < ray.max_t) { iData->t = t; iData->material = m_material; iData->color = getColor(); iData->position = ray.point + P; return true; }