@@ -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+
344343Box3f MoveObjectByMouseImpl::getBbox_ ( const std::vector<std::shared_ptr<Object>>& objects ) const
345344{
346345 Box3f worldBbox;
0 commit comments