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);
00016 };
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 class cBufferedMesh_L : public cLuaBind<cBufferedMesh> { public:
00028
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
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
00060
00062 static int RayPick (lua_State *L) { PROFILE
00063 cBufferedMesh* pMyMeshBuffer = checkudata_alive(L);
00064
00065
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 }