Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ai2/src/libraries/tools/Shader.h @ 8781

Last change on this file since 8781 was 8079, checked in by landauf, 14 years ago

merged usability branch back to trunk

incomplete summary of the changes in this branch:

  • enhanced keyboard navigation in GUIs
  • implemented new graphics menu and changeable window size at runtime
  • added developer mode
  • HUD shows if game is paused, game pauses if ingame menu is opened
  • removed a few obsolete commands and hid some that are more for internal use
  • numpad works in console and gui
  • faster loading of level info
  • enhanced usage of compositors (Shader class)
  • improved camera handling, configurable FOV and aspect ratio
  • Property svn:eol-style set to native
File size: 5.2 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _Shader_H__
30#define _Shader_H__
31
32#include "tools/ToolsPrereqs.h"
33
34#include <map>
35#include <string>
36#include <vector>
37
38#include <OgreCompositorInstance.h>
39
40#include "util/MultiType.h"
41#include "util/OgreForwardRefs.h"
42#include "core/ViewportEventListener.h"
43
44namespace orxonox
45{
46    /**
47        @brief Shader is a wrapper class around Ogre::CompositorInstance. It provides some
48        functions to easily change the visibility and parameters for shader programs.
49    */
50    class _ToolsExport Shader : public ViewportEventListener, public Ogre::CompositorInstance::Listener
51    {
52        public:
53            Shader(Ogre::SceneManager* scenemanager = 0);
54            virtual ~Shader();
55
56            /// Defines if the shader is visible or not.
57            inline void setVisible(bool bVisible)
58            {
59                if (this->bVisible_ != bVisible)
60                {
61                    this->bVisible_ = bVisible;
62                    this->updateVisibility();
63                }
64            }
65            /// Returns whether or not the shader is visible.
66            inline bool isVisible() const
67                { return this->bVisible_; }
68            void updateVisibility();
69
70            /// Defines the compositor's name (located in a .compositor file).
71            inline void setCompositorName(const std::string& name)
72            {
73                if (this->compositorName_ != name)
74                {
75                    this->compositorName_ = name;
76                    this->changedCompositorName();
77                }
78            }
79            /// Returns the compositor's name.
80            inline const std::string& getCompositorName() const
81                { return this->compositorName_; }
82            void changedCompositorName();
83            void changedCompositorName(Ogre::Viewport* viewport);
84
85            /// Sets the scenemanager (usually provided in the constructor, but can be set later). Shouldn't be changed once it's set.
86            inline void setSceneManager(Ogre::SceneManager* scenemanager)
87                { this->scenemanager_ = scenemanager; }
88            /// Returns the scene manager.
89            inline Ogre::SceneManager* getSceneManager() const
90                { return this->scenemanager_; }
91
92            virtual void cameraChanged(Ogre::Viewport* viewport, Ogre::Camera* oldCamera);
93
94            void setParameter(size_t technique, size_t pass, const std::string& parameter, float value);
95            void setParameter(size_t technique, size_t pass, const std::string& parameter, int value);
96
97            virtual void notifyMaterialRender(Ogre::uint32 pass_id, Ogre::MaterialPtr& materialPtr);
98
99        private:
100            static bool hasCgProgramManager();
101
102            Ogre::SceneManager* scenemanager_;              ///< The scenemanager for which the shader is active
103            Ogre::CompositorInstance* compositorInstance_;  ///< The compositor instance representing the wrapped compositor
104            bool bVisible_;                                 ///< True if the shader should be visible
105            bool bLoadCompositor_;                          ///< True if the compositor should be loaded (usually false if no graphics)
106            std::string compositorName_;                    ///< The name of the current compositor
107            std::string oldcompositorName_;                 ///< The name of the previous compositor (used to unregister)
108
109        private:
110            void addAsListener();
111
112            /// Helper struct to store parameters for shader programs.
113            struct ParameterContainer
114            {
115                size_t technique_;          ///< The ID of the technique
116                size_t pass_;               ///< The ID of the pass
117                std::string parameter_;     ///< The name of the parameter
118
119                int valueInt_;              ///< The desired int value of the parameter
120                float valueFloat_;          ///< The desired float value of the parameter
121
122                MT_Type::Value valueType_;  ///< The type of the parameter (currently only int or float)
123            };
124
125            std::list<ParameterContainer> parameters_;  ///< The list of parameters that should be set on the next update
126            bool registeredAsListener_;                 ///< True if the shader should register itself as listener at the compositor
127    };
128}
129
130#endif /* _Shader_H__ */
Note: See TracBrowser for help on using the repository browser.