Draw3DCursorStrokes();
+ if (m_Scene->m_CrossSectionConfig.IsFreeCut())
+ Draw3DCursorFreecutGuide();
+
glPopAttrib();
glPopMatrix();
}
glPopAttrib();
}
+void View3D::Draw3DCursorFreecutGuide(void)
+{
+ float len = 1.0f / m_Scene->m_WorldTransform.GetScale();
+ len *= 0.25f;
+
+ Cursor3D& cursor = m_Scene->m_Cursor3d;
+ const lm::vec3f& p = cursor.CursorPos;
+ const lm::quat4f& r = cursor.CutplaneRot;
+ glColor3d(1, 0, 0);
+ glDrawSegment(p, p + r.get_ex() * len);
+ glColor3d(0, 1, 0);
+ glDrawSegment(p, p + r.get_ey() * len);
+ glColor3d(0, 0, 1);
+ glDrawSegment(p, p + r.get_ez() * len);
+}
+
void View3D::Draw3DCursorBary(void)
{
const Cursor3D& cursor = m_Scene->m_Cursor3d;
m_CameraReverse = CheckCameraIsReverse();
}
- MouseMove_OnCursorControl(e);
+ MouseMove_OnCursorControl(e, QPointF(0, 0));
}
bool View3D::CheckCameraIsReverse(void) const
if ( MouseMove_OnUpdateCloseVert ( e , diff ) ) return;
if ( MouseMove_OnLightControl ( e , diff ) ) return;
if ( MouseMove_OnCameraControl ( e , diff ) ) return;
- if ( MouseMove_OnCursorControl ( e ) ) return;
+ if ( MouseMove_OnCursorControl ( e , diff ) ) return;
}
bool View3D::MouseMove_OnSelRange(QMouseEvent* e, QPointF& diff)
}
}
-bool View3D::MouseMove_OnCursorControl(QMouseEvent* e)
+bool View3D::MouseMove_OnCursorControl(QMouseEvent* e, QPointF& diff)
{
MouseButtons mouse(e);
Modifier m(e);
if (!cursor.ShowCursor)
return false;
- if (!m.IsShiftOnly())
- return false;
-
- bool ControlMeasure = false;
+ bool ControlCutAng = false;
+ if (m_Scene->m_CrossSectionConfig.IsFreeCut())
+ {
+ if (m.Flag_AS())
+ {
+ if (mouse.IsRightOnly() || mouse.IsLeftOnly())
+ ControlCutAng = true;
+ }
+ }
- if (cursor.ShowMeasure)
+ if (!ControlCutAng)
{
- if (mouse.IsRightOnly())
- ControlMeasure = true;
- else if (!mouse.IsLeftOnly())
+ if (!m.IsShiftOnly())
return false;
}
- else
+
+ bool ControlMeasure = false;
+
+ if (!ControlCutAng)
{
- if (!mouse.IsLeftOnly())
- return false;
+ if (cursor.ShowMeasure)
+ {
+ if (mouse.IsRightOnly())
+ ControlMeasure = true;
+ else if (!mouse.IsLeftOnly())
+ return false;
+ }
+ else
+ {
+ if (!mouse.IsLeftOnly())
+ return false;
+ }
}
double mx = e->localPos().x();
double my = e->localPos().y();
- if (ControlMeasure)
+ if (ControlCutAng)
+ {
+ const float speed = 5.0f;
+
+ float nx = diff.x() / m_Viewport.Width;
+ float ny = diff.y() / m_Viewport.Height;
+
+ lib_gl::CameraManipulator& manip = m_Camera.m_Manip;
+
+ const lm::vec3f& ax = manip.GetUp();
+ const lm::vec3f& ay = manip.GetBinormal();
+ const lm::vec3f& az = manip.GetFront();
+ if (mouse.IsLeftOnly())
+ {
+ cursor.CutplaneRot.mult_rotate(ax, nx * speed);
+ cursor.CutplaneRot.mult_rotate(ay, ny * speed);
+ }
+ else
+ {
+ cursor.CutplaneRot.mult_rotate(az, nx * speed);
+ }
+ }
+ else if (ControlMeasure)
{
cursor.ResetMeasure();
cursor.MeasurePos = Move3DCursor(cursor.MeasurePos, mx, my);
void Draw3DCursorCoord(const lm::vec3f& p);
void Draw3DCursorMeasure(void);
void Draw3DCursorStrokes(void);
+ void Draw3DCursorFreecutGuide(void);
void Draw3DCursorBary(void);
void DrawAllGeomCrossSection(void);
bool MouseMove_OnUpdateCloseVert (QMouseEvent* e, QPointF& diff);
bool MouseMove_OnCameraControl (QMouseEvent* e, QPointF& diff);
bool MouseMove_OnLightControl (QMouseEvent* e, QPointF& diff);
- bool MouseMove_OnCursorControl (QMouseEvent* e);
+ bool MouseMove_OnCursorControl (QMouseEvent* e, QPointF& diff);
lm::vec3f Move3DCursor(lm::vec3f& cp, double px, double py);