aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/scene/icamera.cpp
blob: 34b34471d7a87ce6991478ca18700a97a79cd58c (plain)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#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"
#include <shared/lua_api/common.hpp>

using namespace irr;
using namespace scene;
using namespace core;

extern IrrlichtDevice* device;

/***
Create a maya camera
Creates a camera that can be controlled with maya style controls by default,
click and drag rotates the camera, while right click and mouse up/down zooms
in or out.
@function scene.newmayacamera()
@treturn iscenemayacamera
*/
/***
A maya camera.
A camera that can be controlled similar to the 3d modeling software "Maya"
@class iscenemayacamera
@inherits iscenecamera
*/
static int newiscenemayacamera(lua_State* L){
	printf("createing maya camera!\n");
	ISceneManager* smgr = device->getSceneManager();
	ICameraSceneNode* cam = smgr->addCameraSceneNodeMaya();
	printf("cam is %p",cam);
	lua_newtable(L);//{}
	lua_pushlightuserdata(L,cam);
	lua_setfield(L,-2,"node");

	//Set it's metatable
	luaL_getmetatable(L, "scene.iscenemayacamera");
	lua_setmetatable(L, -2);

	return 1;
}

/***
Create an fps camera.
Create a camera with default first person shooter controls. The camera and
be rotated with the mouse, and moved with the arrow keys.
@function scene.newfpscamera()
@treturn iscenefpscamera The camera
*/
/***
A camera with default FPS controls
An FPS camera can be controlled with the arrow keys, and rotated with the mouse
by default.
@class iscenefpscamera
@inherits iscenecamera
*/
// ifpscamera.new() 
static int newiscenefpscamera(lua_State* L){//
	ISceneManager* smgr = device->getSceneManager();
	ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS();
	//cam->bindTargetAndRotation(false);
	lua_newtable(L);//{}
	lua_pushlightuserdata(L,cam);//{},ud_cam
	lua_setfield(L,-2,"node");
	//LISceneNode* lcam = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode));//userdata_scenenode
  
	//Set it's metatable
	luaL_getmetatable(L, "scene.ifpscamera");//userdata_scenenode,scene.ifpscamera
	lua_setmetatable(L, -2);//userdata_scenenode
  
	//Create the struct
	//lcam->n = cam;
	//lcam->funcmap = hashmap_new();
	//lcam->type = "iscenefpscamera";
  
	return 1;
}

/***
Create a new camera
Creates a new camera at the given position.
@function scene.newiscenecamera(vector3d position, vector3d lookat, iscenenode parent)
@tparam vector3d position The position to create the camera in
@tparam vector3d lookat A vector for the camera to look at. Use this to set it's rotation.
@tparam? iscenenode parent A node to parent this camera to. If the parent moves, the camera will move with it.
@treturn iscenecamera The camera
*/
/***
A camera.
The world is rendered through cameras.
@class iscenecamera
@inherits iscenenode
*/
//iscenecamera.new(Vector position, Vector lookat,{node=parent})
static int newiscenecamera(lua_State* L){
	printf("Createing camera!\n");
	int nargs = lua_gettop(L);
	double px,py,pz;
	double lx,ly,lz;
	ISceneNode* parent = NULL;
	if(nargs == 3){
		lua_getfield(L,-1,"node");//{position},{lookat},{parent},ud_ISceneNode
		parent = (ISceneNode*)lua_touserdata(L,-1);
		lua_pop(L,2);//{position},{lookat}
	}
	//{position},{lookat}	
	//The position of the camera
	popvector3d(L,&px,&py,&pz);//{position}
	printf("position of camera was %f,%f,%f\n",px,py,pz);
	popvector3d(L,&lx,&ly,&lz);//
	printf("lookat of camera was %f,%f,%f\n",lx,ly,lz);
	
	//If the element has a parrent
	if(nargs >= 3){
		printf("got the parrent, %p\n",parent);
	}


	//Create the camera
	ISceneManager* smgr = device->getSceneManager();
	ICameraSceneNode* cam = smgr->addCameraSceneNode(0, vector3df(px,py,pz), vector3df(lx,ly,lz));
	printf("Registered the camera!\n");
	lua_newtable(L);//{}
	lua_pushlightuserdata(L,cam);//{},ud_cam
	lua_setfield(L,-2,"node");//{node=ud_cam}
	luaL_getmetatable(L,"scene.icamera");//{node=ud_cam},{scene.icamera}
	lua_setmetatable(L,-2);//{cam}

	return 1;
}

/***
Lock on
Should the camera be locked on to something?
@function iscenecamera:bindtarget(boolean bind)
@tparam boolean bind Should the camera be locked on to it's "lookat"?
*/
//camera:bind_target(bool) :: nil
static int icamerabindtarget(lua_State *L){
	int should_bind = lua_toboolean(L,-1);//{node=ud_cam},bool_shouldbind
	printf("Bind target called %d\n",should_bind);
	lua_pop(L,1);//{node=ud_cam}
	lua_getfield(L,-1,"node");//{node=ud_cam},ud_cam
	ICameraSceneNode *cam = (ICameraSceneNode*)lua_touserdata(L,-1);
	lua_pop(L,2);//
	cam->bindTargetAndRotation(should_bind == 1);
	return 0;
}

/***
Gets the target of a camera
Gets the vector that a camera is looking at
@function iscenecamera:gettarget()
@treturn vector3d The vector that the camera is looking at
*/
//camera:gettarget() :: v3f
static int icameragettarget(lua_State *L){
	lua_getfield(L,-1,"node");
	ICameraSceneNode *cam = (ICameraSceneNode*)lua_touserdata(L,-1);
	lua_pop(L,2);//
	vector3df targ = cam->getTarget();
	pushvector3d(L,targ.X, targ.Y, targ.Z);
	return 1;
}

/***
Set the camera's target
Forcefully set the rotation the camera should be looking
@function iscenecamera:settarget(vector3d target)
@tparam vector3d target The vector that the camera should be looking at
*/
//camera:settarget(v3f)
static int icamerasettarget(lua_State *L){
	double x,y,z;
	popvector3d(L,&x,&y,&z);
	lua_getfield(L,-1,"node");
	ICameraSceneNode *cam = (ICameraSceneNode*)lua_touserdata(L,-1);
	lua_pop(L,2);//
	cam->setTarget(vector3df(x,y,z));
	return 0;
}

static const luaL_reg icamera_m[] = {
	{"bindtarget",      icamerabindtarget},
	{"gettarget",       icameragettarget},
	{"settarget",       icamerasettarget},
	{0,0},
};

static const luaL_reg imayacamera_m[] = {
	{0,0},
};

static const luaL_reg ifpscamera_m[] = {
	{0,0},
};

void icamera_register(lua_State* L){

	luaL_newmetatable(L, "scene.icamera");//scene.icamera
	lua_newtable(L);//scene.icamera, {}
	luaL_register(L,NULL,icamera_m);//scene.icamera, {}
	luaL_register(L,NULL,igeneric_m);//scene.icamera, {}
	lua_setfield(L,-2,"__index");//scene.icamera
	lua_pop(L,1);//

	luaL_newmetatable(L, "scene.imayacamera");//scene.imayacamera
	lua_newtable(L);//scene.imayascamera,{}
	luaL_register(L,NULL,imayacamera_m);//scene.imayascamera,{}
	luaL_register(L,NULL,icamera_m);//scene.imayascamera,{}
	luaL_register(L,NULL,igeneric_m);
	lua_setfield(L,-2,"__index");//scene.imayascamera
	lua_pop(L,1);//

	luaL_newmetatable(L,"scene.ifpscamera");//scene.ifpscamera
	lua_newtable(L);//scene.ifpscamera, {}
	luaL_register(L,NULL,ifpscamera_m);//scene.ifpscamera,{}
	luaL_register(L,NULL,icamera_m);//scene.ifpscamera,{}
	luaL_register(L,NULL,igeneric_m);
	lua_setfield(L,-2,"__index");//scene.ifpscamera
	lua_pop(L,1);//

	lua_getglobal(L,"scene");//{}
	lua_pushcfunction(L,newiscenecamera);//{},newiscenecamera()
	lua_setfield(L,-2,"newcamera");//{}
	lua_pushcfunction(L,newiscenefpscamera);//{},newiscenefpscamera()
	lua_setfield(L,-2,"newfpscamera");//{}
	lua_pushcfunction(L,newiscenemayacamera);//{},newiscenemayacamera()
	lua_setfield(L,-2,"newmayacamera");//{}
	lua_pop(L,1);//
}