From 258d387d15edf559cba10dbf537f5ff25173bd7d Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Wed, 21 Nov 2012 13:07:57 +0100 Subject: [PATCH] Allow setting emission for each canvas placement --- src/Canvas/gui_mgr.cxx | 8 +++-- src/Canvas/gui_mgr.hxx | 3 +- src/Cockpit/od_gauge.cxx | 68 ++++++++++++++++++++++++++++++++++------ src/Cockpit/od_gauge.hxx | 2 +- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/Canvas/gui_mgr.cxx b/src/Canvas/gui_mgr.cxx index 229f00edd..f72cf49d6 100644 --- a/src/Canvas/gui_mgr.cxx +++ b/src/Canvas/gui_mgr.cxx @@ -63,8 +63,10 @@ class WindowPlacement: public simgear::canvas::Placement { public: - WindowPlacement( canvas::WindowPtr window, + WindowPlacement( SGPropertyNode* node, + canvas::WindowPtr window, simgear::canvas::CanvasPtr canvas ): + Placement(node), _window(window), _canvas(canvas) {} @@ -229,7 +231,7 @@ canvas::WindowPtr GUIMgr::getWindow(size_t i) //------------------------------------------------------------------------------ simgear::canvas::Placements -GUIMgr::addPlacement( const SGPropertyNode* node, +GUIMgr::addPlacement( SGPropertyNode* node, simgear::canvas::CanvasPtr canvas ) { int placement_index = node->getIntValue("index", -1); @@ -246,7 +248,7 @@ GUIMgr::addPlacement( const SGPropertyNode* node, window->setCanvas(canvas); placements.push_back( - simgear::canvas::PlacementPtr(new WindowPlacement(window, canvas)) + simgear::canvas::PlacementPtr(new WindowPlacement(node, window, canvas)) ); } return placements; diff --git a/src/Canvas/gui_mgr.hxx b/src/Canvas/gui_mgr.hxx index b9af0b6f8..f1eeccca4 100644 --- a/src/Canvas/gui_mgr.hxx +++ b/src/Canvas/gui_mgr.hxx @@ -61,8 +61,7 @@ class GUIMgr: canvas::WindowPtr getWindow(size_t i); simgear::canvas::Placements - addPlacement( const SGPropertyNode*, - simgear::canvas::CanvasPtr canvas ); + addPlacement(SGPropertyNode*, simgear::canvas::CanvasPtr canvas ); bool handleMouse(const osgGA::GUIEventAdapter& ea); void handleResize(int x, int y, int width, int height); diff --git a/src/Cockpit/od_gauge.cxx b/src/Cockpit/od_gauge.cxx index cab270849..4f569acb1 100644 --- a/src/Cockpit/od_gauge.cxx +++ b/src/Cockpit/od_gauge.cxx @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -78,6 +79,9 @@ class ReplaceStaticTextureVisitor: { public: + typedef osg::ref_ptr GroupPtr; + typedef osg::ref_ptr MaterialPtr; + ReplaceStaticTextureVisitor( const char* name, osg::Texture2D* new_texture ): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), @@ -85,7 +89,7 @@ class ReplaceStaticTextureVisitor: _new_texture(new_texture) {} - ReplaceStaticTextureVisitor( const SGPropertyNode* placement, + ReplaceStaticTextureVisitor( SGPropertyNode* placement, osg::Texture2D* new_texture, osg::NodeCallback* cull_callback = 0 ): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), @@ -94,6 +98,7 @@ class ReplaceStaticTextureVisitor: ), _node_name( placement->getStringValue("node") ), _parent_name( placement->getStringValue("parent") ), + _node(placement), _new_texture(new_texture), _cull_callback(cull_callback) { @@ -179,7 +184,7 @@ class ReplaceStaticTextureVisitor: // insert a new group between the geode an it's parent which overrides // the texture - osg::ref_ptr group = new osg::Group; + GroupPtr group = new osg::Group; group->setName("canvas texture group"); group->addChild(eg); parent->removeChild(eg); @@ -188,16 +193,16 @@ class ReplaceStaticTextureVisitor: if( _cull_callback ) group->setCullCallback(_cull_callback); - _placements.push_back( - simgear::canvas::PlacementPtr(new ObjectPlacement(group)) - ); - osg::StateSet* stateSet = group->getOrCreateStateSet(); stateSet->setTextureAttribute( unit, _new_texture, osg::StateAttribute::OVERRIDE ); stateSet->setTextureMode( unit, GL_TEXTURE_2D, osg::StateAttribute::ON ); + _placements.push_back( simgear::canvas::PlacementPtr( + new ObjectPlacement(_node, group) + )); + SG_LOG ( SG_GL, @@ -217,9 +222,49 @@ class ReplaceStaticTextureVisitor: public simgear::canvas::Placement { public: - ObjectPlacement(osg::ref_ptr group): + + ObjectPlacement( SGPropertyNode* node, + GroupPtr group ): + Placement(node), _group(group) - {} + { + // TODO make more generic and extendable for more properties + if( node->hasValue("emission") ) + setEmission( node->getFloatValue("emission") ); + } + + virtual bool childChanged(SGPropertyNode* node) + { + if( node->getParent() != _node ) + return false; + + if( node->getNameString() == "emission" ) + setEmission( node->getFloatValue() ); + else + return false; + + return true; + } + + void setEmission(float emit) + { + emit = SGMiscf::clip(emit, 0, 1); + + if( !_material ) + { + _material = new osg::Material; + _material->setColorMode(osg::Material::OFF); + _material->setDataVariance(osg::Object::DYNAMIC); + _group->getOrCreateStateSet() + ->setAttribute(_material, ( osg::StateAttribute::ON + | osg::StateAttribute::OVERRIDE ) ); + } + + _material->setEmission( + osg::Material::FRONT_AND_BACK, + osg::Vec4(emit, emit, emit, emit) + ); + } /** * Remove placement from the scene @@ -240,13 +285,16 @@ class ReplaceStaticTextureVisitor: } private: - osg::ref_ptr _group; + GroupPtr _group; + MaterialPtr _material; }; std::string _tex_name, ///