Mesh fixes;

This commit is contained in:
bjorn 2019-01-03 19:43:35 -08:00 committed by Bjorn Swenson
parent 6f96ee65da
commit 379dc74cd5
7 changed files with 27 additions and 30 deletions

View File

@ -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(),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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