]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/wxradar.cxx
Csaba HALASZ & Syd ADAMS: make radar font configurable
[flightgear.git] / src / Instrumentation / wxradar.cxx
index e4a96b3bff6d2dd8ca6fbed4c1763a41d068ab10..35a9c7422f59e5883962ce9d530f5cc1c8b61d03 100644 (file)
@@ -61,12 +61,13 @@ SG_USING_STD(setfill);
 #include <AIModel/AIManager.hxx>
 #include <AIModel/AIBallistic.hxx>
 
+#include <Include/general.hxx>
 #include "instrument_mgr.hxx"
 #include "od_gauge.hxx"
 #include "wxradar.hxx"
 
 
-typedef list <SGSharedPtr<FGAIBase> > radar_list_type;
+typedef list <osg::ref_ptr<FGAIBase> > radar_list_type;
 typedef radar_list_type::iterator radar_list_iterator;
 typedef radar_list_type::const_iterator radar_list_const_iterator;
 
@@ -74,44 +75,44 @@ typedef radar_list_type::const_iterator radar_list_const_iterator;
 static const float UNIT = 1.0f / 8.0f;  // 8 symbols in a row/column in the texture
 static const char *DEFAULT_FONT = "typewriter.txf";
 
-wxRadarBg::wxRadarBg ( SGPropertyNode *node) :
+wxRadarBg::wxRadarBg(SGPropertyNode *node) :
     _name(node->getStringValue("name", "radar")),
     _num(node->getIntValue("number", 0)),
     _interval(node->getDoubleValue("update-interval-sec", 1.0)),
-    _time( 0.0 ),
-    _last_switchKnob( "off" ),
-    _sim_init_done ( false ),
-    _resultTexture( 0 ),
-    _wxEcho( 0 ),
-    _odg( 0 )
+    _time(0.0),
+    _last_switchKnob("off"),
+    _sim_init_done(false),
+    _resultTexture(0),
+    _wxEcho(0),
+    _odg(0)
 {
-    const char *tacan_source = node->getStringValue("tacan-source",
-            "/instrumentation/tacan");
+    string branch;
+    branch = "/instrumentation/" + _name;
+    _Instrument = fgGetNode(branch.c_str(), _num, true );
+
+    const char *tacan_source = node->getStringValue("tacan-source", "/instrumentation/tacan");
     _Tacan = fgGetNode(tacan_source, true);
+
+    _font_node = _Instrument->getNode("font", true);
+    _font_node->addChangeListener(this, true);
 }
 
 
 wxRadarBg::~wxRadarBg ()
 {
-    if (_radar_font_node != 0) {
-        _radar_font_node->removeChangeListener(this);
-    }
+    _font_node->removeChangeListener(this);
 }
 
 
 void
 wxRadarBg::init ()
 {
-    string branch;
-    branch = "/instrumentation/" + _name;
-
-    _Instrument = fgGetNode(branch.c_str(), _num, true );
     _serviceable_node = _Instrument->getNode("serviceable", true);
 
     // texture name to use in 2D and 3D instruments
     _texture_path = _Instrument->getStringValue("radar-texture-path",
             "Aircraft/Instruments/Textures/od_wxradar.rgb");
-    _resultTexture = FGTextureManager::createTexture(_texture_path.c_str());
+    _resultTexture = FGTextureManager::createTexture(_texture_path.c_str(), false);
 
     SGPath tpath(globals->get_fg_root());
     string path = _Instrument->getStringValue("echo-texture-path",
@@ -119,7 +120,7 @@ wxRadarBg::init ()
     tpath.append(path);
 
     // no mipmap or else alpha will mix with pixels on the border of shapes, ruining the effect
-    _wxEcho = SGLoadTexture2D(tpath.c_str(), false, false);
+    _wxEcho = SGLoadTexture2D(tpath, false, false);
 
 
     _Instrument->setFloatValue("trk", 0.0);
@@ -136,8 +137,8 @@ wxRadarBg::init ()
     // input range = n nm (20/40/80)
     // input display-mode = arc | rose | map | plan
 
-    FGInstrumentMgr *imgr = (FGInstrumentMgr *) globals->get_subsystem("instrumentation");
-    _odg = (FGODGauge *) imgr->get_subsystem("od_gauge");
+    FGInstrumentMgr *imgr = (FGInstrumentMgr *)globals->get_subsystem("instrumentation");
+    _odg = (FGODGauge *)imgr->get_subsystem("od_gauge");
     _odg->setSize(512);
 
     _ai = (FGAIManager*)globals->get_subsystem("ai_model");
@@ -168,10 +169,6 @@ wxRadarBg::init ()
     _radar_symbol_node      = n->getNode("symbol", true);
     _radar_centre_node      = n->getNode("centre", true);
     _radar_rotate_node      = n->getNode("rotate", true);
-    _radar_font_node        = _Instrument->getNode("font", true);
-    _radar_font_node->addChangeListener(this);
-    
-    updateFont();
 
     _radar_centre_node->setBoolValue(false);
     if (_radar_coverage_node->getType() == SGPropertyNode::NONE)
@@ -547,14 +544,15 @@ wxRadarBg::update_weather()
     }
 }
 
+
 void
 wxRadarBg::update_data(FGAIBase* ac, double radius, double bearing, bool selected)
 {
     osgText::Text* callsign = new osgText::Text;
     callsign->setFont(_font.get());
     callsign->setFontResolution(12, 12);
-    callsign->setCharacterSize(12);
-    callsign->setColor(selected ? osg::Vec4(1, 1, 1, 1) : osg::Vec4(0, 1, 0, 1));
+    callsign->setCharacterSize(_font_size);
+    callsign->setColor(selected ? osg::Vec4(1, 1, 1, 1) : _font_color);
     osg::Matrixf m(wxRotate(-bearing)
             * osg::Matrixf::translate(0.0f, radius, 0.0f)
             * wxRotate(bearing) * _centerTrans);
@@ -563,10 +561,10 @@ wxRadarBg::update_data(FGAIBase* ac, double radius, double bearing, bool selecte
     // cast to int's, otherwise text comes out ugly
     callsign->setPosition(osg::Vec3((int)pos.x(), (int)pos.y(), 0));
     callsign->setAlignment(osgText::Text::LEFT_BOTTOM_BASE_LINE);
-    callsign->setLineSpacing(0.25);
-                        
+    callsign->setLineSpacing(_font_spacing);
+
     stringstream text;
-    text << ac->_getCallsign() << endl 
+    text << ac->_getCallsign() << endl
         << setprecision(0) << fixed
         << setw(3) << setfill('0') << ac->_getHeading() << "\xB0 "
         << setw(0) << ac->_getAltitude() << "ft" << endl
@@ -576,6 +574,7 @@ wxRadarBg::update_data(FGAIBase* ac, double radius, double bearing, bool selecte
     _textGeode->addDrawable(callsign);
 }
 
+
 void
 wxRadarBg::update_aircraft()
 {
@@ -589,12 +588,12 @@ wxRadarBg::update_aircraft()
         return;
 
     radar_list_type radar_list = _ai->get_ai_list();
-    SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: AI submodel list size" << radar_list.size());
+    //SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: AI submodel list size" << radar_list.size());
     if (radar_list.empty())
         return;
 
-    SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: Loading AI submodels ");
-    const double echo_radii[] = {0, 1, 1.5, 1.5, 0.001, 0.1, 1.5, 2, 1.5, 1.5};
+    //SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: Loading AI submodels ");
+    const double echo_radii[] = {0, 1, 1.5, 1.5, 0.001, 0.1, 1.5, 2, 1.5, 1.5, 1.5};
 
     double user_lat = _user_lat_node->getDoubleValue();
     double user_lon = _user_lon_node->getDoubleValue();
@@ -615,7 +614,7 @@ wxRadarBg::update_aircraft()
     int selected_id = fgGetInt("/instrumentation/radar/selected-id", -1);
 
     for (; it != end; ++it) {
-        FGAIBase *ac = *it;
+        FGAIBase *ac = (*it).get();
         int type       = ac->getType();
         double lat     = ac->_getLatitude();
         double lon     = ac->_getLongitude();
@@ -626,16 +625,16 @@ wxRadarBg::update_aircraft()
         calcRangeBearing(user_lat, user_lon, lat, lon, range, bearing);
 
         //SG_LOG(SG_GENERAL, SG_DEBUG,
-        //        "Radar: ID=" << ac->getID() << "(" << radar_list.size() << ")"
-        //        << " type=" << type
-        //        << " view_heading=" << _view_heading * SG_RADIANS_TO_DEGREES
-        //        << " alt=" << alt
-        //        << " heading=" << heading
-        //        << " range=" << range
-        //        << " bearing=" << bearing);
+        /*        "Radar: ID=" << ac->getID() << "(" << radar_list.size() << ")"
+                << " type=" << type
+                << " view_heading=" << _view_heading * SG_RADIANS_TO_DEGREES
+                << " alt=" << alt
+                << " heading=" << heading
+                << " range=" << range
+                << " bearing=" << bearing);*/
 
         bool isVisible = withinRadarHorizon(user_alt, alt, range);
-        SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: visible " << isVisible);
+        //SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: visible " << isVisible);
         if (!isVisible)
             continue;
 
@@ -666,7 +665,8 @@ wxRadarBg::update_aircraft()
             addQuad(_vertices, _texCoords, m, texBase);
 
             //SG_LOG(SG_GENERAL, SG_DEBUG, "Radar:    drawing AI"
-            //        << " x=" << x << " y=" << y
+                //<< " ID=" << ac->getID()
+                //<< " type=" << type
             //        << " radius=" << radius
             //        << " angle=" << angle * SG_RADIANS_TO_DEGREES);
         }
@@ -686,7 +686,7 @@ wxRadarBg::update_aircraft()
             //        << " bearing=" << angle * SG_RADIANS_TO_DEGREES
             //        << " radius=" << radius);
         }
-        
+
         if (draw_data) {
             if (ac->getID() == selected_id) {
                 selected_ac = ac;
@@ -795,7 +795,7 @@ wxRadarBg::withinRadarHorizon(double user_alt, double alt, double range_nm)
         alt = 0;
 
     double radarhorizon = 1.23 * (sqrt(alt) + sqrt(user_alt));
-    SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: horizon " << radarhorizon);
+    //SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: horizon " << radarhorizon);
     return radarhorizon >= range_nm;
 }
 
@@ -817,14 +817,14 @@ wxRadarBg::inRadarRange(int type, double range_nm)
     //
     // TODO - make the maximum range adjustable at runtime
 
-    const double sigma[] = {0, 1, 100, 100, 0.001, 0.1, 100, 100, 1, 1};
+    const double sigma[] = {0, 1, 100, 100, 0.001, 0.1, 100, 100, 1, 1, 1};
     double constant = _radar_ref_rng;
 
     if (constant <= 0)
         constant = 35;
 
     double maxrange = constant * pow(sigma[type], 0.25);
-    SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: max range " << maxrange);
+    //SG_LOG(SG_GENERAL, SG_DEBUG, "Radar: max range " << maxrange);
     return maxrange >= range_nm;
 }
 
@@ -854,14 +854,21 @@ wxRadarBg::calcRelBearing(float bearing, float heading)
     return angle;
 }
 
+
 void
 wxRadarBg::updateFont()
 {
+    float red = _font_node->getFloatValue("color/red", 0);
+    float green = _font_node->getFloatValue("color/green", 0.8);
+    float blue = _font_node->getFloatValue("color/blue", 0);
+    float alpha = _font_node->getFloatValue("color/alpha", 1);
+    _font_color.set(red, green, blue, alpha);
+
+    _font_size = _font_node->getFloatValue("size", 12);
+    _font_spacing = _font_size * _font_node->getFloatValue("line-spacing", 0.25);
+    string path = _font_node->getStringValue("name", DEFAULT_FONT);
+
     SGPath tpath;
-    string path = _radar_font_node->getStringValue();
-    if (path.length() == 0) {
-        path = DEFAULT_FONT;
-    }
     if (path[0] != '/') {
         tpath = globals->get_fg_root();
         tpath.append("Fonts");
@@ -869,12 +876,14 @@ wxRadarBg::updateFont()
     } else {
         tpath = path;
     }
-#if OSG_VERSION_MAJOR > 2 || (OSG_VERSION_MAJOR == 2 && OSG_VERSION_MINOR > 0)
+
+#if (FG_OSG_VERSION >= 21000)
     osg::ref_ptr<osgDB::ReaderWriter::Options> fontOptions = new osgDB::ReaderWriter::Options("monochrome");
-    osg::ref_ptr<osgText::Font> font = osgText::readFontFile(tpath.c_str(), fontOptions.get());    
-#else    
+    osg::ref_ptr<osgText::Font> font = osgText::readFontFile(tpath.c_str(), fontOptions.get());
+#else
     osg::ref_ptr<osgText::Font> font = osgText::readFontFile(tpath.c_str());
 #endif
+
     if (font != 0) {
         _font = font;
         _font->setMinFilterHint(osg::Texture::NEAREST);
@@ -889,3 +898,4 @@ wxRadarBg::valueChanged(SGPropertyNode*)
 {
     updateFont();
 }
+