@ -39,6 +39,7 @@ class GraphEdit;
class GraphEditArranger ;
class HScrollBar ;
class Label ;
class Line2D ;
class PanelContainer ;
class SpinBox ;
class ViewPanner ;
@ -112,12 +113,25 @@ class GraphEdit : public Control {
GDCLASS ( GraphEdit , Control ) ;
public :
struct Connection {
struct Connection : RefCounted {
StringName from_node ;
StringName to_node ;
int from_port = 0 ;
int to_port = 0 ;
float activity = 0.0 ;
private :
struct Cache {
bool dirty = true ;
Vector2 from_pos ; // In graph space.
Vector2 to_pos ; // In graph space.
Color from_color ;
Color to_color ;
Rect2 aabb ; // In local screen space.
Line2D * line = nullptr ; // In local screen space.
} _cache ;
friend class GraphEdit ;
} ;
// Should be in sync with ControlScheme in ViewPanner.
@ -184,15 +198,15 @@ private:
GridPattern grid_pattern = GRID_PATTERN_LINES ;
bool connecting = false ;
String connecting_from ;
bool connecting_out = false ;
int connecting_index = 0 ;
StringName connecting_from_node ;
bool connecting_from_output = false ;
int connecting_type = 0 ;
Color connecting_color ;
bool connecting_target = false ;
Vector2 connecting_to ;
StringName connecting_target_to ;
int connecting_target_index = 0 ;
Vector2 connecting_to_point ; // In local screen space.
bool connecting_target_valid = false ;
StringName connecting_target_node ;
int connecting_from_port_index = 0 ;
int connecting_target_port_index = 0 ;
bool just_disconnected = false ;
bool connecting_valid = false ;
@ -222,18 +236,28 @@ private:
bool right_disconnects = false ;
bool updating = false ;
bool awaiting_scroll_offset_update = false ;
List < Connection > connections ;
float lines_thickness = 2.0f ;
List < Ref < Connection > > connections ;
HashMap < StringName , List < Ref < Connection > > > connection_map ;
Ref < Connection > hovered_connection ;
float lines_thickness = 4.0f ;
float lines_curvature = 0.5f ;
bool lines_antialiased = true ;
PanelContainer * menu_panel = nullptr ;
HBoxContainer * menu_hbox = nullptr ;
Control * connections_layer = nullptr ;
GraphEditFilter * top_layer = nullptr ;
GraphEditFilter * top_connection_layer = nullptr ; // Draws a dragged connection. Necessary since the connection line shader can't be applied to the whole top layer.
Line2D * dragged_connection_line = nullptr ;
Control * top_layer = nullptr ; // Used for drawing the box selection rect. Contains the minimap, menu panel and the scrollbars.
GraphEditMinimap * minimap = nullptr ;
static Ref < Shader > default_connections_shader ;
Ref < Shader > connections_shader ;
Ref < GraphEditArranger > arranger ;
HashSet < ConnectionType , ConnectionType > valid_connection_types ;
@ -248,6 +272,10 @@ private:
Color grid_minor ;
Color activity_color ;
Color connection_hover_tint_color ;
Color connection_valid_target_tint_color ;
Color connection_rim_color ;
Color selection_fill ;
Color selection_stroke ;
@ -274,30 +302,35 @@ private:
void _zoom_plus ( ) ;
void _update_zoom_label ( ) ;
void _draw_connection_line ( CanvasItem * p_where , const Vector2 & p_from , const Vector2 & p_to , const Color & p_color , const Color & p_to_color , float p_width , float p_zoom ) ;
void _graph_element_selected ( Node * p_node ) ;
void _graph_element_deselected ( Node * p_node ) ;
void _graph_element_moved_to_front ( Node * p_node ) ;
void _graph_element_resized ( Vector2 p_new_minsize , Node * p_node ) ;
void _graph_element_moved ( Node * p_node ) ;
void _graph_node_slot_updated ( int p_index , Node * p_node ) ;
void _graph_node_rect_changed ( GraphNode * p_node ) ;
void _update_scroll ( ) ;
void _update_scroll_offset ( ) ;
void _scroll_moved ( double ) ;
virtual void gui_input ( const Ref < InputEvent > & p_ev ) override ;
void _top_ layer_input( const Ref < InputEvent > & p_ev ) ;
void _top_ connection_ layer_input( const Ref < InputEvent > & p_ev ) ;
bool is_in_port_hotzone ( const Vector2 & p_pos , const Vector2 & p_mouse_pos , const Vector2i & p_port_size , bool p_left ) ;
float _get_shader_line_width ( ) ;
void _draw_minimap_connection_line ( CanvasItem * p_where , const Vector2 & p_from , const Vector2 & p_to , const Color & p_color , const Color & p_to_color ) ;
void _invalidate_connection_line_cache ( ) ;
void _update_top_connection_layer ( ) ;
void _update_connections ( ) ;
void _top_layer_draw ( ) ;
void _connections_layer_draw ( ) ;
void _minimap_draw ( ) ;
void _draw_grid ( ) ;
bool is_in_port_hotzone ( const Vector2 & p_pos , const Vector2 & p_mouse_pos , const Vector2i & p_port_size , bool p_left ) ;
TypedArray < Dictionary > _get_connection_list ( ) const ;
Dictionary _get_closest_connection_at_point ( const Vector2 & p_point , float p_max_distance = 4.0 ) const ;
TypedArray < Dictionary > _get_connections_intersecting_with_rect ( const Rect2 & p_rect ) const ;
friend class GraphEditFilter ;
bool _filter_input ( const Point2 & p_point ) ;
@ -313,6 +346,7 @@ private:
# ifndef DISABLE_DEPRECATED
bool _is_arrange_nodes_button_hidden_bind_compat_81582 ( ) const ;
void _set_arrange_nodes_button_hidden_bind_compat_81582 ( bool p_enable ) ;
PackedVector2Array _get_connection_line_bind_compat_86158 ( const Vector2 & p_from , const Vector2 & p_to ) ;
# endif
protected :
@ -336,6 +370,9 @@ protected:
GDVIRTUAL4R ( bool , _is_node_hover_valid , StringName , int , StringName , int ) ;
public :
static void init_shaders ( ) ;
static void finish_shaders ( ) ;
virtual CursorShape get_cursor_shape ( const Point2 & p_pos = Point2i ( ) ) const override ;
PackedStringArray get_configuration_warnings ( ) const override ;
@ -344,12 +381,17 @@ public:
bool is_node_connected ( const StringName & p_from , int p_from_port , const StringName & p_to , int p_to_port ) ;
void disconnect_node ( const StringName & p_from , int p_from_port , const StringName & p_to , int p_to_port ) ;
void clear_connections ( ) ;
void force_connection_drag_end ( ) ;
const List < Ref < Connection > > & get_connection_list ( ) const ;
virtual PackedVector2Array get_connection_line ( const Vector2 & p_from , const Vector2 & p_to ) const ;
Ref < Connection > get_closest_connection_at_point ( const Vector2 & p_point , float p_max_distance = 4.0 ) const ;
List < Ref < Connection > > get_connections_intersecting_with_rect ( const Rect2 & p_rect ) const ;
virtual PackedVector2Array get_connection_line ( const Vector2 & p_from , const Vector2 & p_to ) ;
virtual bool is_node_hover_valid ( const StringName & p_from , int p_from_port , const StringName & p_to , int p_to_port ) ;
void set_connection_activity ( const StringName & p_from , int p_from_port , const StringName & p_to , int p_to_port , float p_activity ) ;
void reset_all_connection_activity ( ) ;
void add_valid_connection_type ( int p_type , int p_with_type ) ;
void remove_valid_connection_type ( int p_type , int p_with_type ) ;
@ -392,10 +434,10 @@ public:
void set_show_arrange_button ( bool p_hidden ) ;
bool is_showing_arrange_button ( ) const ;
GraphEditFilter * get_top_layer ( ) const { return top_layer ; }
Control * get_top_layer ( ) const { return top_layer ; }
GraphEditMinimap * get_minimap ( ) const { return minimap ; }
void get_connection_list( List < Connection > * r_connections ) const ;
void override_connections_shader( const Ref < Shader > & p_shader ) ;
void set_right_disconnects ( bool p_enable ) ;
bool is_right_disconnects_enabled ( ) const ;