mirror of https://github.com/bjornbytes/lovr.git
Improved Buffer constructor; Buffer usage hint;
This commit is contained in:
parent
2ad62e4890
commit
e6d2fa4afc
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue