44using System . Text ;
55using System . Threading . Tasks ;
66using System . Text . RegularExpressions ;
7+ using OpenTK . Mathematics ;
78
89namespace FreeFrame . Components . Shapes . Path
910{
@@ -14,21 +15,21 @@ namespace FreeFrame.Components.Shapes.Path
1415 /// </summary>
1516 public abstract class DrawAttribute
1617 {
17- static float _lastX = 0 ;
18- static float _lastY = 0 ;
18+ static int _lastX = 0 ;
19+ static int _lastY = 0 ;
1920
2021 #region Bézier Curve
21- static float _lastControlPointX = 0 ; // Last control point x
22- static float _lastControlPointY = 0 ; // Last control point y
22+ static int _lastControlPointX = 0 ; // Last control point x
23+ static int _lastControlPointY = 0 ; // Last control point y
2324 #endregion
2425
2526 static Type _lastCommand = typeof ( MoveTo ) ;
2627
2728
28- public static float LastX { get => _lastX ; set => _lastX = value ; }
29- public static float LastY { get => _lastY ; set => _lastY = value ; }
30- public static float LastControlPointX { get => _lastControlPointX ; set => _lastControlPointX = value ; }
31- public static float LastControlPointY { get => _lastControlPointY ; set => _lastControlPointY = value ; }
29+ public static int LastX { get => _lastX ; set => _lastX = value ; }
30+ public static int LastY { get => _lastY ; set => _lastY = value ; }
31+ public static int LastControlPointX { get => _lastControlPointX ; set => _lastControlPointX = value ; }
32+ public static int LastControlPointY { get => _lastControlPointY ; set => _lastControlPointY = value ; }
3233 public static Type LastCommand { get => _lastCommand ; set => _lastCommand = value ; }
3334
3435 /// <summary>
@@ -38,6 +39,8 @@ public abstract class DrawAttribute
3839 public abstract float [ ] GetVertices ( ) ;
3940 public abstract uint [ ] GetVerticesIndexes ( ) ;
4041
42+ public abstract List < Vector2i > GetSelectablePoints ( ) ;
43+
4144 public abstract override string ToString ( ) ;
4245 }
4346 /// <summary>
@@ -95,6 +98,8 @@ public override uint[] GetVerticesIndexes()
9598 }
9699
97100 public override string ToString ( ) => String . Format ( "{0} {1},{2}" , IsRelative ? 'm' : 'M' , X , Y ) ;
101+
102+ public override List < Vector2i > GetSelectablePoints ( ) => new List < Vector2i > ( ) ;
98103 }
99104 /// <summary>
100105 /// LineTo, L or l.
@@ -153,6 +158,23 @@ public override float[] GetVertices()
153158 public override uint [ ] GetVerticesIndexes ( ) => new uint [ ] { 0 , 1 } ; // TODO: Please dont hardcode this
154159
155160 public override string ToString ( ) => String . Format ( "{0} {1},{2}" , IsRelative ? 'l' : 'L' , X , Y ) ;
161+
162+ public override List < Vector2i > GetSelectablePoints ( )
163+ {
164+ List < Vector2i > points = new List < Vector2i > ( ) ;
165+
166+ if ( IsRelative )
167+ {
168+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
169+ points . Add ( new Vector2i ( LastX + X , LastY + Y ) ) ;
170+ }
171+ else
172+ {
173+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
174+ points . Add ( new Vector2i ( X , Y ) ) ;
175+ }
176+ return points ;
177+ }
156178 }
157179 /// <summary>
158180 /// HorizontalLineTo, H or h.
@@ -207,6 +229,23 @@ public override float[] GetVertices()
207229 public override uint [ ] GetVerticesIndexes ( ) => new uint [ ] { 0 , 1 } ; // TODO: Please dont hardcode this
208230
209231 public override string ToString ( ) => String . Format ( "{0} {1}" , IsRelative ? 'h' : 'H' , X ) ;
232+
233+ public override List < Vector2i > GetSelectablePoints ( )
234+ {
235+ List < Vector2i > points = new List < Vector2i > ( ) ;
236+
237+ if ( IsRelative )
238+ {
239+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
240+ points . Add ( new Vector2i ( LastX + X , LastY ) ) ;
241+ }
242+ else
243+ {
244+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
245+ points . Add ( new Vector2i ( X , LastY ) ) ;
246+ }
247+ return points ;
248+ }
210249 }
211250 /// <summary>
212251 /// VerticalLineTo, V or v.
@@ -254,6 +293,23 @@ public override float[] GetVertices()
254293 }
255294 public override uint [ ] GetVerticesIndexes ( ) => new uint [ ] { 0 , 1 } ; // TODO: Please dont hardcode this
256295
296+ public override List < Vector2i > GetSelectablePoints ( )
297+ {
298+ List < Vector2i > points = new List < Vector2i > ( ) ;
299+
300+ if ( _isRelative )
301+ {
302+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
303+ points . Add ( new Vector2i ( LastX , LastY + _y ) ) ;
304+ }
305+ else
306+ {
307+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
308+ points . Add ( new Vector2i ( LastX , _y ) ) ;
309+ }
310+ return points ;
311+ }
312+
257313 public override string ToString ( ) => String . Format ( "{0} {1}" , _isRelative ? 'v' : 'V' , _y ) ;
258314 }
259315 /// <summary>
@@ -361,6 +417,27 @@ public override float[] GetVertices()
361417 }
362418 public override uint [ ] GetVerticesIndexes ( ) => Enumerable . Range ( 0 , 100 ) . Select ( i => ( uint ) i ) . ToArray ( ) ; // Magic value please dont hard code this
363419
420+ public override List < Vector2i > GetSelectablePoints ( )
421+ {
422+ List < Vector2i > points = new List < Vector2i > ( ) ;
423+
424+ if ( _isRelative )
425+ {
426+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
427+ points . Add ( new Vector2i ( LastX + X1 , LastY + Y1 ) ) ;
428+ points . Add ( new Vector2i ( LastX + X2 , LastY + X2 ) ) ;
429+ points . Add ( new Vector2i ( LastX + X , LastY + Y ) ) ;
430+ }
431+ else
432+ {
433+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
434+ points . Add ( new Vector2i ( X1 , Y1 ) ) ;
435+ points . Add ( new Vector2i ( X2 , X2 ) ) ;
436+ points . Add ( new Vector2i ( X , Y ) ) ;
437+ }
438+ return points ;
439+ }
440+
364441 public override string ToString ( ) => String . Format ( "{0} {1},{2} {3},{4} {5},{6}" , _isRelative ? 'c' : 'C' , X1 , Y1 , X2 , Y2 , X , Y ) ;
365442 }
366443 /// <summary>
@@ -459,6 +536,27 @@ public override float[] GetVertices()
459536 }
460537 public override uint [ ] GetVerticesIndexes ( ) => Enumerable . Range ( 0 , 100 ) . Select ( i => ( uint ) i ) . ToArray ( ) ; // Magic value please dont hard code this
461538
539+ public override List < Vector2i > GetSelectablePoints ( )
540+ {
541+ List < Vector2i > points = new List < Vector2i > ( ) ;
542+
543+ if ( IsRelative )
544+ {
545+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
546+ points . Add ( new Vector2i ( LastX + LastControlPointX , LastY + LastControlPointY ) ) ;
547+ points . Add ( new Vector2i ( LastX + X2 , LastY + X2 ) ) ;
548+ points . Add ( new Vector2i ( LastX + X , LastY + Y ) ) ;
549+ }
550+ else
551+ {
552+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
553+ points . Add ( new Vector2i ( LastControlPointX , LastControlPointY ) ) ;
554+ points . Add ( new Vector2i ( X2 , X2 ) ) ;
555+ points . Add ( new Vector2i ( X , Y ) ) ;
556+ }
557+ return points ;
558+ }
559+
462560 public override string ToString ( ) => String . Format ( "{0} {1},{2} {3},{4}" , IsRelative ? 's' : 'S' , X2 , Y2 , X , Y ) ;
463561
464562 }
@@ -477,6 +575,8 @@ public class QuadraticBezierCurveTo : DrawAttribute
477575 public bool IsRelative { get => _isRelative ; set => _isRelative = value ; }
478576 public int X1 { get => _x1 ; set => _x1 = value ; }
479577 public int Y1 { get => _y1 ; set => _y1 = value ; }
578+ public int X { get => _x ; set => _x = value ; }
579+ public int Y { get => _y ; set => _y = value ; }
480580
481581 /// <summary>
482582 /// Use to draw a quadratic Bézier curve.
@@ -500,8 +600,8 @@ public QuadraticBezierCurveTo(int x1, int y1, int x, int y, bool isRelative = fa
500600 {
501601 X1 = x1 ;
502602 Y1 = y1 ;
503- _x = x ;
504- _y = y ;
603+ X = x ;
604+ Y = y ;
505605 IsRelative = isRelative ;
506606 }
507607 public override float [ ] GetVertices ( )
@@ -517,46 +617,65 @@ public override float[] GetVertices()
517617 {
518618 t = i / 100.0f ;
519619
520- x = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastX + 2 * ( 1 - t ) * t * ( LastX + X1 ) + Math . Pow ( t , 2 ) * ( LastX + _x ) ) ;
521- y = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastY + 2 * ( 1 - t ) * t * ( LastY + Y1 ) + Math . Pow ( t , 2 ) * ( LastY + _y ) ) ;
620+ x = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastX + 2 * ( 1 - t ) * t * ( LastX + X1 ) + Math . Pow ( t , 2 ) * ( LastX + X ) ) ;
621+ y = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastY + 2 * ( 1 - t ) * t * ( LastY + Y1 ) + Math . Pow ( t , 2 ) * ( LastY + Y ) ) ;
522622
523623 vertices . AddRange ( new float [ ] { x , y } ) ;
524624 }
525- if ( _x > X1 )
526- LastControlPointX += _x + X1 ;
527- else if ( _x < X1 )
528- LastControlPointX += _x - X1 ;
625+ if ( X > X1 )
626+ LastControlPointX += X + X1 ;
627+ else if ( X < X1 )
628+ LastControlPointX += X - X1 ;
529629 else
530- LastControlPointX += _x ;
531- LastX += _x ;
532- LastY += _y ;
630+ LastControlPointX += X ;
631+ LastX += X ;
632+ LastY += Y ;
533633 }
534634 else
535635 {
536636 for ( int i = 0 ; i < 100 ; i ++ ) // TODO: Magic value please dont hard code this
537637 {
538638 t = i / 100.0f ;
539639
540- x = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastX + 2 * ( 1 - t ) * t * X1 + Math . Pow ( t , 2 ) * _x ) ;
541- y = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastY + 2 * ( 1 - t ) * t * Y1 + Math . Pow ( t , 2 ) * _y ) ;
640+ x = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastX + 2 * ( 1 - t ) * t * X1 + Math . Pow ( t , 2 ) * X ) ;
641+ y = ( float ) ( Math . Pow ( ( 1 - t ) , 2 ) * LastY + 2 * ( 1 - t ) * t * Y1 + Math . Pow ( t , 2 ) * Y ) ;
542642
543643 vertices . AddRange ( new float [ ] { x , y } ) ;
544644 }
545- if ( _x > X1 )
546- LastControlPointX = _x + X1 ;
547- else if ( _x < X1 )
548- LastControlPointX = _x - X1 ;
645+ if ( X > X1 )
646+ LastControlPointX = X + X1 ;
647+ else if ( X < X1 )
648+ LastControlPointX = X - X1 ;
549649 else
550- LastControlPointX = _x ;
551- LastX = _x ;
552- LastY = _y ;
650+ LastControlPointX = X ;
651+ LastX = X ;
652+ LastY = Y ;
553653 }
554654
555655 return vertices . ToArray ( ) ;
556656 }
557657 public override uint [ ] GetVerticesIndexes ( ) => Enumerable . Range ( 0 , 100 ) . Select ( i => ( uint ) i ) . ToArray ( ) ; // Magic value please dont hard code this
558658
559- public override string ToString ( ) => String . Format ( "{0} {1},{2} {3},{4}" , IsRelative ? 'q' : 'Q' , X1 , Y1 , _x , _y ) ;
659+ public override List < Vector2i > GetSelectablePoints ( )
660+ {
661+ List < Vector2i > points = new List < Vector2i > ( ) ;
662+
663+ if ( IsRelative )
664+ {
665+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
666+ points . Add ( new Vector2i ( LastX + X1 , LastY + Y1 ) ) ;
667+ points . Add ( new Vector2i ( LastX + X , LastY + Y ) ) ;
668+ }
669+ else
670+ {
671+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
672+ points . Add ( new Vector2i ( X1 , Y1 ) ) ;
673+ points . Add ( new Vector2i ( X , Y ) ) ;
674+ }
675+ return points ;
676+ }
677+
678+ public override string ToString ( ) => String . Format ( "{0} {1},{2} {3},{4}" , IsRelative ? 'q' : 'Q' , X1 , Y1 , X , Y ) ;
560679
561680 }
562681 /// <summary>
@@ -642,6 +761,25 @@ public override float[] GetVertices()
642761 }
643762 public override uint [ ] GetVerticesIndexes ( ) => Enumerable . Range ( 0 , 100 ) . Select ( i => ( uint ) i ) . ToArray ( ) ; // Magic value please dont hard code this
644763
764+ public override List < Vector2i > GetSelectablePoints ( )
765+ {
766+ List < Vector2i > points = new List < Vector2i > ( ) ;
767+
768+ if ( _isRelative )
769+ {
770+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
771+ points . Add ( new Vector2i ( LastX + LastControlPointX , LastY + LastControlPointY ) ) ;
772+ points . Add ( new Vector2i ( LastX + _x , LastY + _y ) ) ;
773+ }
774+ else
775+ {
776+ points . Add ( new Vector2i ( LastX , LastY ) ) ;
777+ points . Add ( new Vector2i ( LastControlPointX , LastControlPointY ) ) ;
778+ points . Add ( new Vector2i ( _x , _y ) ) ;
779+ }
780+ return points ;
781+ }
782+
645783 public override string ToString ( ) => String . Format ( "{0} {1},{2}" , _isRelative ? 't' : 'T' , _x , _y ) ;
646784 }
647785
@@ -696,6 +834,11 @@ public EllipticalArc(int rx, int ry, int angle, bool largeArcFlag, bool sweepFla
696834 _isRelative = isRelative ;
697835 }
698836
837+ public override List < Vector2i > GetSelectablePoints ( )
838+ {
839+ throw new NotImplementedException ( ) ;
840+ }
841+
699842 public override float [ ] GetVertices ( )
700843 {
701844 throw new NotImplementedException ( ) ;
@@ -719,6 +862,11 @@ public class ClosePath : DrawAttribute
719862 /// </summary>
720863 public ClosePath ( ) { }
721864
865+ public override List < Vector2i > GetSelectablePoints ( )
866+ {
867+ throw new NotImplementedException ( ) ;
868+ }
869+
722870 public override float [ ] GetVertices ( )
723871 {
724872 throw new NotImplementedException ( ) ;
0 commit comments