mirror of
https://github.com/love2d/love.git
synced 2026-08-17 11:00:31 +02:00
Replaced love.graphics.point with love.graphics.points, which draws a number of points at a time.
It currently has 3 variants, with the last one using optional per-point colors:
- love.graphics.points(x1, y1, x2, y2, ...)
- love.graphics.points({x1, y1, x2, y2, ...})
- love.graphics.points({{x1, y1 [, r, g, b, a]}, {x2, y2 [, r, g, b, a]}, ...}).
This commit is contained in:
@@ -1109,17 +1109,24 @@ void Graphics::printf(const std::string &str, float x, float y, float wrap, Font
|
||||
* Primitives
|
||||
**/
|
||||
|
||||
void Graphics::point(float x, float y)
|
||||
void Graphics::points(const float *coords, const uint8 *colors, size_t numpoints)
|
||||
{
|
||||
OpenGL::TempDebugGroup debuggroup("Graphics point draw");
|
||||
|
||||
GLfloat coord[] = {x, y};
|
||||
OpenGL::TempDebugGroup debuggroup("Graphics points draw");
|
||||
|
||||
gl.prepareDraw();
|
||||
gl.bindTexture(gl.getDefaultTexture());
|
||||
gl.useVertexAttribArrays(ATTRIBFLAG_POS);
|
||||
glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, coord);
|
||||
gl.drawArrays(GL_POINTS, 0, 1);
|
||||
|
||||
uint32 attribflags = ATTRIBFLAG_POS;
|
||||
glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, coords);
|
||||
|
||||
if (colors)
|
||||
{
|
||||
attribflags |= ATTRIBFLAG_COLOR;
|
||||
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors);
|
||||
}
|
||||
|
||||
gl.useVertexAttribArrays(attribflags);
|
||||
gl.drawArrays(GL_POINTS, 0, numpoints);
|
||||
}
|
||||
|
||||
void Graphics::polyline(const float *coords, size_t count)
|
||||
|
||||
@@ -351,7 +351,7 @@ public:
|
||||
* @param x Point along x-axis.
|
||||
* @param y Point along y-axis.
|
||||
**/
|
||||
void point(float x, float y);
|
||||
void points(const float *coords, const uint8 *colors, size_t numpoints);
|
||||
|
||||
/**
|
||||
* Draws a series of lines connecting the given vertices.
|
||||
|
||||
@@ -1507,11 +1507,86 @@ int w_printf(lua_State *L)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int w_point(lua_State *L)
|
||||
int w_points(lua_State *L)
|
||||
{
|
||||
float x = (float)luaL_checknumber(L, 1);
|
||||
float y = (float)luaL_checknumber(L, 2);
|
||||
instance()->point(x, y);
|
||||
// love.graphics.points has 3 variants:
|
||||
// - points(x1, y1, x2, y2, ...)
|
||||
// - points({x1, y1, x2, y2, ...})
|
||||
// - points({{x1, y1 [, r, g, b, a]}, {x2, y2 [, r, g, b, a]}, ...})
|
||||
|
||||
int args = lua_gettop(L);
|
||||
bool is_table = false;
|
||||
bool is_table_of_tables = false;
|
||||
if (args == 1 && lua_istable(L, 1))
|
||||
{
|
||||
is_table = true;
|
||||
args = (int) luax_objlen(L, 1);
|
||||
|
||||
lua_rawgeti(L, 1, 1);
|
||||
is_table_of_tables = lua_istable(L, -1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
if (args % 2 != 0 && !is_table_of_tables)
|
||||
return luaL_error(L, "Number of vertex components must be a multiple of two");
|
||||
|
||||
int numpoints = args / 2;
|
||||
if (is_table_of_tables)
|
||||
numpoints = args;
|
||||
|
||||
float *coords = nullptr;
|
||||
uint8 *colors = nullptr;
|
||||
|
||||
coords = new float[numpoints * 2];
|
||||
|
||||
if (is_table_of_tables)
|
||||
colors = new uint8[numpoints * 4];
|
||||
|
||||
if (is_table)
|
||||
{
|
||||
if (is_table_of_tables)
|
||||
{
|
||||
// points({{x1, y1 [, r, g, b, a]}, {x2, y2 [, r, g, b, a]}, ...})
|
||||
for (int i = 0; i < args; i++)
|
||||
{
|
||||
lua_rawgeti(L, 1, i + 1);
|
||||
for (int j = 1; j <= 6; j++)
|
||||
lua_rawgeti(L, -j, j);
|
||||
|
||||
coords[i * 2 + 0] = luax_tofloat(L, -6);
|
||||
coords[i * 2 + 1] = luax_tofloat(L, -5);
|
||||
|
||||
colors[i * 4 + 0] = (uint8) luaL_optnumber(L, -4, 255);
|
||||
colors[i * 4 + 1] = (uint8) luaL_optnumber(L, -3, 255);
|
||||
colors[i * 4 + 2] = (uint8) luaL_optnumber(L, -2, 255);
|
||||
colors[i * 4 + 3] = (uint8) luaL_optnumber(L, -1, 255);
|
||||
|
||||
lua_pop(L, 7);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// points({x1, y1, x2, y2, ...})
|
||||
for (int i = 0; i < args; i++)
|
||||
{
|
||||
lua_rawgeti(L, 1, i + 1);
|
||||
coords[i] = luax_tofloat(L, -1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < args; i++)
|
||||
coords[i] = luax_tofloat(L, i + 1);
|
||||
}
|
||||
|
||||
instance()->points(coords, colors, numpoints);
|
||||
|
||||
delete[] coords;
|
||||
if (colors)
|
||||
delete[] colors;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1830,7 +1905,7 @@ static const luaL_Reg functions[] =
|
||||
{ "setStencilTest", w_setStencilTest },
|
||||
{ "getStencilTest", w_getStencilTest },
|
||||
|
||||
{ "point", w_point },
|
||||
{ "points", w_points },
|
||||
{ "line", w_line },
|
||||
{ "rectangle", w_rectangle },
|
||||
{ "circle", w_circle },
|
||||
|
||||
@@ -106,7 +106,7 @@ int w_getStats(lua_State *L);
|
||||
int w_draw(lua_State *L);
|
||||
int w_print(lua_State *L);
|
||||
int w_printf(lua_State *L);
|
||||
int w_point(lua_State *L);
|
||||
int w_points(lua_State *L);
|
||||
int w_line(lua_State *L);
|
||||
int w_rectangle(lua_State *L);
|
||||
int w_circle(lua_State *L);
|
||||
|
||||
Reference in New Issue
Block a user