Improved Buffer constructor; Buffer usage hint;

This commit is contained in:
bjorn 2016-09-17 15:38:13 -07:00
parent 2ad62e4890
commit e6d2fa4afc
6 changed files with 84 additions and 31 deletions

View File

@ -10,27 +10,17 @@ void lovrBufferDestroy(Buffer* buffer) {
}
void lovrBufferDraw(Buffer* buffer) {
GLenum* drawMode = (GLenum*)map_get(&BufferDrawModes, buffer->drawMode);
if (drawMode == NULL) {
error("Invalid buffer draw mode '%s'", buffer->drawMode);
}
glBindVertexArray(buffer->vao);
glEnableVertexAttribArray(0);
glDrawArrays(*drawMode, buffer->rangeStart, buffer->rangeCount);
glDrawArrays(buffer->drawMode, buffer->rangeStart, buffer->rangeCount);
glDisableVertexAttribArray(0);
}
const char* lovrBufferGetDrawMode(Buffer* buffer) {
BufferDrawMode lovrBufferGetDrawMode(Buffer* buffer) {
return buffer->drawMode;
}
int lovrBufferSetDrawMode(Buffer* buffer, const char* drawMode) {
if (!map_get(&BufferDrawModes, drawMode)) {
return 1;
}
int lovrBufferSetDrawMode(Buffer* buffer, BufferDrawMode drawMode) {
buffer->drawMode = drawMode;
return 0;
}
@ -48,7 +38,7 @@ void lovrBufferSetVertex(Buffer* buffer, int index, float x, float y, float z) {
glBindVertexArray(buffer->vao);
glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, buffer->usage);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
}

View File

@ -1,12 +1,25 @@
#include "../glfw.h"
#include "../vendor/map/map.h"
#ifndef LOVR_BUFFER_TYPES
#define LOVR_BUFFER_TYPES
typedef enum {
BUFFER_POINTS = GL_POINTS,
BUFFER_TRIANGLE_STRIP = GL_TRIANGLE_STRIP,
BUFFER_TRIANGLES = GL_TRIANGLES,
BUFFER_TRIANGLE_FAN = GL_TRIANGLE_FAN
} BufferDrawMode;
typedef enum {
BUFFER_STATIC = GL_STATIC_DRAW,
BUFFER_DYNAMIC = GL_DYNAMIC_DRAW,
BUFFER_STREAM = GL_STREAM_DRAW
} BufferUsage;
typedef struct {
int size;
GLfloat* data;
const char* drawMode;
BufferDrawMode drawMode;
BufferUsage usage;
GLuint vao;
GLuint vbo;
int rangeStart;
@ -14,12 +27,10 @@ typedef struct {
} Buffer;
#endif
map_int_t BufferDrawModes;
void lovrBufferDestroy(Buffer* buffer);
void lovrBufferDraw(Buffer* buffer);
const char* lovrBufferGetDrawMode(Buffer* buffer);
int lovrBufferSetDrawMode(Buffer* buffer, const char* drawMode);
BufferDrawMode lovrBufferGetDrawMode(Buffer* buffer);
int lovrBufferSetDrawMode(Buffer* buffer, BufferDrawMode drawMode);
void lovrBufferGetVertex(Buffer* buffer, int index, float* x, float* y, float* z);
void lovrBufferSetVertex(Buffer* buffer, int index, float x, float y, float z);
void lovrBufferGetDrawRange(Buffer* buffer, int* start, int* count);

View File

@ -17,11 +17,7 @@ typedef struct {
static GraphicsState graphicsState;
void lovrGraphicsInit() {
map_init(&BufferDrawModes);
map_set(&BufferDrawModes, "points", GL_POINTS);
map_set(&BufferDrawModes, "strip", GL_TRIANGLE_STRIP);
map_set(&BufferDrawModes, "triangles", GL_TRIANGLES);
map_set(&BufferDrawModes, "fan", GL_TRIANGLE_FAN);
//
}
void lovrGraphicsClear(int color, int depth) {
@ -65,10 +61,11 @@ void lovrGraphicsSetShader(Shader* shader) {
glUseProgram(shader->id);
}
Buffer* lovrGraphicsNewBuffer(int size) {
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) {
Buffer* buffer = malloc(sizeof(Buffer));
buffer->drawMode = "fan";
buffer->drawMode = drawMode;
buffer->usage = usage;
buffer->size = size;
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
buffer->rangeStart = 0;
@ -76,7 +73,7 @@ Buffer* lovrGraphicsNewBuffer(int size) {
glGenBuffers(1, &buffer->vbo);
glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, buffer->usage);
glGenVertexArrays(1, &buffer->vao);

View File

@ -9,6 +9,6 @@ void lovrGraphicsGetClearColor(float* r, float* g, float* b, float* a);
void lovrGraphicsSetClearColor(float r, float g, float b, float a);
Shader* lovrGraphicsGetShader();
void lovrGraphicsSetShader(Shader* shader);
Buffer* lovrGraphicsNewBuffer(int size);
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage);
Model* lovrGraphicsNewModel(const char* path);
Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource);

View File

@ -23,6 +23,18 @@ int l_lovrGraphicsInit(lua_State* L) {
luaRegisterType(L, "Buffer", lovrBuffer, luax_destroybuffer);
luaRegisterType(L, "Model", lovrModel, NULL);
luaRegisterType(L, "Shader", lovrShader, luax_destroyshader);
map_init(&BufferDrawModes);
map_set(&BufferDrawModes, "points", BUFFER_POINTS);
map_set(&BufferDrawModes, "strip", BUFFER_TRIANGLE_STRIP);
map_set(&BufferDrawModes, "triangles", BUFFER_TRIANGLES);
map_set(&BufferDrawModes, "fan", BUFFER_TRIANGLE_FAN);
map_init(&BufferUsages);
map_set(&BufferUsages, "static", BUFFER_STATIC);
map_set(&BufferUsages, "dynamic", BUFFER_DYNAMIC);
map_set(&BufferUsages, "stream", BUFFER_STREAM);
lovrGraphicsInit();
return 1;
}
@ -73,8 +85,47 @@ int l_lovrGraphicsSetShader(lua_State* L) {
}
int l_lovrGraphicsNewBuffer(lua_State* L) {
int size = luaL_checkint(L, 1);
luax_pushbuffer(L, lovrGraphicsNewBuffer(size));
const char* userDrawMode = luaL_optstring(L, 2, "fan");
BufferDrawMode* drawMode = (BufferDrawMode*) map_get(&BufferDrawModes, userDrawMode);
if (!drawMode) {
return luaL_error(L, "Invalid buffer draw mode: '%s'", userDrawMode);
}
const char* userUsage = luaL_optstring(L, 3, "dynamic");
BufferUsage* usage = (BufferUsage*) map_get(&BufferUsages, userUsage);
if (!usage) {
return luaL_error(L, "Invalid buffer usage: '%s'", userUsage);
}
int size;
if (lua_isnumber(L, 1)) {
size = lua_tonumber(L, 1);
} else if (lua_istable(L, 1)) {
size = lua_objlen(L, 1);
} else {
return luaL_argerror(L, 1, "table or number expected");
}
Buffer* buffer = lovrGraphicsNewBuffer(size, *drawMode, *usage);
if (lua_istable(L, 1)) {
float x, y, z;
for (int i = 0; i < size; i++) {
lua_rawgeti(L, 1, i + 1);
lua_rawgeti(L, -1, 1);
lua_rawgeti(L, -2, 2);
lua_rawgeti(L, -3, 3);
x = lua_tonumber(L, -3);
y = lua_tonumber(L, -2);
z = lua_tonumber(L, -1);
lovrBufferSetVertex(buffer, i, x, y, z);
lua_pop(L, 4);
}
}
luax_pushbuffer(L, buffer);
return 1;
}

View File

@ -1,6 +1,10 @@
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include "../vendor/map/map.h"
map_int_t BufferDrawModes;
map_int_t BufferUsages;
extern const luaL_Reg lovrGraphics[];
int l_lovrGraphicsInit(lua_State* L);