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
|
#include "iimage.hpp"
#include <irrlicht.h>
#include "../../../shared/lua_api/common.h"
using namespace irr;
using namespace video;
extern IrrlichtDevice* device;
extern IVideoDriver* driver;
//newiimage(ECOLOR_FORMAT,{width,height}) -> {image}
int newiimage(lua_State* L){
printf("Attempting to create new iimage\n");
long w,h;
popvector2i(L,&w,&h);
int format = lua_tonumber(L,-1);
lua_pop(L,1);
printf("All data collected, creating...\n");
IImage* img = driver->createImage((irr::video::ECOLOR_FORMAT)format,irr::core::dimension2d<u32>(w,h));
lua_newtable(L);
lua_pushlightuserdata(L,img);
lua_setfield(L,-2,"image");
luaL_getmetatable(L,"iimage");
lua_setmetatable(L,-2);
printf("Everything sets up, returning\n");
return 1;
}
//newiimagefromfile("/path/to/file") -> {image}
int newiimagefromfile(lua_State* L){
printf("Creating new iimage from file");
const char* strpath = lua_tostring(L,-1);
lua_pop(L,1);
int numloaders = driver->getImageLoaderCount();
bool hasloaded = false;
IImage* img;
for(int j = 0; j < numloaders; j++){
IImageLoader* loader = driver->getImageLoader(j);
io::IReadFile* f = device->getFileSystem()->createAndOpenFile(strpath);
if(!loader->isALoadableFileExtension(strpath))
continue;
if(!loader->isALoadableFileFormat(f))
continue;
hasloaded = true;
img = loader->loadImage(f);
}
if(!hasloaded){
lua_pushstring(L,"Failed to load file");
lua_error(L);
}
if(!img){
lua_pushstring(L,"Failed to load image");
lua_error(L);
}
lua_newtable(L);
lua_pushlightuserdata(L,img);
lua_setfield(L,-2,"image");
luaL_getmetatable(L,"iimage");
lua_setmetatable(L,-2);
printf("IImage made, returning!");
return 1;
}
//setPixel({self},{x,y},{r,g,b,a},bool_shouldblend)
int setiimagepixel(lua_State* L){
bool sb = lua_toboolean(L,-1);//{ud_iimage},{x,y},{r,g,b,a},bool_shouldblend
lua_pop(L,1);//{ud_iimage},{x,y},{r,g,b,a}
double r,g,b,a;
popvector4d(L,&r,&g,&b,&a);//{ud_iimage},{x,y}
long x,y;
popvector2i(L,&x,&y);//{ud_iimage}
lua_getfield(L,-1,"image");
IImage* img = (IImage*)lua_touserdata(L,-1);//{ud_iimage}
img->setPixel(x,y,SColor(a,r,g,b),sb);
lua_pop(L,2);
return 0;
}
static const luaL_reg iimage_m[] = {
{"setPixel", setiimagepixel},
{0,0},
};
#define set_const(l,x) lua_pushstring(l,#x);lua_pushinteger(l,x);lua_settable(l,-3);
void iimage_register(lua_State* L){
driver = device->getVideoDriver();
lua_getglobal(L,"video");//{}
set_const(L,ECF_A1R5G5B5);
set_const(L,ECF_R5G6B5);
set_const(L,ECF_A8R8G8B8);
set_const(L,ECF_R16F);
set_const(L,ECF_G16R16F);
set_const(L,ECF_A16B16G16R16F);
set_const(L,ECF_R32F);
set_const(L,ECF_G32R32F);
set_const(L,ECF_A32B32G32R32F);
set_const(L,ECF_UNKNOWN);
lua_pushcfunction(L,newiimage);//{},newiimage()
lua_setfield(L,-2,"newiimage");//{}
lua_pushcfunction(L,newiimagefromfile);//{},newiimagefromfile()
lua_setfield(L,-2,"newiimagefromfile");//{}
lua_pop(L,1);//
luaL_newmetatable(L,"iimage");//{m_iimage}
lua_newtable(L);//{m_iimage},{}
luaL_register(L,NULL,iimage_m);//{m_iimage},{iimage}
lua_setfield(L,-2,"__index");//{m_iimage}
lua_pop(L,1);//
}
|