lovr/src/graphics/graphics.c

128 lines
3.2 KiB
C
Raw Normal View History

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-09-14 00:02:23 +00:00
#include "../headset/headset.h"
typedef struct {
Shader* activeShader;
2016-09-21 07:55:53 +00:00
vec_mat4_t transforms;
2016-09-14 00:02:23 +00:00
} GraphicsState;
2016-09-21 07:58:31 +00:00
static GraphicsState graphicsState;
2016-07-07 07:04:24 +00:00
2016-08-10 06:28:17 +00:00
void lovrGraphicsInit() {
2016-09-21 07:55:53 +00:00
vec_init(&graphicsState.transforms);
2016-08-10 06:28:17 +00:00
}
2016-07-07 07:04:24 +00:00
2016-09-17 03:11:11 +00:00
void lovrGraphicsClear(int color, int depth) {
int bits = 0;
if (color) {
bits |= GL_COLOR_BUFFER_BIT;
}
if (depth) {
bits |= GL_DEPTH_BUFFER_BIT;
}
glClear(bits);
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-09-14 00:02:23 +00:00
Shader* lovrGraphicsGetShader() {
return graphicsState.activeShader;
}
2016-07-16 02:17:27 +00:00
// TODO default shader
2016-08-10 06:28:17 +00:00
void lovrGraphicsSetShader(Shader* shader) {
2016-09-14 00:02:23 +00:00
graphicsState.activeShader = shader;
2016-08-03 04:24:18 +00:00
glUseProgram(shader->id);
2016-07-16 02:17:27 +00:00
}
2016-09-21 07:55:53 +00:00
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) {
2016-08-08 20:23:40 +00:00
Buffer* buffer = malloc(sizeof(Buffer));
2016-07-16 05:39:17 +00:00
buffer->drawMode = drawMode;
buffer->usage = usage;
2016-08-08 21:40:18 +00:00
buffer->size = size;
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
2016-09-18 00:52:52 +00:00
buffer->vao = 0;
buffer->vbo = 0;
buffer->ibo = 0;
buffer->isRangeEnabled = 0;
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);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, buffer->usage);
2016-07-27 06:17:55 +00:00
glGenVertexArrays(1, &buffer->vao);
2016-09-18 00:52:52 +00:00
vec_init(&buffer->map);
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) {
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
}