You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-18 14:21:41 +00:00
Adds UVFunc for panning/scaling on UV's to VisualShader's.
This commit is contained in:
@@ -2499,6 +2499,143 @@ VisualShaderNodeTransformFunc::VisualShaderNodeTransformFunc() {
|
||||
set_input_port_default_value(0, Transform3D());
|
||||
}
|
||||
|
||||
////////////// UV Func
|
||||
|
||||
String VisualShaderNodeUVFunc::get_caption() const {
|
||||
return "UVFunc";
|
||||
}
|
||||
|
||||
int VisualShaderNodeUVFunc::get_input_port_count() const {
|
||||
return 3;
|
||||
}
|
||||
|
||||
VisualShaderNodeUVFunc::PortType VisualShaderNodeUVFunc::get_input_port_type(int p_port) const {
|
||||
switch (p_port) {
|
||||
case 0:
|
||||
[[fallthrough]]; // uv
|
||||
case 1:
|
||||
return PORT_TYPE_VECTOR; // scale
|
||||
case 2:
|
||||
return PORT_TYPE_VECTOR; // offset & pivot
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return PORT_TYPE_SCALAR;
|
||||
}
|
||||
|
||||
String VisualShaderNodeUVFunc::get_input_port_name(int p_port) const {
|
||||
switch (p_port) {
|
||||
case 0:
|
||||
return "uv";
|
||||
case 1:
|
||||
return "scale";
|
||||
case 2:
|
||||
switch (func) {
|
||||
case FUNC_PANNING:
|
||||
return "offset";
|
||||
case FUNC_SCALING:
|
||||
return "pivot";
|
||||
case FUNC_MAX:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
String VisualShaderNodeUVFunc::get_input_port_default_hint(int p_port) const {
|
||||
if (p_port == 0) {
|
||||
return "UV";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
int VisualShaderNodeUVFunc::get_output_port_count() const {
|
||||
return 1;
|
||||
}
|
||||
|
||||
VisualShaderNodeUVFunc::PortType VisualShaderNodeUVFunc::get_output_port_type(int p_port) const {
|
||||
return PORT_TYPE_VECTOR;
|
||||
}
|
||||
|
||||
String VisualShaderNodeUVFunc::get_output_port_name(int p_port) const {
|
||||
return "uv";
|
||||
}
|
||||
|
||||
bool VisualShaderNodeUVFunc::is_show_prop_names() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
String VisualShaderNodeUVFunc::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 uv;
|
||||
if (p_input_vars[0].is_empty()) {
|
||||
uv = "vec3(UV.xy, 0.0)";
|
||||
} else {
|
||||
uv = vformat("%s", p_input_vars[0]);
|
||||
}
|
||||
String scale = vformat("%s", p_input_vars[1]);
|
||||
String offset_pivot = vformat("%s", p_input_vars[2]);
|
||||
|
||||
switch (func) {
|
||||
case FUNC_PANNING: {
|
||||
code += vformat("\t%s = fma(%s, %s, %s);\n", p_output_vars[0], offset_pivot, scale, uv);
|
||||
} break;
|
||||
case FUNC_SCALING: {
|
||||
code += vformat("\t%s = fma((%s - %s), %s, %s);\n", p_output_vars[0], uv, offset_pivot, scale, offset_pivot);
|
||||
} break;
|
||||
case FUNC_MAX:
|
||||
break;
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
void VisualShaderNodeUVFunc::set_function(VisualShaderNodeUVFunc::Function p_func) {
|
||||
ERR_FAIL_INDEX(int(p_func), FUNC_MAX);
|
||||
if (func == p_func) {
|
||||
return;
|
||||
}
|
||||
func = p_func;
|
||||
|
||||
if (p_func == FUNC_PANNING) {
|
||||
set_input_port_default_value(2, Vector3()); // offset
|
||||
} else { // FUNC_SCALING
|
||||
set_input_port_default_value(2, Vector3(0.5, 0.5, 0.0)); // pivot
|
||||
}
|
||||
emit_changed();
|
||||
}
|
||||
|
||||
VisualShaderNodeUVFunc::Function VisualShaderNodeUVFunc::get_function() const {
|
||||
return func;
|
||||
}
|
||||
|
||||
Vector<StringName> VisualShaderNodeUVFunc::get_editable_properties() const {
|
||||
Vector<StringName> props;
|
||||
props.push_back("function");
|
||||
return props;
|
||||
}
|
||||
|
||||
void VisualShaderNodeUVFunc::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeUVFunc::set_function);
|
||||
ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeUVFunc::get_function);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Panning,Scaling"), "set_function", "get_function");
|
||||
|
||||
BIND_ENUM_CONSTANT(FUNC_PANNING);
|
||||
BIND_ENUM_CONSTANT(FUNC_SCALING);
|
||||
BIND_ENUM_CONSTANT(FUNC_MAX);
|
||||
}
|
||||
|
||||
VisualShaderNodeUVFunc::VisualShaderNodeUVFunc() {
|
||||
set_input_port_default_value(1, Vector3(1.0, 1.0, 0.0)); // scale
|
||||
set_input_port_default_value(2, Vector3()); // offset
|
||||
}
|
||||
|
||||
////////////// Dot Product
|
||||
|
||||
String VisualShaderNodeDotProduct::get_caption() const {
|
||||
|
||||
Reference in New Issue
Block a user