lovr/src/data/modelData.c

62 lines
2.7 KiB
C
Raw Normal View History

2018-02-11 23:22:04 +00:00
#include "data/modelData.h"
2018-12-19 03:57:52 +00:00
2019-01-16 03:25:51 +00:00
ModelData* lovrModelDataInit(ModelData* model, Blob* source, ModelDataIO io) {
if (lovrModelDataInitGltf(model, source, io)) {
return model;
} else if (lovrModelDataInitObj(model, source, io)) {
return model;
2018-09-26 00:10:09 +00:00
}
2018-02-11 01:27:29 +00:00
lovrThrow("Unable to load model from '%s'", source->name);
return NULL;
2017-02-19 09:54:58 +00:00
}
2017-11-02 02:27:58 +00:00
2018-09-26 00:10:09 +00:00
void lovrModelDataDestroy(void* ref) {
2019-01-10 19:34:00 +00:00
ModelData* model = ref;
2019-01-23 06:40:34 +00:00
for (int i = 0; i < model->blobCount; i++) {
lovrRelease(model->blobs[i]);
}
for (int i = 0; i < model->imageCount; i++) {
lovrRelease(model->images[i]);
}
2019-01-10 19:34:00 +00:00
free(model->data);
2017-11-02 02:27:58 +00:00
}
// Note: this code is a scary optimization
void lovrModelDataAllocate(ModelData* model) {
size_t totalSize = 0;
size_t sizes[14];
totalSize += sizes[0] = model->blobCount * sizeof(Blob*);
totalSize += sizes[1] = model->imageCount * sizeof(TextureData*);
totalSize += sizes[2] = model->animationCount * sizeof(ModelAnimation);
totalSize += sizes[3] = model->attributeCount * sizeof(ModelAttribute);
totalSize += sizes[4] = model->bufferCount * sizeof(ModelBuffer);
totalSize += sizes[5] = model->textureCount * sizeof(ModelTexture);
totalSize += sizes[6] = model->materialCount * sizeof(ModelMaterial);
totalSize += sizes[7] = model->primitiveCount * sizeof(ModelPrimitive);
totalSize += sizes[8] = model->nodeCount * sizeof(ModelNode);
totalSize += sizes[9] = model->skinCount * sizeof(ModelSkin);
totalSize += sizes[10] = model->channelCount * sizeof(ModelAnimationChannel);
totalSize += sizes[11] = model->childCount * sizeof(uint32_t);
totalSize += sizes[12] = model->jointCount * sizeof(uint32_t);
totalSize += sizes[13] = model->charCount * sizeof(char);
size_t offset = 0;
char* p = model->data = calloc(1, totalSize);
lovrAssert(model->data, "Out of memory");
model->blobs = (Blob**) (p + offset), offset += sizes[0];
model->images = (TextureData**) (p + offset), offset += sizes[1];
model->animations = (ModelAnimation*) (p + offset), offset += sizes[2];
model->attributes = (ModelAttribute*) (p + offset), offset += sizes[3];
model->buffers = (ModelBuffer*) (p + offset), offset += sizes[4];
model->textures = (ModelTexture*) (p + offset), offset += sizes[5];
model->materials = (ModelMaterial*) (p + offset), offset += sizes[6];
model->primitives = (ModelPrimitive*) (p + offset), offset += sizes[7];
model->nodes = (ModelNode*) (p + offset), offset += sizes[8];
model->skins = (ModelSkin*) (p + offset), offset += sizes[9];
model->channels = (ModelAnimationChannel*) (p + offset), offset += sizes[10];
model->children = (uint32_t*) (p + offset), offset += sizes[11];
model->joints = (uint32_t*) (p + offset), offset += sizes[12];
model->chars = (char*) (p + offset), offset += sizes[13];
}