// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
#include <simgear/math/SGLimits.hxx>
-#include <simgear/props/condition.hxx>
#include "HUD.hxx"
if (node)
_condition = sgReadCondition(globals->get_props(), node);
- _scrn_pos.left = n->getIntValue("x") + x;
- _scrn_pos.top = n->getIntValue("y") + y;
- _scrn_pos.right = n->getIntValue("width");
- _scrn_pos.bottom = n->getIntValue("height");
+ _x = n->getFloatValue("x") + x;
+ _y = n->getFloatValue("y") + y;
+ _w = n->getFloatValue("width");
+ _h = n->getFloatValue("height");
vector<SGPropertyNode_ptr> opt = n->getChildren("option");
for (unsigned int i = 0; i < opt.size(); i++) {
const char *o = opt[i]->getStringValue();
- if (!strcmp(o, "autoticks"))
- _options |= AUTOTICKS;
- else if (!strcmp(o, "vertical"))
- _options |= VERT;
+ if (!strcmp(o, "vertical"))
+ _options |= VERTICAL;
else if (!strcmp(o, "horizontal"))
- _options |= HORZ;
+ _options |= HORIZONTAL;
else if (!strcmp(o, "top"))
_options |= TOP;
else if (!strcmp(o, "left"))
_options |= (LEFT|RIGHT);
else if (!strcmp(o, "noticks"))
_options |= NOTICKS;
- else if (!strcmp(o, "arithtic"))
- _options |= ARITHTIC;
- else if (!strcmp(o, "decitics"))
- _options |= DECITICS;
else if (!strcmp(o, "notext"))
_options |= NOTEXT;
else
// Set up convenience values for centroid of the box and
// the span values according to orientation
- if (_options & VERT) {
- _scr_span = _scrn_pos.bottom;
+ if (_options & VERTICAL) {
+ _scr_span = _h;
} else {
- _scr_span = _scrn_pos.right;
+ _scr_span = _w;
}
- _mid_span.x = _scrn_pos.left + _scrn_pos.right / 2.0;
- _mid_span.y = _scrn_pos.top + _scrn_pos.bottom / 2.0;
+ _center_x = _x + _w / 2.0;
+ _center_y = _y + _h / 2.0;
}
bool HUD::Item::isEnabled()
{
- if (!_condition)
- return true;
+ return _condition ? _condition->test() : true;
+}
+
+
+void HUD::Item::draw_line(float x1, float y1, float x2, float y2)
+{
+ _hud->_line_list.add(LineSegment(x1, y1, x2, y2));
+}
+
+
+void HUD::Item::draw_stipple_line(float x1, float y1, float x2, float y2)
+{
+ _hud->_stipple_line_list.add(LineSegment(x1, y1, x2, y2));
+}
+
+
+void HUD::Item::draw_text(float x, float y, const char *msg, int align, int digit)
+{
+ _hud->_text_list.add(x, y, msg, align, digit);
+}
+
+
+void HUD::Item::draw_circle(float xoffs, float yoffs, float r) const
+{
+ glBegin(GL_LINE_LOOP);
+ 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);
+ }
+ glEnd();
+}
+
+void HUD::Item::draw_arc(float xoffs, float yoffs, float t0, float t1, float r) const
+{
+ glBegin(GL_LINE_STRIP);
+ float step = SG_PI / r;
+ t0 = t0 * SG_DEGREES_TO_RADIANS;
+ t1 = t1 * SG_DEGREES_TO_RADIANS;
+
+ for (float alpha = t0; alpha < t1; alpha += step) {
+ float x = r * cos(alpha);
+ float y = r * sin(alpha);
+ glVertex2f(x + xoffs, y + yoffs);
+ }
+ glEnd();
+}
+
+void HUD::Item::draw_bullet(float x, float y, float size)
+{
+ glEnable(GL_POINT_SMOOTH);
+ glPointSize(size);
+
+ glBegin(GL_POINTS);
+ glVertex2f(x, y);
+ glEnd();
+
+ glPointSize(1.0);
+ glDisable(GL_POINT_SMOOTH);
+}
- return _condition->test();
+
+// make sure the format matches '[ -+#]?\d*(\.\d*)?(l?[df]|s)'
+//
+HUD::Item::Format HUD::Item::check_format(const char *f) const
+{
+ bool l = false;
+ Format fmt = STRING;
+
+ for (; *f; f++) {
+ if (*f == '%') {
+ if (f[1] == '%')
+ f++;
+ else
+ break;
+ }
+ }
+ if (*f++ != '%')
+ return NONE;
+ if (*f == ' ' || *f == '+' || *f == '-' || *f == '#')
+ f++;
+ while (*f && isdigit(*f))
+ f++;
+ if (*f == '.') {
+ f++;
+ while (*f && isdigit(*f))
+ f++;
+ }
+ if (*f == 'l')
+ l = true, f++;
+
+ if (*f == 'd')
+ fmt = l ? LONG : INT;
+ else if (*f == 'f')
+ fmt = l ? DOUBLE : FLOAT;
+ else if (*f == 's') {
+ if (l)
+ return INVALID;
+ fmt = STRING;
+ } else
+ return INVALID;
+
+ for (++f; *f; f++) {
+ if (*f == '%') {
+ if (f[1] == '%')
+ f++;
+ else
+ return INVALID;
+ }
+ }
+ return fmt;
}