# gdcmtexture.cxx

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

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html 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 "vtkGDCMImageReader.h"

    #include "vtkRenderer.h"
    #include "vtkAssembly.h"
    #include "vtkRenderWindow.h"
    #include "vtkAnnotatedCubeActor.h"
    #include "vtkTransform.h"
    #include "vtkAxesActor.h"
    #include "vtkTextProperty.h"
    #include "vtkCaptionActor2D.h"
    #include "vtkPropAssembly.h"
    #include "vtkOrientationMarkerWidget.h"
    #include "vtkRenderWindowInteractor.h"
    #include "vtkPolyDataMapper.h"
    #include "vtkActor.h"
    #include "vtkImageData.h"
    #include "vtkLookupTable.h"
    #include "vtkTexture.h"
    #include "vtkPlaneSource.h"

    int main( int argc, char *argv[] )
    {
      vtkGDCMImageReader *reader = vtkGDCMImageReader::New();
      reader->SetFileName( argv[1] );

      reader->Update();
      vtkImageData* ima = reader->GetOutput();

      vtkLookupTable* table = vtkLookupTable::New();
      table->SetNumberOfColors(1000);
      table->SetTableRange(0,1000);
      table->SetSaturationRange(0,0);
      table->SetHueRange(0,1);
      table->SetValueRange(0,1);
      table->SetAlphaRange(1,1);
      table->Build();

      // Texture
      vtkTexture* texture = vtkTexture::New();
      texture->SetInput(ima);
      texture->InterpolateOn();
      texture->SetLookupTable(table);

      // PlaneSource
      vtkPlaneSource* plane = vtkPlaneSource::New();
      plane->SetOrigin( -0.5, -0.5, 0.0);
      plane->SetPoint1(  0.5, -0.5, 0.0);
      plane->SetPoint2( -0.5,  0.5, 0.0);

      // PolyDataMapper
      vtkPolyDataMapper *planeMapper = vtkPolyDataMapper::New();
      planeMapper->SetInput(plane->GetOutput());

      // Actor
      vtkActor* planeActor = vtkActor::New();
      planeActor->SetTexture(texture);
      planeActor->SetMapper(planeMapper);
      planeActor->PickableOn();

      // Final rendering with simple interactor:
      vtkRenderer        *ren = vtkRenderer::New();
      vtkRenderWindow *renwin = vtkRenderWindow::New();
      renwin->AddRenderer(ren);
      vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
      iren->SetRenderWindow(renwin);
      ren->AddActor(planeActor);
      ren->SetBackground(0,0,0.5);

      vtkAnnotatedCubeActor* cube = vtkAnnotatedCubeActor::New();
      cube->SetXPlusFaceText ( "L" );
      cube->SetXMinusFaceText( "R" );
      cube->SetYPlusFaceText ( "A" );
      cube->SetYMinusFaceText( "P" );
      cube->SetZPlusFaceText ( "H" );
      cube->SetZMinusFaceText( "F" );

      vtkAxesActor* axes2 = vtkAxesActor::New();
      // simulate a left-handed coordinate system
      //
      vtkTransform *transform = vtkTransform::New();
      transform->Identity();
      //transform->RotateY(180);
      reader->GetDirectionCosines()->Print(std::cout);
      transform->Concatenate(reader->GetDirectionCosines());
      //axes2->SetShaftTypeToCylinder();
      axes2->SetUserTransform( transform );
      //cube->SetUserTransform( transform ); // cant get it to work
      cube->GetAssembly()->SetUserTransform( transform ); // cant get it to work

      vtkPropAssembly* assembly = vtkPropAssembly::New();
      assembly->AddPart( axes2 );
      assembly->AddPart( cube );

      vtkOrientationMarkerWidget* widget = vtkOrientationMarkerWidget::New();
      //widget->SetOutlineColor( 0.9300, 0.5700, 0.1300 );
      widget->SetOrientationMarker( assembly );
      widget->SetInteractor( iren );
      //widget->SetViewport( 0.0, 0.0, 0.4, 0.4 );
      widget->SetEnabled( 1 );
      widget->InteractiveOff();
      widget->InteractiveOn();

      renwin->Render();
      iren->Start();

      // Clean up:
      reader->Delete();
      table->Delete();
      texture->Delete();
      plane->Delete();
      planeMapper->Delete();
      planeActor->Delete();
      ren->Delete();
      renwin->Delete();
      iren->Delete();

      return 0;
    }