void Camera::generateRay(glm::vec3 pos, Ray *r, glm::vec3 eye) {
	glm::vec3 ray_vec(pos[0] - eye[0], pos[1] - eye[1], pos[2] - eye[2]);

	float norm = glm::dot(ray_vec,ray_vec);
	if (norm>0){
		ray_vec /= glm::sqrt(norm);
	}

	Ray temp_ray(eye, ray_vec,.001,std::numeric_limits<float>::infinity(),1.0f);

	*r = temp_ray;
}
void Camera::generate_rays(unsigned width, unsigned height, 
							std::vector<Ray> & rays)
{
	float distance = ((width/2) / tan(fov_x_ * M_PI / 360)); 

	for (int y = ((int)height/-2); y < (int)height/2; ++y)
	{
		for (int x = ((int)width/-2); x < (int)width/2; ++x)
		{
			glm::vec3 direction(x, y, -(distance));
			
			//Scale Camera if not default
			if (eye_.x != 0 || eye_.y != 0 || eye_.z != 0 ||
				dir_.x != 0 || dir_.y != 0 || dir_.z != -1 ||
				up_.x != 0 || up_.y != 1 || up_.z != 0 )
			{
				glm::vec4 direct_temp(x, y, -(distance), 1);
				glm::vec3 u = glm::normalize(glm::cross(dir_, up_));
				glm::vec3 v = glm::normalize(glm::cross(u, dir_));
				dir_ = glm::normalize(dir_);
				// Matrix is implemented column x row
				glm::mat4 matrix(u.x, u.y, u.z, 0,
								 v.x, v.y, v.z, 0,
								 (dir_.x*-1), (dir_.y*-1), (dir_.z*-1),0,
								 eye_.x, eye_.y, eye_.z, 1);
				// Matrix x Vector
				glm::vec4 new_direct = matrix * direct_temp;

				direction.x = new_direct.x;
				direction.y = new_direct.y;
				direction.z = new_direct.z;
			}

			Ray temp_ray(eye_, direction);
			rays.push_back(temp_ray);
		}
	}
}