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>
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
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);
|
|
|
|
}
|
2016-07-07 07:04:24 +00:00
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
void lovrGraphicsClear() {
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2016-07-07 07:04:24 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
void lovrGraphicsPresent() {
|
2016-07-07 07:04:24 +00:00
|
|
|
glfwSwapBuffers(window);
|
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
void lovrGraphicsGetClearColor(float* r, float* g, float* b, float* a) {
|
2016-07-28 02:48:59 +00:00
|
|
|
GLfloat clearColor[4];
|
|
|
|
glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor);
|
2016-08-10 06:28:17 +00:00
|
|
|
*r = clearColor[0];
|
|
|
|
*g = clearColor[1];
|
|
|
|
*b = clearColor[2];
|
|
|
|
*a = clearColor[3];
|
2016-07-28 02:48:59 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
void lovrGraphicsSetClearColor(float r, float g, float b, float a) {
|
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
|
|
|
}
|
|
|
|
|
2016-07-16 02:17:27 +00:00
|
|
|
// TODO default shader
|
2016-08-10 06:28:17 +00:00
|
|
|
void lovrGraphicsSetShader(Shader* shader) {
|
2016-08-03 04:24:18 +00:00
|
|
|
glUseProgram(shader->id);
|
2016-07-16 02:17:27 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
Buffer* lovrGraphicsNewBuffer(int size) {
|
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-08-10 06:28:17 +00:00
|
|
|
return buffer;
|
2016-07-16 05:39:17 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
Model* lovrGraphicsNewModel(const char* path) {
|
|
|
|
const struct aiScene* scene = aiImportFile(path, aiProcessPreset_TargetRealtime_MaxQuality);
|
2016-07-16 02:17:27 +00:00
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
if (scene) {
|
|
|
|
return scene->mMeshes[0];
|
2016-07-16 02:17:27 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
return NULL;
|
2016-07-16 02:17:27 +00:00
|
|
|
}
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource) {
|
2016-08-28 20:36:54 +00:00
|
|
|
char fullVertexSource[1024];
|
|
|
|
snprintf(fullVertexSource, sizeof(fullVertexSource), "%s\n%s", lovrShaderVertexPrefix, vertexSource);
|
|
|
|
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, fullVertexSource);
|
|
|
|
|
|
|
|
char fullFragmentSource[1024];
|
|
|
|
snprintf(fullFragmentSource, sizeof(fullFragmentSource), "%s\n%s", lovrShaderFragmentPrefix, fragmentSource);
|
|
|
|
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fullFragmentSource);
|
|
|
|
|
2016-08-10 06:28:17 +00:00
|
|
|
GLuint id = linkShaders(vertexShader, fragmentShader);
|
|
|
|
Shader* shader = (Shader*) malloc(sizeof(Shader));
|
|
|
|
shader->id = id;
|
|
|
|
return shader;
|
2016-08-01 00:21:04 +00:00
|
|
|
}
|