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
|
#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);
}
*/
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 );
mesh->setMaterialFlag(EMF_GOURAUD_SHADING,true);
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;
}
static const luaL_reg imesh_f[] = {
{"new", newiscenemesh},
// {"gethandeler", guigethandeler},
// {"sethandeler", guisethandeler},
{0,0},
};
static const luaL_reg imesh_m[] = {
{"setMaterial", iscenesetmaterial},
{"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;
}
|