object_info_ptr ctrl::create(kernel::object_create_t const& oc, dict_copt dict) { if (dict) return object_info_ptr(new ctrl(oc, dict)); //auto chart_sys = dynamic_cast<kernel::ext_ctrl_sys *>(oc.sys); //auto polylin = std::move(polyline_chart_t::create(chart_sys->doc()->default_chart())); //if (!polylin) // return object_info_ptr(); //return object_info_ptr(new ctrl(oc, std::move(app::to_geo_points_2(polylin->get_points())))); std::vector<geo_point_2> p; p.push_back(geo_point_2(0,0)); return object_info_ptr(new ctrl(oc, std::move(p))); }
void ctrl::attach_tow() { aircraft::info_ptr towair; bool reverse = false; visit_objects<aircraft::info_ptr>(collection_, [this, &towair,&reverse](aircraft::info_ptr air)->bool { geo_point_3 tow_pos = geo_base_3(air->pos())(cg::rotation_3(cpr(air->orien().course, 0, 0)) * (point_3(0, 5., 0) + point_3(air->tow_point_transform().translation()))); if (cg::distance2d(tow_pos, this->pos()) < 25) { double dist_tp = tow_point_node_ ?cg::distance2d(tow_pos,tow_point_node_->get_global_pos()) :10000.0; double dist_rtp = rtow_point_node_?cg::distance2d(tow_pos,rtow_point_node_->get_global_pos()):10000.0; if ( dist_rtp < dist_tp) { reverse = true; } towair = air; return false; } return true; }); if (towair) send_cmd(msg::attach_tow_msg_t(object_info_ptr(towair)->object_id(), reverse)); }
void ctrl::attach_tow() { aircraft::info_ptr towair; visit_objects<aircraft::info_ptr>(collection_, [this, &towair](aircraft::info_ptr air)->bool { geo_point_3 tow_pos = geo_base_3(air->pos())(cg::rotation_3(cpr(air->orien().course, 0, 0)) * (point_3(0, 5., 0) + point_3(air->tow_point_transform().translation()))); if (cg::distance2d(tow_pos, this->pos()) < 25) { towair = air; return false; } return true; }); if (towair) send_cmd(msg::attach_tow_msg_t(object_info_ptr(towair)->object_id())); }
void ctrl::fire_fight() { aircraft::info_ptr burning_plane; bool reverse = false; visit_objects<aircraft::info_ptr>(collection_, [this, &burning_plane](aircraft::info_ptr air)->bool { geo_point_3 tow_pos = geo_base_3(air->pos())(cg::rotation_3(cpr(air->orien().course, 0, 0)) * (point_3(0, 5., 0) )); if (cg::distance2d(tow_pos, this->pos()) < 25) { burning_plane = air; return false; } return true; }); if (burning_plane) send_cmd(msg::fight_fire_msg_t(object_info_ptr(burning_plane)->object_id(), 1)); }
object_info_ptr view::create(object_create_t const& oc, dict_copt dict) { return object_info_ptr(new view(oc, dict)); }
object_info_ptr ext_model::create(kernel::object_create_t const& oc, dict_copt dict) { return object_info_ptr(new ext_model(oc,dict)); }
object_info_ptr vis::create(object_create_t const& oc, dict_copt dict) { Verify(dict); return object_info_ptr(new vis(oc, dict)); }
object_info_ptr visual::create(kernel::object_create_t const& oc, dict_copt dict) { return object_info_ptr(new visual(oc, dict)); }
object_info_ptr ctrl::create(kernel::object_create_t const& oc, dict_copt dict) { return object_info_ptr(new ctrl(oc, dict)); }