void
SoItkSimpleFuzzyConnectednessScalarImageFilter::evaluate()
{
	if( mFuzzyScene )
	{
		mFuzzyScene->unref();
		mFuzzyScene = 0;
		SO_ENGINE_OUTPUT( FuzzyScene, SoItkSFDataImage, setValue( 0 ) );
	}
	if( mOutput )
	{
		mOutput->unref();
		mOutput = 0;
		SO_ENGINE_OUTPUT( Output, SoItkSFDataImage, setValue( 0 ) );
	}

	if( !Input0.getValue() )
		return ;
	
	if( !checkInput() )
	{
		SoDebugError::post( __FILE__, "Invalid Input Types" );
		return ;
	}

	try
	{
		switch( Input0.getValue()->getType() )
		{
			case SoItkDataImage::FLOAT:
			{
				switch( Input0.getValue()->getNumDimension() )
				{
					case 2:
					{
						typedef itk::Image< float, 2 > InputImageType;
						typedef itk::Image< float, 2 > OutputImageType;
						typedef itk::SimpleFuzzyConnectednessScalarImageFilter< InputImageType, OutputImageType > FilterType;
						
						FilterType::Pointer filter = FilterType::New();
						
						// Set the filter's inputs
						SO_ITK_SET_FIELD_VALUE( filter, Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Variance );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Variance );
						
						// Inherited from SoItkSimpleFuzzyConnectednessImageFilterBase
						SO_ITK_SET_FIELD_VALUE( filter, InsideValue );
						SO_ITK_SET_FIELD_VALUE( filter, Threshold );
						SO_ITK_SET_FIELD_VALUE( filter, OutsideValue );
						SO_ITK_SET_FIELD_SEED( filter, ObjectSeed, 2 );
						SO_ITK_SET_FIELD_VALUE( filter, Weight );
						
						// Inherited from SoItkImageToImageFilter
						typedef itk::Image< float, 2 > InputImageType;
						SO_ITK_SET_FIELD_MDATA( filter, Input, 0, InputImageType );
						
						
						
						// Start processing the ouputs
						filter->Update();
						
						// Retrieve the filter's outputs
						filter->GetFuzzyScene()->Register();
						mFuzzyScene = new SoItkDataImage( SoItkDataImage::FLOAT, 2,
							Input0.getValue()->getModelMatrix() );
						mFuzzyScene->ref();
						mFuzzyScene->setPointer( filter->GetFuzzyScene() );
						filter->GetOutput()->Register();
						mOutput = new SoItkDataImage( SoItkDataImage::FLOAT, 2,
							Input0.getValue()->getModelMatrix() );
						mOutput->ref();
						mOutput->setPointer( filter->GetOutput() );
					}
					break ;
					case 3:
					{
						typedef itk::Image< float, 3 > InputImageType;
						typedef itk::Image< float, 3 > OutputImageType;
						typedef itk::SimpleFuzzyConnectednessScalarImageFilter< InputImageType, OutputImageType > FilterType;
						
						FilterType::Pointer filter = FilterType::New();
						
						// Set the filter's inputs
						SO_ITK_SET_FIELD_VALUE( filter, Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Variance );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Variance );
						
						// Inherited from SoItkSimpleFuzzyConnectednessImageFilterBase
						SO_ITK_SET_FIELD_VALUE( filter, InsideValue );
						SO_ITK_SET_FIELD_VALUE( filter, Threshold );
						SO_ITK_SET_FIELD_VALUE( filter, OutsideValue );
						SO_ITK_SET_FIELD_SEED( filter, ObjectSeed, 3 );
						SO_ITK_SET_FIELD_VALUE( filter, Weight );
						
						// Inherited from SoItkImageToImageFilter
						typedef itk::Image< float, 3 > InputImageType;
						SO_ITK_SET_FIELD_MDATA( filter, Input, 0, InputImageType );
						
						
						
						// Start processing the ouputs
						filter->Update();
						
						// Retrieve the filter's outputs
						filter->GetFuzzyScene()->Register();
						mFuzzyScene = new SoItkDataImage( SoItkDataImage::FLOAT, 3,
							Input0.getValue()->getModelMatrix() );
						mFuzzyScene->ref();
						mFuzzyScene->setPointer( filter->GetFuzzyScene() );
						filter->GetOutput()->Register();
						mOutput = new SoItkDataImage( SoItkDataImage::FLOAT, 3,
							Input0.getValue()->getModelMatrix() );
						mOutput->ref();
						mOutput->setPointer( filter->GetOutput() );
					}
					break ;
				}
			}
			break ;
			case SoItkDataImage::UNSIGNED_SHORT:
			{
				switch( Input0.getValue()->getNumDimension() )
				{
					case 2:
					{
						typedef itk::Image< unsigned short, 2 > InputImageType;
						typedef itk::Image< unsigned short, 2 > OutputImageType;
						typedef itk::SimpleFuzzyConnectednessScalarImageFilter< InputImageType, OutputImageType > FilterType;
						
						FilterType::Pointer filter = FilterType::New();
						
						// Set the filter's inputs
						SO_ITK_SET_FIELD_VALUE( filter, Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Variance );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Variance );
						
						// Inherited from SoItkSimpleFuzzyConnectednessImageFilterBase
						SO_ITK_SET_FIELD_VALUE( filter, InsideValue );
						SO_ITK_SET_FIELD_VALUE( filter, Threshold );
						SO_ITK_SET_FIELD_VALUE( filter, OutsideValue );
						SO_ITK_SET_FIELD_SEED( filter, ObjectSeed, 2 );
						SO_ITK_SET_FIELD_VALUE( filter, Weight );
						
						// Inherited from SoItkImageToImageFilter
						typedef itk::Image< unsigned short, 2 > InputImageType;
						SO_ITK_SET_FIELD_MDATA( filter, Input, 0, InputImageType );
						
						
						
						// Start processing the ouputs
						filter->Update();
						
						// Retrieve the filter's outputs
						filter->GetFuzzyScene()->Register();
						mFuzzyScene = new SoItkDataImage( SoItkDataImage::UNSIGNED_SHORT, 2,
							Input0.getValue()->getModelMatrix() );
						mFuzzyScene->ref();
						mFuzzyScene->setPointer( filter->GetFuzzyScene() );
						filter->GetOutput()->Register();
						mOutput = new SoItkDataImage( SoItkDataImage::UNSIGNED_SHORT, 2,
							Input0.getValue()->getModelMatrix() );
						mOutput->ref();
						mOutput->setPointer( filter->GetOutput() );
					}
					break ;
					case 3:
					{
						typedef itk::Image< unsigned short, 3 > InputImageType;
						typedef itk::Image< unsigned short, 3 > OutputImageType;
						typedef itk::SimpleFuzzyConnectednessScalarImageFilter< InputImageType, OutputImageType > FilterType;
						
						FilterType::Pointer filter = FilterType::New();
						
						// Set the filter's inputs
						SO_ITK_SET_FIELD_VALUE( filter, Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Variance );
						SO_ITK_SET_FIELD_VALUE( filter, Diff_Mean );
						SO_ITK_SET_FIELD_VALUE( filter, Variance );
						
						// Inherited from SoItkSimpleFuzzyConnectednessImageFilterBase
						SO_ITK_SET_FIELD_VALUE( filter, InsideValue );
						SO_ITK_SET_FIELD_VALUE( filter, Threshold );
						SO_ITK_SET_FIELD_VALUE( filter, OutsideValue );
						SO_ITK_SET_FIELD_SEED( filter, ObjectSeed, 3 );
						SO_ITK_SET_FIELD_VALUE( filter, Weight );
						
						// Inherited from SoItkImageToImageFilter
						typedef itk::Image< unsigned short, 3 > InputImageType;
						SO_ITK_SET_FIELD_MDATA( filter, Input, 0, InputImageType );
						
						
						
						// Start processing the ouputs
						filter->Update();
						
						// Retrieve the filter's outputs
						filter->GetFuzzyScene()->Register();
						mFuzzyScene = new SoItkDataImage( SoItkDataImage::UNSIGNED_SHORT, 3,
							Input0.getValue()->getModelMatrix() );
						mFuzzyScene->ref();
						mFuzzyScene->setPointer( filter->GetFuzzyScene() );
						filter->GetOutput()->Register();
						mOutput = new SoItkDataImage( SoItkDataImage::UNSIGNED_SHORT, 3,
							Input0.getValue()->getModelMatrix() );
						mOutput->ref();
						mOutput->setPointer( filter->GetOutput() );
					}
					break ;
				}
			}
			break ;
		}
	}
	catch( itk::ExceptionObject& e )
	{
		SoDebugError::post( e.GetFile(), "line %d: %s", e.GetLine(), e.GetDescription() );
		return ;
	}
	catch(...)
	{
		SoDebugError::post( __FILE__, "Unknown Exception" );
		return ;
	}

	SO_ENGINE_OUTPUT( FuzzyScene, SoItkSFDataImage, setValue( mFuzzyScene ) );
	SO_ENGINE_OUTPUT( Output, SoItkSFDataImage, setValue( mOutput ) );
}