Refactor model loader;

This commit is contained in:
bjorn 2016-11-25 23:15:04 -08:00
parent aae636debb
commit 3d18eb99e6
9 changed files with 87 additions and 97 deletions

View File

@ -67,7 +67,6 @@ Model* lovrModelCreate(ModelData* modelData) {
Model* model = lovrAlloc(sizeof(Model), lovrModelDestroy);
if (!model) return NULL;
lovrRetain(&modelData->ref);
model->modelData = modelData;
vec_float_t vertices;
@ -114,11 +113,41 @@ void lovrModelDestroy(const Ref* ref) {
if (model->texture) {
lovrRelease(&model->texture->ref);
}
lovrRelease(&model->modelData->ref);
lovrModelDataDestroy(model->modelData);
lovrRelease(&model->buffer->ref);
free(model);
}
void lovrModelDataDestroy(ModelData* modelData) {
for (int i = 0; i < modelData->meshes.length; i++) {
ModelMesh* mesh = modelData->meshes.data[i];
vec_deinit(&mesh->faces);
vec_deinit(&mesh->vertices);
vec_deinit(&mesh->normals);
if (modelData->hasTexCoords) {
vec_deinit(&mesh->texCoords);
}
free(mesh);
}
vec_void_t nodes;
vec_init(&nodes);
vec_push(&nodes, modelData->root);
while (nodes.length > 0) {
ModelNode* node = vec_first(&nodes);
vec_extend(&nodes, &node->children);
mat4_deinit(node->transform);
vec_deinit(&node->meshes);
vec_deinit(&node->children);
vec_splice(&nodes, 0, 1);
free(node);
}
vec_deinit(&modelData->meshes);
vec_deinit(&nodes);
free(modelData);
}
void lovrModelDraw(Model* model, float x, float y, float z, float size, float angle, float ax, float ay, float az) {
lovrGraphicsPush();
lovrGraphicsTransform(x, y, z, size, size, size, angle, ax, ay, az);

View File

@ -1,21 +1,62 @@
#include "graphics/buffer.h"
#include "graphics/texture.h"
#include "loaders/model.h"
#include "matrix.h"
#include "glfw.h"
#include "util.h"
#include "vendor/vec/vec.h"
#ifndef LOVR_MODEL_TYPES
#define LOVR_MODEL_TYPES
typedef struct {
float x;
float y;
float z;
} ModelVertex;
typedef vec_t(ModelVertex) vec_model_vertex_t;
typedef struct {
unsigned int indices[3];
} ModelFace;
typedef vec_t(ModelFace) vec_model_face_t;
typedef struct {
vec_model_face_t faces;
vec_model_vertex_t vertices;
vec_model_vertex_t normals;
vec_model_vertex_t texCoords;
} ModelMesh;
typedef vec_t(ModelMesh*) vec_model_mesh_t;
typedef struct ModelNode {
mat4 transform;
vec_uint_t meshes;
vec_void_t children;
} ModelNode;
typedef struct {
Ref ref;
ModelNode* root;
vec_model_mesh_t meshes;
int hasNormals;
int hasTexCoords;
} ModelData;
typedef struct {
Ref ref;
ModelData* modelData;
Buffer* buffer;
Texture* texture;
} Model;
#endif
Model* lovrModelCreate(ModelData* modelData);
void lovrModelDestroy(const Ref* ref);
void lovrModelDataDestroy(ModelData* modelData);
void lovrModelDraw(Model* model, float x, float y, float z, float scale, float angle, float ax, float ay, float az);
Texture* lovrModelGetTexture(Model* model);
void lovrModelSetTexture(Model* model, Texture* texture);

View File

@ -1,4 +1,4 @@
#include "loaders/model.h"
#include "graphics/model.h"
#ifndef LOVR_HEADSET_TYPES
#define LOVR_HEADSET_TYPES

View File

@ -1,5 +1,6 @@
#include "headset/vive.h"
#include "graphics/graphics.h"
#include "loaders/model.h"
#include "util.h"
#include <stdlib.h>
#include <stdint.h>
@ -436,7 +437,7 @@ ModelData* viveControllerNewModelData(void* headset, Controller* controller) {
return NULL;
}
ModelData* modelData = lovrModelDataCreateFromOpenVRModel(renderModel);
ModelData* modelData = lovrModelDataFromOpenVRModel(renderModel);
state->vrRenderModels->FreeRenderModel(renderModel);
return modelData;
}

View File

@ -1,5 +1,5 @@
#include "headset/headset.h"
#include "loaders/model.h"
#include "graphics/model.h"
#include "glfw.h"
#include <stdbool.h>
#ifndef _WIN32

View File

@ -24,8 +24,8 @@ static void assimpNodeTraversal(ModelNode* node, struct aiNode* assimpNode) {
}
}
ModelData* lovrModelDataCreateFromFile(void* data, int size) {
ModelData* modelData = lovrAlloc(sizeof(ModelData), lovrModelDataDestroy);
ModelData* lovrModelDataFromFile(void* data, int size) {
ModelData* modelData = malloc(sizeof(ModelData));
if (!modelData) return NULL;
unsigned int flags = aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_OptimizeGraph | aiProcess_FlipUVs;
@ -100,8 +100,8 @@ ModelData* lovrModelDataCreateFromFile(void* data, int size) {
return modelData;
}
ModelData* lovrModelDataCreateFromOpenVRModel(RenderModel_t* renderModel) {
ModelData* modelData = lovrAlloc(sizeof(ModelData), lovrModelDataDestroy);
ModelData* lovrModelDataFromOpenVRModel(RenderModel_t* renderModel) {
ModelData* modelData = malloc(sizeof(ModelData));
if (!modelData) return NULL;
ModelMesh* mesh = malloc(sizeof(ModelMesh));
@ -154,35 +154,3 @@ ModelData* lovrModelDataCreateFromOpenVRModel(RenderModel_t* renderModel) {
return modelData;
}
void lovrModelDataDestroy(const Ref* ref) {
ModelData* modelData = containerof(ref, ModelData);
for (int i = 0; i < modelData->meshes.length; i++) {
ModelMesh* mesh = modelData->meshes.data[i];
vec_deinit(&mesh->faces);
vec_deinit(&mesh->vertices);
vec_deinit(&mesh->normals);
if (modelData->hasTexCoords) {
vec_deinit(&mesh->texCoords);
}
free(mesh);
}
vec_void_t nodes;
vec_init(&nodes);
vec_push(&nodes, modelData->root);
while (nodes.length > 0) {
ModelNode* node = vec_first(&nodes);
vec_extend(&nodes, &node->children);
mat4_deinit(node->transform);
vec_deinit(&node->meshes);
vec_deinit(&node->children);
vec_splice(&nodes, 0, 1);
free(node);
}
vec_deinit(&modelData->meshes);
vec_deinit(&nodes);
free(modelData);
}

View File

@ -1,54 +1,9 @@
#include "vendor/vec/vec.h"
#include "util.h"
#include "matrix.h"
#include "graphics/model.h"
#include <stdbool.h>
#ifndef _WIN32
#define __stdcall
#endif
#include <openvr_capi.h>
#ifndef LOVR_MODEL_DATA_TYPES
#define LOVR_MODEL_DATA_TYPES
typedef struct {
float x;
float y;
float z;
} ModelVertex;
typedef vec_t(ModelVertex) vec_model_vertex_t;
typedef struct {
unsigned int indices[3];
} ModelFace;
typedef vec_t(ModelFace) vec_model_face_t;
typedef struct {
vec_model_face_t faces;
vec_model_vertex_t vertices;
vec_model_vertex_t normals;
vec_model_vertex_t texCoords;
} ModelMesh;
typedef vec_t(ModelMesh*) vec_model_mesh_t;
typedef struct ModelNode {
mat4 transform;
vec_uint_t meshes;
vec_void_t children;
} ModelNode;
typedef struct {
Ref ref;
ModelNode* root;
vec_model_mesh_t meshes;
int hasNormals;
int hasTexCoords;
} ModelData;
#endif
ModelData* lovrModelDataCreateFromFile(void* data, int size);
ModelData* lovrModelDataCreateFromOpenVRModel(RenderModel_t* renderModel);
void lovrModelDataDestroy(const Ref* ref);
ModelData* lovrModelDataFromFile(void* data, int size);
ModelData* lovrModelDataFromOpenVRModel(RenderModel_t* renderModel);

View File

@ -5,6 +5,7 @@
#include "lovr/types/skybox.h"
#include "lovr/types/texture.h"
#include "graphics/graphics.h"
#include "loaders/model.h"
#include "filesystem/filesystem.h"
#include "util.h"
#include <math.h>
@ -567,7 +568,7 @@ int l_lovrGraphicsNewModel(lua_State* L) {
if (!data) {
return luaL_error(L, "Could not load model file '%s'", path);
} else {
modelData = lovrModelDataCreateFromFile(data, size);
modelData = lovrModelDataFromFile(data, size);
free(data);
}
} else {
@ -579,11 +580,6 @@ int l_lovrGraphicsNewModel(lua_State* L) {
}
luax_pushtype(L, Model, lovrModelCreate(modelData));
if (lua_isstring(L, 1)) {
lovrRelease(&modelData->ref);
}
return 1;
}

View File

@ -1,6 +1,6 @@
#include "lovr/types/controller.h"
#include "lovr/headset.h"
#include "loaders/model.h"
#include "graphics/model.h"
#include "util.h"
const luaL_Reg lovrController[] = {