Buffer draw range;

This commit is contained in:
bjorn 2016-08-08 18:27:35 -07:00
parent 207de93301
commit 2185922d38
3 changed files with 31 additions and 1 deletions

View File

@ -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 }
};

View File

@ -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[];

View File

@ -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);