17 #ifndef __itkSparseFieldLevelSetImageFilter_txx
18 #define __itkSparseFieldLevelSetImageFilter_txx
29 template <
class TNeighborhoodType>
33 typedef typename NeighborhoodType::ImageType ImageType;
34 typename ImageType::Pointer dummy_image = ImageType::New();
36 unsigned int i, nCenter;
40 for (i = 0; i < Dimension; ++i)
45 NeighborhoodType it(m_Radius, dummy_image, dummy_image->GetRequestedRegion());
46 nCenter = it.Size() / 2;
48 m_Size = 2 * Dimension;
49 m_ArrayIndex.reserve(m_Size);
50 m_NeighborhoodOffset.reserve(m_Size);
52 for (i = 0; i < m_Size; ++i)
54 m_NeighborhoodOffset.push_back(zero_offset);
57 for (d = Dimension - 1, i = 0; d >= 0; --d, ++i)
59 m_ArrayIndex.push_back( nCenter - it.GetStride(d) );
60 m_NeighborhoodOffset[i][d] = -1;
62 for (d = 0; d < static_cast<int>(Dimension); ++d, ++i)
64 m_ArrayIndex.push_back( nCenter + it.GetStride(d) );
65 m_NeighborhoodOffset[i][d] = 1;
68 for (i = 0; i < Dimension; ++i)
70 m_StrideTable[i] = it.GetStride(i);
74 template <
class TNeighborhoodType>
79 os <<
"SparseFieldCityBlockNeighborList: " << std::endl;
80 for (
unsigned i = 0; i < this->GetSize(); ++i)
82 os <<
"m_ArrayIndex[" << i <<
"]: " << m_ArrayIndex[i] << std::endl;
83 os <<
"m_NeighborhoodOffset[" << i <<
"]: " << m_NeighborhoodOffset[i]
92 template<
class TInputImage,
class TOutputImage>
96 TOutputImage>::ValueType >::One;
98 template<
class TInputImage,
class TOutputImage>
102 TOutputImage>::ValueType >::Zero;
104 template<
class TInputImage,
class TOutputImage>
108 TOutputImage>::StatusType >::NonpositiveMin();
110 template<
class TInputImage,
class TOutputImage>
113 ::m_StatusChanging = -1;
115 template<
class TInputImage,
class TOutputImage>
118 ::m_StatusActiveChangingUp = -2;
120 template<
class TInputImage,
class TOutputImage>
123 ::m_StatusActiveChangingDown = -3;
125 template<
class TInputImage,
class TOutputImage>
128 ::m_StatusBoundaryPixel = -4;
130 template<
class TInputImage,
class TOutputImage>
134 m_IsoSurfaceValue = m_ValueZero;
135 m_NumberOfLayers = ImageDimension;
136 m_LayerNodeStore = LayerNodeStorageType::New();
137 m_LayerNodeStore->SetGrowthStrategyToExponential();
138 this->SetRMSChange(static_cast<double>(m_ValueZero));
139 m_InterpolateSurfaceLocation =
true;
140 m_BoundsCheckingActive =
false;
141 m_ConstantGradientValue = 1.0;
144 template<
class TInputImage,
class TOutputImage>
149 template<
class TInputImage,
class TOutputImage>
154 unsigned int i, j, k, t;
161 for (i = 0; i < 2; ++i)
163 UpList[i] = LayerType::New();
164 DownList[i] = LayerType::New();
173 this->UpdateActiveLayerValues(dt, UpList[0], DownList[0]);
180 this->ProcessStatusList(UpList[0], UpList[1], 2, 1);
181 this->ProcessStatusList(DownList[0], DownList[1], 1, 2);
188 while( down_search < static_cast<StatusType>( m_Layers.size() ) )
190 this->ProcessStatusList(UpList[j], UpList[k], up_to, up_search);
191 this->ProcessStatusList(DownList[j], DownList[k], down_to, down_search);
193 if (up_to == 0) up_to += 1;
207 this->ProcessStatusList(UpList[j], UpList[k], up_to, m_StatusNull);
208 this->ProcessStatusList(DownList[j], DownList[k], down_to, m_StatusNull);
213 this->ProcessOutsideList(UpList[k], static_cast<int>( m_Layers.size()) -2);
214 this->ProcessOutsideList(DownList[k], static_cast<int>( m_Layers.size()) -1);
218 this->PropagateAllLayerValues();
221 template <
class TInputImage,
class TOutputImage>
230 while ( ! OutsideList->
Empty() )
232 m_StatusImage->SetPixel(OutsideList->
Front()->m_Value, ChangeToStatus);
233 node = OutsideList->
Front();
235 m_Layers[ChangeToStatus]->PushFront(node);
239 template <
class TInputImage,
class TOutputImage>
250 statusIt(m_NeighborList.GetRadius(), m_StatusImage,
251 this->GetOutput()->GetRequestedRegion());
253 if (m_BoundsCheckingActive ==
false )
262 while ( ! InputList->
Empty() )
264 statusIt.SetLocation(InputList->
Front()->m_Value);
265 statusIt.SetCenterPixel(ChangeToStatus);
267 node = InputList->
Front();
269 m_Layers[ChangeToStatus]->PushFront(node);
271 for (i = 0; i < m_NeighborList.GetSize(); ++i)
273 neighbor_status = statusIt.GetPixel(m_NeighborList.GetArrayIndex(i));
277 if ( neighbor_status == m_StatusBoundaryPixel )
279 m_BoundsCheckingActive =
true;
282 if (neighbor_status == SearchForStatus)
284 statusIt.SetPixel(m_NeighborList.GetArrayIndex(i),
285 m_StatusChanging, bounds_status);
286 if (bounds_status ==
true)
288 node = m_LayerNodeStore->Borrow();
289 node->
m_Value = statusIt.GetIndex() +
290 m_NeighborList.GetNeighborhoodOffset(i);
298 template <
class TInputImage,
class TOutputImage>
311 const ValueType LOWER_ACTIVE_THRESHOLD = - (m_ConstantGradientValue / 2.0);
312 const ValueType UPPER_ACTIVE_THRESHOLD = m_ConstantGradientValue / 2.0;
315 ValueType new_value, temp_value, rms_change_accumulator;
318 unsigned int i, idx, counter;
319 bool bounds_status, flag;
322 typename UpdateBufferType::const_iterator updateIt;
325 outputIt(m_NeighborList.GetRadius(), this->GetOutput(),
326 this->GetOutput()->GetRequestedRegion());
329 statusIt(m_NeighborList.GetRadius(), m_StatusImage,
330 this->GetOutput()->GetRequestedRegion());
332 if ( m_BoundsCheckingActive ==
false )
335 statusIt.NeedToUseBoundaryConditionOff();
339 rms_change_accumulator = m_ValueZero;
340 layerIt = m_Layers[0]->Begin();
341 updateIt = m_UpdateBuffer.begin();
342 while (layerIt != m_Layers[0]->End() )
344 outputIt.SetLocation(layerIt->m_Value);
345 statusIt.SetLocation(layerIt->m_Value);
347 new_value = this->CalculateUpdateValue(layerIt->m_Value,
349 outputIt.GetCenterPixel(),
363 if (new_value >= UPPER_ACTIVE_THRESHOLD)
369 for (i = 0; i < m_NeighborList.GetSize(); ++i)
371 if (statusIt.GetPixel(m_NeighborList.GetArrayIndex(i))
372 == m_StatusActiveChangingDown)
385 rms_change_accumulator += vnl_math_sqr(new_value-outputIt.GetCenterPixel());
388 temp_value = new_value - m_ConstantGradientValue;
389 for (i = 0; i < m_NeighborList.GetSize(); ++i)
391 idx = m_NeighborList.GetArrayIndex(i);
392 neighbor_status = statusIt.GetPixel( idx );
393 if (neighbor_status == 1)
397 if ( outputIt.GetPixel(idx) < LOWER_ACTIVE_THRESHOLD ||
398 ::vnl_math_abs(temp_value) < ::vnl_math_abs(outputIt.GetPixel(idx)) )
400 outputIt.SetPixel(idx, temp_value, bounds_status);
404 node = m_LayerNodeStore->Borrow();
405 node->
m_Value = layerIt->m_Value;
407 statusIt.SetCenterPixel(m_StatusActiveChangingUp);
412 m_Layers[0]->Unlink(release_node);
413 m_LayerNodeStore->Return( release_node );
416 else if (new_value < LOWER_ACTIVE_THRESHOLD)
422 for (i = 0; i < m_NeighborList.GetSize(); ++i)
424 if (statusIt.GetPixel(m_NeighborList.GetArrayIndex(i))
425 == m_StatusActiveChangingUp)
438 rms_change_accumulator += vnl_math_sqr(new_value - outputIt.GetCenterPixel());
441 temp_value = new_value + m_ConstantGradientValue;
442 for (i = 0; i < m_NeighborList.GetSize(); ++i)
444 idx = m_NeighborList.GetArrayIndex(i);
445 neighbor_status = statusIt.GetPixel( idx );
446 if (neighbor_status == 2)
450 if ( outputIt.GetPixel(idx) >= UPPER_ACTIVE_THRESHOLD ||
451 ::vnl_math_abs(temp_value) < ::vnl_math_abs(outputIt.GetPixel(idx)) )
453 outputIt.SetPixel(idx, temp_value, bounds_status);
457 node = m_LayerNodeStore->Borrow();
458 node->
m_Value = layerIt->m_Value;
460 statusIt.SetCenterPixel(m_StatusActiveChangingDown);
465 m_Layers[0]->Unlink(release_node);
466 m_LayerNodeStore->Return( release_node );
470 rms_change_accumulator += vnl_math_sqr(new_value - outputIt.GetCenterPixel());
472 outputIt.SetCenterPixel( new_value );
481 { this->SetRMSChange(static_cast<double>(m_ValueZero)); }
484 this->SetRMSChange(static_cast<double>( vcl_sqrt((
double)(rms_change_accumulator / static_cast<ValueType>(counter)) )) );
488 template<
class TInputImage,
class TOutputImage>
502 typename ShiftScaleFilterType::Pointer shiftScaleFilter = ShiftScaleFilterType::New();
503 shiftScaleFilter->SetInput( this->GetInput() );
504 shiftScaleFilter->SetShift( - m_IsoSurfaceValue );
506 m_ShiftedImage = shiftScaleFilter->GetOutput();
510 OutputImageType>::New();
511 zeroCrossingFilter->SetInput(m_ShiftedImage);
512 zeroCrossingFilter->GraftOutput(this->GetOutput());
513 zeroCrossingFilter->SetBackgroundValue(m_ValueOne);
514 zeroCrossingFilter->SetForegroundValue(m_ValueZero);
516 zeroCrossingFilter->Update();
518 this->GraftOutput(zeroCrossingFilter->GetOutput());
521 template<
class TInputImage,
class TOutputImage>
528 if (this->GetUseImageSpacing())
530 double minSpacing = NumericTraits<double>::max();
531 for (i=0; i<ImageDimension; i++)
533 minSpacing = vnl_math_min(minSpacing,this->GetInput()->GetSpacing()[i]);
535 m_ConstantGradientValue = minSpacing;
539 m_ConstantGradientValue = 1.0;
543 m_StatusImage = StatusImageType::New();
544 m_StatusImage->SetRegions(this->GetOutput()->GetRequestedRegion());
545 m_StatusImage->Allocate();
549 statusIt(m_StatusImage, m_StatusImage->GetRequestedRegion());
550 for (statusIt.GoToBegin(); ! statusIt.IsAtEnd(); ++statusIt)
552 statusIt.
Set( m_StatusNull );
561 BFCType faceCalculator;
562 typename BFCType::FaceListType faceList;
563 typename BFCType::SizeType sz;
564 typename BFCType::FaceListType::iterator fit;
567 faceList = faceCalculator(m_StatusImage, m_StatusImage->GetRequestedRegion(), sz);
568 fit = faceList.begin();
570 for (++fit; fit != faceList.end(); ++fit)
573 for (statusIt.GoToBegin(); ! statusIt.IsAtEnd(); ++statusIt)
575 statusIt.
Set( m_StatusBoundaryPixel );
580 for (i = 0; i < m_Layers.size(); ++i)
582 while (! m_Layers[i]->Empty() )
584 m_LayerNodeStore->Return(m_Layers[i]->Front());
585 m_Layers[i]->PopFront();
591 m_Layers.reserve(2*m_NumberOfLayers + 1);
593 while ( m_Layers.size() < (2*m_NumberOfLayers+1) )
595 m_Layers.push_back( LayerType::New() );
599 if (m_Layers.size() < 3)
601 itkExceptionMacro( <<
"Not enough layers have been allocated for the sparse field. Requires at least one layer.");
606 this->ConstructActiveLayer();
610 for (i = 1; i < m_Layers.size() - 2; ++i)
612 this->ConstructLayer(i, i+2);
616 this->InitializeActiveLayerValues();
619 this->PropagateAllLayerValues();
625 this->InitializeBackgroundPixels();
628 template <
class TInputImage,
class TOutputImage>
639 const ValueType outside_value = (max_layer+1) * m_ConstantGradientValue;
640 const ValueType inside_value = -(max_layer+1) * m_ConstantGradientValue;
643 this->GetOutput()->GetRequestedRegion());
646 this->GetOutput()->GetRequestedRegion());
649 this->GetOutput()->GetRequestedRegion());
651 for (outputIt = outputIt.
Begin(), statusIt = statusIt.
Begin(),
652 shiftedIt = shiftedIt.
Begin();
653 ! outputIt.
IsAtEnd(); ++outputIt, ++statusIt, ++shiftedIt)
655 if (statusIt.Get() == m_StatusNull || statusIt.Get() == m_StatusBoundaryPixel)
657 if (shiftedIt.
Get() > m_ValueZero)
659 outputIt.
Set(outside_value);
663 outputIt.
Set(inside_value);
670 template <
class TInputImage,
class TOutputImage>
689 shiftedIt(m_NeighborList.GetRadius(), m_ShiftedImage,
690 this->GetOutput()->GetRequestedRegion());
692 outputIt(m_NeighborList.GetRadius(), this->GetOutput(),
693 this->GetOutput()->GetRequestedRegion());
695 statusIt(m_NeighborList.GetRadius(), m_StatusImage,
696 this->GetOutput()->GetRequestedRegion());
703 typename OutputImageType::IndexType upperBounds, lowerBounds;
704 lowerBounds = this->GetOutput()->GetRequestedRegion().GetIndex();
705 upperBounds = this->GetOutput()->GetRequestedRegion().GetIndex()
706 + this->GetOutput()->GetRequestedRegion().GetSize();
708 for (outputIt.GoToBegin(); !outputIt.IsAtEnd(); ++outputIt)
710 if ( outputIt.GetCenterPixel() == m_ValueZero )
714 statusIt.SetLocation( center_index );
718 for (i = 0; i < ImageDimension; i++)
720 if (center_index[i] + static_cast<long>(m_NumberOfLayers) >= (upperBounds[i] - 1)
721 || center_index[i] - static_cast<long>(m_NumberOfLayers) <= lowerBounds[i])
723 m_BoundsCheckingActive =
true;
728 node = m_LayerNodeStore->Borrow();
733 m_Layers[0]->PushFront( node );
737 shiftedIt.SetLocation( center_index );
741 for (i = 0; i < m_NeighborList.GetSize(); ++i)
743 offset_index = center_index
744 + m_NeighborList.GetNeighborhoodOffset(i);
746 if ( outputIt.GetPixel(m_NeighborList.GetArrayIndex(i)) != m_ValueZero)
748 value = shiftedIt.
GetPixel(m_NeighborList.GetArrayIndex(i));
750 if ( value < m_ValueZero )
759 statusIt.SetPixel( m_NeighborList.GetArrayIndex(i),
760 layer_number, bounds_status );
761 if ( bounds_status ==
true )
763 node = m_LayerNodeStore->Borrow();
765 m_Layers[layer_number]->PushFront( node );
773 template<
class TInputImage,
class TOutputImage>
780 bool boundary_status;
783 statusIt(m_NeighborList.GetRadius(), m_StatusImage,
784 this->GetOutput()->GetRequestedRegion() );
787 for (fromIt = m_Layers[from]->Begin();
788 fromIt != m_Layers[from]->End(); ++fromIt)
795 for (i = 0; i < m_NeighborList.GetSize(); ++i)
797 if ( statusIt.GetPixel( m_NeighborList.GetArrayIndex(i) )
800 statusIt.SetPixel(m_NeighborList.GetArrayIndex(i), to,
802 if (boundary_status ==
true)
804 node = m_LayerNodeStore->Borrow();
805 node->
m_Value = statusIt.GetIndex()
806 + m_NeighborList.GetNeighborhoodOffset(i);
807 m_Layers[to]->PushFront( node );
814 template <
class TInputImage,
class TOutputImage>
819 const ValueType CHANGE_FACTOR = m_ConstantGradientValue / 2.0;
821 if (this->GetUseImageSpacing())
823 double minSpacing = NumericTraits<double>::max();
824 for (
unsigned int i=0; i<ImageDimension; i++)
826 minSpacing = vnl_math_min(minSpacing,this->GetInput()->GetSpacing()[i]);
828 MIN_NORM *= minSpacing;
831 unsigned int i, center;
835 shiftedIt( m_NeighborList.GetRadius(), m_ShiftedImage,
836 this->GetOutput()->GetRequestedRegion() );
838 center = shiftedIt.
Size() /2;
839 typename OutputImageType::Pointer output = this->GetOutput();
841 const NeighborhoodScalesType neighborhoodScales = this->GetDifferenceFunction()->ComputeNeighborhoodScales();
843 ValueType dx_forward, dx_backward, length, distance;
846 for (activeIt = m_Layers[0]->Begin();
847 activeIt != m_Layers[0]->End(); ++activeIt)
851 shiftedIt.SetLocation( activeIt->m_Value );
853 length = m_ValueZero;
854 for (i = 0; i < ImageDimension; ++i)
856 dx_forward = ( shiftedIt.GetPixel(center + m_NeighborList.
GetStride(i))
857 - shiftedIt.GetCenterPixel() ) * neighborhoodScales[i];
858 dx_backward = ( shiftedIt.GetCenterPixel()
859 - shiftedIt.GetPixel(center - m_NeighborList.
GetStride(i)) ) * neighborhoodScales[i];
861 if ( vnl_math_abs(dx_forward) > vnl_math_abs(dx_backward) )
863 length += dx_forward * dx_forward;
867 length += dx_backward * dx_backward;
870 length = vcl_sqrt((
double)length) + MIN_NORM;
871 distance = shiftedIt.GetCenterPixel() / length;
873 output->SetPixel( activeIt->m_Value ,
874 vnl_math_min(vnl_math_max(-CHANGE_FACTOR, distance), CHANGE_FACTOR) );
879 template <
class TInputImage,
class TOutputImage>
889 m_UpdateBuffer.clear();
890 m_UpdateBuffer.reserve(m_Layers[0]->
Size());
894 template <
class TInputImage,
class TOutputImage>
901 = this->GetDifferenceFunction();
902 typename Superclass::FiniteDifferenceFunctionType::FloatOffsetType offset;
903 ValueType norm_grad_phi_squared, dx_forward, dx_backward, forwardValue,
904 backwardValue, centerValue;
907 if (this->GetUseImageSpacing())
909 double minSpacing = NumericTraits<double>::max();
910 for (i=0; i<ImageDimension; i++)
912 minSpacing = vnl_math_min(minSpacing,this->GetInput()->GetSpacing()[i]);
914 MIN_NORM *= minSpacing;
917 void *globalData = df->GetGlobalDataPointer();
921 this->GetOutput(), this->GetOutput()->GetRequestedRegion());
924 const NeighborhoodScalesType neighborhoodScales = this->GetDifferenceFunction()->ComputeNeighborhoodScales();
926 if ( m_BoundsCheckingActive ==
false )
928 outputIt.NeedToUseBoundaryConditionOff();
931 m_UpdateBuffer.clear();
932 m_UpdateBuffer.reserve(m_Layers[0]->
Size());
938 for (layerIt = m_Layers[0]->Begin(); layerIt != m_Layers[0]->End(); ++layerIt)
940 outputIt.SetLocation(layerIt->m_Value);
945 if (this->GetInterpolateSurfaceLocation()
946 && (centerValue = outputIt.GetCenterPixel()) != 0.0 )
952 norm_grad_phi_squared = 0.0;
953 for (i = 0; i < ImageDimension; ++i)
955 forwardValue = outputIt.GetNext(i);
956 backwardValue = outputIt.GetPrevious(i);
958 if (forwardValue * backwardValue >= 0)
960 dx_forward = forwardValue - centerValue;
961 dx_backward = centerValue - backwardValue;
964 if (::vnl_math_abs(dx_forward) > ::vnl_math_abs(dx_backward) )
966 offset[i] = dx_forward;
970 offset[i] = dx_backward;
975 if (forwardValue * centerValue < 0)
977 offset[i] = forwardValue - centerValue;
981 offset[i] = centerValue - backwardValue;
985 norm_grad_phi_squared += offset[i] * offset[i];
988 for (i = 0; i < ImageDimension; ++i)
990 #if defined(ITK_USE_DEPRECATED_LEVELSET_INTERPOLATION)
991 offset[i] = (offset[i] * centerValue) * vcl_sqrt(ImageDimension +0.5)
992 / (norm_grad_phi_squared + MIN_NORM);
994 offset[i] = (offset[i] * centerValue) / (norm_grad_phi_squared + MIN_NORM);
998 m_UpdateBuffer.push_back( df->ComputeUpdate(outputIt, globalData, offset) );
1002 m_UpdateBuffer.push_back( df->ComputeUpdate(outputIt, globalData) );
1009 timeStep = df->ComputeGlobalTimeStep(globalData);
1011 df->ReleaseGlobalDataPointer(globalData);
1017 template <
class TInputImage,
class TOutputImage>
1027 this->PropagateLayerValues(0, 1, 3, 1);
1028 this->PropagateLayerValues(0, 2, 4, 2);
1031 for (i = 1; i < m_Layers.size() - 2; ++i)
1033 this->PropagateLayerValues(i, i+2, i+4, (i+2)%2);
1037 template <
class TInputImage,
class TOutputImage>
1045 value = NumericTraits<ValueType>::Zero;
1046 bool found_neighbor_flag;
1053 if (InOrOut == 1) delta = - m_ConstantGradientValue;
1054 else delta = m_ConstantGradientValue;
1057 outputIt(m_NeighborList.GetRadius(), this->GetOutput(),
1058 this->GetOutput()->GetRequestedRegion() );
1060 statusIt(m_NeighborList.GetRadius(), m_StatusImage,
1061 this->GetOutput()->GetRequestedRegion() );
1063 if ( m_BoundsCheckingActive ==
false )
1066 statusIt.NeedToUseBoundaryConditionOff();
1069 toIt = m_Layers[to]->Begin();
1070 while ( toIt != m_Layers[to]->End() )
1072 statusIt.SetLocation( toIt->m_Value );
1077 if (statusIt.GetCenterPixel() != to)
1081 m_Layers[to]->Unlink( node );
1082 m_LayerNodeStore->Return( node );
1086 outputIt.SetLocation( toIt->m_Value );
1088 found_neighbor_flag =
false;
1089 for (i = 0; i < m_NeighborList.GetSize(); ++i)
1094 if ( statusIt.GetPixel( m_NeighborList.GetArrayIndex(i) ) == from )
1096 value_temp = outputIt.GetPixel( m_NeighborList.GetArrayIndex(i) );
1098 if (found_neighbor_flag ==
false)
1107 if ( value_temp > value )
1115 if (value_temp < value)
1121 found_neighbor_flag =
true;
1124 if (found_neighbor_flag ==
true)
1128 outputIt.SetCenterPixel( value + delta );
1139 m_Layers[to]->Unlink( node );
1140 if ( promote > past_end )
1142 m_LayerNodeStore->Return( node );
1143 statusIt.SetCenterPixel(m_StatusNull);
1147 m_Layers[promote]->PushFront( node );
1148 statusIt.SetCenterPixel(promote);
1155 template<
class TInputImage,
class TOutputImage>
1166 const ValueType inside_value = (max_layer+1) * m_ConstantGradientValue;
1167 const ValueType outside_value = -(max_layer+1) * m_ConstantGradientValue;
1170 this->GetOutput()->GetRequestedRegion());
1173 this->GetOutput()->GetRequestedRegion());
1175 for (outputIt = outputIt.
Begin(), statusIt = statusIt.
Begin();
1176 ! outputIt.
IsAtEnd(); ++outputIt, ++statusIt)
1178 if (statusIt.
Get() == m_StatusNull)
1180 if (outputIt.
Get() > m_ValueZero)
1182 outputIt.
Set(inside_value);
1186 outputIt.
Set(outside_value);
1192 template<
class TInputImage,
class TOutputImage>
1197 Superclass::PrintSelf(os, indent);
1200 os << indent <<
"m_IsoSurfaceValue: " << m_IsoSurfaceValue << std::endl;
1201 os << indent <<
"m_LayerNodeStore: " << std::endl;
1203 os << indent <<
"m_BoundsCheckingActive: " << m_BoundsCheckingActive;
1204 for (i=0; i < m_Layers.size(); i++)
1206 os << indent <<
"m_Layers[" << i <<
"]: size="
1207 << m_Layers[i]->Size() << std::endl;
1208 os << indent << m_Layers[i];
1210 os << indent <<
"m_UpdateBuffer: size=" <<
static_cast<unsigned long>(m_UpdateBuffer.size())
1211 <<
" capacity=" << static_cast<unsigned long>( m_UpdateBuffer.capacity()) << std::endl;