瀏覽代碼

Merge pull request #4722 from MarianoGnu/master

Add Drag&Drop to ShaderGraphEditor's texture uniform graph node.
Rémi Verschelde 9 年之前
父節點
當前提交
2a6bd0c357
共有 2 個文件被更改,包括 110 次插入1 次删除
  1. 105 0
      tools/editor/plugins/shader_graph_editor_plugin.cpp
  2. 5 1
      tools/editor/plugins/shader_graph_editor_plugin.h

+ 105 - 0
tools/editor/plugins/shader_graph_editor_plugin.cpp

@@ -2311,7 +2311,9 @@ void ShaderGraphView::_create_node(int p_id) {
 		TextureFrame *tex = memnew( TextureFrame );
 		TextureFrame *tex = memnew( TextureFrame );
 		tex->set_expand(true);
 		tex->set_expand(true);
 		tex->set_custom_minimum_size(Size2(80,80));
 		tex->set_custom_minimum_size(Size2(80,80));
+		tex->set_drag_forwarding(this);
 		gn->add_child(tex);
 		gn->add_child(tex);
+		tex->set_ignore_mouse(false);
 		tex->set_texture(graph->texture_input_node_get_value(type,p_id));
 		tex->set_texture(graph->texture_input_node_get_value(type,p_id));
 		ToolButton *edit = memnew( ToolButton );
 		ToolButton *edit = memnew( ToolButton );
 		edit->set_text("edit..");
 		edit->set_text("edit..");
@@ -2517,6 +2519,105 @@ void ShaderGraphView::_sg_updated() {
 	}
 	}
 }
 }
 
 
+Variant ShaderGraphView::get_drag_data_fw(const Point2 &p_point, Control *p_from)
+{
+	TextureFrame* frame = p_from->cast_to<TextureFrame>();
+	if (!frame)
+		return Variant();
+
+	if (!frame->get_texture().is_valid())
+		return Variant();
+
+	RES res = frame->get_texture();
+	return EditorNode::get_singleton()->drag_resource(res,p_from);
+
+	return Variant();
+}
+
+bool ShaderGraphView::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const
+{
+	if (p_data.get_type() != Variant::DICTIONARY)
+		return false;
+
+	Dictionary d = p_data;
+
+	if (d.has("type")){
+		if (d["type"] == "resource" && d.has("resource")) {
+			Variant val = d["resource"];
+
+			if (val.get_type()==Variant::OBJECT) {
+				RES res = val;
+				if (res.is_valid() && res->cast_to<Texture>())
+					return true;
+			}
+		}
+		else if (d["type"] == "files" && d.has("files")) {
+			Vector<String> files = d["files"];
+			if (files.size() != 1)
+				return false;
+			return (ResourceLoader::get_resource_type(files[0]) == "ImageTexture");
+		}
+	}
+
+	return false;
+}
+
+void ShaderGraphView::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from)
+{
+	if (!can_drop_data_fw(p_point, p_data, p_from))
+		return;
+
+	TextureFrame *frame = p_from->cast_to<TextureFrame>();
+	if (!frame)
+		return;
+
+	Dictionary d = p_data;
+	Ref<Texture> tex;
+
+	if (d.has("type")) {
+		if (d["type"] == "resource" && d.has("resource")){
+			Variant val = d["resource"];
+
+			if (val.get_type()==Variant::OBJECT) {
+				RES res = val;
+				if (res.is_valid())
+					tex = Ref<Texture>(res->cast_to<Texture>());
+			}
+		}
+		else if (d["type"] == "files" && d.has("files")) {
+			Vector<String> files = d["files"];
+			RES res = ResourceLoader::load(files[0]);
+			if (res.is_valid())
+				tex = Ref<Texture>(res->cast_to<Texture>());
+		}
+	}
+
+	if (!tex.is_valid()) return;
+
+	GraphNode *gn = frame->get_parent()->cast_to<GraphNode>();
+	if (!gn) return;
+
+	int id = -1;
+	for(Map<int,GraphNode*>::Element *E = node_map.front();E;E=E->next())
+		if (E->get() == gn) {
+			id = E->key();
+			break;
+		}
+	print_line(String::num(double(id)));
+	if (id < 0) return;
+
+	if (graph->node_get_type(type,id)==ShaderGraph::NODE_TEXTURE_INPUT) {
+
+		UndoRedo *ur=EditorNode::get_singleton()->get_undo_redo();
+		ur->create_action(TTR("Change Texture Uniform"));
+		ur->add_do_method(graph.ptr(),"texture_input_node_set_value",type,id,tex);
+		ur->add_undo_method(graph.ptr(),"texture_input_node_set_value",type,id,graph->texture_input_node_get_value(type,id));
+		ur->add_do_method(this,"_update_graph");
+		ur->add_undo_method(this,"_update_graph");
+		ur->commit_action();
+	}
+}
+
 void ShaderGraphView::set_graph(Ref<ShaderGraph> p_graph){
 void ShaderGraphView::set_graph(Ref<ShaderGraph> p_graph){
 
 
 
 
@@ -2623,6 +2724,10 @@ void ShaderGraphView::_bind_methods() {
 	ObjectTypeDB::bind_method("_color_ramp_changed",&ShaderGraphView::_color_ramp_changed);
 	ObjectTypeDB::bind_method("_color_ramp_changed",&ShaderGraphView::_color_ramp_changed);
 	ObjectTypeDB::bind_method("_curve_changed",&ShaderGraphView::_curve_changed);
 	ObjectTypeDB::bind_method("_curve_changed",&ShaderGraphView::_curve_changed);
 
 
+	ObjectTypeDB::bind_method(_MD("get_drag_data_fw"), &ShaderGraphView::get_drag_data_fw);
+	ObjectTypeDB::bind_method(_MD("can_drop_data_fw"), &ShaderGraphView::can_drop_data_fw);
+	ObjectTypeDB::bind_method(_MD("drop_data_fw"), &ShaderGraphView::drop_data_fw);
+
 	ObjectTypeDB::bind_method("_sg_updated",&ShaderGraphView::_sg_updated);
 	ObjectTypeDB::bind_method("_sg_updated",&ShaderGraphView::_sg_updated);
 }
 }
 
 

+ 5 - 1
tools/editor/plugins/shader_graph_editor_plugin.h

@@ -116,7 +116,7 @@ public:
 	GraphCurveMapEdit();
 	GraphCurveMapEdit();
 };
 };
 
 
-class ShaderGraphView : public Node {
+class ShaderGraphView : public Control {
 
 
 	OBJ_TYPE(ShaderGraphView,Node);
 	OBJ_TYPE(ShaderGraphView,Node);
 
 
@@ -181,6 +181,10 @@ class ShaderGraphView : public Node {
 	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;
+
+	Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+	bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+	void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
 protected:
 protected:
 	void _notification(int p_what);
 	void _notification(int p_what);
 	static void _bind_methods();
 	static void _bind_methods();