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