Math module random functions;

This commit is contained in:
bjorn 2017-07-26 22:45:27 -07:00
parent 8b34330079
commit ef537e99d4
5 changed files with 65 additions and 5 deletions

View File

@ -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 }
};

View File

@ -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);

20
src/math/math.c Normal file
View File

@ -0,0 +1,20 @@
#include "math.h"
#include <stdlib.h>
#include <time.h>
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;
}

View File

@ -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();

View File

@ -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.;