/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkPointPlacer.cxx,v

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
#include "vtkPointPlacer.h"

#include "vtkCoordinate.h"
#include "vtkObjectFactory.h"
#include "vtkRenderer.h"

vtkStandardNewMacro(vtkPointPlacer);

//------------------------------------------------------------------------------
vtkPointPlacer::vtkPointPlacer()
{
  this->PixelTolerance = 5;
  this->WorldTolerance = 0.001;
}

//------------------------------------------------------------------------------
vtkPointPlacer::~vtkPointPlacer() = default;

//------------------------------------------------------------------------------
int vtkPointPlacer::UpdateWorldPosition(
  vtkRenderer* vtkNotUsed(ren), double* vtkNotUsed(worldPos), double* vtkNotUsed(worldOrient))
{
  return 1;
}

//------------------------------------------------------------------------------
int vtkPointPlacer::ComputeWorldPosition(
  vtkRenderer* ren, double displayPos[2], double worldPos[3], double vtkNotUsed(worldOrient)[9])
{
  if (ren)
  {
    vtkCoordinate* dpos = vtkCoordinate::New();
    dpos->SetCoordinateSystemToDisplay();
    dpos->SetValue(displayPos[0], displayPos[1]);
    double* p = dpos->GetComputedWorldValue(ren);
    worldPos[0] = p[0];
    worldPos[1] = p[1];
    worldPos[2] = p[2];
    dpos->Delete();
    return 1;
  }
  return 0;
}

//------------------------------------------------------------------------------
int vtkPointPlacer::ComputeWorldPosition(vtkRenderer* ren, double displayPos[2],
  double vtkNotUsed(refWorldPos)[3], double worldPos[3], double worldOrient[9])
{
  return this->ComputeWorldPosition(ren, displayPos, worldPos, worldOrient);
}

//------------------------------------------------------------------------------
int vtkPointPlacer::ValidateWorldPosition(double vtkNotUsed(worldPos)[3])
{
  return 1;
}

//------------------------------------------------------------------------------
int vtkPointPlacer::ValidateWorldPosition(
  double vtkNotUsed(worldPos)[3], double vtkNotUsed(worldOrient)[9])
{
  return 1;
}

//------------------------------------------------------------------------------
int vtkPointPlacer::ValidateDisplayPosition(vtkRenderer*, double vtkNotUsed(displayPos)[2])
{
  return 1;
}

//------------------------------------------------------------------------------
void vtkPointPlacer::PrintSelf(ostream& os, vtkIndent indent)
{
  this->Superclass::PrintSelf(os, indent);

  os << indent << "Pixel Tolerance: " << this->PixelTolerance << "\n";
  os << indent << "World Tolerance: " << this->WorldTolerance << "\n";
}

//------------------------------------------------------------------------------
int vtkPointPlacer::UpdateNodeWorldPosition(
  double vtkNotUsed(worldPos)[3], vtkIdType vtkNotUsed(nodePointId))
{
  return 1;
}
