From d4f20c83793e9f9068f0e50e93c60e7b141a7c3b Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 29 Sep 2016 19:39:25 -0700 Subject: [PATCH] lovr.graphics.line; --- src/graphics/graphics.c | 9 +++++++-- src/graphics/graphics.h | 6 ++++++ src/lovr/graphics.c | 36 ++++++++++++++++++++++++++++++++++++ src/lovr/graphics.h | 1 + 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 3e6cf5e5..dc5a1a3a 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -243,11 +243,16 @@ void lovrGraphicsSetShapeData(float* data, int count) { glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); } -void lovrGraphicsDrawShape() { +void lovrGraphicsDrawShape(DrawMode mode) { lovrGraphicsPrepare(); glBindVertexArray(state.shapeArray); glEnableVertexAttribArray(0); - glDrawArrays(GL_TRIANGLE_FAN, 0, state.shapeData.length / 3); + glDrawArrays(mode, 0, state.shapeData.length / 3); +} + +void lovrGraphicsLine(float* points, int count) { + lovrGraphicsSetShapeData(points, count); + lovrGraphicsDrawShape(DRAW_MODE_LINE); } Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) { diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index 0af9ca00..7fd1f936 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -20,6 +20,11 @@ typedef struct { int height; } ScissorRectangle; +typedef enum { + DRAW_MODE_FILL = GL_TRIANGLE_FAN, + DRAW_MODE_LINE = GL_LINE_STRIP +} DrawMode; + typedef struct { Shader* activeShader; Shader* defaultShader; @@ -67,6 +72,7 @@ void lovrGraphicsTransform(mat4 transform); void lovrGraphicsGetDimensions(int* width, int* height); void lovrGraphicsSetShapeData(float* data, int count); void lovrGraphicsDrawShape(); +void lovrGraphicsLine(float* points, int count); Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage); Model* lovrGraphicsNewModel(const char* path); Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource); diff --git a/src/lovr/graphics.c b/src/lovr/graphics.c index 11116f00..d94ab1ae 100644 --- a/src/lovr/graphics.c +++ b/src/lovr/graphics.c @@ -25,6 +25,7 @@ const luaL_Reg lovrGraphics[] = { { "translate", l_lovrGraphicsTranslate }, { "rotate", l_lovrGraphicsRotate }, { "scale", l_lovrGraphicsScale }, + { "line", l_lovrGraphicsLine }, { "getWidth", l_lovrGraphicsGetWidth }, { "getHeight", l_lovrGraphicsGetHeight }, { "getDimensions", l_lovrGraphicsGetDimensions }, @@ -244,6 +245,41 @@ int l_lovrGraphicsScale(lua_State* L) { return 0; } +int l_lovrGraphicsLine(lua_State* L) { + vec_float_t points; + vec_init(&points); + int isTable = lua_istable(L, 1); + + if (!isTable && !lua_isnumber(L, 1)) { + return luaL_error(L, "Expected number or table, got '%s'", lua_typename(L, lua_type(L, 1))); + } + + int count = isTable ? lua_objlen(L, 1) : lua_gettop(L); + if (count % 3 != 0) { + vec_deinit(&points); + return luaL_error(L, "Number of coordinates must be a multiple of 3, got '%d'", count); + } + + vec_reserve(&points, count); + + if (isTable) { + for (int i = 1; i <= count; i++) { + lua_rawgeti(L, 1, i); + vec_push(&points, lua_tonumber(L, -1)); + lua_pop(L, 1); + } + } else { + for (int i = 1; i <= count; i++) { + vec_push(&points, lua_tonumber(L, i)); + } + } + + lovrGraphicsSetShapeData(points.data, count); + lovrGraphicsDrawShape(DRAW_MODE_LINE); + vec_deinit(&points); + return 0; +} + int l_lovrGraphicsGetWidth(lua_State* L) { int width; lovrGraphicsGetDimensions(&width, NULL); diff --git a/src/lovr/graphics.h b/src/lovr/graphics.h index c11a6b67..a776bb88 100644 --- a/src/lovr/graphics.h +++ b/src/lovr/graphics.h @@ -28,6 +28,7 @@ int l_lovrGraphicsOrigin(lua_State* L); int l_lovrGraphicsTranslate(lua_State* L); int l_lovrGraphicsRotate(lua_State* L); int l_lovrGraphicsScale(lua_State* L); +int l_lovrGraphicsLine(lua_State* L); int l_lovrGraphicsGetWidth(lua_State* L); int l_lovrGraphicsGetHeight(lua_State* L); int l_lovrGraphicsGetDimensions(lua_State* L);