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
|
#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 "imesh.hpp"
#include "igeneric.hpp"
using namespace irr;
using namespace scene;
using namespace core;
using namespace video;
extern IrrlichtDevice* device;
static LISceneNode* checkismesh(lua_State* L, int index){
void* ud = luaL_checkudata(L,index,"scene.imesh");
luaL_argcheck(L,ud != NULL, index, "'scene.imesh' expected");
return (LISceneNode*) ud;
}
/*
static LISceneNode* checkismesh(lua_State* L){
return checkismesh(L,1);
}
*/
//iscenecamera.new(Vector position, Vector lookat, parrent)
static int newiscenemesh(lua_State* L){
printf("Createing mesh!\n");
int nargs = lua_gettop(L);
if(nargs != 1){
printf("Incorrect # of args to create a mesh!");
}
//The model for the mesh
const char* modelpath = luaL_optstring(L,1,"error");
//Create the mesh
ISceneManager* smgr = device->getSceneManager();
IAnimatedMesh* amesh = smgr->getMesh(modelpath);
IAnimatedMeshSceneNode* mesh = smgr->addAnimatedMeshSceneNode( amesh );
printf("Registered the mesh!\n");
//Register it's callback
//registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent);
//Create it's lua representation
LISceneNode* lmesh = (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);
//Create the struct
lmesh->n = mesh;
lmesh->funcmap = hashmap_new();
lmesh->type = "imesh";
//Free up anything made in this function
//free(label);
//Put it on top and return it
lua_rawgeti(L,LUA_REGISTRYINDEX,tref);
return 1;
}
/*mesh:setmaterial("string",layernum=0)*/
static int setmaterial(lua_State* L){
LISceneNode* n = checkismesh(L,1);
u32 layernum = luaL_optint(L,3,0);
const char* matfile = luaL_optstring(L,2,"error.png");
printf("Setting material on a %s",n->type);
IVideoDriver* driver = device->getVideoDriver();
n->n->setMaterialTexture( 0, driver->getTexture(matfile) );
return 0;
}
static const luaL_reg imesh_f[] = {
{"new", newiscenemesh},
// {"gethandeler", guigethandeler},
// {"sethandeler", guisethandeler},
{0,0},
};
static const luaL_reg imesh_m[] = {
{"setMaterial", setmaterial},
{"getpos", iscenegetpos},
{"setpos", iscenesetpos},
// {"settext", setiguitext},
// {"remove", removeiguielement},
{0, 0},
};
int imesh_register(lua_State* L, IrrlichtDevice* d){
device = d;
printf("imesh registered\n");
luaL_newmetatable(L, "scene.imesh");
luaL_register(L,"imesh",imesh_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, imesh_m);
return 1;
}
|