Skip to content

Commit

Permalink
BUG: Fix volume rendered image position after cropping
Browse files Browse the repository at this point in the history
When a volume-rendered image was cropped then its position shifted incorrectly.
The problem was that volume modified event did not trigger transformation recomputation.

svn-url: http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=28493
git-svn-id: http://svn.slicer.org/Slicer4/trunk@28493 3bd1e089-480b-0410-8dfb-8563597acbee
  • Loading branch information
lassoan committed Sep 11, 2019
1 parent 478bc07 commit d287bbb
Showing 1 changed file with 13 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ class vtkMRMLVolumeRenderingDisplayableManager::vtkInternal
void RemoveVolumeNode(vtkMRMLVolumeNode* displayableNode);

// Transforms
void UpdatePipelineTransforms(vtkMRMLVolumeNode *node);
bool UpdatePipelineTransforms(vtkMRMLVolumeNode *node); // return with true if pipelines may have changed
bool GetVolumeTransformToWorld(vtkMRMLVolumeNode* node, vtkMatrix4x4* ijkToWorldMatrix);

// ROIs
Expand Down Expand Up @@ -533,12 +533,13 @@ void vtkMRMLVolumeRenderingDisplayableManager::vtkInternal::RemoveDisplayNode(vt
}

//---------------------------------------------------------------------------
void vtkMRMLVolumeRenderingDisplayableManager::vtkInternal::UpdatePipelineTransforms(vtkMRMLVolumeNode* volumeNode)
bool vtkMRMLVolumeRenderingDisplayableManager::vtkInternal::UpdatePipelineTransforms(vtkMRMLVolumeNode* volumeNode)
{
// Update the pipeline for all tracked DisplayableNode
PipelinesCacheType::iterator pipelineIt;
std::set< vtkMRMLVolumeRenderingDisplayNode* > displayNodes = this->VolumeToDisplayNodes[volumeNode];
std::set< vtkMRMLVolumeRenderingDisplayNode* >::iterator displayNodeIt;
bool pipelineModified = false;
for (displayNodeIt = displayNodes.begin(); displayNodeIt != displayNodes.end(); displayNodeIt++)
{
if (((pipelineIt = this->DisplayPipelines.find(*displayNodeIt)) != this->DisplayPipelines.end()))
Expand All @@ -550,8 +551,10 @@ void vtkMRMLVolumeRenderingDisplayableManager::vtkInternal::UpdatePipelineTransf
// Calculate and apply transform matrix
this->GetVolumeTransformToWorld(volumeNode, currentPipeline->IJKToWorldMatrix);
currentPipeline->VolumeActor->SetUserMatrix(currentPipeline->IJKToWorldMatrix.GetPointer());
pipelineModified = false;
}
}
return pipelineModified;
}

//---------------------------------------------------------------------------
Expand Down Expand Up @@ -1271,11 +1274,15 @@ void vtkMRMLVolumeRenderingDisplayableManager::ProcessMRMLNodesEvents(vtkObject*
}
}
else if ( (event == vtkMRMLDisplayableNode::TransformModifiedEvent)
|| (event == vtkMRMLTransformableNode::TransformModifiedEvent) )
|| (event == vtkMRMLTransformableNode::TransformModifiedEvent)
|| (event == vtkCommand::ModifiedEvent))
{
this->Internal->UpdatePipelineTransforms(volumeNode);
// ROI must not be reset, as it would make it impossible to replay clipped volume sequences
this->RequestRender();
// Parent transforms, volume origin, etc. changed, so we need to recompute transforms
if (this->Internal->UpdatePipelineTransforms(volumeNode))
{
// ROI must not be reset here, as it would make it impossible to replay clipped volume sequences
this->RequestRender();
}
}
else if (event == vtkMRMLScalarVolumeNode::ImageDataModifiedEvent)
{
Expand Down

0 comments on commit d287bbb

Please sign in to comment.