Browse Source

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

--HG--
branch : minor
Alex Szpakowski 9 years ago
parent
commit
7ab76b1ef6

+ 33 - 27
src/modules/graphics/opengl/Mesh.cpp

@@ -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)
-	, rangeMax(-1)
+	, rangeStart(-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)
-	, rangeMax(-1)
+	, rangeStart(-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;
-	rangeMax = max;
+	rangeStart = start;
+	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;
-	max = rangeMax;
+	if (rangeStart < 0 || rangeCount < 0)
+		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;
-		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;
 		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;
-		if (rangeMax >= 0)
-			max = std::min(rangeMax, max);
+		int start = std::min(std::max(0, rangeStart), (int) vertexCount - 1);
+
+		int count = (int) vertexCount;
+		if (rangeCount > 0)
+			count = std::min(count, rangeCount);
 
 
-		int min = 0;
-		if (rangeMin >= 0)
-			min = std::min(rangeMin, max);
+		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
src/modules/graphics/opengl/Mesh.h

@@ -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 rangeMax;
+	int rangeStart;
+	int rangeCount;
 
 
 	StrongRef<Texture> texture;
 	StrongRef<Texture> texture;
 
 

+ 8 - 10
src/modules/graphics/opengl/wrap_Mesh.cpp

@@ -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 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;
 	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 rangemax = -1;
-	t->getDrawRange(rangemin, rangemax);
-
-	if (rangemin < 0 || rangemax < 0)
+	int start = 0;
+	int count = 1;
+	if (!t->getDrawRange(start, count))
 		return 0;
 		return 0;
 
 
-	lua_pushinteger(L, rangemin + 1);
-	lua_pushinteger(L, rangemax + 1);
+	lua_pushinteger(L, start + 1);
+	lua_pushinteger(L, count);
 	return 2;
 	return 2;
 }
 }