# gdcmvolume.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 "vtkPiecewiseFunction.h"
    #include "vtkColorTransferFunction.h"
    #include "vtkVolume.h"
    #include "vtkVolumeProperty.h"
    #include "vtkVolumeTextureMapper3D.h"
    #include "vtkFixedPointVolumeRayCastMapper.h"
    #include "vtkInteractorStyleTrackballCamera.h"
    #include "vtkRenderer.h"
    #include "vtkRenderWindow.h"
    #include "vtkImageClip.h"
    #include "vtkRenderWindowInteractor.h"

    // gdcmvolume gdcmData/GE_DLX-8-MONO2-Multiframe-Jpeg_Lossless.dcm
    int main(int argc, char *argv[])
    {
      vtkGDCMImageReader *reader = vtkGDCMImageReader::New();
      reader->SetFileName( argv[1] );
      reader->Update();

      // Create the renderers, render window, and interactor
      vtkRenderWindow *renWin = vtkRenderWindow::New();
      vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
      iren->SetRenderWindow(renWin);
      vtkRenderer *ren = vtkRenderer::New();
      renWin->AddRenderer(ren);

      // Create a transfer function mapping scalar value to opacity
      vtkPiecewiseFunction *oTFun = vtkPiecewiseFunction::New();
      //oTFun->AddSegment(0, 1.0, 256, 0.1);
      oTFun->AddSegment(0, 1.0, 240, 0.1);

      vtkColorTransferFunction *cTFun = vtkColorTransferFunction::New();
      cTFun->AddRGBPoint(   0, 1.0, 1.0, 1.0 );
      //cTFun->AddRGBPoint( 255, 1.0, 1.0, 1.0 );
      cTFun->AddRGBPoint( 240, 1.0, 1.0, 1.0 );

      // Need to crop to actually see minimum intensity
      vtkImageClip *clip = vtkImageClip::New();
      clip->SetInputConnection( reader->GetOutputPort() );
      clip->SetOutputWholeExtent(0,66,0,66,30,37);
      clip->ClipDataOn();

      vtkVolumeProperty *property = vtkVolumeProperty::New();
      property->SetScalarOpacity(oTFun);
      property->SetColor(cTFun);
      property->SetInterpolationTypeToLinear();

      vtkFixedPointVolumeRayCastMapper *mapper = vtkFixedPointVolumeRayCastMapper::New();
      mapper->SetBlendModeToMinimumIntensity();
      mapper->SetInputConnection( reader->GetOutputPort() );

      vtkVolume *volume = vtkVolume::New();
      volume->SetMapper(mapper);
      volume->SetProperty(property);

      ren->AddViewProp(volume);

      renWin->Render();
        {
        iren->Start();
        }

      volume->Delete();
      mapper->Delete();
      property->Delete();
      clip->Delete();
      cTFun->Delete();
      oTFun->Delete();
      reader->Delete();
      renWin->Delete();
      iren->Delete();
      ren->Delete();

     return 0;
    }