X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fod_gauge.cxx;h=6760bcd2244e17562d3aea218f89c3afda3a32ed;hb=caf0138ab35b03bbe7bf367ff2222d0a31be3157;hp=dabf87c3700a4909b21713ae0bcc456dfe7461a1;hpb=68f248879cb15562c7b026445f83caf8f2842ae9;p=flightgear.git diff --git a/src/Instrumentation/od_gauge.cxx b/src/Instrumentation/od_gauge.cxx index dabf87c37..6760bcd22 100644 --- a/src/Instrumentation/od_gauge.cxx +++ b/src/Instrumentation/od_gauge.cxx @@ -2,7 +2,9 @@ // // Written by Harald JOHNSEN, started May 2005. // -// Copyright (C) 2005 Harald JOHNSEN - hjohnsen@evc.net +// Copyright (C) 2005 Harald JOHNSEN +// +// Ported to OSG by Tim Moore - Jun 2007 // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,199 +18,153 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include -#include SG_GLU_H #include
+#include #include #include "od_gauge.hxx" FGODGauge::FGODGauge() : - rtAvailable( false ), - rt( 0 ) + rtAvailable( false ) { } -// done here and not in init() so we don't allocate a rendering context if it is -// never used -void FGODGauge::allocRT () { - GLint colorBits = 0; - glGetIntegerv( GL_BLUE_BITS, &colorBits ); - textureWH = 256; - rt = new RenderTexture(); - if( colorBits < 8 ) - rt->Reset("rgba=5,5,5,1 ctt"); - else - rt->Reset("rgba ctt"); - - if( rt->Initialize(256, 256, true) ) { - SG_LOG(SG_ALL, SG_INFO, "FGODGauge:Initialize sucessfull"); - if (rt->BeginCapture()) - { - SG_LOG(SG_ALL, SG_INFO, "FGODGauge:BeginCapture sucessfull, RTT available"); - rtAvailable = true; - glViewport(0, 0, textureWH, textureWH); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluOrtho2D( -256.0, 256.0, -256.0, 256.0 ); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glDisable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); - glDisable(GL_CULL_FACE); - glDisable(GL_FOG); - glDisable(GL_DEPTH_TEST); - glClearColor(0.0, 0.0, 0.0, 0.0); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glBindTexture(GL_TEXTURE_2D, 0); - glEnable(GL_TEXTURE_2D); - glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.0f); - glDisable(GL_SMOOTH); - glEnable(GL_BLEND); - glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); - rt->EndCapture(); - } else - SG_LOG(SG_ALL, SG_WARN, "FGODGauge:BeginCapture failed, RTT not available, using backbuffer"); - } else - SG_LOG(SG_ALL, SG_WARN, "FGODGauge:Initialize failed, RTT not available, using backbuffer"); -} - -FGODGauge::~FGODGauge() { - delete rt; -} - -void FGODGauge::init () { -} - -void FGODGauge::update (double dt) { -} - -void FGODGauge::beginCapture(int viewSize) { - if( ! rt ) - allocRT(); - if(rtAvailable) { - rt->BeginCapture(); - } - else - set2D(); - textureWH = viewSize; - glViewport(0, 0, textureWH, textureWH); -} - -void FGODGauge::beginCapture(void) { - if( ! rt ) - allocRT(); - if(rtAvailable) { - rt->BeginCapture(); +void FGODGauge::allocRT () +{ + camera = new osg::Camera; + // Only the far camera should trigger this texture to be rendered. + camera->setNodeMask(simgear::BACKGROUND_BIT); + camera->setProjectionMatrix(osg::Matrix::ortho2D(-textureWH/2.0, textureWH/2.0, -textureWH/2.0, textureWH/2.0)); + camera->setViewport(0, 0, textureWH, textureWH); + camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); + camera->setRenderOrder(osg::Camera::PRE_RENDER); + camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f , 0.0f)); + camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::FRAME_BUFFER); + osg::StateSet* stateSet = camera->getOrCreateStateSet(); + stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF); + stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::OFF); + stateSet->setMode(GL_FOG, osg::StateAttribute::OFF); + stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); + stateSet->setAttributeAndModes(new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, + osg::PolygonMode::FILL), + osg::StateAttribute::ON); + stateSet->setAttributeAndModes(new osg::AlphaFunc(osg::AlphaFunc::GREATER, + 0.0f), + osg::StateAttribute::ON); + stateSet->setAttribute(new osg::ShadeModel(osg::ShadeModel::FLAT)); + stateSet->setAttributeAndModes(new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, + osg::BlendFunc::ONE_MINUS_SRC_ALPHA), + osg::StateAttribute::ON); + if (!texture.valid()) { + texture = new osg::Texture2D; + texture->setTextureSize(textureWH, textureWH); + texture->setInternalFormat(GL_RGBA); + texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); + texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); } - else - set2D(); + camera->attach(osg::Camera::COLOR_BUFFER, texture.get()); + globals->get_renderer()->addCamera(camera.get(), false); + rtAvailable = true; } -void FGODGauge::Clear(void) { - if(rtAvailable) { - glClear(GL_COLOR_BUFFER_BIT); - } - else { - glDisable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - glColor4f(0.0f, 0.0f, 0.0f, 0.0f); - glRectf(-256.0, -256.0, 256.0, 256.0); - glEnable(GL_BLEND); - glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); - glEnable(GL_ALPHA_TEST); +FGODGauge::~FGODGauge() +{ + if (camera.valid()) { + globals->get_renderer()->removeCamera(camera.get()); } } -void FGODGauge::endCapture(GLuint texID) { - glBindTexture(GL_TEXTURE_2D, texID); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, textureWH, textureWH); - if(rtAvailable) - rt->EndCapture(); - else - set3D(); -} - -void FGODGauge::setSize(int viewSize) { +void FGODGauge::setSize(int viewSize) +{ textureWH = viewSize; - glViewport(0, 0, textureWH, textureWH); + if (texture.valid()) { + texture->setTextureSize(textureWH, textureWH); + } } -bool FGODGauge::serviceable(void) { +bool FGODGauge::serviceable(void) +{ return rtAvailable; } /** - * Locate a texture SSG node in a branch. + * Replace a texture in the airplane model with the gauge texture. */ -static ssgTexture * -find_texture_node (ssgEntity * node, const char * name) + +class ReplaceStaticTextureVisitor : public osg::NodeVisitor { - if( node->isA( ssgTypeTexture() ) ) { - ssgTexture *tex = (ssgTexture *) node; - char * texture_name = tex->getFilename(); - if (texture_name != 0 && !strcmp(name, texture_name)) - return tex; - } - else if (node->isAKindOf(ssgTypeBranch())) { - int nKids = node->getNumKids(); - for (int i = 0; i < nKids; i++) { - ssgTexture * result = - find_texture_node(((ssgBranch*)node)->getKid(i), name); - if (result != 0) - return result; +public: + ReplaceStaticTextureVisitor(const std::string& name, + osg::Texture2D* _newTexture) : + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), + newTexture(_newTexture) + { + textureFileName = osgDB::getSimpleFileName(name); } - } - return 0; -} - -void FGODGauge::set_texture(const char * name, GLuint new_texture) { - ssgEntity * root = globals->get_scenery()->get_aircraft_branch(); - ssgTexture * node = find_texture_node( root, name ); - if( node ) - node->setHandle( new_texture ); -} - -void FGODGauge::set2D() { - glPushAttrib ( GL_ENABLE_BIT | GL_VIEWPORT_BIT | GL_TRANSFORM_BIT | GL_LIGHTING_BIT ) ; - - glDisable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); - glDisable(GL_CULL_FACE); - glDisable(GL_FOG); - glDisable(GL_DEPTH_TEST); - glClearColor(0.0, 0.0, 0.0, 0.0); - glEnable(GL_TEXTURE_2D); - glDisable(GL_SMOOTH); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glBindTexture(GL_TEXTURE_2D, 0); - - glViewport ( 0, 0, textureWH, textureWH ) ; - glMatrixMode ( GL_PROJECTION ) ; - glPushMatrix () ; - glLoadIdentity () ; - gluOrtho2D( -256.0, 256.0, -256.0, 256.0 ); - glMatrixMode ( GL_MODELVIEW ) ; - glPushMatrix () ; - glLoadIdentity () ; - glAlphaFunc(GL_GREATER, 0.0f); + virtual void apply(osg::Node& node) + { + osg::StateSet* ss = node.getStateSet(); + if (ss) + changeStateSetTexture(ss); + traverse(node); + } + virtual void apply(osg::Geode& node) + { + int numDrawables = node.getNumDrawables(); + for (int i = 0; i < numDrawables; i++) { + osg::Drawable* drawable = node.getDrawable(i); + osg::StateSet* ss = drawable->getStateSet(); + if (ss) + changeStateSetTexture(ss); + } + traverse(node); } +protected: + void changeStateSetTexture(osg::StateSet *ss) + { + osg::Texture2D* tex + = dynamic_cast(ss->getTextureAttribute(0, + osg::StateAttribute::TEXTURE)); + if (!tex || tex == newTexture || !tex->getImage()) + return; + std::string fileName = tex->getImage()->getFileName(); + std::string simpleName = osgDB::getSimpleFileName(fileName); + if (osgDB::equalCaseInsensitive(textureFileName, simpleName)) + ss->setTextureAttribute(0, newTexture); + } + std::string textureFileName; + osg::Texture2D* newTexture; +}; -void FGODGauge::set3D() { - glMatrixMode ( GL_PROJECTION ) ; - glPopMatrix () ; - glMatrixMode ( GL_MODELVIEW ) ; - glPopMatrix () ; - glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ; - glPopAttrib () ; +void FGODGauge::set_texture(const char * name, osg::Texture2D* new_texture) +{ + osg::Group* root = globals->get_scenery()->get_aircraft_branch(); + ReplaceStaticTextureVisitor visitor(name, new_texture); + root->accept(visitor); } +