]> git.mxchange.org Git - flightgear.git/commitdiff
Csaba HALASZ & Syd ADAMS: make radar font configurable
authormfranz <mfranz>
Sun, 1 Jun 2008 18:08:01 +0000 (18:08 +0000)
committermfranz <mfranz>
Sun, 1 Jun 2008 18:08:01 +0000 (18:08 +0000)
mf: move font color parts to the font listener

src/Instrumentation/groundradar.cxx
src/Instrumentation/groundradar.hxx
src/Instrumentation/wxradar.cxx
src/Instrumentation/wxradar.hxx

index da2442222d260dc483ad3e982394c1212fe6477b..02f8ca1a461f2169827b43e12c8233fcac17455a 100644 (file)
@@ -6,7 +6,7 @@
 //  modify it under the terms of the GNU General Public License as
 //  published by the Free Software Foundation; either version 2 of the
 //  License, or (at your option) any later version.
-// 
+//
 //  This program is distributed in the hope that it will be useful, but
 //  WITHOUT ANY WARRANTY; without even the implied warranty of
 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
 #include "groundradar.hxx"
 
-static const char* airport_node_name = "/sim/tower/airport-id";
-static const char* texture_name = "Aircraft/Instruments/Textures/od_groundradar.rgb";
-static const char* radar_node_name = "/instrumentation/radar/range";
+static const char* airport_source_node_name = "airport-id-source";
+static const char* default_airport_node_name = "/sim/tower/airport-id";
+static const char* texture_node_name = "texture-name";
+static const char* default_texture_name = "Aircraft/Instruments/Textures/od_groundradar.rgb";
+static const char* range_source_node_name = "range-source";
+static const char* default_range_node_name = "/instrumentation/radar/range";
 
 struct SingleFrameCallback : public osg::Camera::DrawCallback
 {
@@ -55,23 +58,23 @@ struct SingleFrameCallback : public osg::Camera::DrawCallback
 
 GroundRadar::GroundRadar(SGPropertyNode *node)
 {
-    _airport_node = fgGetNode(airport_node_name, true);
-    _radar_node = fgGetNode(radar_node_name, true);
-    createTexture();
+    _airport_node = fgGetNode(node->getStringValue(airport_source_node_name, default_airport_node_name), true);
+    _range_node = fgGetNode(node->getStringValue(range_source_node_name, default_range_node_name), true);
+    createTexture(node->getStringValue(texture_node_name, default_texture_name));
     updateTexture();
     _airport_node->addChangeListener(this);
-    _radar_node->addChangeListener(this);
+    _range_node->addChangeListener(this);
 }
 
 GroundRadar::~GroundRadar()
 {
     _airport_node->removeChangeListener(this);
-    _radar_node->removeChangeListener(this);
+    _range_node->removeChangeListener(this);
 }
 
 void GroundRadar::valueChanged(SGPropertyNode*)
 {
-    updateTexture();    
+    updateTexture();
 }
 
 inline static osg::Vec3 fromPolar(double fi, double r)
@@ -79,27 +82,27 @@ inline static osg::Vec3 fromPolar(double fi, double r)
     return osg::Vec3(sin(fi * SGD_DEGREES_TO_RADIANS) * r, cos(fi * SGD_DEGREES_TO_RADIANS) * r, 0);
 }
 
-void GroundRadar::createTexture()
-{        
+void GroundRadar::createTexture(const char* texture_name)
+{
     setSize(512);
     allocRT();
-    
+
     osg::Vec4Array* colors = new osg::Vec4Array;
-    colors->push_back(osg::Vec4(0.0f,0.5f,0.0f,1.0f));
-    colors->push_back(osg::Vec4(0.0f,0.5f,0.5f,1.0f));
-        
+    colors->push_back(osg::Vec4(0.0f, 0.5f, 0.0f, 1.0f));
+    colors->push_back(osg::Vec4(0.0f, 0.5f, 0.5f, 1.0f));
+
     _geom = new osg::Geometry();
     _geom->setColorArray(colors);
     _geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
     _geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 0));
     _geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 0));
 
-    osg::Geode* geode = new osg::Geode();        
+    osg::Geode* geode = new osg::Geode();
     osg::StateSet* stateset = geode->getOrCreateStateSet();
     stateset->setMode(GL_BLEND, osg::StateAttribute::OFF);
     geode->addDrawable(_geom.get());
 
-    osg::Camera* camera = getCamera();        
+    osg::Camera* camera = getCamera();
     camera->setPostDrawCallback(new SingleFrameCallback());
     camera->addChild(geode);
     camera->setNodeMask(0);
@@ -118,16 +121,19 @@ void GroundRadar::updateTexture()
     FGRunwayList* runways = globals->get_runways();
 
     const FGAirport* airport = fgFindAirportID(airport_name);
+    if (airport == 0)
+        return;
+
     const SGGeod& tower_location = airport->getTowerLocation();
     const double tower_lat = tower_location.getLatitudeDeg();
     const double tower_lon = tower_location.getLongitudeDeg();
-    double scale = SG_METER_TO_NM * 200 / _radar_node->getDoubleValue();
+    double scale = SG_METER_TO_NM * 200 / _range_node->getDoubleValue();
 
-    for(FGRunway runway = runways->search(airport_name); runway._id == airport_name; runway = runways->next())
+    for (FGRunway runway = runways->search(airport_name); runway._id == airport_name; runway = runways->next())
     {
         double az1, az2, dist_m;
         geo_inverse_wgs_84(tower_lat, tower_lon, runway._lat, runway._lon, &az1, &az2, &dist_m);
-            
+
         osg::Vec3 center = fromPolar(az1, dist_m * scale) + osg::Vec3(256, 256, 0);
         osg::Vec3 leftcenter = fromPolar(runway._heading, runway._length * SG_FEET_TO_METER * scale / 2) + center;
         osg::Vec3 lefttop = fromPolar(runway._heading - 90, runway._width * SG_FEET_TO_METER * scale / 2) + leftcenter;
@@ -141,7 +147,7 @@ void GroundRadar::updateTexture()
         vertices->push_back(rightbottom);
         vertices->push_back(righttop);
     }
-        
+
     osg::Vec3Array* vertices = new osg::Vec3Array(*taxi_vertices.get());
     vertices->insert(vertices->end(), rwy_vertices->begin(), rwy_vertices->end());
     _geom->setVertexArray(vertices);
@@ -150,7 +156,7 @@ void GroundRadar::updateTexture()
     taxi->setCount(taxi_vertices->size());
     rwy->setFirst(taxi_vertices->size());
     rwy->setCount(rwy_vertices->size());
-    
+
     getCamera()->setNodeMask(0xffffffff);
 }
 
index 8a6a82d08cce0d3c6ef1a487569c51f828c7f5d4..8839143faf32e8d679ae78237844af29e0ae565c 100644 (file)
@@ -6,7 +6,7 @@
 //  modify it under the terms of the GNU General Public License as
 //  published by the Free Software Foundation; either version 2 of the
 //  License, or (at your option) any later version.
-// 
+//
 //  This program is distributed in the hope that it will be useful, but
 //  WITHOUT ANY WARRANTY; without even the implied warranty of
 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
@@ -38,11 +38,11 @@ public:
     virtual void valueChanged(SGPropertyNode*);
 
 protected:
+    void createTexture(const char* texture_name);
+
     osg::ref_ptr<osg::Geometry> _geom;
     SGPropertyNode_ptr _airport_node;
-    SGPropertyNode_ptr _radar_node;
-
-    void createTexture();
+    SGPropertyNode_ptr _range_node;
 };
 
 #endif // __INST_GROUNDRADAR_HXX
index 0cc0801e8491990db442207446270cae2f3d8d39..35a9c7422f59e5883962ce9d530f5cc1c8b61d03 100644 (file)
@@ -75,45 +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(),
-                                                     false);
+    _resultTexture = FGTextureManager::createTexture(_texture_path.c_str(), false);
 
     SGPath tpath(globals->get_fg_root());
     string path = _Instrument->getStringValue("echo-texture-path",
@@ -138,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");
@@ -170,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)
@@ -549,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);
@@ -565,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
@@ -578,6 +574,7 @@ wxRadarBg::update_data(FGAIBase* ac, double radius, double bearing, bool selecte
     _textGeode->addDrawable(callsign);
 }
 
+
 void
 wxRadarBg::update_aircraft()
 {
@@ -689,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;
@@ -857,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");
@@ -872,12 +876,14 @@ wxRadarBg::updateFont()
     } else {
         tpath = path;
     }
+
 #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);
@@ -892,3 +898,4 @@ wxRadarBg::valueChanged(SGPropertyNode*)
 {
     updateFont();
 }
+
index b7d145724e5ca4dee0a1dbfee513c2203c989c04..ab1db5c4b31926298dfdd328e22116bbbe3d13de 100644 (file)
@@ -58,12 +58,9 @@ public:
 
     double _interval;
     double _time;
-
     bool _sim_init_done;
-
     string _name;
-
-    int _num; 
+    int _num;
 
     SGPropertyNode_ptr _serviceable_node;
     SGPropertyNode_ptr _Instrument;
@@ -82,7 +79,6 @@ public:
     SGPropertyNode* getInstrumentNode(const char* name, DefaultType value);
 
 private:
-
     string _texture_path;
 
     typedef enum { ARC, MAP, PLAN, ROSE } DisplayMode;
@@ -115,14 +111,14 @@ private:
     SGPropertyNode_ptr _radar_position_node;
     SGPropertyNode_ptr _radar_data_node;
     SGPropertyNode_ptr _radar_symbol_node;
-    
+
     SGPropertyNode_ptr _radar_centre_node;
     SGPropertyNode_ptr _radar_coverage_node;
     SGPropertyNode_ptr _radar_ref_rng_node;
     SGPropertyNode_ptr _radar_hdg_marker_node;
     SGPropertyNode_ptr _radar_rotate_node;
-    SGPropertyNode_ptr _radar_font_node;
 
+    SGPropertyNode_ptr _font_node;
     SGPropertyNode_ptr _ai_enabled_node;
 
     osg::ref_ptr<osg::Texture2D> _resultTexture;
@@ -134,6 +130,9 @@ private:
     osg::Vec2Array *_texCoords;
     osg::Matrixf _centerTrans;
     osg::ref_ptr<osgText::Font> _font;
+    osg::Vec4 _font_color;
+    float _font_size;
+    float _font_spacing;
 
     list_of_SGWxRadarEcho _radarEchoBuffer;
 
@@ -154,9 +153,9 @@ private:
     bool inRadarRange(int type, double range);
 
     float calcRelBearing(float bearing, float heading);
-    
 };
 
+
 template<> inline
 SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name, bool value)
 {
@@ -166,6 +165,7 @@ SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name, bool value)
     return result;
 }
 
+
 template<> inline
 SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name, double value)
 {
@@ -175,6 +175,7 @@ SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name, double value)
     return result;
 }
 
+
 template<> inline
 SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name,
                                              const char* value)