ModelBuffer tracks more blob info;

This commit is contained in:
bjorn 2021-10-08 13:46:42 -07:00
parent ff680f7882
commit bfa155a103
5 changed files with 34 additions and 7 deletions

View File

@ -103,9 +103,11 @@ typedef union {
} AttributeData;
typedef struct {
char* data;
uint32_t blob;
size_t offset;
size_t size;
size_t stride;
char* data;
} ModelBuffer;
typedef struct {

View File

@ -507,8 +507,8 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
size_t offset = 0;
for (int k = (token++)->size; k > 0; k--) {
gltfString key = NOM_STR(json, token);
if (STR_EQ(key, "buffer")) { buffer->data = model->blobs[NOM_INT(json, token)]->data; }
else if (STR_EQ(key, "byteOffset")) { offset = NOM_INT(json, token); }
if (STR_EQ(key, "buffer")) { buffer->blob = NOM_INT(json, token); }
else if (STR_EQ(key, "byteOffset")) { buffer->offset = NOM_INT(json, token); }
else if (STR_EQ(key, "byteLength")) { buffer->size = NOM_INT(json, token); }
else if (STR_EQ(key, "byteStride")) { buffer->stride = NOM_INT(json, token); }
else { token += NOM_VALUE(json, token); }
@ -516,10 +516,10 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
// If this is the glb binary data, increment the offset to account for the file header
if (buffer->data && buffer->data == source->data && glb) {
offset += binOffset;
buffer->offset += binOffset;
}
buffer->data = (char*) buffer->data + offset;
buffer->data = (char*) model->blobs[buffer->blob]->data + buffer->offset;
}
}

View File

@ -256,12 +256,14 @@ ModelData* lovrModelDataInitObj(ModelData* model, Blob* source, ModelDataIO* io)
model->blobs[1] = lovrBlobCreate(indexBlob.data, indexBlob.length * sizeof(int), "obj index data");
model->buffers[0] = (ModelBuffer) {
.blob = 0,
.data = model->blobs[0]->data,
.size = model->blobs[0]->size,
.stride = 8 * sizeof(float)
};
model->buffers[1] = (ModelBuffer) {
.blob = 1,
.data = model->blobs[1]->data,
.size = model->blobs[1]->size,
.stride = sizeof(int)

View File

@ -675,8 +675,19 @@ static ModelData* openvr_newModelData(Device device, bool animated) {
memcpy(vertices, renderModels[i]->rVertexData, vertexCount * vertexSize);
memcpy(indices, renderModels[i]->rIndexData, indexCount * sizeof(uint16_t));
model->buffers[2 * i + 0] = (ModelBuffer) { .data = (char*) vertices, .size = vertexCount * vertexSize, .stride = vertexSize };
model->buffers[2 * i + 1] = (ModelBuffer) { .data = (char*) indices, .size = indexCount * sizeof(uint16_t), .stride = sizeof(uint16_t) };
model->buffers[2 * i + 0] = (ModelBuffer) {
.blob = 0,
.size = vertexCount * vertexSize,
.stride = vertexSize
.data = (char*) vertices
};
model->buffers[2 * i + 1] = (ModelBuffer) {
.blob = 1,
.size = indexCount * sizeof(uint16_t),
.stride = sizeof(uint16_t),
.data = (char*) indices
};
vertices += vertexCount * vertexSize / sizeof(float);
indices += indexCount;

View File

@ -480,36 +480,48 @@ static struct ModelData* vrapi_newModelData(Device device, bool animated) {
model->blobs[1] = lovrBlobCreate(inverseBindMatrices, model->jointCount * 16 * sizeof(float), "Hand Mesh Inverse Bind Matrices");
model->buffers[0] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->vertexPositions - (char*) mesh,
.data = (char*) mesh->VertexPositions,
.size = sizeof(mesh->VertexPositions),
.stride = sizeof(mesh->VertexPositions[0])
};
model->buffers[1] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->vertexNormals - (char*) mesh,
.data = (char*) mesh->VertexNormals,
.size = sizeof(mesh->VertexNormals),
.stride = sizeof(mesh->VertexNormals[0]),
};
model->buffers[2] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->vertexUV0 - (char*) mesh,
.data = (char*) mesh->VertexUV0,
.size = sizeof(mesh->VertexUV0),
.stride = sizeof(mesh->VertexUV0[0]),
};
model->buffers[3] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->BlendIndices - (char*) mesh,
.data = (char*) mesh->BlendIndices,
.size = sizeof(mesh->BlendIndices),
.stride = sizeof(mesh->BlendIndices[0]),
};
model->buffers[4] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->BlendWeights - (char*) mesh,
.data = (char*) mesh->BlendWeights,
.size = sizeof(mesh->BlendWeights),
.stride = sizeof(mesh->BlendWeights[0]),
};
model->buffers[5] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->Indices - (char*) mesh,
.data = (char*) mesh->Indices,
.size = sizeof(mesh->Indices),
.stride = sizeof(mesh->Indices[0])