From 3ed5419005022621d8056113b5031b1f4e60b24b Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 27 Jan 2018 13:43:20 -0800 Subject: [PATCH] ModelData vertex accessors; --- src/api.h | 2 ++ src/api/types/mesh.c | 74 ++++++++++++++++++++++----------------- src/api/types/modelData.c | 46 ++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 33 deletions(-) diff --git a/src/api.h b/src/api.h index a2bed703..7b016a58 100644 --- a/src/api.h +++ b/src/api.h @@ -90,6 +90,8 @@ extern map_int_t VerticalAligns; extern map_int_t WrapModes; // Shared helpers +int luax_pushvertexformat(lua_State* L, VertexFormat* format); +int luax_pushvertex(lua_State* L, VertexData* vertex, VertexFormat* format); int luax_readtransform(lua_State* L, int index, mat4 transform, bool uniformScale); Blob* luax_readblob(lua_State* L, int index, const char* debug); int luax_pushshape(lua_State* L, Shape* shape); diff --git a/src/api/types/mesh.c b/src/api/types/mesh.c index b5bc3250..3badf9f2 100644 --- a/src/api/types/mesh.c +++ b/src/api/types/mesh.c @@ -1,23 +1,6 @@ #include "api.h" -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, 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); - VertexFormat* format = lovrMeshGetVertexFormat(mesh); +int luax_pushvertexformat(lua_State* L, VertexFormat* format) { lua_newtable(L); for (int i = 0; i < format->count; i++) { Attribute attribute = format->attributes[i]; @@ -40,6 +23,45 @@ int l_lovrMeshGetVertexFormat(lua_State* L) { return 1; } +int luax_pushvertex(lua_State* L, VertexData* vertex, VertexFormat* format) { + int count = 0; + + for (int i = 0; i < format->count; i++) { + Attribute attribute = format->attributes[i]; + count += attribute.count; + for (int j = 0; j < attribute.count; j++) { + switch (attribute.type) { + case ATTR_FLOAT: lua_pushnumber(L, *vertex->floats++); break; + case ATTR_BYTE: lua_pushnumber(L, *vertex->bytes++); break; + case ATTR_INT: lua_pushnumber(L, *vertex->ints++); break; + } + } + } + + return count; +} + +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, 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); + VertexFormat* format = lovrMeshGetVertexFormat(mesh); + return luax_pushvertexformat(L, format); +} + int l_lovrMeshGetDrawMode(lua_State* L) { Mesh* mesh = luax_checktype(L, 1, Mesh); luax_pushenum(L, &MeshDrawModes, lovrMeshGetDrawMode(mesh)); @@ -64,21 +86,7 @@ int l_lovrMeshGetVertex(lua_State* L) { int index = luaL_checkint(L, 2) - 1; VertexData vertex = lovrMeshMap(mesh, index, 1, true, false); VertexFormat* format = lovrMeshGetVertexFormat(mesh); - int count = 0; - - for (int i = 0; i < format->count; i++) { - Attribute attribute = format->attributes[i]; - count += attribute.count; - for (int j = 0; j < attribute.count; j++) { - switch (attribute.type) { - case ATTR_FLOAT: lua_pushnumber(L, *vertex.floats++); break; - case ATTR_BYTE: lua_pushnumber(L, *vertex.bytes++); break; - case ATTR_INT: lua_pushnumber(L, *vertex.ints++); break; - } - } - } - - return count; + return luax_pushvertex(L, &vertex, format); } int l_lovrMeshSetVertex(lua_State* L) { diff --git a/src/api/types/modelData.c b/src/api/types/modelData.c index a6281018..fdb762ff 100644 --- a/src/api/types/modelData.c +++ b/src/api/types/modelData.c @@ -1,5 +1,51 @@ #include "api.h" +#include "data/model.h" + +int l_lovrModelDataGetVertexCount(lua_State* L) { + ModelData* modelData = luax_checktype(L, 1, ModelData); + lua_pushinteger(L, modelData->vertexCount); + return 1; +} + +int l_lovrModelDataGetVertexFormat(lua_State* L) { + ModelData* modelData = luax_checktype(L, 1, ModelData); + return luax_pushvertexformat(L, &modelData->format); +} + +int l_lovrModelDataGetVertex(lua_State* L) { + ModelData* modelData = luax_checktype(L, 1, ModelData); + int index = luaL_checkint(L, 2) - 1; + VertexData vertex = modelData->vertices; + vertex.bytes += index * modelData->format.stride; + return luax_pushvertex(L, &vertex, &modelData->format); +} + +int l_lovrModelDataGetFaceCount(lua_State* L) { + ModelData* modelData = luax_checktype(L, 1, ModelData); + lua_pushinteger(L, modelData->indexCount / 3); + return 1; +} + +int l_lovrModelDataGetFace(lua_State* L) { + ModelData* modelData = luax_checktype(L, 1, ModelData); + int index = luaL_checkint(L, 2) - 1; + if (modelData->indexSize == sizeof(uint32_t)) { + lua_pushinteger(L, modelData->indices.ints[index * 3 + 0]); + lua_pushinteger(L, modelData->indices.ints[index * 3 + 1]); + lua_pushinteger(L, modelData->indices.ints[index * 3 + 2]); + } else { + lua_pushinteger(L, modelData->indices.shorts[index * 3 + 0]); + lua_pushinteger(L, modelData->indices.shorts[index * 3 + 1]); + lua_pushinteger(L, modelData->indices.shorts[index * 3 + 2]); + } + return 3; +} const luaL_Reg lovrModelData[] = { + { "getVertexFormat", l_lovrModelDataGetVertexFormat }, + { "getVertexCount", l_lovrModelDataGetVertexCount }, + { "getVertex", l_lovrModelDataGetVertex }, + { "getFaceCount", l_lovrModelDataGetFaceCount }, + { "getFace", l_lovrModelDataGetFace }, { NULL, NULL } };