package tetra;

import vtk.vtkAlgorithm;
import vtk.vtkDataObject;
import vtk.vtkInformation;
import vtk.vtkInformationVector;
import vtk.vtkPoints;
import vtk.vtkPolyData;
import vtk.vtkPolyDataAlgorithm;

public class VtkTestFilter extends vtkPolyDataAlgorithm {
	static {
	    System.loadLibrary("vtkCommonJava");
	    System.loadLibrary("vtkFilteringJava");
	    System.loadLibrary("vtkIOJava");
	    System.loadLibrary("vtkImagingJava");
	    System.loadLibrary("vtkGraphicsJava");
	    System.loadLibrary("vtkRenderingJava");
	    System.loadLibrary("vtkGeovisJava");
	  }
	
	int FillInputPortInformation( int port, vtkInformation info )
	{
		if (port == 0 )
		{
			vtkDataObject dataObject = new vtkDataObject();
			vtkAlgorithm algo = new vtkAlgorithm();
			info.Set(dataObject.DATA_TYPE_NAME(), "vtkPolyData" );
			info.Set(algo.INPUT_IS_REPEATABLE(), 1);

			return 1;
		}

		System.err.println("This filter does not have more than 1 input port!");
		return 0;
	}

	int RequestData(vtkInformationVector[] inputVector, vtkInformationVector outputVector)
	{

		// get the info objects
		vtkInformation inInfo = inputVector[0].GetInformationObject(0);
		vtkInformation outInfo = outputVector.GetInformationObject(0);


		// get the input and ouptut
		vtkPolyData input = new vtkPolyData(); 
		vtkDataObject dataObject = new vtkDataObject();
		input = (vtkPolyData) inInfo.Get(dataObject.DATA_OBJECT());

		vtkPolyData output = (vtkPolyData) outInfo.Get(dataObject.DATA_OBJECT());

		//input.GetPoints().InsertNextPoint(1.0, 1.0, 1.0);

		output.ShallowCopy(input);

		return 1;
	}

	public static void main(String[] args) {
		vtkPoints points1 = new vtkPoints();
		points1.InsertNextPoint(1.0, 2.0, 3.0);
		vtkPolyData inputPolydata1 = new vtkPolyData();
		inputPolydata1.SetPoints(points1);

		//setup the second input
		vtkPoints points2 = new vtkPoints();
		points2.InsertNextPoint(4.0, 5.0, 6.0);
		vtkPolyData inputPolydata2 = new vtkPolyData();
		inputPolydata2.SetPoints(points2);

		VtkTestFilter filter = new VtkTestFilter();
		//filter->SetInput(inputPolydata);
		filter.AddInput(inputPolydata1);
		filter.AddInput(inputPolydata2);
		filter.Update();

		vtkPolyData outputPolydata = filter.GetOutput();

		System.out.println("Output points: " + outputPolydata.GetNumberOfPoints());

	}

}
