Updates for Box
This commit is contained in:
parent
70576c382a
commit
392871a1ee
2 changed files with 66 additions and 56 deletions
|
@ -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<Double>::infinity();
|
||||
Double tFar = std::numeric_limits<Double>::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;
|
||||
|
|
|
@ -3,9 +3,11 @@
|
|||
* Eryn Wells <eryn@erynwells.me>
|
||||
*/
|
||||
|
||||
#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__ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue