summaryrefslogtreecommitdiff
path: root/bezier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bezier.cpp')
-rw-r--r--bezier.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/bezier.cpp b/bezier.cpp
index 4e0cb5c..77aa18c 100644
--- a/bezier.cpp
+++ b/bezier.cpp
@@ -155,3 +155,53 @@ void Bezier_CubicCalcPoints(v2 p1, v2 p2, v2 p3, v2 p4, void *Data, uint32 *Incr
void *Pointer = Data;
Bezier_CubicCalcPointsCasteljauStep(Pointer, Increment, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, tess_tol, 0);
}
+
+// These functions will become more generalized as shapes are added.
+
+static void
+Mask_AddPointToLine(mask *Mask, uint16 Index, v2 Pos)
+{
+ for (int i = Mask->NumberOfPoints - 1; i > Index; i--) {
+ Mask->Point[i+1] = Mask->Point[i];
+ }
+ mask_point *PointToAdd = &Mask->Point[Index+1];
+ PointToAdd->Pos = Pos;
+ Mask->NumberOfPoints++;
+}
+
+static void
+Mask_PushPoint(mask *Mask, v2 Pos)
+{
+ mask_point *PointToAdd = &Mask->Point[Mask->NumberOfPoints];
+ PointToAdd->Pos = Pos;
+ Mask->NumberOfPoints++;
+}
+
+static void
+Mask_AddPointToCurve(mask *Mask, uint16 Index, real32 ratio)
+{
+ mask_point *Point0 = &Mask->Point[Index];
+ mask_point *Point1 = &Mask->Point[Index+1];
+
+ v2 Point0_Pos_Right = Point0->Pos + Point0->TangentRight;
+ v2 Point1_Pos_Left = Point1->Pos + Point1->TangentLeft;
+ v2 Handle0_Half = Line_RatioToPoint(Point0->Pos, Point0_Pos_Right, ratio);
+ v2 Handle1_Half = Line_RatioToPoint(Point1_Pos_Left, Point1->Pos, ratio);
+ v2 Top_Half = Line_RatioToPoint(Point0_Pos_Right, Point1_Pos_Left, ratio);
+ v2 NewHandleLeft = Line_RatioToPoint(Handle0_Half, Top_Half, ratio);
+ v2 NewHandleRight = Line_RatioToPoint(Top_Half, Handle1_Half, ratio);
+ v2 NewPos = Line_RatioToPoint(NewHandleLeft, NewHandleRight, ratio);
+
+ Point0->TangentRight = -(Point0->Pos - Handle0_Half);
+ Point1->TangentLeft = -(Point1->Pos - Handle1_Half);
+
+ for (int i = Mask->NumberOfPoints - 1; i > Index; i--) {
+ Mask->Point[i+1] = Mask->Point[i];
+ }
+ mask_point *PointToAdd = &Mask->Point[Index+1];
+
+ PointToAdd->Pos = NewPos;
+ PointToAdd->TangentLeft = -(NewPos - NewHandleLeft);
+ PointToAdd->TangentRight = -(NewPos - NewHandleRight);
+ Mask->NumberOfPoints++;
+}