lovr/src/api/l_model.c

151 lines
4.2 KiB
C
Raw Normal View History

2017-12-10 20:40:37 +00:00
#include "api.h"
2019-04-05 11:58:29 +00:00
#include "graphics/material.h"
2017-03-11 11:08:07 +00:00
#include "graphics/model.h"
2019-05-24 22:14:09 +00:00
#include "data/modelData.h"
2019-07-12 03:00:36 +00:00
#include "core/maf.h"
2016-10-31 20:54:32 +00:00
2019-02-17 22:52:22 +00:00
static int l_lovrModelDraw(lua_State* L) {
2016-11-19 08:57:18 +00:00
Model* model = luax_checktype(L, 1, Model);
float transform[16];
int index = luax_readmat4(L, 2, transform, 1);
int instances = luaL_optinteger(L, index, 1);
lovrModelDraw(model, transform, instances);
2016-10-31 20:54:32 +00:00
return 0;
}
2016-11-08 22:51:58 +00:00
2019-05-24 22:14:09 +00:00
static int l_lovrModelAnimate(lua_State* L) {
2019-01-13 19:08:06 +00:00
Model* model = luax_checktype(L, 1, Model);
2019-07-12 03:00:36 +00:00
uint32_t animation;
2019-05-24 22:14:09 +00:00
switch (lua_type(L, 2)) {
case LUA_TSTRING: {
const char* name = lua_tostring(L, 2);
ModelData* modelData = lovrModelGetModelData(model);
uint32_t* index = map_get(&modelData->animationMap, name);
lovrAssert(index, "Model has no animation named '%s'", name);
animation = *index;
break;
}
case LUA_TNUMBER:
animation = lua_tointeger(L, 2) - 1;
break;
default:
return luaL_typerror(L, 2, "number or string");
2019-01-13 19:08:06 +00:00
}
2019-05-24 22:14:09 +00:00
float time = luaL_checknumber(L, 3);
float alpha = luax_optfloat(L, 4, 1.f);
lovrModelAnimate(model, animation, time, alpha);
2019-01-13 19:08:06 +00:00
return 0;
}
2019-07-12 03:00:36 +00:00
static int l_lovrModelPose(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
uint32_t node;
switch (lua_type(L, 2)) {
case LUA_TNONE:
case LUA_TNIL:
lovrModelResetPose(model);
return 0;
case LUA_TNUMBER:
node = lua_tointeger(L, 2) - 1;
break;
case LUA_TSTRING: {
const char* name = lua_tostring(L, 2);
ModelData* modelData = lovrModelGetModelData(model);
uint32_t* index = map_get(&modelData->nodeMap, name);
lovrAssert(index, "Model has no node named '%s'", name);
node = *index;
break;
}
default:
return luaL_typerror(L, 2, "nil, number, or string");
}
int index = 3;
float position[4], rotation[4];
index = luax_readvec3(L, index, position, NULL);
index = luax_readquat(L, index, rotation, NULL);
float alpha = luax_optfloat(L, index, 1.f);
lovrModelPose(model, node, position, rotation, alpha);
return 0;
}
2019-02-17 22:52:22 +00:00
static int l_lovrModelGetMaterial(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
uint32_t material;
switch (lua_type(L, 2)) {
case LUA_TNUMBER:
material = lua_tointeger(L, 2) - 1;
break;
case LUA_TSTRING: {
const char* name = lua_tostring(L, 2);
ModelData* modelData = lovrModelGetModelData(model);
uint32_t* index = map_get(&modelData->materialMap, name);
lovrAssert(index, "Model has no material named '%s'", name);
material = *index;
break;
}
default:
return luaL_typerror(L, 2, "nil, number, or string");
}
luax_pushtype(L, Material, lovrModelGetMaterial(model, material));
return 1;
}
2019-02-17 22:52:22 +00:00
static int l_lovrModelGetAABB(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
float aabb[6];
lovrModelGetAABB(model, aabb);
for (int i = 0; i < 6; i++) {
lua_pushnumber(L, aabb[i]);
}
return 6;
}
2019-07-12 03:00:36 +00:00
static int l_lovrModelGetNodePose(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
uint32_t node;
switch (lua_type(L, 2)) {
case LUA_TNUMBER:
node = lua_tointeger(L, 2) - 1;
break;
case LUA_TSTRING: {
const char* name = lua_tostring(L, 2);
ModelData* modelData = lovrModelGetModelData(model);
uint32_t* index = map_get(&modelData->nodeMap, name);
lovrAssert(index, "Model has no node named '%s'", name);
node = *index;
break;
}
default:
return luaL_typerror(L, 2, "number or string");
}
float position[4], rotation[4], angle, ax, ay, az;
CoordinateSpace space = luaL_checkoption(L, 3, "global", CoordinateSpaces);
lovrModelGetNodePose(model, node, position, rotation, space);
lua_pushnumber(L, position[0]);
lua_pushnumber(L, position[1]);
lua_pushnumber(L, position[2]);
quat_getAngleAxis(rotation, &angle, &ax, &ay, &az);
lua_pushnumber(L, angle);
lua_pushnumber(L, ax);
lua_pushnumber(L, ay);
lua_pushnumber(L, az);
return 7;
}
2017-03-11 11:08:07 +00:00
const luaL_Reg lovrModel[] = {
{ "draw", l_lovrModelDraw },
2019-05-24 22:14:09 +00:00
{ "animate", l_lovrModelAnimate },
2019-07-12 03:00:36 +00:00
{ "pose", l_lovrModelPose },
{ "getMaterial", l_lovrModelGetMaterial },
{ "getAABB", l_lovrModelGetAABB },
2019-07-12 03:00:36 +00:00
{ "getNodePose", l_lovrModelGetNodePose },
2017-03-11 11:08:07 +00:00
{ NULL, NULL }
};