lugre_rendertexture_L.cpp

Go to the documentation of this file.
00001 #include "lugre_prefix.h"
00002 #include "lugre_luabind.h"
00003 #include "lugre_ogrewrapper.h"
00004 #include "lugre_rendertexture.h"
00005 #include "lugre_camera.h"
00006 #include <Ogre.h>
00007 
00008 extern "C" {
00009     #include "lua.h"
00010     #include "lauxlib.h"
00011     #include "lualib.h"
00012 }
00013 
00014 
00015 using namespace Ogre;
00016 
00017 
00018 namespace Lugre {
00019 
00020 /*
00021 tex_rtt1->getName() = "tex_rtt"
00022 tex_rtt1->getBuffer()->getRenderTarget()->getName() = "tex_rtt/0/0/0" 
00023 the 0/0/0 refers to volume slices, cube faces and mip levels, which you can potentially render to. 
00024 Texture objects are not necessarily just one rendering surface.
00025 
00026 rtt with transparency . http://www.ogre3d.org/phpBB2/viewtopic.php?t=20972&view=next
00027 
00028 */
00029     
00030 cRenderTexture::cRenderTexture  (Ogre::RenderTarget* pRenderTarget) : mbListener(false), mpRenderTarget(pRenderTarget) {}
00031     
00032 cRenderTexture::~cRenderTexture() {
00033     // TODO !
00034     if (mpRenderTarget) mpRenderTarget = 0;
00035     DisableListener();
00036 }
00037 
00038 
00039 void cRenderTexture::preRenderTargetUpdate(const RenderTargetEvent& evt)
00040 {
00041     //~ // Hide plane and objects below the water
00042     //~ pPlaneEnt->setVisible(false);
00043     //~ std::vector<Entity*>::iterator i, iend;
00044     //~ iend = belowWaterEnts.end();
00045     //~ for (i = belowWaterEnts.begin(); i != iend; ++i)
00046     //~ {
00047         //~ (*i)->setVisible(false);
00048     //~ }
00049 
00050     mPre.SimpleCall();
00051 }
00052 
00053 
00054 void cRenderTexture::postRenderTargetUpdate (const RenderTargetEvent& evt)
00055 {
00056     //~ // Show plane and objects below the water
00057     //~ pPlaneEnt->setVisible(true);
00058     //~ std::vector<Entity*>::iterator i, iend;
00059     //~ iend = belowWaterEnts.end();
00060     //~ for (i = belowWaterEnts.begin(); i != iend; ++i)
00061     //~ {
00062         //~ (*i)->setVisible(true);
00063     //~ }
00064     
00065     mPost.SimpleCall();
00066 }
00067 
00068 void cRenderTexture::DisableListener    (){ PROFILE
00069     if(mbListener){
00070         mbListener = false;
00071         mpRenderTarget->removeListener(this);
00072     }
00073 }
00074 
00075 void cRenderTexture::EnableListener (){ PROFILE
00076     if(!mbListener){
00077         mbListener = true;
00078         mpRenderTarget->addListener(this);
00079     }
00080 }
00081 
00082 class cRenderTexture_L : public cLuaBind<cRenderTexture> { public:
00084         virtual void RegisterMethods    (lua_State *L) { PROFILE
00085             #define REGISTER_METHOD(methodname) mlMethod.push_back(make_luaL_reg(#methodname,&cRenderTexture_L::methodname));
00086             REGISTER_METHOD(Destroy);
00087             REGISTER_METHOD(SetAutoUpdated);
00088             REGISTER_METHOD(Update);
00089             REGISTER_METHOD(WriteContentsToFile);
00090             
00091             REGISTER_METHOD(SetPrePostFunctions);
00092             REGISTER_METHOD(DisablePrePostFunctions);
00093             REGISTER_METHOD(EnablePrePostFunctions);
00094                         
00095             lua_register(L,"CreateRenderTexture",   &cRenderTexture_L::CreateRenderTexture);
00096         }
00097 
00098     // object methods exported to lua
00099             
00101         static int      Destroy             (lua_State *L) { PROFILE delete checkudata_alive(L); return 0; }
00102         
00103         /*
00104         // WARNING ! THE RETURNED NAME IS BROKEN !  (n0007 becomes n0007/0/0/0)
00106         static int      GetName             (lua_State *L) { PROFILE 
00107             Ogre::RenderTarget* pRenderTarget = checkudata_alive(L)->mpRenderTarget;
00108             if (!pRenderTarget) return 0;
00109             std::string myname = pRenderTarget->getName();
00110             printf("cRenderTexture_L::GetName : myname = %s\n",myname.c_str());
00111             lua_pushstring(L,myname.c_str()); 
00112             return 1; 
00113         }
00114         */
00116         static int      SetAutoUpdated          (lua_State *L) { PROFILE 
00117             cRenderTexture* target = checkudata_alive(L);
00118             if (target->mpRenderTarget) target->mpRenderTarget->setAutoUpdated(lua_toboolean(L,1));
00119             return 0; 
00120         }
00121 
00122 
00127         static int      SetPrePostFunctions         (lua_State *L) { PROFILE 
00128             cRenderTexture* target = checkudata_alive(L);
00129             target->mPre.assign(L, 2);
00130             target->mPost.assign(L, 3);
00131             target->EnableListener();
00132             return 0; 
00133         }
00134         
00136         static int      DisablePrePostFunctions         (lua_State *L) { PROFILE 
00137             checkudata_alive(L)->DisableListener();
00138             return 0; 
00139         }
00140         
00142         static int      EnablePrePostFunctions          (lua_State *L) { PROFILE 
00143             checkudata_alive(L)->EnableListener();
00144             return 0; 
00145         }
00146         
00148         static int      Update          (lua_State *L) { PROFILE 
00149             cRenderTexture* target = checkudata_alive(L);
00150             if (target->mpRenderTarget) target->mpRenderTarget->update();
00151             return 0; 
00152         }
00153         
00155         static int      WriteContentsToFile         (lua_State *L) { PROFILE 
00156             cRenderTexture* target = checkudata_alive(L);
00157             if (target->mpRenderTarget) {
00158                 std::string sFileName = luaL_checkstring(L,2);
00159                 //printf("warning : cRenderTexture_L::WriteContentsToFile does not work on some systems, use SaveTextureToFile instead\n");
00160                 target->mpRenderTarget->writeContentsToFile(sFileName);
00161             }
00162             return 0; 
00163         }
00164         
00165     // static methods exported to lua
00166         
00169         static int      CreateRenderTexture (lua_State *L) { PROFILE
00170             std::string sRTTName        = (lua_gettop(L) >= 1 && !lua_isnil(L,1)) ? luaL_checkstring(L,1) : cOgreWrapper::GetSingleton().GetUniqueName();
00171             int iCX = luaL_checkint(L,2);
00172             int iCY = luaL_checkint(L,3); 
00173             Ogre::PixelFormat pixelformat = (lua_gettop(L) >= 4 && !lua_isnil(L,4)) ? ((Ogre::PixelFormat)luaL_checkint(L,4)) : Ogre::PF_BYTE_RGBA; 
00174             //printf("CreateRenderTexture format=%d\n",(int)pixelformat);
00175             Ogre::RenderTarget* pRenderTarget = 0;
00176             try {
00177                 Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual(sRTTName,
00178                     Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D,
00179                     iCX, iCY, 0, pixelformat, Ogre::TU_RENDERTARGET ); 
00180                 pRenderTarget = texture->getBuffer()->getRenderTarget();
00181                 // deprecated : ...RenderSystem()->createRenderTexture(sRTTName.c_str(), iCX, iCY );
00182             } catch (...) {
00183                 // todo : reinit everything ?!?
00184                 //mRoot->getRenderSystem()->setConfigOption("RTT Preferred Mode","Copy");
00185                 //mRoot->getRenderSystem()->reinitialise();
00186             }
00187             cRenderTexture* target = pRenderTarget ? new cRenderTexture(pRenderTarget) : 0;
00188             return CreateUData(L,target);
00189         }
00190         
00191         virtual const char* GetLuaTypeName () { return "lugre.RenderTexture"; }
00192 };
00193 
00195 void    cRenderTexture::LuaRegister     (lua_State *L) { PROFILE
00196     cLuaBind<cRenderTexture>::GetSingletonPtr(new cRenderTexture_L())->LuaRegister(L);
00197 }
00198 
00199 };

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