aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/scene/imesh.cpp
blob: bbb00177f96eca730140911abb635628d7611f45 (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
#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;
}