added operators +, - to Vector, added inverse transform instance variable to shapes/Shape, changed Sphere to use its inverse transform when calculating intersections and normals, removed simplistic lighting from main/Scene

git-svn-id: svn://anubis/fart/trunk@47 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop committed 2009-01-26 14:02:15 +00:00
1 parent dad8497bf4
commit 7d7ec130e0
5 files changed
+40 -25

No files matched your search

+8 -2
View File
@@ -11,12 +11,18 @@ class Shape
{
public:
virtual Solver::Result intersect(const Ray & ray) = 0;
void setTransform(const Transform & t) { m_transform = t; }
Transform & getTransform() { return m_transform; }
virtual Vector getNormalAt(const Vector & pt) = 0;
void setTransform(Transform & t)
{
m_transform = t;
m_inverse = t.getInverse();
}
Transform & getTransform() { return m_transform; }
protected:
Transform m_transform;
Transform m_inverse;
};
#endif
+11 -7
View File
@@ -13,14 +13,16 @@ Sphere::Sphere(double radius)
Solver::Result Sphere::intersect(const Ray & ray)
{
Ray ray_inv = m_inverse.transform_ray(ray);
Solver::Result res;
QuadraticSolver solver(1.0,
2 * ( ray.getOrigin()[0] * ray.getDirection()[0]
+ ray.getOrigin()[1] * ray.getDirection()[1]
+ ray.getOrigin()[2] * ray.getDirection()[2] ),
ray.getOrigin()[0] * ray.getOrigin()[0]
+ ray.getOrigin()[1] * ray.getOrigin()[1]
+ ray.getOrigin()[2] * ray.getOrigin()[2]
2 * ( ray_inv.getOrigin()[0] * ray_inv.getDirection()[0]
+ ray_inv.getOrigin()[1] * ray_inv.getDirection()[1]
+ ray_inv.getOrigin()[2] * ray_inv.getDirection()[2] ),
ray_inv.getOrigin()[0] * ray_inv.getOrigin()[0]
+ ray_inv.getOrigin()[1] * ray_inv.getOrigin()[1]
+ ray_inv.getOrigin()[2] * ray_inv.getOrigin()[2]
- m_radius2);
Solver::Result quadSolutions = solver.solve();
for (int i = 0; i < quadSolutions.numResults; i++)
@@ -35,6 +37,8 @@ Solver::Result Sphere::intersect(const Ray & ray)
Vector Sphere::getNormalAt(const Vector & pt)
{
Vector normal = pt;
Vector pt_inv = m_inverse.transform_point(pt);
Vector normal = pt_inv;
return normal.normalize();
}