text: /*==================================================================
  
    Program:   Visualization Toolkit
    Module:    TestHyperTreeGridBinary2DAxisReflectionYCenterMaterial.cxx
  
    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.
  
  ===================================================================*/
  // .SECTION Thanks
  // This test was written by Philippe Pebay, 2016
  // This work was supported by Commissariat a l'Energie Atomique (CEA/DIF)
  
  #include "vtkHyperTreeGridGeometry.h"
  #include "vtkHyperTreeGridAxisReflection.h"
  #include "vtkHyperTreeGridSource.h"
  
  #include "vtkCamera.h"
  #include "vtkCellData.h"
  #include "vtkNew.h"
  #include "vtkPolyData.h"
  #include "vtkPolyDataMapper.h"
  #include "vtkProperty.h"
  #include "vtkRegressionTestImage.h"
  #include "vtkRenderer.h"
  #include "vtkRenderWindow.h"
  #include "vtkRenderWindowInteractor.h"
  
  int TestHyperTreeGridBinary2DAxisReflectionYCenterMaterial( int argc, char* argv[] )
  {
    // Hyper tree grid
    vtkNew<vtkHyperTreeGridSource> htGrid;
    int maxLevel = 6;
    htGrid->SetMaximumLevel( maxLevel );
    htGrid->SetGridSize( 2, 3, 1 );
    htGrid->SetGridScale( 1.5, 1., 10. );  // this is to test that orientation fixes scale
    htGrid->SetDimension( 2 );
    htGrid->SetOrientation( 2 ); // in xy plane
    htGrid->SetBranchFactor( 2 );
    htGrid->UseMaskOn();
    htGrid->SetDescriptor( "RRRRR.|.... .R.. RRRR R... R...|.R.. ...R ..RR .R.. R... .... ....|.... ...R ..R. .... .R.. R...|.... .... .R.. ....|...." );
    htGrid->SetMask( "111111|0000 1111 1111 1111 1111|1111 0001 0111 0101 1011 1111 0111|1111 0111 1111 1111 1111 1111|1111 1111 1111 1111|1111" );
  
    // Axis reflection
    vtkNew<vtkHyperTreeGridAxisReflection> reflection;
    reflection->SetInputConnection( htGrid->GetOutputPort() );
    reflection->SetPlaneToY();
    reflection->SetCenter( 1.5 );
  
    // Geometries
    vtkNew<vtkHyperTreeGridGeometry> geometry1;
    geometry1->SetInputConnection( reflection->GetOutputPort() );
    geometry1->Update();
    vtkPolyData* pd = geometry1->GetPolyDataOutput();
    vtkNew<vtkHyperTreeGridGeometry> geometry2;
    geometry2->SetInputConnection( reflection->GetOutputPort() );
  
    // Mappers
    vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
    vtkNew<vtkPolyDataMapper> mapper1;
    mapper1->SetInputConnection( geometry1->GetOutputPort() );
    mapper1->ScalarVisibilityOff();
    vtkNew<vtkPolyDataMapper> mapper2;
    mapper2->SetInputConnection( geometry2->GetOutputPort() );
    mapper2->SetScalarRange( pd->GetCellData()->GetScalars()->GetRange() );
  
    // Actors
    vtkNew<vtkActor> actor1;
    actor1->SetMapper( mapper1 );
    actor1->GetProperty()->SetRepresentationToWireframe();
    actor1->GetProperty()->SetColor( .7, .7, .7 );
    vtkNew<vtkActor> actor2;
    actor2->SetMapper( mapper2 );
  
    // Camera
    double bd[6];
    pd->GetBounds( bd );
    vtkNew<vtkCamera> camera;
    camera->SetClippingRange( 1., 100. );
    camera->SetFocalPoint( pd->GetCenter() );
    camera->SetPosition( .5 * bd[1], .5 * bd[3], 6. );
  
    // Renderer
    vtkNew<vtkRenderer> renderer;
    renderer->SetActiveCamera( camera );
    renderer->SetBackground( 1., 1., 1. );
    renderer->AddActor( actor1 );
    renderer->AddActor( actor2 );
  
    // Render window
    vtkNew<vtkRenderWindow> renWin;
    renWin->AddRenderer( renderer );
    renWin->SetSize( 400, 400 );
    renWin->SetMultiSamples( 0 );
  
    // Interactor
    vtkNew<vtkRenderWindowInteractor> iren;
    iren->SetRenderWindow( renWin );
  
    // Render and test
    renWin->Render();
  
    int retVal = vtkRegressionTestImageThreshold( renWin, 70 );
    if ( retVal == vtkRegressionTester::DO_INTERACTOR )
    {
      iren->Start();
    }
  
    return !retVal;
  }
  