Skip to content

Commit 953cb2c

Browse files
authored
Move by Mouse impl customizations (#5369)
* Move by Mouse impl customizations * add comment
1 parent 5464053 commit 953cb2c

2 files changed

Lines changed: 25 additions & 22 deletions

File tree

source/MRViewer/MRMoveObjectByMouseImpl.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ void MoveObjectByMouseImpl::onDrawDialog() const
7272
if ( transformMode_ != TransformMode::None )
7373
{
7474
auto drawList = ImGui::GetBackgroundDrawList();
75+
UI::LineAntialiasingDisabler ds( *drawList );
7576
drawList->AddPolyline( visualizeVectors_.data(), int( visualizeVectors_.size() ),
7677
SceneColors::get( SceneColors::Labels ).getUInt32(), ImDrawFlags_None, 1.f );
7778
}
@@ -136,19 +137,17 @@ bool MoveObjectByMouseImpl::onMouseDown( MouseButton button, int modifiers )
136137
clear_(); // stop mouse dragging if the transformation was changed from outside (e.g. undo)
137138
} ) );
138139
}
140+
referencePlane_ = calcControlPlane_( viewport, viewportCenterPoint, xfCenterPoint_ );
139141

140-
if ( transformMode_ == TransformMode::Rotation || transformMode_ == TransformMode::UniformScale || transformMode_ == TransformMode::NonUniformScale )
141-
{
142-
Line3f centerAxis = viewport.unprojectPixelRay( Vector2f( viewportCenterPoint.x, viewportCenterPoint.y ) );
143-
referencePlane_ = Plane3f::fromDirAndPt( centerAxis.d.normalized(), xfCenterPoint_ );
142+
Line3f startAxis = viewport.unprojectPixelRay( Vector2f( viewportStartPoint.x, viewportStartPoint.y ) );
144143

145-
Line3f startAxis = viewport.unprojectPixelRay( Vector2f( viewportStartPoint.x, viewportStartPoint.y ) );
146-
147-
if ( auto crossPL = intersection( referencePlane_, startAxis ) )
148-
worldStartPoint_ = *crossPL;
149-
else
150-
spdlog::warn( "Bad cross start axis and rotation plane" );
144+
if ( auto crossPL = intersection( referencePlane_, startAxis ) )
145+
worldStartPoint_ = *crossPL;
146+
else
147+
spdlog::warn( "Bad cross start axis and control plane" );
151148

149+
if ( transformMode_ == TransformMode::Rotation || transformMode_ == TransformMode::UniformScale || transformMode_ == TransformMode::NonUniformScale )
150+
{
152151
setVisualizeVectors_( { xfCenterPoint_, worldStartPoint_, xfCenterPoint_, worldStartPoint_ } );
153152
}
154153
else // if ( transformMode_ == TransformMode::Translation )
@@ -173,14 +172,14 @@ bool MoveObjectByMouseImpl::onMouseMove( int x, int y )
173172
auto viewportEnd = viewer.screenToViewport( Vector3f( float( x ), float( y ), 0.f ), viewport.id );
174173
auto worldEndPoint = viewport.unprojectFromViewportSpace( { viewportEnd.x, viewportEnd.y, viewportStartPointZ_ } );
175174

175+
auto endAxis = viewport.unprojectPixelRay( Vector2f( viewportEnd.x, viewportEnd.y ) );
176+
if ( auto crossPL = intersection( referencePlane_, endAxis ) )
177+
worldEndPoint = *crossPL;
178+
else
179+
spdlog::warn( "Bad cross end axis and control plane" );
180+
176181
if ( transformMode_ == TransformMode::Rotation )
177182
{
178-
auto endAxis = viewport.unprojectPixelRay( Vector2f( viewportEnd.x, viewportEnd.y ) );
179-
if ( auto crossPL = intersection( referencePlane_, endAxis ) )
180-
worldEndPoint = *crossPL;
181-
else
182-
spdlog::warn( "Bad cross end axis and rotation plane" );
183-
184183
const Vector3f vectorStart = worldStartPoint_ - xfCenterPoint_;
185184
const Vector3f vectorEnd = worldEndPoint - xfCenterPoint_;
186185
const float abSquare = vectorStart.length() * vectorEnd.length();
@@ -199,12 +198,6 @@ bool MoveObjectByMouseImpl::onMouseMove( int x, int y )
199198
}
200199
else if ( transformMode_ == TransformMode::UniformScale || transformMode_ == TransformMode::NonUniformScale )
201200
{
202-
auto endAxis = viewport.unprojectPixelRay( Vector2f( viewportEnd.x, viewportEnd.y ) );
203-
if ( auto crossPL = intersection( referencePlane_, endAxis ) )
204-
worldEndPoint = *crossPL;
205-
else
206-
spdlog::warn( "Bad cross end axis and rotation plane" );
207-
208201
const Vector3f vectorStart = worldStartPoint_ - xfCenterPoint_;
209202
const Vector3f vectorEnd = worldEndPoint - xfCenterPoint_;
210203
scale_ = vectorStart.lengthSq() < 1.0e-7f ? 1.0f :
@@ -341,6 +334,12 @@ void MoveObjectByMouseImpl::setCenterPoint_( const std::vector<std::shared_ptr<O
341334
centerPoint = box.valid() ? box.center() : Vector3f{};
342335
}
343336

337+
Plane3f MoveObjectByMouseImpl::calcControlPlane_( const Viewport& vp, const Vector3f& viewportCenterPoint, const Vector3f& xfCenterPoint ) const
338+
{
339+
Line3f centerAxis = vp.unprojectPixelRay( Vector2f( viewportCenterPoint.x, viewportCenterPoint.y ) );
340+
return Plane3f::fromDirAndPt( centerAxis.d.normalized(), xfCenterPoint );
341+
}
342+
344343
Box3f MoveObjectByMouseImpl::getBbox_( const std::vector<std::shared_ptr<Object>>& objects ) const
345344
{
346345
Box3f worldBbox;

source/MRViewer/MRMoveObjectByMouseImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ class MRVIEWER_CLASS MoveObjectByMouseImpl
8585
/// `centerPoint` - a point that will be used as center of rotation/scaling in world space
8686
MRVIEWER_API virtual void setCenterPoint_( const std::vector<std::shared_ptr<Object>>& objects, Vector3f& centerPoint ) const;
8787

88+
/// override this function to customize plane in which all movement will happen
89+
/// default: screen plane moved to `xfCenterPoint`
90+
MRVIEWER_API virtual Plane3f calcControlPlane_( const Viewport& vp, const Vector3f& viewportCenterPoint, const Vector3f& xfCenterPoint ) const;
91+
8892
/// Helper function to calculate world bounding box for several objects
8993
/// Note: can be invalid (feature objects give an invalid box etc.)
9094
MRVIEWER_API Box3f getBbox_( const std::vector<std::shared_ptr<Object>>& objects ) const;

0 commit comments

Comments
 (0)