diff --git a/Modules/Core/include/mitkPointSetVtkMapper2D.h b/Modules/Core/include/mitkPointSetVtkMapper2D.h index e447f6fe58..f476acf75e 100644 --- a/Modules/Core/include/mitkPointSetVtkMapper2D.h +++ b/Modules/Core/include/mitkPointSetVtkMapper2D.h @@ -207,6 +207,9 @@ namespace mitk * displayed e.g. toggle visiblity of the propassembly */ void ResetMapper(BaseRenderer *renderer) override; + /** \brief Determine a renderer's resolution in mm per screen pixel. */ + double GetScreenResolution(const mitk::BaseRenderer *renderer) const; + /* \brief Fills the vtk objects, thus it is only called when the point set has been changed. * This function iterates over the input point set and determines the glyphs which lie in a specific * range around the current slice. Those glyphs are rendered using a specific shape defined in vtk glyph source @@ -233,6 +236,7 @@ namespace mitk int m_IDShapeProperty; // ID for mitkPointSetShape Enumeration Property "Pointset.2D.shape" bool m_FillShape; // "Pointset.2D.fill shape" property float m_DistanceToPlane; // "Pointset.2D.distance to plane" property + bool m_FixedSizeOnScreen; // "Pointset.2D.fixed size on screen" property }; } // namespace mitk diff --git a/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp b/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp index 81ad158b38..8f5441d357 100644 --- a/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp +++ b/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp @@ -109,7 +109,8 @@ mitk::PointSetVtkMapper2D::PointSetVtkMapper2D() m_Point2DSize(6), m_IDShapeProperty(mitk::PointSetShapeProperty::CROSS), m_FillShape(false), - m_DistanceToPlane(4.0f) + m_DistanceToPlane(4.0f), + m_FixedSizeOnScreen(false) { } @@ -272,6 +273,7 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende mitk::Point2D preLastPt2d = pt2d; // projected_p in display coordinates before lastPt2 const mitk::PlaneGeometry *geo2D = renderer->GetCurrentWorldPlaneGeometry(); + double resolution = this->GetScreenResolution(renderer); vtkLinearTransform *dataNodeTransform = input->GetGeometry()->GetVtkTransform(); @@ -306,6 +308,11 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende // compute distance to current plane float dist = geo2D->Distance(point); + // measure distance in screen pixel units if requested + if (m_FixedSizeOnScreen) + { + dist /= resolution; + } // draw markers on slices a certain distance away from the points // location according to the tolerance threshold (m_DistanceToPlane) @@ -316,13 +323,15 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende { ls->m_SelectedPoints->InsertNextPoint(point[0], point[1], point[2]); // point is scaled according to its distance to the plane - ls->m_SelectedScales->InsertNextTuple3(std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0); + ls->m_SelectedScales->InsertNextTuple3( + std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0); } else { ls->m_UnselectedPoints->InsertNextPoint(point[0], point[1], point[2]); // point is scaled according to its distance to the plane - ls->m_UnselectedScales->InsertNextTuple3(std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0); + ls->m_UnselectedScales->InsertNextTuple3( + std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0); } //---- LABEL -----// @@ -531,6 +540,10 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende // apply transform of current plane to glyphs ls->m_UnselectedGlyph3D->SetSourceConnection(transformFilterU->GetOutputPort()); ls->m_UnselectedGlyph3D->SetInputData(ls->m_VtkUnselectedPointListPolyData); + if (m_FixedSizeOnScreen) + { + ls->m_UnselectedGlyph3D->SetScaleFactor(resolution); + } ls->m_UnselectedGlyph3D->SetScaleModeToScaleByVector(); ls->m_UnselectedGlyph3D->SetVectorModeToUseVector(); @@ -557,6 +570,10 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende // apply transform of current plane to glyphs ls->m_SelectedGlyph3D->SetSourceConnection(transformFilterS->GetOutputPort()); ls->m_SelectedGlyph3D->SetInputData(ls->m_VtkSelectedPointListPolyData); + if (m_FixedSizeOnScreen) + { + ls->m_SelectedGlyph3D->SetScaleFactor(resolution); + } ls->m_SelectedGlyph3D->SetScaleModeToScaleByVector(); ls->m_SelectedGlyph3D->SetVectorModeToUseVector(); @@ -614,6 +631,7 @@ void mitk::PointSetVtkMapper2D::GenerateDataForRenderer(mitk::BaseRenderer *rend } node->GetBoolProperty("Pointset.2D.fill shape", m_FillShape, renderer); node->GetFloatProperty("Pointset.2D.distance to plane", m_DistanceToPlane, renderer); + node->GetBoolProperty("Pointset.2D.fixed size on screen", m_FixedSizeOnScreen, renderer); mitk::PointSetShapeProperty::Pointer shape = dynamic_cast(this->GetDataNode()->GetProperty("Pointset.2D.shape", renderer)); @@ -747,3 +765,21 @@ void mitk::PointSetVtkMapper2D::SetDefaultProperties(mitk::DataNode *node, mitk: Superclass::SetDefaultProperties(node, renderer, overwrite); } + +double mitk::PointSetVtkMapper2D::GetScreenResolution( + const mitk::BaseRenderer *renderer) const +{ + Point2D pD1, pD2; + pD1[0] = 0; + pD1[1] = 0; + pD2[0] = 0; + pD2[1] = 1; + + // Calculate world coordinates of in-plane screen pixels (0, 0) and (0, 1). + Point3D pW1, pW2; + renderer->DisplayToWorld(pD1, pW1); + renderer->DisplayToWorld(pD2, pW2); + + // For 2D renderers, the distance between these points is the screen resolution. + return pW1.EuclideanDistanceTo(pW2); +}