00001
00007 #include "SO3Compositor.h"
00008 #include "../SO3Renderer/SO3ViewPort.h"
00009
00010 namespace SO3
00011 {
00012
00013 SCompositor::SCompositor(SViewPort* scolViewPort, std::string compositorName, std::string schemeName) : SData(compositorName)
00014 {
00015 parent = scolViewPort;
00016 scheme = schemeName;
00017
00018 mBlackMat = Ogre::MaterialManager::getSingleton().create("Ogre/mSchemeBlack/" + scheme, "SO3/Internal");
00019 mBlackMat->getTechnique(0)->getPass(0)->setDiffuse(0,0,0,0);
00020 mBlackMat->getTechnique(0)->getPass(0)->setSpecular(0,0,0,0);
00021 mBlackMat->getTechnique(0)->getPass(0)->setAmbient(0,0,0);
00022 mBlackMat->getTechnique(0)->getPass(0)->setSelfIllumination(0,0,0);
00023
00024 _AttachToParent();
00025 }
00026
00027 SCompositor::SCompositor() : SData("")
00028 {
00029
00030 }
00031
00032 SCompositor::~SCompositor()
00033 {
00034 _DetachFromParent();
00035
00036 Ogre::MaterialManager::getSingleton().remove(mBlackMat->getHandle());
00037 mBlackMat.setNull();
00038 }
00039
00040 void SCompositor::_AttachToParent()
00041 {
00042 if(!Ogre::CompositorManager::getSingleton().getByName(name)->isLoaded())
00043 Ogre::CompositorManager::getSingleton().getByName(name)->load();
00044
00045
00046 Ogre::CompositorManager::getSingleton().addCompositor(const_cast <Ogre::Viewport*> (parent->GetOgreViewPortPointer()), name);
00047 SetEnable(true);
00048 }
00049
00050 void SCompositor::_DetachFromParent()
00051 {
00052 SetEnable(false);
00053
00054
00055 #if OGRE_VERSION < ((1 << 16) | (7 << 8) | 0)
00056
00057 Ogre::CompositorManager::getSingleton().removeCompositor(const_cast <Ogre::Viewport*> (parent->GetOgreViewPortPointer()), name);
00058 #else
00059
00060 Ogre::Viewport* ogreViewport = const_cast <Ogre::Viewport*> (parent->GetOgreViewPortPointer());
00061 Ogre::CompositorChain* chain = Ogre::CompositorManager::getSingleton().getCompositorChain(ogreViewport);
00062 chain->_removeInstance(chain->getCompositor(name));
00063
00064
00065 if(chain->getNumCompositors() == 0)
00066 Ogre::CompositorManager::getSingleton().removeCompositorChain(ogreViewport);
00067 #endif
00068 }
00069
00070 SViewPort* SCompositor::GetParentViewPort()
00071 {
00072 return parent;
00073 }
00074
00075 bool SCompositor::GetEnable()
00076 {
00077 return isEnable;
00078 }
00079
00080 void SCompositor::SetEnable(bool enable)
00081 {
00082 if (enable != isEnable)
00083 {
00084 if (enable)
00085 {
00086 if (scheme != "")
00087 Ogre::MaterialManager::getSingleton().addListener(this);
00088 }
00089 else
00090 {
00091 Ogre::MaterialManager::getSingleton().removeListener(this);
00092 }
00093
00094 Ogre::CompositorManager::getSingleton().setCompositorEnabled(const_cast <Ogre::Viewport*> (parent->GetOgreViewPortPointer()), name, enable);
00095 isEnable = enable;
00096 }
00097 }
00098
00099 Ogre::Technique* SCompositor::handleSchemeNotFound(unsigned short schemeIndex, const Ogre::String& schemeName, Ogre::Material* originalMaterial, unsigned short lodIndex, const Ogre::Renderable* rend)
00100 {
00101 if (schemeName == scheme)
00102 {
00103 return mBlackMat->getTechnique(0);
00104 }
00105 return NULL;
00106 }
00107
00108 }