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);
|
bool readable = lua_toboolean(L, drawModeIndex + 2);
|
||||||
size_t bufferSize = count * format.stride;
|
size_t bufferSize = count * format.stride;
|
||||||
Buffer* vertexBuffer = lovrBufferCreate(bufferSize, NULL, BUFFER_VERTEX, usage, readable);
|
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) {
|
lovrMeshAttachAttribute(mesh, "lovrDrawID", &(MeshAttribute) {
|
||||||
.buffer = lovrGraphicsGetIdentityBuffer(),
|
.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 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 };
|
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, "lovrPosition", &position);
|
||||||
lovrMeshAttachAttribute(state.mesh, "lovrNormal", &normal);
|
lovrMeshAttachAttribute(state.mesh, "lovrNormal", &normal);
|
||||||
lovrMeshAttachAttribute(state.mesh, "lovrTexCoord", &texCoord);
|
lovrMeshAttachAttribute(state.mesh, "lovrTexCoord", &texCoord);
|
||||||
lovrMeshAttachAttribute(state.mesh, "lovrDrawID", &drawId);
|
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, "lovrPosition", &position);
|
||||||
lovrMeshAttachAttribute(state.instancedMesh, "lovrNormal", &normal);
|
lovrMeshAttachAttribute(state.instancedMesh, "lovrNormal", &normal);
|
||||||
lovrMeshAttachAttribute(state.instancedMesh, "lovrTexCoord", &texCoord);
|
lovrMeshAttachAttribute(state.instancedMesh, "lovrTexCoord", &texCoord);
|
||||||
|
|
|
@ -13,17 +13,6 @@ Buffer* lovrMeshGetIndexBuffer(Mesh* mesh) {
|
||||||
return mesh->indexBuffer;
|
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) {
|
uint32_t lovrMeshGetVertexCount(Mesh* mesh) {
|
||||||
return mesh->vertexCount;
|
return mesh->vertexCount;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ typedef struct {
|
||||||
GPU_MESH_FIELDS
|
GPU_MESH_FIELDS
|
||||||
} Mesh;
|
} 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__)
|
#define lovrMeshCreate(...) lovrMeshInit(lovrAlloc(Mesh), __VA_ARGS__)
|
||||||
void lovrMeshDestroy(void* ref);
|
void lovrMeshDestroy(void* ref);
|
||||||
VertexFormat* lovrMeshGetVertexFormat(Mesh* mesh);
|
VertexFormat* lovrMeshGetVertexFormat(Mesh* mesh);
|
||||||
|
|
|
@ -67,7 +67,7 @@ Model* lovrModelInit(Model* model, ModelData* modelData) {
|
||||||
VertexFormat* format = &modelData->vertexData->format;
|
VertexFormat* format = &modelData->vertexData->format;
|
||||||
size_t vboSize = modelData->vertexData->count * format->stride;
|
size_t vboSize = modelData->vertexData->count * format->stride;
|
||||||
Buffer* vertexBuffer = lovrBufferCreate(vboSize, modelData->vertexData->blob.data, BUFFER_VERTEX, USAGE_STATIC, false);
|
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);
|
lovrRelease(vertexBuffer);
|
||||||
|
|
||||||
size_t indexSize = modelData->indexSize;
|
size_t indexSize = modelData->indexSize;
|
||||||
|
|
|
@ -392,8 +392,8 @@ static void lovrGpuBindVertexArray(uint32_t vertexArray) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lovrGpuBindBuffer(BufferType type, uint32_t buffer) {
|
static void lovrGpuBindBuffer(BufferType type, uint32_t buffer, bool force) {
|
||||||
if (state.buffers[type] != buffer) {
|
if (force || state.buffers[type] != buffer) {
|
||||||
state.buffers[type] = buffer;
|
state.buffers[type] = buffer;
|
||||||
glBindBuffer(convertBufferType(type), buffer);
|
glBindBuffer(convertBufferType(type), buffer);
|
||||||
}
|
}
|
||||||
|
@ -467,11 +467,8 @@ static void lovrGpuBindMesh(Mesh* mesh, Shader* shader, int divisorMultiplier) {
|
||||||
|
|
||||||
lovrGpuBindVertexArray(mesh->vao);
|
lovrGpuBindVertexArray(mesh->vao);
|
||||||
|
|
||||||
if (mesh->indexBuffer && mesh->indexCount > 0 && mesh->ibo != mesh->indexBuffer->id) {
|
if (mesh->indexBuffer && mesh->indexCount > 0) {
|
||||||
mesh->ibo = mesh->indexBuffer->id;
|
lovrGpuBindBuffer(BUFFER_INDEX, mesh->indexBuffer->id, true);
|
||||||
state.buffers[BUFFER_INDEX] = mesh->ibo;
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->ibo);
|
|
||||||
|
|
||||||
uint32_t primitiveRestart = (1 << (mesh->indexSize * 8)) - 1;
|
uint32_t primitiveRestart = (1 << (mesh->indexSize * 8)) - 1;
|
||||||
if (state.primitiveRestart != primitiveRestart) {
|
if (state.primitiveRestart != primitiveRestart) {
|
||||||
state.primitiveRestart = primitiveRestart;
|
state.primitiveRestart = primitiveRestart;
|
||||||
|
@ -523,7 +520,7 @@ static void lovrGpuBindMesh(Mesh* mesh, Shader* shader, int divisorMultiplier) {
|
||||||
previous.stride != current.stride;
|
previous.stride != current.stride;
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
lovrGpuBindBuffer(BUFFER_VERTEX, current.buffer->id);
|
lovrGpuBindBuffer(BUFFER_VERTEX, current.buffer->id, false);
|
||||||
int count = current.components;
|
int count = current.components;
|
||||||
int stride = current.stride;
|
int stride = current.stride;
|
||||||
GLvoid* offset = (GLvoid*) current.offset;
|
GLvoid* offset = (GLvoid*) current.offset;
|
||||||
|
@ -1539,7 +1536,7 @@ Buffer* lovrBufferInit(Buffer* buffer, size_t size, void* data, BufferType type,
|
||||||
buffer->type = type;
|
buffer->type = type;
|
||||||
buffer->usage = usage;
|
buffer->usage = usage;
|
||||||
glGenBuffers(1, &buffer->id);
|
glGenBuffers(1, &buffer->id);
|
||||||
lovrGpuBindBuffer(type, buffer->id);
|
lovrGpuBindBuffer(type, buffer->id, false);
|
||||||
GLenum glType = convertBufferType(type);
|
GLenum glType = convertBufferType(type);
|
||||||
|
|
||||||
#ifndef EMSCRIPTEN
|
#ifndef EMSCRIPTEN
|
||||||
|
@ -1580,7 +1577,7 @@ void* lovrBufferMap(Buffer* buffer, size_t offset) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrBufferFlush(Buffer* buffer, size_t offset, size_t size) {
|
void lovrBufferFlush(Buffer* buffer, size_t offset, size_t size) {
|
||||||
lovrGpuBindBuffer(buffer->type, buffer->id);
|
lovrGpuBindBuffer(buffer->type, buffer->id, false);
|
||||||
#ifndef EMSCRIPTEN
|
#ifndef EMSCRIPTEN
|
||||||
if (GLAD_GL_ARB_buffer_storage) {
|
if (GLAD_GL_ARB_buffer_storage) {
|
||||||
glFlushMappedBufferRange(convertBufferType(buffer->type), offset, size);
|
glFlushMappedBufferRange(convertBufferType(buffer->type), offset, size);
|
||||||
|
@ -1926,11 +1923,12 @@ void lovrShaderDestroy(void* ref) {
|
||||||
|
|
||||||
// Mesh
|
// 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->mode = mode;
|
||||||
mesh->format = format;
|
mesh->format = format;
|
||||||
mesh->vertexBuffer = vertexBuffer;
|
mesh->vertexBuffer = vertexBuffer;
|
||||||
mesh->vertexCount = vertexBuffer ? (lovrBufferGetSize(vertexBuffer) / format.stride) : 0;
|
mesh->vertexCount = vertexCount;
|
||||||
|
lovrRetain(mesh->vertexBuffer);
|
||||||
glGenVertexArrays(1, &mesh->vao);
|
glGenVertexArrays(1, &mesh->vao);
|
||||||
|
|
||||||
map_init(&mesh->attributes);
|
map_init(&mesh->attributes);
|
||||||
|
@ -1964,3 +1962,14 @@ void lovrMeshDestroy(void* ref) {
|
||||||
lovrRelease(mesh->indexBuffer);
|
lovrRelease(mesh->indexBuffer);
|
||||||
lovrRelease(mesh->material);
|
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;
|
bool immortal;
|
||||||
|
|
||||||
#define GPU_MESH_FIELDS \
|
#define GPU_MESH_FIELDS \
|
||||||
uint32_t vao; \
|
uint32_t vao;
|
||||||
uint32_t ibo;
|
|
||||||
|
|
||||||
#define GPU_SHADER_FIELDS \
|
#define GPU_SHADER_FIELDS \
|
||||||
uint32_t program;
|
uint32_t program;
|
||||||
|
|
Loading…
Reference in New Issue