OSDN Git Service

任意方向断面の操作を改善 feature/NewFreeCrossSection
authorqw_fuku <fkhideaki@gmail.com>
Wed, 7 Oct 2015 15:35:33 +0000 (00:35 +0900)
committerqw_fuku <fkhideaki@gmail.com>
Wed, 7 Oct 2015 15:35:33 +0000 (00:35 +0900)
Src/QtGeoViewer/View3D.cpp
Src/QtGeoViewer/View3D.h

index 756e02f..c782a6e 100644 (file)
@@ -384,6 +384,9 @@ void View3D::Draw3DCursor(void)
 
        Draw3DCursorStrokes();
 
+       if (m_Scene->m_CrossSectionConfig.IsFreeCut())
+               Draw3DCursorFreecutGuide();
+
        glPopAttrib();
        glPopMatrix();
 }
@@ -511,6 +514,22 @@ void View3D::Draw3DCursorStrokes(void)
        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;
@@ -1704,7 +1723,7 @@ void View3D::OnMousePress(QMouseEvent *e)
                m_CameraReverse = CheckCameraIsReverse();
        }
 
-       MouseMove_OnCursorControl(e);
+       MouseMove_OnCursorControl(e, QPointF(0, 0));
 }
 
 bool View3D::CheckCameraIsReverse(void) const
@@ -1775,7 +1794,7 @@ void View3D::OnMouseMove(QMouseEvent *e)
        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)
@@ -1951,7 +1970,7 @@ void View3D::LockMouseMoveDir(Modifier& m, float& mx, float& my)
        }
 }
 
-bool View3D::MouseMove_OnCursorControl(QMouseEvent* e)
+bool View3D::MouseMove_OnCursorControl(QMouseEvent* e, QPointF& diff)
 {
        MouseButtons mouse(e);
        Modifier m(e);
@@ -1961,28 +1980,66 @@ bool View3D::MouseMove_OnCursorControl(QMouseEvent* 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);
index a49d6f6..175e8d5 100644 (file)
@@ -166,6 +166,7 @@ protected:
        void Draw3DCursorCoord(const lm::vec3f& p);
        void Draw3DCursorMeasure(void);
        void Draw3DCursorStrokes(void);
+       void Draw3DCursorFreecutGuide(void);
        void Draw3DCursorBary(void);
 
        void DrawAllGeomCrossSection(void);
@@ -186,7 +187,7 @@ protected:
        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);