]> git.mxchange.org Git - flightgear.git/commitdiff
Move FGODGauge implementation to SimGear
authorThomas Geymayer <tomgey@gmail.com>
Fri, 19 Oct 2012 09:59:36 +0000 (11:59 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Fri, 19 Oct 2012 09:59:36 +0000 (11:59 +0200)
src/Cockpit/od_gauge.cxx
src/Cockpit/od_gauge.hxx

index c6be269e4e5e5e3074c4b1d0d562f92914c92d36..9e7c3e1e426986a4e08c96d8925798a0ed25f858 100644 (file)
 #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
-  );
 }
 
 /**
index 7c4ee00edb5889976e4976f11e4a3f6ae2e64cfe..8c0810401568d65054d080181f4860177af7b3cc 100644 (file)
@@ -1,14 +1,6 @@
 // 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
@@ -140,38 +68,6 @@ class FGODGauge
                                     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