Start Model; Reorganize constructors;

This commit is contained in:
bjorn 2016-10-03 21:54:27 -07:00
parent 8ac95f4038
commit 3aa079b531
16 changed files with 107 additions and 67 deletions

View File

@ -12,13 +12,14 @@ LIBS += -pagezero_size 10000 -image_base 100000000 # OSX magic for LuaJIT
export DYLD_LIBRARY_PATH;
: foreach vendor/map/*.c |> clang -c %f -o %o |> obj/%B.o
: foreach vendor/vec/*.c |> clang -c %f -o %o |> obj/%B.o
: foreach vendor/map/*.c |> clang -c %f -o %o |> obj/vendor_%B.o
: foreach vendor/vec/*.c |> clang -c %f -o %o |> obj/vendor_%B.o
: foreach event/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/%B.o
: foreach graphics/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/%B.o
: foreach headset/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/%B.o
: foreach timer/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/%B.o
: foreach event/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/event_%B.o
: foreach graphics/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/graphics_%B.o
: foreach headset/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/headset_%B.o
: foreach model/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/model_%B.o
: foreach timer/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/timer_%B.o
: foreach lovr/*.c |> clang -c %f -o %o $(CFLAGS) |> obj/lovr_%B.o
: foreach *.c |> clang -c %f -o %o $(CFLAGS) |> obj/%B.o

View File

@ -2,6 +2,31 @@
#include "graphics.h"
#include <stdlib.h>
Buffer* lovrBufferCreate(int size, BufferDrawMode drawMode, BufferUsage usage) {
Buffer* buffer = malloc(sizeof(Buffer));
buffer->drawMode = drawMode;
buffer->usage = usage;
buffer->size = size;
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
buffer->vao = 0;
buffer->vbo = 0;
buffer->ibo = 0;
buffer->isRangeEnabled = 0;
buffer->rangeStart = 0;
buffer->rangeCount = buffer->size;
glGenBuffers(1, &buffer->vbo);
glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, buffer->usage);
glGenVertexArrays(1, &buffer->vao);
vec_init(&buffer->map);
return buffer;
}
void lovrBufferDestroy(Buffer* buffer) {
glDeleteBuffers(1, &buffer->vbo);
glDeleteVertexArrays(1, &buffer->vao);

View File

@ -31,6 +31,7 @@ typedef struct {
} Buffer;
#endif
Buffer* lovrBufferCreate(int size, BufferDrawMode drawMode, BufferUsage usage);
void lovrBufferDestroy(Buffer* buffer);
void lovrBufferDraw(Buffer* buffer);
BufferDrawMode lovrBufferGetDrawMode(Buffer* buffer);

View File

@ -10,7 +10,7 @@
#include <assimp/cimport.h>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include "../headset/headset.h"
#include "../model/model.h"
static GraphicsState state;
@ -19,7 +19,7 @@ void lovrGraphicsInit() {
state.projection = mat4_init();
state.lastTransform = mat4_init();
state.lastProjection = mat4_init();
state.defaultShader = lovrGraphicsNewShader(lovrDefaultVertexShader, lovrDefaultFragmentShader);
state.defaultShader = lovrShaderCreate(lovrDefaultVertexShader, lovrDefaultFragmentShader);
state.lastColor = 0;
glGenBuffers(1, &state.shapeBuffer);
glGenBuffers(1, &state.shapeIndexBuffer);
@ -404,53 +404,3 @@ void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, floa
lovrGraphicsPop();
}
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) {
Buffer* buffer = malloc(sizeof(Buffer));
buffer->drawMode = drawMode;
buffer->usage = usage;
buffer->size = size;
buffer->data = malloc(buffer->size * 3 * sizeof(GLfloat));
buffer->vao = 0;
buffer->vbo = 0;
buffer->ibo = 0;
buffer->isRangeEnabled = 0;
buffer->rangeStart = 0;
buffer->rangeCount = buffer->size;
glGenBuffers(1, &buffer->vbo);
glBindBuffer(GL_ARRAY_BUFFER, buffer->vbo);
glBufferData(GL_ARRAY_BUFFER, buffer->size * 3 * sizeof(GLfloat), buffer->data, buffer->usage);
glGenVertexArrays(1, &buffer->vao);
vec_init(&buffer->map);
return buffer;
}
Model* lovrGraphicsNewModel(const char* path) {
const struct aiScene* scene = aiImportFile(path, aiProcessPreset_TargetRealtime_MaxQuality);
if (scene) {
return scene->mMeshes[0];
}
return NULL;
}
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);
GLuint id = linkShaders(vertexShader, fragmentShader);
Shader* shader = (Shader*) malloc(sizeof(Shader));
shader->id = id;
return shader;
}

View File

@ -91,6 +91,3 @@ void lovrGraphicsDrawShape();
void lovrGraphicsLine(float* points, int count);
void lovrGraphicsPlane(DrawMode mode, float x, float y, float z, float size, float nx, float ny, float nz);
void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ);
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage);
Model* lovrGraphicsNewModel(const char* path);
Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource);

View File

@ -1 +1,13 @@
#include "model.h"
#include <stdlib.h>
Model* lovrModelCreate(const char* filename) {
Model* model = malloc(sizeof(model));
model->modelData = lovrModelDataCreate(filename);
return model;
}
void lovrModelDestroy(Model* model) {
lovrModelDataDestroy(model->modelData);
free(model);
}

View File

@ -1,6 +1,11 @@
#include <assimp/scene.h>
#include "../model/modelData.h"
#ifndef LOVR_MODEL_TYPES
#define LOVR_MODEL_TYPES
typedef const struct aiMesh Model;
typedef struct {
ModelData* modelData;
} Model;
#endif
Model* lovrModelCreate(const char* filename);
void lovrModelDestroy(Model* model);

View File

@ -79,6 +79,21 @@ GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader) {
return shader;
}
Shader* lovrShaderCreate(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);
GLuint id = linkShaders(vertexShader, fragmentShader);
Shader* shader = (Shader*) malloc(sizeof(Shader));
shader->id = id;
return shader;
}
void lovrShaderDestroy(Shader* shader) {
glDeleteProgram(shader->id);
free(shader);

View File

@ -15,6 +15,7 @@ extern const char* lovrDefaultFragmentShader;
GLuint compileShader(GLuint type, const char* filename);
GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader);
Shader* lovrShaderCreate(const char* vertexSource, const char* fragmentSource);
void lovrShaderDestroy(Shader* shader);
int lovrShaderGetUniformId(Shader* shader, const char* name);
void lovrShaderGetUniformType(Shader* shader, int id, GLenum* type, int* size);

View File

@ -48,7 +48,7 @@ int l_lovrGraphicsInit(lua_State* L) {
lua_newtable(L);
luaL_register(L, NULL, lovrGraphics);
luaRegisterType(L, "Buffer", lovrBuffer, luax_destroybuffer);
luaRegisterType(L, "Model", lovrModel, NULL);
luaRegisterType(L, "Model", lovrModel, luax_destroymodel);
luaRegisterType(L, "Shader", lovrShader, luax_destroyshader);
map_init(&BufferDrawModes);
@ -425,7 +425,7 @@ int l_lovrGraphicsNewBuffer(lua_State* L) {
return luaL_argerror(L, 1, "table or number expected");
}
Buffer* buffer = lovrGraphicsNewBuffer(size, *drawMode, *usage);
Buffer* buffer = lovrBufferCreate(size, *drawMode, *usage);
if (lua_istable(L, 1)) {
float x, y, z;
@ -448,13 +448,13 @@ int l_lovrGraphicsNewBuffer(lua_State* L) {
int l_lovrGraphicsNewModel(lua_State* L) {
const char* path = luaL_checkstring(L, 1);
luax_pushmodel(L, lovrGraphicsNewModel(path));
luax_pushmodel(L, lovrModelCreate(path));
return 1;
}
int l_lovrGraphicsNewShader(lua_State* L) {
const char* vertexSource = luaL_checkstring(L, 1);
const char* fragmentSource = luaL_checkstring(L, 2);
luax_pushshader(L, lovrGraphicsNewShader(vertexSource, fragmentSource));
luax_pushshader(L, lovrShaderCreate(vertexSource, fragmentSource));
return 1;
}

View File

@ -15,6 +15,10 @@ Model* luax_checkmodel(lua_State* L, int index) {
return *(Model**) luaL_checkudata(L, index, "Model");
}
int luax_destroymodel(lua_State* L) {
return 0;
}
const luaL_Reg lovrModel[] = {
{ NULL, NULL }
};

View File

@ -5,4 +5,5 @@
void luax_pushmodel(lua_State* L, Model* model);
Model* luax_checkmodel(lua_State* L, int index);
int luax_destroymodel(lua_State* L);
extern const luaL_Reg lovrModel[];

1
src/model/model.c Normal file
View File

@ -0,0 +1 @@
// This page intentionally left blank

1
src/model/model.h Normal file
View File

@ -0,0 +1 @@
// This page intentionally left blank

14
src/model/modelData.c Normal file
View File

@ -0,0 +1,14 @@
#include "modelData.h"
#include <assimp/cimport.h>
#include <assimp/postprocess.h>
ModelData* lovrModelDataCreate(const char* filename) {
ModelData* modelData = malloc(sizeof(ModelData));
modelData->scene = aiImportFile(filename, aiProcessPreset_TargetRealtime_MaxQuality);
return modelData;
}
void lovrModelDataDestroy(ModelData* modelData) {
aiReleaseImport(modelData->scene);
free(modelData);
}

12
src/model/modelData.h Normal file
View File

@ -0,0 +1,12 @@
#include <stdlib.h>
#include <assimp/scene.h>
#ifndef LOVR_MODEL_DATA_TYPES
#define LOVR_MODEL_DATA_TYPES
typedef struct {
const struct aiScene* scene;
} ModelData;
#endif
ModelData* lovrModelDataCreate(const char* filename);
void lovrModelDataDestroy(ModelData* modelData);