Merge branch 'vivian/tachy' into next
This commit is contained in:
commit
658715f90b
3 changed files with 116 additions and 10 deletions
|
@ -357,6 +357,7 @@ protected:
|
||||||
void draw_stipple_line(float x1, float y1, float x2, float y2);
|
void draw_stipple_line(float x1, float y1, float x2, float y2);
|
||||||
void draw_text(float x, float y, const char *msg, int align = 0, int digit = 0);
|
void draw_text(float x, float y, const char *msg, int align = 0, int digit = 0);
|
||||||
void draw_circle(float x1, float y1, float r) const;
|
void draw_circle(float x1, float y1, float r) const;
|
||||||
|
void draw_arc(float x1, float y1, float t0, float t1, float r) const;
|
||||||
void draw_bullet(float, float, float);
|
void draw_bullet(float, float, float);
|
||||||
|
|
||||||
HUD *_hud;
|
HUD *_hud;
|
||||||
|
@ -610,9 +611,25 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SGSharedPtr<SGCondition> _active_condition; // stadiametric (true) or standby (false)
|
SGSharedPtr<SGCondition> _active_condition; // stadiametric (true) or standby (false)
|
||||||
|
SGSharedPtr<SGCondition> _tachy_condition; // tachymetric (true) or standby (false)
|
||||||
|
SGSharedPtr<SGCondition> _align_condition; // tachymetric (true) or standby (false)
|
||||||
|
|
||||||
Input _diameter; // inner/outer radius relation
|
Input _diameter; // inner/outer radius relation
|
||||||
|
Input _pitch;
|
||||||
|
Input _yaw;
|
||||||
|
Input _speed;
|
||||||
|
Input _range;
|
||||||
|
Input _t0;
|
||||||
|
Input _t1;
|
||||||
|
Input _offset_x;
|
||||||
|
Input _offset_y;
|
||||||
|
|
||||||
float _bullet_size;
|
float _bullet_size;
|
||||||
float _inner_radius;
|
float _inner_radius;
|
||||||
|
float _compression;
|
||||||
|
float _limit_x;
|
||||||
|
float _limit_y;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,20 @@ void HUD::Item::draw_circle(float xoffs, float yoffs, float r) const
|
||||||
glEnd();
|
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)
|
void HUD::Item::draw_bullet(float x, float y, float size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,38 +24,113 @@
|
||||||
|
|
||||||
#include "HUD.hxx"
|
#include "HUD.hxx"
|
||||||
|
|
||||||
|
|
||||||
// MIL-STD-1787B aiming reticle
|
// MIL-STD-1787B aiming reticle
|
||||||
|
|
||||||
HUD::AimingReticle::AimingReticle(HUD *hud, const SGPropertyNode *n, float x, float y) :
|
HUD::AimingReticle::AimingReticle(HUD *hud, const SGPropertyNode *n, float x, float y) :
|
||||||
Item(hud, n, x, y),
|
Item(hud, n, x, y),
|
||||||
_active_condition(0),
|
_pitch(n->getNode("pitch-input", false)),
|
||||||
_diameter(n->getNode("diameter-input", false)),
|
_yaw(n->getNode("yaw-input", false)),
|
||||||
_bullet_size(_w / 6.0),
|
_speed(n->getNode("speed-input", false)),
|
||||||
_inner_radius(_w / 2.0)
|
_range(n->getNode("range-input", false)),
|
||||||
|
_offset_x(n->getNode("offset-x-input", false)),
|
||||||
|
_offset_y(n->getNode("offset-y-input", false)),
|
||||||
|
_diameter(n->getNode("diameter-input", false)),
|
||||||
|
_t0(n->getNode("arc-start-input", false)),
|
||||||
|
_t1(n->getNode("arc-stop-input", false)),
|
||||||
|
_compression(n->getFloatValue("compression-factor")),
|
||||||
|
_limit_x(n->getFloatValue("limit-x")),
|
||||||
|
_limit_y(n->getFloatValue("limit-y")),
|
||||||
|
_active_condition(0),
|
||||||
|
_tachy_condition(0),
|
||||||
|
_align_condition(0),
|
||||||
|
_bullet_size(_w / 6.0),
|
||||||
|
_inner_radius(_w / 2.0)
|
||||||
|
|
||||||
{
|
{
|
||||||
const SGPropertyNode *node = n->getNode("active-condition");
|
const SGPropertyNode *node = n->getNode("active-condition");
|
||||||
if (node)
|
if (node)
|
||||||
_active_condition = sgReadCondition(globals->get_props(), node);
|
_active_condition = sgReadCondition(globals->get_props(), node);
|
||||||
|
|
||||||
|
const SGPropertyNode *tnode = n->getNode("tachy-condition");
|
||||||
|
if (tnode)
|
||||||
|
_tachy_condition = sgReadCondition(globals->get_props(), tnode);
|
||||||
|
|
||||||
|
const SGPropertyNode *anode = n->getNode("align-condition");
|
||||||
|
if (anode)
|
||||||
|
_align_condition = sgReadCondition(globals->get_props(), anode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void HUD::AimingReticle::draw(void)
|
void HUD::AimingReticle::draw(void)
|
||||||
{
|
{
|
||||||
bool active = _active_condition ? _active_condition->test() : true;
|
bool active = _active_condition ? _active_condition->test() : true;
|
||||||
float diameter = _diameter.isValid() ? _diameter.getFloatValue() : 2.0f; // outer circle
|
bool tachy = _tachy_condition ? _tachy_condition->test() : true;
|
||||||
|
bool align = _align_condition ? _align_condition->test() : true;
|
||||||
|
|
||||||
float x = _center_x;
|
float diameter = _diameter.isValid() ? _diameter.getFloatValue() : 2.0f; // outer circle
|
||||||
float y = _center_y;
|
float x = _center_x + _offset_x.getFloatValue();
|
||||||
|
float y = _center_y + _offset_y.getFloatValue();
|
||||||
|
|
||||||
|
float t0 = _t0.isValid() ? _t0.getFloatValue() : 2.0f; // start arc
|
||||||
|
float t1 = _t1.isValid() ? _t1.getFloatValue() : 2.0f; // start arc
|
||||||
|
|
||||||
|
float yaw_value = _yaw.getFloatValue();
|
||||||
|
float pitch_value = _pitch.getFloatValue();
|
||||||
|
float tof_value = _range.getFloatValue()* 3 / _speed.getFloatValue();
|
||||||
|
|
||||||
|
// SG_LOG(SG_INPUT, SG_ALERT, "HUD: compression" << _compression);
|
||||||
|
|
||||||
|
// SG_LOG(SG_INPUT, SG_ALERT, "HUD: limit_x" << _limit_x);
|
||||||
|
|
||||||
if (active) { // stadiametric (4.2.4.4)
|
if (active) { // stadiametric (4.2.4.4)
|
||||||
draw_bullet(x, y, _bullet_size);
|
draw_bullet(x, y, _bullet_size);
|
||||||
draw_circle(x, y, _inner_radius);
|
draw_circle(x, y, _inner_radius);
|
||||||
draw_circle(x, y, diameter * _inner_radius);
|
draw_circle(x, y, diameter * _inner_radius);
|
||||||
|
} else if (tachy){//tachiametric
|
||||||
|
draw_bullet(x, y, _bullet_size);
|
||||||
|
draw_circle(x, y, _inner_radius);
|
||||||
|
draw_line(x + _inner_radius, y, x + _inner_radius * 3, y);
|
||||||
|
draw_line(x - _inner_radius, y, x - _inner_radius * 3, y);
|
||||||
|
draw_line(x, y + _inner_radius, x, y + _inner_radius * 3);
|
||||||
|
draw_line(x, y - _inner_radius, x, y - _inner_radius * 3);
|
||||||
|
|
||||||
|
if(align){
|
||||||
|
draw_line(x + _limit_x, y + _limit_y, x - _limit_x, y + _limit_y);
|
||||||
|
draw_line(x + _limit_x, y - _limit_y, x - _limit_x, y - _limit_y);
|
||||||
|
draw_line(x + _limit_x, y + _limit_y, x + _limit_x, y - _limit_y);
|
||||||
|
draw_line(x - _limit_x, y + _limit_y, x - _limit_x, y - _limit_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float limit_offset = diameter * _inner_radius;
|
||||||
|
|
||||||
|
float pos_x = x + (yaw_value * tof_value)
|
||||||
|
* _compression;
|
||||||
|
|
||||||
|
pos_x > x + _limit_x - limit_offset ?
|
||||||
|
pos_x = x + _limit_x - limit_offset : pos_x;
|
||||||
|
|
||||||
|
pos_x < x - _limit_x + limit_offset ?
|
||||||
|
pos_x = x - _limit_x + limit_offset: pos_x;
|
||||||
|
|
||||||
|
float pos_y = y + (pitch_value * tof_value)
|
||||||
|
* _compression;
|
||||||
|
|
||||||
|
pos_y > y + _limit_y - limit_offset ?
|
||||||
|
pos_y = y + _limit_y - limit_offset : pos_y;
|
||||||
|
|
||||||
|
pos_y < y - _limit_y + limit_offset?
|
||||||
|
pos_y = y - _limit_y + limit_offset: pos_y;
|
||||||
|
|
||||||
|
// SG_LOG(SG_INPUT, SG_ALERT, "HUD: pos y" << pos_y);
|
||||||
|
|
||||||
|
draw_circle(pos_x, pos_y, diameter * _inner_radius);
|
||||||
|
|
||||||
|
draw_arc(x, y, t0, t1, (diameter + 2) * _inner_radius );
|
||||||
|
|
||||||
} else { // standby (4.2.4.5)
|
} else { // standby (4.2.4.5)
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue