Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions

mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections > Class Template Reference
[Mapper Classes]

Base class of all vtk-based 2D-Mappers. More...

#include <mitkOdfVtkMapper2D.h>

Inheritance diagram for mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >:
Inheritance graph
[legend]
Collaboration diagram for mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >:
Collaboration graph
[legend]

List of all members.

Classes

struct  OdfDisplayGeometry

Public Types

typedef OdfVtkMapper2D Self
typedef VtkMapper2D Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
virtual vtkProp * GetProp (mitk::BaseRenderer *renderer)
virtual void MitkRenderOverlay (mitk::BaseRenderer *renderer)
virtual void MitkRenderOpaqueGeometry (mitk::BaseRenderer *renderer)
virtual void MitkRenderTranslucentGeometry (mitk::BaseRenderer *renderer)
OdfDisplayGeometry * MeasureDisplayedGeometry (mitk::BaseRenderer *renderer)
void AdaptCameraPosition (mitk::BaseRenderer *renderer, OdfDisplayGeometry *dispGeo)
void AdaptOdfScalingToImageSpacing (int index)
void SetRendererLightSources (mitk::BaseRenderer *renderer)
void ApplyPropertySettings ()
virtual void Slice (mitk::BaseRenderer *renderer, OdfDisplayGeometry *dispGeo)
virtual int GetIndex (mitk::BaseRenderer *renderer)
virtual void GenerateData ()
 Generate the data needed for rendering (independent of a specific renderer)
virtual void GenerateData (mitk::BaseRenderer *renderer)
 Generate the data needed for rendering into renderer.
virtual bool IsLODEnabled (BaseRenderer *) const

Static Public Member Functions

static Pointer New ()
static void SetDefaultProperties (DataNode *node, BaseRenderer *renderer=NULL, bool overwrite=false)
 Set default values of properties used by this mapper to node.

Protected Member Functions

 OdfVtkMapper2D ()
virtual ~OdfVtkMapper2D ()

Static Protected Member Functions

static void GlyphMethod (void *arg)

Detailed Description

template<class TPixelType, int NrOdfDirections>
class mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >

Base class of all vtk-based 2D-Mappers.

Those must implement the abstract method vtkProp* GetProp().

Definition at line 47 of file mitkOdfVtkMapper2D.h.


Member Typedef Documentation

template<class TPixelType, int NrOdfDirections>
typedef itk::SmartPointer<const Self> mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::ConstPointer

Reimplemented from mitk::VtkMapper2D.

Definition at line 75 of file mitkOdfVtkMapper2D.h.

template<class TPixelType, int NrOdfDirections>
typedef itk::SmartPointer<Self> mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::Pointer

Reimplemented from mitk::VtkMapper2D.

Definition at line 75 of file mitkOdfVtkMapper2D.h.

template<class TPixelType, int NrOdfDirections>
typedef OdfVtkMapper2D mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::Self

Reimplemented from mitk::VtkMapper2D.

Definition at line 75 of file mitkOdfVtkMapper2D.h.

template<class TPixelType, int NrOdfDirections>
typedef VtkMapper2D mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::Superclass

Reimplemented from mitk::VtkMapper2D.

Definition at line 75 of file mitkOdfVtkMapper2D.h.


Constructor & Destructor Documentation

template<class T , int N>
mitk::OdfVtkMapper2D< T, N >::OdfVtkMapper2D (  ) [protected]

Definition at line 134 of file mitkOdfVtkMapper2D.txx.

References itk::OrientationDistributionFunction< TComponent, NOdfDirections >::GetBaseMesh(), and vtkThickPlane::New().

{
  m_VtkBased = true;
  m_LastDisplayGeometry = 0;

  m_PropAssemblies.push_back(vtkPropAssembly::New());
  m_PropAssemblies.push_back(vtkPropAssembly::New());
  m_PropAssemblies.push_back(vtkPropAssembly::New());

  m_OdfsPlanes.push_back(vtkAppendPolyData::New());
  m_OdfsPlanes.push_back(vtkAppendPolyData::New());
  m_OdfsPlanes.push_back(vtkAppendPolyData::New());

  m_OdfsPlanes[0]->AddInput(vtkPolyData::New());
  m_OdfsPlanes[1]->AddInput(vtkPolyData::New());
  m_OdfsPlanes[2]->AddInput(vtkPolyData::New());

  m_OdfsActors.push_back(vtkActor::New());
  m_OdfsActors.push_back(vtkActor::New());
  m_OdfsActors.push_back(vtkActor::New());

  m_OdfsActors[0]->GetProperty()->SetInterpolationToGouraud();
  m_OdfsActors[1]->GetProperty()->SetInterpolationToGouraud();
  m_OdfsActors[2]->GetProperty()->SetInterpolationToGouraud();

  m_OdfsMappers.push_back(vtkPolyDataMapper::New());
  m_OdfsMappers.push_back(vtkPolyDataMapper::New());
  m_OdfsMappers.push_back(vtkPolyDataMapper::New());

  vtkLookupTable *lut = vtkLookupTable::New();
  //lut->SetMinimumTableValue(0,0,1,1);
  //lut->SetMaximumTableValue(1,0,0,1);
  //lut->SetWindow(0.1);
  //lut->SetLevel(0.05);   <== not recognized or reset by mapper ??
  //lut->Build();
  m_OdfsMappers[0]->SetLookupTable(lut);
  m_OdfsMappers[1]->SetLookupTable(lut);
  m_OdfsMappers[2]->SetLookupTable(lut);

  m_OdfsActors[0]->SetMapper(m_OdfsMappers[0]);
  m_OdfsActors[1]->SetMapper(m_OdfsMappers[1]);
  m_OdfsActors[2]->SetMapper(m_OdfsMappers[2]);

  m_Planes.push_back(vtkPlane::New());
  m_Planes.push_back(vtkPlane::New());
  m_Planes.push_back(vtkPlane::New());

  m_Cutters.push_back(vtkCutter::New());
  m_Cutters.push_back(vtkCutter::New());
  m_Cutters.push_back(vtkCutter::New());

  m_Cutters[0]->SetCutFunction( m_Planes[0] );
  m_Cutters[0]->GenerateValues( 1, 0, 1 );

  m_Cutters[1]->SetCutFunction( m_Planes[1] );
  m_Cutters[1]->GenerateValues( 1, 0, 1 );

  m_Cutters[2]->SetCutFunction( m_Planes[2] );
  m_Cutters[2]->GenerateValues( 1, 0, 1 );

  // Windowing the cutted planes in direction 1
  m_ThickPlanes1.push_back(vtkThickPlane::New());
  m_ThickPlanes1.push_back(vtkThickPlane::New());
  m_ThickPlanes1.push_back(vtkThickPlane::New());

  m_Clippers1.push_back(vtkClipPolyData::New());
  m_Clippers1.push_back(vtkClipPolyData::New());
  m_Clippers1.push_back(vtkClipPolyData::New());

  m_Clippers1[0]->SetClipFunction( m_ThickPlanes1[0] );
  m_Clippers1[1]->SetClipFunction( m_ThickPlanes1[1] );
  m_Clippers1[2]->SetClipFunction( m_ThickPlanes1[2] );

  // Windowing the cutted planes in direction 2
  m_ThickPlanes2.push_back(vtkThickPlane::New());
  m_ThickPlanes2.push_back(vtkThickPlane::New());
  m_ThickPlanes2.push_back(vtkThickPlane::New());

  m_Clippers2.push_back(vtkClipPolyData::New());
  m_Clippers2.push_back(vtkClipPolyData::New());
  m_Clippers2.push_back(vtkClipPolyData::New());

  m_Clippers2[0]->SetClipFunction( m_ThickPlanes2[0] );
  m_Clippers2[1]->SetClipFunction( m_ThickPlanes2[1] );
  m_Clippers2[2]->SetClipFunction( m_ThickPlanes2[2] );

  m_TemplateOdf = itk::OrientationDistributionFunction<T,N>::GetBaseMesh();

  //vtkPoints* points = m_TemplateOdf->GetPoints();

  m_OdfVals->Allocate(N);
  m_OdfSource->SetTemplateOdf(m_TemplateOdf);
  m_OdfSource->SetOdfVals(m_OdfVals);

  m_ShowMaxNumber = 500;

  //vtkMapper::GlobalImmediateModeRenderingOn();
}
template<class T , int N>
mitk::OdfVtkMapper2D< T, N >::~OdfVtkMapper2D (  ) [protected, virtual]

Definition at line 235 of file mitkOdfVtkMapper2D.txx.

{
  m_PropAssemblies[0]->Delete();
  m_PropAssemblies[1]->Delete();
  m_PropAssemblies[2]->Delete();
  m_OdfsPlanes[0]->Delete();
  m_OdfsPlanes[1]->Delete();
  m_OdfsPlanes[2]->Delete();
  m_OdfsActors[0]->Delete();
  m_OdfsActors[1]->Delete();
  m_OdfsActors[2]->Delete();
  m_OdfsMappers[0]->Delete();
  m_OdfsMappers[1]->Delete();
  m_OdfsMappers[2]->Delete();
  m_Planes[0]->Delete();
  m_Planes[1]->Delete();
  m_Planes[2]->Delete();
  m_Cutters[0]->Delete();
  m_Cutters[1]->Delete();
  m_Cutters[2]->Delete();
  m_ThickPlanes1[0]->Delete();
  m_ThickPlanes1[1]->Delete();
  m_ThickPlanes1[2]->Delete();
  m_ThickPlanes2[0]->Delete();
  m_ThickPlanes2[1]->Delete();
  m_ThickPlanes2[2]->Delete();
  m_Clippers1[0]->Delete();
  m_Clippers1[1]->Delete();
  m_Clippers1[2]->Delete();
  m_Clippers2[0]->Delete();
  m_Clippers2[1]->Delete();
  m_Clippers2[2]->Delete();
}

Member Function Documentation

template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::AdaptCameraPosition ( mitk::BaseRenderer renderer,
OdfDisplayGeometry *  dispGeo 
)

Definition at line 397 of file mitkOdfVtkMapper2D.txx.

References QuadProgPP::dist(), mitk::BaseRenderer::GetVtkRenderer(), and ODF_MAPPER_PI.

{

  double viewAngle = renderer->GetVtkRenderer()->GetActiveCamera()->GetViewAngle();
  viewAngle = viewAngle * (ODF_MAPPER_PI/180.0);
  viewAngle /= 2;
  double dist = dispGeo->d/tan(viewAngle);

  mitk::Point3D mfoc; 
  mfoc[0]=dispGeo->M3D[0];
  mfoc[1]=dispGeo->M3D[1];
  mfoc[2]=dispGeo->M3D[2];

  mitk::Point3D mpos; 
  mpos[0]=mfoc[0]+dist*dispGeo->normal[0];
  mpos[1]=mfoc[1]+dist*dispGeo->normal[1];
  mpos[2]=mfoc[2]+dist*dispGeo->normal[2];

  mitk::Point3D mup; 
  mup[0]=dispGeo->O3D[0]-dispGeo->M3D[0];
  mup[1]=dispGeo->O3D[1]-dispGeo->M3D[1];
  mup[2]=dispGeo->O3D[2]-dispGeo->M3D[2];

  renderer->GetVtkRenderer()->GetActiveCamera()->SetParallelProjection(true);
  renderer->GetVtkRenderer()->GetActiveCamera()->SetParallelScale(dist/3.74);

  vtkCamera*   camera = renderer->GetVtkRenderer()->GetActiveCamera();
  if (camera)
  {
    camera->SetPosition(mpos[0],mpos[1],mpos[2]);
    camera->SetFocalPoint(mfoc[0], mfoc[1],mfoc[2]);
    camera->SetViewUp(mup[0],mup[1],mup[2]);
  }  
  renderer->GetVtkRenderer()->ResetCameraClippingRange();
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::AdaptOdfScalingToImageSpacing ( int  index )

Definition at line 937 of file mitkOdfVtkMapper2D.txx.

References min.

{
  // Spacing adapted scaling
  double spacing[3];
  m_VtkImage->GetSpacing(spacing);
  double min;
  if(index==0)
  {
    min = spacing[0];
    min = min > spacing[1] ? spacing[1] : min;
  }
  if(index==1)
  {
    min = spacing[1];
    min = min > spacing[2] ? spacing[2] : min;
  }
  if(index==2)
  {
    min = spacing[0];
    min = min > spacing[2] ? spacing[2] : min;
  }
  m_OdfSource->SetScale(min);
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::ApplyPropertySettings (  )

Definition at line 1004 of file mitkOdfVtkMapper2D.txx.

References mitk::OdfNormalizationMethodProperty::GetNormalization(), and mitk::OdfScaleByProperty::GetScaleBy().

{
  this->GetDataNode()->GetFloatProperty( "Scaling", m_Scaling );
  this->GetDataNode()->GetIntProperty( "ShowMaxNumber", m_ShowMaxNumber );

  OdfNormalizationMethodProperty* nmp = dynamic_cast
    <OdfNormalizationMethodProperty*>(
    this->GetDataNode()->GetProperty( "Normalization" ));
  if(nmp)
  {
    m_Normalization = nmp->GetNormalization();
  }

  OdfScaleByProperty* sbp = dynamic_cast
    <OdfScaleByProperty*>(
    this->GetDataNode()->GetProperty( "ScaleBy" ));
  if(sbp)
  {
    m_ScaleBy = sbp->GetScaleBy();
  }

  this->GetDataNode()->GetFloatProperty( "IndexParam1", m_IndexParam1);
  this->GetDataNode()->GetFloatProperty( "IndexParam2", m_IndexParam2);
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::GenerateData ( mitk::BaseRenderer renderer ) [virtual]

Generate the data needed for rendering into renderer.

Reimplemented from mitk::Mapper.

Definition at line 1031 of file mitkOdfVtkMapper2D.txx.

References mitk::TimeSlicedGeometry::GetTimeSteps(), and mitk::TimeSlicedGeometry::IsValidTime().

{
  if(!m_VtkImage)
  {
    itkWarningMacro( << "m_VtkImage is NULL!" );
    return ;
  }

  int index = GetIndex(renderer);

  if(IsVisible(renderer, "VisibleOdfs")==false)
  {
    m_OdfsActors[0]->VisibilityOff();
    m_OdfsActors[1]->VisibilityOff();
    m_OdfsActors[2]->VisibilityOff();
    return;
  }
  else
  {
    m_OdfsActors[0]->VisibilityOn();
    m_OdfsActors[1]->VisibilityOn();
    m_OdfsActors[2]->VisibilityOn();

    OdfDisplayGeometry* dispGeo = 
      MeasureDisplayedGeometry( renderer);
    
    if(!m_LastDisplayGeometry || !dispGeo->Equals(m_LastDisplayGeometry))
    {
      AdaptOdfScalingToImageSpacing(index);
      SetRendererLightSources(renderer);
      ApplyPropertySettings();
      AdaptCameraPosition(renderer, dispGeo);
      Slice(renderer, dispGeo);
      m_LastDisplayGeometry = dispGeo;
    }
  }

  // Get the TimeSlicedGeometry of the input object
  mitk::Image::Pointer input  = const_cast<mitk::Image*>(this->GetInput());
  const TimeSlicedGeometry *inputTimeGeometry = input->GetTimeSlicedGeometry();
  if (( inputTimeGeometry == NULL ) || ( inputTimeGeometry->GetTimeSteps() == 0 ))
  {
    m_PropAssemblies[0]->VisibilityOff();
    m_PropAssemblies[1]->VisibilityOff();
    m_PropAssemblies[2]->VisibilityOff();
    return;
  }

  if( inputTimeGeometry->IsValidTime( this->GetTimestep() ) == false )
  {
    m_PropAssemblies[0]->VisibilityOff();
    m_PropAssemblies[1]->VisibilityOff();
    m_PropAssemblies[2]->VisibilityOff();
    return;
  }


}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::GenerateData (  ) [virtual]

Generate the data needed for rendering (independent of a specific renderer)

Reimplemented from mitk::Mapper.

Definition at line 886 of file mitkOdfVtkMapper2D.txx.

Referenced by mitk::CompositeMapper::GenerateData().

{
  mitk::Image::Pointer input = const_cast<mitk::Image*>( this->GetInput() );
  if ( input.IsNull() )  return ;

  std::string classname("TensorImage");
  if(classname.compare(input->GetNameOfClass())==0)
  {
    m_VtkImage = dynamic_cast<mitk::TensorImage*>( this->GetInput() )->GetNonRgbVtkImageData();
  }

  std::string qclassname("QBallImage");
  if(qclassname.compare(input->GetNameOfClass())==0)
  {
    m_VtkImage = dynamic_cast<mitk::QBallImage*>( this->GetInput() )->GetNonRgbVtkImageData();
  }

  if( m_VtkImage )
  {
    // make sure, that we have point data with more than 1 component (as vectors)
    vtkPointData* pointData = m_VtkImage->GetPointData();
    if ( pointData == NULL )
    {
      itkWarningMacro( << "m_VtkImage->GetPointData() returns NULL!" );
      return ;
    }
    if ( pointData->GetNumberOfArrays() == 0 )
    {
      itkWarningMacro( << "m_VtkImage->GetPointData()->GetNumberOfArrays() is 0!" );
      return ;
    }
    else if ( pointData->GetArray(0)->GetNumberOfComponents() != N
      && pointData->GetArray(0)->GetNumberOfComponents() != 6 /*for tensor visualization*/)
    {
      itkWarningMacro( << "number of components != number of directions in ODF!" );
      return;
    }
    else if ( pointData->GetArrayName( 0 ) == NULL )
    {
      m_VtkImage->GetPointData()->GetArray(0)->SetName("vector");
    }
  }
  else
  {
    itkWarningMacro( << "m_VtkImage is NULL!" );
    return ;
  }
}
template<class TPixelType, int NrOdfDirections>
virtual const char* mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::GetClassName (  ) const [virtual]

Reimplemented from mitk::VtkMapper2D.

template<class T , int N>
int mitk::OdfVtkMapper2D< T, N >::GetIndex ( mitk::BaseRenderer renderer ) [virtual]

Definition at line 285 of file mitkOdfVtkMapper2D.txx.

References mitk::BaseRenderer::GetName().

{
  if(!strcmp(renderer->GetName(),"stdmulti.widget1"))
    return 0;

  if(!strcmp(renderer->GetName(),"stdmulti.widget2"))
    return 1;

  if(!strcmp(renderer->GetName(),"stdmulti.widget3"))
    return 2;

  return 0;
}
template<class T , int N>
vtkProp * mitk::OdfVtkMapper2D< T, N >::GetProp ( mitk::BaseRenderer renderer ) [virtual]

Implements mitk::VtkMapper2D.

Definition at line 278 of file mitkOdfVtkMapper2D.txx.

Referenced by mitk::CompositeMapper::GetProp().

{
  return m_PropAssemblies[GetIndex(renderer)];
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::GlyphMethod ( void *  arg ) [static, protected]

Definition at line 301 of file mitkOdfVtkMapper2D.txx.

References vtkMaskedProgrammableGlyphFilter::GetGeometry(), mitk::ODFN_GLOBAL_MAX, mitk::ODFN_MAX, mitk::ODFN_MINMAX, mitk::ODFN_NONE, mitk::ODFSB_GFA, mitk::ODFSB_NONE, and mitk::ODFSB_PC.

{
  vtkMaskedProgrammableGlyphFilter
    *pfilter=(vtkMaskedProgrammableGlyphFilter*)arg;

  double point[3];
  double debugpoint[3];
  pfilter->GetPoint(point);
  pfilter->GetPoint(debugpoint);

  itk::Point<double,3> p(point);
  Point3D origin = pfilter->GetGeometry()->GetOrigin();
  Vector3D spacing = pfilter->GetGeometry()->GetSpacing();
  p[0] += origin[0];//+spacing[0]*0.5;
  p[1] += origin[1];//+spacing[1]*0.5;
  p[2] += origin[2];//+spacing[2]*0.5;
  mitk::Point3D p2;
  pfilter->GetGeometry()->ItkPhysicalPointToWorld( p, p2 );
  point[0] = p2[0];
  point[1] = p2[1];
  point[2] = p2[2];

  vtkPointData* data = pfilter->GetPointData();
  vtkDataArray* odfvals = data->GetArray("vector");
  vtkIdType id = pfilter->GetPointId();
  m_OdfTransform->Identity();
  m_OdfTransform->Translate(point[0],point[1],point[2]);

  typedef itk::OrientationDistributionFunction<float,N> OdfType;
  OdfType odf;

  if(odfvals->GetNumberOfComponents()==6)
  {
    float tensorelems[6] = {
      (float)odfvals->GetComponent(id,0),
      (float)odfvals->GetComponent(id,1),
      (float)odfvals->GetComponent(id,2),
      (float)odfvals->GetComponent(id,3),
      (float)odfvals->GetComponent(id,4),
      (float)odfvals->GetComponent(id,5),
    };
    itk::DiffusionTensor3D<float> tensor(tensorelems);
    odf.InitFromTensor(tensor);
  }
  else
  {
    for(int i=0; i<N; i++)
      odf[i] = (double)odfvals->GetComponent(id,i);
  } 

  switch(m_Normalization)
  {
  case ODFN_MINMAX:
    odf = odf.MinMaxNormalize();
    break;
  case ODFN_MAX:
    odf = odf.MaxNormalize();
    break;
  case ODFN_NONE:
    // nothing
    break;
  case ODFN_GLOBAL_MAX:
    // global max not implemented yet
    break;
  default:
    odf = odf.MinMaxNormalize();
  }

  switch(m_ScaleBy)
  {
  case ODFSB_NONE:
    break;
  case ODFSB_GFA:
    odf = odf * odf.GetGeneralizedGFA(m_IndexParam1, m_IndexParam2);
    break;
  case ODFSB_PC:
    odf = odf * odf.GetPrincipleCurvature(m_IndexParam1, m_IndexParam2, 0);
    break;
  }

  for(int i=0; i<N; i++)
    m_OdfVals->SetComponent(0,i,0.5*odf[i]*m_Scaling);

    //double max = -100000;
    //double min = 100000;
    //for( unsigned int i=0; i<N; i++) 
    //{
    //  max = odf[i] > max ? odf[i] : max;
    //  min = odf[i] < min ? odf[i] : min;
    //}
    
  m_OdfSource->Modified();
}
template<class TPixelType, int NrOdfDirections>
virtual bool mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::IsLODEnabled ( BaseRenderer  ) const [inline, virtual]

Returns true if this Mapper currently allows for Level-of-Detail rendering. This reflects whether this Mapper currently invokes StartEvent, EndEvent, and ProgressEvent on BaseRenderer.

Reimplemented from mitk::Mapper.

Definition at line 102 of file mitkOdfVtkMapper2D.h.

Referenced by mitk::CompositeMapper::IsLODEnabled().

{ return true; }
template<class T , int N>
mitk::OdfVtkMapper2D< T, N >::OdfDisplayGeometry * mitk::OdfVtkMapper2D< T, N >::MeasureDisplayedGeometry ( mitk::BaseRenderer renderer )

Definition at line 435 of file mitkOdfVtkMapper2D.txx.

References mitk::BaseRenderer::GetCurrentWorldGeometry2D(), mitk::BaseRenderer::GetDisplayGeometry(), mitk::Geometry3D::GetOrigin(), mitk::DisplayGeometry::GetSizeInMM(), and QuadProgPP::sqrt().

{
  //vtkLinearTransform * vtktransform = this->GetDataNode()->GetVtkTransform(this->GetTimestep());
  Geometry2D::ConstPointer worldGeometry = 
    renderer->GetCurrentWorldGeometry2D();
  PlaneGeometry::ConstPointer worldPlaneGeometry = 
    dynamic_cast<const PlaneGeometry*>( worldGeometry.GetPointer() );

  // set up the cutter orientation according to the current geometry of
  // the renderers plane
  vtkFloatingPointType vp[ 3 ], vnormal[ 3 ];
  Point3D point = worldPlaneGeometry->GetOrigin();
  Vector3D normal = worldPlaneGeometry->GetNormal(); normal.Normalize();
  vnl2vtk( point.Get_vnl_vector(), vp );
  vnl2vtk( normal.Get_vnl_vector(), vnormal );

  mitk::DisplayGeometry::Pointer dispGeometry = renderer->GetDisplayGeometry();
  mitk::Vector2D size = dispGeometry->GetSizeInMM();
  mitk::Vector2D origin = dispGeometry->GetOriginInMM();

  //
  //  |------O------|
  //  |      d2     |
  //  L  d1  M      |
  //  |             |
  //  |-------------|
  //

  mitk::Vector2D M;
  mitk::Vector2D L;
  mitk::Vector2D O;

  M[0] = origin[0] + size[0]/2;
  M[1] = origin[1] + size[1]/2;

  L[0] = origin[0];
  L[1] = origin[1] + size[1]/2;

  O[0] = origin[0] + size[0]/2;
  O[1] = origin[1] + size[1];

  mitk::Point2D point1;
  point1[0] = M[0]; point1[1] = M[1]; point1[2] = M[2];
  mitk::Point3D M3D;
  dispGeometry->Map(point1, M3D);

  point1[0] = L[0]; point1[1] = L[1]; point1[2] = L[2];
  mitk::Point3D L3D;
  dispGeometry->Map(point1, L3D);

  point1[0] = O[0]; point1[1] = O[1]; point1[2] = O[2];
  mitk::Point3D O3D;
  dispGeometry->Map(point1, O3D);

  double d1 = sqrt((M3D[0]-L3D[0])*(M3D[0]-L3D[0])
    + (M3D[1]-L3D[1])*(M3D[1]-L3D[1])
    + (M3D[2]-L3D[2])*(M3D[2]-L3D[2]));
  double d2 = sqrt((M3D[0]-O3D[0])*(M3D[0]-O3D[0])
    + (M3D[1]-O3D[1])*(M3D[1]-O3D[1])
    + (M3D[2]-O3D[2])*(M3D[2]-O3D[2]));
  double d = d1>d2 ? d1 : d2;
  d = d2;

  OdfDisplayGeometry* retval = new OdfDisplayGeometry();
  retval->vp[0] = vp[0];
  retval->vp[1] = vp[1];
  retval->vp[2] = vp[2];
  retval->vnormal[0] = vnormal[0];
  retval->vnormal[1] = vnormal[1];
  retval->vnormal[2] = vnormal[2];
  retval->normal[0] = normal[0];
  retval->normal[1] = normal[1];
  retval->normal[2] = normal[2];
  retval->d = d;
  retval->d1 = d1;
  retval->d2 = d2;
  retval->M3D[0] = M3D[0];
  retval->M3D[1] = M3D[1];
  retval->M3D[2] = M3D[2];
  retval->L3D[0] = L3D[0];
  retval->L3D[1] = L3D[1];
  retval->L3D[2] = L3D[2];
  retval->O3D[0] = O3D[0];
  retval->O3D[1] = O3D[1];
  retval->O3D[2] = O3D[2];

  retval->vp_original[0] = vp[0];
  retval->vp_original[1] = vp[1];
  retval->vp_original[2] = vp[2];
  retval->vnormal_original[0] = vnormal[0];
  retval->vnormal_original[1] = vnormal[1];
  retval->vnormal_original[2] = vnormal[2];
  retval->size[0] = size[0];
  retval->size[1] = size[1];
  retval->origin[0] = origin[0];
  retval->origin[1] = origin[1];
  return retval;

}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::MitkRenderOpaqueGeometry ( mitk::BaseRenderer renderer ) [virtual]

Implements mitk::Mapper.

Definition at line 799 of file mitkOdfVtkMapper2D.txx.

References mitk::BaseRenderer::GetVtkRenderer(), GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7, GL_MODELVIEW, GL_POSITION, GL_PROJECTION, glLightfv(), glLoadIdentity(), glMatrixMode(), glPopMatrix(), and glPushMatrix().

Referenced by mitk::CompositeMapper::MitkRenderOpaqueGeometry().

{
  //std::cout << "MitkRenderOpaqueGeometry(" << renderer->GetName() << ")" << std::endl;
  if ( this->IsVisible( renderer, "VisibleOdfs" )==false ) 
    return;

  if ( this->GetProp(renderer)->GetVisibility() )
  {

    // adapt cam pos
    OdfDisplayGeometry* dispGeo = MeasureDisplayedGeometry( renderer);
    AdaptCameraPosition(renderer, dispGeo);

    if(this->GetDataNode()->IsOn("DoRefresh",NULL))
    {
      glMatrixMode( GL_PROJECTION );  
      glPushMatrix();
      glLoadIdentity(); 

      glMatrixMode( GL_MODELVIEW );  
      glPushMatrix();
      glLoadIdentity(); 

      renderer->GetVtkRenderer()->SetErase(false);
      renderer->GetVtkRenderer()->GetActiveCamera()->Render(renderer->GetVtkRenderer());
      renderer->GetVtkRenderer()->SetErase(true);

      //GLfloat matrix[16];
      //glGetFloatv(GL_MODELVIEW_MATRIX, matrix);

      float LightPos[4] = {0,0,0,0};
      int index = GetIndex(renderer);
      if(index==0)
      {
        LightPos[2] = -1000;
      }
      if(index==1)
      {
        LightPos[0] = 1000;
      }
      if(index==2)
      {
        LightPos[1] = -1000;
      }
      glLightfv(GL_LIGHT0,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT1,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT2,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT3,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT4,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT5,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT6,GL_POSITION,LightPos);     
      glLightfv(GL_LIGHT7,GL_POSITION,LightPos);     

    }

    this->GetProp(renderer)->RenderOpaqueGeometry( renderer->GetVtkRenderer() );

    if(this->GetDataNode()->IsOn("DoRefresh",NULL))
    {
      glMatrixMode( GL_PROJECTION );  
      glPopMatrix();

      glMatrixMode( GL_MODELVIEW );  
      glPopMatrix();
    }
  }
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::MitkRenderOverlay ( mitk::BaseRenderer renderer ) [virtual]

Implements mitk::Mapper.

Definition at line 785 of file mitkOdfVtkMapper2D.txx.

References mitk::BaseRenderer::GetVtkRenderer().

Referenced by mitk::CompositeMapper::MitkRenderOverlay().

{
  //std::cout << "MitkRenderOverlay(" << renderer->GetName() << ")" << std::endl;
  if ( this->IsVisible(renderer, "VisibleOdfs")==false ) 
    return;

  if ( this->GetProp(renderer)->GetVisibility() )
  {
    this->GetProp(renderer)->RenderOverlay(renderer->GetVtkRenderer());
  }
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::MitkRenderTranslucentGeometry ( mitk::BaseRenderer renderer ) [virtual]

Implements mitk::Mapper.

Definition at line 869 of file mitkOdfVtkMapper2D.txx.

References mitk::BaseRenderer::GetVtkRenderer().

Referenced by mitk::CompositeMapper::MitkRenderTranslucentGeometry().

{
  //std::cout << "MitkRenderTranslucentGeometry(" << renderer->GetName() << ")" << std::endl;
  if ( this->IsVisible(renderer, "VisibleOdfs")==false ) 
    return;

  if ( this->GetProp(renderer)->GetVisibility() )
    //BUG (#1551) changed VTK_MINOR_VERSION FROM 3 to 2 cause RenderTranslucentGeometry was changed in minor version 2
#if ( ( VTK_MAJOR_VERSION >= 5 ) && ( VTK_MINOR_VERSION>=2)  )
    this->GetProp(renderer)->RenderTranslucentPolygonalGeometry(renderer->GetVtkRenderer());
#else
    this->GetProp(renderer)->RenderTranslucentGeometry(renderer->GetVtkRenderer());
#endif
}
template<class TPixelType, int NrOdfDirections>
static Pointer mitk::OdfVtkMapper2D< TPixelType, NrOdfDirections >::New (  ) [static]
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::SetDefaultProperties ( mitk::DataNode node,
mitk::BaseRenderer renderer = NULL,
bool  overwrite = false 
) [static]

Set default values of properties used by this mapper to node.

Parameters:
nodeThe node for which the properties are set
overwriteoverwrite existing properties (default: false)
rendererdefines which property list of node is used (default: NULL, i.e. default property list)

Reimplemented from mitk::Mapper.

Definition at line 1092 of file mitkOdfVtkMapper2D.txx.

References mitk::BoolProperty::New(), mitk::OdfScaleByProperty::New(), mitk::OdfNormalizationMethodProperty::New(), mitk::FloatProperty::New(), mitk::IntProperty::New(), and mitk::DataNode::SetProperty().

{
  node->SetProperty( "ShowMaxNumber", mitk::IntProperty::New( 150 ) );
  node->SetProperty( "Scaling", mitk::FloatProperty::New( 1.0 ) );
  node->SetProperty( "Normalization", mitk::OdfNormalizationMethodProperty::New());
  node->SetProperty( "ScaleBy", mitk::OdfScaleByProperty::New());
  node->SetProperty( "IndexParam1", mitk::FloatProperty::New(2));
  node->SetProperty( "IndexParam2", mitk::FloatProperty::New(1));
  node->SetProperty( "visible", mitk::BoolProperty::New( true ) );
  node->SetProperty( "VisibleOdfs", mitk::BoolProperty::New( false ) );
  node->SetProperty ("layer", mitk::IntProperty::New(100));
  node->SetProperty( "DoRefresh", mitk::BoolProperty::New( true ) );
  //node->SetProperty( "opacity", mitk::FloatProperty::New(1.0f) );
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::SetRendererLightSources ( mitk::BaseRenderer renderer )

Definition at line 963 of file mitkOdfVtkMapper2D.txx.

References mitk::BaseRenderer::GetVtkRenderer().

{
  // Light Sources
  vtkCollectionSimpleIterator sit;
  vtkLight* light;
  for(renderer->GetVtkRenderer()->GetLights()->InitTraversal(sit); 
    (light = renderer->GetVtkRenderer()->GetLights()->GetNextLight(sit)); )
  {
    renderer->GetVtkRenderer()->RemoveLight(light);
  }

  light = vtkLight::New();
  light->SetFocalPoint(0,0,0);
  light->SetLightTypeToSceneLight();
  light->SwitchOn();
  light->SetIntensity(1.0);
  light->PositionalOff();

  itk::Point<float> p;
  int index = GetIndex(renderer);
  if(index==0)
  {
    p[0] = 0; p[1] = 0; p[2] = 10000;
  }
  if(index==1)
  {
    p[0] = 0; p[1] = 10000; p[2] = 0;
  }
  if(index==2)
  {
    p[0] = 10000; p[1] = 0; p[2] = 0;
  }

  mitk::Point3D p2;
  this->GetInput()->GetGeometry()->IndexToWorld(p,p2);
  light->SetPosition(p2[0],p2[1],p2[2]);
  renderer->GetVtkRenderer()->AddLight(light);
}
template<class T , int N>
void mitk::OdfVtkMapper2D< T, N >::Slice ( mitk::BaseRenderer renderer,
OdfDisplayGeometry *  dispGeo 
) [virtual]

Definition at line 537 of file mitkOdfVtkMapper2D.txx.

References vtkMaskedProgrammableGlyphFilter::New(), vtkMaskedProgrammableGlyphFilter::SetGeometry(), vtkMaskedProgrammableGlyphFilter::SetInput(), and vtkMaskedProgrammableGlyphFilter::SetRandomMode().

{
  vtkLinearTransform * vtktransform = 
    this->GetDataNode()->GetVtkTransform(this->GetTimestep());

  int index = GetIndex(renderer);

  vtkTransform* inversetransform = vtkTransform::New();
  inversetransform->Identity();
  inversetransform->Concatenate(vtktransform->GetLinearInverse());
  double myscale[3];
  ((vtkTransform*)vtktransform)->GetScale(myscale);
  inversetransform->PostMultiply();
  inversetransform->Scale(1*myscale[0],1*myscale[1],1*myscale[2]);
  inversetransform->TransformPoint( dispGeo->vp, dispGeo->vp );
  inversetransform->TransformNormalAtPoint( dispGeo->vp, dispGeo->vnormal, dispGeo->vnormal );

  // vtk works in axis align coords
  // thus the normal also must be axis align, since 
  // we do not allow arbitrary cutting through volume
  //
  // vnormal should already be axis align, but in order
  // to get rid of precision effects, we set the two smaller
  // components to zero here
  int dims[3];
  m_VtkImage->GetDimensions(dims);
  double spac[3];
  m_VtkImage->GetSpacing(spac);
  if(fabs(dispGeo->vnormal[0]) > fabs(dispGeo->vnormal[1]) 
    && fabs(dispGeo->vnormal[0]) > fabs(dispGeo->vnormal[2]) )
  {
    if(fabs(dispGeo->vp[0]/spac[0]) < 0.4)
      dispGeo->vp[0] = 0.4*spac[0];
    if(fabs(dispGeo->vp[0]/spac[0]) > (dims[0]-1)-0.4)
      dispGeo->vp[0] = ((dims[0]-1)-0.4)*spac[0];
    dispGeo->vnormal[1] = 0;
    dispGeo->vnormal[2] = 0;
  }

  if(fabs(dispGeo->vnormal[1]) > fabs(dispGeo->vnormal[0]) && fabs(dispGeo->vnormal[1]) > fabs(dispGeo->vnormal[2]) )
  {
    if(fabs(dispGeo->vp[1]/spac[1]) < 0.4)
      dispGeo->vp[1] = 0.4*spac[1];
    if(fabs(dispGeo->vp[1]/spac[1]) > (dims[1]-1)-0.4)
      dispGeo->vp[1] = ((dims[1]-1)-0.4)*spac[1];
    dispGeo->vnormal[0] = 0;
    dispGeo->vnormal[2] = 0;
  }

  if(fabs(dispGeo->vnormal[2]) > fabs(dispGeo->vnormal[1]) && fabs(dispGeo->vnormal[2]) > fabs(dispGeo->vnormal[0]) )
  {
    if(fabs(dispGeo->vp[2]/spac[2]) < 0.4)
      dispGeo->vp[2] = 0.4*spac[2];
    if(fabs(dispGeo->vp[2]/spac[2]) > (dims[2]-1)-0.4)
      dispGeo->vp[2] = ((dims[2]-1)-0.4)*spac[2];
    dispGeo->vnormal[0] = 0;
    dispGeo->vnormal[1] = 0;
  }


  m_Planes[index]->SetTransform( (vtkAbstractTransform*)NULL );
  m_Planes[index]->SetOrigin( dispGeo->vp );
  m_Planes[index]->SetNormal( dispGeo->vnormal );

  vtkPoints* points = NULL;
  vtkPoints* tmppoints = NULL;
  vtkPolyData* polydata = NULL;
  vtkFloatArray* pointdata = NULL;
  vtkDelaunay2D *delaunay = NULL;
  vtkPolyData* cuttedPlane = NULL;
  if(!( (dims[0] == 1 && dispGeo->vnormal[0] != 0) || 
    (dims[1] == 1 && dispGeo->vnormal[1] != 0) ||
    (dims[2] == 1 && dispGeo->vnormal[2] != 0) ))
  {
    m_Cutters[index]->SetCutFunction( m_Planes[index] );
    m_Cutters[index]->SetInput( m_VtkImage );
    m_Cutters[index]->Update();
    cuttedPlane = m_Cutters[index]->GetOutput();
  }
  else
  {
    // cutting of a 2D-Volume does not work, 
    // so we have to build up our own polydata object
    cuttedPlane = vtkPolyData::New();
    points = vtkPoints::New();
    points->SetNumberOfPoints(m_VtkImage->GetNumberOfPoints());
    for(int i=0; i<m_VtkImage->GetNumberOfPoints(); i++)
    {
      points->SetPoint(i, m_VtkImage->GetPoint(i));
    }
    cuttedPlane->SetPoints(points);

    pointdata = vtkFloatArray::New();
    int comps  = m_VtkImage->GetPointData()->GetScalars()->GetNumberOfComponents();
    pointdata->SetNumberOfComponents(comps);
    int tuples = m_VtkImage->GetPointData()->GetScalars()->GetNumberOfTuples();
    pointdata->SetNumberOfTuples(tuples);
    for(int i=0; i<tuples; i++)
      pointdata->SetTuple(i,m_VtkImage->GetPointData()->GetScalars()->GetTuple(i));
    pointdata->SetName( "vector" );
    cuttedPlane->GetPointData()->AddArray(pointdata);

    int nZero1, nZero2;
    if(dims[0]==1)
    {
      nZero1 = 1; nZero2 = 2;
    }
    else if(dims[1]==1)
    {
      nZero1 = 0; nZero2 = 2;
    }
    else
    {
      nZero1 = 0; nZero2 = 1;
    }

    tmppoints = vtkPoints::New();
    for(int j=0; j<m_VtkImage->GetNumberOfPoints(); j++){
      double pt[3];
      m_VtkImage->GetPoint(j,pt);
      tmppoints->InsertNextPoint(pt[nZero1],pt[nZero2],0);
    }

    polydata = vtkPolyData::New();
    polydata->SetPoints( tmppoints );
    delaunay = vtkDelaunay2D::New();
    delaunay->SetInput( polydata );
    delaunay->Update();
    vtkCellArray* polys = delaunay->GetOutput()->GetPolys();
    cuttedPlane->SetPolys(polys);
  }

  if(cuttedPlane->GetNumberOfPoints())
  {
    //  WINDOWING HERE
    inversetransform = vtkTransform::New();
    inversetransform->Identity();
    inversetransform->Concatenate(vtktransform->GetLinearInverse());
    double myscale[3];
    ((vtkTransform*)vtktransform)->GetScale(myscale);
    inversetransform->PostMultiply();
    inversetransform->Scale(1*myscale[0],1*myscale[1],1*myscale[2]);

    dispGeo->vnormal[0] = dispGeo->M3D[0]-dispGeo->O3D[0];
    dispGeo->vnormal[1] = dispGeo->M3D[1]-dispGeo->O3D[1];
    dispGeo->vnormal[2] = dispGeo->M3D[2]-dispGeo->O3D[2];
    vtkMath::Normalize(dispGeo->vnormal);
    dispGeo->vp[0] = dispGeo->M3D[0];
    dispGeo->vp[1] = dispGeo->M3D[1];
    dispGeo->vp[2] = dispGeo->M3D[2];

    inversetransform->TransformPoint( dispGeo->vp, dispGeo->vp );
    inversetransform->TransformNormalAtPoint( dispGeo->vp, dispGeo->vnormal, dispGeo->vnormal );

    m_ThickPlanes1[index]->count = 0;
    m_ThickPlanes1[index]->SetTransform((vtkAbstractTransform*)NULL );
    m_ThickPlanes1[index]->SetPose( dispGeo->vnormal, dispGeo->vp );
    m_ThickPlanes1[index]->SetThickness(dispGeo->d2);
    m_Clippers1[index]->SetClipFunction( m_ThickPlanes1[index] );
    m_Clippers1[index]->SetInput( cuttedPlane );
    m_Clippers1[index]->SetInsideOut(1);
    m_Clippers1[index]->Update();

    dispGeo->vnormal[0] = dispGeo->M3D[0]-dispGeo->L3D[0];
    dispGeo->vnormal[1] = dispGeo->M3D[1]-dispGeo->L3D[1];
    dispGeo->vnormal[2] = dispGeo->M3D[2]-dispGeo->L3D[2];
    vtkMath::Normalize(dispGeo->vnormal);
    dispGeo->vp[0] = dispGeo->M3D[0];
    dispGeo->vp[1] = dispGeo->M3D[1];
    dispGeo->vp[2] = dispGeo->M3D[2];

    inversetransform->TransformPoint( dispGeo->vp, dispGeo->vp );
    inversetransform->TransformNormalAtPoint( dispGeo->vp, dispGeo->vnormal, dispGeo->vnormal );

    m_ThickPlanes2[index]->count = 0;
    m_ThickPlanes2[index]->SetTransform((vtkAbstractTransform*)NULL );
    m_ThickPlanes2[index]->SetPose( dispGeo->vnormal, dispGeo->vp );
    m_ThickPlanes2[index]->SetThickness(dispGeo->d1);
    m_Clippers2[index]->SetClipFunction( m_ThickPlanes2[index] );
    m_Clippers2[index]->SetInput( m_Clippers1[index]->GetOutput() );
    m_Clippers2[index]->SetInsideOut(1);
    m_Clippers2[index]->Update();

    cuttedPlane = m_Clippers2[index]->GetOutput ();

    if(cuttedPlane->GetNumberOfPoints())
    {
      m_OdfsPlanes[index]->RemoveAllInputs();

      vtkPolyDataNormals* normals = vtkPolyDataNormals::New();
      normals->SetInputConnection( m_OdfSource->GetOutputPort() );
      normals->SplittingOff();
      normals->ConsistencyOff();
      normals->AutoOrientNormalsOff();
      normals->ComputePointNormalsOn();
      normals->ComputeCellNormalsOff();
      normals->FlipNormalsOff();
      normals->NonManifoldTraversalOff();

      vtkTransformPolyDataFilter* trans = vtkTransformPolyDataFilter::New();
      trans->SetInputConnection( normals->GetOutputPort() );
      trans->SetTransform(m_OdfTransform);

      vtkMaskedProgrammableGlyphFilter* glyphGenerator = vtkMaskedProgrammableGlyphFilter::New();
      glyphGenerator->SetMaximumNumberOfPoints(m_ShowMaxNumber);
      glyphGenerator->SetRandomMode(1);
      glyphGenerator->SetUseMaskPoints(1);
      glyphGenerator->SetSource( trans->GetOutput() );
      glyphGenerator->SetInput(cuttedPlane);
      glyphGenerator->SetColorModeToColorBySource();
      glyphGenerator->SetInputArrayToProcess(0,0,0, vtkDataObject::FIELD_ASSOCIATION_POINTS , "vector");
      glyphGenerator->SetGeometry(this->GetDataNode()->GetData()->GetGeometry());
      glyphGenerator->SetGlyphMethod(&(GlyphMethod),(void *)glyphGenerator);
      try
      {
        glyphGenerator->Update();
      }
      catch( itk::ExceptionObject& err ) 
      {
        std::cout << err << std::endl;
      }
      m_OdfsPlanes[index]->AddInput(glyphGenerator->GetOutput());

      trans->Delete();
      glyphGenerator->Delete();
      normals->Delete();

      m_OdfsPlanes[index]->Update();
    }

  }
  m_PropAssemblies[index]->VisibilityOn();
  if(m_PropAssemblies[index]->GetParts()->IsItemPresent(m_OdfsActors[index]))
    m_PropAssemblies[index]->RemovePart(m_OdfsActors[index]);
  m_OdfsMappers[index]->SetInput(m_OdfsPlanes[index]->GetOutput());
  m_PropAssemblies[index]->AddPart(m_OdfsActors[index]);

  if(inversetransform) inversetransform->Delete();
  if(points) points->Delete();
  if(pointdata) pointdata->Delete();
  if(tmppoints) tmppoints->Delete();
  if(polydata) polydata->Delete();
  if(delaunay) delaunay->Delete();

}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines