typedef radar_list_type::const_iterator radar_list_const_iterator;
-// texture name to use in 2D and 3D instruments
-static const char *ODGAUGE_NAME = "Aircraft/Instruments/Textures/od_wxradar.rgb";
static const float UNIT = 1.0f / 8.0f; // 8 symbols in a row/column in the texture
_Instrument = fgGetNode(branch.c_str(), _num, true );
_serviceable_node = _Instrument->getNode("serviceable", true);
- _resultTexture = FGTextureManager::createTexture( ODGAUGE_NAME );
+
+ // texture name to use in 2D and 3D instruments
+ _texture_path = _Instrument->getStringValue("radar-texture-path",
+ "Aircraft/Instruments/Textures/od_wxradar.rgb");
+ _resultTexture = FGTextureManager::createTexture(_texture_path.c_str());
SGPath tpath(globals->get_fg_root());
string path = _Instrument->getStringValue("echo-texture-path",
_radar_mode_control_node = _Instrument->getNode("mode-control", true);
_radar_coverage_node = _Instrument->getNode("limit-deg", true);
_radar_ref_rng_node = _Instrument->getNode("reference-range-nm", true);
+ _radar_hdg_marker_node = _Instrument->getNode("heading-marker", true);
SGPropertyNode *n = _Instrument->getNode("display-controls", true);
_radar_weather_node = n->getNode("WX", true);
_radar_coverage_node->setFloatValue(120);
if (_radar_ref_rng_node->getType() == SGPropertyNode::NONE)
_radar_ref_rng_node->setDoubleValue(35);
+ if (_radar_hdg_marker_node->getType() == SGPropertyNode::NONE)
+ _radar_hdg_marker_node->setBoolValue(true);
_x_offset = 0;
_y_offset = 0;
_radarGeode = new osg::Geode;
osg::StateSet* stateSet = _radarGeode->getOrCreateStateSet();
stateSet->setTextureAttributeAndModes(0, _wxEcho.get());
- osg::Geometry* geom = new osg::Geometry;
- geom->setUseDisplayList(false);
+ _geom = new osg::Geometry;
+ _geom->setUseDisplayList(false);
// Initially allocate space for 128 quads
- osg::Vec2Array* vertices = new osg::Vec2Array;
- vertices->setDataVariance(osg::Object::DYNAMIC);
- vertices->reserve(128 * 4);
- geom->setVertexArray(vertices);
- osg::Vec2Array* texCoords = new osg::Vec2Array;
- texCoords->setDataVariance(osg::Object::DYNAMIC);
- texCoords->reserve(128 * 4);
- geom->setTexCoordArray(0, texCoords);
+ _vertices = new osg::Vec2Array;
+ _vertices->setDataVariance(osg::Object::DYNAMIC);
+ _vertices->reserve(128 * 4);
+ _geom->setVertexArray(_vertices);
+ _texCoords = new osg::Vec2Array;
+ _texCoords->setDataVariance(osg::Object::DYNAMIC);
+ _texCoords->reserve(128 * 4);
+ _geom->setTexCoordArray(0, _texCoords);
osg::Vec3Array* colors = new osg::Vec3Array;
colors->push_back(osg::Vec3(1.0f, 1.0f, 1.0f)); // color of echos
colors->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)); // arc mask
colors->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); // rest of mask
- geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
- geom->setColorArray(colors);
+ _geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
+ _geom->setColorArray(colors);
osg::PrimitiveSet* pset = new osg::DrawArrays(osg::PrimitiveSet::QUADS);
pset->setDataVariance(osg::Object::DYNAMIC);
- geom->addPrimitiveSet(pset);
+ _geom->addPrimitiveSet(pset);
pset = new osg::DrawArrays(osg::PrimitiveSet::QUADS);
pset->setDataVariance(osg::Object::DYNAMIC);
- geom->addPrimitiveSet(pset);
+ _geom->addPrimitiveSet(pset);
pset = new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES);
pset->setDataVariance(osg::Object::DYNAMIC);
- geom->addPrimitiveSet(pset);
- geom->setInitialBound(osg::BoundingBox(osg::Vec3f(-256.0f, -256.0f, 0.0f),
+ _geom->addPrimitiveSet(pset);
+ _geom->setInitialBound(osg::BoundingBox(osg::Vec3f(-256.0f, -256.0f, 0.0f),
osg::Vec3f(256.0f, 256.0f, 0.0f)));
- _radarGeode->addDrawable(geom);
+ _radarGeode->addDrawable(_geom);
_odg->allocRT();
// Texture in the 2D panel system
- FGTextureManager::addTexture(ODGAUGE_NAME, _odg->getTexture());
+ FGTextureManager::addTexture(_texture_path.c_str(), _odg->getTexture());
osg::Camera* camera = _odg->getCamera();
camera->addChild(_radarGeode.get());
-
- _geom = static_cast<osg::Geometry*>(_radarGeode->getDrawable(0));
- _vertices = static_cast<osg::Vec2Array*>(_geom->getVertexArray());
- _texCoords = static_cast<osg::Vec2Array*>(_geom->getTexCoordArray(0));
}
// we must locate them and replace their handle by hand
// only do that when the instrument is turned on
//if ( _last_switchKnob == "off" )
- //_odg->set_texture( ODGAUGE_NAME, _resultTexture->getHandle());
+ //_odg->set_texture(_texture_path.c_str(), _resultTexture->getHandle());
+
_last_switchKnob = switchKnob;
}
_texCoords->push_back(osg::Vec2f(0.5f, 0.5f));
_vertices->push_back(osg::Vec2f(-xOffset, 256.0 + yOffset));
maskPSet->set(osg::PrimitiveSet::QUADS, firstQuadVert, 4);
+
// The triangles aren't supposed to be textured, but there's
// no need to set up a different Geometry, switch modes,
// etc. I happen to know that there's a white pixel in the
// texture at 1.0, 0.0 :)
float centerY = tan(30 * SG_DEGREES_TO_RADIANS);
- const osg::Vec2f whiteSpot(1.0f, 0.0f);
_vertices->push_back(osg::Vec2f(0.0, 0.0));
_vertices->push_back(osg::Vec2f(-256.0, 0.0));
_vertices->push_back(osg::Vec2f(-256.0, 256.0 * centerY));
_vertices->push_back(osg::Vec2f(256.0, -256.0));
_vertices->push_back(osg::Vec2f(-256.0, -256.0));
+ const osg::Vec2f whiteSpot(1.0f, 0.0f);
for (int i = 0; i < 3 * 4; i++)
_texCoords->push_back(whiteSpot);
void
wxRadarBg::update_heading_marker()
{
-/*
- float angle = _view_heading + _angle_offset;
-
- float x = sin(angle);
- float y = cos(angle);
- float s_rot_x = sin(angle + SGD_PI_4);
- float s_rot_y = cos(angle + SGD_PI_4);
-
- float size = UNIT * 500;
-*/
+ if (!_radar_hdg_marker_node->getBoolValue())
+ return;
const osg::Vec2f texBase(2 * UNIT, 3 * UNIT);
float size = 600 * UNIT;
osg::Matrixf m(osg::Matrixf::scale(size, size, 1.0f)
* wxRotate(_view_heading + _angle_offset));
- if (_display_mode == MAP) {
- //cout << "Map Mode " << range << endl;
-// m *= osg::Matrixf::translate(_scale, _scale, 0.0f);
- }
-
m *= _centerTrans;
addQuad(_vertices, _texCoords, m, texBase);
void
wxRadarBg::apply_map_offset()
{
- if (_display_mode != MAP)
- return;
double lat = _user_lat_node->getDoubleValue();
double lon = _user_lon_node->getDoubleValue();
double bearing, distance, az2;