mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +02:00
add removeControlPoint; improve exception handling
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
**/
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user