]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/HUD/HUD.cxx
Quiet some log output.
[flightgear.git] / src / Instrumentation / HUD / HUD.cxx
index 8c112aef6c1ee785ec2b45a17c424404ba6874cc..d0f257cc45ac7cf5922fb168c0ef7f1e2d167743 100644 (file)
 #include <plib/fnt.h>
 
 #include <Main/globals.hxx>
+#include <Main/fg_props.hxx>
 #include <Viewer/viewmgr.hxx>
 #include <Viewer/viewer.hxx>
 #include <GUI/FGFontCache.hxx>
+#include <GUI/gui.h> // for guiErrorMessage
 
 #include "HUD.hxx"
+#include "HUD_private.hxx"
 
 using std::endl;
 using std::ifstream;
+using std::string;
+using std::deque;
+using std::vector;
 
 static float clamp(float f)
 {
     return f < 0.0f ? 0.0f : f > 1.0f ? 1.0f : f;
 }
 
+HUD::Input::Input(const SGPropertyNode *n, float factor, float offset,
+      float min, float max) :
+  _valid(false),
+  _property(0),
+  _damped(SGLimitsf::max())
+{
+  if (!n)
+    return;
+  _factor = n->getFloatValue("factor", factor);
+  _offset = n->getFloatValue("offset", offset);
+  _min = n->getFloatValue("min", min);
+  _max = n->getFloatValue("max", max);
+  _coeff = 1.0 - 1.0 / powf(10, fabs(n->getFloatValue("damp", 0.0)));
+  SGPropertyNode *p = ((SGPropertyNode *)n)->getNode("property", false);
+  if (p) {
+    const char *path = p->getStringValue();
+    if (path && path[0]) {
+      _property = fgGetNode(path, true);
+      _valid = true;
+    }
+  }
+}
 
 HUD::HUD() :
     _currentPath(fgGetNode("/sim/hud/current-path", true)),
@@ -66,6 +94,7 @@ HUD::HUD() :
     _alpha_clamp(fgGetNode("/sim/hud/color/alpha-clamp", true)),
     _brightness(fgGetNode("/sim/hud/color/brightness", true)),
     _visible(false),
+    _loaded(false),
     _antialiased(false),
     _transparent(false),
     _a(0.67),                                                                  // FIXME better names
@@ -115,7 +144,8 @@ void HUD::init()
     _font_renderer->setFont(_font);
     _font_renderer->setPointSize(_font_size);
     _text_list.setFont(_font_renderer);
-
+    _loaded = false;
+  
     currentColorChanged();
     _currentPath->fireValueChanged();
 }
@@ -134,6 +164,8 @@ void HUD::deinit()
   
   delete _clip_box;
   _clip_box = NULL;
+  
+  _loaded = false;
 }
 
 void HUD::reinit()
@@ -427,16 +459,28 @@ void HUD::valueChanged(SGPropertyNode *node)
     if (_listener_active)
         return;
     _listener_active = true;
-    if (!strcmp(node->getName(), "current-path")) {
-        int pathIndex = _currentPath->getIntValue();
-        SGPropertyNode* pathNode = fgGetNode("/sim/hud/path", pathIndex);
-        std::string path("Huds/default.xml");
-        if (pathNode && pathNode->hasValue()) {
-            path = pathNode->getStringValue();
-            SG_LOG(SG_INSTR, SG_INFO, "will load Hud from " << path);
-        }
+  
+    bool loadNow = false;
+    _visible = _visibility->getBoolValue();
+    if (_visible && !_loaded) {
+      loadNow = true;
+    }
+  
+    if (!strcmp(node->getName(), "current-path") && _visible) {
+      loadNow = true;
+    }
+  
+    if (loadNow) {
+      int pathIndex = _currentPath->getIntValue();
+      SGPropertyNode* pathNode = fgGetNode("/sim/hud/path", pathIndex);
+      std::string path("Huds/default.xml");
+      if (pathNode && pathNode->hasValue()) {
+        path = pathNode->getStringValue();
+        SG_LOG(SG_INSTR, SG_INFO, "will load Hud from " << path);
+      }
       
-        load(path.c_str());
+      _loaded = true;
+      load(path.c_str());
     }
   
     if (!strcmp(node->getName(), "current-color")) {
@@ -446,7 +490,7 @@ void HUD::valueChanged(SGPropertyNode *node)
     _scr_width = _scr_widthN->getIntValue();
     _scr_height = _scr_heightN->getIntValue();
 
-    _visible = _visibility->getBoolValue();
+    
     _3Denabled = _3DenabledN->getBoolValue();
     _transparent = _transparency->getBoolValue();
     _antialiased = _antialiasing->getBoolValue();