#include "ZGo.h"



//---- Subdivide3DObject -----------------------------------------------------//

//---- Subdivide3DObject

Subdivide3DObject::Subdivide3DObject(ZGo *zgo, ZGoPARAMS *input, ZGoPARAMS *output)
{
  this->zgo = zgo;
  this->input = input->setInput(this);
  this->output = output->setOutput(this);

  this->fnType = new ZGoNAME(zgo, "Subdivide3DObject");

  //  Parameters

  obj = (ZGo3DOBJECT *)input->get("obj");
  result = (ZGo3DOBJECT *)output->get("result");
}



//---- clear

void Subdivide3DObject::clear()
{
  num = 0;
}



//---- newPoint

int Subdivide3DObject::newPoint(int p1, int p2)
{
  int i;

  //- Check if we have already calculated this point

  for(i=0; i<num; i++)
  {
    if(cache_p1[i] == p1 && cache_p2[i] == p2) return cache_p3[i];
    if(cache_p1[i] == p2 && cache_p2[i] == p1) return cache_p3[i];
  }

  //- Doesn't already exist - calculate

  int p3 = result->points;

  result->point[p3][0] = 0.5 * (result->point[p1][0] + result->point[p1][0]);
  result->point[p3][1] = 0.5 * (result->point[p1][1] + result->point[p1][1]);
  result->point[p3][2] = 0.5 * (result->point[p1][2] + result->point[p1][2]);

  result->points ++;

  //- Store for next time

  cache_p1[num] = p1;
  cache_p2[num] = p2;
  cache_p3[num] = p3;
  num++;

  return p3;
}



//---- process

void Subdivide3DObject::process()
{
  int i;

  //- Copy vertices

  for(i=0; i<obj->points; i++)
  {
    result->point[i][0] = obj->point[i][0];
    result->point[i][1] = obj->point[i][1];
    result->point[i][2] = obj->point[i][2];
  }

  result->points = obj->points;

  //- New faces

  clear();

  for(i=0; i<obj->faces; i++)
  {
    int p1 = obj->face[i][0];
    int p2 = obj->face[i][1];
    int p3 = obj->face[i][2];

    //- New points

    int p12 = newPoint(p1, p2);
    int p23 = newPoint(p2, p3);
    int p31 = newPoint(p3, p1);

    result->face[i*4+0][0] = p1 ; result->face[i*4+0][1] = p12; result->face[i*4+0][2] = p31;
    result->face[i*4+1][0] = p12; result->face[i*4+1][1] = p2 ; result->face[i*4+1][2] = p23;
    result->face[i*4+2][0] = p23; result->face[i*4+2][1] = p3 ; result->face[i*4+2][2] = p31;
    result->face[i*4+3][0] = p31; result->face[i*4+3][1] = p12; result->face[i*4+3][2] = p23;
  }

  result->faces = obj->faces * 4;
}



//---- end of file -----------------------------------------------------------//
