diff --git a/src/objectBox.cc b/src/objectBox.cc index f194a1a..90b5670 100644 --- a/src/objectBox.cc +++ b/src/objectBox.cc @@ -8,87 +8,95 @@ #include "objectBox.hh" +using charles::basics::Ray; +using charles::basics::Vector4; + + namespace charles { +/* + * charles::Box::Box -- + */ Box::Box() /* A unit box centered on the origin. */ - : Box(Vector3(-0.5, -0.5, -0.5), Vector3(0.5, 0.5, 0.5)) + : Box(Vector4(-0.5, -0.5, -0.5), Vector4(0.5, 0.5, 0.5)) { } -Box::Box(const Vector3& near, const Vector3& far) +/* + * charles::Box::Box -- + */ +Box::Box(const Vector4& near, + const Vector4& far) : Object(), mNear(near), mFar(far) { } -Vector3& +/* + * charles::Box::GetNear -- + */ +Vector4& Box::GetNear() { return mNear; } +/* + * charles::Box::SetNear -- + */ void -Box::SetNear(const Vector3& near) +Box::SetNear(const Vector4& near) { mNear = near; } -Vector3& +/* + * charles::Box::GetFar -- + */ +Vector4& Box::GetFar() { return mFar; } +/* + * charles::Box::SetFar -- + */ void -Box::SetFar(const Vector3& far) +Box::SetFar(const Vector4& far) { mFar = far; } -bool -Box::point_is_on_surface(const Vector3& p) +/* + * charles::Box::DoNormal -- + */ +Vector4 +Box::DoNormal(const Vector4& p) const { - if (p.x == mNear.x || p.x == mFar.x) { - return (p.y > mNear.y && p.y < mFar.y) - && (p.z > mNear.z && p.z < mFar.z); - } else if (p.y == mNear.y || p.y == mFar.y) { - return (p.x > mNear.x && p.x < mFar.x) - && (p.z > mNear.z && p.z < mFar.z); - } else if (p.z == mNear.z || p.z == mFar.z) { - return (p.x > mNear.x && p.x < mFar.x) - && (p.y > mNear.y && p.y < mFar.y); - } - return false; -} - - -Vector3 -Box::compute_normal(const Vector3& p) - const -{ - if (NearlyEqual(p.x, mNear.x)) { - return Vector3(-1, 0, 0); - } else if (NearlyEqual(p.x, mFar.x)) { - return Vector3(1, 0, 0); - } else if (NearlyEqual(p.y, mNear.y)) { - return Vector3(0, -1, 0); - } else if (NearlyEqual(p.y, mFar.y)) { - return Vector3(0, 1, 0); - } else if (NearlyEqual(p.z, mNear.z)) { - return Vector3(0, 0, -1); - } else if (NearlyEqual(p.z, mFar.z)) { - return Vector3(0, 0, 1); + if (NearlyEqual(p.X(), mNear.X())) { + return Vector4(-1, 0, 0); + } else if (NearlyEqual(p.X(), mFar.X())) { + return Vector4(1, 0, 0); + } else if (NearlyEqual(p.Y(), mNear.Y())) { + return Vector4(0, -1, 0); + } else if (NearlyEqual(p.Y(), mFar.Y())) { + return Vector4(0, 1, 0); + } else if (NearlyEqual(p.Z(), mNear.Z())) { + return Vector4(0, 0, -1); + } else if (NearlyEqual(p.Z(), mFar.Z())) { + return Vector4(0, 0, 1); } /* TODO: Eventually, I might want to raise an error here. */ - return Vector3(); + return Vector4(); } @@ -96,7 +104,7 @@ Box::compute_normal(const Vector3& p) * charles::Box::DoIntersect -- */ bool -Box::DoIntersect(const basics::Ray& ray, +Box::DoIntersect(const Ray& ray, TVector& t, Stats& stats) const @@ -108,17 +116,17 @@ Box::DoIntersect(const basics::Ray& ray, Double tNear = -std::numeric_limits::infinity(); Double tFar = std::numeric_limits::infinity(); - if (!IntersectSlab(mNear.x, mFar.x, + if (!IntersectSlab(mNear.X(), mFar.X(), ray.origin.X(), ray.direction.X(), tNear, tFar)) { return false; } - if (!IntersectSlab(mNear.y, mFar.y, + if (!IntersectSlab(mNear.Y(), mFar.Y(), ray.origin.Y(), ray.direction.Y(), tNear, tFar)) { return false; } - if (!IntersectSlab(mNear.z, mFar.z, + if (!IntersectSlab(mNear.Z(), mFar.Z(), ray.origin.Z(), ray.direction.Z(), tNear, tFar)) { return false; diff --git a/src/objectBox.hh b/src/objectBox.hh index 51a7281..55b3b7b 100644 --- a/src/objectBox.hh +++ b/src/objectBox.hh @@ -3,9 +3,11 @@ * Eryn Wells */ -#include "basics.h" -#include "object.h" -#include "types.hh" +#ifndef __OBJECTBOX_HH__ +#define __OBJECTBOX_HH__ + +#include "object.hh" +#include "basics/basics.hh" namespace charles { @@ -14,22 +16,20 @@ struct Box : public Object { Box(); - Box(const Vector3& near, const Vector3& far); + Box(const basics::Vector4& near, const basics::Vector4& far); - Vector3& GetNear(); - void SetNear(const Vector3& near); - Vector3& GetFar(); - void SetFar(const Vector3& far); + basics::Vector4& GetNear(); + void SetNear(const basics::Vector4& near); - bool DoesIntersect(const Ray& ray, TVector& t, Stats& stats) const; - bool point_is_on_surface(const Vector3 &p) const; - Vector3 compute_normal(const Vector3 &p) const; + basics::Vector4& GetFar(); + void SetFar(const basics::Vector4& far); /** @see charles::Object::Write */ void Write(std::ostream& ost) const; protected: bool DoIntersect(const basics::Ray& ray, TVector& t, Stats& stats) const; + basics::Vector4 DoNormal(const basics::Vector4& p) const; private: /** @@ -52,10 +52,12 @@ private: Double& tFar) const; /** The near, lower left corner. */ - Vector3 mNear; + basics::Vector4 mNear; /** The far, upper right corner. */ - Vector3 mFar; + basics::Vector4 mFar; }; } /* namespace charles */ + +#endif /* __OBJECTBOX_HH__ */