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
00034 if (mpCam) mpCam->getSceneManager()->destroyCamera(mpCam); mpCam = 0;
00035 }
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
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
00104
00105
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
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
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 };