#include <cassert>
//------------------------------------------------------------------------------
-FGODGauge::FGODGauge():
- _size_x( -1 ),
- _size_y( -1 ),
- _view_width( -1 ),
- _view_height( -1 ),
- _use_image_coords( false ),
- _use_stencil( false ),
- _use_mipmapping( false ),
- _coverage_samples( 0 ),
- _color_samples( 0 ),
- rtAvailable( false )
-{
-}
-
-//------------------------------------------------------------------------------
-FGODGauge::~FGODGauge()
-{
- if( camera.valid() )
- globals->get_renderer()->removeCamera(camera.get());
-}
-
-//------------------------------------------------------------------------------
-void FGODGauge::setSize(int size_x, int size_y)
-{
- _size_x = size_x;
- _size_y = size_y < 0 ? size_x : size_y;
-
- if( texture.valid() )
- texture->setTextureSize(_size_x, _size_x);
-}
-
-//----------------------------------------------------------------------------
-void FGODGauge::setViewSize(int width, int height)
+static void cbAddCamera(osg::Camera* cam)
{
- _view_width = width;
- _view_height = height < 0 ? width : height;
-
- if( camera )
- updateCoordinateFrame();
+ globals->get_renderer()->addCamera(cam, false);
}
//------------------------------------------------------------------------------
-void FGODGauge::useImageCoords(bool use)
+static void cbRemoveCamera(osg::Camera* cam)
{
- if( use == _use_image_coords )
- return;
-
- _use_image_coords = use;
-
- if( texture )
- updateCoordinateFrame();
+ globals->get_renderer()->removeCamera(cam);
}
//------------------------------------------------------------------------------
-void FGODGauge::useStencil(bool use)
-{
- if( use == _use_stencil )
- return;
-
- _use_stencil = use;
-
- if( texture )
- updateStencil();
-}
-
-//------------------------------------------------------------------------------
-void FGODGauge::setSampling( bool mipmapping,
- int coverage_samples,
- int color_samples )
-{
- if( _use_mipmapping == mipmapping
- && _coverage_samples == coverage_samples
- && _color_samples == color_samples )
- return;
-
- _use_mipmapping = mipmapping;
-
- if( color_samples > coverage_samples )
- {
- SG_LOG
- (
- SG_GL,
- SG_WARN,
- "FGODGauge::setSampling: color_samples > coverage_samples not allowed!"
- );
- color_samples = coverage_samples;
- }
-
- _coverage_samples = coverage_samples;
- _color_samples = color_samples;
-
- updateSampling();
-}
-
-//------------------------------------------------------------------------------
-void FGODGauge::setRender(bool render)
-{
- // Only the far camera should trigger this texture to be rendered.
- camera->setNodeMask(render ? simgear::BACKGROUND_BIT : 0);
-}
-
-//------------------------------------------------------------------------------
-bool FGODGauge::serviceable(void)
-{
- return rtAvailable;
-}
-
-//------------------------------------------------------------------------------
-void FGODGauge::allocRT(osg::NodeCallback* camera_cull_callback)
+FGODGauge::FGODGauge():
+ simgear::ODGauge(cbAddCamera, cbRemoveCamera)
{
- camera = new osg::Camera;
- camera->setDataVariance(osg::Object::DYNAMIC);
- camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
- camera->setRenderOrder(osg::Camera::PRE_RENDER);
- camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f , 0.0f));
- camera->setClearStencil(0);
- camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT,
- osg::Camera::FRAME_BUFFER );
-
- if( camera_cull_callback )
- camera->setCullCallback(camera_cull_callback);
-
- setRender(true);
- updateCoordinateFrame();
- updateStencil();
-
- 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 )
- {
- texture = new osg::Texture2D;
- texture->setTextureSize(_size_x, _size_y);
- texture->setInternalFormat(GL_RGBA);
- }
-
- updateSampling();
-
- globals->get_renderer()->addCamera(camera.get(), false);
- rtAvailable = true;
-}
-//------------------------------------------------------------------------------
-void FGODGauge::updateCoordinateFrame()
-{
- assert( camera );
-
- if( _view_width < 0 )
- _view_width = _size_x;
- if( _view_height < 0 )
- _view_height = _size_y;
-
- camera->setViewport(0, 0, _size_x, _size_y);
-
- if( _use_image_coords )
- camera->setProjectionMatrix(
- osg::Matrix::ortho2D(0, _view_width, _view_height, 0)
- );
- else
- camera->setProjectionMatrix(
- osg::Matrix::ortho2D( -_view_width/2., _view_width/2.,
- -_view_height/2., _view_height/2. )
- );
}
//------------------------------------------------------------------------------
-void FGODGauge::updateStencil()
+FGODGauge::~FGODGauge()
{
- assert( camera );
-
- GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
-
- if( _use_stencil)
- {
- camera->attach( osg::Camera::PACKED_DEPTH_STENCIL_BUFFER,
- GL_DEPTH_STENCIL_EXT );
- mask |= GL_STENCIL_BUFFER_BIT;
- }
- else
- {
- camera->detach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER);
- }
-
- camera->setClearMask(mask);
-}
-//------------------------------------------------------------------------------
-void FGODGauge::updateSampling()
-{
- assert( camera );
- assert( texture );
-
- texture->setFilter(
- osg::Texture2D::MIN_FILTER,
- _use_mipmapping ? osg::Texture2D::LINEAR_MIPMAP_LINEAR
- : osg::Texture2D::LINEAR
- );
- camera->attach(
- osg::Camera::COLOR_BUFFER,
- texture.get(),
- 0, 0,
- _use_mipmapping,
- _coverage_samples,
- _color_samples
- );
}
/**
// Owner Drawn Gauge helper class
//
-// Written by Harald JOHNSEN, started May 2005.
-//
-// Copyright (C) 2005 Harald JOHNSEN - hjohnsen@evc.net
-//
-// Ported to OSG by Tim Moore - Jun 2007
-//
-// Heavily modified to be usable for the 2d Canvas by Thomas Geymayer - April 2012
-// Supports now multisampling/mipmapping, usage of the stencil buffer and placing
-// the texture in the scene by certain filter criteria
+// Moved to SimGear by Thomas Geymayer - October 2012
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
#include <Canvas/canvas_fwd.hpp>
#include <Canvas/placement.hxx>
-#include <osg/NodeCallback>
-#include <osg/Group>
-
-namespace osg {
- class Camera;
- class Texture2D;
-}
+#include <simgear/canvas/ODGauge.hxx>
class SGPropertyNode;
/**
- * Owner Drawn Gauge helper class.
+ * Owner Drawn Gauge helper class
*/
-class FGODGauge
+class FGODGauge:
+ public simgear::ODGauge
{
public:
FGODGauge();
virtual ~FGODGauge();
- /**
- * Set the size of the render target.
- *
- * @param size_x X size
- * @param size_y Y size. Defaults to size_x if not specified
- */
- void setSize(int size_x, int size_y = -1);
-
- /**
- * Set the size of the viewport
- *
- * @param width
- * @param height Defaults to width if not specified
- */
- void setViewSize(int width, int height = -1);
-
- /**
- * DEPRECATED
- *
- * Get size of squared texture
- */
- int size() const { return _size_x; }
-
- /**
- * Set whether to use image coordinates or not.
- *
- * Default: origin == center of texture
- * Image Coords: origin == top left corner
- */
- void useImageCoords(bool use = true);
-
- /**
- * Enable/Disable using a stencil buffer
- */
- void useStencil(bool use = true);
-
- /**
- * Set sampling parameters for mipmapping and coverage sampling
- * antialiasing.
- *
- * @note color_samples is not allowed to be higher than coverage_samples
- *
- */
- void setSampling( bool mipmapping,
- int coverage_samples = 0,
- int color_samples = 0 );
-
- /**
- * Enable/Disable updating the texture (If disabled the contents of the
- * texture remains with the outcome of the last rendering pass)
- */
- void setRender(bool render);
-
- /**
- * Say if we can render to a texture.
- * @return true if rtt is available
- */
- bool serviceable(void);
-
/**
* Replace an opengl texture name inside the aircraft scene graph.
* This is to replace a static texture by a dynamic one
osg::Texture2D* new_texture,
osg::NodeCallback* cull_callback = 0 );
- /**
- * Get the OSG camera for drawing this gauge.
- */
- osg::Camera* getCamera() const { return camera.get(); }
-
- osg::Texture2D* getTexture() const { return texture.get(); }
- //void setTexture(osg::Texture2D* t) { texture = t; }
-
- // Real initialization function. Bad name.
- void allocRT(osg::NodeCallback* camera_cull_callback = 0);
-
- private:
- int _size_x,
- _size_y,
- _view_width,
- _view_height;
- bool _use_image_coords,
- _use_stencil,
- _use_mipmapping;
-
- // Multisampling parameters
- int _coverage_samples,
- _color_samples;
-
- bool rtAvailable;
- osg::ref_ptr<osg::Camera> camera;
- osg::ref_ptr<osg::Texture2D> texture;
-
- void updateCoordinateFrame();
- void updateStencil();
- void updateSampling();
-
};
#endif // _OD_GAUGE_HXX