lugre_meshbuffer_L.cpp

Go to the documentation of this file.
00001 #include "lugre_prefix.h"
00002 #include "lugre_luabind.h"
00003 #include "lugre_meshbuffer.h"
00004 #include <Ogre.h>
00005 
00006 extern "C" {
00007     #include "lua.h"
00008     #include "lauxlib.h"
00009     #include "lualib.h"
00010 }
00011 
00012 using namespace Lugre;
00013 
00014 namespace Lugre {
00015 void    MeshLoader_LoadFile     (const char* szFilePath,cBufferedMesh* pDest); // test for lugre_meshloader
00016 };
00017 
00018 /*
00019             entity.meshbuffer = GetMeshBuffer(meshname)
00020     bHit,fHitDist = entity.meshbuffer:RayPick(entity.meshname,rx,ry,rz,rvx,rvy,rvz,
00021         entity.x,entity.y,entity.z,
00022         entity.qw,entity.qx,entity.qy,entity.qz,
00023         entity.sx,entity.sy,entity.sz)
00024 */
00025 
00026 // cannot be destroyed, 
00027 class cBufferedMesh_L : public cLuaBind<cBufferedMesh> { public:
00028     // implementation of cLuaBind
00029 
00031         virtual void RegisterMethods    (lua_State *L) { PROFILE
00032             lua_register(L,"GetMeshBuffer",             &cBufferedMesh_L::GetMeshBuffer);
00033             lua_register(L,"LoadMeshBufferFromFile",    &cBufferedMesh_L::LoadMeshBufferFromFile);
00034             
00035             #define REGISTER_METHOD(methodname) mlMethod.push_back(make_luaL_reg(#methodname,&cBufferedMesh_L::methodname));
00036             REGISTER_METHOD(RayPick);
00037             REGISTER_METHOD(GetSubMeshCount);
00038             REGISTER_METHOD(GetSubMeshMatName);
00039             REGISTER_METHOD(SetSubMeshMatName);
00040             REGISTER_METHOD(TransformSubMeshTexCoords);
00041             #undef REGISTER_METHOD
00042         }
00043 
00044     // static methods exported to lua
00045         
00047         static int          GetMeshBuffer       (lua_State *L) { PROFILE
00048             return CreateUData(L,GetBufferedMesh(luaL_checkstring(L,1)));
00049         }
00050         
00052         static int          LoadMeshBufferFromFile      (lua_State *L) { PROFILE
00053             cBufferedMesh* pBufferedMesh = new cBufferedMesh();
00054             std::string sFilePath = luaL_checkstring(L,1);
00055             MeshLoader_LoadFile(sFilePath.c_str(),pBufferedMesh);
00056             return CreateUData(L,pBufferedMesh);
00057         }
00058         
00059     // object methods exported to lua
00060         
00062         static int  RayPick         (lua_State *L) { PROFILE 
00063             cBufferedMesh* pMyMeshBuffer = checkudata_alive(L);
00064             
00065             // don't use ++i or something here, the compiler might mix the order
00066             Ogre::Vector3       vRayPos(    luaL_checknumber(L,2),luaL_checknumber(L,3),luaL_checknumber(L,4));
00067             Ogre::Vector3       vRayDir(    luaL_checknumber(L,5),luaL_checknumber(L,6),luaL_checknumber(L,7));
00068             Ogre::Vector3       vPos(       luaL_checknumber(L,8),luaL_checknumber(L,9),luaL_checknumber(L,10));
00069             float   qw      = (lua_gettop(L) >= 11 && !lua_isnil(L,11)) ? luaL_checknumber(L,11) : 1.0;
00070             float   qx      = (lua_gettop(L) >= 12 && !lua_isnil(L,12)) ? luaL_checknumber(L,12) : 0.0;
00071             float   qy      = (lua_gettop(L) >= 13 && !lua_isnil(L,13)) ? luaL_checknumber(L,13) : 0.0;
00072             float   qz      = (lua_gettop(L) >= 14 && !lua_isnil(L,14)) ? luaL_checknumber(L,14) : 0.0;
00073             float   scalex  = (lua_gettop(L) >= 15 && !lua_isnil(L,15)) ? luaL_checknumber(L,15) : 1.0;
00074             float   scaley  = (lua_gettop(L) >= 16 && !lua_isnil(L,16)) ? luaL_checknumber(L,16) : 1.0;
00075             float   scalez  = (lua_gettop(L) >= 17 && !lua_isnil(L,17)) ? luaL_checknumber(L,17) : 1.0;
00076             
00077             Ogre::Quaternion    qRot(qw,qx,qy,qz);
00078             Ogre::Vector3       vScale(scalex,scaley,scalez);
00079             float fHitDist = 0;
00080             int iFaceNum = pMyMeshBuffer->RayPick(vRayPos,vRayDir,vPos,qRot,vScale,&fHitDist);
00081             bool bHit = iFaceNum != -1;
00082             lua_pushboolean(L,bHit);
00083             lua_pushnumber(L,fHitDist);
00084             lua_pushnumber(L,iFaceNum);
00085             return 3;
00086         }
00087         
00089         static int          GetSubMeshCount     (lua_State *L) { PROFILE 
00090             lua_pushnumber(L,checkudata_alive(L)->GetSubMeshCount());
00091             return 1;
00092         }
00093         
00095         static int              GetSubMeshMatName   (lua_State *L) { PROFILE 
00096             cBufferedMesh* pMyMeshBuffer = checkudata_alive(L);
00097             int iSubMeshIndex = luaL_checkint(L,2);
00098             if (iSubMeshIndex < 0 || iSubMeshIndex >= pMyMeshBuffer->GetSubMeshCount()) return 0;
00099             lua_pushstring(L,pMyMeshBuffer->GetSubMesh(iSubMeshIndex).GetMatName().c_str());
00100             return 1;
00101         }
00102         
00105         static int              SetSubMeshMatName   (lua_State *L) { PROFILE 
00106             cBufferedMesh* pMyMeshBuffer = checkudata_alive(L);
00107             int iSubMeshIndex = luaL_checkint(L,2);
00108             if (iSubMeshIndex < 0 || iSubMeshIndex >= pMyMeshBuffer->GetSubMeshCount()) return 0;
00109             pMyMeshBuffer->GetSubMesh(iSubMeshIndex).SetMatName(luaL_checkstring(L,3));
00110             return 0;
00111         }
00112         
00115         static int          TransformSubMeshTexCoords   (lua_State *L) { PROFILE 
00116             cBufferedMesh* pMyMeshBuffer = checkudata_alive(L);
00117             int iSubMeshIndex = luaL_checkint(L,2);
00118             if (iSubMeshIndex < 0 || iSubMeshIndex >= pMyMeshBuffer->GetSubMeshCount()) return 0;
00119             pMyMeshBuffer->GetSubMesh(iSubMeshIndex).TransformTexCoords(luaL_checknumber(L,3),
00120                                                                         luaL_checknumber(L,4),
00121                                                                         luaL_checknumber(L,5),
00122                                                                         luaL_checknumber(L,6));
00123             return 0;
00124         }
00125         
00126         virtual const char* GetLuaTypeName () { return "lugre.meshbuffer"; }
00127 };
00128 
00130 void    cBufferedMesh::LuaRegister  (lua_State *L) { PROFILE
00131     cLuaBind<cBufferedMesh>::GetSingletonPtr(new cBufferedMesh_L())->LuaRegister(L);
00132 }

Generated on Wed May 23 06:00:14 2012 for cpp by  doxygen 1.5.6