/// <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); } }
/// <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); } } }
/// <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(); }
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; }
/// <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); }