mirror of https://github.com/bjornbytes/lovr.git
ModelData vertex accessors;
This commit is contained in:
parent
032788003a
commit
3ed5419005
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 }
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue