From 2c5f7dc896cc8acb0bbeae845e74cdf785c861e9 Mon Sep 17 00:00:00 2001 From: muddmaker Date: Mon, 22 Dec 2014 17:57:44 -0800 Subject: [PATCH] add removeControlPoint; improve exception handling --- src/modules/math/BezierCurve.cpp | 25 ++++++++++++++++++------- src/modules/math/BezierCurve.h | 8 ++++++-- src/modules/math/wrap_BezierCurve.cpp | 18 ++++++++++++++---- src/modules/math/wrap_BezierCurve.h | 1 + 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/modules/math/BezierCurve.cpp b/src/modules/math/BezierCurve.cpp index 04a23c079..06d75fef0 100644 --- a/src/modules/math/BezierCurve.cpp +++ b/src/modules/math/BezierCurve.cpp @@ -104,22 +104,22 @@ BezierCurve BezierCurve::getDerivative() const const Vector &BezierCurve::getControlPoint(int i) const { - if (i < 0) + while (i < 0) i += controlPoints.size(); - if (i < 0 || (size_t) i >= controlPoints.size()) - throw Exception("Invalid control point index"); + while ((size_t) i >= controlPoints.size()) + i -= controlPoints.size(); return controlPoints[i]; } void BezierCurve::setControlPoint(int i, const Vector &point) { - if (i < 0) + while (i < 0) i += controlPoints.size(); - if (i < 0 || (size_t) i >= controlPoints.size()) - throw Exception("Invalid control point index"); + while ((size_t) i >= controlPoints.size()) + i -= controlPoints.size(); controlPoints[i] = point; } @@ -129,12 +129,23 @@ void BezierCurve::insertControlPoint(const Vector &point, int pos) if (pos < 0) pos += controlPoints.size() + 1; - if (pos < 0 ||(size_t) pos > controlPoints.size()) + if (pos < 0 || (size_t) pos > controlPoints.size()) throw Exception("Invalid control point index"); controlPoints.insert(controlPoints.begin() + pos, point); } +void BezierCurve::removeControlPoint(int i) +{ + while (i < 0) + i += controlPoints.size(); + + while ((size_t) i >= controlPoints.size()) + i -= controlPoints.size(); + + controlPoints.erase(controlPoints.begin() + i); +} + void BezierCurve::translate(const Vector &t) { for (size_t i = 0; i < controlPoints.size(); ++i) diff --git a/src/modules/math/BezierCurve.h b/src/modules/math/BezierCurve.h index 8d01f6e3a..abb6cdc97 100644 --- a/src/modules/math/BezierCurve.h +++ b/src/modules/math/BezierCurve.h @@ -25,8 +25,6 @@ #include "common/Object.h" #include "common/Vector.h" #include -#include -#include namespace love { @@ -75,6 +73,12 @@ public: **/ void insertControlPoint(const Vector &point, int pos = -1); + /** + * Remove the i'th control point from the curve. + * @param i Control point to remove + **/ + void removeControlPoint(int i); + /** * @returns Number of control points. **/ diff --git a/src/modules/math/wrap_BezierCurve.cpp b/src/modules/math/wrap_BezierCurve.cpp index cd5b72db5..209b19497 100644 --- a/src/modules/math/wrap_BezierCurve.cpp +++ b/src/modules/math/wrap_BezierCurve.cpp @@ -54,8 +54,7 @@ int w_BezierCurve_getControlPoint(lua_State *L) BezierCurve *curve = luax_checkbeziercurve(L, 1); int idx = luaL_checkinteger(L, 2); - if (idx > 0) // 1-indexing - idx--; + idx--; // 1-indexing luax_catchexcept(L, [&]() { Vector v = curve->getControlPoint(idx); @@ -73,8 +72,7 @@ int w_BezierCurve_setControlPoint(lua_State *L) float vx = (float) luaL_checknumber(L, 3); float vy = (float) luaL_checknumber(L, 4); - if (idx > 0) // 1-indexing - idx--; + idx--; // 1-indexing luax_catchexcept(L, [&](){ curve->setControlPoint(idx, Vector(vx,vy)); }); return 0; @@ -94,6 +92,17 @@ int w_BezierCurve_insertControlPoint(lua_State *L) return 0; } +int w_BezierCurve_removeControlPoint(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + int idx = luaL_checkint(L, 2); + + idx--; // 1-indexing + + luax_catchexcept(L, [&](){ curve->removeControlPoint(idx); }); + return 0; +} + int w_BezierCurve_getControlPointCount(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); @@ -194,6 +203,7 @@ static const luaL_Reg functions[] = {"getControlPoint", w_BezierCurve_getControlPoint}, {"setControlPoint", w_BezierCurve_setControlPoint}, {"insertControlPoint", w_BezierCurve_insertControlPoint}, + {"removeControlPoint", w_BezierCurve_removeControlPoint}, {"getControlPointCount", w_BezierCurve_getControlPointCount}, {"translate", w_BezierCurve_translate}, {"rotate", w_BezierCurve_rotate}, diff --git a/src/modules/math/wrap_BezierCurve.h b/src/modules/math/wrap_BezierCurve.h index 9eb6fb9bf..d36b2657d 100644 --- a/src/modules/math/wrap_BezierCurve.h +++ b/src/modules/math/wrap_BezierCurve.h @@ -36,6 +36,7 @@ int w_BezierCurve_getDerivative(lua_State *L); int w_BezierCurve_getControlPoint(lua_State *L); int w_BezierCurve_setControlPoint(lua_State *L); int w_BezierCurve_insertControlPoint(lua_State *L); +int w_BezierCurve_removeControlPoint(lua_State *L); int w_BezierCurve_getControlPointCount(lua_State *L); int w_BezierCurve_translate(lua_State *L); int w_BezierCurve_rotate(lua_State *L);