From ef537e99d4f6f6d5ad0d00594a846eb87effc5ed Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 26 Jul 2017 22:45:27 -0700 Subject: [PATCH] Math module random functions; --- src/api/math.c | 35 +++++++++++++++++++++++++++++++++ src/api/types/randomGenerator.c | 8 ++++---- src/math/math.c | 20 +++++++++++++++++++ src/math/math.h | 5 +++++ src/math/randomGenerator.c | 2 +- 5 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/math/math.c diff --git a/src/api/math.c b/src/api/math.c index a99335a6..4b0c9f58 100644 --- a/src/api/math.c +++ b/src/api/math.c @@ -1,14 +1,21 @@ #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; } @@ -47,10 +54,38 @@ int l_lovrMathLookAt(lua_State* L) { 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 } }; diff --git a/src/api/types/randomGenerator.c b/src/api/types/randomGenerator.c index 1120b270..e45b9ea4 100644 --- a/src/api/types/randomGenerator.c +++ b/src/api/types/randomGenerator.c @@ -60,14 +60,14 @@ int l_lovrRandomGeneratorSetState(lua_State* L) { int l_lovrRandomGeneratorRandom(lua_State* L) { RandomGenerator* generator = luax_checktype(L, 1, RandomGenerator); - float r = lovrRandomGeneratorRandom(generator); + double r = lovrRandomGeneratorRandom(generator); if (lua_gettop(L) >= 3) { - float lower = luaL_checknumber(L, 2); - float upper = luaL_checknumber(L, 3); + double lower = luaL_checknumber(L, 2); + double upper = luaL_checknumber(L, 3); lua_pushnumber(L, floor(r * (upper - lower + 1)) + lower); } else if (lua_gettop(L) >= 2) { - float upper = luaL_checknumber(L, 2); + double upper = luaL_checknumber(L, 2); lua_pushnumber(L, floor(r * upper) + 1); } else { lua_pushnumber(L, r); diff --git a/src/math/math.c b/src/math/math.c new file mode 100644 index 00000000..be73576e --- /dev/null +++ b/src/math/math.c @@ -0,0 +1,20 @@ +#include "math.h" +#include +#include + +static RandomGenerator* generator; + +void lovrMathInit() { + generator = lovrRandomGeneratorCreate(); + Seed seed = { .b64 = (uint64_t) time(0) }; + lovrRandomGeneratorSetSeed(generator, seed); + atexit(lovrMathDestroy); +} + +void lovrMathDestroy() { + lovrRandomGeneratorDestroy(&generator->ref); +} + +RandomGenerator* lovrMathGetRandomGenerator() { + return generator; +} diff --git a/src/math/math.h b/src/math/math.h index 5857cb50..f7548fea 100644 --- a/src/math/math.h +++ b/src/math/math.h @@ -1,4 +1,5 @@ #include "lib/vec/vec.h" +#include "randomGenerator.h" #pragma once @@ -9,3 +10,7 @@ typedef float* vec3; typedef float* quat; typedef float* mat4; typedef vec_t(mat4) vec_mat4_t; + +void lovrMathInit(); +void lovrMathDestroy(); +RandomGenerator* lovrMathGetRandomGenerator(); diff --git a/src/math/randomGenerator.c b/src/math/randomGenerator.c index 9428ab92..1ec0ea6a 100644 --- a/src/math/randomGenerator.c +++ b/src/math/randomGenerator.c @@ -70,7 +70,7 @@ double lovrRandomGeneratorRandom(RandomGenerator* generator) { generator->state.b64 ^= (generator->state.b64 >> 12); generator->state.b64 ^= (generator->state.b64 << 25); generator->state.b64 ^= (generator->state.b64 >> 27); - uint64_t r = generator->state.b64 * 2685821657736338717ULL; + uint64_t r = generator->state.b64 * 2685821657736338717ULL; union { uint64_t i; double d; } u; u.i = ((0x3FFULL) << 52) | (r >> 12); return u.d - 1.;