Start matrix stack operations;

This commit is contained in:
bjorn 2016-09-21 00:55:53 -07:00
parent 4eb449c63d
commit 579a3f9b72
5 changed files with 47 additions and 4 deletions

View File

@ -12,12 +12,13 @@
typedef struct {
Shader* activeShader;
vec_mat4_t transforms;
} GraphicsState;
static GraphicsState graphicsState;
GraphicsState graphicsState;
void lovrGraphicsInit() {
//
vec_init(&graphicsState.transforms);
}
void lovrGraphicsClear(int color, int depth) {
@ -61,6 +62,20 @@ void lovrGraphicsSetShader(Shader* shader) {
glUseProgram(shader->id);
}
int lovrGraphicsPush() {
vec_mat4_t* transforms = &graphicsState.transforms;
if (transforms->length > 64) { return 1; }
vec_push(transforms, transforms->length > 0 ? mat4_copy(vec_last(transforms)) : mat4_init());
return 0;
}
int lovrGraphicsPop() {
vec_mat4_t* transforms = &graphicsState.transforms;
if (transforms->length == 0) { return 1; }
mat4_deinit(vec_pop(transforms));
return 0;
}
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) {
Buffer* buffer = malloc(sizeof(Buffer));

View File

@ -1,6 +1,12 @@
#include "buffer.h"
#include "model.h"
#include "shader.h"
#include "../matrix.h"
#ifndef LOVR_GRAPHICS_TYPES
#define LOVR_GRAPHICS_TYPES
typedef vec_t(mat4) vec_mat4_t;
#endif
void lovrGraphicsInit();
void lovrGraphicsClear(int color, int depth);
@ -9,6 +15,8 @@ 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);
int lovrGraphicsPush();
int lovrGraphicsPop();
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage);
Model* lovrGraphicsNewModel(const char* path);
Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource);

View File

@ -11,6 +11,8 @@ const luaL_Reg lovrGraphics[] = {
{ "getClearColor", l_lovrGraphicsGetClearColor },
{ "setClearColor", l_lovrGraphicsSetClearColor },
{ "setShader", l_lovrGraphicsSetShader },
{ "push", l_lovrGraphicsPush },
{ "pop", l_lovrGraphicsPop },
{ "newModel", l_lovrGraphicsNewModel },
{ "newBuffer", l_lovrGraphicsNewBuffer },
{ "newShader", l_lovrGraphicsNewShader },
@ -84,6 +86,22 @@ int l_lovrGraphicsSetShader(lua_State* L) {
return 0;
}
int l_lovrGraphicsPush(lua_State* L) {
if (lovrGraphicsPush()) {
return luaL_error(L, "Unbalanced matrix stack (more pushes than pops?)");
}
return 0;
}
int l_lovrGraphicsPop(lua_State* L) {
if (lovrGraphicsPop()) {
return luaL_error(L, "Unbalanced matrix stack (more pops than pushes?)");
}
return 0;
}
int l_lovrGraphicsNewBuffer(lua_State* L) {
const char* userDrawMode = luaL_optstring(L, 2, "fan");
BufferDrawMode* drawMode = (BufferDrawMode*) map_get(&BufferDrawModes, userDrawMode);

View File

@ -14,6 +14,8 @@ int l_lovrGraphicsGetClearColor(lua_State* L);
int l_lovrGraphicsSetClearColor(lua_State* L);
int l_lovrGraphicsGetShader(lua_State* L);
int l_lovrGraphicsSetShader(lua_State* L);
int l_lovrGraphicsPush(lua_State* L);
int l_lovrGraphicsPop(lua_State* L);
int l_lovrGraphicsNewBuffer(lua_State* L);
int l_lovrGraphicsNewModel(lua_State* L);
int l_lovrGraphicsNewShader(lua_State* L);

View File

@ -10,8 +10,8 @@
*/
mat4 mat4_init() {
mat4 matrix = calloc(16, sizeof(float));
return matrix;
mat4 matrix = malloc(16 * sizeof(float));
return mat4_setIdentity(matrix);
}
mat4 mat4_copy(mat4 source) {