Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 25 additions & 15 deletions source/MRViewer/MRObjectTransformWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object>& obj )
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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] ),
Expand Down Expand Up @@ -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] ),
Expand Down Expand Up @@ -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_ );
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down
18 changes: 9 additions & 9 deletions source/MRViewer/MRObjectTransformWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListe
// Changes controls xf (controls will affect object in basis of new xf)
// note that rotation is applied around 0 coordinate in world space, so use xfAround to process rotation around user defined center
// non-uniform scale will be converted to uniform one based on initial box diagonal
MRVIEWER_API void setControlsXf( const AffineXf3f& xf );
MRVIEWER_API AffineXf3f getControlsXf() const;
MRVIEWER_API void setControlsXf( const AffineXf3f& xf, ViewportId id = {} );
MRVIEWER_API AffineXf3f getControlsXf( ViewportId id = {} ) const;

// Returns threshold dot value (this value is duty for hiding widget controls that have small projection on screen)
float getThresholdDot() const { return thresholdDot_; }
Expand Down Expand Up @@ -115,7 +115,7 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListe
{
if ( widget_.controlsRoot_ )
{
xf_ = widget_.controlsRoot_->xf();
xf_ = widget_.controlsRoot_->xfsForAllViewports();
scaledXf_ = widget_.scaledXf_;
}
}
Expand All @@ -129,8 +129,8 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListe
{
if ( !widget_.controlsRoot_ )
return;
auto tmpXf = widget_.controlsRoot_->xf();
widget_.controlsRoot_->setXf( xf_ );
auto tmpXf = widget_.controlsRoot_->xfsForAllViewports();
widget_.controlsRoot_->setXfsForAllViewports( xf_ );
xf_ = tmpXf;

std::swap( scaledXf_, widget_.scaledXf_ );
Expand All @@ -143,8 +143,8 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListe

private:
ObjectTransformWidget& widget_;
AffineXf3f xf_;
AffineXf3f scaledXf_;
ViewportProperty<AffineXf3f> xf_;
ViewportProperty<AffineXf3f> scaledXf_;
std::string name_;
};

Expand All @@ -162,7 +162,7 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListe
void processTranslation_( Axis ax, bool press );
void processRotation_( Axis ax, bool press );

void setControlsXf_( const AffineXf3f& xf, bool updateScaled );
void setControlsXf_( const AffineXf3f& xf, bool updateScaled, ViewportId id = {} );

std::weak_ptr<Object> visibilityParent_;
std::shared_ptr<ObjectMesh> currentObj_;
Expand Down Expand Up @@ -209,7 +209,7 @@ class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListe
// it is needed to correctly convert non-uniform scaling to uniform one and apply it to this widget
Vector3f boxDiagonal_;
// same as controlsRoot_->xf() but with non uniform scaling applied
AffineXf3f scaledXf_;
ViewportProperty<AffineXf3f> scaledXf_;
// this is needed for tooltip only
float currentScaling_ = 1.0f;

Expand Down
6 changes: 3 additions & 3 deletions source/MRViewer/MRViewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,12 +165,12 @@ std::vector<ObjAndPick> Viewport::multiPickObjects( const std::vector<VisualObje
}
else
{
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 ) ) );
}
}
else if ( auto linesObj = renderVector[pickRes.geomId]->asType<ObjectLinesHolder>() )
{
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 ) } );
Expand All @@ -186,7 +186,7 @@ std::vector<ObjAndPick> Viewport::multiPickObjects( const std::vector<VisualObje
continue;
}

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 ) ) );
if ( mesh )
{
Vector3f a, b, c;
Expand Down
2 changes: 1 addition & 1 deletion source/MRViewer/MRViewportGL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ std::vector<ViewportGL::PickColor> 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 );
}
Expand Down