Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/GlowMaterialListener.h @ 11089

Last change on this file since 11089 was 11089, checked in by landauf, 8 years ago

glow effect is now visible through transparent elements (e.g. billboards, particle effects, etc.)

  • Property svn:eol-style set to native
File size: 2.4 KB
Line 
1#ifndef _GlowMaterialListener_H__
2#define _GlowMaterialListener_H__
3
4#include <Ogre.h>
5#include <OgreMaterialManager.h>
6
7namespace orxonox
8{
9    class GlowMaterialListener : public Ogre::MaterialManager::Listener
10    {
11        public:
12            GlowMaterialListener()
13            {
14                mBlackMat = Ogre::MaterialManager::getSingleton().create("mGlowBlack", "Internal");
15                mBlackMat->getTechnique(0)->getPass(0)->setDiffuse(0,0,0,0);
16                mBlackMat->getTechnique(0)->getPass(0)->setSpecular(0,0,0,0);
17                mBlackMat->getTechnique(0)->getPass(0)->setAmbient(0,0,0);
18                mBlackMat->getTechnique(0)->getPass(0)->setSelfIllumination(0,0,0);
19
20                mTransparentMat = Ogre::MaterialManager::getSingleton().create("mGlowTransparent", "Internal");
21                mTransparentMat->getTechnique(0)->getPass(0)->setDiffuse(0,0,0,0);
22                mTransparentMat->getTechnique(0)->getPass(0)->setSpecular(0,0,0,0);
23                mTransparentMat->getTechnique(0)->getPass(0)->setAmbient(0,0,0);
24                mTransparentMat->getTechnique(0)->getPass(0)->setSelfIllumination(0,0,0);
25                mTransparentMat->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_ADD);
26                mTransparentMat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);
27            }
28
29            Ogre::Technique* handleSchemeNotFound(unsigned short, const Ogre::String& schemeName, Ogre::Material* mat, unsigned short, const Ogre::Renderable*)
30            {
31                if (schemeName == "glow")
32                {
33                    // try to figure out if the original material is transparent. if yes, use a black transparent material, otherwise a black opaque one.
34                    if (mat != nullptr && mat->getTechnique(0) != nullptr && mat->getTechnique(0)->getPass(0) != nullptr)
35                    {
36                        Ogre::Pass* pass = mat->getTechnique(0)->getPass(0);
37                        if (pass->getDepthWriteEnabled())
38                            return mBlackMat->getTechnique(0);
39                        else
40                            return mTransparentMat->getTechnique(0);
41                    }
42                    else
43                        return mBlackMat->getTechnique(0);
44                }
45                return NULL;
46            }
47
48        private:
49            Ogre::MaterialPtr mBlackMat;
50            Ogre::MaterialPtr mTransparentMat;
51    };
52}
53
54#endif /* _GlowMaterialListener_H__ */
Note: See TracBrowser for help on using the repository browser.