Mesh:setDrawRange now takes start and count parameters, instead of min and max.

--HG--
branch : minor
This commit is contained in:
Alex Szpakowski
2016-09-21 19:44:53 -03:00
parent cc0cfac66c
commit 7ab76b1ef6
3 changed files with 45 additions and 41 deletions
+33 -27
View File
@@ -68,8 +68,8 @@ Mesh::Mesh(const std::vector<AttribFormat> &vertexformat, const void *data, size
, elementCount(0)
, elementDataType(0)
, drawMode(drawmode)
, rangeMin(-1)
, rangeMax(-1)
, rangeStart(-1)
, rangeCount(-1)
{
setupAttachedAttributes();
calculateAttributeSizes();
@@ -95,8 +95,8 @@ Mesh::Mesh(const std::vector<AttribFormat> &vertexformat, int vertexcount, DrawM
, elementCount(0)
, elementDataType(getGLDataTypeFromMax(vertexcount))
, drawMode(drawmode)
, rangeMin(-1)
, rangeMax(-1)
, rangeStart(-1)
, rangeCount(-1)
{
if (vertexcount <= 0)
throw love::Exception("Invalid number of vertices (%d).", vertexcount);
@@ -517,24 +517,28 @@ Mesh::DrawMode Mesh::getDrawMode() const
return drawMode;
}
void Mesh::setDrawRange(int min, int max)
void Mesh::setDrawRange(int start, int count)
{
if (min < 0 || max < 0 || min > max)
if (start < 0 || count <= 0)
throw love::Exception("Invalid draw range.");
rangeMin = min;
rangeMax = max;
rangeStart = start;
rangeCount = count;
}
void Mesh::setDrawRange()
{
rangeMin = rangeMax = -1;
rangeStart = rangeCount = -1;
}
void Mesh::getDrawRange(int &min, int &max) const
bool Mesh::getDrawRange(int &start, int &count) const
{
min = rangeMin;
max = rangeMax;
if (rangeStart < 0 || rangeCount < 0)
return false;
start = rangeStart;
count = rangeCount;
return true;
}
int Mesh::bindAttributeToShaderInput(int attributeindex, const std::string &inputname)
@@ -614,31 +618,33 @@ void Mesh::draw(float x, float y, float angle, float sx, float sy, float ox, flo
// Make sure the index buffer isn't mapped (sends data to GPU if needed.)
ibo->unmap();
int max = (int) elementCount - 1;
if (rangeMax >= 0)
max = std::min(rangeMax, max);
int start = std::min(std::max(0, rangeStart), (int) elementCount - 1);
int min = 0;
if (rangeMin >= 0)
min = std::min(rangeMin, max);
int count = (int) elementCount;
if (rangeCount > 0)
count = std::min(count, rangeCount);
count = std::min(count, (int) elementCount - start);
GLenum type = elementDataType;
const void *indices = ibo->getPointer(min * getGLDataTypeSize(type));
const void *indices = ibo->getPointer(start * getGLDataTypeSize(type));
gl.drawElements(getGLDrawMode(drawMode), max - min + 1, type, indices);
if (count > 0)
gl.drawElements(getGLDrawMode(drawMode), count, type, indices);
}
else
{
int max = (int) vertexCount - 1;
if (rangeMax >= 0)
max = std::min(rangeMax, max);
int start = std::min(std::max(0, rangeStart), (int) vertexCount - 1);
int min = 0;
if (rangeMin >= 0)
min = std::min(rangeMin, max);
int count = (int) vertexCount;
if (rangeCount > 0)
count = std::min(count, rangeCount);
count = std::min(count, (int) vertexCount - start);
// Normal non-indexed drawing (no custom vertex map.)
gl.drawArrays(getGLDrawMode(drawMode), min, max - min + 1);
if (count > 0)
gl.drawArrays(getGLDrawMode(drawMode), start, count);
}
}
+4 -4
View File
@@ -190,9 +190,9 @@ public:
void setDrawMode(DrawMode mode);
DrawMode getDrawMode() const;
void setDrawRange(int min, int max);
void setDrawRange(int start, int count);
void setDrawRange();
void getDrawRange(int &min, int &max) const;
bool getDrawRange(int &start, int &count) const;
int bindAttributeToShaderInput(int attributeindex, const std::string &inputname);
@@ -252,8 +252,8 @@ private:
DrawMode drawMode;
int rangeMin;
int rangeMax;
int rangeStart;
int rangeCount;
StrongRef<Texture> texture;
+8 -10
View File
@@ -480,9 +480,9 @@ int w_Mesh_setDrawRange(lua_State *L)
t->setDrawRange();
else
{
int rangemin = (int) luaL_checknumber(L, 2) - 1;
int rangemax = (int) luaL_checknumber(L, 3) - 1;
luax_catchexcept(L, [&](){ t->setDrawRange(rangemin, rangemax); });
int start = (int) luaL_checknumber(L, 2) - 1;
int count = (int) luaL_checknumber(L, 3);
luax_catchexcept(L, [&](){ t->setDrawRange(start, count); });
}
return 0;
@@ -492,15 +492,13 @@ int w_Mesh_getDrawRange(lua_State *L)
{
Mesh *t = luax_checkmesh(L, 1);
int rangemin = -1;
int rangemax = -1;
t->getDrawRange(rangemin, rangemax);
if (rangemin < 0 || rangemax < 0)
int start = 0;
int count = 1;
if (!t->getDrawRange(start, count))
return 0;
lua_pushinteger(L, rangemin + 1);
lua_pushinteger(L, rangemax + 1);
lua_pushinteger(L, start + 1);
lua_pushinteger(L, count);
return 2;
}