Add Drag&Drop to ShaderGraphEditor's texture uniform graph node.
This commit is contained in:
parent
a0dd7ec171
commit
5eaf0bcc20
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user