Remove range criteria, add sub-submodels to any depth, and add expiry criteria
Signed-off-by: Vivian Meazza <vivian.meazza@lineone.net>
This commit is contained in:
parent
c47d4f2f30
commit
6310fdd9c5
6 changed files with 83 additions and 69 deletions
|
@ -61,6 +61,7 @@ FGAIBallistic::FGAIBallistic(object_type ot) :
|
||||||
_slave_load_to_ac(false),
|
_slave_load_to_ac(false),
|
||||||
_contents_lb(0),
|
_contents_lb(0),
|
||||||
_report_collision(false),
|
_report_collision(false),
|
||||||
|
_report_expiry(false),
|
||||||
_report_impact(false),
|
_report_impact(false),
|
||||||
_external_force(false),
|
_external_force(false),
|
||||||
_impact_report_node(fgGetNode("/ai/models/model-impact", true)),
|
_impact_report_node(fgGetNode("/ai/models/model-impact", true)),
|
||||||
|
@ -321,6 +322,7 @@ void FGAIBallistic::setMass(double m) {
|
||||||
void FGAIBallistic::setWeight(double w) {
|
void FGAIBallistic::setWeight(double w) {
|
||||||
_weight_lb = w;
|
_weight_lb = w;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGAIBallistic::setRandom(bool r) {
|
void FGAIBallistic::setRandom(bool r) {
|
||||||
_random = r;
|
_random = r;
|
||||||
}
|
}
|
||||||
|
@ -333,6 +335,11 @@ void FGAIBallistic::setCollision(bool c) {
|
||||||
_report_collision = c;
|
_report_collision = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FGAIBallistic::setExpiry(bool e) {
|
||||||
|
_report_expiry = e;
|
||||||
|
// cout << "_report_expiry " << _report_expiry << endl;
|
||||||
|
}
|
||||||
|
|
||||||
void FGAIBallistic::setExternalForce(bool f) {
|
void FGAIBallistic::setExternalForce(bool f) {
|
||||||
_external_force = f;
|
_external_force = f;
|
||||||
}
|
}
|
||||||
|
@ -536,8 +543,14 @@ void FGAIBallistic::Run(double dt) {
|
||||||
_life_timer += dt;
|
_life_timer += dt;
|
||||||
|
|
||||||
// if life = -1 the object does not die
|
// if life = -1 the object does not die
|
||||||
if (_life_timer > life && life != -1)
|
if (_life_timer > life && life != -1){
|
||||||
setDie(true);
|
|
||||||
|
if (_report_expiry && !_expiry_reported){
|
||||||
|
handle_expiry();
|
||||||
|
} else
|
||||||
|
setDie(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//set the contents in the appropriate tank or other property in the parent to zero
|
//set the contents in the appropriate tank or other property in the parent to zero
|
||||||
setContents(0);
|
setContents(0);
|
||||||
|
@ -809,6 +822,19 @@ void FGAIBallistic::handle_impact() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FGAIBallistic::handle_expiry() {
|
||||||
|
|
||||||
|
report_impact(pos.getElevationM());
|
||||||
|
_expiry_reported = true;
|
||||||
|
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT, "AIBallistic: expiry");
|
||||||
|
//if (life == -1){
|
||||||
|
// invisible = true;
|
||||||
|
//} else if (_subID == 0) // kill the AIObject if there is no subsubmodel
|
||||||
|
// setDie(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void FGAIBallistic::handle_collision()
|
void FGAIBallistic::handle_collision()
|
||||||
{
|
{
|
||||||
const FGAIBase *object = manager->calcCollision(pos.getElevationFt(),
|
const FGAIBase *object = manager->calcCollision(pos.getElevationFt(),
|
||||||
|
|
|
@ -70,6 +70,7 @@ public:
|
||||||
void setRandom( bool r );
|
void setRandom( bool r );
|
||||||
void setName(const string&);
|
void setName(const string&);
|
||||||
void setCollision(bool c);
|
void setCollision(bool c);
|
||||||
|
void setExpiry(bool e);
|
||||||
void setImpact(bool i);
|
void setImpact(bool i);
|
||||||
void setImpactReportNode(const string&);
|
void setImpactReportNode(const string&);
|
||||||
void setContentsNode(const string&);
|
void setContentsNode(const string&);
|
||||||
|
@ -164,6 +165,7 @@ private:
|
||||||
bool _report_collision; // if true a collision point with AI Objects is calculated
|
bool _report_collision; // if true a collision point with AI Objects is calculated
|
||||||
bool _report_impact; // if true an impact point on the terrain is calculated
|
bool _report_impact; // if true an impact point on the terrain is calculated
|
||||||
bool _external_force; // if true then apply external force
|
bool _external_force; // if true then apply external force
|
||||||
|
bool _report_expiry;
|
||||||
|
|
||||||
SGPropertyNode_ptr _impact_report_node; // report node for impact and collision
|
SGPropertyNode_ptr _impact_report_node; // report node for impact and collision
|
||||||
SGPropertyNode_ptr _contents_node; // report node for impact and collision
|
SGPropertyNode_ptr _contents_node; // report node for impact and collision
|
||||||
|
@ -181,6 +183,7 @@ private:
|
||||||
const SGMaterial* _material;
|
const SGMaterial* _material;
|
||||||
|
|
||||||
void handle_collision();
|
void handle_collision();
|
||||||
|
void handle_expiry();
|
||||||
void handle_impact();
|
void handle_impact();
|
||||||
void report_impact(double elevation, const FGAIBase *target = 0);
|
void report_impact(double elevation, const FGAIBase *target = 0);
|
||||||
void slaveToAC(double dt);
|
void slaveToAC(double dt);
|
||||||
|
|
|
@ -579,6 +579,10 @@ bool FGAIBase::_getCollisionData() {
|
||||||
return _collision_reported;
|
return _collision_reported;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FGAIBase::_getExpiryData() {
|
||||||
|
return _expiry_reported;
|
||||||
|
}
|
||||||
|
|
||||||
bool FGAIBase::_getImpactData() {
|
bool FGAIBase::_getImpactData() {
|
||||||
return _impact_reported;
|
return _impact_reported;
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,6 +177,7 @@ protected:
|
||||||
|
|
||||||
bool _impact_reported;
|
bool _impact_reported;
|
||||||
bool _collision_reported;
|
bool _collision_reported;
|
||||||
|
bool _expiry_reported;
|
||||||
|
|
||||||
double _impact_lat;
|
double _impact_lat;
|
||||||
double _impact_lon;
|
double _impact_lon;
|
||||||
|
@ -246,6 +247,7 @@ public:
|
||||||
bool _getImpact();
|
bool _getImpact();
|
||||||
bool _getImpactData();
|
bool _getImpactData();
|
||||||
bool _getCollisionData();
|
bool _getCollisionData();
|
||||||
|
bool _getExpiryData();
|
||||||
|
|
||||||
SGPropertyNode* _getProps() const;
|
SGPropertyNode* _getProps() const;
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ FGSubmodelMgr::FGSubmodelMgr()
|
||||||
string contents_node;
|
string contents_node;
|
||||||
contrail_altitude = 30000;
|
contrail_altitude = 30000;
|
||||||
_count = 0;
|
_count = 0;
|
||||||
|
_found_sub = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
FGSubmodelMgr::~FGSubmodelMgr()
|
FGSubmodelMgr::~FGSubmodelMgr()
|
||||||
|
@ -82,7 +83,9 @@ void FGSubmodelMgr::init()
|
||||||
void FGSubmodelMgr::postinit() {
|
void FGSubmodelMgr::postinit() {
|
||||||
// postinit, so that the AI list is populated
|
// postinit, so that the AI list is populated
|
||||||
loadAI();
|
loadAI();
|
||||||
loadSubmodels();
|
|
||||||
|
while (_found_sub)
|
||||||
|
loadSubmodels();
|
||||||
|
|
||||||
//TODO reload submodels if an MP ac joins
|
//TODO reload submodels if an MP ac joins
|
||||||
}
|
}
|
||||||
|
@ -106,6 +109,7 @@ void FGSubmodelMgr::update(double dt)
|
||||||
|
|
||||||
_impact = false;
|
_impact = false;
|
||||||
_hit = false;
|
_hit = false;
|
||||||
|
_expiry = false;
|
||||||
|
|
||||||
// check if the submodel hit an object or terrain
|
// check if the submodel hit an object or terrain
|
||||||
sm_list = ai->get_ai_list();
|
sm_list = ai->get_ai_list();
|
||||||
|
@ -115,13 +119,14 @@ void FGSubmodelMgr::update(double dt)
|
||||||
for (; sm_list_itr != end; ++sm_list_itr) {
|
for (; sm_list_itr != end; ++sm_list_itr) {
|
||||||
_impact = (*sm_list_itr)->_getImpactData();
|
_impact = (*sm_list_itr)->_getImpactData();
|
||||||
_hit = (*sm_list_itr)->_getCollisionData();
|
_hit = (*sm_list_itr)->_getCollisionData();
|
||||||
|
_expiry = (*sm_list_itr)->_getExpiryData();
|
||||||
int parent_subID = (*sm_list_itr)->_getSubID();
|
int parent_subID = (*sm_list_itr)->_getSubID();
|
||||||
//SG_LOG(SG_GENERAL, SG_DEBUG, "Submodel: Impact " << _impact << " hit! "
|
//SG_LOG(SG_GENERAL, SG_DEBUG, "Submodel: Impact " << _impact << " hit! "
|
||||||
// << _hit <<" parent_subID " << parent_subID);
|
// << _hit <<" parent_subID " << parent_subID);
|
||||||
if ( parent_subID == 0) // this entry in the list has no associated submodel
|
if ( parent_subID == 0) // this entry in the list has no associated submodel
|
||||||
continue; // so we can continue
|
continue; // so we can continue
|
||||||
|
|
||||||
if (_impact || _hit) {
|
if (_impact || _hit || _expiry) {
|
||||||
//SG_LOG(SG_GENERAL, SG_DEBUG, "Submodel: Impact " << _impact << " hit! " << _hit );
|
//SG_LOG(SG_GENERAL, SG_DEBUG, "Submodel: Impact " << _impact << " hit! " << _hit );
|
||||||
|
|
||||||
submodel_iterator = submodels.begin();
|
submodel_iterator = submodels.begin();
|
||||||
|
@ -175,58 +180,19 @@ void FGSubmodelMgr::update(double dt)
|
||||||
//cout << (*submodel_iterator)->name << "trigger node not found " << trigger << endl;
|
//cout << (*submodel_iterator)->name << "trigger node not found " << trigger << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trigger) {
|
if (trigger && (*submodel_iterator)->count != 0) {
|
||||||
int id = (*submodel_iterator)->id;
|
|
||||||
string name = (*submodel_iterator)->name;
|
|
||||||
// don't release submodels from AI Objects if they are
|
|
||||||
// too far away to be seen. id 0 is not an AI model,
|
|
||||||
// so we can skip the whole process
|
|
||||||
sm_list_iterator sm_list_itr = sm_list.begin();
|
|
||||||
sm_list_iterator end = sm_list.end();
|
|
||||||
|
|
||||||
while (sm_list_itr != end) {
|
//int id = (*submodel_iterator)->id;
|
||||||
in_range = true;
|
//string name = (*submodel_iterator)->name;
|
||||||
|
/*SG_LOG(SG_GENERAL, SG_DEBUG,
|
||||||
|
"Submodels end: " << (*submodel_iterator)->id
|
||||||
|
<< " name " << (*submodel_iterator)->name
|
||||||
|
<< " count " << (*submodel_iterator)->count
|
||||||
|
<< " in range " << in_range);*/
|
||||||
|
|
||||||
if (id == 0) {
|
release(*submodel_iterator, dt);
|
||||||
//SG_LOG(SG_GENERAL, SG_DEBUG,
|
} else
|
||||||
// "Submodels: continuing: " << id << " name " << name );
|
(*submodel_iterator)->first_time = true;
|
||||||
++sm_list_itr;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int parent_id = (*submodel_iterator)->id;
|
|
||||||
|
|
||||||
if (parent_id == id) {
|
|
||||||
double parent_lat = (*sm_list_itr)->_getLatitude();
|
|
||||||
double parent_lon = (*sm_list_itr)->_getLongitude();
|
|
||||||
string parent_name = (*sm_list_itr)->_getName();
|
|
||||||
double own_lat = _user_lat_node->getDoubleValue();
|
|
||||||
double own_lon = _user_lon_node->getDoubleValue();
|
|
||||||
double range_nm = getRange(parent_lat, parent_lon, own_lat, own_lon);
|
|
||||||
//cout << "parent name " << parent_name << ", "<< parent_id << ", "<< parent_lat << ", " << parent_lon << endl;
|
|
||||||
//cout << "own name " << own_lat << ", " << own_lon << " range " << range_nm << endl;
|
|
||||||
|
|
||||||
if (range_nm > 15) {
|
|
||||||
//SG_LOG(SG_GENERAL, SG_DEBUG,
|
|
||||||
// "Submodels: skipping release, out of range: " << id);
|
|
||||||
in_range = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
++sm_list_itr;
|
|
||||||
} // end while
|
|
||||||
|
|
||||||
/*SG_LOG(SG_GENERAL, SG_DEBUG,
|
|
||||||
"Submodels end: " << (*submodel_iterator)->id
|
|
||||||
<< " name " << (*submodel_iterator)->name
|
|
||||||
<< " count " << (*submodel_iterator)->count
|
|
||||||
<< " in range " << in_range);*/
|
|
||||||
|
|
||||||
if ((*submodel_iterator)->count != 0 && in_range)
|
|
||||||
release(*submodel_iterator, dt);
|
|
||||||
|
|
||||||
} else
|
|
||||||
(*submodel_iterator)->first_time = true;
|
|
||||||
|
|
||||||
++submodel_iterator;
|
++submodel_iterator;
|
||||||
} // end while
|
} // end while
|
||||||
|
@ -281,6 +247,7 @@ bool FGSubmodelMgr::release(submodel *sm, double dt)
|
||||||
ballist->setNoRoll(sm->no_roll);
|
ballist->setNoRoll(sm->no_roll);
|
||||||
ballist->setName(sm->name);
|
ballist->setName(sm->name);
|
||||||
ballist->setCollision(sm->collision);
|
ballist->setCollision(sm->collision);
|
||||||
|
ballist->setExpiry(sm->expiry);
|
||||||
ballist->setImpact(sm->impact);
|
ballist->setImpact(sm->impact);
|
||||||
ballist->setImpactReportNode(sm->impact_report);
|
ballist->setImpactReportNode(sm->impact_report);
|
||||||
ballist->setFuseRange(sm->fuse_range);
|
ballist->setFuseRange(sm->fuse_range);
|
||||||
|
@ -595,6 +562,7 @@ void FGSubmodelMgr::setData(int id, string& path, bool serviceable)
|
||||||
sm->aero_stabilised = entry_node->getBoolValue("aero-stabilised", true);
|
sm->aero_stabilised = entry_node->getBoolValue("aero-stabilised", true);
|
||||||
sm->no_roll = entry_node->getBoolValue("no-roll", false);
|
sm->no_roll = entry_node->getBoolValue("no-roll", false);
|
||||||
sm->collision = entry_node->getBoolValue("collision", false);
|
sm->collision = entry_node->getBoolValue("collision", false);
|
||||||
|
sm->expiry = entry_node->getBoolValue("expiry", false);
|
||||||
sm->impact = entry_node->getBoolValue("impact", false);
|
sm->impact = entry_node->getBoolValue("impact", false);
|
||||||
sm->impact_report = entry_node->getStringValue("impact-reports");
|
sm->impact_report = entry_node->getStringValue("impact-reports");
|
||||||
sm->fuse_range = entry_node->getDoubleValue("fuse-range", 0.0);
|
sm->fuse_range = entry_node->getDoubleValue("fuse-range", 0.0);
|
||||||
|
@ -698,6 +666,7 @@ void FGSubmodelMgr::setSubData(int id, string& path, bool serviceable)
|
||||||
sm->aero_stabilised = entry_node->getBoolValue("aero-stabilised", true);
|
sm->aero_stabilised = entry_node->getBoolValue("aero-stabilised", true);
|
||||||
sm->no_roll = entry_node->getBoolValue("no-roll", false);
|
sm->no_roll = entry_node->getBoolValue("no-roll", false);
|
||||||
sm->collision = entry_node->getBoolValue("collision", false);
|
sm->collision = entry_node->getBoolValue("collision", false);
|
||||||
|
sm->expiry = entry_node->getBoolValue("expiry", false);
|
||||||
sm->impact = entry_node->getBoolValue("impact", false);
|
sm->impact = entry_node->getBoolValue("impact", false);
|
||||||
sm->impact_report = entry_node->getStringValue("impact-reports");
|
sm->impact_report = entry_node->getStringValue("impact-reports");
|
||||||
sm->fuse_range = entry_node->getDoubleValue("fuse-range", 0.0);
|
sm->fuse_range = entry_node->getDoubleValue("fuse-range", 0.0);
|
||||||
|
@ -757,31 +726,38 @@ void FGSubmodelMgr::loadSubmodels()
|
||||||
{
|
{
|
||||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Submodels: Loading sub submodels");
|
SG_LOG(SG_GENERAL, SG_DEBUG, "Submodels: Loading sub submodels");
|
||||||
|
|
||||||
|
_found_sub = false;
|
||||||
|
|
||||||
submodel_iterator = submodels.begin();
|
submodel_iterator = submodels.begin();
|
||||||
|
|
||||||
while (submodel_iterator != submodels.end()) {
|
while (submodel_iterator != submodels.end()) {
|
||||||
string submodel = (*submodel_iterator)->submodel;
|
string submodel = (*submodel_iterator)->submodel;
|
||||||
if (!submodel.empty()) {
|
if (!submodel.empty()) {
|
||||||
//int id = (*submodel_iterator)->id;
|
//int id = (*submodel_iterator)->id;
|
||||||
bool serviceable = true;
|
bool serviceable = true;
|
||||||
//SG_LOG(SG_GENERAL, SG_DEBUG, "found path sub sub "
|
//SG_LOG(SG_GENERAL, SG_DEBUG, "found path sub sub "
|
||||||
// << submodel
|
// << submodel
|
||||||
// << " index " << index
|
// << " index " << index
|
||||||
// << "name " << (*submodel_iterator)->name);
|
// << "name " << (*submodel_iterator)->name);
|
||||||
|
|
||||||
(*submodel_iterator)->sub_id = index;
|
if ((*submodel_iterator)->sub_id == 0){
|
||||||
setSubData(index, submodel, serviceable);
|
(*submodel_iterator)->sub_id = index;
|
||||||
}
|
_found_sub = true;
|
||||||
|
setSubData(index, submodel, serviceable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
++submodel_iterator;
|
++submodel_iterator;
|
||||||
}
|
} // end while
|
||||||
|
|
||||||
subsubmodel_iterator = subsubmodels.begin();
|
subsubmodel_iterator = subsubmodels.begin();
|
||||||
|
|
||||||
while (subsubmodel_iterator != subsubmodels.end()) {
|
while (subsubmodel_iterator != subsubmodels.end()) {
|
||||||
submodels.push_back(*subsubmodel_iterator);
|
submodels.push_back(*subsubmodel_iterator);
|
||||||
++subsubmodel_iterator;
|
++subsubmodel_iterator;
|
||||||
}
|
} // end while
|
||||||
|
|
||||||
|
subsubmodels.clear();
|
||||||
|
|
||||||
//submodel_iterator = submodels.begin();
|
//submodel_iterator = submodels.begin();
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ public:
|
||||||
bool no_roll;
|
bool no_roll;
|
||||||
bool serviceable;
|
bool serviceable;
|
||||||
bool collision;
|
bool collision;
|
||||||
|
bool expiry;
|
||||||
bool impact;
|
bool impact;
|
||||||
string impact_report;
|
string impact_report;
|
||||||
double fuse_range;
|
double fuse_range;
|
||||||
|
@ -148,6 +149,8 @@ private:
|
||||||
|
|
||||||
bool _impact;
|
bool _impact;
|
||||||
bool _hit;
|
bool _hit;
|
||||||
|
bool _expiry;
|
||||||
|
bool _found_sub;
|
||||||
|
|
||||||
SGPropertyNode_ptr _serviceable_node;
|
SGPropertyNode_ptr _serviceable_node;
|
||||||
SGPropertyNode_ptr _user_lat_node;
|
SGPropertyNode_ptr _user_lat_node;
|
||||||
|
|
Loading…
Add table
Reference in a new issue