BlendShapeViewer::BlendShapeViewer(QWidget* parent):
	GL3DCanvas(parent)
{
	this->resize(640, 480);
	this->setSceneScale(1.0);

	showLandmarks = true;

	// load a dummy mesh
	PhGUtils::OBJLoader loader;
	loader.load("../Data/shape_0.obj");
	mesh.initWithLoader( loader );

	recon.setBaseMesh(mesh);
	GPURecon.setBaseMesh(mesh);

	targetSet = false;

	loadLandmarks();

	updateMeshWithReconstructor();

	connect(&recon, SIGNAL(oneiter()), this, SLOT(updateMeshWithReconstructor()));

	mProj = PhGUtils::KinectColorProjection.transposed();
	mMv = PhGUtils::Matrix4x4f::identity();
}
int main(int argc, char ** argv)
{
  
  // tests
  tests();
  
  // initialize stuff
  init();
  
  // create landmarks
  if(argc>1)
    loadLandmarks(std::string(argv[1]));
  else
    loadLandmarks("assets/landmarks.txt");

  // prepare variables for the main loop
  current_pose.x = 0;
  current_pose.y = 0;
  current_pose.theta = 0;
  last_captured_pose = current_pose;
  fake_current_pose = current_pose;
  fake_last_captured_pose = current_pose;
  double sleep_time = 0; // used for waiting next step
  
  sf::Clock clock;
  clock.Reset();
  float next_step_time = clock.GetElapsedTime();
  int loop = 0;
  while(true){
    loop = 0;
    
    while((clock.GetElapsedTime() > next_step_time) && (loop < MAX_FRAMESKIP)){
      next_step_time += SKIP_TICKS;
      handleEvents();
      update();
      loop++;
      sleep_time = next_step_time - clock.GetElapsedTime();
      if(sleep_time > 0){
	usleep(sleep_time*1000);
      }
    }
    draw();
  }
  
  return 0;
}