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) , elementCount(0)
, elementDataType(0) , elementDataType(0)
, drawMode(drawmode) , drawMode(drawmode)
, rangeMin(-1) , rangeStart(-1)
, rangeMax(-1) , rangeCount(-1)
{ {
setupAttachedAttributes(); setupAttachedAttributes();
calculateAttributeSizes(); calculateAttributeSizes();
@@ -95,8 +95,8 @@ Mesh::Mesh(const std::vector<AttribFormat> &vertexformat, int vertexcount, DrawM
, elementCount(0) , elementCount(0)
, elementDataType(getGLDataTypeFromMax(vertexcount)) , elementDataType(getGLDataTypeFromMax(vertexcount))
, drawMode(drawmode) , drawMode(drawmode)
, rangeMin(-1) , rangeStart(-1)
, rangeMax(-1) , rangeCount(-1)
{ {
if (vertexcount <= 0) if (vertexcount <= 0)
throw love::Exception("Invalid number of vertices (%d).", vertexcount); throw love::Exception("Invalid number of vertices (%d).", vertexcount);
@@ -517,24 +517,28 @@ Mesh::DrawMode Mesh::getDrawMode() const
return drawMode; 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."); throw love::Exception("Invalid draw range.");
rangeMin = min; rangeStart = start;
rangeMax = max; rangeCount = count;
} }
void Mesh::setDrawRange() 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; if (rangeStart < 0 || rangeCount < 0)
max = rangeMax; return false;
start = rangeStart;
count = rangeCount;
return true;
} }
int Mesh::bindAttributeToShaderInput(int attributeindex, const std::string &inputname) 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.) // Make sure the index buffer isn't mapped (sends data to GPU if needed.)
ibo->unmap(); ibo->unmap();
int max = (int) elementCount - 1; int start = std::min(std::max(0, rangeStart), (int) elementCount - 1);
if (rangeMax >= 0)
max = std::min(rangeMax, max);
int min = 0; int count = (int) elementCount;
if (rangeMin >= 0) if (rangeCount > 0)
min = std::min(rangeMin, max); count = std::min(count, rangeCount);
count = std::min(count, (int) elementCount - start);
GLenum type = elementDataType; 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 else
{ {
int max = (int) vertexCount - 1; int start = std::min(std::max(0, rangeStart), (int) vertexCount - 1);
if (rangeMax >= 0)
max = std::min(rangeMax, max);
int min = 0; int count = (int) vertexCount;
if (rangeMin >= 0) if (rangeCount > 0)
min = std::min(rangeMin, max); count = std::min(count, rangeCount);
count = std::min(count, (int) vertexCount - start);
// Normal non-indexed drawing (no custom vertex map.) // 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); void setDrawMode(DrawMode mode);
DrawMode getDrawMode() const; DrawMode getDrawMode() const;
void setDrawRange(int min, int max); void setDrawRange(int start, int count);
void setDrawRange(); void setDrawRange();
void getDrawRange(int &min, int &max) const; bool getDrawRange(int &start, int &count) const;
int bindAttributeToShaderInput(int attributeindex, const std::string &inputname); int bindAttributeToShaderInput(int attributeindex, const std::string &inputname);
@@ -252,8 +252,8 @@ private:
DrawMode drawMode; DrawMode drawMode;
int rangeMin; int rangeStart;
int rangeMax; int rangeCount;
StrongRef<Texture> texture; StrongRef<Texture> texture;
+8 -10
View File
@@ -480,9 +480,9 @@ int w_Mesh_setDrawRange(lua_State *L)
t->setDrawRange(); t->setDrawRange();
else else
{ {
int rangemin = (int) luaL_checknumber(L, 2) - 1; int start = (int) luaL_checknumber(L, 2) - 1;
int rangemax = (int) luaL_checknumber(L, 3) - 1; int count = (int) luaL_checknumber(L, 3);
luax_catchexcept(L, [&](){ t->setDrawRange(rangemin, rangemax); }); luax_catchexcept(L, [&](){ t->setDrawRange(start, count); });
} }
return 0; return 0;
@@ -492,15 +492,13 @@ int w_Mesh_getDrawRange(lua_State *L)
{ {
Mesh *t = luax_checkmesh(L, 1); Mesh *t = luax_checkmesh(L, 1);
int rangemin = -1; int start = 0;
int rangemax = -1; int count = 1;
t->getDrawRange(rangemin, rangemax); if (!t->getDrawRange(start, count))
if (rangemin < 0 || rangemax < 0)
return 0; return 0;
lua_pushinteger(L, rangemin + 1); lua_pushinteger(L, start + 1);
lua_pushinteger(L, rangemax + 1); lua_pushinteger(L, count);
return 2; return 2;
} }