mirror of https://github.com/bjornbytes/lovr.git
lovr.data.newVertexData accepts a vertex table;
This commit is contained in:
parent
b180b28037
commit
40c363fff4
|
@ -97,6 +97,7 @@ extern map_int_t VerticalAligns;
|
|||
extern map_int_t WrapModes;
|
||||
|
||||
// Shared helpers
|
||||
int luax_loadvertices(lua_State* L, int index, VertexFormat* format, VertexPointer vertices);
|
||||
bool luax_checkvertexformat(lua_State* L, int index, VertexFormat* format);
|
||||
int luax_pushvertexformat(lua_State* L, VertexFormat* format);
|
||||
int luax_pushvertexattribute(lua_State* L, VertexPointer* vertex, Attribute attribute);
|
||||
|
|
|
@ -96,11 +96,36 @@ int l_lovrDataNewTextureData(lua_State* L) {
|
|||
}
|
||||
|
||||
int l_lovrDataNewVertexData(lua_State* L) {
|
||||
uint32_t count = luaL_checkinteger(L, 1);
|
||||
uint32_t count;
|
||||
int dataIndex = 0;
|
||||
bool hasFormat = false;
|
||||
VertexFormat format;
|
||||
vertexFormatInit(&format);
|
||||
bool hasFormat = luax_checkvertexformat(L, 2, &format);
|
||||
|
||||
if (lua_isnumber(L, 1)) {
|
||||
count = lua_tointeger(L, 1);
|
||||
} else if (lua_istable(L, 1)) {
|
||||
if (lua_isnumber(L, 2)) {
|
||||
hasFormat = luax_checkvertexformat(L, 1, &format);
|
||||
count = lua_tointeger(L, 2);
|
||||
dataIndex = 0;
|
||||
} else if (lua_istable(L, 2)) {
|
||||
hasFormat = luax_checkvertexformat(L, 1, &format);
|
||||
count = lua_objlen(L, 2);
|
||||
dataIndex = 2;
|
||||
} else {
|
||||
count = lua_objlen(L, 1);
|
||||
dataIndex = 1;
|
||||
}
|
||||
} else {
|
||||
return luaL_argerror(L, 1, "table or number expected");
|
||||
}
|
||||
|
||||
VertexData* vertexData = lovrVertexDataCreate(count, hasFormat ? &format : NULL);
|
||||
|
||||
if (dataIndex) {
|
||||
luax_loadvertices(L, dataIndex, &vertexData->format, (VertexPointer) { .raw = vertexData->blob.data });
|
||||
}
|
||||
luax_pushtype(L, VertexData, vertexData);
|
||||
lovrRelease(vertexData);
|
||||
return 1;
|
||||
|
|
|
@ -976,32 +976,8 @@ int l_lovrGraphicsNewMesh(lua_State* L) {
|
|||
Mesh* mesh = lovrMeshCreate(count, format, *drawMode, *usage);
|
||||
|
||||
if (dataIndex) {
|
||||
uint32_t dataCount = lua_objlen(L, dataIndex);
|
||||
format = *lovrMeshGetVertexFormat(mesh);
|
||||
VertexPointer vertices = lovrMeshMapVertices(mesh, 0, dataCount, false, true);
|
||||
|
||||
for (uint32_t i = 0; i < dataCount; i++) {
|
||||
lua_rawgeti(L, dataIndex, i + 1);
|
||||
if (!lua_istable(L, -1)) {
|
||||
return luaL_error(L, "Vertex information should be specified as a table");
|
||||
}
|
||||
|
||||
int component = 0;
|
||||
for (int j = 0; j < format.count; j++) {
|
||||
Attribute attribute = format.attributes[j];
|
||||
for (int k = 0; k < attribute.count; k++) {
|
||||
lua_rawgeti(L, -1, ++component);
|
||||
switch (attribute.type) {
|
||||
case ATTR_FLOAT: *vertices.floats++ = luaL_optnumber(L, -1, 0.f); break;
|
||||
case ATTR_BYTE: *vertices.bytes++ = luaL_optint(L, -1, 255); break;
|
||||
case ATTR_INT: *vertices.ints++ = luaL_optint(L, -1, 0); break;
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
VertexPointer vertices = lovrMeshMapVertices(mesh, 0, lua_objlen(L, dataIndex), false, true);
|
||||
luax_loadvertices(L, dataIndex, lovrMeshGetVertexFormat(mesh), vertices);
|
||||
} else if (vertexData) {
|
||||
VertexPointer vertices = lovrMeshMapVertices(mesh, 0, count, false, true);
|
||||
memcpy(vertices.raw, vertexData->blob.data, vertexData->count * vertexData->format.stride);
|
||||
|
|
|
@ -1,5 +1,34 @@
|
|||
#include "api.h"
|
||||
|
||||
int luax_loadvertices(lua_State* L, int index, VertexFormat* format, VertexPointer vertices) {
|
||||
uint32_t count = lua_objlen(L, index);
|
||||
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
lua_rawgeti(L, index, i + 1);
|
||||
if (!lua_istable(L, -1)) {
|
||||
return luaL_error(L, "Vertex information should be specified as a table");
|
||||
}
|
||||
|
||||
int component = 0;
|
||||
for (int j = 0; j < format->count; j++) {
|
||||
Attribute attribute = format->attributes[j];
|
||||
for (int k = 0; k < attribute.count; k++) {
|
||||
lua_rawgeti(L, -1, ++component);
|
||||
switch (attribute.type) {
|
||||
case ATTR_FLOAT: *vertices.floats++ = luaL_optnumber(L, -1, 0.f); break;
|
||||
case ATTR_BYTE: *vertices.bytes++ = luaL_optint(L, -1, 255); break;
|
||||
case ATTR_INT: *vertices.ints++ = luaL_optint(L, -1, 0); break;
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool luax_checkvertexformat(lua_State* L, int index, VertexFormat* format) {
|
||||
if (!lua_istable(L, index)) {
|
||||
return false;
|
||||
|
|
Loading…
Reference in New Issue