/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef L_NOISE_H_
#define L_NOISE_H_

extern "C" {
#include <lua.h>
#include <lauxlib.h>
}

#include "irr_v3d.h"
#include "noise.h"

class LuaPerlinNoise
{
private:
	int seed;
	int octaves;
	float persistence;
	float scale;
	static const char className[];
	static const luaL_reg methods[];

	// Exported functions

	// garbage collector
	static int gc_object(lua_State *L);

	static int l_get2d(lua_State *L);
	static int l_get3d(lua_State *L);

public:
	LuaPerlinNoise(int a_seed, int a_octaves, float a_persistence,
			float a_scale);

	~LuaPerlinNoise();

	// LuaPerlinNoise(seed, octaves, persistence, scale)
	// Creates an LuaPerlinNoise and leaves it on top of stack
	static int create_object(lua_State *L);

	static LuaPerlinNoise* checkobject(lua_State *L, int narg);

	static void Register(lua_State *L);
};

/*
  PerlinNoiseMap
 */
class LuaPerlinNoiseMap
{
private:
	Noise *noise;
	static const char className[];
	static const luaL_reg methods[];

	static int gc_object(lua_State *L);

	static int l_get2dMap(lua_State *L);

	static int l_get3dMap(lua_State *L);

public:
	LuaPerlinNoiseMap(NoiseParams *np, int seed, v3s16 size);

	~LuaPerlinNoiseMap();

	// LuaPerlinNoiseMap(np, size)
	// Creates an LuaPerlinNoiseMap and leaves it on top of stack
	static int create_object(lua_State *L);

	static LuaPerlinNoiseMap *checkobject(lua_State *L, int narg);

	static void Register(lua_State *L);
};

/*
	LuaPseudoRandom
*/


class LuaPseudoRandom
{
private:
	PseudoRandom m_pseudo;

	static const char className[];
	static const luaL_reg methods[];

	// Exported functions

	// garbage collector
	static int gc_object(lua_State *L);

	// next(self, min=0, max=32767) -> get next value
	static int l_next(lua_State *L);

public:
	LuaPseudoRandom(int seed);

	~LuaPseudoRandom();

	const PseudoRandom& getItem() const;
	PseudoRandom& getItem();

	// LuaPseudoRandom(seed)
	// Creates an LuaPseudoRandom and leaves it on top of stack
	static int create_object(lua_State *L);

	static LuaPseudoRandom* checkobject(lua_State *L, int narg);

	static void Register(lua_State *L);
};

NoiseParams *read_noiseparams(lua_State *L, int index);

#endif /* L_NOISE_H_ */
