فهرست منبع

Fix auto-connection from output node to input (VisualShaders)

Yuri Roubinsky 4 سال پیش
والد
کامیت
46cd36f009
3فایلهای تغییر یافته به همراه19 افزوده شده و 0 حذف شده
  1. 7 0
      editor/plugins/visual_shader_editor_plugin.cpp
  2. 8 0
      scene/resources/visual_shader.cpp
  3. 4 0
      scene/resources/visual_shader.h

+ 7 - 0
editor/plugins/visual_shader_editor_plugin.cpp

@@ -2315,6 +2315,13 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx, String p_resource_pa
 				undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, _from_node, _from_slot, to_node, to_slot);
 				undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, _from_node, _from_slot, to_node, to_slot);
 			} else {
+				// Need to setting up Input node properly before committing since `is_port_types_compatible` (calling below) is using `mode` and `shader_type`.
+				VisualShaderNodeInput *input = Object::cast_to<VisualShaderNodeInput>(vsnode.ptr());
+				if (input) {
+					input->set_shader_mode(visual_shader->get_mode());
+					input->set_shader_type(visual_shader->get_shader_type());
+				}
+
 				// Attempting to connect to the first correct port.
 				for (int i = 0; i < vsnode->get_output_port_count(); i++) {
 					if (visual_shader->is_port_types_compatible(vsnode->get_output_port_type(i), input_port_type)) {

+ 8 - 0
scene/resources/visual_shader.cpp

@@ -2533,6 +2533,14 @@ Vector<StringName> VisualShaderNodeInput::get_editable_properties() const {
 	return props;
 }
 
+void VisualShaderNodeInput::set_shader_type(VisualShader::Type p_shader_type) {
+	shader_type = p_shader_type;
+}
+
+void VisualShaderNodeInput::set_shader_mode(Shader::Mode p_shader_mode) {
+	shader_mode = p_shader_mode;
+}
+
 void VisualShaderNodeInput::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_input_name", "name"), &VisualShaderNodeInput::set_input_name);
 	ClassDB::bind_method(D_METHOD("get_input_name"), &VisualShaderNodeInput::get_input_name);

+ 4 - 0
scene/resources/visual_shader.h

@@ -350,6 +350,10 @@ class VisualShaderNodeInput : public VisualShaderNode {
 
 	String input_name = "[None]";
 
+public:
+	void set_shader_type(VisualShader::Type p_shader_type);
+	void set_shader_mode(Shader::Mode p_shader_mode);
+
 protected:
 	static void _bind_methods();
 	void _validate_property(PropertyInfo &property) const override;