VertexData and TextureData properly extend Blob;

...He hates it!
This commit is contained in:
bjorn 2018-03-10 21:28:22 -08:00
parent 22cda40163
commit 6916137dc6
13 changed files with 58 additions and 84 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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 },

View File

@ -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]);

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
}

View File

@ -1,4 +1,5 @@
#include "util.h"
#include "blob.h"
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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;
}

View File

@ -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);