mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-02 20:43:35 +00:00
Refactor model loader;
This commit is contained in:
parent
aae636debb
commit
3d18eb99e6
|
@ -67,7 +67,6 @@ Model* lovrModelCreate(ModelData* modelData) {
|
||||||
Model* model = lovrAlloc(sizeof(Model), lovrModelDestroy);
|
Model* model = lovrAlloc(sizeof(Model), lovrModelDestroy);
|
||||||
if (!model) return NULL;
|
if (!model) return NULL;
|
||||||
|
|
||||||
lovrRetain(&modelData->ref);
|
|
||||||
model->modelData = modelData;
|
model->modelData = modelData;
|
||||||
|
|
||||||
vec_float_t vertices;
|
vec_float_t vertices;
|
||||||
|
@ -114,11 +113,41 @@ void lovrModelDestroy(const Ref* ref) {
|
||||||
if (model->texture) {
|
if (model->texture) {
|
||||||
lovrRelease(&model->texture->ref);
|
lovrRelease(&model->texture->ref);
|
||||||
}
|
}
|
||||||
lovrRelease(&model->modelData->ref);
|
lovrModelDataDestroy(model->modelData);
|
||||||
lovrRelease(&model->buffer->ref);
|
lovrRelease(&model->buffer->ref);
|
||||||
free(model);
|
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) {
|
void lovrModelDraw(Model* model, float x, float y, float z, float size, float angle, float ax, float ay, float az) {
|
||||||
lovrGraphicsPush();
|
lovrGraphicsPush();
|
||||||
lovrGraphicsTransform(x, y, z, size, size, size, angle, ax, ay, az);
|
lovrGraphicsTransform(x, y, z, size, size, size, angle, ax, ay, az);
|
||||||
|
|
|
@ -1,21 +1,62 @@
|
||||||
#include "graphics/buffer.h"
|
#include "graphics/buffer.h"
|
||||||
#include "graphics/texture.h"
|
#include "graphics/texture.h"
|
||||||
#include "loaders/model.h"
|
#include "matrix.h"
|
||||||
#include "glfw.h"
|
#include "glfw.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "vendor/vec/vec.h"
|
||||||
|
|
||||||
#ifndef LOVR_MODEL_TYPES
|
#ifndef LOVR_MODEL_TYPES
|
||||||
#define 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 {
|
typedef struct {
|
||||||
Ref ref;
|
Ref ref;
|
||||||
ModelData* modelData;
|
ModelData* modelData;
|
||||||
Buffer* buffer;
|
Buffer* buffer;
|
||||||
Texture* texture;
|
Texture* texture;
|
||||||
} Model;
|
} Model;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Model* lovrModelCreate(ModelData* modelData);
|
Model* lovrModelCreate(ModelData* modelData);
|
||||||
void lovrModelDestroy(const Ref* ref);
|
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);
|
void lovrModelDraw(Model* model, float x, float y, float z, float scale, float angle, float ax, float ay, float az);
|
||||||
Texture* lovrModelGetTexture(Model* model);
|
Texture* lovrModelGetTexture(Model* model);
|
||||||
void lovrModelSetTexture(Model* model, Texture* texture);
|
void lovrModelSetTexture(Model* model, Texture* texture);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "loaders/model.h"
|
#include "graphics/model.h"
|
||||||
|
|
||||||
#ifndef LOVR_HEADSET_TYPES
|
#ifndef LOVR_HEADSET_TYPES
|
||||||
#define LOVR_HEADSET_TYPES
|
#define LOVR_HEADSET_TYPES
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "headset/vive.h"
|
#include "headset/vive.h"
|
||||||
#include "graphics/graphics.h"
|
#include "graphics/graphics.h"
|
||||||
|
#include "loaders/model.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -436,7 +437,7 @@ ModelData* viveControllerNewModelData(void* headset, Controller* controller) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelData* modelData = lovrModelDataCreateFromOpenVRModel(renderModel);
|
ModelData* modelData = lovrModelDataFromOpenVRModel(renderModel);
|
||||||
state->vrRenderModels->FreeRenderModel(renderModel);
|
state->vrRenderModels->FreeRenderModel(renderModel);
|
||||||
return modelData;
|
return modelData;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include "headset/headset.h"
|
#include "headset/headset.h"
|
||||||
#include "loaders/model.h"
|
#include "graphics/model.h"
|
||||||
#include "glfw.h"
|
#include "glfw.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
|
@ -24,8 +24,8 @@ static void assimpNodeTraversal(ModelNode* node, struct aiNode* assimpNode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelData* lovrModelDataCreateFromFile(void* data, int size) {
|
ModelData* lovrModelDataFromFile(void* data, int size) {
|
||||||
ModelData* modelData = lovrAlloc(sizeof(ModelData), lovrModelDataDestroy);
|
ModelData* modelData = malloc(sizeof(ModelData));
|
||||||
if (!modelData) return NULL;
|
if (!modelData) return NULL;
|
||||||
|
|
||||||
unsigned int flags = aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_OptimizeGraph | aiProcess_FlipUVs;
|
unsigned int flags = aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_OptimizeGraph | aiProcess_FlipUVs;
|
||||||
|
@ -100,8 +100,8 @@ ModelData* lovrModelDataCreateFromFile(void* data, int size) {
|
||||||
return modelData;
|
return modelData;
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelData* lovrModelDataCreateFromOpenVRModel(RenderModel_t* renderModel) {
|
ModelData* lovrModelDataFromOpenVRModel(RenderModel_t* renderModel) {
|
||||||
ModelData* modelData = lovrAlloc(sizeof(ModelData), lovrModelDataDestroy);
|
ModelData* modelData = malloc(sizeof(ModelData));
|
||||||
if (!modelData) return NULL;
|
if (!modelData) return NULL;
|
||||||
|
|
||||||
ModelMesh* mesh = malloc(sizeof(ModelMesh));
|
ModelMesh* mesh = malloc(sizeof(ModelMesh));
|
||||||
|
@ -154,35 +154,3 @@ ModelData* lovrModelDataCreateFromOpenVRModel(RenderModel_t* renderModel) {
|
||||||
|
|
||||||
return modelData;
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,54 +1,9 @@
|
||||||
#include "vendor/vec/vec.h"
|
#include "graphics/model.h"
|
||||||
#include "util.h"
|
|
||||||
#include "matrix.h"
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#define __stdcall
|
#define __stdcall
|
||||||
#endif
|
#endif
|
||||||
#include <openvr_capi.h>
|
#include <openvr_capi.h>
|
||||||
|
|
||||||
#ifndef LOVR_MODEL_DATA_TYPES
|
ModelData* lovrModelDataFromFile(void* data, int size);
|
||||||
#define LOVR_MODEL_DATA_TYPES
|
ModelData* lovrModelDataFromOpenVRModel(RenderModel_t* renderModel);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "lovr/types/skybox.h"
|
#include "lovr/types/skybox.h"
|
||||||
#include "lovr/types/texture.h"
|
#include "lovr/types/texture.h"
|
||||||
#include "graphics/graphics.h"
|
#include "graphics/graphics.h"
|
||||||
|
#include "loaders/model.h"
|
||||||
#include "filesystem/filesystem.h"
|
#include "filesystem/filesystem.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -567,7 +568,7 @@ int l_lovrGraphicsNewModel(lua_State* L) {
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return luaL_error(L, "Could not load model file '%s'", path);
|
return luaL_error(L, "Could not load model file '%s'", path);
|
||||||
} else {
|
} else {
|
||||||
modelData = lovrModelDataCreateFromFile(data, size);
|
modelData = lovrModelDataFromFile(data, size);
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -579,11 +580,6 @@ int l_lovrGraphicsNewModel(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
luax_pushtype(L, Model, lovrModelCreate(modelData));
|
luax_pushtype(L, Model, lovrModelCreate(modelData));
|
||||||
|
|
||||||
if (lua_isstring(L, 1)) {
|
|
||||||
lovrRelease(&modelData->ref);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "lovr/types/controller.h"
|
#include "lovr/types/controller.h"
|
||||||
#include "lovr/headset.h"
|
#include "lovr/headset.h"
|
||||||
#include "loaders/model.h"
|
#include "graphics/model.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
const luaL_Reg lovrController[] = {
|
const luaL_Reg lovrController[] = {
|
||||||
|
|
Loading…
Reference in a new issue