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);
int instances = luaL_checkinteger(L, 2);
float transform[16];
luax_readtransform(L, 2, transform, 1);
lovrMeshDraw(mesh, transform, NULL);
luax_readtransform(L, 3, transform, 1);
lovrMeshDraw(mesh, transform, NULL, instances);
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) {
Mesh* mesh = luax_checktype(L, 1, Mesh);
MeshFormat format = lovrMeshGetVertexFormat(mesh);
@ -400,6 +407,7 @@ int l_lovrMeshSetMaterial(lua_State* L) {
}
const luaL_Reg lovrMesh[] = {
{ "drawInstanced", l_lovrMeshDrawInstanced },
{ "draw", l_lovrMeshDraw },
{ "getVertexFormat", l_lovrMeshGetVertexFormat },
{ "getVertexCount", l_lovrMeshGetVertexCount },

View File

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

View File

@ -128,7 +128,7 @@ void lovrMeshDestroy(const Ref* ref) {
free(mesh);
}
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) {
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose, int instances) {
if (mesh->isMapped) {
lovrMeshUnmap(mesh);
}
@ -147,9 +147,17 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) {
if (mesh->indexCount > 0) {
count = mesh->isRangeEnabled ? mesh->rangeCount : mesh->indexCount;
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 {
glDrawArrays(mesh->drawMode, start, count);
if (instances > 1) {
glDrawArraysInstanced(mesh->drawMode, start, count, instances);
} else {
glDrawArrays(mesh->drawMode, start, count);
}
}
if (transform) {

View File

@ -61,7 +61,7 @@ typedef struct {
Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage);
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);
MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh);
void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode);

View File

@ -4,7 +4,7 @@
#include "math/vec3.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];
if (node->primitives.length > 0) {
@ -38,14 +38,14 @@ static void renderNode(Model* model, int nodeIndex) {
}
lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount);
lovrMeshDraw(model->mesh, NULL, (float*) model->pose);
lovrMeshDraw(model->mesh, NULL, (float*) model->pose, instances);
}
lovrGraphicsPop();
}
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);
}
void lovrModelDraw(Model* model, mat4 transform) {
void lovrModelDraw(Model* model, mat4 transform, int instances) {
if (model->modelData->nodeCount == 0) {
return;
}
@ -162,7 +162,7 @@ void lovrModelDraw(Model* model, mat4 transform) {
lovrGraphicsPush();
lovrGraphicsMatrixTransform(MATRIX_MODEL, transform);
renderNode(model, 0);
renderNode(model, 0, instances);
lovrGraphicsPop();
}

View File

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