diff --git a/include/opendrive_road_node.h b/include/opendrive_road_node.h index 9ae44c662078ffcd7da706500cc319d8a8591e51..a647f027e8688166a6a09669dff5a47f64ea0eed 100644 --- a/include/opendrive_road_node.h +++ b/include/opendrive_road_node.h @@ -48,8 +48,8 @@ class COpendriveRoadNode COpendriveRoadNode *get_original_node(node_up_ref_t &node_refs); void update_references(segment_up_ref_t &segment_refs,lane_up_ref_t &lane_refs,node_up_ref_t &node_refs); void clean_references(segment_up_ref_t &segment_refs,lane_up_ref_t &lane_refs,node_up_ref_t &node_refs,link_up_ref_t &new_link_ref); - void update_start_pose(COpendriveLane *lane,TOpendriveWorldPose &start,double distance); - void update_end_pose(COpendriveLane *lane,TOpendriveWorldPose &end,double distance); + void update_start_pose(TOpendriveWorldPose &start,node_up_ref_t &node_refs,double distance); + void update_end_pose(TOpendriveWorldPose &end,node_up_ref_t &node_refs); public: /** * \brief Returns the resolution diff --git a/src/opendrive_road_node.cpp b/src/opendrive_road_node.cpp index 4631bab3c68b80e3ce7712bdcb7ef0ac6df4f450..40f7b06461361ea5c3085e448f857be3edfe8683 100644 --- a/src/opendrive_road_node.cpp +++ b/src/opendrive_road_node.cpp @@ -297,7 +297,7 @@ void COpendriveRoadNode::clean_references(segment_up_ref_t &segment_refs,lane_up } for(parent_it=this->parents.begin();parent_it!=this->parents.end();) { - if(!parent_it->segment->updated(segment_refs) || !parent_it->lane->updated(lane_refs)) + if(!parent_it->segment->updated(segment_refs) && !parent_it->lane->updated(lane_refs)) parent_it=this->parents.erase(parent_it); else parent_it++; @@ -305,63 +305,35 @@ void COpendriveRoadNode::clean_references(segment_up_ref_t &segment_refs,lane_up // } } -void COpendriveRoadNode::update_start_pose(COpendriveLane *lane,TOpendriveWorldPose &start,double distance) +void COpendriveRoadNode::update_start_pose(TOpendriveWorldPose &start,node_up_ref_t &node_refs,double distance) { - std::vector<TOpendriveRoadNodeParent>::iterator parent_it; std::vector<COpendriveLink *>::iterator link_it; - TOpendriveRoadNodeParent *parent; this->pose=start; - // remove the references to all lanes and segments except for lane - for(parent_it=this->parents.begin();parent_it!=this->parents.end();) - { - if(parent_it->lane!=lane) - parent_it=this->parents.erase(parent_it); - else - { - parent=&(*parent_it); - parent_it++; - } - } // update the links for(link_it=this->links.begin();link_it!=this->links.end();) { - if((*link_it)->next==this) + if((*link_it)->next==this->get_original_node(node_refs)) { delete *link_it; link_it=this->links.erase(link_it); } else { - if((*link_it)->lane==lane) - { - parent->start_curvature=(*link_it)->get_curvature_at(distance); - (*link_it)->update_start_pose(start,parent->start_curvature); - } - else - (*link_it)->update_start_pose(start,0.0); + (*link_it)->update_start_pose(start,(*link_it)->get_curvature_at(distance)); link_it++; } } } -void COpendriveRoadNode::update_end_pose(COpendriveLane *lane,TOpendriveWorldPose &end,double distance) +void COpendriveRoadNode::update_end_pose(TOpendriveWorldPose &end,node_up_ref_t &node_refs) { - std::vector<TOpendriveRoadNodeParent>::iterator parent_it; std::vector<COpendriveLink *>::iterator link_it; - // remove the references to all lanes and segments except for lane - for(parent_it=this->parents.begin();parent_it!=this->parents.end();) - { - if(parent_it->lane!=lane) - parent_it=this->parents.erase(parent_it); - else - parent_it++; - } // update the links for(link_it=this->links.begin();link_it!=this->links.end();) { - if((*link_it)->prev==this) + if((*link_it)->prev==this->get_original_node(node_refs)) { delete *link_it; link_it=this->links.erase(link_it);