add removeControlPoint; improve exception handling

This commit is contained in:
muddmaker
2014-12-22 17:57:44 -08:00
parent 637908ab43
commit 2c5f7dc896
4 changed files with 39 additions and 13 deletions
+18 -7
View File
@@ -104,22 +104,22 @@ BezierCurve BezierCurve::getDerivative() const
const Vector &BezierCurve::getControlPoint(int i) const const Vector &BezierCurve::getControlPoint(int i) const
{ {
if (i < 0) while (i < 0)
i += controlPoints.size(); i += controlPoints.size();
if (i < 0 || (size_t) i >= controlPoints.size()) while ((size_t) i >= controlPoints.size())
throw Exception("Invalid control point index"); i -= controlPoints.size();
return controlPoints[i]; return controlPoints[i];
} }
void BezierCurve::setControlPoint(int i, const Vector &point) void BezierCurve::setControlPoint(int i, const Vector &point)
{ {
if (i < 0) while (i < 0)
i += controlPoints.size(); i += controlPoints.size();
if (i < 0 || (size_t) i >= controlPoints.size()) while ((size_t) i >= controlPoints.size())
throw Exception("Invalid control point index"); i -= controlPoints.size();
controlPoints[i] = point; controlPoints[i] = point;
} }
@@ -129,12 +129,23 @@ void BezierCurve::insertControlPoint(const Vector &point, int pos)
if (pos < 0) if (pos < 0)
pos += controlPoints.size() + 1; 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"); throw Exception("Invalid control point index");
controlPoints.insert(controlPoints.begin() + pos, point); 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) void BezierCurve::translate(const Vector &t)
{ {
for (size_t i = 0; i < controlPoints.size(); ++i) for (size_t i = 0; i < controlPoints.size(); ++i)
+6 -2
View File
@@ -25,8 +25,6 @@
#include "common/Object.h" #include "common/Object.h"
#include "common/Vector.h" #include "common/Vector.h"
#include <vector> #include <vector>
#include <map>
#include <memory>
namespace love namespace love
{ {
@@ -75,6 +73,12 @@ public:
**/ **/
void insertControlPoint(const Vector &point, int pos = -1); 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. * @returns Number of control points.
**/ **/
+14 -4
View File
@@ -54,8 +54,7 @@ int w_BezierCurve_getControlPoint(lua_State *L)
BezierCurve *curve = luax_checkbeziercurve(L, 1); BezierCurve *curve = luax_checkbeziercurve(L, 1);
int idx = luaL_checkinteger(L, 2); int idx = luaL_checkinteger(L, 2);
if (idx > 0) // 1-indexing idx--; // 1-indexing
idx--;
luax_catchexcept(L, [&]() { luax_catchexcept(L, [&]() {
Vector v = curve->getControlPoint(idx); Vector v = curve->getControlPoint(idx);
@@ -73,8 +72,7 @@ int w_BezierCurve_setControlPoint(lua_State *L)
float vx = (float) luaL_checknumber(L, 3); float vx = (float) luaL_checknumber(L, 3);
float vy = (float) luaL_checknumber(L, 4); float vy = (float) luaL_checknumber(L, 4);
if (idx > 0) // 1-indexing idx--; // 1-indexing
idx--;
luax_catchexcept(L, [&](){ curve->setControlPoint(idx, Vector(vx,vy)); }); luax_catchexcept(L, [&](){ curve->setControlPoint(idx, Vector(vx,vy)); });
return 0; return 0;
@@ -94,6 +92,17 @@ int w_BezierCurve_insertControlPoint(lua_State *L)
return 0; 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) int w_BezierCurve_getControlPointCount(lua_State *L)
{ {
BezierCurve *curve = luax_checkbeziercurve(L, 1); BezierCurve *curve = luax_checkbeziercurve(L, 1);
@@ -194,6 +203,7 @@ static const luaL_Reg functions[] =
{"getControlPoint", w_BezierCurve_getControlPoint}, {"getControlPoint", w_BezierCurve_getControlPoint},
{"setControlPoint", w_BezierCurve_setControlPoint}, {"setControlPoint", w_BezierCurve_setControlPoint},
{"insertControlPoint", w_BezierCurve_insertControlPoint}, {"insertControlPoint", w_BezierCurve_insertControlPoint},
{"removeControlPoint", w_BezierCurve_removeControlPoint},
{"getControlPointCount", w_BezierCurve_getControlPointCount}, {"getControlPointCount", w_BezierCurve_getControlPointCount},
{"translate", w_BezierCurve_translate}, {"translate", w_BezierCurve_translate},
{"rotate", w_BezierCurve_rotate}, {"rotate", w_BezierCurve_rotate},
+1
View File
@@ -36,6 +36,7 @@ int w_BezierCurve_getDerivative(lua_State *L);
int w_BezierCurve_getControlPoint(lua_State *L); int w_BezierCurve_getControlPoint(lua_State *L);
int w_BezierCurve_setControlPoint(lua_State *L); int w_BezierCurve_setControlPoint(lua_State *L);
int w_BezierCurve_insertControlPoint(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_getControlPointCount(lua_State *L);
int w_BezierCurve_translate(lua_State *L); int w_BezierCurve_translate(lua_State *L);
int w_BezierCurve_rotate(lua_State *L); int w_BezierCurve_rotate(lua_State *L);