diff --git a/src/modules/data/modelData.h b/src/modules/data/modelData.h index 778f0bec..9fe89f08 100644 --- a/src/modules/data/modelData.h +++ b/src/modules/data/modelData.h @@ -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 { diff --git a/src/modules/data/modelData_gltf.c b/src/modules/data/modelData_gltf.c index 2906cf32..12ec2a60 100644 --- a/src/modules/data/modelData_gltf.c +++ b/src/modules/data/modelData_gltf.c @@ -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; } } diff --git a/src/modules/data/modelData_obj.c b/src/modules/data/modelData_obj.c index 37ebf5c2..4f6a0043 100644 --- a/src/modules/data/modelData_obj.c +++ b/src/modules/data/modelData_obj.c @@ -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) diff --git a/src/modules/headset/headset_openvr.c b/src/modules/headset/headset_openvr.c index 55f0e39d..694da87b 100644 --- a/src/modules/headset/headset_openvr.c +++ b/src/modules/headset/headset_openvr.c @@ -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; diff --git a/src/modules/headset/headset_vrapi.c b/src/modules/headset/headset_vrapi.c index bc19f8b9..2816a2c0 100644 --- a/src/modules/headset/headset_vrapi.c +++ b/src/modules/headset/headset_vrapi.c @@ -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])