[Orxonox-commit 3281] r7972 - in code/branches/usability/src: libraries/tools orxonox/graphics
landauf at orxonox.net
landauf at orxonox.net
Sat Feb 26 20:50:06 CET 2011
Author: landauf
Date: 2011-02-26 20:50:06 +0100 (Sat, 26 Feb 2011)
New Revision: 7972
Modified:
code/branches/usability/src/libraries/tools/Shader.cc
code/branches/usability/src/libraries/tools/Shader.h
code/branches/usability/src/orxonox/graphics/GlobalShader.cc
code/branches/usability/src/orxonox/graphics/GlobalShader.h
Log:
slight rework of the Shader class:
- correctly loads and initializes active and inactive shaders in different scenes
- uses the fast Ogre::CompositorManager::getSingleton().setCompositorEnabled() instead of the slow compositorInstance_->setEnabled() to change the visibility of a shader
- uses consistently GraphicsManager::getInstance().getViewport() to get the viewport - this is not optimal, scenemanager->getCurrentViewport() would be better, however this returns NULL when displaying a new scene for the first time
Modified: code/branches/usability/src/libraries/tools/Shader.cc
===================================================================
--- code/branches/usability/src/libraries/tools/Shader.cc 2011-02-26 19:13:15 UTC (rev 7971)
+++ code/branches/usability/src/libraries/tools/Shader.cc 2011-02-26 19:50:06 UTC (rev 7972)
@@ -52,50 +52,30 @@
RegisterObject(Shader);
this->scenemanager_ = scenemanager;
- this->compositorInstance_ = 0;
this->bVisible_ = true;
this->bLoadCompositor_ = GameMode::showsGraphics();
- this->bViewportInitialized_ = true;
- if (this->bLoadCompositor_ && Ogre::Root::getSingletonPtr())
- {
- Shader::bLoadedCgPlugin_s = false;
- const Ogre::Root::PluginInstanceList& plugins = Ogre::Root::getSingleton().getInstalledPlugins();
- for (size_t i = 0; i < plugins.size(); ++i)
- {
- if (plugins[i]->getName() == "Cg Program Manager")
- {
- Shader::bLoadedCgPlugin_s = true;
- break;
- }
- }
- }
+ static bool hasCgProgramManager = Shader::hasCgProgramManager();
+ Shader::bLoadedCgPlugin_s = hasCgProgramManager;
this->bLoadCompositor_ &= Shader::bLoadedCgPlugin_s;
}
Shader::~Shader()
{
- if (this->compositorInstance_ && this->bLoadCompositor_)
- {
- Ogre::Viewport* viewport = GraphicsManager::getInstance().getViewport();
- assert(viewport);
- Ogre::CompositorManager::getSingleton().removeCompositor(viewport, this->compositor_);
- }
-
+ if (this->compositorInstance_ && GraphicsManager::getInstance().getViewport())
+ Ogre::CompositorManager::getSingleton().removeCompositor(GraphicsManager::getInstance().getViewport(), this->compositorName_);
}
- void Shader::setSceneManager(Ogre::SceneManager* scenemanager)
- {
- this->scenemanager_ = scenemanager;
-// this->bViewportInitialized_ = false;
- }
-
void Shader::cameraChanged(Ogre::Viewport* viewport, Ogre::Camera* oldCamera)
{
- if (!this->scenemanager_ || (viewport != this->scenemanager_->getCurrentViewport() && this->scenemanager_->getCurrentViewport() != NULL))
+ if (!this->bLoadCompositor_ || !this->scenemanager_)
return;
+ // load the compositor if not already done
+ if (!this->compositorName_.empty() && !this->compositorInstance_)
+ this->changedCompositorName(viewport);
+
// update compositor in viewport (shader should only be active if the current camera is in the same scene as the shader)
// Note:
@@ -107,61 +87,57 @@
// 1.4.8
// 1.7.2
-
if (oldCamera && this->scenemanager_ == oldCamera->getSceneManager())
- Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, false);
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositorName_, false);
if (viewport->getCamera() && this->scenemanager_ == viewport->getCamera()->getSceneManager())
- Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, this->isVisible());
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositorName_, this->isVisible());
}
-/*
- void Shader::tick(float dt)
- {
- SUPER(Shader, tick, dt);
- if (this->bLoadCompositor_ && !this->bViewportInitialized_ && this->scenemanager_ && this->scenemanager_->getCurrentViewport())
- {
- this->bViewportInitialized_ = true;
- this->updateVisibility();
- }
+ void Shader::changedCompositorName()
+ {
+ // For the moment, we get the viewport always from the graphics manager
+ // TODO: Try to support multiple viewports - note however that scenemanager_->getCurrentViewport() returns NULL
+ // after switching to a camera in a different scene (only for the first time this scene is displayed though)
+ this->changedCompositorName(GraphicsManager::getInstance().getViewport());
}
-*/
- void Shader::changedCompositor()
+
+ void Shader::changedCompositorName(Ogre::Viewport* viewport)
{
if (this->bLoadCompositor_)
{
- Ogre::Viewport* viewport = GraphicsManager::getInstance().getViewport();
assert(viewport);
- if (!this->oldcompositor_.empty())
+ if (!this->oldcompositorName_.empty())
{
- Ogre::CompositorManager::getSingleton().removeCompositor(viewport, this->oldcompositor_);
+ Ogre::CompositorManager::getSingleton().removeCompositor(viewport, this->oldcompositorName_);
this->compositorInstance_ = 0;
}
- if (!this->compositor_.empty())
+ if (!this->compositorName_.empty())
{
- this->compositorInstance_ = Ogre::CompositorManager::getSingleton().addCompositor(viewport, this->compositor_);
+ this->compositorInstance_ = Ogre::CompositorManager::getSingleton().addCompositor(viewport, this->compositorName_);
if (!this->compositorInstance_)
- COUT(2) << "Warning: Couldn't load compositor with name \"" << this->compositor_ << "\"." << std::endl;
- //Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, this->bViewportInitialized_ && this->isVisible());
+ COUT(2) << "Warning: Couldn't load compositor with name \"" << this->compositorName_ << "\"." << std::endl;
+ else if (viewport->getCamera())
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositorName_, this->isVisible() && viewport->getCamera() && this->scenemanager_ == viewport->getCamera()->getSceneManager());
}
- this->oldcompositor_ = this->compositor_;
+ this->oldcompositorName_ = this->compositorName_;
}
}
void Shader::updateVisibility()
{
- if (this->compositorInstance_ && this->scenemanager_)
- this->compositorInstance_->setEnabled(this->scenemanager_->getCurrentViewport() && this->isVisible());
+ if (this->compositorInstance_)
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(GraphicsManager::getInstance().getViewport(), this->compositorName_, this->isVisible());
}
void Shader::setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, float value)
{
if (Shader::_setParameter(material, technique, pass, parameter, value))
{
- if (this->bViewportInitialized_ && this->compositorInstance_ && this->isVisible())
+ if (this->compositorInstance_ && this->isVisible())
{
- this->compositorInstance_->setEnabled(false);
- this->compositorInstance_->setEnabled(true);
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(GraphicsManager::getInstance().getViewport(), this->compositorName_, false);
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(GraphicsManager::getInstance().getViewport(), this->compositorName_, true);
}
}
}
@@ -170,15 +146,15 @@
{
if (Shader::_setParameter(material, technique, pass, parameter, value))
{
- if (this->bViewportInitialized_ && this->compositorInstance_ && this->isVisible())
+ if (this->compositorInstance_ && this->isVisible())
{
- this->compositorInstance_->setEnabled(false);
- this->compositorInstance_->setEnabled(true);
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(GraphicsManager::getInstance().getViewport(), this->compositorName_, false);
+ Ogre::CompositorManager::getSingleton().setCompositorEnabled(GraphicsManager::getInstance().getViewport(), this->compositorName_, true);
}
}
}
- bool Shader::_setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, float value)
+ /* static */ bool Shader::_setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, float value)
{
ParameterPointer* pointer = Shader::getParameterPointer(material, technique, pass, parameter);
if (pointer)
@@ -203,7 +179,7 @@
return false;
}
- bool Shader::_setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, int value)
+ /* static */ bool Shader::_setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, int value)
{
ParameterPointer* pointer = Shader::getParameterPointer(material, technique, pass, parameter);
if (pointer)
@@ -228,7 +204,7 @@
return false;
}
- float Shader::getParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
+ /* static */ float Shader::getParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
{
ParameterPointer* pointer = Shader::getParameterPointer(material, technique, pass, parameter);
if (pointer)
@@ -242,7 +218,7 @@
return 0;
}
- bool Shader::getParameterIsFloat(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
+ /* static */ bool Shader::getParameterIsFloat(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
{
ParameterPointer* pointer = Shader::getParameterPointer(material, technique, pass, parameter);
if (pointer)
@@ -251,7 +227,7 @@
return false;
}
- bool Shader::getParameterIsInt(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
+ /* static */ bool Shader::getParameterIsInt(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
{
ParameterPointer* pointer = Shader::getParameterPointer(material, technique, pass, parameter);
if (pointer)
@@ -260,7 +236,7 @@
return false;
}
- Shader::ParameterPointer* Shader::getParameterPointer(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
+ /* static */ Shader::ParameterPointer* Shader::getParameterPointer(const std::string& material, size_t technique, size_t pass, const std::string& parameter)
{
if (!GameMode::showsGraphics() || !Shader::bLoadedCgPlugin_s)
return 0;
@@ -350,4 +326,16 @@
}
return 0;
}
+
+ /* static */ bool Shader::hasCgProgramManager()
+ {
+ if (Ogre::Root::getSingletonPtr())
+ {
+ const Ogre::Root::PluginInstanceList& plugins = Ogre::Root::getSingleton().getInstalledPlugins();
+ for (size_t i = 0; i < plugins.size(); ++i)
+ if (plugins[i]->getName() == "Cg Program Manager")
+ return true;
+ }
+ return false;
+ }
}
Modified: code/branches/usability/src/libraries/tools/Shader.h
===================================================================
--- code/branches/usability/src/libraries/tools/Shader.h 2011-02-26 19:13:15 UTC (rev 7971)
+++ code/branches/usability/src/libraries/tools/Shader.h 2011-02-26 19:50:06 UTC (rev 7972)
@@ -64,19 +64,21 @@
{ return this->bVisible_; }
void updateVisibility();
- inline void setCompositor(const std::string& compositor)
+ inline void setCompositorName(const std::string& name)
{
- if (this->compositor_ != compositor)
+ if (this->compositorName_ != name)
{
- this->compositor_ = compositor;
- this->changedCompositor();
+ this->compositorName_ = name;
+ this->changedCompositorName();
}
}
- inline const std::string& getCompositor() const
- { return this->compositor_; }
- void changedCompositor();
+ inline const std::string& getCompositorName() const
+ { return this->compositorName_; }
+ void changedCompositorName();
+ void changedCompositorName(Ogre::Viewport* viewport);
- void setSceneManager(Ogre::SceneManager* scenemanager);
+ inline void setSceneManager(Ogre::SceneManager* scenemanager)
+ { this->scenemanager_ = scenemanager; }
inline Ogre::SceneManager* getSceneManager() const
{ return this->scenemanager_; }
@@ -93,13 +95,14 @@
static ParameterPointer* getParameterPointer(const std::string& material, size_t technique, size_t pass, const std::string& parameter);
private:
+ static bool hasCgProgramManager();
+
Ogre::SceneManager* scenemanager_;
Ogre::CompositorInstance* compositorInstance_;
bool bVisible_;
bool bLoadCompositor_;
- bool bViewportInitialized_;
- std::string compositor_;
- std::string oldcompositor_;
+ std::string compositorName_;
+ std::string oldcompositorName_;
static MaterialMap parameters_s;
static bool bLoadedCgPlugin_s;
Modified: code/branches/usability/src/orxonox/graphics/GlobalShader.cc
===================================================================
--- code/branches/usability/src/orxonox/graphics/GlobalShader.cc 2011-02-26 19:13:15 UTC (rev 7971)
+++ code/branches/usability/src/orxonox/graphics/GlobalShader.cc 2011-02-26 19:50:06 UTC (rev 7972)
@@ -60,13 +60,13 @@
{
SUPER(GlobalShader, XMLPort, xmlelement, mode);
- XMLPortParamExtern(GlobalShader, Shader, &this->shader_, "compositor", setCompositor, getCompositor, xmlelement, mode);
+ XMLPortParamExtern(GlobalShader, Shader, &this->shader_, "compositor", setCompositorName, getCompositorName, xmlelement, mode);
}
void GlobalShader::registerVariables()
{
registerVariable(this->bVisible_, VariableDirection::ToClient, new NetworkCallback<GlobalShader>(this, &GlobalShader::changedVisibility));
- registerVariable(const_cast<std::string&>(this->shader_.getCompositor()), VariableDirection::ToClient, new NetworkCallback<Shader>(&this->shader_, &Shader::changedCompositor));
+ registerVariable(const_cast<std::string&>(this->shader_.getCompositorName()), VariableDirection::ToClient, new NetworkCallback<Shader>(&this->shader_, &Shader::changedCompositorName));
}
void GlobalShader::changedVisibility()
Modified: code/branches/usability/src/orxonox/graphics/GlobalShader.h
===================================================================
--- code/branches/usability/src/orxonox/graphics/GlobalShader.h 2011-02-26 19:13:15 UTC (rev 7971)
+++ code/branches/usability/src/orxonox/graphics/GlobalShader.h 2011-02-26 19:50:06 UTC (rev 7972)
@@ -52,7 +52,6 @@
private:
void registerVariables();
- void changedCompositor();
Shader shader_;
};
More information about the Orxonox-commit
mailing list