aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/scene/ilight.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/lua_api/scene/ilight.cpp')
-rw-r--r--src/client/lua_api/scene/ilight.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/client/lua_api/scene/ilight.cpp b/src/client/lua_api/scene/ilight.cpp
new file mode 100644
index 0000000..df01dd3
--- /dev/null
+++ b/src/client/lua_api/scene/ilight.cpp
@@ -0,0 +1,130 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <vector>
+#include <memory>
+#include <map>
+#include <functional>
+extern "C" {
+ #include <lua.h>
+ #include <lauxlib.h>
+ #include <lualib.h>
+}
+#include <irrlicht.h>
+#include "../gameparts.hpp"
+#include "ilight.hpp"
+#include "igeneric.hpp"
+
+using namespace irr;
+using namespace scene;
+using namespace core;
+
+extern IrrlichtDevice* device;
+
+static LISceneNode* checkiscenelight(lua_State* L, int index){
+ void* ud = luaL_checkudata(L,index,"scene.ilight");
+ luaL_argcheck(L,ud != NULL, index, "'scene.ilight' expected");
+ return (LISceneNode*) ud;
+}
+
+static LISceneNode* checkilight(lua_State* L){
+ return checkiscenelight(L,1);
+}
+
+//iscenelight.new(Vector position, parrent = nil)
+static int newiscenelight(lua_State* L){
+ printf("Createing light!\n");
+ int nargs = lua_gettop(L);
+ //lua_pop(L,1);
+ // float radius = 100;
+ // if(nargs == 2){
+ // radius = luaL_optnumber(L,2,100);
+ // }
+ float radius = lua_tonumber(L,-1);
+ printf("radius was %f\n" ,radius);
+ lua_pop(L,1);
+
+ //The position of the light
+ lua_pushnumber(L,1);
+ lua_gettable(L,-2);
+ float x = lua_tonumber(L,-1);
+ printf("got x: %f\n",x);
+ lua_pop(L,1);
+ lua_pushnumber(L,2);
+ lua_gettable(L,-2);
+ float y = lua_tonumber(L,-1);
+ lua_pop(L,1);
+ lua_pushnumber(L,3);
+ lua_gettable(L,-2);
+ float z = lua_tonumber(L,-1);
+ lua_pop(L,1);
+ printf("Found position for light: %f %f %f\n",x,y,z);
+
+ //Create the mesh
+ ISceneManager* smgr = device->getSceneManager();
+ ILightSceneNode* light = smgr->addLightSceneNode(0,vector3df(x,y,z),video::SColor(1.0f,1.0f,1.0f,1.0f),(f32)radius,(s32)-1);
+ printf("Registered the light!\n");
+
+ //Register it's callback
+ //registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent);
+
+ //Create it's lua representation
+ LISceneNode* lnode = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode));
+ int tref = luaL_ref(L,LUA_REGISTRYINDEX);
+ //iguielements[lcam] = tref;
+ lua_rawgeti(L,LUA_REGISTRYINDEX,tref);//Put it back on the stack since luaL_ref pops the object.
+
+ //Set it's metatable
+ luaL_getmetatable(L, "scene.imesh");
+ lua_setmetatable(L, -2);
+
+ lnode->n = light;
+ lnode->funcmap = hashmap_new();
+ lnode->type = "ilight";
+
+ //Put it on top and return it
+ lua_rawgeti(L,LUA_REGISTRYINDEX,tref);
+ return 1;
+
+ }
+
+static const luaL_reg icamera_f[] = {
+ {"new", newiscenelight},
+// {"gethandeler", guigethandeler},
+// {"sethandeler", guisethandeler},
+ {0,0},
+};
+
+static const luaL_reg icamera_m[] = {
+ {"getpos", iscenegetpos},
+ {"setpos", iscenesetpos},
+// {"move", moveiguielement},
+// {"settext", setiguitext},
+// {"remove", removeiguielement},
+ {0, 0},
+};
+
+int ilight_register(lua_State* L, IrrlichtDevice* d){
+
+ device = d;
+
+ printf("icamera registered\n");
+
+ luaL_newmetatable(L, "scene.ilight");
+
+ luaL_register(L,"ilight",icamera_f);
+
+ lua_pushstring(L,"__index");
+ lua_pushstring(L,"gethandeler");
+ lua_gettable(L,-3);
+ lua_settable(L,-4);
+
+ lua_pushstring(L,"__newindex");
+ lua_pushstring(L,"sethandeler");
+ lua_gettable(L,-3);
+ lua_settable(L,-4);
+
+ luaL_register(L, NULL, icamera_m);
+
+ return 1;
+}