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; } AttributeData;
typedef struct { typedef struct {
char* data; uint32_t blob;
size_t offset;
size_t size; size_t size;
size_t stride; size_t stride;
char* data;
} ModelBuffer; } ModelBuffer;
typedef struct { typedef struct {

View File

@ -507,8 +507,8 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io
size_t offset = 0; size_t offset = 0;
for (int k = (token++)->size; k > 0; k--) { for (int k = (token++)->size; k > 0; k--) {
gltfString key = NOM_STR(json, token); gltfString key = NOM_STR(json, token);
if (STR_EQ(key, "buffer")) { buffer->data = model->blobs[NOM_INT(json, token)]->data; } if (STR_EQ(key, "buffer")) { buffer->blob = NOM_INT(json, token); }
else if (STR_EQ(key, "byteOffset")) { offset = 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, "byteLength")) { buffer->size = NOM_INT(json, token); }
else if (STR_EQ(key, "byteStride")) { buffer->stride = NOM_INT(json, token); } else if (STR_EQ(key, "byteStride")) { buffer->stride = NOM_INT(json, token); }
else { token += NOM_VALUE(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 this is the glb binary data, increment the offset to account for the file header
if (buffer->data && buffer->data == source->data && glb) { 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->blobs[1] = lovrBlobCreate(indexBlob.data, indexBlob.length * sizeof(int), "obj index data");
model->buffers[0] = (ModelBuffer) { model->buffers[0] = (ModelBuffer) {
.blob = 0,
.data = model->blobs[0]->data, .data = model->blobs[0]->data,
.size = model->blobs[0]->size, .size = model->blobs[0]->size,
.stride = 8 * sizeof(float) .stride = 8 * sizeof(float)
}; };
model->buffers[1] = (ModelBuffer) { model->buffers[1] = (ModelBuffer) {
.blob = 1,
.data = model->blobs[1]->data, .data = model->blobs[1]->data,
.size = model->blobs[1]->size, .size = model->blobs[1]->size,
.stride = sizeof(int) .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(vertices, renderModels[i]->rVertexData, vertexCount * vertexSize);
memcpy(indices, renderModels[i]->rIndexData, indexCount * sizeof(uint16_t)); 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 + 0] = (ModelBuffer) {
model->buffers[2 * i + 1] = (ModelBuffer) { .data = (char*) indices, .size = indexCount * sizeof(uint16_t), .stride = sizeof(uint16_t) }; .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); vertices += vertexCount * vertexSize / sizeof(float);
indices += indexCount; 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->blobs[1] = lovrBlobCreate(inverseBindMatrices, model->jointCount * 16 * sizeof(float), "Hand Mesh Inverse Bind Matrices");
model->buffers[0] = (ModelBuffer) { model->buffers[0] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->vertexPositions - (char*) mesh,
.data = (char*) mesh->VertexPositions, .data = (char*) mesh->VertexPositions,
.size = sizeof(mesh->VertexPositions), .size = sizeof(mesh->VertexPositions),
.stride = sizeof(mesh->VertexPositions[0]) .stride = sizeof(mesh->VertexPositions[0])
}; };
model->buffers[1] = (ModelBuffer) { model->buffers[1] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->vertexNormals - (char*) mesh,
.data = (char*) mesh->VertexNormals, .data = (char*) mesh->VertexNormals,
.size = sizeof(mesh->VertexNormals), .size = sizeof(mesh->VertexNormals),
.stride = sizeof(mesh->VertexNormals[0]), .stride = sizeof(mesh->VertexNormals[0]),
}; };
model->buffers[2] = (ModelBuffer) { model->buffers[2] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->vertexUV0 - (char*) mesh,
.data = (char*) mesh->VertexUV0, .data = (char*) mesh->VertexUV0,
.size = sizeof(mesh->VertexUV0), .size = sizeof(mesh->VertexUV0),
.stride = sizeof(mesh->VertexUV0[0]), .stride = sizeof(mesh->VertexUV0[0]),
}; };
model->buffers[3] = (ModelBuffer) { model->buffers[3] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->BlendIndices - (char*) mesh,
.data = (char*) mesh->BlendIndices, .data = (char*) mesh->BlendIndices,
.size = sizeof(mesh->BlendIndices), .size = sizeof(mesh->BlendIndices),
.stride = sizeof(mesh->BlendIndices[0]), .stride = sizeof(mesh->BlendIndices[0]),
}; };
model->buffers[4] = (ModelBuffer) { model->buffers[4] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->BlendWeights - (char*) mesh,
.data = (char*) mesh->BlendWeights, .data = (char*) mesh->BlendWeights,
.size = sizeof(mesh->BlendWeights), .size = sizeof(mesh->BlendWeights),
.stride = sizeof(mesh->BlendWeights[0]), .stride = sizeof(mesh->BlendWeights[0]),
}; };
model->buffers[5] = (ModelBuffer) { model->buffers[5] = (ModelBuffer) {
.blob = 0,
.offset = (char*) mesh->Indices - (char*) mesh,
.data = (char*) mesh->Indices, .data = (char*) mesh->Indices,
.size = sizeof(mesh->Indices), .size = sizeof(mesh->Indices),
.stride = sizeof(mesh->Indices[0]) .stride = sizeof(mesh->Indices[0])