Mesh:drawInstanced; Model:drawInstanced;

No attribute divisors yet.
This commit is contained in:
bjorn 2017-11-25 19:45:44 -08:00
parent cb2265e547
commit ddd905627b
6 changed files with 40 additions and 16 deletions

View File

@ -27,14 +27,21 @@ void luax_checkmeshformat(lua_State* L, int index, MeshFormat* format) {
} }
} }
int l_lovrMeshDraw(lua_State* L) { int l_lovrMeshDrawInstanced(lua_State* L) {
Mesh* mesh = luax_checktype(L, 1, Mesh); Mesh* mesh = luax_checktype(L, 1, Mesh);
int instances = luaL_checkinteger(L, 2);
float transform[16]; float transform[16];
luax_readtransform(L, 2, transform, 1); luax_readtransform(L, 3, transform, 1);
lovrMeshDraw(mesh, transform, NULL); lovrMeshDraw(mesh, transform, NULL, instances);
return 0; return 0;
} }
int l_lovrMeshDraw(lua_State* L) {
lua_pushinteger(L, 1);
lua_insert(L, 2);
return l_lovrMeshDrawInstanced(L);
}
int l_lovrMeshGetVertexFormat(lua_State* L) { int l_lovrMeshGetVertexFormat(lua_State* L) {
Mesh* mesh = luax_checktype(L, 1, Mesh); Mesh* mesh = luax_checktype(L, 1, Mesh);
MeshFormat format = lovrMeshGetVertexFormat(mesh); MeshFormat format = lovrMeshGetVertexFormat(mesh);
@ -400,6 +407,7 @@ int l_lovrMeshSetMaterial(lua_State* L) {
} }
const luaL_Reg lovrMesh[] = { const luaL_Reg lovrMesh[] = {
{ "drawInstanced", l_lovrMeshDrawInstanced },
{ "draw", l_lovrMeshDraw }, { "draw", l_lovrMeshDraw },
{ "getVertexFormat", l_lovrMeshGetVertexFormat }, { "getVertexFormat", l_lovrMeshGetVertexFormat },
{ "getVertexCount", l_lovrMeshGetVertexCount }, { "getVertexCount", l_lovrMeshGetVertexCount },

View File

@ -1,14 +1,21 @@
#include "api/lovr.h" #include "api/lovr.h"
#include "graphics/model.h" #include "graphics/model.h"
int l_lovrModelDraw(lua_State* L) { int l_lovrModelDrawInstanced(lua_State* L) {
Model* model = luax_checktype(L, 1, Model); Model* model = luax_checktype(L, 1, Model);
int instances = luaL_checkinteger(L, 2);
float transform[16]; float transform[16];
luax_readtransform(L, 2, transform, 1); luax_readtransform(L, 3, transform, 1);
lovrModelDraw(model, transform); lovrModelDraw(model, transform, instances);
return 0; return 0;
} }
int l_lovrModelDraw(lua_State* L) {
lua_pushinteger(L, 1);
lua_insert(L, 2);
return l_lovrModelDrawInstanced(L);
}
int l_lovrModelGetAABB(lua_State* L) { int l_lovrModelGetAABB(lua_State* L) {
Model* model = luax_checktype(L, 1, Model); Model* model = luax_checktype(L, 1, Model);
const float* aabb = lovrModelGetAABB(model); const float* aabb = lovrModelGetAABB(model);
@ -72,6 +79,7 @@ int l_lovrModelGetMesh(lua_State* L) {
} }
const luaL_Reg lovrModel[] = { const luaL_Reg lovrModel[] = {
{ "drawInstanced", l_lovrModelDrawInstanced },
{ "draw", l_lovrModelDraw }, { "draw", l_lovrModelDraw },
{ "getAABB", l_lovrModelGetAABB }, { "getAABB", l_lovrModelGetAABB },
{ "getAnimator", l_lovrModelGetAnimator }, { "getAnimator", l_lovrModelGetAnimator },

View File

@ -128,7 +128,7 @@ void lovrMeshDestroy(const Ref* ref) {
free(mesh); free(mesh);
} }
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) { void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose, int instances) {
if (mesh->isMapped) { if (mesh->isMapped) {
lovrMeshUnmap(mesh); lovrMeshUnmap(mesh);
} }
@ -147,9 +147,17 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) {
if (mesh->indexCount > 0) { if (mesh->indexCount > 0) {
count = mesh->isRangeEnabled ? mesh->rangeCount : mesh->indexCount; count = mesh->isRangeEnabled ? mesh->rangeCount : mesh->indexCount;
GLenum indexType = mesh->indexSize == sizeof(uint16_t) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT; GLenum indexType = mesh->indexSize == sizeof(uint16_t) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
glDrawElements(mesh->drawMode, count, indexType, (GLvoid*) (start * mesh->indexSize)); if (instances > 1) {
glDrawElementsInstanced(mesh->drawMode, count, indexType, (GLvoid*) (start * mesh->indexSize), instances);
} else {
glDrawElements(mesh->drawMode, count, indexType, (GLvoid*) (start * mesh->indexSize));
}
} else { } else {
glDrawArrays(mesh->drawMode, start, count); if (instances > 1) {
glDrawArraysInstanced(mesh->drawMode, start, count, instances);
} else {
glDrawArrays(mesh->drawMode, start, count);
}
} }
if (transform) { if (transform) {

View File

@ -61,7 +61,7 @@ typedef struct {
Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage); Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage);
void lovrMeshDestroy(const Ref* ref); void lovrMeshDestroy(const Ref* ref);
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose); void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose, int instances);
MeshFormat lovrMeshGetVertexFormat(Mesh* mesh); MeshFormat lovrMeshGetVertexFormat(Mesh* mesh);
MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh); MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh);
void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode); void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode);

View File

@ -4,7 +4,7 @@
#include "math/vec3.h" #include "math/vec3.h"
#include <stdlib.h> #include <stdlib.h>
static void renderNode(Model* model, int nodeIndex) { static void renderNode(Model* model, int nodeIndex, int instances) {
ModelNode* node = &model->modelData->nodes[nodeIndex]; ModelNode* node = &model->modelData->nodes[nodeIndex];
if (node->primitives.length > 0) { if (node->primitives.length > 0) {
@ -38,14 +38,14 @@ static void renderNode(Model* model, int nodeIndex) {
} }
lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount); lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount);
lovrMeshDraw(model->mesh, NULL, (float*) model->pose); lovrMeshDraw(model->mesh, NULL, (float*) model->pose, instances);
} }
lovrGraphicsPop(); lovrGraphicsPop();
} }
for (int i = 0; i < node->children.length; i++) { for (int i = 0; i < node->children.length; i++) {
renderNode(model, node->children.data[i]); renderNode(model, node->children.data[i], instances);
} }
} }
@ -131,7 +131,7 @@ void lovrModelDestroy(const Ref* ref) {
free(model); free(model);
} }
void lovrModelDraw(Model* model, mat4 transform) { void lovrModelDraw(Model* model, mat4 transform, int instances) {
if (model->modelData->nodeCount == 0) { if (model->modelData->nodeCount == 0) {
return; return;
} }
@ -162,7 +162,7 @@ void lovrModelDraw(Model* model, mat4 transform) {
lovrGraphicsPush(); lovrGraphicsPush();
lovrGraphicsMatrixTransform(MATRIX_MODEL, transform); lovrGraphicsMatrixTransform(MATRIX_MODEL, transform);
renderNode(model, 0); renderNode(model, 0, instances);
lovrGraphicsPop(); lovrGraphicsPop();
} }

View File

@ -26,7 +26,7 @@ typedef struct {
Model* lovrModelCreate(ModelData* modelData); Model* lovrModelCreate(ModelData* modelData);
void lovrModelDestroy(const Ref* ref); void lovrModelDestroy(const Ref* ref);
void lovrModelDraw(Model* model, mat4 transform); void lovrModelDraw(Model* model, mat4 transform, int instances);
Animator* lovrModelGetAnimator(Model* model); Animator* lovrModelGetAnimator(Model* model);
void lovrModelSetAnimator(Model* model, Animator* animator); void lovrModelSetAnimator(Model* model, Animator* animator);
int lovrModelGetAnimationCount(Model* model); int lovrModelGetAnimationCount(Model* model);