extern "C" { #include #include #include } #include #include "smaterial.hpp" using namespace irr::video; /*** Creates a new material. Creates a new material that can then be used on an @{iscenenode} WARNING: this item is not currently garbage collected, be careful not to make more smaterials than you need. @function video.newsmaterial() @treturn smaterial The new material */ /*TODO: This probably needs a _gc metamethod*/ //newsmaterial() int newsmaterial(lua_State* L){ SMaterial* mat = new SMaterial(); lua_newtable(L);//{} lua_pushlightuserdata(L,mat);//{},ud_smaterial lua_setfield(L,-2,"smaterial");//{smaterial} luaL_getmetatable(L,"video.smaterial");//{smaterial},{m_smaterial} lua_setmetatable(L,-2);//{smaterial} return 1; } /*** Sets a texture for this material. Sets a texture for the material on the given index. For more information on what each texture of a material does, see the irrlicht documentation. @function smaterial:settexture(index,texture) @tparam number index The index of the texture in the material @tparam itexture texture The texture to use */ //setTexture(self,int_num,{ITexture texture}) int setTexture(lua_State* L){ lua_getfield(L,-1,"texture"); ITexture* tex = (ITexture*)lua_touserdata(L,-1); lua_pop(L,2); double num = lua_tonumber(L,-1); lua_pop(L,1); lua_getfield(L,-1,"smaterial"); SMaterial* self = (SMaterial*)lua_touserdata(L,-1); lua_pop(L,2); self->setTexture(num,tex); return 0; } /*** Sets a flag on this material. Sets the given flag on the material @function smaterial:setflag(flag,state) @tparam number flag The flag to set, see @{video} for flags. @tparam boolean state The state to set the flag in */ //{Material},flag,state int setFlag(lua_State* L){ int b = lua_toboolean(L,-1);//{material},flag,state lua_pop(L,1);//{material},flag int flag = lua_tonumber(L,-1);//{material},flag lua_pop(L,1);//{material} lua_getfield(L,-1,"smaterial");//{material},ud_material SMaterial* mat = (SMaterial*)lua_touserdata(L,-1); lua_pop(L,2); mat->setFlag((E_MATERIAL_FLAG)flag,b == 1 ? true : false); return 0; } static const luaL_Reg smaterial_m[] = { {"settexture", setTexture}, {"setflag", setFlag}, {0,0}, }; #define set_const(l,x) lua_pushstring(l,#x);lua_pushinteger(l,x);lua_settable(l,-3); void smaterial_register(lua_State* L){ //Add globals dealing with material flags luaL_newmetatable(L,"video.smaterial");//{m_smaterial} lua_newtable(L);//{m_smaterial},{} luaL_register(L,NULL,smaterial_m);//{m_smaterial},{smaterial} lua_setfield(L,-2,"__index");//{m_smaterial} lua_pop(L,1);// lua_getglobal(L,"video");//{} /*** A table of constants for the material class. @field EMF_WIREFRAME - enable wireframe @field EMF_POINTCLOUD - displays the texture as a pointcloud instead of a solid face @field EMF_GOURAUD_SHADING @field EMF_LIGHTING @field EMF_ZBUFFER @field EMF_ZWRITE_ENABLE @field EMF_BACK_FACE_CULLING @field EMF_FRONT_FACE_CULLING @field EMF_BILINEAR_FILTER @field EMF_TRILINEAR_FILTER @field EMF_ANISOTROPIC_FILTER @field EMF_FOG_ENABLE @field EMF_NORMALIZE_NORMALS @field EMF_TEXTURE_WRAP @field EMF_ANTI_ALIASING @field EMF_COLOR_MASK @field EMF_COLOR_MATERIAL @field EMF_USE_MIP_MAPS @field EMF_BLEND_OPERATION @field EMF_POLYGON_OFFSET @table .video. */ set_const(L,EMF_WIREFRAME); set_const(L,EMF_POINTCLOUD); set_const(L,EMF_GOURAUD_SHADING); set_const(L,EMF_LIGHTING); set_const(L,EMF_ZBUFFER); set_const(L,EMF_ZWRITE_ENABLE); set_const(L,EMF_BACK_FACE_CULLING); set_const(L,EMF_FRONT_FACE_CULLING); set_const(L,EMF_BILINEAR_FILTER); set_const(L,EMF_TRILINEAR_FILTER); set_const(L,EMF_ANISOTROPIC_FILTER); set_const(L,EMF_FOG_ENABLE); set_const(L,EMF_NORMALIZE_NORMALS); set_const(L,EMF_TEXTURE_WRAP); set_const(L,EMF_ANTI_ALIASING); set_const(L,EMF_COLOR_MASK); set_const(L,EMF_COLOR_MATERIAL); set_const(L,EMF_USE_MIP_MAPS); set_const(L,EMF_BLEND_OPERATION); set_const(L,EMF_POLYGON_OFFSET); lua_pushcfunction(L,newsmaterial);//{},newsmaterial lua_setfield(L,-2,"newsmaterial");//{} lua_pop(L,1);// }