You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-24 15:26:15 +00:00
Select and move multiple nodes at once
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -8,93 +8,95 @@ class GraphEdit;
|
|||||||
|
|
||||||
class GraphEditFilter : public Control {
|
class GraphEditFilter : public Control {
|
||||||
|
|
||||||
OBJ_TYPE(GraphEditFilter,Control);
|
OBJ_TYPE(GraphEditFilter,Control);
|
||||||
|
|
||||||
friend class GraphEdit;
|
friend class GraphEdit;
|
||||||
GraphEdit *ge;
|
GraphEdit *ge;
|
||||||
virtual bool has_point(const Point2& p_point) const;
|
virtual bool has_point(const Point2& p_point) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
GraphEditFilter(GraphEdit *p_edit);
|
GraphEditFilter(GraphEdit *p_edit);
|
||||||
};
|
};
|
||||||
|
|
||||||
class GraphEdit : public Control {
|
class GraphEdit : public Control {
|
||||||
|
|
||||||
OBJ_TYPE(GraphEdit,Control);
|
OBJ_TYPE(GraphEdit,Control);
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct Connection {
|
struct Connection {
|
||||||
StringName from;
|
StringName from;
|
||||||
StringName to;
|
StringName to;
|
||||||
int from_port;
|
int from_port;
|
||||||
int to_port;
|
int to_port;
|
||||||
|
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
|
|
||||||
HScrollBar* h_scroll;
|
HScrollBar* h_scroll;
|
||||||
VScrollBar* v_scroll;
|
VScrollBar* v_scroll;
|
||||||
|
|
||||||
|
|
||||||
bool connecting;
|
bool connecting;
|
||||||
String connecting_from;
|
String connecting_from;
|
||||||
bool connecting_out;
|
bool connecting_out;
|
||||||
int connecting_index;
|
int connecting_index;
|
||||||
int connecting_type;
|
int connecting_type;
|
||||||
Color connecting_color;
|
Color connecting_color;
|
||||||
bool connecting_target;
|
bool connecting_target;
|
||||||
Vector2 connecting_to;
|
Vector2 connecting_to;
|
||||||
String connecting_target_to;
|
String connecting_target_to;
|
||||||
int connecting_target_index;
|
int connecting_target_index;
|
||||||
|
|
||||||
|
bool dragging;
|
||||||
|
bool just_selected;
|
||||||
|
Vector2 drag_accum;
|
||||||
|
|
||||||
|
bool right_disconnects;
|
||||||
|
bool updating;
|
||||||
|
List<Connection> connections;
|
||||||
|
|
||||||
bool right_disconnects;
|
void _draw_cos_line(const Vector2& p_from, const Vector2& p_to,const Color& p_color);
|
||||||
bool updating;
|
|
||||||
List<Connection> connections;
|
|
||||||
|
|
||||||
void _draw_cos_line(const Vector2& p_from, const Vector2& p_to,const Color& p_color);
|
void _graph_node_raised(Node* p_gn);
|
||||||
|
void _graph_node_moved(Node *p_gn);
|
||||||
|
|
||||||
void _graph_node_raised(Node* p_gn);
|
void _update_scroll();
|
||||||
void _graph_node_moved(Node *p_gn);
|
void _scroll_moved(double);
|
||||||
|
void _input_event(const InputEvent& p_ev);
|
||||||
|
|
||||||
void _update_scroll();
|
GraphEditFilter *top_layer;
|
||||||
void _scroll_moved(double);
|
void _top_layer_input(const InputEvent& p_ev);
|
||||||
void _input_event(const InputEvent& p_ev);
|
void _top_layer_draw();
|
||||||
|
void _update_scroll_offset();
|
||||||
|
|
||||||
GraphEditFilter *top_layer;
|
Array _get_connection_list() const;
|
||||||
void _top_layer_input(const InputEvent& p_ev);
|
|
||||||
void _top_layer_draw();
|
|
||||||
void _update_scroll_offset();
|
|
||||||
|
|
||||||
Array _get_connection_list() const;
|
|
||||||
|
|
||||||
friend class GraphEditFilter;
|
friend class GraphEditFilter;
|
||||||
bool _filter_input(const Point2& p_point);
|
bool _filter_input(const Point2& p_point);
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
virtual void add_child_notify(Node *p_child);
|
virtual void add_child_notify(Node *p_child);
|
||||||
virtual void remove_child_notify(Node *p_child);
|
virtual void remove_child_notify(Node *p_child);
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Error connect_node(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port);
|
Error connect_node(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port);
|
||||||
bool is_node_connected(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port);
|
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 disconnect_node(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port);
|
||||||
void clear_connections();
|
void clear_connections();
|
||||||
|
|
||||||
GraphEditFilter *get_top_layer() const { return top_layer; }
|
GraphEditFilter *get_top_layer() const { return top_layer; }
|
||||||
void get_connection_list(List<Connection> *r_connections) const;
|
void get_connection_list(List<Connection> *r_connections) const;
|
||||||
|
|
||||||
void set_right_disconnects(bool p_enable);
|
void set_right_disconnects(bool p_enable);
|
||||||
bool is_right_disconnects_enabled() const;
|
bool is_right_disconnects_enabled() const;
|
||||||
|
|
||||||
|
|
||||||
GraphEdit();
|
GraphEdit();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GRAPHEdit_H
|
#endif // GRAPHEdit_H
|
||||||
|
|||||||
@@ -4,91 +4,91 @@
|
|||||||
|
|
||||||
bool GraphNode::_set(const StringName& p_name, const Variant& p_value) {
|
bool GraphNode::_set(const StringName& p_name, const Variant& p_value) {
|
||||||
|
|
||||||
if (!p_name.operator String().begins_with("slot/"))
|
if (!p_name.operator String().begins_with("slot/"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int idx=p_name.operator String().get_slice("/",1).to_int();
|
int idx=p_name.operator String().get_slice("/",1).to_int();
|
||||||
String what = p_name.operator String().get_slice("/",2);
|
String what = p_name.operator String().get_slice("/",2);
|
||||||
|
|
||||||
|
|
||||||
Slot si;
|
Slot si;
|
||||||
if (slot_info.has(idx))
|
if (slot_info.has(idx))
|
||||||
si=slot_info[idx];
|
si=slot_info[idx];
|
||||||
|
|
||||||
|
|
||||||
if (what=="left_enabled")
|
if (what=="left_enabled")
|
||||||
si.enable_left=p_value;
|
si.enable_left=p_value;
|
||||||
else if (what=="left_type")
|
else if (what=="left_type")
|
||||||
si.type_left=p_value;
|
si.type_left=p_value;
|
||||||
else if (what=="left_color")
|
else if (what=="left_color")
|
||||||
si.color_left=p_value;
|
si.color_left=p_value;
|
||||||
else if (what=="right_enabled")
|
else if (what=="right_enabled")
|
||||||
si.enable_right=p_value;
|
si.enable_right=p_value;
|
||||||
else if (what=="right_type")
|
else if (what=="right_type")
|
||||||
si.type_right=p_value;
|
si.type_right=p_value;
|
||||||
else if (what=="right_color")
|
else if (what=="right_color")
|
||||||
si.color_right=p_value;
|
si.color_right=p_value;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
set_slot(idx,si.enable_left,si.type_left,si.color_left,si.enable_right,si.type_right,si.color_right);
|
set_slot(idx,si.enable_left,si.type_left,si.color_left,si.enable_right,si.type_right,si.color_right);
|
||||||
update();
|
update();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GraphNode::_get(const StringName& p_name,Variant &r_ret) const{
|
bool GraphNode::_get(const StringName& p_name,Variant &r_ret) const{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!p_name.operator String().begins_with("slot/")) {
|
if (!p_name.operator String().begins_with("slot/")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int idx=p_name.operator String().get_slice("/",1).to_int();
|
int idx=p_name.operator String().get_slice("/",1).to_int();
|
||||||
String what = p_name.operator String().get_slice("/",2);
|
String what = p_name.operator String().get_slice("/",2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Slot si;
|
Slot si;
|
||||||
if (slot_info.has(idx))
|
if (slot_info.has(idx))
|
||||||
si=slot_info[idx];
|
si=slot_info[idx];
|
||||||
|
|
||||||
if (what=="left_enabled")
|
if (what=="left_enabled")
|
||||||
r_ret=si.enable_left;
|
r_ret=si.enable_left;
|
||||||
else if (what=="left_type")
|
else if (what=="left_type")
|
||||||
r_ret=si.type_left;
|
r_ret=si.type_left;
|
||||||
else if (what=="left_color")
|
else if (what=="left_color")
|
||||||
r_ret=si.color_left;
|
r_ret=si.color_left;
|
||||||
else if (what=="right_enabled")
|
else if (what=="right_enabled")
|
||||||
r_ret=si.enable_right;
|
r_ret=si.enable_right;
|
||||||
else if (what=="right_type")
|
else if (what=="right_type")
|
||||||
r_ret=si.type_right;
|
r_ret=si.type_right;
|
||||||
else if (what=="right_color")
|
else if (what=="right_color")
|
||||||
r_ret=si.color_right;
|
r_ret=si.color_right;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void GraphNode::_get_property_list( List<PropertyInfo> *p_list) const{
|
void GraphNode::_get_property_list( List<PropertyInfo> *p_list) const{
|
||||||
|
|
||||||
int idx=0;
|
int idx=0;
|
||||||
for(int i=0;i<get_child_count();i++) {
|
for(int i=0;i<get_child_count();i++) {
|
||||||
Control *c=get_child(i)->cast_to<Control>();
|
Control *c=get_child(i)->cast_to<Control>();
|
||||||
if (!c || c->is_set_as_toplevel() )
|
if (!c || c->is_set_as_toplevel() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
String base="slot/"+itos(idx)+"/";
|
String base="slot/"+itos(idx)+"/";
|
||||||
|
|
||||||
p_list->push_back(PropertyInfo(Variant::BOOL,base+"left_enabled"));
|
p_list->push_back(PropertyInfo(Variant::BOOL,base+"left_enabled"));
|
||||||
p_list->push_back(PropertyInfo(Variant::INT,base+"left_type"));
|
p_list->push_back(PropertyInfo(Variant::INT,base+"left_type"));
|
||||||
p_list->push_back(PropertyInfo(Variant::COLOR,base+"left_color"));
|
p_list->push_back(PropertyInfo(Variant::COLOR,base+"left_color"));
|
||||||
p_list->push_back(PropertyInfo(Variant::BOOL,base+"right_enabled"));
|
p_list->push_back(PropertyInfo(Variant::BOOL,base+"right_enabled"));
|
||||||
p_list->push_back(PropertyInfo(Variant::INT,base+"right_type"));
|
p_list->push_back(PropertyInfo(Variant::INT,base+"right_type"));
|
||||||
p_list->push_back(PropertyInfo(Variant::COLOR,base+"right_color"));
|
p_list->push_back(PropertyInfo(Variant::COLOR,base+"right_color"));
|
||||||
|
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -96,61 +96,61 @@ void GraphNode::_resort() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int sep=get_constant("separation");
|
int sep=get_constant("separation");
|
||||||
Ref<StyleBox> sb=get_stylebox("frame");
|
Ref<StyleBox> sb=get_stylebox("frame");
|
||||||
bool first=true;
|
bool first=true;
|
||||||
|
|
||||||
Size2 minsize;
|
Size2 minsize;
|
||||||
|
|
||||||
for(int i=0;i<get_child_count();i++) {
|
for(int i=0;i<get_child_count();i++) {
|
||||||
Control *c=get_child(i)->cast_to<Control>();
|
Control *c=get_child(i)->cast_to<Control>();
|
||||||
if (!c)
|
if (!c)
|
||||||
continue;
|
continue;
|
||||||
if (c->is_set_as_toplevel())
|
if (c->is_set_as_toplevel())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Size2i size=c->get_combined_minimum_size();
|
Size2i size=c->get_combined_minimum_size();
|
||||||
|
|
||||||
minsize.y+=size.y;
|
minsize.y+=size.y;
|
||||||
minsize.x=MAX(minsize.x,size.x);
|
minsize.x=MAX(minsize.x,size.x);
|
||||||
|
|
||||||
if (first)
|
if (first)
|
||||||
first=false;
|
first=false;
|
||||||
else
|
else
|
||||||
minsize.y+=sep;
|
minsize.y+=sep;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int vofs=0;
|
int vofs=0;
|
||||||
int w = get_size().x - sb->get_minimum_size().x;
|
int w = get_size().x - sb->get_minimum_size().x;
|
||||||
|
|
||||||
|
|
||||||
cache_y.clear();
|
cache_y.clear();
|
||||||
for(int i=0;i<get_child_count();i++) {
|
for(int i=0;i<get_child_count();i++) {
|
||||||
Control *c=get_child(i)->cast_to<Control>();
|
Control *c=get_child(i)->cast_to<Control>();
|
||||||
if (!c)
|
if (!c)
|
||||||
continue;
|
continue;
|
||||||
if (c->is_set_as_toplevel())
|
if (c->is_set_as_toplevel())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Size2i size=c->get_combined_minimum_size();
|
Size2i size=c->get_combined_minimum_size();
|
||||||
|
|
||||||
Rect2 r(sb->get_margin(MARGIN_LEFT),sb->get_margin(MARGIN_TOP)+vofs,w,size.y);
|
Rect2 r(sb->get_margin(MARGIN_LEFT),sb->get_margin(MARGIN_TOP)+vofs,w,size.y);
|
||||||
|
|
||||||
fit_child_in_rect(c,r);
|
fit_child_in_rect(c,r);
|
||||||
cache_y.push_back(vofs+size.y*0.5);
|
cache_y.push_back(vofs+size.y*0.5);
|
||||||
|
|
||||||
if (vofs>0)
|
if (vofs>0)
|
||||||
vofs+=sep;
|
vofs+=sep;
|
||||||
vofs+=size.y;
|
vofs+=size.y;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_change_notify();
|
_change_notify();
|
||||||
update();
|
update();
|
||||||
connpos_dirty=true;
|
connpos_dirty=true;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -158,124 +158,124 @@ void GraphNode::_resort() {
|
|||||||
|
|
||||||
void GraphNode::_notification(int p_what) {
|
void GraphNode::_notification(int p_what) {
|
||||||
|
|
||||||
if (p_what==NOTIFICATION_DRAW) {
|
if (p_what==NOTIFICATION_DRAW) {
|
||||||
|
|
||||||
Ref<StyleBox> sb=get_stylebox("frame");
|
Ref<StyleBox> sb=get_stylebox(selected ? "selectedframe" : "frame");
|
||||||
Ref<Texture> port =get_icon("port");
|
Ref<Texture> port =get_icon("port");
|
||||||
Ref<Texture> close =get_icon("close");
|
Ref<Texture> close =get_icon("close");
|
||||||
int close_offset = get_constant("close_offset");
|
int close_offset = get_constant("close_offset");
|
||||||
Ref<Font> title_font = get_font("title_font");
|
Ref<Font> title_font = get_font("title_font");
|
||||||
int title_offset = get_constant("title_offset");
|
int title_offset = get_constant("title_offset");
|
||||||
Color title_color = get_color("title_color");
|
Color title_color = get_color("title_color");
|
||||||
Point2i icofs = -port->get_size()*0.5;
|
Point2i icofs = -port->get_size()*0.5;
|
||||||
int edgeofs=get_constant("port_offset");
|
int edgeofs=get_constant("port_offset");
|
||||||
icofs.y+=sb->get_margin(MARGIN_TOP);
|
icofs.y+=sb->get_margin(MARGIN_TOP);
|
||||||
draw_style_box(sb,Rect2(Point2(),get_size()));
|
draw_style_box(sb,Rect2(Point2(),get_size()));
|
||||||
|
|
||||||
int w = get_size().width-sb->get_minimum_size().x;
|
int w = get_size().width-sb->get_minimum_size().x;
|
||||||
|
|
||||||
if (show_close)
|
if (show_close)
|
||||||
w-=close->get_width();
|
w-=close->get_width();
|
||||||
|
|
||||||
draw_string(title_font,Point2(sb->get_margin(MARGIN_LEFT),-title_font->get_height()+title_font->get_ascent()+title_offset),title,title_color,w);
|
draw_string(title_font,Point2(sb->get_margin(MARGIN_LEFT),-title_font->get_height()+title_font->get_ascent()+title_offset),title,title_color,w);
|
||||||
if (show_close) {
|
if (show_close) {
|
||||||
Vector2 cpos = Point2(w+sb->get_margin(MARGIN_LEFT),-close->get_height()+close_offset);
|
Vector2 cpos = Point2(w+sb->get_margin(MARGIN_LEFT),-close->get_height()+close_offset);
|
||||||
draw_texture(close,cpos);
|
draw_texture(close,cpos);
|
||||||
close_rect.pos=cpos;
|
close_rect.pos=cpos;
|
||||||
close_rect.size=close->get_size();
|
close_rect.size=close->get_size();
|
||||||
} else {
|
} else {
|
||||||
close_rect=Rect2();
|
close_rect=Rect2();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map<int,Slot>::Element *E=slot_info.front();E;E=E->next()) {
|
for (Map<int,Slot>::Element *E=slot_info.front();E;E=E->next()) {
|
||||||
|
|
||||||
if (E->key() < 0 || E->key()>=cache_y.size())
|
if (E->key() < 0 || E->key()>=cache_y.size())
|
||||||
continue;
|
continue;
|
||||||
if (!slot_info.has(E->key()))
|
if (!slot_info.has(E->key()))
|
||||||
continue;
|
continue;
|
||||||
const Slot &s=slot_info[E->key()];
|
const Slot &s=slot_info[E->key()];
|
||||||
//left
|
//left
|
||||||
if (s.enable_left)
|
if (s.enable_left)
|
||||||
port->draw(get_canvas_item(),icofs+Point2(edgeofs,cache_y[E->key()]),s.color_left);
|
port->draw(get_canvas_item(),icofs+Point2(edgeofs,cache_y[E->key()]),s.color_left);
|
||||||
if (s.enable_right)
|
if (s.enable_right)
|
||||||
port->draw(get_canvas_item(),icofs+Point2(get_size().x-edgeofs,cache_y[E->key()]),s.color_right);
|
port->draw(get_canvas_item(),icofs+Point2(get_size().x-edgeofs,cache_y[E->key()]),s.color_right);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_what==NOTIFICATION_SORT_CHILDREN) {
|
if (p_what==NOTIFICATION_SORT_CHILDREN) {
|
||||||
|
|
||||||
_resort();
|
_resort();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GraphNode::set_slot(int p_idx,bool p_enable_left,int p_type_left,const Color& p_color_left, bool p_enable_right,int p_type_right,const Color& p_color_right) {
|
void GraphNode::set_slot(int p_idx,bool p_enable_left,int p_type_left,const Color& p_color_left, bool p_enable_right,int p_type_right,const Color& p_color_right) {
|
||||||
|
|
||||||
ERR_FAIL_COND(p_idx<0);
|
ERR_FAIL_COND(p_idx<0);
|
||||||
|
|
||||||
if (!p_enable_left && p_type_left==0 && p_color_left==Color(1,1,1,1) && !p_enable_right && p_type_right==0 && p_color_right==Color(1,1,1,1)) {
|
if (!p_enable_left && p_type_left==0 && p_color_left==Color(1,1,1,1) && !p_enable_right && p_type_right==0 && p_color_right==Color(1,1,1,1)) {
|
||||||
slot_info.erase(p_idx);
|
slot_info.erase(p_idx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Slot s;
|
Slot s;
|
||||||
s.enable_left=p_enable_left;
|
s.enable_left=p_enable_left;
|
||||||
s.type_left=p_type_left;
|
s.type_left=p_type_left;
|
||||||
s.color_left=p_color_left;
|
s.color_left=p_color_left;
|
||||||
s.enable_right=p_enable_right;
|
s.enable_right=p_enable_right;
|
||||||
s.type_right=p_type_right;
|
s.type_right=p_type_right;
|
||||||
s.color_right=p_color_right;
|
s.color_right=p_color_right;
|
||||||
slot_info[p_idx]=s;
|
slot_info[p_idx]=s;
|
||||||
update();
|
update();
|
||||||
connpos_dirty=true;
|
connpos_dirty=true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphNode::clear_slot(int p_idx){
|
void GraphNode::clear_slot(int p_idx){
|
||||||
|
|
||||||
slot_info.erase(p_idx);
|
slot_info.erase(p_idx);
|
||||||
update();
|
update();
|
||||||
connpos_dirty=true;
|
connpos_dirty=true;
|
||||||
|
|
||||||
}
|
}
|
||||||
void GraphNode::clear_all_slots(){
|
void GraphNode::clear_all_slots(){
|
||||||
|
|
||||||
slot_info.clear();
|
slot_info.clear();
|
||||||
update();
|
update();
|
||||||
connpos_dirty=true;
|
connpos_dirty=true;
|
||||||
|
|
||||||
}
|
}
|
||||||
bool GraphNode::is_slot_enabled_left(int p_idx) const{
|
bool GraphNode::is_slot_enabled_left(int p_idx) const{
|
||||||
|
|
||||||
if (!slot_info.has(p_idx))
|
if (!slot_info.has(p_idx))
|
||||||
return false;
|
return false;
|
||||||
return slot_info[p_idx].enable_left;
|
return slot_info[p_idx].enable_left;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int GraphNode::get_slot_type_left(int p_idx) const{
|
int GraphNode::get_slot_type_left(int p_idx) const{
|
||||||
|
|
||||||
if (!slot_info.has(p_idx))
|
if (!slot_info.has(p_idx))
|
||||||
return 0;
|
return 0;
|
||||||
return slot_info[p_idx].type_left;
|
return slot_info[p_idx].type_left;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Color GraphNode::get_slot_color_left(int p_idx) const{
|
Color GraphNode::get_slot_color_left(int p_idx) const{
|
||||||
|
|
||||||
if (!slot_info.has(p_idx))
|
if (!slot_info.has(p_idx))
|
||||||
return Color(1,1,1,1);
|
return Color(1,1,1,1);
|
||||||
return slot_info[p_idx].color_left;
|
return slot_info[p_idx].color_left;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GraphNode::is_slot_enabled_right(int p_idx) const{
|
bool GraphNode::is_slot_enabled_right(int p_idx) const{
|
||||||
|
|
||||||
if (!slot_info.has(p_idx))
|
if (!slot_info.has(p_idx))
|
||||||
return false;
|
return false;
|
||||||
return slot_info[p_idx].enable_right;
|
return slot_info[p_idx].enable_right;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,301 +283,305 @@ bool GraphNode::is_slot_enabled_right(int p_idx) const{
|
|||||||
|
|
||||||
int GraphNode::get_slot_type_right(int p_idx) const{
|
int GraphNode::get_slot_type_right(int p_idx) const{
|
||||||
|
|
||||||
if (!slot_info.has(p_idx))
|
if (!slot_info.has(p_idx))
|
||||||
return 0;
|
return 0;
|
||||||
return slot_info[p_idx].type_right;
|
return slot_info[p_idx].type_right;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Color GraphNode::get_slot_color_right(int p_idx) const{
|
Color GraphNode::get_slot_color_right(int p_idx) const{
|
||||||
|
|
||||||
if (!slot_info.has(p_idx))
|
if (!slot_info.has(p_idx))
|
||||||
return Color(1,1,1,1);
|
return Color(1,1,1,1);
|
||||||
return slot_info[p_idx].color_right;
|
return slot_info[p_idx].color_right;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Size2 GraphNode::get_minimum_size() const {
|
Size2 GraphNode::get_minimum_size() const {
|
||||||
|
|
||||||
Ref<Font> title_font = get_font("title_font");
|
Ref<Font> title_font = get_font("title_font");
|
||||||
|
|
||||||
int sep=get_constant("separation");
|
int sep=get_constant("separation");
|
||||||
Ref<StyleBox> sb=get_stylebox("frame");
|
Ref<StyleBox> sb=get_stylebox("frame");
|
||||||
bool first=true;
|
bool first=true;
|
||||||
|
|
||||||
Size2 minsize;
|
Size2 minsize;
|
||||||
minsize.x=title_font->get_string_size(title).x;
|
minsize.x=title_font->get_string_size(title).x;
|
||||||
if (show_close) {
|
if (show_close) {
|
||||||
Ref<Texture> close =get_icon("close");
|
Ref<Texture> close =get_icon("close");
|
||||||
minsize.x+=sep+close->get_width();
|
minsize.x+=sep+close->get_width();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for(int i=0;i<get_child_count();i++) {
|
for(int i=0;i<get_child_count();i++) {
|
||||||
|
|
||||||
Control *c=get_child(i)->cast_to<Control>();
|
Control *c=get_child(i)->cast_to<Control>();
|
||||||
if (!c)
|
if (!c)
|
||||||
continue;
|
continue;
|
||||||
if (c->is_set_as_toplevel())
|
if (c->is_set_as_toplevel())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Size2i size=c->get_combined_minimum_size();
|
Size2i size=c->get_combined_minimum_size();
|
||||||
|
|
||||||
minsize.y+=size.y;
|
minsize.y+=size.y;
|
||||||
minsize.x=MAX(minsize.x,size.x);
|
minsize.x=MAX(minsize.x,size.x);
|
||||||
|
|
||||||
if (first)
|
if (first)
|
||||||
first=false;
|
first=false;
|
||||||
else
|
else
|
||||||
minsize.y+=sep;
|
minsize.y+=sep;
|
||||||
}
|
}
|
||||||
|
|
||||||
return minsize+sb->get_minimum_size();
|
return minsize+sb->get_minimum_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphNode::set_title(const String& p_title) {
|
void GraphNode::set_title(const String& p_title) {
|
||||||
|
|
||||||
title=p_title;
|
title=p_title;
|
||||||
minimum_size_changed();
|
minimum_size_changed();
|
||||||
update();
|
update();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String GraphNode::get_title() const{
|
String GraphNode::get_title() const{
|
||||||
|
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphNode::set_offset(const Vector2& p_offset) {
|
void GraphNode::set_offset(const Vector2& p_offset) {
|
||||||
|
|
||||||
offset=p_offset;
|
offset=p_offset;
|
||||||
emit_signal("offset_changed");
|
emit_signal("offset_changed");
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 GraphNode::get_offset() const {
|
Vector2 GraphNode::get_offset() const {
|
||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GraphNode::set_selected(bool p_selected)
|
||||||
|
{
|
||||||
|
selected = p_selected;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GraphNode::is_selected()
|
||||||
|
{
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GraphNode::set_drag(bool p_drag)
|
||||||
|
{
|
||||||
|
if (p_drag)
|
||||||
|
drag_from=get_offset();
|
||||||
|
else
|
||||||
|
emit_signal("dragged",drag_from,get_offset()); //useful for undo/redo
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 GraphNode::get_drag_from()
|
||||||
|
{
|
||||||
|
return drag_from;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void GraphNode::set_show_close_button(bool p_enable){
|
void GraphNode::set_show_close_button(bool p_enable){
|
||||||
|
|
||||||
show_close=p_enable;
|
show_close=p_enable;
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
bool GraphNode::is_close_button_visible() const{
|
bool GraphNode::is_close_button_visible() const{
|
||||||
|
|
||||||
return show_close;
|
return show_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphNode::_connpos_update() {
|
void GraphNode::_connpos_update() {
|
||||||
|
|
||||||
|
|
||||||
int edgeofs=get_constant("port_offset");
|
int edgeofs=get_constant("port_offset");
|
||||||
int sep=get_constant("separation");
|
int sep=get_constant("separation");
|
||||||
|
|
||||||
Ref<StyleBox> sb=get_stylebox("frame");
|
Ref<StyleBox> sb=get_stylebox("frame");
|
||||||
Ref<Texture> port =get_icon("port");
|
conn_input_cache.clear();
|
||||||
conn_input_cache.clear();
|
conn_output_cache.clear();
|
||||||
conn_output_cache.clear();
|
int vofs=0;
|
||||||
int vofs=0;
|
|
||||||
|
|
||||||
int idx=0;
|
int idx=0;
|
||||||
|
|
||||||
for(int i=0;i<get_child_count();i++) {
|
for(int i=0;i<get_child_count();i++) {
|
||||||
Control *c=get_child(i)->cast_to<Control>();
|
Control *c=get_child(i)->cast_to<Control>();
|
||||||
if (!c)
|
if (!c)
|
||||||
continue;
|
continue;
|
||||||
if (c->is_set_as_toplevel())
|
if (c->is_set_as_toplevel())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Size2i size=c->get_combined_minimum_size();
|
Size2i size=c->get_combined_minimum_size();
|
||||||
|
|
||||||
int y = sb->get_margin(MARGIN_TOP)+vofs;
|
int y = sb->get_margin(MARGIN_TOP)+vofs;
|
||||||
int h = size.y;
|
int h = size.y;
|
||||||
|
|
||||||
|
|
||||||
if (slot_info.has(idx)) {
|
if (slot_info.has(idx)) {
|
||||||
|
|
||||||
if (slot_info[idx].enable_left) {
|
if (slot_info[idx].enable_left) {
|
||||||
ConnCache cc;
|
ConnCache cc;
|
||||||
cc.pos=Point2i(edgeofs,y+h/2);
|
cc.pos=Point2i(edgeofs,y+h/2);
|
||||||
cc.type=slot_info[idx].type_left;
|
cc.type=slot_info[idx].type_left;
|
||||||
cc.color=slot_info[idx].color_left;
|
cc.color=slot_info[idx].color_left;
|
||||||
conn_input_cache.push_back(cc);
|
conn_input_cache.push_back(cc);
|
||||||
}
|
}
|
||||||
if (slot_info[idx].enable_right) {
|
if (slot_info[idx].enable_right) {
|
||||||
ConnCache cc;
|
ConnCache cc;
|
||||||
cc.pos=Point2i(get_size().width-edgeofs,y+h/2);
|
cc.pos=Point2i(get_size().width-edgeofs,y+h/2);
|
||||||
cc.type=slot_info[idx].type_right;
|
cc.type=slot_info[idx].type_right;
|
||||||
cc.color=slot_info[idx].color_right;
|
cc.color=slot_info[idx].color_right;
|
||||||
conn_output_cache.push_back(cc);
|
conn_output_cache.push_back(cc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vofs>0)
|
if (vofs>0)
|
||||||
vofs+=sep;
|
vofs+=sep;
|
||||||
vofs+=size.y;
|
vofs+=size.y;
|
||||||
idx++;
|
idx++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
connpos_dirty=false;
|
connpos_dirty=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GraphNode::get_connection_input_count() {
|
int GraphNode::get_connection_input_count() {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
return conn_input_cache.size();
|
return conn_input_cache.size();
|
||||||
|
|
||||||
}
|
}
|
||||||
int GraphNode::get_connection_output_count() {
|
int GraphNode::get_connection_output_count() {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
return conn_output_cache.size();
|
return conn_output_cache.size();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Vector2 GraphNode::get_connection_input_pos(int p_idx) {
|
Vector2 GraphNode::get_connection_input_pos(int p_idx) {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),Vector2());
|
ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),Vector2());
|
||||||
return conn_input_cache[p_idx].pos;
|
return conn_input_cache[p_idx].pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GraphNode::get_connection_input_type(int p_idx) {
|
int GraphNode::get_connection_input_type(int p_idx) {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),0);
|
ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),0);
|
||||||
return conn_input_cache[p_idx].type;
|
return conn_input_cache[p_idx].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
Color GraphNode::get_connection_input_color(int p_idx) {
|
Color GraphNode::get_connection_input_color(int p_idx) {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),Color());
|
ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),Color());
|
||||||
return conn_input_cache[p_idx].color;
|
return conn_input_cache[p_idx].color;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 GraphNode::get_connection_output_pos(int p_idx){
|
Vector2 GraphNode::get_connection_output_pos(int p_idx){
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),Vector2());
|
ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),Vector2());
|
||||||
return conn_output_cache[p_idx].pos;
|
return conn_output_cache[p_idx].pos;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int GraphNode::get_connection_output_type(int p_idx) {
|
int GraphNode::get_connection_output_type(int p_idx) {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),0);
|
ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),0);
|
||||||
return conn_output_cache[p_idx].type;
|
return conn_output_cache[p_idx].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
Color GraphNode::get_connection_output_color(int p_idx) {
|
Color GraphNode::get_connection_output_color(int p_idx) {
|
||||||
|
|
||||||
if (connpos_dirty)
|
if (connpos_dirty)
|
||||||
_connpos_update();
|
_connpos_update();
|
||||||
|
|
||||||
ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),Color());
|
ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),Color());
|
||||||
return conn_output_cache[p_idx].color;
|
return conn_output_cache[p_idx].color;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphNode::_input_event(const InputEvent& p_ev) {
|
void GraphNode::_input_event(const InputEvent& p_ev) {
|
||||||
|
|
||||||
if (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.pressed && p_ev.mouse_button.button_index==BUTTON_LEFT) {
|
if (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.pressed && p_ev.mouse_button.button_index==BUTTON_LEFT) {
|
||||||
|
|
||||||
Vector2 mpos = Vector2(p_ev.mouse_button.x,p_ev.mouse_button.y);
|
Vector2 mpos = Vector2(p_ev.mouse_button.x,p_ev.mouse_button.y);
|
||||||
if (close_rect.size!=Size2() && close_rect.has_point(mpos)) {
|
if (close_rect.size!=Size2() && close_rect.has_point(mpos)) {
|
||||||
emit_signal("close_request");
|
emit_signal("close_request");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
emit_signal("raise_request");
|
||||||
|
|
||||||
drag_from=get_offset();
|
}
|
||||||
drag_accum=Vector2();
|
|
||||||
dragging=true;
|
|
||||||
emit_signal("raise_request");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p_ev.type==InputEvent::MOUSE_BUTTON && !p_ev.mouse_button.pressed && p_ev.mouse_button.button_index==BUTTON_LEFT) {
|
|
||||||
|
|
||||||
dragging=false;
|
|
||||||
emit_signal("dragged",drag_from,get_offset()); //useful for undo/redo
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p_ev.type==InputEvent::MOUSE_MOTION && dragging) {
|
|
||||||
|
|
||||||
drag_accum+=Vector2(p_ev.mouse_motion.relative_x,p_ev.mouse_motion.relative_y);
|
|
||||||
set_offset(drag_from+drag_accum);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GraphNode::_bind_methods() {
|
void GraphNode::_bind_methods() {
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("set_title","title"),&GraphNode::set_title);
|
ObjectTypeDB::bind_method(_MD("set_title","title"),&GraphNode::set_title);
|
||||||
ObjectTypeDB::bind_method(_MD("get_title"),&GraphNode::get_title);
|
ObjectTypeDB::bind_method(_MD("get_title"),&GraphNode::get_title);
|
||||||
ObjectTypeDB::bind_method(_MD("_input_event"),&GraphNode::_input_event);
|
ObjectTypeDB::bind_method(_MD("_input_event"),&GraphNode::_input_event);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("set_slot","idx","enable_left","type_left","color_left","enable_right","type_right","color_right"),&GraphNode::set_slot);
|
ObjectTypeDB::bind_method(_MD("set_slot","idx","enable_left","type_left","color_left","enable_right","type_right","color_right"),&GraphNode::set_slot);
|
||||||
ObjectTypeDB::bind_method(_MD("clear_slot","idx"),&GraphNode::clear_slot);
|
ObjectTypeDB::bind_method(_MD("clear_slot","idx"),&GraphNode::clear_slot);
|
||||||
ObjectTypeDB::bind_method(_MD("clear_all_slots","idx"),&GraphNode::clear_all_slots);
|
ObjectTypeDB::bind_method(_MD("clear_all_slots","idx"),&GraphNode::clear_all_slots);
|
||||||
ObjectTypeDB::bind_method(_MD("is_slot_enabled_left","idx"),&GraphNode::is_slot_enabled_left);
|
ObjectTypeDB::bind_method(_MD("is_slot_enabled_left","idx"),&GraphNode::is_slot_enabled_left);
|
||||||
ObjectTypeDB::bind_method(_MD("get_slot_type_left","idx"),&GraphNode::get_slot_type_left);
|
ObjectTypeDB::bind_method(_MD("get_slot_type_left","idx"),&GraphNode::get_slot_type_left);
|
||||||
ObjectTypeDB::bind_method(_MD("get_slot_color_left","idx"),&GraphNode::get_slot_color_left);
|
ObjectTypeDB::bind_method(_MD("get_slot_color_left","idx"),&GraphNode::get_slot_color_left);
|
||||||
ObjectTypeDB::bind_method(_MD("is_slot_enabled_right","idx"),&GraphNode::is_slot_enabled_right);
|
ObjectTypeDB::bind_method(_MD("is_slot_enabled_right","idx"),&GraphNode::is_slot_enabled_right);
|
||||||
ObjectTypeDB::bind_method(_MD("get_slot_type_right","idx"),&GraphNode::get_slot_type_right);
|
ObjectTypeDB::bind_method(_MD("get_slot_type_right","idx"),&GraphNode::get_slot_type_right);
|
||||||
ObjectTypeDB::bind_method(_MD("get_slot_color_right","idx"),&GraphNode::get_slot_color_right);
|
ObjectTypeDB::bind_method(_MD("get_slot_color_right","idx"),&GraphNode::get_slot_color_right);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("set_offset","offset"),&GraphNode::set_offset);
|
ObjectTypeDB::bind_method(_MD("set_offset","offset"),&GraphNode::set_offset);
|
||||||
ObjectTypeDB::bind_method(_MD("get_offset"),&GraphNode::get_offset);
|
ObjectTypeDB::bind_method(_MD("get_offset"),&GraphNode::get_offset);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_output_count"),&GraphNode::get_connection_output_count);
|
ObjectTypeDB::bind_method(_MD("get_connection_output_count"),&GraphNode::get_connection_output_count);
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_input_count"),&GraphNode::get_connection_input_count);
|
ObjectTypeDB::bind_method(_MD("get_connection_input_count"),&GraphNode::get_connection_input_count);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_output_pos","idx"),&GraphNode::get_connection_output_pos);
|
ObjectTypeDB::bind_method(_MD("get_connection_output_pos","idx"),&GraphNode::get_connection_output_pos);
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_output_type","idx"),&GraphNode::get_connection_output_type);
|
ObjectTypeDB::bind_method(_MD("get_connection_output_type","idx"),&GraphNode::get_connection_output_type);
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_output_color","idx"),&GraphNode::get_connection_output_color);
|
ObjectTypeDB::bind_method(_MD("get_connection_output_color","idx"),&GraphNode::get_connection_output_color);
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_input_pos","idx"),&GraphNode::get_connection_input_pos);
|
ObjectTypeDB::bind_method(_MD("get_connection_input_pos","idx"),&GraphNode::get_connection_input_pos);
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_input_type","idx"),&GraphNode::get_connection_input_type);
|
ObjectTypeDB::bind_method(_MD("get_connection_input_type","idx"),&GraphNode::get_connection_input_type);
|
||||||
ObjectTypeDB::bind_method(_MD("get_connection_input_color","idx"),&GraphNode::get_connection_input_color);
|
ObjectTypeDB::bind_method(_MD("get_connection_input_color","idx"),&GraphNode::get_connection_input_color);
|
||||||
|
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("set_show_close_button","show"),&GraphNode::set_show_close_button);
|
ObjectTypeDB::bind_method(_MD("set_show_close_button","show"),&GraphNode::set_show_close_button);
|
||||||
ObjectTypeDB::bind_method(_MD("is_close_button_visible"),&GraphNode::is_close_button_visible);
|
ObjectTypeDB::bind_method(_MD("is_close_button_visible"),&GraphNode::is_close_button_visible);
|
||||||
|
|
||||||
ADD_PROPERTY( PropertyInfo(Variant::STRING,"title"),_SCS("set_title"),_SCS("get_title"));
|
ADD_PROPERTY( PropertyInfo(Variant::STRING,"title"),_SCS("set_title"),_SCS("get_title"));
|
||||||
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"show_close"),_SCS("set_show_close_button"),_SCS("is_close_button_visible"));
|
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"show_close"),_SCS("set_show_close_button"),_SCS("is_close_button_visible"));
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("offset_changed"));
|
ADD_SIGNAL(MethodInfo("offset_changed"));
|
||||||
ADD_SIGNAL(MethodInfo("dragged",PropertyInfo(Variant::VECTOR2,"from"),PropertyInfo(Variant::VECTOR2,"to")));
|
ADD_SIGNAL(MethodInfo("dragged",PropertyInfo(Variant::VECTOR2,"from"),PropertyInfo(Variant::VECTOR2,"to")));
|
||||||
ADD_SIGNAL(MethodInfo("raise_request"));
|
ADD_SIGNAL(MethodInfo("raise_request"));
|
||||||
ADD_SIGNAL(MethodInfo("close_request"));
|
ADD_SIGNAL(MethodInfo("close_request"));
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphNode::GraphNode() {
|
GraphNode::GraphNode() {
|
||||||
|
show_close=false;
|
||||||
dragging=false;
|
connpos_dirty=true;
|
||||||
show_close=false;
|
|
||||||
connpos_dirty=true;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,96 +5,101 @@
|
|||||||
|
|
||||||
class GraphNode : public Container {
|
class GraphNode : public Container {
|
||||||
|
|
||||||
OBJ_TYPE(GraphNode,Container);
|
OBJ_TYPE(GraphNode,Container);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Slot {
|
struct Slot {
|
||||||
bool enable_left;
|
bool enable_left;
|
||||||
int type_left;
|
int type_left;
|
||||||
Color color_left;
|
Color color_left;
|
||||||
bool enable_right;
|
bool enable_right;
|
||||||
int type_right;
|
int type_right;
|
||||||
Color color_right;
|
Color color_right;
|
||||||
|
|
||||||
|
|
||||||
Slot() { enable_left=false; type_left=0; color_left=Color(1,1,1,1); enable_right=false; type_right=0; color_right=Color(1,1,1,1); };
|
Slot() { enable_left=false; type_left=0; color_left=Color(1,1,1,1); enable_right=false; type_right=0; color_right=Color(1,1,1,1); }
|
||||||
};
|
};
|
||||||
|
|
||||||
String title;
|
String title;
|
||||||
bool show_close;
|
bool show_close;
|
||||||
Vector2 offset;
|
Vector2 offset;
|
||||||
|
|
||||||
Rect2 close_rect;
|
Rect2 close_rect;
|
||||||
|
|
||||||
Vector<int> cache_y;
|
Vector<int> cache_y;
|
||||||
|
|
||||||
struct ConnCache {
|
struct ConnCache {
|
||||||
Vector2 pos;
|
Vector2 pos;
|
||||||
int type;
|
int type;
|
||||||
Color color;
|
Color color;
|
||||||
};
|
};
|
||||||
|
|
||||||
Vector<ConnCache> conn_input_cache;
|
Vector<ConnCache> conn_input_cache;
|
||||||
Vector<ConnCache> conn_output_cache;
|
Vector<ConnCache> conn_output_cache;
|
||||||
|
|
||||||
Map<int,Slot> slot_info;
|
Map<int,Slot> slot_info;
|
||||||
|
|
||||||
bool connpos_dirty;
|
bool connpos_dirty;
|
||||||
|
|
||||||
void _connpos_update();
|
void _connpos_update();
|
||||||
void _resort();
|
void _resort();
|
||||||
|
|
||||||
Vector2 drag_from;
|
Vector2 drag_from;
|
||||||
Vector2 drag_accum;
|
bool selected;
|
||||||
bool dragging;
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void _input_event(const InputEvent& p_ev);
|
void _input_event(const InputEvent& p_ev);
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
bool _set(const StringName& p_name, const Variant& p_value);
|
bool _set(const StringName& p_name, const Variant& p_value);
|
||||||
bool _get(const StringName& p_name,Variant &r_ret) const;
|
bool _get(const StringName& p_name,Variant &r_ret) const;
|
||||||
void _get_property_list( List<PropertyInfo> *p_list) const;
|
void _get_property_list( List<PropertyInfo> *p_list) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void set_slot(int p_idx,bool p_enable_left,int p_type_left,const Color& p_color_left, bool p_enable_right,int p_type_right,const Color& p_color_right);
|
void set_slot(int p_idx,bool p_enable_left,int p_type_left,const Color& p_color_left, bool p_enable_right,int p_type_right,const Color& p_color_right);
|
||||||
void clear_slot(int p_idx);
|
void clear_slot(int p_idx);
|
||||||
void clear_all_slots();
|
void clear_all_slots();
|
||||||
bool is_slot_enabled_left(int p_idx) const;
|
bool is_slot_enabled_left(int p_idx) const;
|
||||||
int get_slot_type_left(int p_idx) const;
|
int get_slot_type_left(int p_idx) const;
|
||||||
Color get_slot_color_left(int p_idx) const;
|
Color get_slot_color_left(int p_idx) const;
|
||||||
bool is_slot_enabled_right(int p_idx) const;
|
bool is_slot_enabled_right(int p_idx) const;
|
||||||
int get_slot_type_right(int p_idx) const;
|
int get_slot_type_right(int p_idx) const;
|
||||||
Color get_slot_color_right(int p_idx) const;
|
Color get_slot_color_right(int p_idx) const;
|
||||||
|
|
||||||
void set_title(const String& p_title);
|
void set_title(const String& p_title);
|
||||||
String get_title() const;
|
String get_title() const;
|
||||||
|
|
||||||
void set_offset(const Vector2& p_offset);
|
void set_offset(const Vector2& p_offset);
|
||||||
Vector2 get_offset() const;
|
Vector2 get_offset() const;
|
||||||
|
|
||||||
void set_show_close_button(bool p_enable);
|
void set_selected(bool p_selected);
|
||||||
bool is_close_button_visible() const;
|
bool is_selected();
|
||||||
|
|
||||||
int get_connection_input_count() ;
|
void set_drag(bool p_drag);
|
||||||
int get_connection_output_count() ;
|
Vector2 get_drag_from();
|
||||||
Vector2 get_connection_input_pos(int p_idx);
|
|
||||||
int get_connection_input_type(int p_idx);
|
void set_show_close_button(bool p_enable);
|
||||||
Color get_connection_input_color(int p_idx);
|
bool is_close_button_visible() const;
|
||||||
Vector2 get_connection_output_pos(int p_idx);
|
|
||||||
int get_connection_output_type(int p_idx);
|
int get_connection_input_count() ;
|
||||||
Color get_connection_output_color(int p_idx);
|
int get_connection_output_count() ;
|
||||||
|
Vector2 get_connection_input_pos(int p_idx);
|
||||||
|
int get_connection_input_type(int p_idx);
|
||||||
|
Color get_connection_input_color(int p_idx);
|
||||||
|
Vector2 get_connection_output_pos(int p_idx);
|
||||||
|
int get_connection_output_type(int p_idx);
|
||||||
|
Color get_connection_output_color(int p_idx);
|
||||||
|
|
||||||
|
|
||||||
virtual Size2 get_minimum_size() const;
|
virtual Size2 get_minimum_size() const;
|
||||||
|
|
||||||
GraphNode();
|
GraphNode();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -558,9 +558,11 @@ void make_default_theme() {
|
|||||||
// GraphNode
|
// GraphNode
|
||||||
|
|
||||||
Ref<StyleBoxTexture> graphsb = make_stylebox(graph_node_png,6,24,6,5,16,24,16,5);
|
Ref<StyleBoxTexture> graphsb = make_stylebox(graph_node_png,6,24,6,5,16,24,16,5);
|
||||||
|
Ref<StyleBoxTexture> graphsbselected = make_stylebox(graph_node_selected_png,6,24,6,5,16,24,16,5);
|
||||||
//graphsb->set_expand_margin_size(MARGIN_LEFT,10);
|
//graphsb->set_expand_margin_size(MARGIN_LEFT,10);
|
||||||
//graphsb->set_expand_margin_size(MARGIN_RIGHT,10);
|
//graphsb->set_expand_margin_size(MARGIN_RIGHT,10);
|
||||||
t->set_stylebox("frame","GraphNode", graphsb );
|
t->set_stylebox("frame","GraphNode", graphsb );
|
||||||
|
t->set_stylebox("selectedframe","GraphNode", graphsbselected );
|
||||||
t->set_constant("separation","GraphNode", 1 );
|
t->set_constant("separation","GraphNode", 1 );
|
||||||
t->set_icon("port","GraphNode", make_icon( graph_port_png ) );
|
t->set_icon("port","GraphNode", make_icon( graph_port_png ) );
|
||||||
t->set_icon("close","GraphNode", make_icon( graph_node_close_png ) );
|
t->set_icon("close","GraphNode", make_icon( graph_node_close_png ) );
|
||||||
|
|||||||
BIN
scene/resources/default_theme/graph_node_selected.png
Normal file
BIN
scene/resources/default_theme/graph_node_selected.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 738 B |
@@ -114,6 +114,11 @@ static const unsigned char graph_node_close_png[]={
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const unsigned char graph_node_selected_png[]={
|
||||||
|
0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x40,0x8,0x6,0x0,0x0,0x0,0x13,0x7d,0xf7,0x96,0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdf,0x7,0x12,0x1,0xc,0x6,0x23,0x98,0xc7,0x50,0x0,0x0,0x0,0x1d,0x69,0x54,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x0,0x0,0x0,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,0x7,0x0,0x0,0x2,0x46,0x49,0x44,0x41,0x54,0x58,0xc3,0xed,0x97,0xcd,0x6a,0x13,0x51,0x14,0xc7,0x7f,0xe7,0xce,0x34,0x49,0xd,0xa6,0xb1,0x2a,0xe2,0x7,0x74,0xa1,0x6e,0x4,0x85,0xe2,0x3,0xb8,0x72,0x21,0xba,0x16,0x5c,0xb9,0x16,0x4,0x7d,0x84,0x3e,0x82,0x82,0xe0,0xda,0x95,0x2f,0x60,0x71,0xe1,0xca,0x7,0xd0,0x82,0xa5,0x6e,0xd4,0x45,0xc1,0x8f,0x4a,0x6c,0x9a,0x46,0x62,0x66,0xa6,0x73,0xef,0x71,0xe1,0x4c,0x92,0x99,0x4c,0x93,0x36,0xdd,0xc9,0xfc,0x37,0x77,0x3e,0xee,0xfd,0xdd,0x73,0xfe,0xf7,0xc,0xcc,0x11,0x86,0x12,0xc0,0x0,0x5e,0x32,0xa,0x59,0x29,0xe0,0x0,0x9b,0x8c,0xca,0xc8,0x24,0x3,0x1c,0x3,0x16,0x81,0xd3,0x40,0x3,0x98,0xcb,0x1,0xf6,0x80,0x2e,0xd0,0x2,0xda,0xc0,0x1f,0xc0,0xa5,0xbb,0xd6,0x81,0x4b,0xb,0xc7,0x9b,0xf,0x6a,0xd5,0xda,0xad,0x4a,0xa5,0x7a,0x81,0x2,0x45,0x51,0xf8,0x35,0x8,0x83,0xd7,0xbb,0xbf,0x3b,0xcf,0x81,0xcf,0x40,0x4f,0x92,0x9d,0x96,0x16,0x9b,0x27,0x9f,0x5c,0x5c,0xba,0x7c,0xfb,0xfe,0xcb,0x3b,0x34,0x2b,0x27,0x8a,0xd6,0xd3,0x89,0x76,0x78,0x71,0xef,0x15,0x5f,0x36,0x3f,0xad,0xb6,0x3b,0xdb,0x8f,0x81,0x4d,0x1,0x6a,0xc0,0xf2,0xd9,0x33,0xe7,0xdf,0xac,0xbc,0x7d,0x54,0xdf,0x73,0x11,0x81,0xed,0x17,0x2,0x6a,0xde,0x3c,0x73,0xa6,0xc2,0xca,0x8d,0xa7,0xbd,0x1f,0x3f,0xbf,0xdd,0x4,0xd6,0xfc,0xc4,0x87,0xba,0xef,0xf9,0xf5,0x6e,0xb4,0xc3,0x24,0xf5,0xe3,0x1e,0x7d,0x7a,0xf8,0x9e,0x5f,0x4f,0xd2,0x96,0x14,0xe0,0x1,0x58,0xb5,0x39,0xdb,0x1d,0x82,0x19,0x5c,0xe7,0xe4,0xa5,0x0,0x4d,0x8f,0x44,0x71,0xa8,0x2a,0x22,0x92,0x81,0x4c,0x92,0x3f,0x7a,0xe3,0xd4,0xe2,0x54,0x41,0xc1,0x13,0xf,0xc5,0xe1,0x54,0x31,0x22,0x8,0xa6,0x10,0x96,0x1,0x58,0x1d,0x4e,0x88,0x35,0x1e,0x79,0x9e,0xd6,0xd0,0x94,0x8,0x54,0xb3,0x93,0x1c,0x8a,0x41,0x6,0x63,0xfa,0x6c,0x5f,0x40,0xe4,0xa2,0xcc,0x4b,0x23,0x32,0xd8,0x37,0x4e,0x52,0x99,0x1c,0x41,0x2e,0x4c,0x9b,0xdd,0x6c,0xec,0xbe,0x20,0x5,0xe5,0xb0,0xca,0x99,0x68,0x93,0x48,0x14,0x41,0x30,0x22,0x3,0x63,0x5,0x41,0x51,0x3c,0x31,0x93,0x8f,0x31,0xf3,0xed,0x6a,0xf6,0x5b,0xfe,0xe7,0x85,0x9b,0x0,0x98,0x52,0x34,0x7,0x2a,0xa4,0xb4,0x74,0x8b,0x4c,0x2d,0x2a,0xa6,0xb1,0x42,0x32,0x8c,0x1b,0x39,0x3c,0x7b,0x37,0xbd,0x90,0xec,0x51,0x52,0x88,0x5d,0x3c,0x36,0x21,0xd,0x39,0x4d,0x4d,0x72,0xc5,0x94,0x1,0xac,0xde,0x7d,0x3f,0xbb,0x89,0xf1,0x9e,0x65,0xf9,0xea,0xf5,0x3,0x2d,0x5a,0x5b,0x7f,0x57,0x1c,0xc1,0x6e,0xb7,0x73,0xe8,0x8,0xc,0x47,0x54,0x9,0x28,0x1,0x25,0xa0,0x4,0x94,0x80,0x12,0x50,0x2,0xfe,0x4b,0x80,0x14,0xf4,0x88,0x87,0x8e,0xc0,0xcd,0xb0,0xd6,0xa5,0x0,0x7,0x4,0xd6,0xda,0xb0,0xe0,0x27,0x6d,0x7c,0x55,0xc,0xd6,0xda,0x10,0x8,0x0,0x67,0x92,0x56,0x76,0x3b,0x8,0xfb,0x1b,0xad,0xf6,0x16,0x93,0x20,0x2e,0x86,0x56,0x7b,0x8b,0x20,0xec,0x6f,0x0,0xdb,0x80,0x4d,0x3b,0xd7,0x5,0xe0,0x5a,0xa3,0xde,0x7c,0x56,0xab,0xce,0x5f,0xf1,0x3c,0xaf,0xd0,0x5c,0x6b,0xad,0xb,0xc2,0xfe,0xc7,0x6e,0xaf,0xf3,0x10,0xf8,0x0,0xec,0xca,0x48,0xb,0xd7,0x0,0xce,0x1,0xa7,0x80,0xea,0x3e,0xcd,0x77,0x8,0xfc,0x2,0xbe,0x27,0x7d,0xb4,0x95,0x9c,0xa1,0x7e,0xda,0xf,0xee,0x93,0x85,0x26,0x29,0xc7,0x33,0x1a,0x3f,0xae,0xbf,0xf0,0x27,0xf6,0x42,0xf6,0xf5,0xfd,0xae,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static const unsigned char graph_port_png[]={
|
static const unsigned char graph_port_png[]={
|
||||||
0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0xa,0x8,0x6,0x0,0x0,0x0,0x8d,0x32,0xcf,0xbd,0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0x0,0x0,0x0,0x0,0x0,0xf9,0x43,0xbb,0x7f,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xde,0xc,0x14,0x17,0x20,0x3,0xeb,0x8f,0x3a,0xdb,0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x57,0x81,0xe,0x17,0x0,0x0,0x1,0x65,0x49,0x44,0x41,0x54,0x18,0xd3,0x4d,0xd0,0x4f,0x6b,0xda,0x70,0x1c,0x7,0xe0,0xcf,0x37,0x7f,0x7e,0x49,0x66,0xd2,0x64,0x61,0x5,0x61,0x76,0x47,0xf1,0xa4,0x2d,0xdb,0x75,0x5,0x11,0x84,0xb0,0x5e,0xeb,0xd9,0xeb,0xf4,0x6d,0xec,0x2d,0xf8,0x26,0xb6,0x77,0xe0,0x45,0xba,0xa3,0x6c,0xa0,0x3b,0xad,0x39,0xb6,0x36,0x8,0x1b,0x4b,0x32,0xd2,0xc6,0x6c,0x9a,0x4f,0x4f,0x85,0x3e,0x2f,0xe1,0x11,0x0,0x20,0x29,0xd3,0xe9,0xd4,0xda,0x6e,0xb7,0x23,0xdf,0xf7,0xbb,0x0,0x90,0xe7,0xf9,0x8f,0x66,0xb3,0xf9,0x79,0x36,0x9b,0x55,0x22,0x42,0x83,0xa4,0x44,0x51,0xf4,0xea,0xe2,0xe2,0xc3,0xf7,0xf1,0x78,0xdc,0xa,0x82,0x40,0x8,0x20,0xcf,0x32,0x2e,0x97,0xcb,0x4f,0x51,0x14,0xbd,0x25,0xf9,0x5b,0x26,0x93,0x89,0xdd,0xe9,0x74,0xe2,0xf7,0xe7,0xe7,0x27,0x59,0xfa,0x87,0x65,0xb9,0x13,0x0,0xb0,0x1d,0x9b,0xe1,0xcb,0x50,0xbe,0x5e,0x5d,0xdd,0xfe,0xbc,0xbe,0x6e,0x6b,0x49,0x92,0x8c,0x4e,0x7b,0xa7,0xad,0xbf,0x79,0x4e,0xd3,0x54,0x12,0x86,0x21,0xc2,0x30,0x84,0x32,0x95,0xe4,0x79,0xc6,0xde,0xd9,0x59,0x2b,0x49,0xee,0x46,0x86,0xeb,0xba,0x5d,0xfb,0x85,0x23,0x87,0xfd,0x1e,0xb6,0xed,0x40,0xd7,0x35,0x0,0x40,0x7d,0x38,0xa0,0xdc,0xed,0x44,0x37,0x74,0xb8,0xae,0xd7,0x35,0x48,0x62,0xff,0xff,0x1f,0xfc,0x20,0x80,0xae,0xe9,0x78,0x42,0x0,0xca,0xb2,0x90,0x65,0x19,0x58,0xd7,0xd0,0x8a,0xa2,0x58,0xa7,0x69,0x56,0x6b,0xa2,0x51,0x29,0x5,0xcb,0x52,0xb0,0x94,0x5,0x4b,0x29,0x88,0x8,0xd3,0x34,0xad,0x8b,0xfb,0x62,0xad,0xf,0x6,0x83,0xb8,0xaa,0xaa,0xb1,0xe7,0x79,0xbe,0x77,0x74,0x44,0xb7,0xe1,0x89,0x69,0x1a,0x28,0xcb,0x92,0x9b,0xcd,0x46,0x56,0xab,0xd5,0x86,0xe4,0x47,0x21,0x29,0xc3,0xe1,0xf0,0xb8,0xdf,0xef,0x7f,0x6b,0xb7,0xdb,0xaf,0x1b,0x8d,0x86,0x46,0x10,0xf,0xf7,0xf,0x75,0x1c,0xc7,0x77,0x8b,0xc5,0xe2,0xdd,0x7c,0x3e,0xff,0x25,0xcf,0xc3,0x6f,0x6e,0x6f,0x2e,0x1d,0xdb,0xe9,0x9,0x80,0xb2,0x2a,0xd7,0x27,0xad,0x37,0x5f,0x9e,0xc2,0x1f,0x1,0x3a,0xe6,0xa5,0x7b,0xef,0xf2,0xf3,0xcd,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
|
0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0xa,0x8,0x6,0x0,0x0,0x0,0x8d,0x32,0xcf,0xbd,0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0x0,0x0,0x0,0x0,0x0,0xf9,0x43,0xbb,0x7f,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xde,0xc,0x14,0x17,0x20,0x3,0xeb,0x8f,0x3a,0xdb,0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x57,0x81,0xe,0x17,0x0,0x0,0x1,0x65,0x49,0x44,0x41,0x54,0x18,0xd3,0x4d,0xd0,0x4f,0x6b,0xda,0x70,0x1c,0x7,0xe0,0xcf,0x37,0x7f,0x7e,0x49,0x66,0xd2,0x64,0x61,0x5,0x61,0x76,0x47,0xf1,0xa4,0x2d,0xdb,0x75,0x5,0x11,0x84,0xb0,0x5e,0xeb,0xd9,0xeb,0xf4,0x6d,0xec,0x2d,0xf8,0x26,0xb6,0x77,0xe0,0x45,0xba,0xa3,0x6c,0xa0,0x3b,0xad,0x39,0xb6,0x36,0x8,0x1b,0x4b,0x32,0xd2,0xc6,0x6c,0x9a,0x4f,0x4f,0x85,0x3e,0x2f,0xe1,0x11,0x0,0x20,0x29,0xd3,0xe9,0xd4,0xda,0x6e,0xb7,0x23,0xdf,0xf7,0xbb,0x0,0x90,0xe7,0xf9,0x8f,0x66,0xb3,0xf9,0x79,0x36,0x9b,0x55,0x22,0x42,0x83,0xa4,0x44,0x51,0xf4,0xea,0xe2,0xe2,0xc3,0xf7,0xf1,0x78,0xdc,0xa,0x82,0x40,0x8,0x20,0xcf,0x32,0x2e,0x97,0xcb,0x4f,0x51,0x14,0xbd,0x25,0xf9,0x5b,0x26,0x93,0x89,0xdd,0xe9,0x74,0xe2,0xf7,0xe7,0xe7,0x27,0x59,0xfa,0x87,0x65,0xb9,0x13,0x0,0xb0,0x1d,0x9b,0xe1,0xcb,0x50,0xbe,0x5e,0x5d,0xdd,0xfe,0xbc,0xbe,0x6e,0x6b,0x49,0x92,0x8c,0x4e,0x7b,0xa7,0xad,0xbf,0x79,0x4e,0xd3,0x54,0x12,0x86,0x21,0xc2,0x30,0x84,0x32,0x95,0xe4,0x79,0xc6,0xde,0xd9,0x59,0x2b,0x49,0xee,0x46,0x86,0xeb,0xba,0x5d,0xfb,0x85,0x23,0x87,0xfd,0x1e,0xb6,0xed,0x40,0xd7,0x35,0x0,0x40,0x7d,0x38,0xa0,0xdc,0xed,0x44,0x37,0x74,0xb8,0xae,0xd7,0x35,0x48,0x62,0xff,0xff,0x1f,0xfc,0x20,0x80,0xae,0xe9,0x78,0x42,0x0,0xca,0xb2,0x90,0x65,0x19,0x58,0xd7,0xd0,0x8a,0xa2,0x58,0xa7,0x69,0x56,0x6b,0xa2,0x51,0x29,0x5,0xcb,0x52,0xb0,0x94,0x5,0x4b,0x29,0x88,0x8,0xd3,0x34,0xad,0x8b,0xfb,0x62,0xad,0xf,0x6,0x83,0xb8,0xaa,0xaa,0xb1,0xe7,0x79,0xbe,0x77,0x74,0x44,0xb7,0xe1,0x89,0x69,0x1a,0x28,0xcb,0x92,0x9b,0xcd,0x46,0x56,0xab,0xd5,0x86,0xe4,0x47,0x21,0x29,0xc3,0xe1,0xf0,0xb8,0xdf,0xef,0x7f,0x6b,0xb7,0xdb,0xaf,0x1b,0x8d,0x86,0x46,0x10,0xf,0xf7,0xf,0x75,0x1c,0xc7,0x77,0x8b,0xc5,0xe2,0xdd,0x7c,0x3e,0xff,0x25,0xcf,0xc3,0x6f,0x6e,0x6f,0x2e,0x1d,0xdb,0xe9,0x9,0x80,0xb2,0x2a,0xd7,0x27,0xad,0x37,0x5f,0x9e,0xc2,0x1f,0x1,0x3a,0xe6,0xa5,0x7b,0xef,0xf2,0xf3,0xcd,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
|
||||||
};
|
};
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -41,187 +41,189 @@
|
|||||||
#include "tools/editor/property_editor.h"
|
#include "tools/editor/property_editor.h"
|
||||||
#include "scene/resources/shader_graph.h"
|
#include "scene/resources/shader_graph.h"
|
||||||
/**
|
/**
|
||||||
@author Juan Linietsky <reduzio@gmail.com>
|
@author Juan Linietsky <reduzio@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
class GraphColorRampEdit : public Control {
|
class GraphColorRampEdit : public Control {
|
||||||
|
|
||||||
OBJ_TYPE(GraphColorRampEdit,Control);
|
OBJ_TYPE(GraphColorRampEdit,Control);
|
||||||
|
|
||||||
|
|
||||||
struct Point {
|
struct Point {
|
||||||
|
|
||||||
float offset;
|
float offset;
|
||||||
Color color;
|
Color color;
|
||||||
bool operator<(const Point& p_ponit) const {
|
bool operator<(const Point& p_ponit) const {
|
||||||
return offset<p_ponit.offset;
|
return offset<p_ponit.offset;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
PopupPanel *popup;
|
PopupPanel *popup;
|
||||||
ColorPicker *picker;
|
ColorPicker *picker;
|
||||||
|
|
||||||
|
|
||||||
bool grabbing;
|
bool grabbing;
|
||||||
int grabbed;
|
int grabbed;
|
||||||
float grabbed_at;
|
float grabbed_at;
|
||||||
Vector<Point> points;
|
Vector<Point> points;
|
||||||
|
|
||||||
void _color_changed(const Color& p_color);
|
void _color_changed(const Color& p_color);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _input_event(const InputEvent& p_event);
|
void _input_event(const InputEvent& p_event);
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void set_ramp(const Vector<float>& p_offsets,const Vector<Color>& p_colors);
|
void set_ramp(const Vector<float>& p_offsets,const Vector<Color>& p_colors);
|
||||||
Vector<float> get_offsets() const;
|
Vector<float> get_offsets() const;
|
||||||
Vector<Color> get_colors() const;
|
Vector<Color> get_colors() const;
|
||||||
virtual Size2 get_minimum_size() const;
|
virtual Size2 get_minimum_size() const;
|
||||||
GraphColorRampEdit();
|
GraphColorRampEdit();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class GraphCurveMapEdit : public Control {
|
class GraphCurveMapEdit : public Control {
|
||||||
|
|
||||||
OBJ_TYPE(GraphCurveMapEdit,Control);
|
OBJ_TYPE(GraphCurveMapEdit,Control);
|
||||||
|
|
||||||
|
|
||||||
struct Point {
|
struct Point {
|
||||||
|
|
||||||
float offset;
|
float offset;
|
||||||
float height;
|
float height;
|
||||||
bool operator<(const Point& p_ponit) const {
|
bool operator<(const Point& p_ponit) const {
|
||||||
return offset<p_ponit.offset;
|
return offset<p_ponit.offset;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
bool grabbing;
|
bool grabbing;
|
||||||
int grabbed;
|
int grabbed;
|
||||||
Vector<Point> points;
|
Vector<Point> points;
|
||||||
|
|
||||||
void _plot_curve(const Vector2& p_a,const Vector2& p_b,const Vector2& p_c,const Vector2& p_d);
|
void _plot_curve(const Vector2& p_a,const Vector2& p_b,const Vector2& p_c,const Vector2& p_d);
|
||||||
protected:
|
protected:
|
||||||
void _input_event(const InputEvent& p_event);
|
void _input_event(const InputEvent& p_event);
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void set_points(const Vector<Vector2>& p_points);
|
void set_points(const Vector<Vector2>& p_points);
|
||||||
Vector<Vector2> get_points() const;
|
Vector<Vector2> get_points() const;
|
||||||
virtual Size2 get_minimum_size() const;
|
virtual Size2 get_minimum_size() const;
|
||||||
GraphCurveMapEdit();
|
GraphCurveMapEdit();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShaderGraphView : public Node {
|
class ShaderGraphView : public Node {
|
||||||
|
|
||||||
OBJ_TYPE(ShaderGraphView,Node);
|
OBJ_TYPE(ShaderGraphView,Node);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CustomPropertyEditor *ped_popup;
|
CustomPropertyEditor *ped_popup;
|
||||||
bool block_update;
|
bool block_update;
|
||||||
|
|
||||||
Label *status;
|
Label *status;
|
||||||
GraphEdit *graph_edit;
|
GraphEdit *graph_edit;
|
||||||
Ref<ShaderGraph> graph;
|
Ref<ShaderGraph> graph;
|
||||||
int edited_id;
|
int edited_id;
|
||||||
|
|
||||||
ShaderGraph::ShaderType type;
|
ShaderGraph::ShaderType type;
|
||||||
|
|
||||||
void _update_graph();
|
void _update_graph();
|
||||||
void _create_node(int p_id);
|
void _create_node(int p_id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _connection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot);
|
void _connection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot);
|
||||||
void _disconnection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot);
|
void _disconnection_request(const String& p_from, int p_from_slot,const String& p_to,int p_to_slot);
|
||||||
|
|
||||||
void _node_removed(int p_id);
|
void _node_removed(int p_id);
|
||||||
void _node_moved(const Vector2& p_from, const Vector2& p_to,int p_id);
|
void _begin_node_move();
|
||||||
void _move_node(int p_id,const Vector2& p_to);
|
void _node_moved(const Vector2& p_from, const Vector2& p_to,int p_id);
|
||||||
|
void _end_node_move();
|
||||||
|
void _move_node(int p_id,const Vector2& p_to);
|
||||||
|
|
||||||
void _scalar_const_changed(double p_value,int p_id);
|
void _scalar_const_changed(double p_value,int p_id);
|
||||||
void _vec_const_changed(double p_value, int p_id, Array p_arr);
|
void _vec_const_changed(double p_value, int p_id, Array p_arr);
|
||||||
void _rgb_const_changed(const Color& p_color, int p_id);
|
void _rgb_const_changed(const Color& p_color, int p_id);
|
||||||
void _xform_const_changed(int p_id,Node* p_button);
|
void _xform_const_changed(int p_id,Node* p_button);
|
||||||
void _scalar_op_changed(int p_op, int p_id);
|
void _scalar_op_changed(int p_op, int p_id);
|
||||||
void _vec_op_changed(int p_op, int p_id);
|
void _vec_op_changed(int p_op, int p_id);
|
||||||
void _vec_scalar_op_changed(int p_op, int p_id);
|
void _vec_scalar_op_changed(int p_op, int p_id);
|
||||||
void _rgb_op_changed(int p_op, int p_id);
|
void _rgb_op_changed(int p_op, int p_id);
|
||||||
void _xform_inv_rev_changed(bool p_enabled, int p_id);
|
void _xform_inv_rev_changed(bool p_enabled, int p_id);
|
||||||
void _scalar_func_changed(int p_func, int p_id);
|
void _scalar_func_changed(int p_func, int p_id);
|
||||||
void _vec_func_changed(int p_func, int p_id);
|
void _vec_func_changed(int p_func, int p_id);
|
||||||
void _scalar_input_changed(double p_value,int p_id);
|
void _scalar_input_changed(double p_value,int p_id);
|
||||||
void _vec_input_changed(double p_value, int p_id, Array p_arr);
|
void _vec_input_changed(double p_value, int p_id, Array p_arr);
|
||||||
void _xform_input_changed(int p_id,Node* p_button);
|
void _xform_input_changed(int p_id,Node* p_button);
|
||||||
void _rgb_input_changed(const Color& p_color, int p_id);
|
void _rgb_input_changed(const Color& p_color, int p_id);
|
||||||
void _tex_input_change(int p_id,Node* p_button);
|
void _tex_input_change(int p_id,Node* p_button);
|
||||||
void _cube_input_change(int p_id);
|
void _cube_input_change(int p_id);
|
||||||
void _input_name_changed(const String& p_name,int p_id,Node* p_line_edit);
|
void _input_name_changed(const String& p_name,int p_id,Node* p_line_edit);
|
||||||
void _tex_edited(int p_id,Node* p_button);
|
void _tex_edited(int p_id,Node* p_button);
|
||||||
void _cube_edited(int p_id,Node* p_button);
|
void _cube_edited(int p_id,Node* p_button);
|
||||||
void _variant_edited();
|
void _variant_edited();
|
||||||
void _comment_edited(int p_id,Node* p_button);
|
void _comment_edited(int p_id,Node* p_button);
|
||||||
void _color_ramp_changed(int p_id,Node* p_ramp);
|
void _color_ramp_changed(int p_id,Node* p_ramp);
|
||||||
void _curve_changed(int p_id,Node* p_curve);
|
void _curve_changed(int p_id,Node* p_curve);
|
||||||
void _sg_updated();
|
void _sg_updated();
|
||||||
Map<int,GraphNode*> node_map;
|
Map<int,GraphNode*> node_map;
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void add_node(int p_type, const Vector2 &location);
|
void add_node(int p_type, const Vector2 &location);
|
||||||
GraphEdit *get_graph_edit() { return graph_edit; }
|
GraphEdit *get_graph_edit() { return graph_edit; }
|
||||||
void set_graph(Ref<ShaderGraph> p_graph);
|
void set_graph(Ref<ShaderGraph> p_graph);
|
||||||
|
|
||||||
ShaderGraphView(ShaderGraph::ShaderType p_type=ShaderGraph::SHADER_TYPE_FRAGMENT);
|
ShaderGraphView(ShaderGraph::ShaderType p_type=ShaderGraph::SHADER_TYPE_FRAGMENT);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShaderGraphEditor : public VBoxContainer {
|
class ShaderGraphEditor : public VBoxContainer {
|
||||||
|
|
||||||
OBJ_TYPE(ShaderGraphEditor,VBoxContainer);
|
OBJ_TYPE(ShaderGraphEditor,VBoxContainer);
|
||||||
|
|
||||||
PopupMenu *popup;
|
PopupMenu *popup;
|
||||||
TabContainer *tabs;
|
TabContainer *tabs;
|
||||||
ShaderGraphView *graph_edits[ShaderGraph::SHADER_TYPE_MAX];
|
ShaderGraphView *graph_edits[ShaderGraph::SHADER_TYPE_MAX];
|
||||||
static const char* node_names[ShaderGraph::NODE_TYPE_MAX];
|
static const char* node_names[ShaderGraph::NODE_TYPE_MAX];
|
||||||
Vector2 next_location;
|
Vector2 next_location;
|
||||||
|
|
||||||
bool _2d;
|
bool _2d;
|
||||||
void _add_node(int p_type);
|
void _add_node(int p_type);
|
||||||
void _popup_requested(const Vector2 &p_position);
|
void _popup_requested(const Vector2 &p_position);
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void edit(Ref<ShaderGraph> p_shader);
|
void edit(Ref<ShaderGraph> p_shader);
|
||||||
ShaderGraphEditor(bool p_2d);
|
ShaderGraphEditor(bool p_2d);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShaderGraphEditorPlugin : public EditorPlugin {
|
class ShaderGraphEditorPlugin : public EditorPlugin {
|
||||||
|
|
||||||
OBJ_TYPE( ShaderGraphEditorPlugin, EditorPlugin );
|
OBJ_TYPE( ShaderGraphEditorPlugin, EditorPlugin );
|
||||||
|
|
||||||
bool _2d;
|
bool _2d;
|
||||||
ShaderGraphEditor *shader_editor;
|
ShaderGraphEditor *shader_editor;
|
||||||
EditorNode *editor;
|
EditorNode *editor;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual String get_name() const { return "ShaderGraph"; }
|
virtual String get_name() const { return "ShaderGraph"; }
|
||||||
bool has_main_screen() const { return false; }
|
bool has_main_screen() const { return false; }
|
||||||
virtual void edit(Object *p_node);
|
virtual void edit(Object *p_node);
|
||||||
virtual bool handles(Object *p_node) const;
|
virtual bool handles(Object *p_node) const;
|
||||||
virtual void make_visible(bool p_visible);
|
virtual void make_visible(bool p_visible);
|
||||||
|
|
||||||
ShaderGraphEditorPlugin(EditorNode *p_node,bool p_2d);
|
ShaderGraphEditorPlugin(EditorNode *p_node,bool p_2d);
|
||||||
~ShaderGraphEditorPlugin();
|
~ShaderGraphEditorPlugin();
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user