globals->get_scenery()->get_scene_graph()->removeKid(aip.getSceneGraph());
}
if (props) {
- SGPropertyNode* parent = props->getParent();
- if (parent)
- parent->removeChild(props->getName(), props->getIndex(), false);
+ SGPropertyNode* parent = props->getParent();
+ if (parent)
+ parent->removeChild(props->getName(), props->getIndex(), false);
}
delete fp;
fp = 0;
void FGAIBase::readFromScenario(SGPropertyNode* scFileNode)
{
- if (!scFileNode)
- return;
+ if (!scFileNode)
+ return;
- setPath(scFileNode->getStringValue("model", "Models/Geometry/glider.ac"));
+ setPath(scFileNode->getStringValue("model", "Models/Geometry/glider.ac"));
- setHeading(scFileNode->getDoubleValue("heading", 0.0));
- setSpeed(scFileNode->getDoubleValue("speed", 0.0));
- setAltitude(scFileNode->getDoubleValue("altitude", 0.0));
- setLongitude(scFileNode->getDoubleValue("longitude", 0.0));
- setLatitude(scFileNode->getDoubleValue("latitude", 0.0));
- setBank(scFileNode->getDoubleValue("roll", 0.0));
+ setHeading(scFileNode->getDoubleValue("heading", 0.0));
+ setSpeed(scFileNode->getDoubleValue("speed", 0.0));
+ setAltitude(scFileNode->getDoubleValue("altitude", 0.0));
+ setLongitude(scFileNode->getDoubleValue("longitude", 0.0));
+ setLatitude(scFileNode->getDoubleValue("latitude", 0.0));
+ setBank(scFileNode->getDoubleValue("roll", 0.0));
}
void FGAIBase::update(double dt) {
- if (_otype == otStatic) return;
- if (_otype == otBallistic) CalculateMach();
+ if (_otype == otStatic)
+ return;
+ if (_otype == otBallistic)
+ CalculateMach();
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()*SGD_DEGREES_TO_RADIANS);
ft_per_deg_lon = 365228.16 * cos(pos.lat()*SGD_DEGREES_TO_RADIANS);
} else {
aip.setOrientation(roll, pitch, hdg);
}
- aip.update();
+ aip.update();
}
}
// Register that one at the scenery manager
globals->get_scenery()->register_placement_transform(aip.getTransform());
} else {
- if (!model_path.empty()) {
+ if (!model_path.empty()) {
SG_LOG(SG_INPUT, SG_WARN, "AIBase: Could not load model " << model_path);
}
- }
+ }
setDie(false);
}
-ssgBranch * FGAIBase::load3DModel(const string& fg_root,
- const string &path,
- SGPropertyNode *prop_root,
- double sim_time_sec)
+ssgBranch * FGAIBase::load3DModel(const string& fg_root,
+ const string &path,
+ SGPropertyNode *prop_root,
+ double sim_time_sec)
{
// some more code here to check whether a model with this name has already been loaded
- // if not load it, otherwise, get the memory pointer and do something like
+ // if not load it, otherwise, get the memory pointer and do something like
// SetModel as in ATC/AIEntity.cxx
model = manager->getModel(path);
- if (!(model))
- {
+ if (!(model)) {
model = sgLoad3DModel(fg_root,
- path,
- prop_root,
- sim_time_sec);
+ path,
+ prop_root,
+ sim_time_sec);
manager->setModel(path, model);
- }
-
+ }
+
return model;
}
bool FGAIBase::isa( object_type otype ) {
- if ( otype == _otype ) { return true; }
- else { return false; }
+ if ( otype == _otype )
+ return true;
+ else
+ return false;
}
props->tie("radar/elevation-deg", SGRawValuePointer<double>(&elevation));
props->tie("radar/range-nm", SGRawValuePointer<double>(&range));
props->tie("radar/h-offset", SGRawValuePointer<double>(&horiz_offset));
- props->tie("radar/v-offset", SGRawValuePointer<double>(&vert_offset));
+ props->tie("radar/v-offset", SGRawValuePointer<double>(&vert_offset));
props->tie("radar/x-shift", SGRawValuePointer<double>(&x_shift));
props->tie("radar/y-shift", SGRawValuePointer<double>(&y_shift));
props->tie("radar/rotation", SGRawValuePointer<double>(&rotation));
}
void FGAIBase::CalculateMach() {
- // Calculate rho at altitude, using standard atmosphere
- // For the temperature T and the pressure p,
-
- if (altitude < 36152) { // curve fits for the troposphere
- T = 59 - 0.00356 * altitude;
- p = 2116 * pow( ((T + 459.7) / 518.6) , 5.256);
-
- } else if ( 36152 < altitude && altitude < 82345 ) { // lower stratosphere
- T = -70;
- p = 473.1 * pow( e , 1.73 - (0.000048 * altitude) );
-
- } else { // upper stratosphere
- T = -205.05 + (0.00164 * altitude);
- p = 51.97 * pow( ((T + 459.7) / 389.98) , -11.388);
- }
-
- rho = p / (1718 * (T + 459.7));
-
- // calculate the speed of sound at altitude
- // a = sqrt ( g * R * (T + 459.7))
- // where:
- // a = speed of sound [ft/s]
- // g = specific heat ratio, which is usually equal to 1.4
- // R = specific gas constant, which equals 1716 ft-lb/slug/°R
-
- a = sqrt ( 1.4 * 1716 * (T + 459.7));
-
- // calculate Mach number
-
- Mach = speed/a;
-
- // cout << "Speed(ft/s) "<< speed <<" Altitude(ft) "<< altitude << " Mach " << Mach;
+ // Calculate rho at altitude, using standard atmosphere
+ // For the temperature T and the pressure p,
+
+ if (altitude < 36152) { // curve fits for the troposphere
+ T = 59 - 0.00356 * altitude;
+ p = 2116 * pow( ((T + 459.7) / 518.6) , 5.256);
+
+ } else if ( 36152 < altitude && altitude < 82345 ) { // lower stratosphere
+ T = -70;
+ p = 473.1 * pow( e , 1.73 - (0.000048 * altitude) );
+
+ } else { // upper stratosphere
+ T = -205.05 + (0.00164 * altitude);
+ p = 51.97 * pow( ((T + 459.7) / 389.98) , -11.388);
+ }
+
+ rho = p / (1718 * (T + 459.7));
+
+ // calculate the speed of sound at altitude
+ // a = sqrt ( g * R * (T + 459.7))
+ // where:
+ // a = speed of sound [ft/s]
+ // g = specific heat ratio, which is usually equal to 1.4
+ // R = specific gas constant, which equals 1716 ft-lb/slug/°R
+
+ a = sqrt ( 1.4 * 1716 * (T + 459.7));
+
+ // calculate Mach number
+
+ Mach = speed/a;
+
+ // cout << "Speed(ft/s) "<< speed <<" Altitude(ft) "<< altitude << " Mach " << Mach;
}
int FGAIBase::_newAIModelID() {
- static int id = 0;
- if (!++id) id++; // id = 0 is not allowed.
+ static int id = 0;
+ if (!++id)
+ id++; // id = 0 is not allowed.
return id;
}
void
wxRadarBg::update (double delta_time_sec)
{
- if( ! sim_init_done ) {
- if( ! fgGetBool("sim/sceneryloaded", false) )
+ if ( ! sim_init_done ) {
+ if ( ! fgGetBool("sim/sceneryloaded", false) )
return;
sim_init_done = true;
}
float range_nm = _Instrument->getFloatValue("range", 40.0);
float range_m = range_nm * SG_NM_TO_METER;
- if( last_switchKnob != switchKnob ) {
+ if ( last_switchKnob != switchKnob ) {
// since 3D models don't share textures with the rest of the world
// we must locate them and replace their handle by hand
// only do that when the instrument is turned on
- if( last_switchKnob == "off" )
+ if ( last_switchKnob == "off" )
odg->set_texture( odgauge_name, resultTexture->getHandle());
last_switchKnob = switchKnob;
}
FGViewer *current__view = globals->get_current_view();
- if( current__view->getInternal() &&
+ if ( current__view->getInternal() &&
(current__view->getHeadingOffset_deg() <= 15.0 || current__view->getHeadingOffset_deg() >= 345.0) &&
(current__view->getPitchOffset_deg() <= 15.0 || current__view->getPitchOffset_deg() >= 350.0) ) {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glBindTexture(GL_TEXTURE_2D, 0);
- if( switchKnob == "off" ) {
- _Instrument->setStringValue("status","");
- } else if( switchKnob == "stby" ) {
- _Instrument->setStringValue("status","STBY");
- } else if( switchKnob == "tst" ) {
- _Instrument->setStringValue("status","TST");
- // find something interesting to do...
- } else {
- string display_mode = _Instrument->getStringValue("display-mode", "arc");
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glBindTexture(GL_TEXTURE_2D, 0);
- // pretend we have a scan angle bigger then the FOV
- // TODO:check real fov, enlarge if < nn, and do clipping if > mm
- const float fovFactor = 1.45f;
- float view_heading = get_heading() * SG_DEGREES_TO_RADIANS;
- float range = 200.0f / range_nm;
- _Instrument->setStringValue("status", modeButton.c_str());
- if( display_mode == "arc" ) {
- glTranslatef(0.0f, -180.0f, 0.0f);
- range = 2*180.0f / range_nm;
- } else if( display_mode == "map" ) {
-// float view_heading = get_track() * SG_DEGREES_TO_RADIANS;
- } else if( display_mode == "plan" ) {
- // no sense I presume
- view_heading = 0;
- } else {
- // rose
- }
- range /= SG_NM_TO_METER;
- // we will rotate the echo quads, this gives a better rendering
- const float rot_x = cos ( view_heading );
- const float rot_y = sin ( view_heading );
+ if ( switchKnob == "off" ) {
+ _Instrument->setStringValue("status","");
+ } else if ( switchKnob == "stby" ) {
+ _Instrument->setStringValue("status","STBY");
+ } else if ( switchKnob == "tst" ) {
+ _Instrument->setStringValue("status","TST");
+ // find something interesting to do...
+ } else {
+ string display_mode = _Instrument->getStringValue("display-mode", "arc");
- list_of_SGWxRadarEcho *radarEcho = &radarEchoBuffer;
- list_of_SGWxRadarEcho::iterator iradarEcho;
- const float LWClevel[] = { 0.1f, 0.5f, 2.1f };
- const float symbolSize = 1.0f / 8.0f ;
- // draw the radar echo, we do that in 3 passes, one for each color level
- // this is to 'merge' same colors together
- glBindTexture(GL_TEXTURE_2D, wxEcho->getHandle() );
- glColor3f(1.0f, 1.0f, 1.0f);
- glBegin( GL_QUADS );
+ // pretend we have a scan angle bigger then the FOV
+ // TODO:check real fov, enlarge if < nn, and do clipping if > mm
+ const float fovFactor = 1.45f;
+ float view_heading = get_heading() * SG_DEGREES_TO_RADIANS;
+ float range = 200.0f / range_nm;
+ _Instrument->setStringValue("status", modeButton.c_str());
+ if ( display_mode == "arc" ) {
+ glTranslatef(0.0f, -180.0f, 0.0f);
+ range = 2*180.0f / range_nm;
+ } else if ( display_mode == "map" ) {
+// float view_heading = get_track() * SG_DEGREES_TO_RADIANS;
+ } else if ( display_mode == "plan" ) {
+ // no sense I presume
+ view_heading = 0;
+ } else {
+ // rose
+ }
+ range /= SG_NM_TO_METER;
+ // we will rotate the echo quads, this gives a better rendering
+ const float rot_x = cos ( view_heading );
+ const float rot_y = sin ( view_heading );
+
+ list_of_SGWxRadarEcho *radarEcho = &radarEchoBuffer;
+ list_of_SGWxRadarEcho::iterator iradarEcho;
+ const float LWClevel[] = { 0.1f, 0.5f, 2.1f };
+ const float symbolSize = 1.0f / 8.0f ;
+ // draw the radar echo, we do that in 3 passes, one for each color level
+ // this is to 'merge' same colors together
+ glBindTexture(GL_TEXTURE_2D, wxEcho->getHandle() );
+ glColor3f(1.0f, 1.0f, 1.0f);
+ glBegin( GL_QUADS );
- for(int level = 0; level <= 2 ; level++ ) {
- float col = level * symbolSize;
- for(iradarEcho = radarEcho->begin() ; iradarEcho != radarEcho->end() ; iradarEcho++ ) {
- int cloudId = (iradarEcho->cloudId) ;
- bool upgrade = ((cloudId >> 5) & 1);
- float lwc = iradarEcho->LWC + (upgrade ? 1.0f : 0.0f);
- // skip ns
- if( iradarEcho->LWC >= 0.5 && iradarEcho->LWC <= 0.6)
+ for (int level = 0; level <= 2 ; level++ ) {
+ float col = level * symbolSize;
+ for (iradarEcho = radarEcho->begin() ; iradarEcho != radarEcho->end() ; iradarEcho++ ) {
+ int cloudId = (iradarEcho->cloudId) ;
+ bool upgrade = ((cloudId >> 5) & 1);
+ float lwc = iradarEcho->LWC + (upgrade ? 1.0f : 0.0f);
+ // skip ns
+ if ( iradarEcho->LWC >= 0.5 && iradarEcho->LWC <= 0.6)
+ continue;
+ if ( (! iradarEcho->lightning) && ( lwc >= LWClevel[level]) ) {
+ float dist = sgSqrt( iradarEcho->dist );
+ float size = iradarEcho->radius * 2.0;
+ if ( dist - size > range_m )
continue;
- if( (! iradarEcho->lightning) && ( lwc >= LWClevel[level]) ) {
- float dist = sgSqrt( iradarEcho->dist );
- float size = iradarEcho->radius * 2.0;
- if( dist - size > range_m )
- continue;
- dist = dist * range;
- size = size * range;
- // compute the relative angle from the view direction
- float angle = ( view_heading + iradarEcho->heading );
- if( angle > SG_PI )
- angle -= 2.0*SG_PI;
- if( angle < - SG_PI )
- angle += 2.0*SG_PI;
- // and apply a fov factor to simulate a greater scan angle
- angle = angle * fovFactor + SG_PI / 2.0;
- float x = cos( angle ) * dist;
- float y = sin( angle ) * dist;
- // use different shapes so the display is less boring
- float row = symbolSize * (float) (4 + (cloudId & 3) );
- float size_x = rot_x * size;
- float size_y = rot_y * size;
+ dist = dist * range;
+ size = size * range;
+ // compute the relative angle from the view direction
+ float angle = ( view_heading + iradarEcho->heading );
+ if ( angle > SG_PI )
+ angle -= 2.0*SG_PI;
+ if ( angle < - SG_PI )
+ angle += 2.0*SG_PI;
+ // and apply a fov factor to simulate a greater scan angle
+ angle = angle * fovFactor + SG_PI / 2.0;
+ float x = cos( angle ) * dist;
+ float y = sin( angle ) * dist;
+ // use different shapes so the display is less boring
+ float row = symbolSize * (float) (4 + (cloudId & 3) );
+ float size_x = rot_x * size;
+ float size_y = rot_y * size;
+ glTexCoord2f( col, row);
+ glVertex2f( x - size_x, y - size_y);
+ glTexCoord2f( col+symbolSize, row);
+ glVertex2f( x + size_y, y - size_x);
+ glTexCoord2f( col+symbolSize, row+symbolSize);
+ glVertex2f( x + size_x, y + size_y);
+ glTexCoord2f( col, row+symbolSize);
+ glVertex2f( x - size_y, y + size_x);
+ }
+ }
+ }
+ glEnd(); // GL_QUADS
+
+ // draw lightning echos
+ if ( drawLightning ) {
+ float col = 3 * symbolSize;
+ float row = 4 * symbolSize;
+ for (iradarEcho = radarEcho->begin() ; iradarEcho != radarEcho->end() ; iradarEcho++ ) {
+ if ( iradarEcho->lightning ) {
+ float dist = iradarEcho->dist;
+ dist = dist * range;
+ float angle = (view_heading - iradarEcho->heading);
+ if ( angle > SG_PI )
+ angle -= 2.0*SG_PI;
+ if ( angle < - SG_PI )
+ angle += 2.0*SG_PI;
+ angle = angle * fovFactor - SG_PI / 2.0;
+ float x = cos( angle ) * dist;
+ float y = sin( angle ) * dist;
+ glColor3f(1.0f, 1.0f, 1.0f);
+ float size = symbolSize * 0.5f;
+ glBegin( GL_QUADS );
glTexCoord2f( col, row);
- glVertex2f( x - size_x, y - size_y);
+ glVertex2f( x - size, y - size);
glTexCoord2f( col+symbolSize, row);
- glVertex2f( x + size_y, y - size_x);
+ glVertex2f( x + size, y - size);
glTexCoord2f( col+symbolSize, row+symbolSize);
- glVertex2f( x + size_x, y + size_y);
+ glVertex2f( x + size, y + size);
glTexCoord2f( col, row+symbolSize);
- glVertex2f( x - size_y, y + size_x);
- }
+ glVertex2f( x - size, y + size);
+ glEnd();
}
}
- glEnd(); // GL_QUADS
+ }
+ // erase what is out of sight of antenna
+ /*
+ |\ /|
+ | \ / |
+ | \ / |
+ ---------
+ | |
+ | |
+ ---------
+ */
+ float yOffset = 180.0f, xOffset = 256.0f;
- // draw lightning echos
- if( drawLightning ) {
- float col = 3 * symbolSize;
- float row = 4 * symbolSize;
- for(iradarEcho = radarEcho->begin() ; iradarEcho != radarEcho->end() ; iradarEcho++ ) {
- if( iradarEcho->lightning ) {
- float dist = iradarEcho->dist;
- dist = dist * range;
- float angle = (view_heading - iradarEcho->heading);
- if( angle > SG_PI )
- angle -= 2.0*SG_PI;
- if( angle < - SG_PI )
- angle += 2.0*SG_PI;
- angle = angle * fovFactor - SG_PI / 2.0;
- float x = cos( angle ) * dist;
- float y = sin( angle ) * dist;
- glColor3f(1.0f, 1.0f, 1.0f);
- float size = symbolSize * 0.5f;
- glBegin( GL_QUADS );
- glTexCoord2f( col, row);
- glVertex2f( x - size, y - size);
- glTexCoord2f( col+symbolSize, row);
- glVertex2f( x + size, y - size);
- glTexCoord2f( col+symbolSize, row+symbolSize);
- glVertex2f( x + size, y + size);
- glTexCoord2f( col, row+symbolSize);
- glVertex2f( x - size, y + size);
- glEnd();
- }
- }
- }
- // erase what is out of sight of antenna
- /*
- |\ /|
- | \ / |
- | \ / |
- ---------
- | |
- | |
- ---------
- */
- float yOffset = 180.0f, xOffset = 256.0f;
-
- if( display_mode != "arc" ) {
- yOffset = 40.0f;
- xOffset = 240.0f;
- }
-
- if ( display_mode != "plan" ) {
- glDisable(GL_BLEND);
- glColor4f(1.0f, 0.0f, 0.0f, 0.01f);
+ if ( display_mode != "arc" ) {
+ yOffset = 40.0f;
+ xOffset = 240.0f;
+ }
+
+ if ( display_mode != "plan" ) {
+ glDisable(GL_BLEND);
+ glColor4f(1.0f, 0.0f, 0.0f, 0.01f);
glBegin( GL_QUADS );
- glTexCoord2f( 0.5f, 0.25f);
- glVertex2f(-xOffset, 0.0 + yOffset);
- glTexCoord2f( 1.0f, 0.25f);
- glVertex2f(xOffset, 0.0 + yOffset);
- glTexCoord2f( 1.0f, 0.5f);
- glVertex2f(xOffset, 256.0 + yOffset);
- glTexCoord2f( 0.5f, 0.5f);
- glVertex2f(-xOffset, 256.0 + yOffset);
+ glTexCoord2f( 0.5f, 0.25f);
+ glVertex2f(-xOffset, 0.0 + yOffset);
+ glTexCoord2f( 1.0f, 0.25f);
+ glVertex2f(xOffset, 0.0 + yOffset);
+ glTexCoord2f( 1.0f, 0.5f);
+ glVertex2f(xOffset, 256.0 + yOffset);
+ glTexCoord2f( 0.5f, 0.5f);
+ glVertex2f(-xOffset, 256.0 + yOffset);
glEnd();
glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
-// glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
+// glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glDisable(GL_ALPHA_TEST);
glBindTexture(GL_TEXTURE_2D, 0);
glBegin( GL_TRIANGLES );
- glVertex2f(0.0, 0.0);
- glVertex2f(-256.0, 0.0);
- glVertex2f(-256.0, 256.0 * tan(30*SG_DEGREES_TO_RADIANS));
+ glVertex2f(0.0, 0.0);
+ glVertex2f(-256.0, 0.0);
+ glVertex2f(-256.0, 256.0 * tan(30*SG_DEGREES_TO_RADIANS));
- glVertex2f(0.0, 0.0);
- glVertex2f(256.0, 0.0);
- glVertex2f(256.0, 256.0 * tan(30*SG_DEGREES_TO_RADIANS));
+ glVertex2f(0.0, 0.0);
+ glVertex2f(256.0, 0.0);
+ glVertex2f(256.0, 256.0 * tan(30*SG_DEGREES_TO_RADIANS));
- glVertex2f(-256, 0.0);
- glVertex2f(256.0, 0.0);
- glVertex2f(-256.0, -256.0);
+ glVertex2f(-256, 0.0);
+ glVertex2f(256.0, 0.0);
+ glVertex2f(-256.0, -256.0);
- glVertex2f(256, 0.0);
- glVertex2f(256.0, -256.0);
- glVertex2f(-256.0, -256.0);
+ glVertex2f(256, 0.0);
+ glVertex2f(256.0, -256.0);
+ glVertex2f(-256.0, -256.0);
glEnd();
- }
+ }
- // DEBUG only
-/* glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
- glBegin( GL_LINES );
- glVertex2f(0.0, 0.0);
- glVertex2f(-256.0, 256.0);
- glVertex2f(0.0, 0.0);
- glVertex2f(256.0, 256.0);
- glEnd();*/
+ // DEBUG only
+/* glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+ glBegin( GL_LINES );
+ glVertex2f(0.0, 0.0);
+ glVertex2f(-256.0, 256.0);
+ glVertex2f(0.0, 0.0);
+ glVertex2f(256.0, 256.0);
+ glEnd();*/
- glEnable(GL_BLEND);
- glEnable(GL_ALPHA_TEST);
- }
+ glEnable(GL_BLEND);
+ glEnable(GL_ALPHA_TEST);
+ }
glPopMatrix();
odg->endCapture( resultTexture->getHandle() );
}