mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-02 20:43:35 +00:00
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) {
|
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);
|
glBindVertexArray(buffer->vao);
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
glDrawArrays(*drawMode, buffer->rangeStart, buffer->rangeCount);
|
glDrawArrays(buffer->drawMode, buffer->rangeStart, buffer->rangeCount);
|
||||||
glDisableVertexAttribArray(0);
|
glDisableVertexAttribArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* lovrBufferGetDrawMode(Buffer* buffer) {
|
BufferDrawMode lovrBufferGetDrawMode(Buffer* buffer) {
|
||||||
return buffer->drawMode;
|
return buffer->drawMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrBufferSetDrawMode(Buffer* buffer, const char* drawMode) {
|
int lovrBufferSetDrawMode(Buffer* buffer, BufferDrawMode drawMode) {
|
||||||
if (!map_get(&BufferDrawModes, drawMode)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->drawMode = drawMode;
|
buffer->drawMode = drawMode;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +38,7 @@ void lovrBufferSetVertex(Buffer* buffer, int index, float x, float y, float z) {
|
||||||
|
|
||||||
glBindVertexArray(buffer->vao);
|
glBindVertexArray(buffer->vao);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 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);
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,25 @@
|
||||||
#include "../glfw.h"
|
#include "../glfw.h"
|
||||||
#include "../vendor/map/map.h"
|
|
||||||
|
|
||||||
#ifndef LOVR_BUFFER_TYPES
|
#ifndef LOVR_BUFFER_TYPES
|
||||||
#define 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 {
|
typedef struct {
|
||||||
int size;
|
int size;
|
||||||
GLfloat* data;
|
GLfloat* data;
|
||||||
const char* drawMode;
|
BufferDrawMode drawMode;
|
||||||
|
BufferUsage usage;
|
||||||
GLuint vao;
|
GLuint vao;
|
||||||
GLuint vbo;
|
GLuint vbo;
|
||||||
int rangeStart;
|
int rangeStart;
|
||||||
|
@ -14,12 +27,10 @@ typedef struct {
|
||||||
} Buffer;
|
} Buffer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
map_int_t BufferDrawModes;
|
|
||||||
|
|
||||||
void lovrBufferDestroy(Buffer* buffer);
|
void lovrBufferDestroy(Buffer* buffer);
|
||||||
void lovrBufferDraw(Buffer* buffer);
|
void lovrBufferDraw(Buffer* buffer);
|
||||||
const char* lovrBufferGetDrawMode(Buffer* buffer);
|
BufferDrawMode lovrBufferGetDrawMode(Buffer* buffer);
|
||||||
int lovrBufferSetDrawMode(Buffer* buffer, const char* drawMode);
|
int lovrBufferSetDrawMode(Buffer* buffer, BufferDrawMode drawMode);
|
||||||
void lovrBufferGetVertex(Buffer* buffer, int index, float* x, float* y, float* z);
|
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 lovrBufferSetVertex(Buffer* buffer, int index, float x, float y, float z);
|
||||||
void lovrBufferGetDrawRange(Buffer* buffer, int* start, int* count);
|
void lovrBufferGetDrawRange(Buffer* buffer, int* start, int* count);
|
||||||
|
|
|
@ -17,11 +17,7 @@ typedef struct {
|
||||||
static GraphicsState graphicsState;
|
static GraphicsState graphicsState;
|
||||||
|
|
||||||
void lovrGraphicsInit() {
|
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) {
|
void lovrGraphicsClear(int color, int depth) {
|
||||||
|
@ -65,10 +61,11 @@ void lovrGraphicsSetShader(Shader* shader) {
|
||||||
glUseProgram(shader->id);
|
glUseProgram(shader->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer* lovrGraphicsNewBuffer(int size) {
|
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) {
|
||||||
Buffer* buffer = malloc(sizeof(Buffer));
|
Buffer* buffer = malloc(sizeof(Buffer));
|
||||||
|
|
||||||
buffer->drawMode = "fan";
|
buffer->drawMode = drawMode;
|
||||||
|
buffer->usage = usage;
|
||||||
buffer->size = size;
|
buffer->size = size;
|
||||||
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
|
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
|
||||||
buffer->rangeStart = 0;
|
buffer->rangeStart = 0;
|
||||||
|
@ -76,7 +73,7 @@ Buffer* lovrGraphicsNewBuffer(int size) {
|
||||||
|
|
||||||
glGenBuffers(1, &buffer->vbo);
|
glGenBuffers(1, &buffer->vbo);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 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);
|
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);
|
void lovrGraphicsSetClearColor(float r, float g, float b, float a);
|
||||||
Shader* lovrGraphicsGetShader();
|
Shader* lovrGraphicsGetShader();
|
||||||
void lovrGraphicsSetShader(Shader* shader);
|
void lovrGraphicsSetShader(Shader* shader);
|
||||||
Buffer* lovrGraphicsNewBuffer(int size);
|
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage);
|
||||||
Model* lovrGraphicsNewModel(const char* path);
|
Model* lovrGraphicsNewModel(const char* path);
|
||||||
Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource);
|
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, "Buffer", lovrBuffer, luax_destroybuffer);
|
||||||
luaRegisterType(L, "Model", lovrModel, NULL);
|
luaRegisterType(L, "Model", lovrModel, NULL);
|
||||||
luaRegisterType(L, "Shader", lovrShader, luax_destroyshader);
|
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();
|
lovrGraphicsInit();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -73,8 +85,47 @@ int l_lovrGraphicsSetShader(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsNewBuffer(lua_State* L) {
|
int l_lovrGraphicsNewBuffer(lua_State* L) {
|
||||||
int size = luaL_checkint(L, 1);
|
const char* userDrawMode = luaL_optstring(L, 2, "fan");
|
||||||
luax_pushbuffer(L, lovrGraphicsNewBuffer(size));
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
|
#include "../vendor/map/map.h"
|
||||||
|
|
||||||
|
map_int_t BufferDrawModes;
|
||||||
|
map_int_t BufferUsages;
|
||||||
|
|
||||||
extern const luaL_Reg lovrGraphics[];
|
extern const luaL_Reg lovrGraphics[];
|
||||||
int l_lovrGraphicsInit(lua_State* L);
|
int l_lovrGraphicsInit(lua_State* L);
|
||||||
|
|
Loading…
Reference in a new issue