mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-03 21:13:42 +00:00
Mesh:setVertices(Blob);
This commit is contained in:
parent
48b887f7ee
commit
3b8d485fe9
|
@ -271,19 +271,30 @@ static int l_lovrMeshSetVertexAttribute(lua_State* L) {
|
||||||
|
|
||||||
static int l_lovrMeshSetVertices(lua_State* L) {
|
static int l_lovrMeshSetVertices(lua_State* L) {
|
||||||
Mesh* mesh = luax_checktype(L, 1, Mesh);
|
Mesh* mesh = luax_checktype(L, 1, Mesh);
|
||||||
uint32_t capacity = lovrMeshGetVertexCount(mesh);
|
|
||||||
luaL_checktype(L, 2, LUA_TTABLE);
|
|
||||||
uint32_t sourceSize = luax_len(L, 2);
|
|
||||||
uint32_t start = luaL_optinteger(L, 3, 1) - 1;
|
|
||||||
uint32_t count = luaL_optinteger(L, 4, sourceSize);
|
|
||||||
lovrAssert(start + count <= capacity, "Overflow in Mesh:setVertices: Mesh can only hold %d vertices", capacity);
|
|
||||||
lovrAssert(count <= sourceSize, "Cannot set %d vertices on Mesh: source only has %d vertices", count, sourceSize);
|
|
||||||
|
|
||||||
if (!mesh->vertexBuffer || mesh->attributeCount == 0 || mesh->attributes[0].buffer != mesh->vertexBuffer) {
|
if (!mesh->vertexBuffer || mesh->attributeCount == 0 || mesh->attributes[0].buffer != mesh->vertexBuffer) {
|
||||||
lovrThrow("Mesh does not have a vertex buffer");
|
lovrThrow("Mesh:setVertices does not work when the Mesh does not have a vertex buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t capacity = lovrMeshGetVertexCount(mesh);
|
||||||
|
uint32_t start = luaL_optinteger(L, 3, 1) - 1;
|
||||||
|
uint32_t count = luaL_optinteger(L, 4, capacity - start);
|
||||||
size_t stride = mesh->attributes[0].stride;
|
size_t stride = mesh->attributes[0].stride;
|
||||||
|
|
||||||
|
Blob* blob = luax_totype(L, 2, Blob);
|
||||||
|
if (blob) {
|
||||||
|
count = MIN(count, blob->size / stride);
|
||||||
|
lovrAssert(start + count <= capacity, "Overflow in Mesh:setVertices: Mesh can only hold %d vertices", capacity);
|
||||||
|
void* data = lovrBufferMap(mesh->vertexBuffer, start * stride);
|
||||||
|
memcpy(data, blob->data, count * stride);
|
||||||
|
lovrBufferFlush(mesh->vertexBuffer, start * stride, count * stride);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
luaL_checktype(L, 2, LUA_TTABLE);
|
||||||
|
count = MIN(count, lua_objlen(L, 2));
|
||||||
|
lovrAssert(start + count <= capacity, "Overflow in Mesh:setVertices: Mesh can only hold %d vertices", capacity);
|
||||||
|
|
||||||
AttributeData data = { .raw = lovrBufferMap(mesh->vertexBuffer, start * stride) };
|
AttributeData data = { .raw = lovrBufferMap(mesh->vertexBuffer, start * stride) };
|
||||||
|
|
||||||
for (uint32_t i = 0; i < count; i++) {
|
for (uint32_t i = 0; i < count; i++) {
|
||||||
|
|
Loading…
Reference in a new issue