-
-void FGAICarrier::mark_nohot(ssgEntity* e) {
- if (e->isAKindOf(ssgTypeBranch())) {
- ssgBranch* br = (ssgBranch*)e;
- ssgEntity* kid;
- for ( kid = br->getKid(0); kid != NULL ; kid = br->getNextKid() )
- mark_nohot(kid);
-
- br->clrTraversalMaskBits(SSGTRAV_HOT);
-
- } else if (e->isAKindOf(ssgTypeLeaf())) {
-
- e->clrTraversalMaskBits(SSGTRAV_HOT);
- }
-}
-
-
-bool FGAICarrier::mark_wires(ssgEntity* e, const list<string>& wire_objects, bool mark) {
- bool found = false;
- if (e->isAKindOf(ssgTypeBranch())) {
- ssgBranch* br = (ssgBranch*)e;
- ssgEntity* kid;
-
- list<string>::const_iterator it;
- for (it = wire_objects.begin(); it != wire_objects.end(); ++it)
- mark = mark || (e->getName() && (*it) == e->getName());
-
- for ( kid = br->getKid(0); kid != NULL ; kid = br->getNextKid() )
- found = mark_wires(kid, wire_objects, mark) || found;
-
- if (found)
- br->setTraversalMaskBits(SSGTRAV_HOT);
-
- } else if (e->isAKindOf(ssgTypeLeaf())) {
- list<string>::const_iterator it;
- for (it = wire_objects.begin(); it != wire_objects.end(); ++it) {
- if (mark || (e->getName() && (*it) == e->getName())) {
- e->setTraversalMaskBits(SSGTRAV_HOT);
- ssgBase* ud = e->getUserData();
- if (ud) {
- FGAICarrierHardware* ch = dynamic_cast<FGAICarrierHardware*>(ud);
- if (ch) {
- SG_LOG(SG_GENERAL, SG_WARN,
- "AICarrier: Carrier hardware gets marked twice!\n"
- " You have probably a whole branch marked as"
- " a wire which also includes other carrier hardware.");
- } else {
- SG_LOG(SG_GENERAL, SG_ALERT,
- "AICarrier: Found user data attached to a leaf node which "
- "should be marked as a wire!\n ****Skipping!****");
- }
- } else {
- e->setUserData( FGAICarrierHardware::newWire( this ) );
- ssgLeaf *l = (ssgLeaf*)e;
- if ( l->getNumLines() != 1 ) {
- SG_LOG(SG_GENERAL, SG_ALERT,
- "AICarrier: Found wires not modeled with exactly one line!");
- }
- found = true;
- }
- }
- }
- }
- return found;
-}
-
-
-bool FGAICarrier::mark_solid(ssgEntity* e, const list<string>& solid_objects, bool mark) {
- bool found = false;
- if (e->isAKindOf(ssgTypeBranch())) {
- ssgBranch* br = (ssgBranch*)e;
- ssgEntity* kid;
-
- list<string>::const_iterator it;
- for (it = solid_objects.begin(); it != solid_objects.end(); ++it)
- mark = mark || (e->getName() && (*it) == e->getName());
-
- for ( kid = br->getKid(0); kid != NULL ; kid = br->getNextKid() )
- found = mark_solid(kid, solid_objects, mark) || found;
-
- if (found)
- br->setTraversalMaskBits(SSGTRAV_HOT);
-
- } else if (e->isAKindOf(ssgTypeLeaf())) {
- list<string>::const_iterator it;
- for (it = solid_objects.begin(); it != solid_objects.end(); ++it) {
- if (mark || (e->getName() && (*it) == e->getName())) {
- e->setTraversalMaskBits(SSGTRAV_HOT);
- ssgBase* ud = e->getUserData();
-
- if (ud) {
- FGAICarrierHardware* ch = dynamic_cast<FGAICarrierHardware*>(ud);
- if (ch) {
- SG_LOG(SG_GENERAL, SG_WARN,
- "AICarrier: Carrier hardware gets marked twice!\n"
- " You have probably a whole branch marked solid"
- " which also includes other carrier hardware.");
- } else {
- SG_LOG(SG_GENERAL, SG_ALERT,
- "AICarrier: Found user data attached to a leaf node which "
- "should be marked solid!\n ****Skipping!****");
- }
- } else {
- e->setUserData( FGAICarrierHardware::newSolid( this ) );
- found = true;
- }
- }
- }
- }
- return found;
-}
-
-
-bool FGAICarrier::mark_cat(ssgEntity* e, const list<string>& cat_objects, bool mark) {
- bool found = false;
- if (e->isAKindOf(ssgTypeBranch())) {
- ssgBranch* br = (ssgBranch*)e;
- ssgEntity* kid;
-
- list<string>::const_iterator it;
- for (it = cat_objects.begin(); it != cat_objects.end(); ++it)
- mark = mark || (e->getName() && (*it) == e->getName());
-
- for ( kid = br->getKid(0); kid != NULL ; kid = br->getNextKid() )
- found = mark_cat(kid, cat_objects, mark) || found;
-
- if (found)
- br->setTraversalMaskBits(SSGTRAV_HOT);
-
- } else if (e->isAKindOf(ssgTypeLeaf())) {
- list<string>::const_iterator it;
- for (it = cat_objects.begin(); it != cat_objects.end(); ++it) {
- if (mark || (e->getName() && (*it) == e->getName())) {
- e->setTraversalMaskBits(SSGTRAV_HOT);
- ssgBase* ud = e->getUserData();
- if (ud) {
- FGAICarrierHardware* ch = dynamic_cast<FGAICarrierHardware*>(ud);
- if (ch) {
- SG_LOG(SG_GENERAL, SG_WARN,
- "AICarrier: Carrier hardware gets marked twice!\n"
- "You have probably a whole branch marked as"
- "a catapult which also includes other carrier hardware.");
- } else {
- SG_LOG(SG_GENERAL, SG_ALERT,
- "AICarrier: Found user data attached to a leaf node which "
- "should be marked as a catapult!\n ****Skipping!****");
- }
- } else {
- e->setUserData( FGAICarrierHardware::newCatapult( this ) );
- ssgLeaf *l = (ssgLeaf*)e;
- if ( l->getNumLines() != 1 ) {
- SG_LOG(SG_GENERAL, SG_ALERT,
- "AICarrier: Found a cat not modeled with exactly "
- "one line!");
- } else {
- // Now some special code to make sure the cat points in the right
- // direction. The 0 index must be the backward end, the 1 index
- // the forward end.
- // Forward is positive x-direction in our 3D model, also the model
- // as such is flattened when it is loaded, so we do not need to
- // care for transforms ...
- short v[2];
- l->getLine(0, v, v+1 );
- sgVec3 ends[2];
- for (int k=0; k<2; ++k)
- sgCopyVec3( ends[k], l->getVertex( v[k] ) );
-
- // When the 1 end is behind the 0 end, swap the coordinates.
- if (ends[0][0] < ends[1][0]) {
- sgCopyVec3( l->getVertex( v[0] ), ends[1] );
- sgCopyVec3( l->getVertex( v[1] ), ends[0] );
- }
- found = true;
- }
- }
- }
- }
- }
- return found;
-}
-
-
-void FGAICarrier::UpdateFlols(const sgdMat3& trans) {
-
- float in[3];
- float out[3];
-
- double flolsXYZ[3], eyeXYZ[3];
- double lat, lon, alt;
- Point3D eyepos;
- Point3D flolspos;
-
-/* cout << "x_offset " << flols_x_offset
- << " y_offset " << flols_y_offset
- << " z_offset " << flols_z_offset << endl;
-
- cout << "roll " << roll
- << " heading " << hdg
- << " pitch " << pitch << endl;
-
- cout << "carrier lon " << pos[0]
- << " lat " << pos[1]
- << " alt " << pos[2] << endl;
-*/
-
- // set the Flols initial position to the carrier position
-
- flolspos = pos;
-
-/* cout << "flols lon " << flolspos[0]
- << " lat " << flolspos[1]
- << " alt " << flolspos[2] << endl;
-
- // set the offsets in metres
-
- cout << "flols_x_offset " << flols_x_offset << endl
- << "flols_y_offset " << flols_y_offset << endl
- << "flols_z_offset " << flols_z_offset << endl;
-*/
-
- in[0] = flols_off.x();
- in[1] = flols_off.y();
- in[2] = flols_off.z();
-
- // multiply the input and transform matrices
- out[0] = in[0] * trans[0][0] + in[1] * trans[0][1] + in[2] * trans[0][2];
- out[1] = in[0] * trans[1][0] + in[1] * trans[1][1] + in[2] * trans[1][2];
- out[2] = in[0] * trans[2][0] + in[1] * trans[2][1] + in[2] * trans[2][2];
-
- // convert meters to ft to degrees of latitude
- out[0] = (out[0] * 3.28083989501) /
- (366468.96 - 3717.12 * cos(flolspos[0] * SG_DEGREES_TO_RADIANS));
-
- // convert meters to ft to degrees of longitude
- out[1] = (out[1] * 3.28083989501) /
- (365228.16 * cos(flolspos[1] * SG_DEGREES_TO_RADIANS));
-
-/* cout << "lat adjust deg" << out[0]
- << " lon adjust deg " << out[1]
- << " alt adjust m " << out[2] << endl;
-*/
-
- // adjust Flols position
- flolspos[0] += out[0];
- flolspos[1] += out[1];
- flolspos[2] += out[2];
-
- // convert flols position to cartesian co-ordinates
- sgGeodToCart(flolspos[1] * SG_DEGREES_TO_RADIANS,
- flolspos[0] * SG_DEGREES_TO_RADIANS,
- flolspos[2] , flolsXYZ );
-
-
-/* cout << "flols X " << flolsXYZ[0]
- << " Y " << flolsXYZ[1]
- << " Z " << flolsXYZ[2] << endl;
-
- // check the conversion
-
- sgCartToGeod(flolsXYZ, &lat, &lon, &alt);
-
- cout << "flols check lon " << lon
- << " lat " << lat
- << " alt " << alt << endl;
-*/
-
- // get the current position of the pilot's eyepoint (cartesian coordinates)
- sgdCopyVec3( eyeXYZ, globals->get_current_view()->get_absolute_view_pos() );
-
-/* cout << "Eye_X " << eyeXYZ[0]
- << " Eye_Y " << eyeXYZ[1]
- << " Eye_Z " << eyeXYZ[2] << endl;
-*/
-
- sgCartToGeod(eyeXYZ, &lat, &lon, &alt);
-
- eyepos[0] = lon * SG_RADIANS_TO_DEGREES;
- eyepos[1] = lat * SG_RADIANS_TO_DEGREES;
- eyepos[2] = alt;
-
-/* cout << "eye lon " << eyepos[0]
- << " eye lat " << eyepos[1]
- << " eye alt " << eyepos[2] << endl;
-*/
-
- //calculate the distance from eye to flols
- dist = sgdDistanceVec3( flolsXYZ, eyeXYZ );
-
- //apply an index error
- dist -= 100;
-
- //cout << "distance " << dist << endl;
- if ( dist > 5000 )
- return;
-
- // calculate height above FLOLS
- double y = eyepos[2] - flolspos[2];
-
- // calculate the angle from the flols to eye
- // above the horizontal
- // double angle;
-
- if ( dist != 0 )
- angle = asin( y / dist );
- else
- angle = 0.0;
-
- angle *= SG_RADIANS_TO_DEGREES;
-
-
- // cout << " height " << y << " angle " << angle ;
-
- // set the value of source
-
- if ( angle <= 4.35 && angle > 4.01 )
- source = 1;
- else if ( angle <= 4.01 && angle > 3.670 )
- source = 2;
- else if ( angle <= 3.670 && angle > 3.330 )
- source = 3;
- else if ( angle <= 3.330 && angle > 2.990 )
- source = 4;
- else if ( angle <= 2.990 && angle > 2.650 )
- source = 5;
- else if ( angle <= 2.650 )
- source = 6;
- else
- source = 0;
-
- // cout << " source " << source << endl;
-
-} // end updateflols
-
-
-