mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-03 21:13:42 +00:00
model:getAnimationName(idx) and model:getNodeName(idx)
This commit is contained in:
parent
8b18c735ca
commit
c9cc5362bd
|
@ -4,6 +4,22 @@
|
||||||
#include "data/modelData.h"
|
#include "data/modelData.h"
|
||||||
#include "core/maf.h"
|
#include "core/maf.h"
|
||||||
|
|
||||||
|
static int luax_reverseModelDataNameMap(lua_State *L, ModelData *modelData, int idx, map_u32_t *t, int count, const char *noun) {
|
||||||
|
if (idx < 1 || idx > count)
|
||||||
|
lovrThrow("Model has no %s at index %d", idx, noun);
|
||||||
|
map_iter_t iter = map_iter(t);
|
||||||
|
const char* key;
|
||||||
|
while ((key = map_next(t, &iter)) != NULL) {
|
||||||
|
uint32_t iterIdx = *map_get(t, key);
|
||||||
|
if (iterIdx == idx-1) { // Map is 0 indexed
|
||||||
|
lua_pushstring(L, key);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lua_pushnil(L);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int l_lovrModelDraw(lua_State* L) {
|
static int l_lovrModelDraw(lua_State* L) {
|
||||||
Model* model = luax_checktype(L, 1, Model);
|
Model* model = luax_checktype(L, 1, Model);
|
||||||
float transform[16];
|
float transform[16];
|
||||||
|
@ -96,25 +112,6 @@ static int l_lovrModelGetMaterial(lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int l_lovrModelGetMaterialName(lua_State* L) {
|
|
||||||
Model* model = luax_checktype(L, 1, Model);
|
|
||||||
int idx = luaL_checknumber(L, 2);
|
|
||||||
ModelData* modelData = lovrModelGetModelData(model);
|
|
||||||
if (idx < 1 || idx > modelData->materialCount)
|
|
||||||
lovrThrow("Model has no material at index %d", idx);
|
|
||||||
map_iter_t iter = map_iter(&modelData->materialMap);
|
|
||||||
const char* key;
|
|
||||||
while ((key = map_next(&modelData->materialMap, &iter)) != NULL) {
|
|
||||||
uint32_t iterIdx = *map_get(&modelData->materialMap, key);
|
|
||||||
if (iterIdx == idx-1) { // Map is 0 indexed
|
|
||||||
lua_pushstring(L, key);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lua_pushnil(L);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int l_lovrModelGetAABB(lua_State* L) {
|
static int l_lovrModelGetAABB(lua_State* L) {
|
||||||
Model* model = luax_checktype(L, 1, Model);
|
Model* model = luax_checktype(L, 1, Model);
|
||||||
float aabb[6];
|
float aabb[6];
|
||||||
|
@ -158,6 +155,27 @@ static int l_lovrModelGetNodePose(lua_State* L) {
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_lovrModelGetAnimationName(lua_State* L) {
|
||||||
|
Model* model = luax_checktype(L, 1, Model);
|
||||||
|
int idx = luaL_checknumber(L, 2);
|
||||||
|
ModelData* modelData = lovrModelGetModelData(model);
|
||||||
|
return luax_reverseModelDataNameMap(L, modelData, idx, &modelData->animationMap, modelData->animationCount, "animation");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_lovrModelGetMaterialName(lua_State* L) {
|
||||||
|
Model* model = luax_checktype(L, 1, Model);
|
||||||
|
int idx = luaL_checknumber(L, 2);
|
||||||
|
ModelData* modelData = lovrModelGetModelData(model);
|
||||||
|
return luax_reverseModelDataNameMap(L, modelData, idx, &modelData->materialMap, modelData->materialCount, "material");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_lovrModelGetNodeName(lua_State* L) {
|
||||||
|
Model* model = luax_checktype(L, 1, Model);
|
||||||
|
int idx = luaL_checknumber(L, 2);
|
||||||
|
ModelData* modelData = lovrModelGetModelData(model);
|
||||||
|
return luax_reverseModelDataNameMap(L, modelData, idx, &modelData->nodeMap, modelData->nodeCount, "node");
|
||||||
|
}
|
||||||
|
|
||||||
static int l_lovrModelGetAnimationCount(lua_State* L) {
|
static int l_lovrModelGetAnimationCount(lua_State* L) {
|
||||||
Model* model = luax_checktype(L, 1, Model);
|
Model* model = luax_checktype(L, 1, Model);
|
||||||
lua_pushinteger(L, lovrModelGetModelData(model)->animationCount);
|
lua_pushinteger(L, lovrModelGetModelData(model)->animationCount);
|
||||||
|
@ -181,9 +199,11 @@ const luaL_Reg lovrModel[] = {
|
||||||
{ "animate", l_lovrModelAnimate },
|
{ "animate", l_lovrModelAnimate },
|
||||||
{ "pose", l_lovrModelPose },
|
{ "pose", l_lovrModelPose },
|
||||||
{ "getMaterial", l_lovrModelGetMaterial },
|
{ "getMaterial", l_lovrModelGetMaterial },
|
||||||
{ "getMaterialName", l_lovrModelGetMaterialName },
|
|
||||||
{ "getAABB", l_lovrModelGetAABB },
|
{ "getAABB", l_lovrModelGetAABB },
|
||||||
{ "getNodePose", l_lovrModelGetNodePose },
|
{ "getNodePose", l_lovrModelGetNodePose },
|
||||||
|
{ "getAnimationName", l_lovrModelGetAnimationName },
|
||||||
|
{ "getMaterialName", l_lovrModelGetMaterialName },
|
||||||
|
{ "getNodeName", l_lovrModelGetNodeName },
|
||||||
{ "getAnimationCount", l_lovrModelGetAnimationCount },
|
{ "getAnimationCount", l_lovrModelGetAnimationCount },
|
||||||
{ "getMaterialCount", l_lovrModelGetMaterialCount },
|
{ "getMaterialCount", l_lovrModelGetMaterialCount },
|
||||||
{ "getNodeCount", l_lovrModelGetNodeCount },
|
{ "getNodeCount", l_lovrModelGetNodeCount },
|
||||||
|
|
Loading…
Reference in a new issue