lugre_camera_L.cpp

Go to the documentation of this file.
00001 #include "lugre_prefix.h"
00002 #include "lugre_luabind.h"
00003 #include "lugre_luabind_direct.h"
00004 #include "lugre_luabind_ogrehelper.h"
00005 #include "lugre_camera.h"
00006 #include "lugre_ogrewrapper.h"
00007 #include "lugre_scripting.h"
00008 #include <Ogre.h>
00009 
00010 extern "C" {
00011     #include "lua.h"
00012     #include "lauxlib.h"
00013     #include "lualib.h"
00014 }
00015 
00016 using namespace Ogre;
00017 
00018 class lua_State;
00019     
00020 namespace Lugre {
00021 
00022     
00024 
00025 cCamera::cCamera    (Ogre::Camera* pCam) : mpCam(pCam) {}
00026 
00027 cCamera::cCamera    (Ogre::SceneManager* pSceneMgr,const char* szCamName) {
00028     assert(pSceneMgr); 
00029     mpCam = pSceneMgr->createCamera(szCamName);
00030 }
00031 
00032 cCamera::~cCamera() {
00033     // detach before delete ?
00034     if (mpCam) mpCam->getSceneManager()->destroyCamera(mpCam); mpCam = 0;
00035 }
00036 
00037 
00038 /*
00039     mCamera->setAspectRatio(Real(mViewport->getActualWidth()) / Real(mViewport->getActualHeight()));
00040     mCamera->setPosition(Vector3(0,0,40));
00041     // Look back along -Z
00042     //mCamera->lookAt(Vector3(0,0,0));
00043     mCamera->setNearClipDistance(1);
00044     //mCamera->setPolygonMode(PM_WIREFRAME);
00045     Ogre::Quaternion qCamRot = cOgreWrapper::GetSingleton().mCamera->getOrientation();
00046         
00047     // ortho mode with screen coords = screensize in pixels
00048     pCam->setFOVy( Ogre::Degree(90) );
00049     pCam->setNearClipDistance( 0.5 * cOgreWrapper::GetSingleton().mViewport->getActualHeight() );
00050     pCam->setProjectionType( Ogre::PT_ORTHOGRAPHIC );
00051 */
00052 
00053 class cCamera_L : public cLuaBind<cCamera> { public:
00055         virtual void RegisterMethods    (lua_State *L) { PROFILE
00056             LUABIND_QUICKWRAP(  GetQuickHandle,         { return cLuaBindDirectOgreHelper::PushCamera(L,checkudata_alive(L)->mpCam); });
00057             
00058             #define REGISTER_METHOD(methodname) mlMethod.push_back(make_luaL_reg(#methodname,&cCamera_L::methodname));
00059             REGISTER_METHOD(Destroy);
00060             REGISTER_METHOD(SetFOVy);
00061             REGISTER_METHOD(SetNearClipDistance);
00062             REGISTER_METHOD(SetFarClipDistance);
00063 
00064             REGISTER_METHOD(SetAspectRatio);
00065             REGISTER_METHOD(Move);
00066             REGISTER_METHOD(SetPos);
00067             REGISTER_METHOD(GetPos); 
00068             REGISTER_METHOD(SetRot);
00069             REGISTER_METHOD(GetRot); 
00070             REGISTER_METHOD(LookAt); 
00071             REGISTER_METHOD(GetNearClipDistance); 
00072             REGISTER_METHOD(GetFarClipDistance); 
00073             REGISTER_METHOD(GetEulerAng); 
00074             
00075             REGISTER_METHOD(EnableReflection);
00076             REGISTER_METHOD(DisableReflection);
00077             REGISTER_METHOD(IsReflecting);
00078 
00079             REGISTER_METHOD(GetPolygonMode); 
00080             REGISTER_METHOD(SetPolygonMode); 
00081             
00082             REGISTER_METHOD(GetProjectionType); 
00083             REGISTER_METHOD(SetProjectionType); 
00084             
00085             REGISTER_METHOD(SetOrthoWindow);
00086             REGISTER_METHOD(GetOrthoWindow);
00087             
00088             lua_register(L,"CreateCamera",  &cCamera_L::CreateCamera);
00089             lua_register(L,"GetMainCam",    &cCamera_L::GetMainCam);
00090 
00091             #define RegisterClassConstant(name,constant) cScripting::SetGlobal(L,#name,constant)
00092             
00093             RegisterClassConstant(kCamera_PM_POINTS,Ogre::PM_POINTS);
00094             RegisterClassConstant(kCamera_PM_WIREFRAME ,Ogre::PM_WIREFRAME);
00095             RegisterClassConstant(kCamera_PM_SOLID ,Ogre::PM_SOLID);
00096             
00097             RegisterClassConstant(kCamera_PT_ORTHOGRAPHIC ,Ogre::PT_ORTHOGRAPHIC);
00098             RegisterClassConstant(kCamera_PT_PERSPECTIVE ,Ogre::PT_PERSPECTIVE);
00099 
00100             #undef RegisterClassConstant
00101         }
00102 
00103     // object methods exported to lua
00104 
00105         // todo : rotation, position, aspect ratio, near/farclip...
00106             
00108         static int      Destroy             (lua_State *L) { PROFILE delete checkudata_alive(L); return 0; }
00109         
00111         static int      SetFOVy             (lua_State *L) { PROFILE 
00112             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) pCam->setFOVy(Ogre::Radian(luaL_checknumber(L,2))); 
00113             return 0; 
00114         }
00116         static int      SetNearClipDistance     (lua_State *L) { PROFILE 
00117             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) pCam->setNearClipDistance(luaL_checknumber(L,2)); 
00118             return 0; 
00119         }
00121         static int      SetFarClipDistance      (lua_State *L) { PROFILE 
00122             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) pCam->setFarClipDistance(luaL_checknumber(L,2)); 
00123             return 0; 
00124         }
00125 
00127         static int      SetAspectRatio  (lua_State *L) { PROFILE
00128             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) 
00129                 pCam->setAspectRatio(luaL_checknumber(L,2));
00130             return 0;
00131         }
00132 
00133         static int      Move    (lua_State *L) { PROFILE
00134             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) 
00135                 pCam->move(Ogre::Vector3(luaL_checknumber(L,2),luaL_checknumber(L,3),luaL_checknumber(L,4)));
00136             return 0;
00137         }
00138 
00139         static int      SetPos  (lua_State *L) { PROFILE
00140             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) 
00141                 pCam->setPosition(luaL_checknumber(L,2),luaL_checknumber(L,3),luaL_checknumber(L,4));
00142             return 0;
00143         }
00144 
00145         static int      SetRot (lua_State *L) { PROFILE
00146             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) 
00147                 pCam->setOrientation(Ogre::Quaternion(luaL_checknumber(L,2),luaL_checknumber(L,3),luaL_checknumber(L,4),luaL_checknumber(L,5)));
00148             return 0;
00149         }
00150         
00152         static int              GetPos  (lua_State *L) { PROFILE
00153             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00154             if (!pCam) return 0;
00155             Ogre::Vector3   vCamPos = pCam->getPosition();
00156             lua_pushnumber(L,vCamPos.x);
00157             lua_pushnumber(L,vCamPos.y);
00158             lua_pushnumber(L,vCamPos.z);
00159             return 3;
00160         }
00161         
00163         static int              GetRot  (lua_State *L) { PROFILE
00164             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00165             if (!pCam) return 0;
00166             Ogre::Quaternion    qCamRot = pCam->getOrientation();
00167             lua_pushnumber(L,qCamRot.w);
00168             lua_pushnumber(L,qCamRot.x);
00169             lua_pushnumber(L,qCamRot.y);
00170             lua_pushnumber(L,qCamRot.z);
00171             return 4;
00172         }
00173         
00174 
00175         static int      LookAt (lua_State *L) { PROFILE
00176             if (Ogre::Camera* pCam = checkudata_alive(L)->mpCam) 
00177                 pCam->lookAt(luaL_checknumber(L,2),luaL_checknumber(L,3),luaL_checknumber(L,4));
00178             return 0;
00179         }
00180         
00181         static int      GetNearClipDistance (lua_State *L) { PROFILE
00182             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00183             if (!pCam) return 0;
00184             lua_pushnumber(L,pCam->getNearClipDistance());
00185             return 1;
00186         }
00187         
00188         static int      GetFarClipDistance (lua_State *L) { PROFILE
00189             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00190             if (!pCam) return 0;
00191             lua_pushnumber(L,pCam->getFarClipDistance());
00192             return 1;
00193         }
00194         
00196         static int      GetPolygonMode (lua_State *L) { PROFILE
00197             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00198             if (!pCam) return 0;
00199             lua_pushnumber(L,pCam->getPolygonMode());
00200             return 1;
00201         }
00203         static int      SetPolygonMode (lua_State *L) { PROFILE
00204             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00205             if (!pCam) return 0;
00206             pCam->setPolygonMode(static_cast<Ogre::PolygonMode>(luaL_checkint(L,2)));
00207             return 0;
00208         }
00209 
00211         static int      GetProjectionType (lua_State *L) { PROFILE
00212             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00213             if (!pCam) return 0;
00214             lua_pushnumber(L,pCam->getProjectionType());
00215             return 1;
00216         }
00218         static int      SetProjectionType (lua_State *L) { PROFILE
00219             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00220             if (!pCam) return 0;
00221             pCam->setProjectionType(static_cast<Ogre::ProjectionType>(luaL_checkint(L,2)));
00222             return 0;
00223         }
00224         
00226         static int      GetOrthoWindow (lua_State *L) { PROFILE
00227             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00228             if (!pCam) return 0;
00229 #if OGRE_VERSION_MINOR >= 6
00230             lua_pushnumber(L,pCam->getOrthoWindowWidth());
00231             lua_pushnumber(L,pCam->getOrthoWindowHeight());
00232 #else
00233             lua_pushnumber(L,0.0f);
00234             lua_pushnumber(L,0.0f);
00235 #endif
00236             return 2;
00237         }
00239         static int      SetOrthoWindow (lua_State *L) { PROFILE
00240             int argc = lua_gettop(L);
00241             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00242             if (!pCam) return 0;
00243 #if OGRE_VERSION_MINOR >= 6
00244             if(argc == 3){
00245                 pCam->setOrthoWindow(luaL_checknumber(L,2), luaL_checknumber(L,3));
00246             } else {
00247                 pCam->setOrthoWindowWidth(luaL_checknumber(L,2));
00248             }
00249             return 0;
00250 #else
00251             return 0;
00252 #endif
00253         }
00254         
00256         static int      GetEulerAng (lua_State *L) { PROFILE
00257             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00258             if (!pCam) return 0;
00259             Ogre::Quaternion qCamRot = pCam->getOrientation();
00260             lua_pushnumber(L,qCamRot.getRoll().valueRadians());
00261             lua_pushnumber(L,qCamRot.getPitch().valueRadians());
00262             lua_pushnumber(L,qCamRot.getYaw().valueRadians());
00263             return 3;
00264         }
00265         
00268         static int      EnableReflection            (lua_State *L) { PROFILE 
00269             cCamera *t = checkudata_alive(L);   
00270         
00271             Ogre::Camera* pCam = t->mpCam;
00272             if (!pCam) return 0;
00273             
00274             Ogre::Vector3 point(
00275                 (Ogre::Real)luaL_checknumber(L, 2),
00276                 (Ogre::Real)luaL_checknumber(L, 3),
00277                 (Ogre::Real)luaL_checknumber(L, 4)
00278             );
00279             Ogre::Vector3 normal(
00280                 (Ogre::Real)luaL_checknumber(L, 5),
00281                 (Ogre::Real)luaL_checknumber(L, 6),
00282                 (Ogre::Real)luaL_checknumber(L, 7)
00283             );
00284             
00285             t->mReflectionPlane.redefine(normal, point);
00286             
00287             pCam->enableReflection(t->mReflectionPlane);
00288             
00289             //pCam->enableCustomNearClipPlane(t->mReflectionPlane);
00290             
00291             return 0;
00292         }
00293                         
00295         static int      DisableReflection           (lua_State *L) { PROFILE 
00296             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00297             if (!pCam) return 0;
00298             
00299             pCam->disableReflection();
00300 
00301             return 0; 
00302         }
00303         
00305         static int      IsReflecting            (lua_State *L) { PROFILE 
00306             Ogre::Camera* pCam = checkudata_alive(L)->mpCam;
00307             if (!pCam) return 0;
00308             
00309             lua_pushboolean(L,pCam->isReflected());
00310             return 1; 
00311         }
00312         
00313         // static methods exported to lua
00314 
00316         static int      CreateCamera    (lua_State *L) { PROFILE
00317             std::string sSceneMgrName   = (lua_gettop(L) >= 1 && !lua_isnil(L,1)) ? luaL_checkstring(L,1) : "main";
00318             std::string sCamName        = (lua_gettop(L) >= 2 && !lua_isnil(L,2)) ? luaL_checkstring(L,2) : cOgreWrapper::GetSingleton().GetUniqueName();
00319             Ogre::SceneManager* pSceneMgr = cOgreWrapper::GetSingleton().GetSceneManager(sSceneMgrName.c_str());
00320             cCamera* target = pSceneMgr ? new cCamera(pSceneMgr,sCamName.c_str()) : 0;
00321             return CreateUData(L,target);
00322         }
00323         
00325         static int      GetMainCam  (lua_State *L) { PROFILE
00326             static cCamera* pMainCam = 0;
00327             if (!pMainCam) pMainCam = new cCamera(cOgreWrapper::GetSingleton().mCamera);
00328             return CreateUData(L,pMainCam);
00329         }
00330         
00331         virtual const char* GetLuaTypeName () { return "lugre.camera"; }
00332 };
00333 
00335 void    cCamera::LuaRegister    (lua_State *L) { PROFILE
00336     cLuaBind<cCamera>::GetSingletonPtr(new cCamera_L())->LuaRegister(L);
00337 }
00338 
00339 };

Generated on Wed Feb 8 06:00:13 2012 for cpp by  doxygen 1.5.6