mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-04 05:23:34 +00:00
ModelData;
This commit is contained in:
parent
ed72de1109
commit
3cce5fd991
|
@ -46,6 +46,7 @@ extern const luaL_Reg lovrJoint[];
|
||||||
extern const luaL_Reg lovrMaterial[];
|
extern const luaL_Reg lovrMaterial[];
|
||||||
extern const luaL_Reg lovrMesh[];
|
extern const luaL_Reg lovrMesh[];
|
||||||
extern const luaL_Reg lovrModel[];
|
extern const luaL_Reg lovrModel[];
|
||||||
|
extern const luaL_Reg lovrModelData[];
|
||||||
extern const luaL_Reg lovrRandomGenerator[];
|
extern const luaL_Reg lovrRandomGenerator[];
|
||||||
extern const luaL_Reg lovrRasterizer[];
|
extern const luaL_Reg lovrRasterizer[];
|
||||||
extern const luaL_Reg lovrShader[];
|
extern const luaL_Reg lovrShader[];
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "api.h"
|
#include "api.h"
|
||||||
#include "data/data.h"
|
#include "data/data.h"
|
||||||
#include "data/audioStream.h"
|
#include "data/audioStream.h"
|
||||||
|
#include "data/model.h"
|
||||||
#include "data/rasterizer.h"
|
#include "data/rasterizer.h"
|
||||||
#include "data/texture.h"
|
#include "data/texture.h"
|
||||||
|
|
||||||
|
@ -8,6 +9,7 @@ int l_lovrDataInit(lua_State* L) {
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lovrData);
|
luaL_register(L, NULL, lovrData);
|
||||||
luax_registertype(L, "AudioStream", lovrAudioStream);
|
luax_registertype(L, "AudioStream", lovrAudioStream);
|
||||||
|
luax_registertype(L, "ModelData", lovrModelData);
|
||||||
luax_registertype(L, "Rasterizer", lovrRasterizer);
|
luax_registertype(L, "Rasterizer", lovrRasterizer);
|
||||||
luax_registertype(L, "TextureData", lovrTextureData);
|
luax_registertype(L, "TextureData", lovrTextureData);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -23,6 +25,15 @@ int l_lovrDataNewAudioStream(lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int l_lovrDataNewModelData(lua_State* L) {
|
||||||
|
Blob* blob = luax_readblob(L, 1, "Model");
|
||||||
|
ModelData* modelData = lovrModelDataCreate(blob);
|
||||||
|
luax_pushtype(L, ModelData, modelData);
|
||||||
|
lovrRelease(&blob->ref);
|
||||||
|
lovrRelease(&modelData->ref);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int l_lovrDataNewTextureData(lua_State* L) {
|
int l_lovrDataNewTextureData(lua_State* L) {
|
||||||
Blob* blob = luax_readblob(L, 1, "Texture");
|
Blob* blob = luax_readblob(L, 1, "Texture");
|
||||||
TextureData* textureData = lovrTextureDataFromBlob(blob);
|
TextureData* textureData = lovrTextureDataFromBlob(blob);
|
||||||
|
@ -56,6 +67,7 @@ int l_lovrDataNewRasterizer(lua_State* L) {
|
||||||
|
|
||||||
const luaL_Reg lovrData[] = {
|
const luaL_Reg lovrData[] = {
|
||||||
{ "newAudioStream", l_lovrDataNewAudioStream },
|
{ "newAudioStream", l_lovrDataNewAudioStream },
|
||||||
|
{ "newModelData", l_lovrDataNewModelData },
|
||||||
{ "newRasterizer", l_lovrDataNewRasterizer },
|
{ "newRasterizer", l_lovrDataNewRasterizer },
|
||||||
{ "newTextureData", l_lovrDataNewTextureData },
|
{ "newTextureData", l_lovrDataNewTextureData },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|
|
@ -956,8 +956,16 @@ int l_lovrGraphicsNewMesh(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsNewModel(lua_State* L) {
|
int l_lovrGraphicsNewModel(lua_State* L) {
|
||||||
|
ModelData* modelData;
|
||||||
|
void** type;
|
||||||
|
if ((type = luax_totype(L, 1, ModelData)) != NULL) {
|
||||||
|
modelData = *type;
|
||||||
|
} else {
|
||||||
Blob* blob = luax_readblob(L, 1, "Model");
|
Blob* blob = luax_readblob(L, 1, "Model");
|
||||||
ModelData* modelData = lovrModelDataCreate(blob);
|
modelData = lovrModelDataCreate(blob);
|
||||||
|
lovrRelease(&blob->ref);
|
||||||
|
}
|
||||||
|
|
||||||
Model* model = lovrModelCreate(modelData);
|
Model* model = lovrModelCreate(modelData);
|
||||||
|
|
||||||
if (lua_gettop(L) >= 2) {
|
if (lua_gettop(L) >= 2) {
|
||||||
|
@ -979,7 +987,6 @@ int l_lovrGraphicsNewModel(lua_State* L) {
|
||||||
|
|
||||||
luax_pushtype(L, Model, model);
|
luax_pushtype(L, Model, model);
|
||||||
lovrRelease(&model->ref);
|
lovrRelease(&model->ref);
|
||||||
lovrRelease(&blob->ref);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
src/api/types/modelData.c
Normal file
5
src/api/types/modelData.c
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#include "api.h"
|
||||||
|
|
||||||
|
const luaL_Reg lovrModelData[] = {
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
|
@ -182,7 +182,7 @@ static void assimpFileClose(struct aiFileIO* io, struct aiFile* assimpFile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelData* lovrModelDataCreate(Blob* blob) {
|
ModelData* lovrModelDataCreate(Blob* blob) {
|
||||||
ModelData* modelData = malloc(sizeof(ModelData));
|
ModelData* modelData = lovrAlloc(sizeof(ModelData), lovrModelDataDestroy);
|
||||||
if (!modelData) return NULL;
|
if (!modelData) return NULL;
|
||||||
|
|
||||||
struct aiFileIO assimpIO;
|
struct aiFileIO assimpIO;
|
||||||
|
@ -447,7 +447,9 @@ ModelData* lovrModelDataCreate(Blob* blob) {
|
||||||
return modelData;
|
return modelData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrModelDataDestroy(ModelData* modelData) {
|
void lovrModelDataDestroy(const Ref* ref) {
|
||||||
|
ModelData* modelData = containerof(ref, ModelData);
|
||||||
|
|
||||||
for (int i = 0; i < modelData->nodeCount; i++) {
|
for (int i = 0; i < modelData->nodeCount; i++) {
|
||||||
vec_deinit(&modelData->nodes[i].children);
|
vec_deinit(&modelData->nodes[i].children);
|
||||||
vec_deinit(&modelData->nodes[i].primitives);
|
vec_deinit(&modelData->nodes[i].primitives);
|
||||||
|
|
|
@ -45,6 +45,7 @@ typedef struct ModelNode {
|
||||||
} ModelNode;
|
} ModelNode;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
Ref ref;
|
||||||
ModelNode* nodes;
|
ModelNode* nodes;
|
||||||
map_int_t nodeMap;
|
map_int_t nodeMap;
|
||||||
ModelPrimitive* primitives;
|
ModelPrimitive* primitives;
|
||||||
|
@ -67,5 +68,5 @@ typedef struct {
|
||||||
} ModelData;
|
} ModelData;
|
||||||
|
|
||||||
ModelData* lovrModelDataCreate(Blob* blob);
|
ModelData* lovrModelDataCreate(Blob* blob);
|
||||||
void lovrModelDataDestroy(ModelData* modelData);
|
void lovrModelDataDestroy(const Ref* ref);
|
||||||
void lovrModelDataGetAABB(ModelData* modelData, float aabb[6]);
|
void lovrModelDataGetAABB(ModelData* modelData, float aabb[6]);
|
||||||
|
|
|
@ -53,6 +53,7 @@ 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;
|
||||||
model->aabbDirty = true;
|
model->aabbDirty = true;
|
||||||
model->animator = NULL;
|
model->animator = NULL;
|
||||||
|
@ -132,7 +133,7 @@ void lovrModelDestroy(const Ref* ref) {
|
||||||
lovrRelease(&model->material->ref);
|
lovrRelease(&model->material->ref);
|
||||||
}
|
}
|
||||||
free(model->materials);
|
free(model->materials);
|
||||||
lovrModelDataDestroy(model->modelData);
|
lovrRelease(&model->modelData->ref);
|
||||||
lovrRelease(&model->mesh->ref);
|
lovrRelease(&model->mesh->ref);
|
||||||
free(model->nodeTransforms);
|
free(model->nodeTransforms);
|
||||||
free(model);
|
free(model);
|
||||||
|
|
Loading…
Reference in a new issue