From 2185922d384ac752ed3450e6cc6bb75c28e2b725 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 8 Aug 2016 18:27:35 -0700 Subject: [PATCH] Buffer draw range; --- src/graphics/buffer.c | 26 +++++++++++++++++++++++++- src/graphics/buffer.h | 4 ++++ src/graphics/graphics.c | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/graphics/buffer.c b/src/graphics/buffer.c index dc6032e2..16c87989 100644 --- a/src/graphics/buffer.c +++ b/src/graphics/buffer.c @@ -31,7 +31,7 @@ int lovrBufferDraw(lua_State* L) { glBindVertexArray(buffer->vao); glEnableVertexAttribArray(0); - glDrawArrays(*drawMode, 0, buffer->size); + glDrawArrays(*drawMode, buffer->rangeStart, buffer->rangeCount); glDisableVertexAttribArray(0); return 0; @@ -86,11 +86,35 @@ int lovrBufferSetVertex(lua_State* L) { return 0; } +int lovrBufferGetDrawRange(lua_State* L) { + Buffer* buffer = luax_checkbuffer(L, 1); + lua_pushnumber(L, buffer->rangeStart + 1); + lua_pushnumber(L, buffer->rangeStart + 1 + buffer->rangeCount); + return 2; +} + +int lovrBufferSetDrawRange(lua_State* L) { + Buffer* buffer = luax_checkbuffer(L, 1); + int rangeStart = luaL_checknumber(L, 2); + int rangeEnd = luaL_checknumber(L, 3); + + if (rangeStart <= 0 || rangeEnd <= 0 || rangeStart > rangeEnd) { + return luaL_error(L, "Invalid buffer draw range (%d, %d)", rangeStart, rangeEnd); + } + + buffer->rangeStart = rangeStart - 1; + buffer->rangeCount = rangeEnd - rangeStart + 1; + + return 0; +} + const luaL_Reg lovrBuffer[] = { { "draw", lovrBufferDraw }, { "getVertex", lovrBufferGetVertex }, { "setVertex", lovrBufferSetVertex }, { "getDrawMode", lovrBufferGetDrawMode }, { "setDrawMode", lovrBufferSetDrawMode }, + { "getDrawRange", lovrBufferGetDrawRange }, + { "setDrawRange", lovrBufferSetDrawRange }, { NULL, NULL } }; diff --git a/src/graphics/buffer.h b/src/graphics/buffer.h index 2b5d677e..29b56711 100644 --- a/src/graphics/buffer.h +++ b/src/graphics/buffer.h @@ -10,6 +10,8 @@ typedef struct { const char* drawMode; GLuint vao; GLuint vbo; + int rangeStart; + int rangeCount; } Buffer; map_int_t BufferDrawModes; @@ -23,5 +25,7 @@ int lovrBufferGetVertex(lua_State* L); int lovrBufferSetVertex(lua_State* L); int lovrBufferGetDrawMode(lua_State* L); int lovrBufferSetDrawMode(lua_State* L); +int lovrBufferGetDrawRange(lua_State* L); +int lovrBufferSetDrawRange(lua_State* L); extern const luaL_Reg lovrBuffer[]; diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 20d06c87..08799cb2 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -78,6 +78,8 @@ int lovrGraphicsNewBuffer(lua_State* L) { buffer->drawMode = "fan"; buffer->size = size; buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat)); + buffer->rangeStart = 0; + buffer->rangeCount = buffer->size; glGenBuffers(1, &buffer->vbo); glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);