lovr/src/graphics.c

90 lines
2.1 KiB
C
Raw Normal View History

2016-07-09 05:27:34 +00:00
#include "glfw.h"
2016-07-07 07:04:24 +00:00
#include "graphics.h"
2016-07-09 05:27:34 +00:00
#include "model.h"
2016-07-16 05:39:17 +00:00
#include "buffer.h"
2016-07-16 02:17:27 +00:00
#include "shader.h"
2016-07-07 07:04:24 +00:00
#include "util.h"
2016-07-16 05:39:17 +00:00
#include <stdlib.h>
2016-07-07 07:04:24 +00:00
#include <assimp/cimport.h>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
int lovrGraphicsClear(lua_State* L) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
return 0;
}
int lovrGraphicsPresent(lua_State* L) {
glfwSwapBuffers(window);
return 0;
}
2016-07-16 02:17:27 +00:00
// TODO default shader
int lovrGraphicsSetShader(lua_State* L) {
GLuint shader = (GLuint) luaL_checknumber(L, 1);
glUseProgram(shader);
return 0;
}
2016-07-07 07:04:24 +00:00
int lovrGraphicsNewModel(lua_State* L) {
2016-07-16 02:17:27 +00:00
const char* path = luaL_checkstring(L, 1);
2016-07-09 05:27:34 +00:00
const struct aiScene* scene = aiImportFile(path, aiProcessPreset_TargetRealtime_MaxQuality);
2016-07-07 07:04:24 +00:00
2016-07-09 05:27:34 +00:00
if (scene) {
Model* model = scene->mMeshes[0];
luax_pushmodel(L, model);
2016-07-07 07:04:24 +00:00
} else {
2016-07-09 05:27:34 +00:00
lua_pushnil(L);
2016-07-07 07:04:24 +00:00
}
return 1;
}
2016-07-16 05:39:17 +00:00
int lovrGraphicsNewBuffer(lua_State* L) {
2016-07-16 21:22:11 +00:00
int size = luaL_checkint(L, 1);
2016-07-16 05:39:17 +00:00
2016-07-16 21:22:11 +00:00
Buffer* buffer = (Buffer*) malloc(sizeof(Buffer));
2016-07-16 05:39:17 +00:00
2016-07-16 21:22:11 +00:00
buffer->data = (GLfloat*) malloc(size * 3 * sizeof(GLfloat));
2016-07-16 05:39:17 +00:00
2016-07-27 06:17:55 +00:00
glGenBuffers(1, &buffer->vbo);
glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(buffer->data) * sizeof(GL_FLOAT), buffer->data, GL_STATIC_DRAW);
glGenVertexArrays(1, &buffer->vao);
2016-07-16 05:39:17 +00:00
luax_pushbuffer(L, buffer);
return 1;
}
2016-07-16 02:17:27 +00:00
int lovrGraphicsNewShader(lua_State* L) {
const char* vertexShaderSource = luaL_checkstring(L, 1);
const char* fragmentShaderSource = luaL_checkstring(L, 2);
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderSource);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderSource);
GLuint shader = linkShaders(vertexShader, fragmentShader);
if (shader) {
lua_pushnumber(L, shader);
} else {
lua_pushnil(L);
}
return 1;
}
2016-07-07 07:04:24 +00:00
const luaL_Reg lovrGraphics[] = {
{ "clear", lovrGraphicsClear },
{ "present", lovrGraphicsPresent },
2016-07-16 02:17:27 +00:00
{ "setShader", lovrGraphicsSetShader },
2016-07-07 07:04:24 +00:00
{ "newModel", lovrGraphicsNewModel },
2016-07-16 05:39:17 +00:00
{ "newBuffer", lovrGraphicsNewBuffer },
2016-07-16 02:17:27 +00:00
{ "newShader", lovrGraphicsNewShader },
2016-07-07 07:04:24 +00:00
{ NULL, NULL }
};