games101-hw/05/Code/Sphere.hpp

43 lines
1.0 KiB
C++

#pragma once
#include "Object.hpp"
#include "Vector.hpp"
class Sphere : public Object
{
public:
Sphere(const Vector3f& c, const float& r)
: center(c)
, radius(r)
, radius2(r * r)
{}
bool intersect(const Vector3f& orig, const Vector3f& dir, float& tnear, uint32_t&, Vector2f&) const override
{
// analytic solution
Vector3f L = orig - center;
float a = dotProduct(dir, dir);
float b = 2 * dotProduct(dir, L);
float c = dotProduct(L, L) - radius2;
float t0, t1;
if (!solveQuadratic(a, b, c, t0, t1))
return false;
if (t0 < 0)
t0 = t1;
if (t0 < 0)
return false;
tnear = t0;
return true;
}
void getSurfaceProperties(const Vector3f& P, const Vector3f&, const uint32_t&, const Vector2f&,
Vector3f& N, Vector2f&) const override
{
N = normalize(P - center);
}
Vector3f center;
float radius, radius2;
};