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-08-08 01:32:37 +00:00
|
|
|
#include "../glfw.h"
|
|
|
|
#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-28 02:48:59 +00:00
|
|
|
int lovrGraphicsGetClearColor(lua_State* L) {
|
|
|
|
GLfloat clearColor[4];
|
|
|
|
glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor);
|
|
|
|
|
|
|
|
lua_pushnumber(L, clearColor[0]);
|
|
|
|
lua_pushnumber(L, clearColor[1]);
|
|
|
|
lua_pushnumber(L, clearColor[2]);
|
|
|
|
lua_pushnumber(L, clearColor[3]);
|
|
|
|
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
int lovrGraphicsSetClearColor(lua_State* L) {
|
|
|
|
float r = luaL_checknumber(L, 1);
|
|
|
|
float g = luaL_checknumber(L, 2);
|
|
|
|
float b = luaL_checknumber(L, 3);
|
2016-08-08 20:51:22 +00:00
|
|
|
float a = 255.0;
|
2016-07-28 02:48:59 +00:00
|
|
|
|
|
|
|
if (lua_gettop(L) == 4) {
|
|
|
|
a = luaL_checknumber(L, 4);
|
|
|
|
}
|
|
|
|
|
2016-08-08 20:51:22 +00:00
|
|
|
glClearColor(r / 255, g / 255, b / 255, a / 255);
|
2016-07-28 02:48:59 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-07-16 02:17:27 +00:00
|
|
|
// TODO default shader
|
|
|
|
int lovrGraphicsSetShader(lua_State* L) {
|
2016-08-03 04:24:18 +00:00
|
|
|
Shader* shader = (Shader*) luax_checkshader(L, 1);
|
|
|
|
glUseProgram(shader->id);
|
2016-07-16 02:17:27 +00:00
|
|
|
|
|
|
|
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-08-08 20:23:40 +00:00
|
|
|
Buffer* buffer = malloc(sizeof(Buffer));
|
2016-07-16 05:39:17 +00:00
|
|
|
|
2016-08-08 21:40:18 +00:00
|
|
|
buffer->drawMode = "fan";
|
|
|
|
buffer->size = size;
|
|
|
|
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
|
2016-08-09 01:27:35 +00:00
|
|
|
buffer->rangeStart = 0;
|
|
|
|
buffer->rangeCount = buffer->size;
|
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);
|
2016-08-08 21:40:18 +00:00
|
|
|
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, GL_STATIC_DRAW);
|
2016-07-27 06:17:55 +00:00
|
|
|
|
|
|
|
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);
|
2016-08-03 04:24:18 +00:00
|
|
|
GLuint id = linkShaders(vertexShader, fragmentShader);
|
|
|
|
|
|
|
|
Shader* shader = (Shader*) malloc(sizeof(Shader));
|
|
|
|
shader->id = id;
|
2016-07-16 02:17:27 +00:00
|
|
|
|
|
|
|
if (shader) {
|
2016-08-03 04:24:18 +00:00
|
|
|
luax_pushshader(L, shader);
|
2016-07-16 02:17:27 +00:00
|
|
|
} else {
|
|
|
|
lua_pushnil(L);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2016-07-07 07:04:24 +00:00
|
|
|
const luaL_Reg lovrGraphics[] = {
|
|
|
|
{ "clear", lovrGraphicsClear },
|
|
|
|
{ "present", lovrGraphicsPresent },
|
2016-07-28 02:48:59 +00:00
|
|
|
{ "getClearColor", lovrGraphicsGetClearColor },
|
|
|
|
{ "setClearColor", lovrGraphicsSetClearColor },
|
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 }
|
|
|
|
};
|
2016-08-01 00:21:04 +00:00
|
|
|
|
2016-08-05 21:02:09 +00:00
|
|
|
int lovrInitGraphics(lua_State* L) {
|
2016-08-01 00:21:04 +00:00
|
|
|
lua_newtable(L);
|
|
|
|
luaL_register(L, NULL, lovrGraphics);
|
2016-08-08 20:23:40 +00:00
|
|
|
luaRegisterType(L, "Model", lovrModel, NULL);
|
|
|
|
luaRegisterType(L, "Buffer", lovrBuffer, luax_destroybuffer);
|
|
|
|
luaRegisterType(L, "Shader", lovrShader, luax_destroyshader);
|
2016-08-08 21:40:18 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
|
2016-08-01 00:21:04 +00:00
|
|
|
return 1;
|
|
|
|
}
|