From 379dc74cd52bada377a5072e213ba1868974ad39 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 3 Jan 2019 19:43:35 -0800 Subject: [PATCH] Mesh fixes; --- src/api/graphics.c | 2 +- src/graphics/graphics.c | 4 ++-- src/graphics/mesh.c | 11 ----------- src/graphics/mesh.h | 2 +- src/graphics/model.c | 2 +- src/graphics/opengl.c | 33 +++++++++++++++++++++------------ src/graphics/opengl.h | 3 +-- 7 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/api/graphics.c b/src/api/graphics.c index 171cf962..94d5ea6b 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -1161,7 +1161,7 @@ static int l_lovrGraphicsNewMesh(lua_State* L) { bool readable = lua_toboolean(L, drawModeIndex + 2); size_t bufferSize = count * format.stride; Buffer* vertexBuffer = lovrBufferCreate(bufferSize, NULL, BUFFER_VERTEX, usage, readable); - Mesh* mesh = lovrMeshCreate(mode, format, vertexBuffer); + Mesh* mesh = lovrMeshCreate(mode, format, vertexBuffer, count); lovrMeshAttachAttribute(mesh, "lovrDrawID", &(MeshAttribute) { .buffer = lovrGraphicsGetIdentityBuffer(), diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index efbec80b..32cde765 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -76,13 +76,13 @@ static void lovrGraphicsInitBuffers() { MeshAttribute drawId = { state.buffers[STREAM_DRAW_ID], 0, 0, ATTR_BYTE, 1, .integer = true, .enabled = true }; MeshAttribute identity = { state.identityBuffer, 0, 0, ATTR_BYTE, 1, .divisor = 1, .integer = true, .enabled = true }; - state.mesh = lovrMeshCreate(DRAW_TRIANGLES, empty, NULL); + state.mesh = lovrMeshCreate(DRAW_TRIANGLES, empty, NULL, 0); lovrMeshAttachAttribute(state.mesh, "lovrPosition", &position); lovrMeshAttachAttribute(state.mesh, "lovrNormal", &normal); lovrMeshAttachAttribute(state.mesh, "lovrTexCoord", &texCoord); lovrMeshAttachAttribute(state.mesh, "lovrDrawID", &drawId); - state.instancedMesh = lovrMeshCreate(DRAW_TRIANGLES, empty, NULL); + state.instancedMesh = lovrMeshCreate(DRAW_TRIANGLES, empty, NULL, 0); lovrMeshAttachAttribute(state.instancedMesh, "lovrPosition", &position); lovrMeshAttachAttribute(state.instancedMesh, "lovrNormal", &normal); lovrMeshAttachAttribute(state.instancedMesh, "lovrTexCoord", &texCoord); diff --git a/src/graphics/mesh.c b/src/graphics/mesh.c index 3889805d..32091043 100644 --- a/src/graphics/mesh.c +++ b/src/graphics/mesh.c @@ -13,17 +13,6 @@ Buffer* lovrMeshGetIndexBuffer(Mesh* mesh) { return mesh->indexBuffer; } -void lovrMeshSetIndexBuffer(Mesh* mesh, Buffer* buffer, uint32_t indexCount, size_t indexSize) { - if (mesh->indexBuffer != buffer || mesh->indexCount != indexCount || mesh->indexSize != indexSize) { - lovrGraphicsFlushMesh(mesh); - lovrRetain(buffer); - lovrRelease(mesh->indexBuffer); - mesh->indexBuffer = buffer; - mesh->indexCount = indexCount; - mesh->indexSize = indexSize; - } -} - uint32_t lovrMeshGetVertexCount(Mesh* mesh) { return mesh->vertexCount; } diff --git a/src/graphics/mesh.h b/src/graphics/mesh.h index b806bc87..0859a382 100644 --- a/src/graphics/mesh.h +++ b/src/graphics/mesh.h @@ -51,7 +51,7 @@ typedef struct { GPU_MESH_FIELDS } Mesh; -Mesh* lovrMeshInit(Mesh* mesh, DrawMode mode, VertexFormat format, Buffer* vertexBuffer); +Mesh* lovrMeshInit(Mesh* mesh, DrawMode mode, VertexFormat format, Buffer* vertexBuffer, uint32_t vertexCount); #define lovrMeshCreate(...) lovrMeshInit(lovrAlloc(Mesh), __VA_ARGS__) void lovrMeshDestroy(void* ref); VertexFormat* lovrMeshGetVertexFormat(Mesh* mesh); diff --git a/src/graphics/model.c b/src/graphics/model.c index 2239a937..1c5e3790 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -67,7 +67,7 @@ Model* lovrModelInit(Model* model, ModelData* modelData) { VertexFormat* format = &modelData->vertexData->format; size_t vboSize = modelData->vertexData->count * format->stride; Buffer* vertexBuffer = lovrBufferCreate(vboSize, modelData->vertexData->blob.data, BUFFER_VERTEX, USAGE_STATIC, false); - model->mesh = lovrMeshCreate(DRAW_TRIANGLES, *format, vertexBuffer); + model->mesh = lovrMeshCreate(DRAW_TRIANGLES, *format, vertexBuffer, modelData->vertexData->count); lovrRelease(vertexBuffer); size_t indexSize = modelData->indexSize; diff --git a/src/graphics/opengl.c b/src/graphics/opengl.c index 097d8d23..abbeed88 100644 --- a/src/graphics/opengl.c +++ b/src/graphics/opengl.c @@ -392,8 +392,8 @@ static void lovrGpuBindVertexArray(uint32_t vertexArray) { } } -static void lovrGpuBindBuffer(BufferType type, uint32_t buffer) { - if (state.buffers[type] != buffer) { +static void lovrGpuBindBuffer(BufferType type, uint32_t buffer, bool force) { + if (force || state.buffers[type] != buffer) { state.buffers[type] = buffer; glBindBuffer(convertBufferType(type), buffer); } @@ -467,11 +467,8 @@ static void lovrGpuBindMesh(Mesh* mesh, Shader* shader, int divisorMultiplier) { lovrGpuBindVertexArray(mesh->vao); - if (mesh->indexBuffer && mesh->indexCount > 0 && mesh->ibo != mesh->indexBuffer->id) { - mesh->ibo = mesh->indexBuffer->id; - state.buffers[BUFFER_INDEX] = mesh->ibo; - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->ibo); - + if (mesh->indexBuffer && mesh->indexCount > 0) { + lovrGpuBindBuffer(BUFFER_INDEX, mesh->indexBuffer->id, true); uint32_t primitiveRestart = (1 << (mesh->indexSize * 8)) - 1; if (state.primitiveRestart != primitiveRestart) { state.primitiveRestart = primitiveRestart; @@ -523,7 +520,7 @@ static void lovrGpuBindMesh(Mesh* mesh, Shader* shader, int divisorMultiplier) { previous.stride != current.stride; if (changed) { - lovrGpuBindBuffer(BUFFER_VERTEX, current.buffer->id); + lovrGpuBindBuffer(BUFFER_VERTEX, current.buffer->id, false); int count = current.components; int stride = current.stride; GLvoid* offset = (GLvoid*) current.offset; @@ -1539,7 +1536,7 @@ Buffer* lovrBufferInit(Buffer* buffer, size_t size, void* data, BufferType type, buffer->type = type; buffer->usage = usage; glGenBuffers(1, &buffer->id); - lovrGpuBindBuffer(type, buffer->id); + lovrGpuBindBuffer(type, buffer->id, false); GLenum glType = convertBufferType(type); #ifndef EMSCRIPTEN @@ -1580,7 +1577,7 @@ void* lovrBufferMap(Buffer* buffer, size_t offset) { } void lovrBufferFlush(Buffer* buffer, size_t offset, size_t size) { - lovrGpuBindBuffer(buffer->type, buffer->id); + lovrGpuBindBuffer(buffer->type, buffer->id, false); #ifndef EMSCRIPTEN if (GLAD_GL_ARB_buffer_storage) { glFlushMappedBufferRange(convertBufferType(buffer->type), offset, size); @@ -1926,11 +1923,12 @@ void lovrShaderDestroy(void* ref) { // Mesh -Mesh* lovrMeshInit(Mesh* mesh, DrawMode mode, VertexFormat format, Buffer* vertexBuffer) { +Mesh* lovrMeshInit(Mesh* mesh, DrawMode mode, VertexFormat format, Buffer* vertexBuffer, uint32_t vertexCount) { mesh->mode = mode; mesh->format = format; mesh->vertexBuffer = vertexBuffer; - mesh->vertexCount = vertexBuffer ? (lovrBufferGetSize(vertexBuffer) / format.stride) : 0; + mesh->vertexCount = vertexCount; + lovrRetain(mesh->vertexBuffer); glGenVertexArrays(1, &mesh->vao); map_init(&mesh->attributes); @@ -1964,3 +1962,14 @@ void lovrMeshDestroy(void* ref) { lovrRelease(mesh->indexBuffer); lovrRelease(mesh->material); } + +void lovrMeshSetIndexBuffer(Mesh* mesh, Buffer* buffer, uint32_t indexCount, size_t indexSize) { + if (mesh->indexBuffer != buffer || mesh->indexCount != indexCount || mesh->indexSize != indexSize) { + lovrGraphicsFlushMesh(mesh); + lovrRetain(buffer); + lovrRelease(mesh->indexBuffer); + mesh->indexBuffer = buffer; + mesh->indexCount = indexCount; + mesh->indexSize = indexSize; + } +} diff --git a/src/graphics/opengl.h b/src/graphics/opengl.h index 5bb2824b..a74a69b5 100644 --- a/src/graphics/opengl.h +++ b/src/graphics/opengl.h @@ -21,8 +21,7 @@ bool immortal; #define GPU_MESH_FIELDS \ - uint32_t vao; \ - uint32_t ibo; + uint32_t vao; #define GPU_SHADER_FIELDS \ uint32_t program;