mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-12 00:43:34 +00:00
92 lines
2.8 KiB
C
92 lines
2.8 KiB
C
#include "api/lovr.h"
|
|
#include "math/math.h"
|
|
#include "math/mat4.h"
|
|
#include "math/quat.h"
|
|
#include "math/randomGenerator.h"
|
|
#include "math/transform.h"
|
|
|
|
extern int l_lovrRandomGeneratorRandom(lua_State* L);
|
|
extern int l_lovrRandomGeneratorRandomNormal(lua_State* L);
|
|
extern int l_lovrRandomGeneratorGetSeed(lua_State* L);
|
|
extern int l_lovrRandomGeneratorSetSeed(lua_State* L);
|
|
|
|
int l_lovrMathInit(lua_State* L) {
|
|
lua_newtable(L);
|
|
luaL_register(L, NULL, lovrMath);
|
|
luax_registertype(L, "RandomGenerator", lovrRandomGenerator);
|
|
luax_registertype(L, "Transform", lovrTransform);
|
|
lovrMathInit();
|
|
return 1;
|
|
}
|
|
|
|
int l_lovrMathNewRandomGenerator(lua_State* L) {
|
|
RandomGenerator* generator = lovrRandomGeneratorCreate();
|
|
if (lua_gettop(L) > 0){
|
|
Seed seed = luax_checkrandomseed(L, 1);
|
|
lovrRandomGeneratorSetSeed(generator, seed);
|
|
}
|
|
luax_pushtype(L, RandomGenerator, generator);
|
|
lovrRelease(&generator->ref);
|
|
return 1;
|
|
}
|
|
|
|
int l_lovrMathNewTransform(lua_State* L) {
|
|
float matrix[16];
|
|
luax_readtransform(L, 1, matrix, 0);
|
|
Transform* transform = lovrTransformCreate(matrix);
|
|
luax_pushtype(L, Transform, transform);
|
|
lovrRelease(&transform->ref);
|
|
return 1;
|
|
}
|
|
|
|
int l_lovrMathLookAt(lua_State* L) {
|
|
float from[3] = { luaL_checknumber(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3) };
|
|
float to[3] = { luaL_checknumber(L, 4), luaL_checknumber(L, 5), luaL_checknumber(L, 6) };
|
|
float up[3] = { luaL_optnumber(L, 7, 0), luaL_optnumber(L, 8, 1), luaL_optnumber(L, 9, 0) };
|
|
float m[16], q[4], angle, ax, ay, az;
|
|
mat4_lookAt(m, from, to, up);
|
|
quat_fromMat4(q, m);
|
|
quat_getAngleAxis(q, &angle, &ax, &ay, &az);
|
|
lua_pushnumber(L, -angle);
|
|
lua_pushnumber(L, ax);
|
|
lua_pushnumber(L, ay);
|
|
lua_pushnumber(L, az);
|
|
return 4;
|
|
}
|
|
|
|
int l_lovrMathRandom(lua_State* L) {
|
|
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator());
|
|
lua_insert(L, 1);
|
|
return l_lovrRandomGeneratorRandom(L);
|
|
}
|
|
|
|
int l_lovrMathRandomNormal(lua_State* L) {
|
|
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator());
|
|
lua_insert(L, 1);
|
|
return l_lovrRandomGeneratorRandomNormal(L);
|
|
}
|
|
|
|
int l_lovrMathGetRandomSeed(lua_State* L) {
|
|
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator());
|
|
lua_insert(L, 1);
|
|
return l_lovrRandomGeneratorGetSeed(L);
|
|
}
|
|
|
|
int l_lovrMathSetRandomSeed(lua_State* L) {
|
|
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator());
|
|
lua_insert(L, 1);
|
|
return l_lovrRandomGeneratorSetSeed(L);
|
|
}
|
|
|
|
const luaL_Reg lovrMath[] = {
|
|
{ "newRandomGenerator", l_lovrMathNewRandomGenerator },
|
|
{ "newTransform", l_lovrMathNewTransform },
|
|
{ "lookAt", l_lovrMathLookAt },
|
|
{ "random", l_lovrMathRandom },
|
|
{ "randomNormal", l_lovrMathRandomNormal },
|
|
{ "getRandomSeed", l_lovrMathGetRandomSeed },
|
|
{ "setRandomSeed", l_lovrMathSetRandomSeed },
|
|
{ NULL, NULL }
|
|
};
|
|
|