1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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;
}
|