]> git.mxchange.org Git - flightgear.git/commitdiff
add MIL-STD-1787B Aiming Reticle (stadiametric; TODO: standby)
authormfranz <mfranz>
Sat, 22 Jul 2006 08:00:56 +0000 (08:00 +0000)
committermfranz <mfranz>
Sat, 22 Jul 2006 08:00:56 +0000 (08:00 +0000)
src/Instrumentation/HUD/HUD.cxx
src/Instrumentation/HUD/HUD.hxx
src/Instrumentation/HUD/HUD_instrument.cxx
src/Instrumentation/HUD/HUD_misc.cxx [new file with mode: 0644]
src/Instrumentation/HUD/Makefile.am

index 8e9143d97e1f69ef9a38f399e09ce11425031765..aeed80e1191e0ac4d8341443e1b6ca11484e9c98 100644 (file)
@@ -379,6 +379,8 @@ int HUD::load(const char *file, float x, float y, int level, const string& inden
             item = static_cast<Item *>(new Ladder(this, n, x, y));
         } else if (!strcmp(name, "runway")) {
             item = static_cast<Item *>(new Runway(this, n, x, y));
+        } else if (!strcmp(name, "aiming-reticle")) {
+            item = static_cast<Item *>(new AimingReticle(this, n, x, y));
         } else {
             SG_LOG(SG_INPUT, TREE, indent << "      \\...unsupported!");
             continue;
index 1a6a72a0ce97b99daddc61b6575cea3dbded6df5..b67aab7165e127d5fd428e5cb680f612f1f74bc0 100644 (file)
@@ -261,6 +261,7 @@ private:
     class TurnBankIndicator;
     class Ladder;
     class Runway;
+    class AimingReticle;
 
     deque<Item *> _items;
 
@@ -322,6 +323,11 @@ public:
         }
     }
 
+    bool getBoolValue() const {
+        assert(_property);
+        return _property->getBoolValue();
+    }
+
     const char *getStringValue() const {
         assert(_property);
         return _property->getStringValue();
@@ -631,4 +637,18 @@ private:
 };
 
 
+class HUD::AimingReticle : public Item {
+public:
+    AimingReticle(HUD *parent, const SGPropertyNode *, float x, float y);
+    virtual void draw();
+
+private:
+    SGCondition *_active_condition;  // stadiametric (true) or standby (false)
+    Input   _diameter;               // inner/outer radius relation
+    float   _bullet_size;
+    float   _inner_radius;
+};
+
+
+
 #endif // _HUD_HXX
index 50e5731ce1799eb90a208ab58b4cef49c8dcb692..e68781f7630232f5d084841404ef38655a1006c4 100644 (file)
@@ -116,8 +116,8 @@ void HUD::Item::draw_text(float x, float y, char *msg, int digit)
 void HUD::Item::draw_circle(float xoffs, float yoffs, float r) const
 {
     glBegin(GL_LINE_LOOP);
-    for (int i = 0; i < 25; i++) {
-        float alpha = i * 2.0 * SG_PI / 10.0;
+    float step = SG_PI / r;
+    for (float alpha = 0; alpha < SG_PI * 2.0; alpha += step) {
         float x = r * cos(alpha);
         float y = r * sin(alpha);
         glVertex2f(x + xoffs, y + yoffs);
diff --git a/src/Instrumentation/HUD/HUD_misc.cxx b/src/Instrumentation/HUD/HUD_misc.cxx
new file mode 100644 (file)
index 0000000..81c27f0
--- /dev/null
@@ -0,0 +1,59 @@
+// HUD_misc.cxx -- HUD miscellaneous elements
+//
+// Written by Melchior FRANZ, started September 2006.
+//
+// Copyright (C) 2006  Melchior FRANZ  [mfranz#aon:at]
+//
+// This program is free software; you can redistribute it and/or
+// 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
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+#include <simgear/props/condition.hxx>
+#include "HUD.hxx"
+
+
+// MIL-STD-1787B aiming reticle
+
+HUD::AimingReticle::AimingReticle(HUD *hud, const SGPropertyNode *n, float x, float y) :
+    Item(hud, n, x, y),
+    _active_condition(0),
+    _diameter(n->getNode("diameter-input", false)),
+    _bullet_size(_w / 3.0),
+    _inner_radius(_w)
+{
+    const SGPropertyNode *node = n->getNode("active-condition");
+    if (node)
+       _active_condition = sgReadCondition(globals->get_props(), node);
+}
+
+
+void HUD::AimingReticle::draw(void)
+{
+    bool active = _active_condition ? _active_condition->test() : true;
+    float diameter = _diameter.isValid() ? _diameter.getFloatValue() : 2.0f; // outer circle
+
+    Point centroid = get_centroid();
+    float x = centroid.x;
+    float y = centroid.y;
+
+    if (active) { // stadiametric (4.2.4.4)
+        draw_bullet(x, y, _bullet_size);
+        draw_circle(x, y, _inner_radius);
+        draw_circle(x, y, diameter * _inner_radius);
+
+    } else { // standby (4.2.4.5)
+        // TODO
+    }
+}
+
+
index 3042a958d04841af653500af5cf28e9b267d10f0..c9a059e3e4914cd23c6fa642e3d5e609a82f5a72 100644 (file)
@@ -8,6 +8,7 @@ libHUD_a_SOURCES = \
        HUD_instrument.cxx \
        HUD_label.cxx \
        HUD_ladder.cxx \
+       HUD_misc.cxx \
        HUD_runway.cxx \
        HUD_scale.cxx \
        HUD_tbi.cxx