From 7769090c1f82a4c570044ccbf9ccaa3934de9506 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Fri, 11 Dec 2015 00:07:42 -0400 Subject: [PATCH] Mesh:setVertices can now accept a Data object. --- src/modules/graphics/opengl/wrap_Mesh.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/modules/graphics/opengl/wrap_Mesh.cpp b/src/modules/graphics/opengl/wrap_Mesh.cpp index d430c48b7..d654f2f0d 100644 --- a/src/modules/graphics/opengl/wrap_Mesh.cpp +++ b/src/modules/graphics/opengl/wrap_Mesh.cpp @@ -108,12 +108,28 @@ const char *luax_readAttributeData(lua_State *L, Mesh::DataType type, int compon int w_Mesh_setVertices(lua_State *L) { Mesh *t = luax_checkmesh(L, 1); - luaL_checktype(L, 2, LUA_TTABLE); size_t vertoffset = (size_t) luaL_optnumber(L, 3, 1) - 1; if (vertoffset >= t->getVertexCount()) return luaL_error(L, "Invalid vertex start index (must be between 1 and %d)", (int) t->getVertexCount()); + size_t stride = t->getVertexStride(); + size_t byteoffset = vertoffset * stride; + + if (luax_istype(L, 2, DATA_ID)) + { + Data *d = luax_checktype(L, 2, DATA_ID); + + size_t datasize = std::min(d->getSize(), (t->getVertexCount() - vertoffset) * stride); + char *bytedata = (char *) t->mapVertexData() + byteoffset; + + memcpy(bytedata, d->getData(), datasize); + + t->unmapVertexData(byteoffset, datasize); + return 0; + } + + luaL_checktype(L, 2, LUA_TTABLE); size_t nvertices = luax_objlen(L, 2); if (vertoffset + nvertices > t->getVertexCount()) @@ -125,9 +141,6 @@ int w_Mesh_setVertices(lua_State *L) for (const Mesh::AttribFormat &format : vertexformat) ncomponents += format.components; - size_t stride = t->getVertexStride(); - size_t byteoffset = vertoffset * stride; - char *data = (char *) t->mapVertexData() + byteoffset; for (size_t i = 0; i < nvertices; i++)