lovrGraphicsDrawMesh;

This commit is contained in:
bjorn 2019-06-27 13:35:43 -07:00
parent b3080ae5d9
commit fe21de403b
4 changed files with 31 additions and 40 deletions

View File

@ -79,24 +79,7 @@ static int l_lovrMeshDraw(lua_State* L) {
float transform[16];
int index = luax_readmat4(L, 2, transform, 1);
int instances = luaL_optinteger(L, index, 1);
uint32_t vertexCount = lovrMeshGetVertexCount(mesh);
uint32_t indexCount = lovrMeshGetIndexCount(mesh);
uint32_t defaultCount = indexCount > 0 ? indexCount : vertexCount;
uint32_t rangeStart, rangeCount;
lovrMeshGetDrawRange(mesh, &rangeStart, &rangeCount);
lovrGraphicsBatch(&(BatchRequest) {
.type = BATCH_MESH,
.params.mesh = {
.object = mesh,
.mode = lovrMeshGetDrawMode(mesh),
.rangeStart = rangeStart,
.rangeCount = rangeCount ? rangeCount : defaultCount,
.instances = instances
},
.drawMode = lovrMeshGetDrawMode(mesh),
.transform = transform,
.material = lovrMeshGetMaterial(mesh)
});
lovrGraphicsDrawMesh(mesh, transform, instances, NULL);
return 0;
}

View File

@ -1195,3 +1195,29 @@ void lovrGraphicsFill(Texture* texture, float u, float v, float w, float h) {
}, 32 * sizeof(float));
}
}
void lovrGraphicsDrawMesh(Mesh* mesh, mat4 transform, uint32_t instances, float* pose) {
uint32_t vertexCount = lovrMeshGetVertexCount(mesh);
uint32_t indexCount = lovrMeshGetIndexCount(mesh);
uint32_t defaultCount = indexCount > 0 ? indexCount : vertexCount;
uint32_t rangeStart, rangeCount;
lovrMeshGetDrawRange(mesh, &rangeStart, &rangeCount);
rangeCount = rangeCount > 0 ? rangeCount : defaultCount;
DrawMode mode = lovrMeshGetDrawMode(mesh);
Material* material = lovrMeshGetMaterial(mesh);
lovrGraphicsBatch(&(BatchRequest) {
.type = BATCH_MESH,
.params.mesh = {
.object = mesh,
.mode = mode,
.rangeStart = rangeStart,
.rangeCount = rangeCount,
.instances = instances,
.pose = pose
},
.drawMode = mode,
.transform = transform,
.material = material
});
}

View File

@ -224,6 +224,7 @@ void lovrGraphicsSphere(struct Material* material, mat4 transform, int segments)
void lovrGraphicsSkybox(struct Texture* texture, float angle, float ax, float ay, float az);
void lovrGraphicsPrint(const char* str, size_t length, mat4 transform, float wrap, HorizontalAlign halign, VerticalAlign valign);
void lovrGraphicsFill(struct Texture* texture, float u, float v, float w, float h);
void lovrGraphicsDrawMesh(struct Mesh* mesh, mat4 transform, uint32_t instances, float* pose);
#define lovrGraphicsStencil lovrGpuStencil
#define lovrGraphicsCompute lovrGpuCompute

View File

@ -53,28 +53,9 @@ static void renderNode(Model* model, uint32_t nodeIndex, uint32_t instances) {
ModelPrimitive* primitive = &model->data->primitives[node->primitiveIndex + i];
Mesh* mesh = model->meshes[node->primitiveIndex + i];
Material* material = primitive->material == ~0u ? NULL : model->materials[primitive->material];
if (model->userMaterial) {
material = model->userMaterial;
}
uint32_t rangeStart, rangeCount;
lovrMeshGetDrawRange(mesh, &rangeStart, &rangeCount);
lovrGraphicsBatch(&(BatchRequest) {
.type = BATCH_MESH,
.params.mesh = {
.object = mesh,
.mode = primitive->mode,
.rangeStart = rangeStart,
.rangeCount = rangeCount,
.instances = instances,
.pose = animated ? pose : NULL
},
.drawMode = primitive->mode,
.transform = globalTransform,
.material = material
});
lovrMeshSetMaterial(mesh, model->userMaterial ? model->userMaterial : material);
lovrMeshSetDrawMode(mesh, primitive->mode);
lovrGraphicsDrawMesh(mesh, globalTransform, instances, animated ? pose : NULL);
}
}