1
0
Fork 0

another secret commit to sneak in stuff:

- cleanup
This commit is contained in:
mfranz 2007-06-07 22:48:37 +00:00
parent 99885791e9
commit 2e1756156f
3 changed files with 79 additions and 97 deletions

View file

@ -41,6 +41,7 @@ FGAIBallistic::FGAIBallistic() :
_life_timer(0.0),
_gravity(32),
_buoyancy(0),
_random(false),
_ht_agl_ft(0),
_load_resistance(0),
_solid(false),

View file

@ -85,7 +85,6 @@ void FGSubmodelMgr::postinit() {
loadSubmodels();
//TODO reload submodels if an MP ac joins
}
void FGSubmodelMgr::bind()
@ -98,7 +97,6 @@ void FGSubmodelMgr::unbind()
(*submodel_iterator)->prop->untie("count");
++submodel_iterator;
}
}
void FGSubmodelMgr::update(double dt)
@ -106,28 +104,21 @@ void FGSubmodelMgr::update(double dt)
if (!_serviceable_node->getBoolValue())
return;
int i = -1;
bool in_range = true;
bool trigger = false;
_impact = false;
_hit = false;
// check if the submodel hit an object or terrain
sm_list = ai->get_ai_list();
sm_list_iterator sm_list_itr = sm_list.begin();
sm_list_iterator end = sm_list.end();
submodel_iterator = submodels.begin();
while (sm_list_itr != end) {
for (; sm_list_itr != end; ++sm_list_itr) {
_impact = (*sm_list_itr)->_getImpactData();
_hit = (*sm_list_itr)->_getCollisionData();
int parent_subID = (*sm_list_itr)->_getSubID();
if ( parent_subID == 0) { // this entry in the list has no associated submodel
++sm_list_itr; // so we can continue
continue;
}
if ( parent_subID == 0) // this entry in the list has no associated submodel
continue; // so we can continue
if (_impact || _hit) {
SG_LOG(SG_GENERAL, SG_ALERT, "Submodel: Impact " << _impact << " hit! " << _hit );
@ -148,27 +139,33 @@ void FGSubmodelMgr::update(double dt)
_parent_speed = (*sm_list_itr)->_getImpactSpeed();
(*submodel_iterator)->first_time = true;
if (release(submodel_iterator, dt)) {
if (release(*submodel_iterator, dt))
(*sm_list_itr)->setDie(true);
}
}
++submodel_iterator;
}
}
++sm_list_itr;
}
_contrail_trigger->setBoolValue(_user_alt_node->getDoubleValue() > contrail_altitude);
submodel_iterator = submodels.begin();
bool in_range = true;
bool trigger = false;
int i = -1;
submodel_iterator = submodels.begin();
while (submodel_iterator != submodels.end()) {
i++;
in_range = true;
SG_LOG(SG_GENERAL, SG_DEBUG,
"Submodels: " << (*submodel_iterator)->id
<< " name " << (*submodel_iterator)->name
<< " in range " << in_range
);
if ((*submodel_iterator)->trigger_node != 0) {
_trigger_node = (*submodel_iterator)->trigger_node;
trigger = _trigger_node->getBoolValue();
@ -177,11 +174,6 @@ void FGSubmodelMgr::update(double dt)
trigger = true;
//cout << (*submodel_iterator)->name << "trigger node not found " << trigger << endl;
}
SG_LOG(SG_GENERAL, SG_DEBUG,
"Submodels: " << (*submodel_iterator)->id
<< " name " << (*submodel_iterator)->name
<< " in range " << in_range
);
if (trigger) {
int id = (*submodel_iterator)->id;
@ -232,46 +224,45 @@ void FGSubmodelMgr::update(double dt)
);
if ((*submodel_iterator)->count != 0 && in_range)
release((submodel_iterator), dt);
release(*submodel_iterator, dt);
} else
(*submodel_iterator)->first_time = true;
++submodel_iterator;
} // end while
}
bool FGSubmodelMgr::release(submodel_vector_iterator sm, double dt)
bool FGSubmodelMgr::release(submodel *sm, double dt)
{
//cout << "release id " << (*sm)->id << " name " << (*sm)->name
//<< " first time " << (*sm)->first_time << " repeat " << (*sm)->repeat <<
//cout << "release id " << sm->id << " name " << sm->name
//<< " first time " << sm->first_time << " repeat " << (*sm)->repeat <<
// endl;
// only run if first time or repeat is set to true
if (!(*sm)->first_time && !(*sm)->repeat){
//cout<< "not first time " << (*sm)->first_time<< " repeat " << (*sm)->repeat <<endl;
if (!sm->first_time && !sm->repeat) {
//cout<< "not first time " << sm->first_time<< " repeat " << sm->repeat <<endl;
return false;
}
(*sm)->timer += dt;
sm->timer += dt;
if ((*sm)->timer < (*sm)->delay){
//cout << "not yet: timer" << (*sm)->timer << " delay " << (*sm)->delay<< endl;
if (sm->timer < sm->delay) {
//cout << "not yet: timer" << sm->timer << " delay " << sm->delay<< endl;
return false;
}
(*sm)->timer = 0.0;
sm->timer = 0.0;
if ((*sm)->first_time) {
if (sm->first_time) {
dt = 0.0;
(*sm)->first_time = false;
sm->first_time = false;
}
transform(sm); // calculate submodel's initial conditions in world-coordinates
FGAIBallistic* ballist = new FGAIBallistic;
ballist->setPath((*sm)->model.c_str());
ballist->setPath(sm->model.c_str());
ballist->setLatitude(IC.lat);
ballist->setLongitude(IC.lon);
ballist->setAltitude(IC.alt);
@ -282,24 +273,24 @@ bool FGSubmodelMgr::release(submodel_vector_iterator sm, double dt)
ballist->setWind_from_east(IC.wind_from_east);
ballist->setWind_from_north(IC.wind_from_north);
ballist->setMass(IC.mass);
ballist->setDragArea((*sm)->drag_area);
ballist->setLife((*sm)->life);
ballist->setBuoyancy((*sm)->buoyancy);
ballist->setWind((*sm)->wind);
ballist->setCd((*sm)->cd);
ballist->setStabilisation((*sm)->aero_stabilised);
ballist->setNoRoll((*sm)->no_roll);
ballist->setName((*sm)->name);
ballist->setCollision((*sm)->collision);
ballist->setImpact((*sm)->impact);
ballist->setImpactReportNode((*sm)->impact_report);
ballist->setFuseRange((*sm)->fuse_range);
ballist->setSubmodel((*sm)->submodel.c_str());
ballist->setSubID((*sm)->sub_id);
ballist->setDragArea(sm->drag_area);
ballist->setLife(sm->life);
ballist->setBuoyancy(sm->buoyancy);
ballist->setWind(sm->wind);
ballist->setCd(sm->cd);
ballist->setStabilisation(sm->aero_stabilised);
ballist->setNoRoll(sm->no_roll);
ballist->setName(sm->name);
ballist->setCollision(sm->collision);
ballist->setImpact(sm->impact);
ballist->setImpactReportNode(sm->impact_report);
ballist->setFuseRange(sm->fuse_range);
ballist->setSubmodel(sm->submodel.c_str());
ballist->setSubID(sm->sub_id);
ai->attach(ballist);
if ((*sm)->count > 0)
(*sm)->count--;
if (sm->count > 0)
sm->count--;
return true;
}
@ -316,42 +307,41 @@ void FGSubmodelMgr::load()
bool Seviceable =_serviceable_node->getBoolValue();
setData(id, Path, Seviceable);
}
}
void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
void FGSubmodelMgr::transform(submodel *sm)
{
// set initial conditions
if ((*submodel)->contents_node != 0) {
if (sm->contents_node != 0) {
// get the weight of the contents (lbs) and convert to mass (slugs)
(*submodel)->contents = (*submodel)->contents_node->getDoubleValue();
IC.mass = ((*submodel)->weight + (*submodel)->contents) * lbs_to_slugs;
sm->contents = sm->contents_node->getDoubleValue();
IC.mass = (sm->weight + sm->contents) * lbs_to_slugs;
// set contents to 0 in the parent
(*submodel)->contents_node->setDoubleValue(0);
sm->contents_node->setDoubleValue(0);
} else
IC.mass = (*submodel)->weight * lbs_to_slugs;
IC.mass = sm->weight * lbs_to_slugs;
// cout << "mass " << IC.mass << endl;
if ((*submodel)->speed_node != 0)
(*submodel)->speed = (*submodel)->speed_node->getDoubleValue();
if (sm->speed_node != 0)
sm->speed = sm->speed_node->getDoubleValue();
int id = (*submodel)->id;
int id = sm->id;
//int sub_id = (*submodel)->sub_id;
string name = (*submodel)->name;
string name = sm->name;
//cout << " name " << name << " id " << id << " sub id" << sub_id << endl;
if (_impact || _hit){
if (_impact || _hit) {
// set the data for a submodel tied to a submodel
_count++;
//cout << "Submodels: release sub sub " << _count<< endl;
//cout << " id " << (*submodel)->id
//cout << " id " << sm->id
// << " lat " << _parent_lat
// << " lon " << _parent_lon
// << " elev " << _parent_elev
// << " name " << (*submodel)->name
// << " name " << sm->name
// << endl;
IC.lat = _parent_lat;
@ -359,7 +349,7 @@ void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
IC.alt = _parent_elev;
IC.roll = _parent_roll; // rotation about x axis
IC.elevation = _parent_pitch; // rotation about y axis
IC.azimuth = _parent_hdg; // rotation about z axis
IC.azimuth = _parent_hdg; // rotation about z axis
IC.speed = _parent_speed;
IC.speed_down_fps = 0;
IC.speed_east_fps = 0;
@ -368,8 +358,8 @@ void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
} else if (id == 0) {
//set the data for a submodel tied to the main model
/*cout << "Submodels: release main sub " << endl;
cout << " name " << (*submodel)->name
<< " id" << (*submodel)->id
cout << " name " << sm->name
<< " id" << sm->id
<< endl;*/
IC.lat = _user_lat_node->getDoubleValue();
IC.lon = _user_lon_node->getDoubleValue();
@ -410,21 +400,20 @@ void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
++sm_list_itr;
}
}
/*cout << "heading " << IC.azimuth << endl ;
cout << "speed down " << IC.speed_down_fps << endl ;
cout << "speed east " << IC.speed_east_fps << endl ;
cout << "speed north " << IC.speed_north_fps << endl ;
cout << "parent speed fps in" << IC.speed << "sm speed in " << (*submodel).speed << endl ;*/
cout << "parent speed fps in" << IC.speed << "sm speed in " << sm->speed << endl ;*/
IC.wind_from_east = _user_wind_from_east_node->getDoubleValue();
IC.wind_from_north = _user_wind_from_north_node->getDoubleValue();
in[0] = (*submodel)->x_offset;
in[1] = (*submodel)->y_offset;
in[2] = (*submodel)->z_offset;
in[0] = sm->x_offset;
in[1] = sm->y_offset;
in[2] = sm->z_offset;
// pre-process the trig functions
cosRx = cos(-IC.roll * SG_DEGREES_TO_RADIANS);
@ -471,19 +460,19 @@ void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
// Get submodel initial velocity vector angles in XZ and XY planes.
// This needs to be fixed. This vector should be added to aircraft's vector.
IC.elevation += ((*submodel)->yaw_offset * sinRx) + ((*submodel)->pitch_offset * cosRx);
IC.azimuth += ((*submodel)->yaw_offset * cosRx) - ((*submodel)->pitch_offset * sinRx);
IC.elevation += (sm->yaw_offset * sinRx) + (sm->pitch_offset * cosRx);
IC.azimuth += (sm->yaw_offset * cosRx) - (sm->pitch_offset * sinRx);
// calculate the total speed north
IC.total_speed_north = (*submodel)->speed * cos(IC.elevation * SG_DEGREES_TO_RADIANS)
IC.total_speed_north = sm->speed * cos(IC.elevation * SG_DEGREES_TO_RADIANS)
* cos(IC.azimuth * SG_DEGREES_TO_RADIANS) + IC.speed_north_fps;
// calculate the total speed east
IC.total_speed_east = (*submodel)->speed * cos(IC.elevation * SG_DEGREES_TO_RADIANS)
IC.total_speed_east = sm->speed * cos(IC.elevation * SG_DEGREES_TO_RADIANS)
* sin(IC.azimuth * SG_DEGREES_TO_RADIANS) + IC.speed_east_fps;
// calculate the total speed down
IC.total_speed_down = (*submodel)->speed * -sin(IC.elevation * SG_DEGREES_TO_RADIANS)
IC.total_speed_down = sm->speed * -sin(IC.elevation * SG_DEGREES_TO_RADIANS)
+ IC.speed_down_fps;
// re-calculate speed, elevation and azimuth
@ -492,7 +481,7 @@ void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
+ IC.total_speed_down * IC.total_speed_down);
// if speeds are low this calculation can become unreliable
if (IC.speed > 1){
if (IC.speed > 1) {
IC.azimuth = atan2(IC.total_speed_east , IC.total_speed_north) * SG_RADIANS_TO_DEGREES;
// cout << "azimuth1 " << IC.azimuth<<endl;
@ -501,7 +490,6 @@ void FGSubmodelMgr::transform(submodel_vector_iterator submodel)
IC.azimuth += 360;
else if (IC.azimuth >= 360)
IC.azimuth -= 360;
}
// cout << "azimuth2 " << IC.azimuth<<endl;
@ -544,7 +532,6 @@ void FGSubmodelMgr::loadAI()
setData(id, path, serviceable);
++sm_list_itr;
}
}
@ -653,7 +640,6 @@ void FGSubmodelMgr::setData(int id, string& path, bool serviceable)
index++;
submodels.push_back(sm);
}
}
void FGSubmodelMgr::setSubData(int id, string& path, bool serviceable)
@ -751,7 +737,6 @@ void FGSubmodelMgr::setSubData(int id, string& path, bool serviceable)
index++;
subsubmodels.push_back(sm);
}
}
void FGSubmodelMgr::loadSubmodels()

View file

@ -30,8 +30,7 @@ class FGSubmodelMgr : public SGSubsystem
public:
typedef struct
{
typedef struct {
SGPropertyNode_ptr trigger_node;
SGPropertyNode_ptr prop;
SGPropertyNode_ptr contents_node;
@ -69,11 +68,9 @@ public:
double fuse_range;
string submodel;
int sub_id;
}
submodel;
} submodel;
typedef struct
{
typedef struct {
double lat;
double lon;
double alt;
@ -92,8 +89,7 @@ public:
double mass;
int id;
bool no_roll;
}
IC_struct;
} IC_struct;
FGSubmodelMgr();
~FGSubmodelMgr();
@ -109,7 +105,7 @@ public:
private:
typedef vector <submodel*> submodel_vector_type;
typedef submodel_vector_type::const_iterator submodel_vector_iterator;
typedef submodel_vector_type::iterator submodel_vector_iterator;
submodel_vector_type submodels;
submodel_vector_type subsubmodels;
@ -187,9 +183,9 @@ private:
void setData(int id, string& path, bool serviceable);
void setSubData(int id, string& path, bool serviceable);
void valueChanged (SGPropertyNode *);
void transform(submodel_vector_iterator);
void transform(submodel *);
bool release(submodel_vector_iterator, double dt);
bool release(submodel *, double dt);
double getRange(double lat, double lon, double lat2, double lon2) const;