aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/video/iimage.cpp
blob: aa51d2921e3ba4959bcee31eae806f93e1264d14 (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
#include "iimage.hpp"
#include <irrlicht.h>

#include <shared/lua_api/common.hpp>

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);//
	
}