void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { if (unparenting || !can_update_body) return; CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); ERR_FAIL_COND(!co); if (polygon.size() == 0) return; bool solids = build_mode == BUILD_SOLIDS; if (solids) { //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them Vector<Vector<Vector2> > decomp = _decompose_in_convex(); shape_from = co->get_shape_count(); for (int i = 0; i < decomp.size(); i++) { Ref<ConvexPolygonShape2D> convex = memnew(ConvexPolygonShape2D); convex->set_points(decomp[i]); co->add_shape(convex, get_transform()); if (trigger) co->set_shape_as_trigger(co->get_shape_count() - 1, true); } shape_to = co->get_shape_count() - 1; if (shape_to < shape_from) { shape_from = -1; shape_to = -1; } } else { Ref<ConcavePolygonShape2D> concave = memnew(ConcavePolygonShape2D); PoolVector<Vector2> segments; segments.resize(polygon.size() * 2); PoolVector<Vector2>::Write w = segments.write(); for (int i = 0; i < polygon.size(); i++) { w[(i << 1) + 0] = polygon[i]; w[(i << 1) + 1] = polygon[(i + 1) % polygon.size()]; } w = PoolVector<Vector2>::Write(); concave->set_segments(segments); co->add_shape(concave, get_transform()); if (trigger) co->set_shape_as_trigger(co->get_shape_count() - 1, true); shape_from = co->get_shape_count() - 1; shape_to = co->get_shape_count() - 1; } //co->add_shape(shape,get_transform()); }
void CollisionPolygon2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_ENTER_TREE: { unparenting=false; can_update_body=get_tree()->is_editor_hint(); if (!get_tree()->is_editor_hint()) { //display above all else set_z_as_relative(false); set_z(VS::CANVAS_ITEM_Z_MAX-1); } } break; case NOTIFICATION_EXIT_TREE: { can_update_body=false; } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { if (!is_inside_tree()) break; if (can_update_body) { _update_parent(); } else if (shape_from>=0 && shape_to>=0) { CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); for(int i=shape_from;i<=shape_to;i++) { co->set_shape_transform(i,get_transform()); } } } break; case NOTIFICATION_DRAW: { if (!get_tree()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; } for(int i=0;i<polygon.size();i++) { Vector2 p = polygon[i]; Vector2 n = polygon[(i+1)%polygon.size()]; draw_line(p,n,Color(0.9,0.2,0.0,0.8),3); } #define DEBUG_DECOMPOSE #if defined(TOOLS_ENABLED) && defined (DEBUG_DECOMPOSE) Vector< Vector<Vector2> > decomp = _decompose_in_convex(); Color c(0.4,0.9,0.1); for(int i=0;i<decomp.size();i++) { c.set_hsv( Math::fmod(c.get_h() + 0.738,1),c.get_s(),c.get_v(),0.5); draw_colored_polygon(decomp[i],c); } #else draw_colored_polygon(polygon,get_tree()->get_debug_collisions_color()); #endif } break; case NOTIFICATION_UNPARENTED: { unparenting = true; _update_parent(); } break; } }