+void vvImageContour::UpdateWithPreserveMemoryMode() {
+ // Only change actor visibility if tslice change
+ int mPreviousTslice = mTSlice;
+ mTSlice = mSlicer->GetTSlice();
+
+ vtkMarchingSquares * mSquares = mSquaresList[mTSlice];
+ vtkImageClip * mClipper = mClipperList[mTSlice];
+ vtkActor * mSquaresActor = mSquaresActorList[mTSlice];
+ int orientation = ComputeCurrentOrientation();
+
+ UpdateActor(mSquaresActor, mSquares, mClipper, mValue, orientation, mSlice);
+ mSquaresActorList[mTSlice]->VisibilityOn();
+
+ if (mPreviousTslice != mTSlice) {
+ if (mPreviousTslice != -1) mSquaresActorList[mPreviousTslice]->VisibilityOff();
+ }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvImageContour::InitializeCacheMode() {
+ mPreviousSlice = mPreviousOrientation = 0;
+ int dim = mSlicer->GetImage()->GetNumberOfDimensions();
+
+ mListOfCachedContourActors.resize(dim);
+ for(int d=0; d<dim; d++) {
+ int size = mSlicer->GetImage()->GetSize()[d];
+ mListOfCachedContourActors[d].resize(size);
+ for(int j=0; j<size; j++) {
+ mListOfCachedContourActors[d][j] = NULL;
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+int vvImageContour::ComputeCurrentOrientation() {
+ // Get extent of image in the slicer
+ int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
+
+ // Compute orientation
+ int orientation;
+ for (orientation = 0; orientation < 6; orientation = orientation+2) {
+ if (extent[orientation] == extent[orientation+1]) {
+ break;
+ }
+ }
+ orientation = orientation/2;
+ return orientation;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvImageContour::UpdateWithFastCacheMode() {
+ // Compute orientation
+ int orientation = ComputeCurrentOrientation();
+
+ if ((mPreviousSlice == mSlice) && (mPreviousOrientation == orientation)) return;
+
+ vtkActor * actor = mListOfCachedContourActors[orientation][mSlice];
+ if (actor != NULL) {
+ mListOfCachedContourActors[orientation][mSlice]->VisibilityOn();
+ } else {
+ vtkImageClip * mClipper;
+ vtkMarchingSquares * mSquares;
+ vtkActor * mSquaresActor;
+ CreateNewActor(&mSquaresActor, &mSquares, &mClipper, 0);
+ UpdateActor(mSquaresActor, mSquares, mClipper, mValue, orientation, mSlice);
+ mListOfCachedContourActors[orientation][mSlice] = mSquaresActor;
+ mSquaresActor->VisibilityOn();
+ }
+
+ if (mListOfCachedContourActors[mPreviousOrientation][mPreviousSlice] != NULL)
+ mListOfCachedContourActors[mPreviousOrientation][mPreviousSlice]->VisibilityOff();
+ mPreviousSlice = mSlice;
+ mPreviousOrientation = orientation;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvImageContour::CreateNewActor(vtkActor ** actor,
+ vtkMarchingSquares ** squares,
+ vtkImageClip ** clipper,
+ int numImage) {
+ vtkActor * mSquaresActor = (*actor = vtkActor::New());
+ vtkImageClip * mClipper = (*clipper = vtkImageClip::New());
+ vtkMarchingSquares * mSquares = (*squares = vtkMarchingSquares::New());
+ vtkPolyDataMapper * mSquaresMapper = vtkPolyDataMapper::New();
+
+ if (mHiddenImageIsUsed)
+ mClipper->SetInput(mHiddenImage->GetVTKImages()[0]);
+ else
+ mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[numImage]);