mirror of https://github.com/bjornbytes/lovr.git
Start Model; Reorganize constructors;
This commit is contained in:
parent
8ac95f4038
commit
3aa079b531
13
src/Tupfile
13
src/Tupfile
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
};
|
||||
|
|
|
@ -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[];
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
// This page intentionally left blank
|
|
@ -0,0 +1 @@
|
|||
// This page intentionally left blank
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
Loading…
Reference in New Issue