diff options
Diffstat (limited to 'scene/2d/navigation_polygon.cpp')
-rw-r--r-- | scene/2d/navigation_polygon.cpp | 291 |
1 files changed, 133 insertions, 158 deletions
diff --git a/scene/2d/navigation_polygon.cpp b/scene/2d/navigation_polygon.cpp index 9dbbd34ae9..570bd00a5b 100644 --- a/scene/2d/navigation_polygon.cpp +++ b/scene/2d/navigation_polygon.cpp @@ -27,26 +27,25 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "navigation_polygon.h" +#include "core_string_names.h" #include "navigation2d.h" #include "triangulator.h" -#include "core_string_names.h" -void NavigationPolygon::set_vertices(const PoolVector<Vector2>& p_vertices) { +void NavigationPolygon::set_vertices(const PoolVector<Vector2> &p_vertices) { - vertices=p_vertices; + vertices = p_vertices; } -PoolVector<Vector2> NavigationPolygon::get_vertices() const{ +PoolVector<Vector2> NavigationPolygon::get_vertices() const { return vertices; } - -void NavigationPolygon::_set_polygons(const Array& p_array) { +void NavigationPolygon::_set_polygons(const Array &p_array) { polygons.resize(p_array.size()); - for(int i=0;i<p_array.size();i++) { - polygons[i].indices=p_array[i]; + for (int i = 0; i < p_array.size(); i++) { + polygons[i].indices = p_array[i]; } } @@ -54,18 +53,18 @@ Array NavigationPolygon::_get_polygons() const { Array ret; ret.resize(polygons.size()); - for(int i=0;i<ret.size();i++) { - ret[i]=polygons[i].indices; + for (int i = 0; i < ret.size(); i++) { + ret[i] = polygons[i].indices; } return ret; } -void NavigationPolygon::_set_outlines(const Array& p_array) { +void NavigationPolygon::_set_outlines(const Array &p_array) { outlines.resize(p_array.size()); - for(int i=0;i<p_array.size();i++) { - outlines[i]=p_array[i]; + for (int i = 0; i < p_array.size(); i++) { + outlines[i] = p_array[i]; } } @@ -73,132 +72,125 @@ Array NavigationPolygon::_get_outlines() const { Array ret; ret.resize(outlines.size()); - for(int i=0;i<ret.size();i++) { - ret[i]=outlines[i]; + for (int i = 0; i < ret.size(); i++) { + ret[i] = outlines[i]; } return ret; } - -void NavigationPolygon::add_polygon(const Vector<int>& p_polygon){ +void NavigationPolygon::add_polygon(const Vector<int> &p_polygon) { Polygon polygon; - polygon.indices=p_polygon; + polygon.indices = p_polygon; polygons.push_back(polygon); - } -void NavigationPolygon::add_outline_at_index(const PoolVector<Vector2>& p_outline,int p_index) { +void NavigationPolygon::add_outline_at_index(const PoolVector<Vector2> &p_outline, int p_index) { - outlines.insert(p_index,p_outline); + outlines.insert(p_index, p_outline); } -int NavigationPolygon::get_polygon_count() const{ +int NavigationPolygon::get_polygon_count() const { return polygons.size(); } -Vector<int> NavigationPolygon::get_polygon(int p_idx){ +Vector<int> NavigationPolygon::get_polygon(int p_idx) { - ERR_FAIL_INDEX_V(p_idx,polygons.size(),Vector<int>()); + ERR_FAIL_INDEX_V(p_idx, polygons.size(), Vector<int>()); return polygons[p_idx].indices; } -void NavigationPolygon::clear_polygons(){ +void NavigationPolygon::clear_polygons() { polygons.clear(); } -void NavigationPolygon::add_outline(const PoolVector<Vector2>& p_outline) { +void NavigationPolygon::add_outline(const PoolVector<Vector2> &p_outline) { outlines.push_back(p_outline); } -int NavigationPolygon::get_outline_count() const{ +int NavigationPolygon::get_outline_count() const { return outlines.size(); } -void NavigationPolygon::set_outline(int p_idx,const PoolVector<Vector2>& p_outline) { - ERR_FAIL_INDEX(p_idx,outlines.size()); - outlines[p_idx]=p_outline; +void NavigationPolygon::set_outline(int p_idx, const PoolVector<Vector2> &p_outline) { + ERR_FAIL_INDEX(p_idx, outlines.size()); + outlines[p_idx] = p_outline; } void NavigationPolygon::remove_outline(int p_idx) { - ERR_FAIL_INDEX(p_idx,outlines.size()); + ERR_FAIL_INDEX(p_idx, outlines.size()); outlines.remove(p_idx); - } PoolVector<Vector2> NavigationPolygon::get_outline(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx,outlines.size(),PoolVector<Vector2>()); + ERR_FAIL_INDEX_V(p_idx, outlines.size(), PoolVector<Vector2>()); return outlines[p_idx]; } -void NavigationPolygon::clear_outlines(){ +void NavigationPolygon::clear_outlines() { outlines.clear(); } -void NavigationPolygon::make_polygons_from_outlines(){ +void NavigationPolygon::make_polygons_from_outlines() { - List<TriangulatorPoly> in_poly,out_poly; + List<TriangulatorPoly> in_poly, out_poly; - Vector2 outside_point(-1e10,-1e10); + Vector2 outside_point(-1e10, -1e10); - for(int i=0;i<outlines.size();i++) { + for (int i = 0; i < outlines.size(); i++) { PoolVector<Vector2> ol = outlines[i]; int olsize = ol.size(); - if (olsize<3) + if (olsize < 3) continue; - PoolVector<Vector2>::Read r=ol.read(); - for(int j=0;j<olsize;j++) { - outside_point.x = MAX( r[j].x, outside_point.x ); - outside_point.y = MAX( r[j].y, outside_point.y ); + PoolVector<Vector2>::Read r = ol.read(); + for (int j = 0; j < olsize; j++) { + outside_point.x = MAX(r[j].x, outside_point.x); + outside_point.y = MAX(r[j].y, outside_point.y); } - } - outside_point+=Vector2(0.7239784,0.819238); //avoid precision issues + outside_point += Vector2(0.7239784, 0.819238); //avoid precision issues - - - for(int i=0;i<outlines.size();i++) { + for (int i = 0; i < outlines.size(); i++) { PoolVector<Vector2> ol = outlines[i]; int olsize = ol.size(); - if (olsize<3) + if (olsize < 3) continue; - PoolVector<Vector2>::Read r=ol.read(); + PoolVector<Vector2>::Read r = ol.read(); - int interscount=0; + int interscount = 0; //test if this is an outer outline - for(int k=0;k<outlines.size();k++) { + for (int k = 0; k < outlines.size(); k++) { - if (i==k) + if (i == k) continue; //no self intersect PoolVector<Vector2> ol2 = outlines[k]; int olsize2 = ol2.size(); - if (olsize2<3) + if (olsize2 < 3) continue; - PoolVector<Vector2>::Read r2=ol2.read(); + PoolVector<Vector2>::Read r2 = ol2.read(); - for(int l=0;l<olsize2;l++) { + for (int l = 0; l < olsize2; l++) { - if (Geometry::segment_intersects_segment_2d(r[0],outside_point,r2[l],r2[(l+1)%olsize2],NULL)) { + if (Geometry::segment_intersects_segment_2d(r[0], outside_point, r2[l], r2[(l + 1) % olsize2], NULL)) { interscount++; } } - } - bool outer = (interscount%2)==0; + bool outer = (interscount % 2) == 0; TriangulatorPoly tp; tp.Init(olsize); - for(int j=0;j<olsize;j++) { - tp[j]=r[j]; + for (int j = 0; j < olsize; j++) { + tp[j] = r[j]; } if (outer) @@ -211,9 +203,8 @@ void NavigationPolygon::make_polygons_from_outlines(){ in_poly.push_back(tp); } - TriangulatorPartition tpart; - if (tpart.ConvexPartition_HM(&in_poly,&out_poly)==0) { //failed! + if (tpart.ConvexPartition_HM(&in_poly, &out_poly) == 0) { //failed! print_line("convex partition failed!"); return; } @@ -221,18 +212,18 @@ void NavigationPolygon::make_polygons_from_outlines(){ polygons.clear(); vertices.resize(0); - Map<Vector2,int> points; - for(List<TriangulatorPoly>::Element*I = out_poly.front();I;I=I->next()) { + Map<Vector2, int> points; + for (List<TriangulatorPoly>::Element *I = out_poly.front(); I; I = I->next()) { - TriangulatorPoly& tp = I->get(); + TriangulatorPoly &tp = I->get(); struct Polygon p; - for(int i=0;i<tp.GetNumPoints();i++) { + for (int i = 0; i < tp.GetNumPoints(); i++) { - Map<Vector2,int>::Element *E=points.find(tp[i]); + Map<Vector2, int>::Element *E = points.find(tp[i]); if (!E) { - E=points.insert(tp[i],vertices.size()); + E = points.insert(tp[i], vertices.size()); vertices.push_back(tp[i]); } p.indices.push_back(E->get()); @@ -244,56 +235,53 @@ void NavigationPolygon::make_polygons_from_outlines(){ emit_signal(CoreStringNames::get_singleton()->changed); } - void NavigationPolygon::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_vertices","vertices"),&NavigationPolygon::set_vertices); - ClassDB::bind_method(D_METHOD("get_vertices"),&NavigationPolygon::get_vertices); + ClassDB::bind_method(D_METHOD("set_vertices", "vertices"), &NavigationPolygon::set_vertices); + ClassDB::bind_method(D_METHOD("get_vertices"), &NavigationPolygon::get_vertices); - ClassDB::bind_method(D_METHOD("add_polygon","polygon"),&NavigationPolygon::add_polygon); - ClassDB::bind_method(D_METHOD("get_polygon_count"),&NavigationPolygon::get_polygon_count); - ClassDB::bind_method(D_METHOD("get_polygon","idx"),&NavigationPolygon::get_polygon); - ClassDB::bind_method(D_METHOD("clear_polygons"),&NavigationPolygon::clear_polygons); + ClassDB::bind_method(D_METHOD("add_polygon", "polygon"), &NavigationPolygon::add_polygon); + ClassDB::bind_method(D_METHOD("get_polygon_count"), &NavigationPolygon::get_polygon_count); + ClassDB::bind_method(D_METHOD("get_polygon", "idx"), &NavigationPolygon::get_polygon); + ClassDB::bind_method(D_METHOD("clear_polygons"), &NavigationPolygon::clear_polygons); - ClassDB::bind_method(D_METHOD("add_outline","outline"),&NavigationPolygon::add_outline); - ClassDB::bind_method(D_METHOD("add_outline_at_index","outline","index"),&NavigationPolygon::add_outline_at_index); - ClassDB::bind_method(D_METHOD("get_outline_count"),&NavigationPolygon::get_outline_count); - ClassDB::bind_method(D_METHOD("set_outline","idx","outline"),&NavigationPolygon::set_outline); - ClassDB::bind_method(D_METHOD("get_outline","idx"),&NavigationPolygon::get_outline); - ClassDB::bind_method(D_METHOD("remove_outline","idx"),&NavigationPolygon::remove_outline); - ClassDB::bind_method(D_METHOD("clear_outlines"),&NavigationPolygon::clear_outlines); - ClassDB::bind_method(D_METHOD("make_polygons_from_outlines"),&NavigationPolygon::make_polygons_from_outlines); + ClassDB::bind_method(D_METHOD("add_outline", "outline"), &NavigationPolygon::add_outline); + ClassDB::bind_method(D_METHOD("add_outline_at_index", "outline", "index"), &NavigationPolygon::add_outline_at_index); + ClassDB::bind_method(D_METHOD("get_outline_count"), &NavigationPolygon::get_outline_count); + ClassDB::bind_method(D_METHOD("set_outline", "idx", "outline"), &NavigationPolygon::set_outline); + ClassDB::bind_method(D_METHOD("get_outline", "idx"), &NavigationPolygon::get_outline); + ClassDB::bind_method(D_METHOD("remove_outline", "idx"), &NavigationPolygon::remove_outline); + ClassDB::bind_method(D_METHOD("clear_outlines"), &NavigationPolygon::clear_outlines); + ClassDB::bind_method(D_METHOD("make_polygons_from_outlines"), &NavigationPolygon::make_polygons_from_outlines); - ClassDB::bind_method(D_METHOD("_set_polygons","polygons"),&NavigationPolygon::_set_polygons); - ClassDB::bind_method(D_METHOD("_get_polygons"),&NavigationPolygon::_get_polygons); + ClassDB::bind_method(D_METHOD("_set_polygons", "polygons"), &NavigationPolygon::_set_polygons); + ClassDB::bind_method(D_METHOD("_get_polygons"), &NavigationPolygon::_get_polygons); - ClassDB::bind_method(D_METHOD("_set_outlines","outlines"),&NavigationPolygon::_set_outlines); - ClassDB::bind_method(D_METHOD("_get_outlines"),&NavigationPolygon::_get_outlines); + ClassDB::bind_method(D_METHOD("_set_outlines", "outlines"), &NavigationPolygon::_set_outlines); + ClassDB::bind_method(D_METHOD("_get_outlines"), &NavigationPolygon::_get_outlines); - ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR3_ARRAY,"vertices",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),"set_vertices","get_vertices"); - ADD_PROPERTY(PropertyInfo(Variant::ARRAY,"polygons",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),"_set_polygons","_get_polygons"); - ADD_PROPERTY(PropertyInfo(Variant::ARRAY,"outlines",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),"_set_outlines","_get_outlines"); + ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR3_ARRAY, "vertices", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_vertices", "get_vertices"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "polygons", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_polygons", "_get_polygons"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "outlines", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_outlines", "_get_outlines"); } NavigationPolygon::NavigationPolygon() { - - } void NavigationPolygonInstance::set_enabled(bool p_enabled) { - if (enabled==p_enabled) + if (enabled == p_enabled) return; - enabled=p_enabled; + enabled = p_enabled; if (!is_inside_tree()) return; if (!enabled) { - if (nav_id!=-1) { + if (nav_id != -1) { navigation->navpoly_remove(nav_id); - nav_id=-1; + nav_id = -1; } } else { @@ -301,10 +289,9 @@ void NavigationPolygonInstance::set_enabled(bool p_enabled) { if (navpoly.is_valid()) { - nav_id = navigation->navpoly_create(navpoly,get_relative_transform_to_parent(navigation),this); + nav_id = navigation->navpoly_create(navpoly, get_relative_transform_to_parent(navigation), this); } } - } if (get_tree()->is_editor_hint() || get_tree()->is_debugging_navigation_hint()) @@ -315,41 +302,37 @@ void NavigationPolygonInstance::set_enabled(bool p_enabled) { bool NavigationPolygonInstance::is_enabled() const { - return enabled; } - ///////////////////////////// - void NavigationPolygonInstance::_notification(int p_what) { - - switch(p_what) { + switch (p_what) { case NOTIFICATION_ENTER_TREE: { - Node2D *c=this; - while(c) { + Node2D *c = this; + while (c) { - navigation=c->cast_to<Navigation2D>(); + navigation = c->cast_to<Navigation2D>(); if (navigation) { if (enabled && navpoly.is_valid()) { - nav_id = navigation->navpoly_create(navpoly,get_relative_transform_to_parent(navigation),this); + nav_id = navigation->navpoly_create(navpoly, get_relative_transform_to_parent(navigation), this); } break; } - c=c->get_parent()->cast_to<Node2D>(); + c = c->get_parent()->cast_to<Node2D>(); } } break; case NOTIFICATION_TRANSFORM_CHANGED: { - if (navigation && nav_id!=-1) { - navigation->navpoly_set_transform(nav_id,get_relative_transform_to_parent(navigation)); + if (navigation && nav_id != -1) { + navigation->navpoly_set_transform(nav_id, get_relative_transform_to_parent(navigation)); } } break; @@ -357,28 +340,27 @@ void NavigationPolygonInstance::_notification(int p_what) { if (navigation) { - if (nav_id!=-1) { + if (nav_id != -1) { navigation->navpoly_remove(nav_id); - nav_id=-1; + nav_id = -1; } } - navigation=NULL; + navigation = NULL; } break; case NOTIFICATION_DRAW: { if (is_inside_tree() && (get_tree()->is_editor_hint() || get_tree()->is_debugging_navigation_hint()) && navpoly.is_valid()) { - PoolVector<Vector2> verts=navpoly->get_vertices(); + PoolVector<Vector2> verts = navpoly->get_vertices(); int vsize = verts.size(); - if (vsize<3) + if (vsize < 3) return; - Color color; if (enabled) { - color=get_tree()->get_debug_navigation_color(); + color = get_tree()->get_debug_navigation_color(); } else { - color=get_tree()->get_debug_navigation_disabled_color(); + color = get_tree()->get_debug_navigation_disabled_color(); } Vector<Color> colors; Vector<Vector2> vertices; @@ -386,66 +368,61 @@ void NavigationPolygonInstance::_notification(int p_what) { colors.resize(vsize); { PoolVector<Vector2>::Read vr = verts.read(); - for(int i=0;i<vsize;i++) { - vertices[i]=vr[i]; - colors[i]=color; + for (int i = 0; i < vsize; i++) { + vertices[i] = vr[i]; + colors[i] = color; } } Vector<int> indices; - - for(int i=0;i<navpoly->get_polygon_count();i++) { + for (int i = 0; i < navpoly->get_polygon_count(); i++) { Vector<int> polygon = navpoly->get_polygon(i); - for(int j=2;j<polygon.size();j++) { + for (int j = 2; j < polygon.size(); j++) { - int kofs[3]={0,j-1,j}; - for(int k=0;k<3;k++) { + int kofs[3] = { 0, j - 1, j }; + for (int k = 0; k < 3; k++) { - int idx = polygon[ kofs[k] ]; - ERR_FAIL_INDEX(idx,vsize); + int idx = polygon[kofs[k]]; + ERR_FAIL_INDEX(idx, vsize); indices.push_back(idx); } } } - VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(),indices,vertices,colors); - + VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, vertices, colors); } } break; - } } +void NavigationPolygonInstance::set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly) { -void NavigationPolygonInstance::set_navigation_polygon(const Ref<NavigationPolygon>& p_navpoly) { - - if (p_navpoly==navpoly) + if (p_navpoly == navpoly) return; - if (navigation && nav_id!=-1) { + if (navigation && nav_id != -1) { navigation->navpoly_remove(nav_id); - nav_id=-1; + nav_id = -1; } if (navpoly.is_valid()) { - navpoly->disconnect(CoreStringNames::get_singleton()->changed,this,"_navpoly_changed"); + navpoly->disconnect(CoreStringNames::get_singleton()->changed, this, "_navpoly_changed"); } - navpoly=p_navpoly; + navpoly = p_navpoly; if (navpoly.is_valid()) { - navpoly->connect(CoreStringNames::get_singleton()->changed,this,"_navpoly_changed"); + navpoly->connect(CoreStringNames::get_singleton()->changed, this, "_navpoly_changed"); } if (navigation && navpoly.is_valid() && enabled) { - nav_id = navigation->navpoly_create(navpoly,get_relative_transform_to_parent(navigation),this); + nav_id = navigation->navpoly_create(navpoly, get_relative_transform_to_parent(navigation), this); } //update_gizmo(); _change_notify("navpoly"); update_configuration_warning(); - } -Ref<NavigationPolygon> NavigationPolygonInstance::get_navigation_polygon() const{ +Ref<NavigationPolygon> NavigationPolygonInstance::get_navigation_polygon() const { return navpoly; } @@ -456,7 +433,6 @@ void NavigationPolygonInstance::_navpoly_changed() { update(); } - String NavigationPolygonInstance::get_configuration_warning() const { if (!is_visible_in_tree() || !is_inside_tree()) @@ -465,14 +441,14 @@ String NavigationPolygonInstance::get_configuration_warning() const { if (!navpoly.is_valid()) { return TTR("A NavigationPolygon resource must be set or created for this node to work. Please set a property or draw a polygon."); } - const Node2D *c=this; - while(c) { + const Node2D *c = this; + while (c) { if (c->cast_to<Navigation2D>()) { return String(); } - c=c->get_parent()->cast_to<Node2D>(); + c = c->get_parent()->cast_to<Node2D>(); } return TTR("NavigationPolygonInstance must be a child or grandchild to a Navigation2D node. It only provides navigation data."); @@ -480,23 +456,22 @@ String NavigationPolygonInstance::get_configuration_warning() const { void NavigationPolygonInstance::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation_polygon","navpoly:NavigationPolygon"),&NavigationPolygonInstance::set_navigation_polygon); - ClassDB::bind_method(D_METHOD("get_navigation_polygon:NavigationPolygon"),&NavigationPolygonInstance::get_navigation_polygon); + ClassDB::bind_method(D_METHOD("set_navigation_polygon", "navpoly:NavigationPolygon"), &NavigationPolygonInstance::set_navigation_polygon); + ClassDB::bind_method(D_METHOD("get_navigation_polygon:NavigationPolygon"), &NavigationPolygonInstance::get_navigation_polygon); - ClassDB::bind_method(D_METHOD("set_enabled","enabled"),&NavigationPolygonInstance::set_enabled); - ClassDB::bind_method(D_METHOD("is_enabled"),&NavigationPolygonInstance::is_enabled); + ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &NavigationPolygonInstance::set_enabled); + ClassDB::bind_method(D_METHOD("is_enabled"), &NavigationPolygonInstance::is_enabled); - ClassDB::bind_method(D_METHOD("_navpoly_changed"),&NavigationPolygonInstance::_navpoly_changed); + ClassDB::bind_method(D_METHOD("_navpoly_changed"), &NavigationPolygonInstance::_navpoly_changed); - ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"navpoly",PROPERTY_HINT_RESOURCE_TYPE,"NavigationPolygon"),"set_navigation_polygon","get_navigation_polygon"); - ADD_PROPERTY( PropertyInfo(Variant::BOOL,"enabled"),"set_enabled","is_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "navpoly", PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon"), "set_navigation_polygon", "get_navigation_polygon"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); } NavigationPolygonInstance::NavigationPolygonInstance() { - navigation=NULL; - nav_id=-1; - enabled=true; + navigation = NULL; + nav_id = -1; + enabled = true; set_notify_transform(true); - } |