Browse Source

Some refactoring for visual shader texture functions

Yuri Rubinsky 2 years ago
parent
commit
7cbe2b939e

+ 0 - 7
doc/classes/VisualShaderNode.xml

@@ -58,13 +58,6 @@
 			Sets the output port index which will be showed for preview. If set to [code]-1[/code] no port will be open for preview.
 			Sets the output port index which will be showed for preview. If set to [code]-1[/code] no port will be open for preview.
 		</member>
 		</member>
 	</members>
 	</members>
-	<signals>
-		<signal name="editor_refresh_request">
-			<description>
-				Emitted when the node requests an editor refresh. Currently called only in setter of [member VisualShaderNodeTexture.source], [VisualShaderNodeTexture], and [VisualShaderNodeCubemap] (and their derivatives).
-			</description>
-		</signal>
-	</signals>
 	<constants>
 	<constants>
 		<constant name="PORT_TYPE_SCALAR" value="0" enum="PortType">
 		<constant name="PORT_TYPE_SCALAR" value="0" enum="PortType">
 			Floating-point scalar. Translated to [code]float[/code] type in shader code.
 			Floating-point scalar. Translated to [code]float[/code] type in shader code.

+ 0 - 1
scene/resources/visual_shader.cpp

@@ -399,7 +399,6 @@ void VisualShaderNode::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "output_port_for_preview"), "set_output_port_for_preview", "get_output_port_for_preview");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "output_port_for_preview"), "set_output_port_for_preview", "get_output_port_for_preview");
 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "default_input_values", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_default_input_values", "get_default_input_values");
 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "default_input_values", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_default_input_values", "get_default_input_values");
 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "expanded_output_ports", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_output_ports_expanded", "_get_output_ports_expanded");
 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "expanded_output_ports", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_output_ports_expanded", "_get_output_ports_expanded");
-	ADD_SIGNAL(MethodInfo("editor_refresh_request"));
 
 
 	BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR);
 	BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR);
 	BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR_INT);
 	BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR_INT);

+ 182 - 245
scene/resources/visual_shader_nodes.cpp

@@ -756,194 +756,157 @@ Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture::get_default_t
 }
 }
 
 
 String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
 String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
-	if (source == SOURCE_TEXTURE) {
-		String u = "uniform sampler2D " + make_unique_id(p_type, p_id, "tex");
-		switch (texture_type) {
-			case TYPE_DATA:
-				break;
-			case TYPE_COLOR:
-				u += " : source_color";
-				break;
-			case TYPE_NORMAL_MAP:
-				u += " : hint_normal";
-				break;
-			default:
-				break;
-		}
-		return u + ";\n";
-	} else if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
-		String u = "uniform sampler2D " + make_unique_id(p_type, p_id, "screen_tex");
-		return u + " : hint_screen_texture;\n";
-	} else if (source == SOURCE_DEPTH || source == SOURCE_3D_NORMAL || source == SOURCE_ROUGHNESS) {
-		String sampler_name = "";
-		String hint = " : ";
-		if (source == SOURCE_DEPTH) {
-			sampler_name = "depth_tex";
-			hint += "hint_depth_texture;\n";
-		} else if (source == SOURCE_3D_NORMAL) {
-			sampler_name = "screen_normal_tex";
-			hint += "hint_normal_roughness_texture;\n";
-		} else if (source == SOURCE_ROUGHNESS) {
-			sampler_name = "screen_roughness_tex";
-			hint += "hint_normal_roughness_texture;\n";
-		}
-		return "uniform sampler2D " + make_unique_id(p_type, p_id, sampler_name) + hint;
+	String code;
+
+	switch (source) {
+		case SOURCE_TEXTURE: {
+			code += "uniform sampler2D " + make_unique_id(p_type, p_id, "tex");
+			switch (texture_type) {
+				case TYPE_DATA: {
+				} break;
+				case TYPE_COLOR: {
+					code += " : source_color";
+				} break;
+				case TYPE_NORMAL_MAP: {
+					code += " : hint_normal";
+				} break;
+				default: {
+				} break;
+			}
+			code += ";\n";
+		} break;
+		case SOURCE_SCREEN: {
+			if ((p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
+				code += "uniform sampler2D " + make_unique_id(p_type, p_id, "screen_tex") + " : hint_screen_texture;\n";
+			}
+		} break;
+		case SOURCE_DEPTH:
+		case SOURCE_3D_NORMAL:
+		case SOURCE_ROUGHNESS: {
+			if (p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
+				String sampler_name = "";
+				String hint = " : ";
+				if (source == SOURCE_DEPTH) {
+					sampler_name = "depth_tex";
+					hint += "hint_depth_texture;\n";
+				} else {
+					sampler_name = source == SOURCE_ROUGHNESS ? "roughness_tex" : "normal_roughness_tex";
+					hint += "hint_normal_roughness_texture;\n";
+				}
+				code += "uniform sampler2D " + make_unique_id(p_type, p_id, sampler_name) + hint;
+			}
+		} break;
+		default: {
+		} break;
 	}
 	}
 
 
-	return String();
+	return code;
 }
 }
 
 
 String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
 String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
 	String default_uv;
 	String default_uv;
 	if (p_mode == Shader::MODE_CANVAS_ITEM || p_mode == Shader::MODE_SPATIAL) {
 	if (p_mode == Shader::MODE_CANVAS_ITEM || p_mode == Shader::MODE_SPATIAL) {
-		default_uv = "UV";
+		if (source == SOURCE_SCREEN) {
+			default_uv = "SCREEN_UV";
+		} else {
+			default_uv = "UV";
+		}
 	} else {
 	} else {
 		default_uv = "vec2(0.0)";
 		default_uv = "vec2(0.0)";
 	}
 	}
 
 
 	String code;
 	String code;
-	if (source == SOURCE_TEXTURE) {
-		String id = make_unique_id(p_type, p_id, "tex");
-		if (p_input_vars[0].is_empty()) { // Use UV by default.
-			if (p_input_vars[1].is_empty()) {
-				code += "	" + p_output_vars[0] + " = texture(" + id + ", " + default_uv + ");\n";
-			} else {
-				code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
-			}
-		} else if (p_input_vars[1].is_empty()) {
-			//no lod
-			code += "	" + p_output_vars[0] + " = texture(" + id + ", " + p_input_vars[0] + ");\n";
-		} else {
-			code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
-		}
-		return code;
-	}
+	String uv = p_input_vars[0].is_empty() ? default_uv : p_input_vars[0];
 
 
-	if (source == SOURCE_PORT) {
-		String id = p_input_vars[2];
-		if (id.is_empty()) {
-			code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
-		} else {
-			if (p_input_vars[0].is_empty()) { // Use UV by default.
-				if (p_input_vars[1].is_empty()) {
-					code += "	" + p_output_vars[0] + " = texture(" + id + ", " + default_uv + ");\n";
-				} else {
-					code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
+	switch (source) {
+		case SOURCE_PORT:
+		case SOURCE_TEXTURE: {
+			String id;
+			if (source == SOURCE_PORT) {
+				id = p_input_vars[2];
+				if (id.is_empty()) {
+					break;
 				}
 				}
-			} else if (p_input_vars[1].is_empty()) {
-				//no lod
-				code += "	" + p_output_vars[0] + " = texture(" + id + ", " + p_input_vars[0] + ");\n";
-			} else {
-				code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
-			}
-		}
-		return code;
-	}
-
-	if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
-		String id = make_unique_id(p_type, p_id, "screen_tex");
-		if (p_input_vars[0].is_empty() || p_for_preview) { // Use UV by default.
-			if (p_input_vars[1].is_empty()) {
-				code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + default_uv + ", 0.0);\n";
-			} else {
-				code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
-			}
-		} else if (p_input_vars[1].is_empty()) {
-			//no lod
-			code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + p_input_vars[0] + ", 0.0);\n";
-		} else {
-			code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
-		}
-		return code;
-	}
-
-	if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
-		if (p_input_vars[0].is_empty()) { // Use UV by default.
-			if (p_input_vars[1].is_empty()) {
-				code += "	" + p_output_vars[0] + " = texture(TEXTURE, " + default_uv + ");\n";
-			} else {
-				code += "	" + p_output_vars[0] + " = textureLod(TEXTURE, " + default_uv + ", " + p_input_vars[1] + ");\n";
+			} else { // SOURCE_TEXTURE
+				id = make_unique_id(p_type, p_id, "tex");
 			}
 			}
-		} else if (p_input_vars[1].is_empty()) {
-			//no lod
-			code += "	" + p_output_vars[0] + " = texture(TEXTURE, " + p_input_vars[0] + ");\n";
-		} else {
-			code += "	" + p_output_vars[0] + " = textureLod(TEXTURE, " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
-		}
-		return code;
-	}
-
-	if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
-		if (p_input_vars[0].is_empty()) { // Use UV by default.
 			if (p_input_vars[1].is_empty()) {
 			if (p_input_vars[1].is_empty()) {
-				code += "	" + p_output_vars[0] + " = texture(NORMAL_TEXTURE, " + default_uv + ");\n";
+				code += "	" + p_output_vars[0] + " = texture(" + id + ", " + uv + ");\n";
 			} else {
 			} else {
-				code += "	" + p_output_vars[0] + " = textureLod(NORMAL_TEXTURE, " + default_uv + ", " + p_input_vars[1] + ");\n";
+				code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + uv + ", " + p_input_vars[1] + ");\n";
 			}
 			}
-		} else if (p_input_vars[1].is_empty()) {
-			//no lod
-			code += "	" + p_output_vars[0] + " = texture(NORMAL_TEXTURE, " + p_input_vars[0] + ".xy);\n";
-		} else {
-			code += "	" + p_output_vars[0] + " = textureLod(NORMAL_TEXTURE, " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
-		}
-		return code;
-	}
-
-	if (source == SOURCE_DEPTH || source == SOURCE_ROUGHNESS) {
-		if (!p_for_preview && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
-			String var_name = "";
-			String sampler_name = "";
-
-			if (source == SOURCE_DEPTH) {
-				var_name = "_depth";
-				sampler_name = "depth_tex";
-			} else if (source == SOURCE_ROUGHNESS) {
-				var_name = "_screen_roughness";
-				sampler_name = "screen_roughness_tex";
+			return code;
+		} break;
+		case SOURCE_SCREEN: {
+			if ((p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
+				String id = make_unique_id(p_type, p_id, "screen_tex");
+				if (p_input_vars[1].is_empty()) {
+					code += "	" + p_output_vars[0] + " = texture(" + id + ", " + uv + ");\n";
+				} else {
+					code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + uv + ", " + p_input_vars[1] + ");\n";
+				}
+				return code;
 			}
 			}
+		} break;
+		case SOURCE_2D_NORMAL:
+		case SOURCE_2D_TEXTURE: {
+			if (p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
+				String id = source == SOURCE_2D_TEXTURE ? "TEXTURE" : "NORMAL_TEXTURE";
 
 
-			String id = make_unique_id(p_type, p_id, sampler_name);
-			code += "	{\n";
-			if (p_input_vars[0].is_empty()) { // Use UV by default.
 				if (p_input_vars[1].is_empty()) {
 				if (p_input_vars[1].is_empty()) {
-					code += "		float " + var_name + " = texture(" + id + ", " + default_uv + ").r;\n";
+					code += "	" + p_output_vars[0] + " = texture(" + id + ", " + uv + ");\n";
 				} else {
 				} else {
-					code += "		float " + var_name + " = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ").r;\n";
+					code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + uv + ", " + p_input_vars[1] + ");\n";
 				}
 				}
-			} else if (p_input_vars[1].is_empty()) {
-				//no lod
-				code += "		float " + var_name + " = texture(" + id + ", " + p_input_vars[0] + ".xy).r;\n";
-			} else {
-				code += "		float " + var_name + " = textureLod(" + id + ", " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ").r;\n";
+				return code;
 			}
 			}
+		} break;
+		case SOURCE_3D_NORMAL:
+		case SOURCE_ROUGHNESS:
+		case SOURCE_DEPTH: {
+			if (!p_for_preview && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
+				String var_name = "";
+				String sampler_name = "";
+
+				switch (source) {
+					case SOURCE_DEPTH: {
+						var_name = "_depth";
+						sampler_name = "depth_tex";
+					} break;
+					case SOURCE_ROUGHNESS: {
+						var_name = "_roughness";
+						sampler_name = "roughness_tex";
+					} break;
+					case SOURCE_3D_NORMAL: {
+						var_name = "_normal";
+						sampler_name = "normal_roughness_tex";
+					} break;
+					default: {
+					} break;
+				}
 
 
-			code += "		" + p_output_vars[0] + " = vec4(" + var_name + ", " + var_name + ", " + var_name + ", 1.0);\n";
-			code += "	}\n";
-			return code;
-		}
-	}
+				String id = make_unique_id(p_type, p_id, sampler_name);
+				String type = source == SOURCE_3D_NORMAL ? "vec3" : "float";
+				String components = source == SOURCE_3D_NORMAL ? "rgb" : "r";
 
 
-	if (source == SOURCE_3D_NORMAL) {
-		if (!p_for_preview && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
-			String id = make_unique_id(p_type, p_id, "screen_normal_tex");
-			code += "	{\n";
-			if (p_input_vars[0].is_empty()) { // Use UV by default.
+				code += "	{\n";
 				if (p_input_vars[1].is_empty()) {
 				if (p_input_vars[1].is_empty()) {
-					code += "		vec3 _screen_normal = texture(" + id + ", " + default_uv + ").xyz;\n";
+					code += "		" + type + " " + var_name + " = texture(" + id + ", " + uv + ")." + components + ";\n";
 				} else {
 				} else {
-					code += "		vec3 _screen_normal = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ").xyz;\n";
+					code += "		" + type + " " + var_name + " = textureLod(" + id + ", " + uv + ", " + p_input_vars[1] + ")." + components + ";\n";
 				}
 				}
-			} else if (p_input_vars[1].is_empty()) {
-				//no lod
-				code += "		vec3 _screen_normal = texture(" + id + ", " + p_input_vars[0] + ".xy).xyz;\n";
-			} else {
-				code += "		vec3 _screen_normal = textureLod(" + id + ", " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ").xyz;\n";
-			}
+				if (source == SOURCE_3D_NORMAL) {
+					code += "		" + p_output_vars[0] + " = vec4(" + var_name + ", 1.0);\n";
+				} else {
+					code += "		" + p_output_vars[0] + " = vec4(" + var_name + ", " + var_name + ", " + var_name + ", 1.0);\n";
+				}
+				code += "	}\n";
 
 
-			code += "		" + p_output_vars[0] + " = vec4(_screen_normal, 1.0);\n";
-			code += "	}\n";
-			return code;
-		}
+				return code;
+			}
+		} break;
+		default: {
+		} break;
 	}
 	}
 
 
 	code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
 	code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
@@ -985,7 +948,6 @@ void VisualShaderNodeTexture::set_source(Source p_source) {
 	}
 	}
 	source = p_source;
 	source = p_source;
 	emit_changed();
 	emit_changed();
-	emit_signal(SNAME("editor_refresh_request"));
 }
 }
 
 
 VisualShaderNodeTexture::Source VisualShaderNodeTexture::get_source() const {
 VisualShaderNodeTexture::Source VisualShaderNodeTexture::get_source() const {
@@ -1029,31 +991,34 @@ String VisualShaderNodeTexture::get_warning(Shader::Mode p_mode, VisualShader::T
 		return RTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
 		return RTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
 	}
 	}
 
 
-	if (source == SOURCE_TEXTURE) {
-		return String(); // all good
-	}
-
-	if (source == SOURCE_PORT) {
-		return String(); // all good
-	}
-
-	if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
-		return String(); // all good
-	}
-
-	if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
-		return String(); // all good
-	}
-
-	if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM) {
-		return String(); // all good
-	}
-
-	if ((source == SOURCE_DEPTH || source == SOURCE_3D_NORMAL || source == SOURCE_ROUGHNESS) && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
-		if (get_output_port_for_preview() == 0) { // DEPTH_TEXTURE and NORMAL_ROUGHNESS_TEXTURE are not supported in preview(canvas_item) shader
-			return RTR("Invalid source for preview.");
-		}
-		return String(); // all good
+	switch (source) {
+		case SOURCE_TEXTURE:
+		case SOURCE_PORT: {
+			return String(); // All good.
+		} break;
+		case SOURCE_SCREEN: {
+			if ((p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
+				return String(); // All good.
+			}
+		} break;
+		case SOURCE_2D_NORMAL:
+		case SOURCE_2D_TEXTURE: {
+			if (p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
+				return String(); // All good.
+			}
+		} break;
+		case SOURCE_3D_NORMAL:
+		case SOURCE_ROUGHNESS:
+		case SOURCE_DEPTH: {
+			if (p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
+				if (get_output_port_for_preview() == 0) { // Not supported in preview(canvas_item) shader.
+					return RTR("Invalid source for preview.");
+				}
+				return String(); // All good.
+			}
+		} break;
+		default: {
+		} break;
 	}
 	}
 
 
 	return RTR("Invalid source for shader.");
 	return RTR("Invalid source for shader.");
@@ -1321,6 +1286,17 @@ bool VisualShaderNodeSample3D::is_input_port_default(int p_port, Shader::Mode p_
 }
 }
 
 
 String VisualShaderNodeSample3D::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
 String VisualShaderNodeSample3D::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
+	String code;
+	String id;
+	if (source == SOURCE_TEXTURE) {
+		id = make_unique_id(p_type, p_id, "tex3d");
+	} else { // SOURCE_PORT
+		id = p_input_vars[2];
+		if (id.is_empty()) {
+			code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
+			return code;
+		}
+	}
 	String default_uv;
 	String default_uv;
 	if (p_mode == Shader::MODE_CANVAS_ITEM || p_mode == Shader::MODE_SPATIAL) {
 	if (p_mode == Shader::MODE_CANVAS_ITEM || p_mode == Shader::MODE_SPATIAL) {
 		default_uv = "vec3(UV, 0.0)";
 		default_uv = "vec3(UV, 0.0)";
@@ -1328,33 +1304,12 @@ String VisualShaderNodeSample3D::generate_code(Shader::Mode p_mode, VisualShader
 		default_uv = "vec3(0.0)";
 		default_uv = "vec3(0.0)";
 	}
 	}
 
 
-	String code;
-	if (source == SOURCE_TEXTURE || source == SOURCE_PORT) {
-		String id;
-		if (source == SOURCE_TEXTURE) {
-			id = make_unique_id(p_type, p_id, "tex3d");
-		} else {
-			id = p_input_vars[2];
-		}
-		if (!id.is_empty()) {
-			if (p_input_vars[0].is_empty()) { // Use UV by default.
-				if (p_input_vars[1].is_empty()) {
-					code += "	" + p_output_vars[0] + " = texture(" + id + ", " + default_uv + ");\n";
-				} else {
-					code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
-				}
-			} else if (p_input_vars[1].is_empty()) {
-				//no lod
-				code += "	" + p_output_vars[0] + " = texture(" + id + ", " + p_input_vars[0] + ");\n";
-			} else {
-				code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
-			}
-		} else {
-			code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
-		}
-		return code;
+	String uv = p_input_vars[0].is_empty() ? default_uv : p_input_vars[0];
+	if (p_input_vars[1].is_empty()) {
+		code += "	" + p_output_vars[0] + " = texture(" + id + ", " + uv + ");\n";
+	} else {
+		code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + uv + ", " + p_input_vars[1] + ");\n";
 	}
 	}
-	code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
 	return code;
 	return code;
 }
 }
 
 
@@ -1365,7 +1320,6 @@ void VisualShaderNodeSample3D::set_source(Source p_source) {
 	}
 	}
 	source = p_source;
 	source = p_source;
 	emit_changed();
 	emit_changed();
-	emit_signal(SNAME("editor_refresh_request"));
 }
 }
 
 
 VisualShaderNodeSample3D::Source VisualShaderNodeSample3D::get_source() const {
 VisualShaderNodeSample3D::Source VisualShaderNodeSample3D::get_source() const {
@@ -1387,14 +1341,7 @@ String VisualShaderNodeSample3D::get_warning(Shader::Mode p_mode, VisualShader::
 	if (is_input_port_connected(2) && source != SOURCE_PORT) {
 	if (is_input_port_connected(2) && source != SOURCE_PORT) {
 		return RTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
 		return RTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
 	}
 	}
-
-	if (source == SOURCE_TEXTURE) {
-		return String(); // all good
-	}
-	if (source == SOURCE_PORT) {
-		return String(); // all good
-	}
-	return RTR("Invalid source for shader.");
+	return String();
 }
 }
 
 
 VisualShaderNodeSample3D::VisualShaderNodeSample3D() {
 VisualShaderNodeSample3D::VisualShaderNodeSample3D() {
@@ -1600,42 +1547,33 @@ String VisualShaderNodeCubemap::generate_global(Shader::Mode p_mode, VisualShade
 }
 }
 
 
 String VisualShaderNodeCubemap::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
 String VisualShaderNodeCubemap::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
-	String default_uv;
-	if (p_mode == Shader::MODE_CANVAS_ITEM || p_mode == Shader::MODE_SPATIAL) {
-		default_uv = "vec3(UV, 0.0)";
-	} else {
-		default_uv = "vec3(0.0)";
-	}
-
 	String code;
 	String code;
 	String id;
 	String id;
+
 	if (source == SOURCE_TEXTURE) {
 	if (source == SOURCE_TEXTURE) {
 		id = make_unique_id(p_type, p_id, "cube");
 		id = make_unique_id(p_type, p_id, "cube");
-	} else if (source == SOURCE_PORT) {
+	} else { // SOURCE_PORT
 		id = p_input_vars[2];
 		id = p_input_vars[2];
-	} else {
-		return code;
+		if (id.is_empty()) {
+			code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
+			return code;
+		}
 	}
 	}
 
 
-	if (id.is_empty()) {
-		code += "	" + p_output_vars[0] + " = vec4(0.0);\n";
-		return code;
+	String default_uv;
+	if (p_mode == Shader::MODE_CANVAS_ITEM || p_mode == Shader::MODE_SPATIAL) {
+		default_uv = "vec3(UV, 0.0)";
+	} else {
+		default_uv = "vec3(0.0)";
 	}
 	}
 
 
-	if (p_input_vars[0].is_empty()) { // Use UV by default.
-
-		if (p_input_vars[1].is_empty()) {
-			code += "	" + p_output_vars[0] + " = texture(" + id + ", " + default_uv + ");\n";
-		} else {
-			code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
-		}
-
-	} else if (p_input_vars[1].is_empty()) {
-		//no lod
-		code += "	" + p_output_vars[0] + " = texture(" + id + ", " + p_input_vars[0] + ");\n";
+	String uv = p_input_vars[0].is_empty() ? default_uv : p_input_vars[0];
+	if (p_input_vars[1].is_empty()) {
+		code += "	" + p_output_vars[0] + " = texture(" + id + ", " + uv + ");\n";
 	} else {
 	} else {
-		code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
+		code += "	" + p_output_vars[0] + " = textureLod(" + id + ", " + uv + ", " + p_input_vars[1] + ");\n";
 	}
 	}
+
 	return code;
 	return code;
 }
 }
 
 
@@ -1655,7 +1593,6 @@ void VisualShaderNodeCubemap::set_source(Source p_source) {
 	}
 	}
 	source = p_source;
 	source = p_source;
 	emit_changed();
 	emit_changed();
-	emit_signal(SNAME("editor_refresh_request"));
 }
 }
 
 
 VisualShaderNodeCubemap::Source VisualShaderNodeCubemap::get_source() const {
 VisualShaderNodeCubemap::Source VisualShaderNodeCubemap::get_source() const {