charles/src/object.cc
Eryn Wells 0ab3e17467 Objects need to be translated by their negation
Translating by the negation of the given vector puts them in the right place from the ray's perspective. Without the negation, things are mirrored.
2014-08-20 10:06:22 -07:00

156 lines
2.2 KiB
C++

/* object.c
*
* Definition of generic scene objects.
*
* Eryn Wells <eryn@erynwells.me>
*/
#include <cassert>
#include <cmath>
#include <cstdlib>
#include "object.hh"
#include "material.hh"
#include "basics/basics.hh"
using charles::basics::Ray;
using charles::basics::Matrix4;
using charles::basics::Vector4;
namespace charles {
/*
* charles::Object::Object --
*/
Object::Object(const Vector4& origin)
: mTranslation(Matrix4::Translation(origin)),
mMaterial()
{ }
/*
* charles::Object::~Object --
*/
Object::~Object()
{ }
/*
* charles::Object::GetMaterial --
*/
Material&
Object::GetMaterial()
{
return mMaterial;
}
/*
* charles::Object::Place --
*/
void
Object::Place(const Vector4 &p)
{
mTranslation = Matrix4::Translation(-p);
}
/*
* charles::Object::SetMaterial --
*/
void
Object::SetMaterial(const Material& material)
{
mMaterial = material;
}
/*
* charles::Object::Intersect --
*/
bool
Object::Intersect(const basics::Ray& ray,
TVector& t,
Stats& stats)
const
{
Ray objSpaceRay = ToObjectSpace(ray);
return DoIntersect(objSpaceRay, t, stats);
}
/*
* charles::Object::Normal --
*/
Vector4
Object::Normal(const Vector4& p)
const
{
Vector4 norm = Transpose(mTranslation) * DoNormal(ToObjectSpace(p));
return norm;
}
/*
* charles::Object::ToObjectSpace --
*/
Ray
Object::ToObjectSpace(Ray ray)
const
{
ray.origin = ToObjectSpace(ray.origin);
//ray.direction = ToObjectSpace(ray.direction).Normalize();
return ray;
}
/*
* charles::Object::ToObjectSpace --
*/
Vector4
Object::ToObjectSpace(const Vector4& v)
const
{
return mTranslation * v;
}
/*
* charles::Object::FromObjectSpace --
*/
Vector4
Object::FromObjectSpace(const Vector4& v)
const
{
return Inverse(mTranslation) * v;
}
/*
* charles::Object::Write --
*/
void
Object::Write(std::ostream& ost)
const
{
ost << "[Object]";
}
/*
* charles::operator<< --
*/
std::ostream&
operator<<(std::ostream& ost,
const Object& object)
{
ost << "[";
object.Write(ost);
ost << " translate=" << object.mTranslation.Column(3) << "]";
return ost;
}
} /* namespace charles */