mirror of https://github.com/bjornbytes/lovr.git
Mesh fixes;
This commit is contained in:
parent
6f96ee65da
commit
379dc74cd5
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue