2013-09-09 22:47:19 -07:00
|
|
|
/* basics.c
|
|
|
|
*
|
2013-09-09 23:03:41 -07:00
|
|
|
* Definition of basic types.
|
|
|
|
*
|
|
|
|
* - Vector3 is a three tuple vector of x, y, and z.
|
|
|
|
* - Ray is a vector plus a direction.
|
|
|
|
* - Color is a four tuple of red, green, blue, and alpha.
|
2013-09-09 22:47:19 -07:00
|
|
|
*
|
|
|
|
* Eryn Wells <eryn@erynwells.me>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
#include "basics.h"
|
|
|
|
|
|
|
|
#pragma mark - Vectors
|
|
|
|
|
|
|
|
const Vector3 Vector3::Zero = Vector3();
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::Vector3 --
|
|
|
|
*
|
|
|
|
* Default constructor. Create a zero vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
Vector3::Vector3()
|
|
|
|
: Vector3(0.0, 0.0, 0.0)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::Vector3 --
|
|
|
|
*
|
|
|
|
* Constructor. Create a vector consisting of the given coordinates.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
Vector3::Vector3(float _x, float _y, float _z)
|
|
|
|
: x(_x), y(_y), z(_z)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::operator+ --
|
|
|
|
*
|
|
|
|
* Add the given vector to this vector. Return a new vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline Vector3
|
|
|
|
Vector3::operator+(Vector3 v)
|
|
|
|
{
|
|
|
|
return Vector3(x + v.x, y + v.y, z + v.z);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::operator* --
|
|
|
|
*
|
|
|
|
* Multiply the given scalar by this vector. Return a new vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline Vector3
|
|
|
|
Vector3::operator*(float a)
|
|
|
|
{
|
|
|
|
return Vector3(a*x, a*y, a*z);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::operator- --
|
|
|
|
*
|
|
|
|
* Subtract the given vector from this vector. Return a new vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline Vector3
|
|
|
|
Vector3::operator-(Vector3 v)
|
|
|
|
{
|
|
|
|
return Vector3(x - v.x, y - v.y, z - v.z);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::operator- --
|
|
|
|
*
|
|
|
|
* Negate this vector. Return a new vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline Vector3
|
|
|
|
Vector3::operator-()
|
|
|
|
{
|
|
|
|
return Vector3(-x, -y, -z);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::length2 --
|
|
|
|
*
|
|
|
|
* Compute and return the length-squared of this vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline float
|
|
|
|
Vector3::length2()
|
|
|
|
{
|
|
|
|
return x*x + y*y + z*z;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::length --
|
|
|
|
*
|
|
|
|
* Compute and return the length of this vector.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline float
|
|
|
|
Vector3::length()
|
|
|
|
{
|
|
|
|
return sqrtf(length2());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::dot --
|
|
|
|
*
|
|
|
|
* Compute and return the dot product of this and the given vectors.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
inline float
|
|
|
|
Vector3::dot(Vector3 v)
|
|
|
|
{
|
|
|
|
return x*v.x + y*v.x + z*v.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Vector3::normalize --
|
|
|
|
*
|
|
|
|
* Normalize this vector in place. That is, make this vector's magnitude (length) 1.0.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
void
|
|
|
|
Vector3::normalize()
|
|
|
|
{
|
|
|
|
float len2 = length2();
|
|
|
|
if (len2 <= 0.0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Multiplying by the inverse of the length is more efficient than dividing by the length.
|
|
|
|
float inverse_length = 1.0 / sqrtf(len2);
|
|
|
|
x *= inverse_length;
|
|
|
|
y *= inverse_length;
|
|
|
|
z *= inverse_length;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* operator* --
|
|
|
|
*
|
|
|
|
* Multiply the given float by the given vector. Return a new vector.
|
|
|
|
*/
|
|
|
|
inline Vector3
|
2013-09-09 22:47:19 -07:00
|
|
|
operator*(float a, Vector3 v)
|
|
|
|
{
|
|
|
|
return v * a;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark - Rays
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Ray::Ray --
|
|
|
|
*
|
|
|
|
* Default constructor. Create a ray at the origin (0, 0, 0) with direction (0, 0, 0).
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
Ray::Ray()
|
|
|
|
: Ray(Vector3::Zero, Vector3::Zero)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Ray::Ray --
|
|
|
|
*
|
|
|
|
* Constructor. Create a ray with the given origin and direction.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
Ray::Ray(Vector3 o, Vector3 d)
|
|
|
|
: origin(o), direction(d)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Ray::parameterize --
|
|
|
|
*
|
|
|
|
* Compute and return the point given by parameterizing this Ray by time t.
|
|
|
|
*/
|
|
|
|
inline Vector3
|
2013-09-09 22:47:19 -07:00
|
|
|
Ray::parameterize(float t)
|
|
|
|
{
|
|
|
|
return origin + t * direction;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark - Colors
|
|
|
|
|
|
|
|
const Color Color::Black = Color();
|
|
|
|
const Color Color::White = Color(1.0, 1.0, 1.0, 1.0);
|
|
|
|
const Color Color::Red = Color(1.0, 0.0, 0.0, 1.0);
|
|
|
|
const Color Color::Green = Color(0.0, 1.0, 0.0, 1.0);
|
|
|
|
const Color Color::Blue = Color(0.0, 0.0, 1.0, 1.0);
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Color::Color --
|
|
|
|
*
|
|
|
|
* Default constructor. Create a new Color with zeros for all components (black).
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
Color::Color()
|
|
|
|
: Color(0.0, 0.0, 0.0, 0.0)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
2013-09-09 23:03:41 -07:00
|
|
|
/*
|
|
|
|
* Color::Color --
|
|
|
|
*
|
|
|
|
* Constructor. Create a new Color with the given components.
|
|
|
|
*/
|
2013-09-09 22:47:19 -07:00
|
|
|
Color::Color(float r, float g, float b, float a)
|
|
|
|
: red(r), green(g), blue(b), alpha(a)
|
|
|
|
{ }
|