#include "DiffuseShader.hpp"
#include <fstream>
#include "Globals.hpp"

using namespace SH;

DiffuseShader::DiffuseShader()
{
}

DiffuseShader::~DiffuseShader()
{
}

void DiffuseShader::init()
{
  vsh = SH_BEGIN_VERTEX_PROGRAM {
    ShInputNormal3f normal;
    ShInputPosition4f p;

    ShOutputPoint4f ov;
    ShOutputNormal3f on;
    ShOutputVector3f lvv;
    ShOutputPosition4f opd;
   
    opd = Globals::mvp | p;
    on = normalize(Globals::mv | normal);
    ov = -normalize(Globals::mv | p);
    lvv = normalize(Globals::lightPos - (Globals::mv | p)(0,1,2));
   
  } SH_END_PROGRAM;
 
  fsh = SH_BEGIN_FRAGMENT_PROGRAM {
    ShInputVector4f v;
    ShInputNormal3f n;
    ShInputVector3f lvv;
    ShInputPosition4f p;
   
    ShOutputColor3f out;
    out(0,1,2) = Globals::color * dot(normalize(n), normalize(lvv));

  } SH_END_PROGRAM;

}

void DiffuseShader::apply()
{
  shBindShader(vsh);
  shBindShader(fsh);
}

void DiffuseShader::vertex(const SH::ShPoint4f& n, // normal
			   const SH::ShPoint4f& t, // tangents
			   const SH::ShPoint4f& tex, // texture coordinates
			   const SH::ShPoint4f& t2, // secondary tangent
			   const SH::ShPoint4f& v // vertex
			   )
{
  pushSmAttrib(n);
  pushSmVertex(v);
}

// Instantiate the shader
DiffuseShader diffuse_shader;
