mirror of https://github.com/bjornbytes/lovr.git
Mesh:drawInstanced; Model:drawInstanced;
No attribute divisors yet.
This commit is contained in:
parent
cb2265e547
commit
ddd905627b
|
@ -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 },
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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,10 +147,18 @@ 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;
|
||||
if (instances > 1) {
|
||||
glDrawElementsInstanced(mesh->drawMode, count, indexType, (GLvoid*) (start * mesh->indexSize), instances);
|
||||
} else {
|
||||
glDrawElements(mesh->drawMode, count, indexType, (GLvoid*) (start * mesh->indexSize));
|
||||
}
|
||||
} else {
|
||||
if (instances > 1) {
|
||||
glDrawArraysInstanced(mesh->drawMode, start, count, instances);
|
||||
} else {
|
||||
glDrawArrays(mesh->drawMode, start, count);
|
||||
}
|
||||
}
|
||||
|
||||
if (transform) {
|
||||
lovrGraphicsPop();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue