//----------------------------------------------------------------------------
// William Baxter III's Ray Tracer
//
//     Project for Comp 238, Raster Graphics
//     University of North Carolina at Chapel Hill
//     
// $Id:$
//----------------------------------------------------------------------------

#include "wb3rt.hpp"
#include "ray3f.hpp"
#include "wb3Scene.hpp"

wb3RayTracer::wb3RayTracer(int w, int h)
  : m_image(w, h)
{
    m_iXRes = w;
    m_iYRes = h;
}

wb3RayTracer::~wb3RayTracer()
{
}


inline float CLAMP(float f)
{
  // clamp between [0,1]
  if (f>1.0f) return 1.0f;
  if (f<0.0f) return 0.0f;
  return f;
}

void wb3RayTracer::Trace(const wb3Scene* scene)
{
  Camera *cam = scene->GetCamera();
  for (int py = 0; py < m_iYRes; py++)
  {
    for (int px = 0; px < m_iYRes; px++)
    {
      Ray3f r;
      cam->GetPixelRay(float(px), float(py), m_iXRes, m_iYRes, &r.m_p, &r.m_v);
      r.Normalize();
      Vec3f color(Vec3f::ZERO);
      Vec3f attenuation(1.0f,1.0f,1.0f);
      scene->Shade(scene, scene, 0, r, Vec3f::ZERO, color, attenuation, 0);
      m_image.SetForeground(CLAMP(color.x), CLAMP(color.y), CLAMP(color.z));
      m_image.SetPixel(px, py);
    }
  }
}

