|
@@ -1879,12 +1879,47 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
|
|
|
undo_redo->add_do_method(expr, "set_size", Size2(250 * EDSCALE, 150 * EDSCALE));
|
|
|
}
|
|
|
|
|
|
+ bool created_expression_port = false;
|
|
|
+
|
|
|
if (to_node != -1 && to_slot != -1) {
|
|
|
- if (vsnode->get_output_port_count() > 0) {
|
|
|
+ VisualShaderNode::PortType input_port_type = visual_shader->get_node(type, to_node)->get_input_port_type(to_slot);
|
|
|
+
|
|
|
+ if (expr && expr->is_editable() && input_port_type != VisualShaderNode::PORT_TYPE_SAMPLER) {
|
|
|
+ undo_redo->add_do_method(expr, "add_output_port", 0, input_port_type, "output0");
|
|
|
+ undo_redo->add_undo_method(expr, "remove_output_port", 0);
|
|
|
+
|
|
|
+ String initial_expression_code;
|
|
|
+
|
|
|
+ switch (input_port_type) {
|
|
|
+ case VisualShaderNode::PORT_TYPE_SCALAR:
|
|
|
+ initial_expression_code = "output0 = 1.0;";
|
|
|
+ break;
|
|
|
+ case VisualShaderNode::PORT_TYPE_SCALAR_INT:
|
|
|
+ initial_expression_code = "output0 = 1;";
|
|
|
+ break;
|
|
|
+ case VisualShaderNode::PORT_TYPE_VECTOR:
|
|
|
+ initial_expression_code = "output0 = vec3(1.0, 1.0, 1.0);";
|
|
|
+ break;
|
|
|
+ case VisualShaderNode::PORT_TYPE_BOOLEAN:
|
|
|
+ initial_expression_code = "output0 = true;";
|
|
|
+ break;
|
|
|
+ case VisualShaderNode::PORT_TYPE_TRANSFORM:
|
|
|
+ initial_expression_code = "output0 = mat4(1.0);";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ undo_redo->add_do_method(expr, "set_expression", initial_expression_code);
|
|
|
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, id_to_use);
|
|
|
+
|
|
|
+ created_expression_port = true;
|
|
|
+ }
|
|
|
+ if (vsnode->get_output_port_count() > 0 || created_expression_port) {
|
|
|
int _from_node = id_to_use;
|
|
|
int _from_slot = 0;
|
|
|
|
|
|
- if (visual_shader->is_port_types_compatible(vsnode->get_output_port_type(_from_slot), visual_shader->get_node(type, to_node)->get_input_port_type(to_slot))) {
|
|
|
+ if (created_expression_port || visual_shader->is_port_types_compatible(vsnode->get_output_port_type(_from_slot), input_port_type)) {
|
|
|
undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, _from_node, _from_slot, to_node, to_slot);
|
|
|
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, _from_node, _from_slot, to_node, to_slot);
|
|
|
undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, _from_node, _from_slot, to_node, to_slot);
|
|
@@ -1892,11 +1927,21 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
|
|
|
}
|
|
|
}
|
|
|
} else if (from_node != -1 && from_slot != -1) {
|
|
|
- if (vsnode->get_input_port_count() > 0) {
|
|
|
+ VisualShaderNode::PortType output_port_type = visual_shader->get_node(type, from_node)->get_output_port_type(from_slot);
|
|
|
+
|
|
|
+ if (expr && expr->is_editable()) {
|
|
|
+ undo_redo->add_do_method(expr, "add_input_port", 0, output_port_type, "input0");
|
|
|
+ undo_redo->add_undo_method(expr, "remove_input_port", 0);
|
|
|
+ undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, id_to_use);
|
|
|
+
|
|
|
+ created_expression_port = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (vsnode->get_input_port_count() > 0 || created_expression_port) {
|
|
|
int _to_node = id_to_use;
|
|
|
int _to_slot = 0;
|
|
|
|
|
|
- if (visual_shader->is_port_types_compatible(visual_shader->get_node(type, from_node)->get_output_port_type(from_slot), vsnode->get_input_port_type(_to_slot))) {
|
|
|
+ if (created_expression_port || visual_shader->is_port_types_compatible(output_port_type, vsnode->get_input_port_type(_to_slot))) {
|
|
|
undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_slot, _to_node, _to_slot);
|
|
|
undo_redo->add_do_method(visual_shader.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);
|