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
131
132
133
134
135
136
|
#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"
#include "igeneric.hpp"
using namespace irr;
using namespace scene;
using namespace core;
extern IrrlichtDevice* device;
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 startz = luaL_optint(L,3,0);
int endx = luaL_optint(L,4,startx+100);
int endy = luaL_optint(L,5,starty+100);
int endz = luaL_optint(L,6,startz+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 = -1;
if(nargs >= 6){
parent = luaL_optint(L,7,0);
printf("got the parrent\n");
}
//Create the camera
ISceneManager* smgr = device->getSceneManager();
//IGUIEnvironment* env = device->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);
ICameraSceneNode* cam = smgr->addCameraSceneNode(0, vector3df(startx,starty,startz), vector3df(endx,endy,endz));
printf("Registered the camera!\n");
//Register it's callback
//registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent);
//Create it's lua representation
LISceneNode* lcam = (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.iscenecamera");
lua_setmetatable(L, -2);
//Create the struct
lcam->n = cam;
lcam->funcmap = hashmap_new();
lcam->type = "iscenecamera";
//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 icamera_f[] = {
{"new", newiscenecamera},
// {"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 icamera_register(lua_State* L, IrrlichtDevice* d){
device = d;
printf("icamera registered\n");
luaL_newmetatable(L, "scene.icamera");
luaL_register(L,"icamera",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;
}
|