diff --git a/src/api/data.c b/src/api/data.c index 8abf01fa..c6ad547b 100644 --- a/src/api/data.c +++ b/src/api/data.c @@ -8,11 +8,12 @@ int l_lovrDataInit(lua_State* L) { lua_newtable(L); luaL_register(L, NULL, lovrData); + luax_registertype(L, "Blob", lovrBlob); luax_registertype(L, "AudioStream", lovrAudioStream); luax_registertype(L, "ModelData", lovrModelData); luax_registertype(L, "Rasterizer", lovrRasterizer); - luax_registertype(L, "TextureData", lovrTextureData); - luax_registertype(L, "VertexData", lovrVertexData); + luax_extendtype(L, "Blob", "TextureData", lovrBlob, lovrTextureData); + luax_extendtype(L, "Blob", "VertexData", lovrBlob, lovrVertexData); return 1; } diff --git a/src/api/filesystem.c b/src/api/filesystem.c index 79926fb9..53300b57 100644 --- a/src/api/filesystem.c +++ b/src/api/filesystem.c @@ -76,7 +76,6 @@ static int filesystemLoader(lua_State* L) { int l_lovrFilesystemInit(lua_State* L) { lua_newtable(L); luaL_register(L, NULL, lovrFilesystem); - luax_registertype(L, "Blob", lovrBlob); lua_getglobal(L, "arg"); lua_rawgeti(L, -1, -2); diff --git a/src/api/types/blob.c b/src/api/types/blob.c index 49c320e1..91226101 100644 --- a/src/api/types/blob.c +++ b/src/api/types/blob.c @@ -2,25 +2,25 @@ #include "data/blob.h" int l_lovrBlobGetFilename(lua_State* L) { - Blob* blob = luax_checktype(L, 1, Blob); + Blob* blob = luax_checktypeof(L, 1, Blob); lua_pushstring(L, blob->name); return 1; } int l_lovrBlobGetPointer(lua_State* L) { - Blob* blob = luax_checktype(L, 1, Blob); + Blob* blob = luax_checktypeof(L, 1, Blob); lua_pushlightuserdata(L, blob->data); return 1; } int l_lovrBlobGetSize(lua_State* L) { - Blob* blob = luax_checktype(L, 1, Blob); + Blob* blob = luax_checktypeof(L, 1, Blob); lua_pushinteger(L, blob->size); return 1; } int l_lovrBlobGetString(lua_State* L) { - Blob* blob = luax_checktype(L, 1, Blob); + Blob* blob = luax_checktypeof(L, 1, Blob); lua_pushlstring(L, blob->data, blob->size); return 1; } diff --git a/src/api/types/vertexData.c b/src/api/types/vertexData.c index 8a184ef6..03dc8970 100644 --- a/src/api/types/vertexData.c +++ b/src/api/types/vertexData.c @@ -104,24 +104,6 @@ void luax_setvertex(lua_State* L, int index, VertexPointer* vertex, VertexFormat // -int l_lovrVertexDataGetPointer(lua_State* L) { - VertexData* vertexData = luax_checktype(L, 1, VertexData); - lua_pushlightuserdata(L, vertexData->data.raw); - return 1; -} - -int l_lovrVertexDataGetSize(lua_State* L) { - VertexData* vertexData = luax_checktype(L, 1, VertexData); - lua_pushinteger(L, vertexData->count * vertexData->format.stride); - return 1; -} - -int l_lovrVertexDataGetString(lua_State* L) { - VertexData* vertexData = luax_checktype(L, 1, VertexData); - lua_pushlstring(L, vertexData->data.raw, vertexData->count * vertexData->format.stride); - return 1; -} - int l_lovrVertexDataGetCount(lua_State* L) { VertexData* vertexData = luax_checktype(L, 1, VertexData); uint32_t count = vertexData->count; @@ -137,7 +119,7 @@ int l_lovrVertexDataGetFormat(lua_State* L) { int l_lovrVertexDataGetVertex(lua_State* L) { VertexData* vertexData = luax_checktype(L, 1, VertexData); uint32_t index = (uint32_t) luaL_checkint(L, 2) - 1; - VertexPointer vertex = { .raw = vertexData->data.bytes + index * vertexData->format.stride }; + VertexPointer vertex = { .raw = (uint8_t*) vertexData->blob.data + index * vertexData->format.stride }; return luax_pushvertex(L, &vertex, &vertexData->format); } @@ -146,9 +128,9 @@ int l_lovrVertexDataSetVertex(lua_State* L) { uint32_t index = (uint32_t) luaL_checkint(L, 2) - 1; lovrAssert(index < vertexData->count, "Invalid vertex index: %d", index + 1); VertexFormat* format = &vertexData->format; - VertexPointer* vertex = &vertexData->data; - vertex->bytes += index * format->stride; - luax_setvertex(L, 3, vertex, format); + VertexPointer vertex = { .raw = vertexData->blob.data }; + vertex.bytes += index * format->stride; + luax_setvertex(L, 3, &vertex, format); return 0; } @@ -160,7 +142,7 @@ int l_lovrVertexDataGetVertexAttribute(lua_State* L) { lovrAssert(vertexIndex < vertexData->count, "Invalid vertex index: %d", vertexIndex + 1); lovrAssert(attributeIndex >= 0 && attributeIndex < format->count, "Invalid attribute index: %d", attributeIndex + 1); Attribute attribute = format->attributes[attributeIndex]; - VertexPointer vertex = vertexData->data; + VertexPointer vertex = { .raw = vertexData->blob.data }; vertex.bytes += vertexIndex * format->stride + attribute.offset; return luax_pushvertexattribute(L, &vertex, attribute); } @@ -173,7 +155,7 @@ int l_lovrVertexDataSetVertexAttribute(lua_State* L) { lovrAssert(vertexIndex < vertexData->count, "Invalid vertex index: %d", vertexIndex + 1); lovrAssert(attributeIndex >= 0 && attributeIndex < format->count, "Invalid attribute index: %d", attributeIndex + 1); Attribute attribute = format->attributes[attributeIndex]; - VertexPointer vertex = vertexData->data; + VertexPointer vertex = { .raw = vertexData->blob.data }; vertex.bytes += vertexIndex * format->stride + attribute.offset; luax_setvertexattribute(L, 4, &vertex, attribute); return 0; @@ -186,7 +168,7 @@ int l_lovrVertexDataSetVertices(lua_State* L) { uint32_t vertexCount = lua_objlen(L, 2); int start = luaL_optnumber(L, 3, 1) - 1; lovrAssert(start + vertexCount <= vertexData->count, "VertexData can only hold %d vertices", vertexData->count); - VertexPointer vertices = vertexData->data; + VertexPointer vertices = { .raw = vertexData->blob.data }; vertices.bytes += start * format->stride; for (uint32_t i = 0; i < vertexCount; i++) { @@ -200,9 +182,6 @@ int l_lovrVertexDataSetVertices(lua_State* L) { } const luaL_Reg lovrVertexData[] = { - { "getPointer", l_lovrVertexDataGetPointer }, - { "getSize", l_lovrVertexDataGetSize }, - { "getString", l_lovrVertexDataGetString }, { "getCount", l_lovrVertexDataGetCount }, { "getFormat", l_lovrVertexDataGetFormat }, { "getVertex", l_lovrVertexDataGetVertex }, diff --git a/src/data/modelData.c b/src/data/modelData.c index 86d94d3d..1047017e 100644 --- a/src/data/modelData.c +++ b/src/data/modelData.c @@ -338,7 +338,7 @@ ModelData* lovrModelDataCreate(Blob* blob) { // Vertices for (unsigned int v = 0; v < assimpMesh->mNumVertices; v++) { - VertexPointer vertices = modelData->vertexData->data; + VertexPointer vertices = { .raw = modelData->vertexData->blob.data }; vertices.bytes += vertex * modelData->vertexData->format.stride; *vertices.floats++ = assimpMesh->mVertices[v].x; @@ -411,7 +411,7 @@ ModelData* lovrModelDataCreate(Blob* blob) { for (unsigned int w = 0; w < assimpBone->mNumWeights; w++) { uint32_t vertexIndex = baseVertex + assimpBone->mWeights[w].mVertexId; float weight = assimpBone->mWeights[w].mWeight; - VertexPointer vertices = modelData->vertexData->data; + VertexPointer vertices = { .raw = modelData->vertexData->blob.data }; vertices.bytes += vertexIndex * modelData->vertexData->format.stride; uint32_t* bones = (uint32_t*) (vertices.bytes + boneByteOffset); float* weights = (float*) (bones + MAX_BONES_PER_VERTEX); @@ -571,7 +571,8 @@ static void aabbIterator(ModelData* modelData, ModelNode* node, float aabb[6]) { } else { index = modelData->indices.ints[primitive->drawStart + j]; } - vec3_init(vertex, (float*) (modelData->vertexData->data.bytes + index * modelData->vertexData->format.stride)); + VertexPointer vertices = { .raw = modelData->vertexData->blob.data }; + vec3_init(vertex, (float*) (vertices.bytes + index * modelData->vertexData->format.stride)); mat4_transform(node->globalTransform, vertex); aabb[0] = MIN(aabb[0], vertex[0]); aabb[1] = MAX(aabb[1], vertex[0]); diff --git a/src/data/textureData.c b/src/data/textureData.c index 67c54c86..76ebf246 100644 --- a/src/data/textureData.c +++ b/src/data/textureData.c @@ -109,7 +109,7 @@ static int parseDDS(uint8_t* data, size_t size, TextureData* textureData) { height = MAX(height >> 1, 1); } - textureData->data = NULL; + textureData->blob.data = NULL; return 0; } @@ -133,8 +133,9 @@ TextureData* lovrTextureDataGetBlank(int width, int height, uint8_t value, Textu textureData->width = width; textureData->height = height; textureData->format = format; - textureData->data = memset(malloc(size), value, size); - textureData->blob = NULL; + textureData->blob.size = size; + textureData->blob.data = memset(malloc(size), value, size); + textureData->source = NULL; vec_init(&textureData->mipmaps); return textureData; } @@ -147,8 +148,8 @@ TextureData* lovrTextureDataGetEmpty(int width, int height, TextureFormat format textureData->width = width; textureData->height = height; textureData->format = format; - textureData->data = NULL; - textureData->blob = NULL; + textureData->blob.data = NULL; + textureData->source = NULL; vec_init(&textureData->mipmaps); return textureData; } @@ -160,17 +161,17 @@ TextureData* lovrTextureDataFromBlob(Blob* blob) { vec_init(&textureData->mipmaps); if (!parseDDS(blob->data, blob->size, textureData)) { - textureData->blob = blob; + textureData->source = blob; lovrRetain(blob); return textureData; } stbi_set_flip_vertically_on_load(1); textureData->format = FORMAT_RGBA; - textureData->data = stbi_load_from_memory(blob->data, blob->size, &textureData->width, &textureData->height, NULL, 4); - textureData->blob = NULL; + textureData->blob.data = stbi_load_from_memory(blob->data, blob->size, &textureData->width, &textureData->height, NULL, 4); + textureData->source = NULL; - if (!textureData->data) { + if (!textureData->blob.data) { lovrThrow("Could not load texture data from '%s'", blob->name); free(textureData); return NULL; @@ -180,26 +181,26 @@ TextureData* lovrTextureDataFromBlob(Blob* blob) { } Color lovrTextureDataGetPixel(TextureData* textureData, int x, int y) { - if (!textureData->data || textureData->format != FORMAT_RGBA) { + if (!textureData->blob.data || textureData->format != FORMAT_RGBA) { return (Color) { 0, 0, 0, 0 }; } bool inside = x >= 0 && y >= 0 && x <= (textureData->width - 1) && y <= (textureData->height - 1); lovrAssert(inside, "getPixel coordinates must be in TextureData bounds"); size_t offset = 4 * ((textureData->height - (y + 1)) * textureData->width + x); - uint8_t* data = (uint8_t*) textureData->data + offset; + uint8_t* data = (uint8_t*) textureData->blob.data + offset; return (Color) { data[0] / 255.f, data[1] / 255.f, data[2] / 255.f, data[3] / 255.f }; } void lovrTextureDataSetPixel(TextureData* textureData, int x, int y, Color color) { - if (!textureData->data || textureData->format != FORMAT_RGBA) { + if (!textureData->blob.data || textureData->format != FORMAT_RGBA) { return; } bool inside = x >= 0 && y >= 0 && x <= (textureData->width - 1) && y <= (textureData->height - 1); lovrAssert(inside, "setPixel coordinates must be in TextureData bounds"); size_t offset = 4 * ((textureData->height - (y + 1)) * textureData->width + x); - uint8_t* data = (uint8_t*) textureData->data + offset; + uint8_t* data = (uint8_t*) textureData->blob.data + offset; data[0] = (uint8_t) (color.r * 255.f + .5); data[1] = (uint8_t) (color.g * 255.f + .5); data[2] = (uint8_t) (color.b * 255.f + .5); @@ -220,7 +221,7 @@ bool lovrTextureDataEncode(TextureData* textureData, const char* filename) { int components = textureData->format == FORMAT_RGB ? 3 : 4; int width = textureData->width; int height = textureData->height; - void* data = (uint8_t*) textureData->data + (textureData->height - 1) * textureData->width * components; + void* data = (uint8_t*) textureData->blob.data + (textureData->height - 1) * textureData->width * components; size_t stride = -textureData->width * components; bool success = stbi_write_png_to_func(writeCallback, file, width, height, components, data, stride); lovrFileClose(file); @@ -229,8 +230,7 @@ bool lovrTextureDataEncode(TextureData* textureData, const char* filename) { void lovrTextureDataDestroy(void* ref) { TextureData* textureData = ref; - lovrRelease(textureData->blob); + lovrRelease(textureData->source); vec_deinit(&textureData->mipmaps); - free(textureData->data); - free(textureData); + lovrBlobDestroy(ref); } diff --git a/src/data/textureData.h b/src/data/textureData.h index 7bebcc96..3f249c99 100644 --- a/src/data/textureData.h +++ b/src/data/textureData.h @@ -34,11 +34,10 @@ typedef struct { typedef vec_t(Mipmap) vec_mipmap_t; typedef struct { - Ref ref; + Blob blob; int width; int height; - void* data; - Blob* blob; + Blob* source; TextureFormat format; vec_mipmap_t mipmaps; } TextureData; diff --git a/src/data/vertexData.c b/src/data/vertexData.c index 4a0d62e4..d0c5daea 100644 --- a/src/data/vertexData.c +++ b/src/data/vertexData.c @@ -16,7 +16,7 @@ void vertexFormatAppend(VertexFormat* format, const char* name, AttributeType ty } VertexData* lovrVertexDataCreate(uint32_t count, VertexFormat* format, bool allocate) { - VertexData* vertexData = lovrAlloc(sizeof(VertexData), lovrVertexDataDestroy); + VertexData* vertexData = lovrAlloc(sizeof(VertexData), lovrBlobDestroy); if (!vertexData) return NULL; if (format) { @@ -31,20 +31,13 @@ VertexData* lovrVertexDataCreate(uint32_t count, VertexFormat* format, bool allo } vertexData->count = count; - vertexData->data.raw = NULL; + vertexData->blob.data = NULL; if (allocate) { - vertexData->data.raw = malloc(format->stride * count); - memset(vertexData->data.raw, 0, format->stride * count); + size_t size = format->stride * count; + vertexData->blob.data = calloc(1, size); + vertexData->blob.size = size; } return vertexData; } - -void lovrVertexDataDestroy(void* ref) { - VertexData* vertexData = ref; - if (vertexData->data.raw) { - free(vertexData->data.raw); - } - free(vertexData); -} diff --git a/src/data/vertexData.h b/src/data/vertexData.h index 683efca0..58ba6ac5 100644 --- a/src/data/vertexData.h +++ b/src/data/vertexData.h @@ -1,4 +1,5 @@ #include "util.h" +#include "blob.h" #include #include #include @@ -39,9 +40,8 @@ typedef union { } IndexPointer; typedef struct { - Ref ref; + Blob blob; VertexFormat format; - VertexPointer data; uint32_t count; } VertexData; @@ -49,4 +49,3 @@ void vertexFormatInit(VertexFormat* format); void vertexFormatAppend(VertexFormat* format, const char* name, AttributeType type, int count); VertexData* lovrVertexDataCreate(uint32_t count, VertexFormat* format, bool allocate); -void lovrVertexDataDestroy(void* ref); diff --git a/src/graphics/mesh.c b/src/graphics/mesh.c index cb657bd4..7d8ae021 100644 --- a/src/graphics/mesh.c +++ b/src/graphics/mesh.c @@ -230,8 +230,9 @@ VertexPointer lovrMeshMap(Mesh* mesh, int start, size_t count, bool read, bool w mesh->isMapped = true; mesh->mapStart = start; mesh->mapCount = count; - void* p = mesh->vertexData->data.bytes + start * mesh->vertexData->format.stride; - return (VertexPointer) { .raw = p }; + VertexPointer pointer = { .raw = mesh->vertexData->blob.data }; + pointer.bytes += start * mesh->vertexData->format.stride; + return pointer; #else if (mesh->isMapped) { lovrMeshUnmap(mesh); @@ -246,8 +247,9 @@ VertexPointer lovrMeshMap(Mesh* mesh, int start, size_t count, bool read, bool w access |= write ? GL_MAP_WRITE_BIT : 0; access |= (write && start == 0 && count == mesh->vertexData->count) ? GL_MAP_INVALIDATE_BUFFER_BIT : 0; lovrGraphicsBindVertexBuffer(mesh->vbo); - mesh->vertexData->data.raw = glMapBufferRange(GL_ARRAY_BUFFER, start * stride, count * stride, access); - return mesh->vertexData->data; + VertexPointer pointer; + pointer.raw = glMapBufferRange(GL_ARRAY_BUFFER, start * stride, count * stride, access); + return pointer; #endif } @@ -263,7 +265,8 @@ void lovrMeshUnmap(Mesh* mesh) { size_t stride = mesh->vertexData->format.stride; size_t start = mesh->mapStart * stride; size_t count = mesh->mapCount * stride; - glBufferSubData(GL_ARRAY_BUFFER, start, count, mesh->vertexData->data.bytes + start); + VertexPointer vertices = { .raw = mesh->vertexData->blob.data }; + glBufferSubData(GL_ARRAY_BUFFER, start, count, vertices.bytes + start); #else glUnmapBuffer(GL_ARRAY_BUFFER); #endif diff --git a/src/graphics/model.c b/src/graphics/model.c index b727f5ca..46f08f17 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -61,7 +61,7 @@ Model* lovrModelCreate(ModelData* modelData) { model->mesh = lovrMeshCreate(modelData->vertexData->count, &modelData->vertexData->format, MESH_TRIANGLES, MESH_STATIC); VertexPointer vertices = lovrMeshMap(model->mesh, 0, modelData->vertexData->count, false, true); - memcpy(vertices.raw, modelData->vertexData->data.raw, modelData->vertexData->count * modelData->vertexData->format.stride); + memcpy(vertices.raw, modelData->vertexData->blob.data, modelData->vertexData->count * modelData->vertexData->format.stride); lovrMeshUnmap(model->mesh); lovrMeshSetVertexMap(model->mesh, modelData->indices.raw, modelData->indexCount); lovrMeshSetRangeEnabled(model->mesh, true); diff --git a/src/graphics/texture.c b/src/graphics/texture.c index a8f3e4f4..c43bae4f 100644 --- a/src/graphics/texture.c +++ b/src/graphics/texture.c @@ -134,7 +134,7 @@ void lovrTextureReplacePixels(Texture* texture, TextureData* textureData, int sl // validation } - if (!textureData->data) { + if (!textureData->blob.data) { return; } @@ -160,11 +160,11 @@ void lovrTextureReplacePixels(Texture* texture, TextureData* textureData, int sl switch (texture->type) { case TEXTURE_2D: case TEXTURE_CUBE: - glTexSubImage2D(binding, 0, 0, 0, textureData->width, textureData->height, glFormat, GL_UNSIGNED_BYTE, textureData->data); + glTexSubImage2D(binding, 0, 0, 0, textureData->width, textureData->height, glFormat, GL_UNSIGNED_BYTE, textureData->blob.data); break; case TEXTURE_ARRAY: case TEXTURE_VOLUME: - glTexSubImage3D(binding, 0, 0, 0, slice, textureData->width, textureData->height, 1, glFormat, GL_UNSIGNED_BYTE, textureData->data); + glTexSubImage3D(binding, 0, 0, 0, slice, textureData->width, textureData->height, 1, glFormat, GL_UNSIGNED_BYTE, textureData->blob.data); break; } diff --git a/src/headset/openvr.c b/src/headset/openvr.c index 9f741fbd..9fb7b6d2 100644 --- a/src/headset/openvr.c +++ b/src/headset/openvr.c @@ -597,7 +597,7 @@ static ModelData* openvrControllerNewModelData(Controller* controller) { modelData->vertexData = lovrVertexDataCreate(vrModel->unVertexCount, &format, true); - float* vertices = modelData->vertexData->data.floats; + float* vertices = (float*) modelData->vertexData->blob.data; int vertex = 0; for (size_t i = 0; i < vrModel->unVertexCount; i++) { float* position = vrModel->rVertexData[i].vPosition.v; @@ -647,7 +647,7 @@ static ModelData* openvrControllerNewModelData(Controller* controller) { // Material RenderModel_TextureMap_t* vrTexture = state.deviceTextures[id]; TextureData* textureData = lovrTextureDataGetBlank(vrTexture->unWidth, vrTexture->unHeight, 0, FORMAT_RGBA); - memcpy(textureData->data, vrTexture->rubTextureMapData, vrTexture->unWidth * vrTexture->unHeight * 4); + memcpy(textureData->blob.data, vrTexture->rubTextureMapData, vrTexture->unWidth * vrTexture->unHeight * 4); vec_init(&modelData->textures); vec_push(&modelData->textures, NULL);