예제 #1
0
        private void DrawCanvas(CanvasContext canvasCtx)
        {
            var size = canvasCtx.GetRealSize(width, height - toolBarHeight);

            if (Event.current.type == EventType.Repaint)
            {
                GL.PushMatrix();
                CreateLineMaterial();
                lineMaterial.SetPass(0);
                GL.LoadIdentity();
                GL.MultMatrix(canvasCtx.GetTRSMatrix(size));
                var p1 = canvasCtx.GetLocalPos(new Vector2(0, 1), size);
                var p2 = canvasCtx.GetLocalPos(new Vector2(1, 0), size);
                GLHelper.DrawGrid(100, new Rect(p1, p2 - p1));
                OnDrawCanvas(canvasCtx);
                if (canvasCtx.m_isDrawSelection)
                {
                    if (canvasCtx.m_dragStartPosition != canvasCtx.m_curLocalPosition)
                    {
                        GLHelper.DrawRectSolid(canvasCtx.m_dragStartPosition, canvasCtx.m_curLocalPosition, new Color(0, 0, 0, 0.5f));
                    }
                }
                GL.PopMatrix();
            }
        }
 private void TryDelete(CanvasContext canvasCtx)
 {
     foreach (var element in new List <CanvasElementBase>(canvasCtx.m_selectedElements))
     {
         if (element is Point)
         {
             m_wayPointsData.RemovePoint(element as Point);
         }
         else if (element is Edge)
         {
             m_wayPointsData.RemoveEdge(element as Edge);
         }
     }
     canvasCtx.ClearAllSelected();
 }
 protected override void OnDrawCanvas(CanvasContext canvasCtx)
 {
     base.OnDrawCanvas(canvasCtx);
     foreach (var point in m_wayPointsData.m_points)
     {
         point.Draw(canvasCtx.IsSelected(point) ? Color.red : Color.blue);
     }
     foreach (var edge in m_wayPointsData.m_edges)
     {
         edge.Draw(canvasCtx.IsSelected(edge) ? Color.red : Color.blue);
     }
     if (m_mode == WayPointsEMode.AddEdge)
     {
         GLHelper.DrawLine(m_edgeStart.m_position, canvasCtx.m_curLocalPosition, m_addEdgeColor);
     }
 }
예제 #4
0
 public void InitSubAreaContext()
 {
     if (m_isInited)
     {
         return;
     }
     foreach (var subAreaDef in layoutDef)
     {
         if (subAreaDef.m_isCanvas)
         {
             CanvasContext canvasContext = new CanvasContext(subAreaDef);
             if (m_defaultCanvasCtx == null)
             {
                 m_defaultCanvasCtx = canvasContext;
             }
             m_subAreaContexts.Add(subAreaDef.m_id, canvasContext);
         }
         else
         {
             m_subAreaContexts.Add(subAreaDef.m_id, new SubAreaContext(subAreaDef));
         }
     }
     m_isInited = true;
 }
예제 #5
0
 protected virtual void OnDrawCanvas(CanvasContext canvasCtx)
 {
 }
예제 #6
0
 protected virtual void ProcessEventInCanvas(CanvasContext canvasCtx)
 {
     canvasCtx.m_curLocalPosition = canvasCtx.GetLocalPos(canvasCtx.m_curMouseNormalizePosition, canvasCtx.GetRealSize(width, height - toolBarHeight));
     //鼠标中键拖动视图
     if (Event.current.type == EventType.MouseDrag && Event.current.button == 2)
     {
         canvasCtx.m_offset += Event.current.delta;
         Repaint();
     }
     //鼠标滚轮缩放视图
     if (Event.current.type == EventType.ScrollWheel)
     {
         canvasCtx.scale += Event.current.delta.y * -0.01f;
         Repaint();
     }
     //选择和移动逻辑
     //按下鼠标左键
     if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
     {
         var clickElement = canvasCtx.TestPoint(canvasCtx.m_curLocalPosition);
         canvasCtx.m_dragStartPosition = canvasCtx.m_curLocalPosition;
         if (clickElement == null)
         {
             //开始绘制选区
             canvasCtx.ClearAllSelected();
             canvasCtx.m_isDrawSelection = true;
             Repaint();
         }
         else
         {
             if (!canvasCtx.IsSelected(clickElement))
             {
                 canvasCtx.ClearAllSelected();
                 canvasCtx.AddSelected(clickElement);
             }
             //开始拖动物体
             canvasCtx.m_isDragElement = true;
             foreach (var element in canvasCtx.m_selectedElements)
             {
                 if (element.canDrag)
                 {
                     element.m_dragStartPosition = element.position;
                 }
             }
             Repaint();
         }
     }
     //鼠标左键拖动
     if (Event.current.type == EventType.MouseDrag && Event.current.button == 0)
     {
         if (canvasCtx.m_isDragElement)
         {
             foreach (var element in canvasCtx.m_selectedElements)
             {
                 if (element.canDrag)
                 {
                     element.position = element.m_dragStartPosition + (canvasCtx.m_curLocalPosition - canvasCtx.m_dragStartPosition);
                 }
             }
             Repaint();
         }
     }
     //松开鼠标左键
     if (Event.current.type == EventType.MouseUp && Event.current.button == 0)
     {
         //结束绘制选区,根据画出的选取选择对象
         if (canvasCtx.m_isDrawSelection == true)
         {
             canvasCtx.m_isDrawSelection = false;
             var selections = canvasCtx.TestRect(canvasCtx.m_dragStartPosition, canvasCtx.m_curLocalPosition);
             canvasCtx.ClearAllSelected();
             canvasCtx.AddSelected(selections);
             Repaint();
         }
         else if (canvasCtx.m_isDragElement)
         {
             canvasCtx.m_isDragElement = false;
         }
     }
 }
 protected override void ProcessEventInCanvas(CanvasContext canvasCtx)
 {
     base.ProcessEventInCanvas(canvasCtx);
     if (m_mode == WayPointsEMode.None)
     {
         if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
         {
             //双击边改变方向
             var element = canvasCtx.TestPoint(canvasCtx.m_curLocalPosition);
             if (element != null)
             {
                 if (element is Edge && element == m_lastClickElement)
                 {
                     if (m_frameCount - m_lastClickFrame < 40)
                     {
                         m_lastClickFrame = m_frameCount;
                         (element as Edge).ChangeDir();
                     }
                 }
                 m_lastClickFrame = m_frameCount;
                 Debug.Log(m_lastClickFrame);
                 m_lastClickElement = element;
             }
             //添加点
             if (Event.current.control)
             {
                 m_wayPointsData.AddPoint(canvasCtx.m_curLocalPosition);
             }
         }
         if (Event.current.type == EventType.MouseDown && Event.current.button == 1)
         {
             //在点上点击鼠标右键开始添加边
             var element = canvasCtx.TestPoint(canvasCtx.m_curLocalPosition);
             if (element != null && element is Point)
             {
                 m_edgeStart = element as Point;
                 m_mode      = WayPointsEMode.AddEdge;
             }
         }
         //删除所选
         if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Delete)
         {
             TryDelete(canvasCtx);
         }
     }
     else if (m_mode == WayPointsEMode.AddEdge)
     {
         var  element    = canvasCtx.TestPoint(canvasCtx.m_curLocalPosition);
         bool canAddEdge = element != null && element is Point && element != m_edgeStart && !m_wayPointsData.ContainEdge(m_edgeStart, element as Point);
         if (canAddEdge)
         {
             m_addEdgeColor = Color.green;
         }
         else
         {
             m_addEdgeColor = Color.red;
         }
         //松开鼠标右键添加边
         if (Event.current.type == EventType.MouseUp && Event.current.button == 1)
         {
             if (canAddEdge)
             {
                 m_wayPointsData.AddEdge(m_edgeStart as Point, element as Point);
             }
             m_mode = WayPointsEMode.None;
         }
         else if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
         {
             //添加点自动连成边,并继续添加边
             var node = m_wayPointsData.AddPoint(canvasCtx.m_curLocalPosition);
             m_wayPointsData.AddEdge(m_edgeStart as Point, node);
             m_edgeStart = node;
         }
     }
 }