Ejemplo n.º 1
0
        /// <summary>
        /// Draws single control point</summary>
        /// <param name="prevTanType">Previous CurveTangentTypes</param>
        /// <param name="cp">Control point</param>
        /// <param name="g">Graphics object</param>
        private void DrawControlPoint(CurveTangentTypes prevTanType, IControlPoint cp, Graphics g)
        {
            Vec2F p = m_canvas.GraphToClient(cp.X, cp.Y);

            PointSelectionRegions region = cp.EditorData.SelectedRegion;

            if (region != PointSelectionRegions.None)
            {
                if (prevTanType != CurveTangentTypes.Stepped && prevTanType != CurveTangentTypes.SteppedNext)
                {
                    Vec2F tangIn = Vec2F.Normalize(m_canvas.GraphToClientTangent(cp.TangentIn));
                    tangIn.X = -tangIn.X;
                    tangIn.Y = -tangIn.Y;
                    Color color = region == PointSelectionRegions.TangentIn?
                                  SelectedTangentColor :
                                  cp.BrokenTangents ? TangentInColor : TangentColor;
                    DrawArrow(p, p + tangIn * m_tangentLength, g, color);
                }

                if (cp.TangentOutType != CurveTangentTypes.Stepped && cp.TangentOutType != CurveTangentTypes.SteppedNext)
                {
                    Color color = region == PointSelectionRegions.TangentOut ?
                                  SelectedTangentColor : cp.BrokenTangents ? TangentOutColor : TangentColor;
                    Vec2F tangOut = Vec2F.Normalize(m_canvas.GraphToClientTangent(cp.TangentOut));
                    DrawArrow(p, p + tangOut * m_tangentLength, g, color);
                }
            }

            RectangleF pointRect     = new RectangleF();
            float      halfPointSize = m_pointSize / 2;

            pointRect.X      = p.X - halfPointSize;
            pointRect.Y      = p.Y - halfPointSize;
            pointRect.Width  = m_pointSize;
            pointRect.Height = m_pointSize;
            if (region == PointSelectionRegions.Point)
            {
                g.FillRectangle(m_pointHiBrush, pointRect);
            }
            else
            {
                g.FillRectangle(m_pointBrush, pointRect);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Draws all the control points for the given curve</summary>
        /// <param name="curve">Curve</param>
        /// <param name="g">Graphics object</param>
        public void DrawControlPoints(ICurve curve, Graphics g)
        {
            ReadOnlyCollection <IControlPoint> points = curve.ControlPoints;
            int leftIndex;
            int rightIndex;

            ComputeIndices(curve, out leftIndex, out rightIndex);

            if (curve.CurveInterpolation == InterpolationTypes.Linear)
            {
                for (int i = leftIndex; i <= rightIndex; i++)
                {
                    IControlPoint pt            = points[i];
                    Vec2F         cpt           = m_canvas.GraphToClient(pt.X, pt.Y);
                    RectangleF    pointRect     = new RectangleF();
                    float         halfPointSize = m_pointSize / 2;
                    pointRect.X      = cpt.X - halfPointSize;
                    pointRect.Y      = cpt.Y - halfPointSize;
                    pointRect.Width  = m_pointSize;
                    pointRect.Height = m_pointSize;
                    if (pt.EditorData.SelectedRegion == PointSelectionRegions.Point)
                    {
                        g.FillRectangle(m_pointHiBrush, pointRect);
                    }
                    else
                    {
                        g.FillRectangle(m_pointBrush, pointRect);
                    }
                }
            }
            else
            {
                for (int i = leftIndex; i <= rightIndex; i++)
                {
                    CurveTangentTypes prevTanType = (i == 0) ? CurveTangentTypes.Flat :
                                                    points[i - 1].TangentOutType;
                    DrawControlPoint(prevTanType, points[i], g);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Applies CurveTangentTypes to all selected tangents for all selected control points</summary>        
        public void SetTangent(TangentSelection selectedTan, CurveTangentTypes tanType)
        {
            if (m_selection.Count == 0 || selectedTan == TangentSelection.None)
                return;
            if (selectedTan == TangentSelection.TangentIn)
            {
                if (tanType != CurveTangentTypes.Stepped && tanType != CurveTangentTypes.SteppedNext)
                {
                    m_transactionContext.DoTransaction(delegate
                    {
                        foreach (IControlPoint cpt in m_selection)
                        {
                            if (cpt.Parent.CurveInterpolation == InterpolationTypes.Linear)
                                continue;
                            if (cpt.EditorData.SelectedRegion == PointSelectionRegions.Point
                                || cpt.EditorData.SelectedRegion == PointSelectionRegions.TangentIn)
                                cpt.TangentInType = tanType;
                        }
                        // recompute tangents for the selected curves
                        ReComputeTangents();
                    }, "Edit Tangent".Localize()
                    );
                }
            }
            else if (selectedTan == TangentSelection.TangentOut)
            {
                m_transactionContext.DoTransaction(delegate
                {
                    foreach (IControlPoint cpt in m_selection)
                    {
                        if (cpt.Parent.CurveInterpolation == InterpolationTypes.Linear)
                            continue;
                        if (cpt.EditorData.SelectedRegion == PointSelectionRegions.Point
                            || cpt.EditorData.SelectedRegion == PointSelectionRegions.TangentOut)
                            cpt.TangentOutType = tanType;
                    }
                    // recompute tangents for the selected curves
                    ReComputeTangents();

                },"Edit Tangent".Localize()
                );
            }
            else if (selectedTan == TangentSelection.TangentInOut)
            {
                m_transactionContext.DoTransaction(delegate
                {
                    foreach (IControlPoint cpt in m_selection)
                    {
                        if (cpt.Parent.CurveInterpolation == InterpolationTypes.Linear)
                            continue;

                        if (cpt.EditorData.SelectedRegion == PointSelectionRegions.Point)
                        {
                            if (tanType != CurveTangentTypes.Stepped && tanType != CurveTangentTypes.SteppedNext)
                                cpt.TangentInType = tanType;
                            cpt.TangentOutType = tanType;
                        }
                        else if (cpt.EditorData.SelectedRegion == PointSelectionRegions.TangentIn)
                        {
                            if (tanType != CurveTangentTypes.Stepped && tanType != CurveTangentTypes.SteppedNext)
                                cpt.TangentInType = tanType;
                        }
                        else if (cpt.EditorData.SelectedRegion == PointSelectionRegions.TangentOut)
                        {
                            cpt.TangentOutType = tanType;
                        }
                    }
                    // recompute tangents for the selected curves
                    ReComputeTangents();

                }, "Edit Tangent".Localize()
                );
            }            
            Invalidate();
        }
Ejemplo n.º 4
0
 private bool IsImplemented(CurveTangentTypes tanType)
 {
     bool result = false;
     switch (tanType)
     {
         case CurveTangentTypes.Linear:
         case CurveTangentTypes.Spline:
         case CurveTangentTypes.Flat:
         case CurveTangentTypes.Clamped:
         case CurveTangentTypes.Stepped:
             result = true;
             break;
     }
     return result;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Draws single control point</summary>
        /// <param name="prevTanType">Previous CurveTangentTypes</param>
        /// <param name="cp">Control point</param>
        /// <param name="g">Graphics object</param>
        private void DrawControlPoint(CurveTangentTypes prevTanType, IControlPoint cp, Graphics g)
        {
            Vec2F p = m_canvas.GraphToClient(cp.X, cp.Y);

            PointSelectionRegions region = cp.EditorData.SelectedRegion;

            if (region != PointSelectionRegions.None)
            {
                if (prevTanType != CurveTangentTypes.Stepped && prevTanType != CurveTangentTypes.SteppedNext)
                {
                    Vec2F tangIn = Vec2F.Normalize(m_canvas.GraphToClientTangent(cp.TangentIn));
                    tangIn.X = -tangIn.X;
                    tangIn.Y = -tangIn.Y;
                    DrawArrow(p, p + tangIn * m_tangentLength, g, m_tangentColor);
                }

                if (cp.TangentOutType != CurveTangentTypes.Stepped && cp.TangentOutType != CurveTangentTypes.SteppedNext)
                {
                    Vec2F tangOut = Vec2F.Normalize(m_canvas.GraphToClientTangent(cp.TangentOut));
                    DrawArrow(p, p + tangOut * m_tangentLength, g, m_tangentColor);
                }
            }

            RectangleF pointRect = new RectangleF();
            float halfPointSize = m_pointSize / 2;
            pointRect.X = p.X - halfPointSize;
            pointRect.Y = p.Y - halfPointSize;
            pointRect.Width = m_pointSize;
            pointRect.Height = m_pointSize;
            if (region == PointSelectionRegions.Point)
                g.FillRectangle(m_pointHiBrush, pointRect);
            else
                g.FillRectangle(m_pointBrush, pointRect);
        }