// Ray.cpp: implementation of the Ray class.
//
//////////////////////////////////////////////////////////////////////

#include "Ray.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Ray::Ray(){
	Point3 p = Point3(0,0,0,1); // default to look at origin
	Vector3 v;
	v.set(1,0,0); // default look along x axis
	recurseLevel = 0;

	setStart(p);
	setDir(v);
}

Ray::Ray(Point3& p, Vector3& v){
	setStart(p);
	setDir(v);
	recurseLevel = 0;
}

Ray::~Ray()
{

}

void Ray::setDir(const Vector3& v){
	dir.set(v);
}

void Ray::setDir(float x, float y, float z){
	dir.set(x,y,z);
}

void Ray::setStart(const Point3& p){
	start.set(p);
}

Point3 Ray::rayPos(float t)
{
      Point3 tempPoint;
      tempPoint.x = start.x + t* dir.x;
      tempPoint.y = start.y + t* dir.y;
      tempPoint.z = start.z + t* dir.z;
      return tempPoint;
};

void Ray::xfrmRay(float* invTransfMatrix, Ray r){
	// Contruct homogeous point and dir
	Point3 start = Point3(r.start.x, r.start.y, r.start.z, r.start.d);
	Point3 end = Point3(r.start + r.dir);

	//Multpy with inverse matrix
	start.mult(invTransfMatrix);
	end.mult(invTransfMatrix);

	// set this Ray
	setStart(start);
	setDir(end-start);
}

void Intersection::set(Intersection& i){
	numHits = i.numHits;
	for(int h = 0; h < numHits; h++)
		hit[h] = i.hit[h];
}