From d2e92bc7c55acd7e295d981db66b81939e94e178 Mon Sep 17 00:00:00 2001 From: Romulo Pinho Date: Fri, 29 Apr 2011 09:38:52 +0200 Subject: [PATCH] Solved bug 363 (still to be improved, though) - indeed a z-buffer issue (order of painting) - actors' positions were being chosen wrt to pixel coordinates, instead of world coordinates - image actors apparently don't can be directly overlaid on top of each other (no positioning issue) - VF actor is placed right before or after the start of the image actor's bounding box, depending on the position of the camera - Clipping box of landmarks has also been corrected - This solution seems to work robustly, but we never know... ;-) - Will improve VF by using a vtkSlicer object to interpolate between slices --- vv/vvSlicer.cxx | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/vv/vvSlicer.cxx b/vv/vvSlicer.cxx index 371cd2d..c19963f 100644 --- a/vv/vvSlicer.cxx +++ b/vv/vvSlicer.cxx @@ -67,6 +67,16 @@ #include #include +template +void print_vector(const char* pmsg, T* pvec) +{ + std::cout << pmsg << ": "; + for (unsigned int i = 0; i < dim; i++) + std::cout << pvec[i] << " "; + std::cout << std::endl; +} + + vtkCxxRevisionMacro(vvSlicer, "DummyRevision"); vtkStandardNewMacro(vvSlicer); @@ -779,6 +789,7 @@ int vvSlicer::GetOrientation() } //---------------------------------------------------------------------------- + //---------------------------------------------------------------------------- void vvSlicer::UpdateDisplayExtent() { @@ -804,11 +815,6 @@ void vvSlicer::UpdateDisplayExtent() // Image actor this->ImageActor->SetDisplayExtent(w_ext); - // Position vector - double position[3] = {0.,0.,0.}; - double positionInc = (Renderer->GetActiveCamera()->GetPosition()[this->SliceOrientation] > this->Slice)?10:-10; - position[this->SliceOrientation] += positionInc; - // Overlay image actor if (mOverlay && mOverlayActor->GetVisibility()) { int overExtent[6]; @@ -816,9 +822,7 @@ void vvSlicer::UpdateDisplayExtent() this->ConvertImageToImageDisplayExtent(input, w_ext, mOverlayReslice->GetOutput(), overExtent); ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent()); mOverlayActor->SetDisplayExtent( overExtent ); - mOverlayActor->SetPosition(position); } - position[this->SliceOrientation] += positionInc; // Fusion image actor if (mFusion && mFusionActor->GetVisibility()) { @@ -827,11 +831,26 @@ void vvSlicer::UpdateDisplayExtent() this->ConvertImageToImageDisplayExtent(input, w_ext, mFusionReslice->GetOutput(), fusExtent); ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent()); mFusionActor->SetDisplayExtent(fusExtent); - mFusionActor->SetPosition(position); } - position[this->SliceOrientation] += positionInc; // Vector field actor + double* camera = Renderer->GetActiveCamera()->GetPosition(); + double* image_bounds = ImageActor->GetBounds(); + double position[3] = {0, 0, 0}; + position[this->SliceOrientation] = image_bounds[this->SliceOrientation*2]; + + print_vector("camera", camera); + print_vector("image_bounds", image_bounds); + print_vector("position", position); + + // find where to place the VF actor. to deal with + // z-buffer issues, the VF is placed right in front of the image, + // subject to a small offset. the position actually depends on the + // the location of the camera relative to the image. + double offset = 1; + if (camera[this->SliceOrientation] < image_bounds[this->SliceOrientation*2]) + offset = -1; + if (mVF && mVFActor->GetVisibility()) { int vfExtent[6]; mVF->GetVTKImages()[0]->UpdateInformation(); @@ -842,21 +861,24 @@ void vvSlicer::UpdateDisplayExtent() orientation[this->SliceOrientation] = 0; mGlyphFilter->SetOrientation(orientation[0], orientation[1], orientation[2]); mVFMapper->Update(); + + position[this->SliceOrientation] += offset; mVFActor->SetPosition(position); } - position[this->SliceOrientation] += positionInc; - + // Landmarks actor if (mLandActor) { if (mClipBox) { double bounds [6]; for(unsigned int i=0; i<6; i++) bounds[i] = ImageActor->GetBounds()[i]; - bounds[ this->SliceOrientation*2 ] = ImageActor->GetBounds()[ this->SliceOrientation*2 ]-fabs(0.5/this->GetInput()->GetSpacing()[this->SliceOrientation]); - bounds[ this->SliceOrientation*2+1 ] = ImageActor->GetBounds()[ this->SliceOrientation*2+1 ]+fabs(0.5/this->GetInput()->GetSpacing()[this->SliceOrientation]); + bounds[ this->SliceOrientation*2 ] = ImageActor->GetBounds()[ this->SliceOrientation*2 ]-fabs(this->GetInput()->GetSpacing()[this->SliceOrientation]); + bounds[ this->SliceOrientation*2+1 ] = ImageActor->GetBounds()[ this->SliceOrientation*2+1 ]+fabs(this->GetInput()->GetSpacing()[this->SliceOrientation]); mClipBox->SetBounds(bounds); UpdateLandmarks(); } + + position[this->SliceOrientation] = offset; mLandActor->SetPosition(position); } @@ -880,6 +902,7 @@ void vvSlicer::UpdateDisplayExtent() } } } + } //---------------------------------------------------------------------------- -- 2.47.1