From a5125b6124e97d893910b17f8d95ec9cc6d6e47d Mon Sep 17 00:00:00 2001 From: mfranz Date: Sat, 22 Jul 2006 08:00:56 +0000 Subject: [PATCH] add MIL-STD-1787B Aiming Reticle (stadiametric; TODO: standby) --- src/Instrumentation/HUD/HUD.cxx | 2 + src/Instrumentation/HUD/HUD.hxx | 20 ++++++++ src/Instrumentation/HUD/HUD_instrument.cxx | 4 +- src/Instrumentation/HUD/HUD_misc.cxx | 59 ++++++++++++++++++++++ src/Instrumentation/HUD/Makefile.am | 1 + 5 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/Instrumentation/HUD/HUD_misc.cxx diff --git a/src/Instrumentation/HUD/HUD.cxx b/src/Instrumentation/HUD/HUD.cxx index 8e9143d97..aeed80e11 100644 --- a/src/Instrumentation/HUD/HUD.cxx +++ b/src/Instrumentation/HUD/HUD.cxx @@ -379,6 +379,8 @@ int HUD::load(const char *file, float x, float y, int level, const string& inden item = static_cast(new Ladder(this, n, x, y)); } else if (!strcmp(name, "runway")) { item = static_cast(new Runway(this, n, x, y)); + } else if (!strcmp(name, "aiming-reticle")) { + item = static_cast(new AimingReticle(this, n, x, y)); } else { SG_LOG(SG_INPUT, TREE, indent << " \\...unsupported!"); continue; diff --git a/src/Instrumentation/HUD/HUD.hxx b/src/Instrumentation/HUD/HUD.hxx index 1a6a72a0c..b67aab716 100644 --- a/src/Instrumentation/HUD/HUD.hxx +++ b/src/Instrumentation/HUD/HUD.hxx @@ -261,6 +261,7 @@ private: class TurnBankIndicator; class Ladder; class Runway; + class AimingReticle; deque _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 diff --git a/src/Instrumentation/HUD/HUD_instrument.cxx b/src/Instrumentation/HUD/HUD_instrument.cxx index 50e5731ce..e68781f76 100644 --- a/src/Instrumentation/HUD/HUD_instrument.cxx +++ b/src/Instrumentation/HUD/HUD_instrument.cxx @@ -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 index 000000000..81c27f0b5 --- /dev/null +++ b/src/Instrumentation/HUD/HUD_misc.cxx @@ -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 +#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 + } +} + + diff --git a/src/Instrumentation/HUD/Makefile.am b/src/Instrumentation/HUD/Makefile.am index 3042a958d..c9a059e3e 100644 --- a/src/Instrumentation/HUD/Makefile.am +++ b/src/Instrumentation/HUD/Makefile.am @@ -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