Simplify vec2d uses
diff --git a/src/constraints/ik_constraint.cpp b/src/constraints/ik_constraint.cpp
index ed049ec..7985526 100644
--- a/src/constraints/ik_constraint.cpp
+++ b/src/constraints/ik_constraint.cpp
@@ -6,6 +6,10 @@
 
 using namespace rive;
 
+static float atan2(Vec2D v) {
+    return std::atan2(v.y(), v.x());
+}
+
 void IKConstraint::buildDependencies() {
     Super::buildDependencies();
 
@@ -92,7 +96,7 @@
 
     // Note this is directional, hence not transformMat2d
     Vec2D toTargetLocal = Vec2D::transformDir(toTarget, iworld);
-    float r = std::atan2(toTargetLocal[1], toTargetLocal[0]);
+    float r = atan2(toTargetLocal);
 
     constrainRotation(*fk1, r);
     fk1->angle = r;
@@ -135,20 +139,20 @@
         b2->tipWorldTranslation(pB);
 
         Vec2D avLocal = Vec2D::transformDir(pB - pC, secondChildWorldInverse);
-        float angleCorrection = -std::atan2(avLocal[1], avLocal[0]);
+        float angleCorrection = -atan2(avLocal);
 
         if (invertDirection()) {
-            r1 = std::atan2(cv[1], cv[0]) - A;
+            r1 = atan2(cv) - A;
             r2 = -C + math::PI + angleCorrection;
         } else {
-            r1 = A + std::atan2(cv[1], cv[0]);
+            r1 = A + atan2(cv);
             r2 = C - math::PI + angleCorrection;
         }
     } else if (invertDirection()) {
-        r1 = std::atan2(cv[1], cv[0]) - A;
+        r1 = atan2(cv) - A;
         r2 = -C + math::PI;
     } else {
-        r1 = A + std::atan2(cv[1], cv[0]);
+        r1 = A + atan2(cv);
         r2 = C - math::PI;
     }
 
diff --git a/src/shapes/metrics_path.cpp b/src/shapes/metrics_path.cpp
index d6d5639..0190008 100644
--- a/src/shapes/metrics_path.cpp
+++ b/src/shapes/metrics_path.cpp
@@ -229,16 +229,13 @@
             const PathPart& part = m_Parts[i];
             switch (part.type) {
                 case PathPart::line: {
-                    const Vec2D& point = m_TransformedPoints[part.offset];
-                    result->lineTo(point[0], point[1]);
+                    result->line(m_TransformedPoints[part.offset]);
                     break;
                 }
                 default: {
-                    const Vec2D& point1 = m_TransformedPoints[part.offset];
-                    const Vec2D& point2 = m_TransformedPoints[part.offset + 1];
-                    const Vec2D& point3 = m_TransformedPoints[part.offset + 2];
-                    result->cubicTo(
-                        point1[0], point1[1], point2[0], point2[1], point3[0], point3[1]);
+                    result->cubic(m_TransformedPoints[part.offset + 0],
+                                  m_TransformedPoints[part.offset + 1],
+                                  m_TransformedPoints[part.offset + 2]);
                     break;
                 }
             }
@@ -253,15 +250,13 @@
     const PathPart& part = m_Parts[index];
     switch (part.type) {
         case PathPart::line: {
-            const Vec2D& from = m_TransformedPoints[part.offset - 1];
-            const Vec2D& to = m_TransformedPoints[part.offset];
-            Vec2D dir = to - from;
+            const Vec2D from = m_TransformedPoints[part.offset - 1];
+            const Vec2D to = m_TransformedPoints[part.offset];
+            const Vec2D dir = to - from;
             if (moveTo) {
-                Vec2D point = from + dir * startT;
-                result->moveTo(point[0], point[1]);
+                result->move(from + dir * startT);
             }
-            dir = from + dir * endT;
-            result->lineTo(dir[0], dir[1]);
+            result->line(from + dir * endT);
 
             break;
         }
@@ -325,29 +320,27 @@
                 // Start is 0, so split at end and keep the left side.
                 computeHull(from, fromOut, toIn, to, endT, hull);
                 if (moveTo) {
-                    result->moveTo(from[0], from[1]);
+                    result->move(from);
                 }
-                result->cubicTo(
-                    hull[0][0], hull[0][1], hull[3][0], hull[3][1], hull[5][0], hull[5][1]);
+                result->cubic(hull[0], hull[3], hull[5]);
             } else {
                 // Split at start since it's non 0.
                 computeHull(from, fromOut, toIn, to, startT, hull);
                 if (moveTo) {
                     // Move to first point on the right side.
-                    result->moveTo(hull[5][0], hull[5][1]);
+                    result->move(hull[5]);
                 }
                 if (endT == 1.0f) {
                     // End is 1, so no further split is necessary just cubicTo
                     // the remaining right side.
-                    result->cubicTo(hull[4][0], hull[4][1], hull[2][0], hull[2][1], to[0], to[1]);
+                    result->cubic(hull[4], hull[2], to);
                 } else {
                     // End is not 1, so split again and cubic to the left side
                     // of the split and remap endT to the new curve range
                     computeHull(
                         hull[5], hull[4], hull[2], to, (endT - startT) / (1.0f - startT), hull);
 
-                    result->cubicTo(
-                        hull[0][0], hull[0][1], hull[3][0], hull[3][1], hull[5][0], hull[5][1]);
+                    result->cubic(hull[0], hull[3], hull[5]);
                 }
             }
             break;
diff --git a/src/shapes/path.cpp b/src/shapes/path.cpp
index 520c88b..0b11b30 100644
--- a/src/shapes/path.cpp
+++ b/src/shapes/path.cpp
@@ -54,24 +54,19 @@
     auto firstPoint = vertices[0];
 
     // Init out to translation
-    float outX, outY;
+    Vec2D out;
     bool prevIsCubic;
 
-    float startX, startY;
-    float startInX, startInY;
+    Vec2D start, startIn;
     bool startIsCubic;
 
     if (firstPoint->is<CubicVertex>()) {
         auto cubic = firstPoint->as<CubicVertex>();
         startIsCubic = prevIsCubic = true;
-        auto inPoint = cubic->renderIn();
-        startInX = inPoint[0];
-        startInY = inPoint[1];
-        auto outPoint = cubic->renderOut();
-        outX = outPoint[0];
-        outY = outPoint[1];
-        auto translation = cubic->renderTranslation();
-        commandPath.moveTo(startX = translation[0], startY = translation[1]);
+        startIn = cubic->renderIn();
+        out = cubic->renderOut();
+        start = cubic->renderTranslation();
+        commandPath.move(start);
     } else {
         startIsCubic = prevIsCubic = false;
         auto point = *firstPoint->as<StraightVertex>();
@@ -100,24 +95,17 @@
 
             float renderRadius = std::min(toPrevLength, std::min(toNextLength, radius));
 
-            Vec2D translation = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
-            commandPath.moveTo(startInX = startX = translation[0],
-                               startInY = startY = translation[1]);
+            startIn = start = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
+            commandPath.move(startIn);
 
             Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
             Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
-            Vec2D posNext = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
-            commandPath.cubicTo(outPoint[0],
-                                outPoint[1],
-                                inPoint[0],
-                                inPoint[1],
-                                outX = posNext[0],
-                                outY = posNext[1]);
+            out = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
+            commandPath.cubic(outPoint, inPoint, out);
             prevIsCubic = false;
         } else {
-            auto translation = point.renderTranslation();
-            commandPath.moveTo(startInX = startX = outX = translation[0],
-                               startInY = startY = outY = translation[1]);
+            startIn = start = out = point.renderTranslation();
+            commandPath.move(out);
         }
     }
 
@@ -129,18 +117,16 @@
             auto inPoint = cubic->renderIn();
             auto translation = cubic->renderTranslation();
 
-            commandPath.cubicTo(outX, outY, inPoint[0], inPoint[1], translation[0], translation[1]);
+            commandPath.cubic(out, inPoint, translation);
 
             prevIsCubic = true;
-            auto outPoint = cubic->renderOut();
-            outX = outPoint[0];
-            outY = outPoint[1];
+            out = cubic->renderOut();
         } else {
             auto point = *vertex->as<StraightVertex>();
             Vec2D pos = point.renderTranslation();
 
             if (auto radius = point.radius(); radius > 0.0f) {
-                Vec2D toPrev = Vec2D(outX, outY) - pos;
+                Vec2D toPrev = out - pos;
                 auto toPrevLength = toPrev.length();
                 toPrev[0] /= toPrevLength;
                 toPrev[1] /= toPrevLength;
@@ -158,40 +144,32 @@
 
                 Vec2D translation = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
                 if (prevIsCubic) {
-                    commandPath.cubicTo(
-                        outX, outY, translation[0], translation[1], translation[0], translation[1]);
+                    commandPath.cubic(out, translation, translation);
                 } else {
-                    commandPath.lineTo(translation[0], translation[1]);
+                    commandPath.line(translation);
                 }
 
                 Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
                 Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
-                Vec2D posNext = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
-                commandPath.cubicTo(outPoint[0],
-                                    outPoint[1],
-                                    inPoint[0],
-                                    inPoint[1],
-                                    outX = posNext[0],
-                                    outY = posNext[1]);
+                out = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
+                commandPath.cubic(outPoint, inPoint, out);
                 prevIsCubic = false;
             } else if (prevIsCubic) {
-                float x = pos[0];
-                float y = pos[1];
-                commandPath.cubicTo(outX, outY, x, y, x, y);
+                commandPath.cubic(out, pos, pos);
 
                 prevIsCubic = false;
-                outX = x;
-                outY = y;
+                out = pos;
             } else {
-                commandPath.lineTo(outX = pos[0], outY = pos[1]);
+                out = pos;
+                commandPath.line(out);
             }
         }
     }
     if (isClosed) {
         if (prevIsCubic || startIsCubic) {
-            commandPath.cubicTo(outX, outY, startInX, startInY, startX, startY);
+            commandPath.cubic(out, startIn, start);
         } else {
-            commandPath.lineTo(startX, startY);
+            commandPath.line(start);
         }
         commandPath.close();
     }