From 6810e20b3e4879090ec71a768fd90f84bf03522f Mon Sep 17 00:00:00 2001 From: Grant Karapetyan Date: Tue, 18 Oct 2022 17:59:48 +0400 Subject: [PATCH 1/3] Per Viewport xf for object transformation widget --- source/MRViewer/MRObjectTransformWidget.cpp | 40 +++++++++++++-------- source/MRViewer/MRObjectTransformWidget.h | 18 +++++----- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/source/MRViewer/MRObjectTransformWidget.cpp b/source/MRViewer/MRObjectTransformWidget.cpp index a20edcd810b8..61f0348bd800 100644 --- a/source/MRViewer/MRObjectTransformWidget.cpp +++ b/source/MRViewer/MRObjectTransformWidget.cpp @@ -244,14 +244,14 @@ void ObjectTransformWidget::setTransformMode( uint8_t mask ) updateVisualTransformMode_( transformModeMask_, visMask ); } -void ObjectTransformWidget::setControlsXf( const AffineXf3f &xf ) +void ObjectTransformWidget::setControlsXf( const AffineXf3f& xf, ViewportId id ) { - setControlsXf_( xf, true ); + setControlsXf_( xf, true, id ); } -AffineXf3f ObjectTransformWidget::getControlsXf() const +AffineXf3f ObjectTransformWidget::getControlsXf( ViewportId id ) const { - return controlsRoot_->xf(); + return controlsRoot_->xf( id ); } void ObjectTransformWidget::followObjVisibility( const std::weak_ptr& obj ) @@ -319,7 +319,7 @@ void ObjectTransformWidget::preDraw_() if ( thresholdDot_ > 0.0f ) { - const auto& xf = controlsRoot_->xf(); + const auto& xf = controlsRoot_->xf( vpId ); auto transformedCenter = xf( center_ ); auto vpPoint = getViewerInstance().viewport( vpId ).projectToViewportSpace( transformedCenter ); auto ray = getViewerInstance().viewport( vpId ).unprojectPixelRay( Vector2f( vpPoint.x, vpPoint.y ) ).d.normalized(); @@ -602,7 +602,7 @@ void ObjectTransformWidget::processScaling_( ObjectTransformWidget::Axis ax, boo auto& viewport = getViewerInstance().viewport(); auto viewportPoint = getViewerInstance().screenToViewport( Vector3f( float( mousePos.x ), float( mousePos.y ), 0.f ), viewport.id ); auto line = viewport.unprojectPixelRay( Vector2f( viewportPoint.x, viewportPoint.y ) ); - auto xf = controlsRoot_->xf(); + auto xf = controlsRoot_->xf( viewport.id ); auto newScaling = findClosestPointOfSkewLines( xf( translateLines_[int( ax )]->polyline()->points.vec_[0] ), xf( translateLines_[int( ax )]->polyline()->points.vec_[1] ), @@ -643,7 +643,7 @@ void ObjectTransformWidget::processTranslation_( Axis ax, bool press ) auto& viewport = getViewerInstance().viewport(); auto viewportPoint = getViewerInstance().screenToViewport( Vector3f( float( mousePos.x ), float( mousePos.y ), 0.f ), viewport.id ); auto line = viewport.unprojectPixelRay( Vector2f( viewportPoint.x, viewportPoint.y ) ); - auto xf = controlsRoot_->xf(); + auto xf = controlsRoot_->xf( viewport.id ); auto newTranslation = findClosestPointOfSkewLines( xf( translateLines_[int( ax )]->polyline()->points.vec_[0] ), xf( translateLines_[int( ax )]->polyline()->points.vec_[1] ), @@ -671,7 +671,7 @@ void ObjectTransformWidget::processRotation_( Axis ax, bool press ) auto viewportPoint = getViewerInstance().screenToViewport( Vector3f( float( mousePos.x ), float( mousePos.y ), 0.f ), viewport.id ); auto line = viewport.unprojectPixelRay( Vector2f( viewportPoint.x, viewportPoint.y ) ); - auto prevXf = controlsRoot_->xf(); + auto prevXf = controlsRoot_->xf( viewport.id ); auto zeroPoint = prevXf( rotateLines_[int( ax )]->polyline()->points.vec_[0] ); auto norm = prevXf.A * translateLines_[int( ax )]->polyline()->edgeVector( 0_e ); auto centerTransformed = prevXf( center_ ); @@ -739,19 +739,19 @@ void ObjectTransformWidget::processRotation_( Axis ax, bool press ) } -void ObjectTransformWidget::setControlsXf_( const AffineXf3f& xf, bool updateScaled ) +void ObjectTransformWidget::setControlsXf_( const AffineXf3f& xf, bool updateScaled, ViewportId id ) { if ( updateScaled ) - scaledXf_ = xf; + scaledXf_.set( xf, id ); Matrix3f rotation, scaling; - decomposeMatrix3( scaledXf_.A, rotation, scaling ); + decomposeMatrix3( scaledXf_.get( id ).A, rotation, scaling ); - auto scaledBoxDiagonal = scaledXf_.A * boxDiagonal_; + auto scaledBoxDiagonal = scaledXf_.get( id ).A * boxDiagonal_; float uniformScaling = scaledBoxDiagonal.length() / boxDiagonal_.length(); Vector3f invScaling{ 1.f / scaling.x.x, 1.f / scaling.y.y, 1.f / scaling.z.z }; approvedChange_ = true; - controlsRoot_->setXf( scaledXf_ * AffineXf3f::xfAround( Matrix3f::scale( invScaling ) * Matrix3f::scale( uniformScaling ), center_ ) ); + controlsRoot_->setXf( scaledXf_.get( id ) * AffineXf3f::xfAround( Matrix3f::scale( invScaling ) * Matrix3f::scale( uniformScaling ), center_ ), id ); approvedChange_ = false; } @@ -802,8 +802,18 @@ void ObjectTransformWidget::addXf_( const AffineXf3f& addXf ) if ( addXfCallback_ ) addXfCallback_( addXf ); - scaledXf_ = addXf * scaledXf_; - setControlsXf_( scaledXf_, false ); + auto& defaultXf = scaledXf_.get(); + scaledXf_.set( addXf * defaultXf ); + setControlsXf_( scaledXf_.get(), false ); + for ( auto vpId : ViewportMask::all() ) + { + bool isDef = false; + const auto& xf = scaledXf_.get( vpId, &isDef ); + if ( isDef ) + continue; + scaledXf_.set( addXf * xf, vpId ); + setControlsXf_( scaledXf_.get( vpId ), false, vpId ); + } approvedChange_ = false; } diff --git a/source/MRViewer/MRObjectTransformWidget.h b/source/MRViewer/MRObjectTransformWidget.h index 30c46adeec98..6573d183a0f9 100644 --- a/source/MRViewer/MRObjectTransformWidget.h +++ b/source/MRViewer/MRObjectTransformWidget.h @@ -76,8 +76,8 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListenerxf(); + xf_ = widget_.controlsRoot_->xfsForAllViewports(); scaledXf_ = widget_.scaledXf_; } } @@ -129,8 +129,8 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListenerxf(); - widget_.controlsRoot_->setXf( xf_ ); + auto tmpXf = widget_.controlsRoot_->xfsForAllViewports(); + widget_.controlsRoot_->setXfsForAllViewports( xf_ ); xf_ = tmpXf; std::swap( scaledXf_, widget_.scaledXf_ ); @@ -143,8 +143,8 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener xf_; + ViewportProperty scaledXf_; std::string name_; }; @@ -162,7 +162,7 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener visibilityParent_; std::shared_ptr currentObj_; @@ -209,7 +209,7 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListenerxf() but with non uniform scaling applied - AffineXf3f scaledXf_; + ViewportProperty scaledXf_; // this is needed for tooltip only float currentScaling_ = 1.0f; From e6736bcc120df00f69a619a6578c384bbcc9edd0 Mon Sep 17 00:00:00 2001 From: Grant Karapetyan Date: Tue, 18 Oct 2022 19:57:18 +0400 Subject: [PATCH 2/3] fix --- source/MRViewer/MRViewport.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/MRViewer/MRViewport.cpp b/source/MRViewer/MRViewport.cpp index 541f3436dfc4..a34757915097 100644 --- a/source/MRViewer/MRViewport.cpp +++ b/source/MRViewer/MRViewport.cpp @@ -165,12 +165,12 @@ std::vector Viewport::multiPickObjects( const std::vectorworldXf().inverse()( unprojectFromViewportSpace( Vector3f( viewportPoints[i].x, viewportPoints[i].y, pickRes.zBuffer ) ) ); + res.point = renderVector[pickRes.geomId]->worldXf( id ).inverse()( unprojectFromViewportSpace( Vector3f( viewportPoints[i].x, viewportPoints[i].y, pickRes.zBuffer ) ) ); } } else if ( auto linesObj = renderVector[pickRes.geomId]->asType() ) { - res.point = renderVector[pickRes.geomId]->worldXf().inverse()( unprojectFromViewportSpace( Vector3f( viewportPoints[i].x, viewportPoints[i].y, pickRes.zBuffer ) ) ); + res.point = renderVector[pickRes.geomId]->worldXf( id ).inverse()( unprojectFromViewportSpace( Vector3f( viewportPoints[i].x, viewportPoints[i].y, pickRes.zBuffer ) ) ); UndirectedEdgeId ue{ int( pickRes.primId ) }; if ( auto pl = linesObj->polyline() ) res.point = closestPointOnLineSegm( res.point, { pl->orgPnt( ue ), pl->destPnt( ue ) } ); @@ -186,7 +186,7 @@ std::vector Viewport::multiPickObjects( const std::vectorworldXf().inverse()( unprojectFromViewportSpace( Vector3f( viewportPoints[i].x, viewportPoints[i].y, pickRes.zBuffer ) ) ); + res.point = renderVector[pickRes.geomId]->worldXf( id ).inverse()( unprojectFromViewportSpace( Vector3f( viewportPoints[i].x, viewportPoints[i].y, pickRes.zBuffer ) ) ); if ( mesh ) { Vector3f a, b, c; From 60282b88082e16842e7b7dc0a5d34df0b837713e Mon Sep 17 00:00:00 2001 From: Grant Karapetyan Date: Wed, 19 Oct 2022 13:06:08 +0400 Subject: [PATCH 3/3] more fix --- source/MRViewer/MRViewportGL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/MRViewer/MRViewportGL.cpp b/source/MRViewer/MRViewportGL.cpp index adb76297f0b8..b854026bc9b2 100644 --- a/source/MRViewer/MRViewportGL.cpp +++ b/source/MRViewer/MRViewportGL.cpp @@ -479,7 +479,7 @@ std::vector ViewportGL::pickObjectsInRect_( const PickPar if ( !objPtr ) continue; auto& obj = *objPtr; - auto modelTemp = Matrix4f( obj.worldXf() ); + auto modelTemp = Matrix4f( obj.worldXf( params.viewportId ) ); obj.renderForPicker( { params.baseRenderParams.viewMatrixPtr, modelTemp.data(), params.baseRenderParams.projMatrixPtr ,nullptr, params.viewportId, params.clippingPlane,params.baseRenderParams.viewport }, i ); }