Browse Source

add removeControlPoint; improve exception handling

muddmaker 10 years ago
parent
commit
2c5f7dc896

+ 18 - 7
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)

+ 6 - 2
src/modules/math/BezierCurve.h

@@ -25,8 +25,6 @@
 #include "common/Object.h"
 #include "common/Vector.h"
 #include <vector>
-#include <map>
-#include <memory>
 
 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.
 	 **/

+ 14 - 4
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},

+ 1 - 0
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);