#include "ZGo.h"



//---- ZGoTransform ----------------------------------------------------------//

//---- ZGoTransform

ZGoTransform::ZGoTransform(ZGo *zgo, ZGoPARAMS *input, ZGoPARAMS *output)
{
  this->zgo = zgo;
  this->input = input->setInput(this);
  this->output = output->setOutput(this);

  this->fnType = new ZGoNAME(zgo, "ZGoTransform");

  //  Parameters

  m = (ZGoMATRIX *)input->get("matrix");
  obj = (ZGo3DOBJECT *)input->get("object");
  result = (ZGo3DOBJECT *)output->get("result");
}



//---- process

void ZGoTransform::process()
{
  m->process();
  obj->process();

  //- Transform points and normals from obj into result

  result->points = obj->points;

  for(int i=0; i<obj->points; i++)
  {
    //  Transform point

  	result->point[i][0] = obj->point[i][0]*m->m00 + obj->point[i][1]*m->m01 + obj->point[i][2]*m->m02 + m->m03;
	  result->point[i][1] = obj->point[i][0]*m->m10 + obj->point[i][1]*m->m11 + obj->point[i][2]*m->m12 + m->m13;
	 	result->point[i][2] = obj->point[i][0]*m->m20 + obj->point[i][1]*m->m21 + obj->point[i][2]*m->m22 + m->m23;

    result->point[i][2] += 2;  //  TEMP: hard-coded camera position and orientation

    //  Transform normal

  	result->normal[i][0] = obj->normal[i][0]*m->m00 + obj->normal[i][1]*m->m01 + obj->normal[i][2]*m->m02;
	  result->normal[i][1] = obj->normal[i][0]*m->m10 + obj->normal[i][1]*m->m11 + obj->normal[i][2]*m->m12;
	 	result->normal[i][2] = obj->normal[i][0]*m->m20 + obj->normal[i][1]*m->m21 + obj->normal[i][2]*m->m22;
  }

  //- Put faces into result

  result->faces = obj->faces;
  result->face  = obj->face;
}



//---- end of file -----------------------------------------------------------//
