/**
*  @class Ray
*
*  @Date: Created by Ray Zhang on 28/07/14.
*
*  @Description
*  Define a ray, ray is a line with a start point.
*/
#ifndef __UTILS_RAY__
#define __UTILS_RAY__

#include <CasualCore/CasualCore.h>

class Ray
{
public:
  Ray(const RKVector begin, const RKVector direction) : m_origin(begin), m_direction(direction) {
    m_direction.Normalize();
  }

  Ray(const Ray & rhv) : m_origin(rhv.m_origin), m_direction(rhv.m_direction) {}

  Ray& operator=(const Ray& rhv) {
    m_origin = rhv.m_origin;
    m_direction = rhv.m_direction;
    return *this;
  }

  const RKVector& GetOrigin() const { return m_origin; }
  const RKVector& GetDirection() const { return m_direction; }

  RKVector ClosestPointOnRay(const RKVector& point) const {
    RKVector v = point - m_origin;
    float    t = v.Dot(m_direction);
    return m_origin + m_direction * t;
  }

private:
  RKVector m_origin;
  RKVector m_direction;
};

#endif // __UTILS_RAY__
