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
|
#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 "icamera.hpp"
using namespace irr;
using namespace scene;
//IrrlichtDevice* guidevice;
static LISceneNode* checkiscenecamera(lua_State* L, int index){
void* ud = luaL_checkudata(L,index,"scene.icamera");
luaL_argcheck(L,ud != NULL, index, "'scene.icamera' expected");
return (LISceneNode*) ud;
}
static LISceneNode* checkiscenecamera(lua_State* L){
return checkiscenecamera(L,1);
}
//iscenecamera.new(Vector position, Vector lookat, parrent)
static int newiscenecamera(lua_State* L){
printf("Createing camera!\n");
int nargs = lua_gettop(L);
//The position of the camera
int startx = luaL_optint(L,1,0);
int starty = luaL_optint(L,2,0);
int endx = luaL_optint(L,3,startx+100);
int endy = luaL_optint(L,4,starty+100);
//Label and tooltip
wchar_t* label;
const char* labelopt = luaL_optstring(L,5,"Label");
int bls = strlen(labelopt);
label = (wchar_t*)malloc(sizeof(wchar_t)*(bls));
mbstowcs(label,labelopt,bls);
printf("Got the string option\n");
//If the element has a parrent
int parent = 0;
if(nargs >= 6){
parent = luaL_optint(L,6,0);
printf("got the parrent\n");
}
//Create the button
IGUIEnvironment* env = guidevice->getGUIEnvironment();
//printf("Createing button with data %d %d %d %d, %p, %d, %s, %s\n", startx,starty,endx,endy,guielements[parent],gui_elenum,button_label,button_tooltip);
//Create the label
IGUIStaticText* llabel = (IGUIStaticText*) env->addStaticText(label,core::rect<s32>(startx,starty,endx,endy),false,false, guielements[parent], gui_elenum++, false);
printf("Created the button\n");
//Register it's callback
registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent);
//Create it's lua representation
LIGUIElement* ltext = (LIGUIElement*)lua_newuserdata(L, sizeof(LIGUIElement));
int tref = luaL_ref(L,LUA_REGISTRYINDEX);
iguielements[llabel] = 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, "gui.iguilabel");
lua_setmetatable(L, -2);
//Create the struct
ltext->e = llabel;
ltext->funcmap = hashmap_new();
ltext->type = "iguilabel";
//Free up anything made in this function
free(label);
//Put it on top and return it
lua_rawgeti(L,LUA_REGISTRYINDEX,tref);
return 1;
}
static const luaL_reg iguilabel_f[] = {
{"new", newiguilabel},
{"gethandeler", guigethandeler},
{"sethandeler", guisethandeler},
{0,0},
};
static const luaL_reg iguilabel_m[] = {
{"move", moveiguielement},
{"settext", setiguitext},
{"remove", removeiguielement},
{0, 0},
};
int iguilabel_register(lua_State* L, IrrlichtDevice* d){
luaL_newmetatable(L, "gui.iguilabel");
luaL_register(L,"iguilabel",iguilabel_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, iguilabel_m);
return 1;
}
|