Merge pull request #28996 from Chaosus/vs_fresnel
Added Fresnel and OneMinus to visual shaders
This commit is contained in:
commit
d111d59640
4 changed files with 104 additions and 8 deletions
|
@ -1588,6 +1588,7 @@ VisualShaderEditor::VisualShaderEditor() {
|
|||
add_options.push_back(AddOption("Min", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the lesser of two values."), VisualShaderNodeScalarOp::OP_MIN, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
add_options.push_back(AddOption("Mix", "Scalar", "Functions", "VisualShaderNodeScalarInterp", TTR("Linear interpolation between two scalars."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
add_options.push_back(AddOption("Negate", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the opposite value of the parameter."), VisualShaderNodeScalarFunc::FUNC_NEGATE, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
add_options.push_back(AddOption("OneMinus", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("1.0 - scalar"), VisualShaderNodeScalarFunc::FUNC_ONEMINUS, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
add_options.push_back(AddOption("Pow", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeScalarOp::OP_POW, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
add_options.push_back(AddOption("Radians", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeScalarFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
add_options.push_back(AddOption("Reciprocal", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("1.0 / scalar"), VisualShaderNodeScalarFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
|
@ -1677,6 +1678,7 @@ VisualShaderEditor::VisualShaderEditor() {
|
|||
add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeVectorInterp", TTR("Linear interpolation between two vectors."), -1, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeVectorOp::OP_POW, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_VECTOR));
|
||||
|
@ -1708,6 +1710,8 @@ VisualShaderEditor::VisualShaderEditor() {
|
|||
|
||||
// SPECIAL
|
||||
|
||||
add_options.push_back(AddOption("Fresnel", "Special", "", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), -1, VisualShaderNode::PORT_TYPE_SCALAR));
|
||||
|
||||
add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) Scalar derivative function."), -1, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT));
|
||||
add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) Vector derivative function."), -1, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT));
|
||||
|
||||
|
|
|
@ -523,6 +523,7 @@ void register_scene_types() {
|
|||
ClassDB::register_class<VisualShaderNodeCubeMapUniform>();
|
||||
ClassDB::register_class<VisualShaderNodeIf>();
|
||||
ClassDB::register_class<VisualShaderNodeSwitch>();
|
||||
ClassDB::register_class<VisualShaderNodeFresnel>();
|
||||
|
||||
ClassDB::register_class<ShaderMaterial>();
|
||||
ClassDB::register_virtual_class<CanvasItem>();
|
||||
|
|
|
@ -1192,7 +1192,7 @@ String VisualShaderNodeScalarFunc::get_output_port_name(int p_port) const {
|
|||
|
||||
String VisualShaderNodeScalarFunc::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 {
|
||||
|
||||
static const char *scalar_func_id[FUNC_TRUNC + 1] = {
|
||||
static const char *scalar_func_id[FUNC_ONEMINUS + 1] = {
|
||||
"sin($)",
|
||||
"cos($)",
|
||||
"tan($)",
|
||||
|
@ -1223,7 +1223,8 @@ String VisualShaderNodeScalarFunc::generate_code(Shader::Mode p_mode, VisualShad
|
|||
"radians($)",
|
||||
"1.0/($)",
|
||||
"roundEven($)",
|
||||
"trunc($)"
|
||||
"trunc($)",
|
||||
"1.0-$"
|
||||
};
|
||||
|
||||
return "\t" + p_output_vars[0] + " = " + String(scalar_func_id[func]).replace("$", p_input_vars[0]) + ";\n";
|
||||
|
@ -1251,7 +1252,7 @@ void VisualShaderNodeScalarFunc::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeScalarFunc::set_function);
|
||||
ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeScalarFunc::get_function);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sin,Cos,Tan,ASin,ACos,ATan,SinH,CosH,TanH,Log,Exp,Sqrt,Abs,Sign,Floor,Round,Ceil,Frac,Saturate,Negate,ACosH,ASinH,ATanH,Degrees,Exp2,InverseSqrt,Log2,Radians,Reciprocal,RoundEven,Trunc"), "set_function", "get_function");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sin,Cos,Tan,ASin,ACos,ATan,SinH,CosH,TanH,Log,Exp,Sqrt,Abs,Sign,Floor,Round,Ceil,Frac,Saturate,Negate,ACosH,ASinH,ATanH,Degrees,Exp2,InverseSqrt,Log2,Radians,Reciprocal,RoundEven,Trunc,OneMinus"), "set_function", "get_function");
|
||||
|
||||
BIND_ENUM_CONSTANT(FUNC_SIN);
|
||||
BIND_ENUM_CONSTANT(FUNC_COS);
|
||||
|
@ -1284,6 +1285,7 @@ void VisualShaderNodeScalarFunc::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(FUNC_RECIPROCAL);
|
||||
BIND_ENUM_CONSTANT(FUNC_ROUNDEVEN);
|
||||
BIND_ENUM_CONSTANT(FUNC_TRUNC);
|
||||
BIND_ENUM_CONSTANT(FUNC_ONEMINUS);
|
||||
}
|
||||
|
||||
VisualShaderNodeScalarFunc::VisualShaderNodeScalarFunc() {
|
||||
|
@ -1319,7 +1321,7 @@ String VisualShaderNodeVectorFunc::get_output_port_name(int p_port) const {
|
|||
|
||||
String VisualShaderNodeVectorFunc::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 {
|
||||
|
||||
static const char *vec_func_id[FUNC_TRUNC + 1] = {
|
||||
static const char *vec_func_id[FUNC_ONEMINUS + 1] = {
|
||||
"normalize($)",
|
||||
"max(min($,vec3(1.0)),vec3(0.0))",
|
||||
"-($)",
|
||||
|
@ -1353,7 +1355,8 @@ String VisualShaderNodeVectorFunc::generate_code(Shader::Mode p_mode, VisualShad
|
|||
"sqrt($)",
|
||||
"tan($)",
|
||||
"tanh($)",
|
||||
"trunc($)"
|
||||
"trunc($)",
|
||||
"vec3(1.0, 1.0, 1.0)-$"
|
||||
};
|
||||
|
||||
String code;
|
||||
|
@ -1405,7 +1408,7 @@ void VisualShaderNodeVectorFunc::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorFunc::set_function);
|
||||
ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorFunc::get_function);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Normalize,Saturate,Negate,Reciprocal,RGB2HSV,HSV2RGB,Abs,ACos,ACosH,ASin,ASinH,ATan,ATanH,Ceil,Cos,CosH,Degrees,Exp,Exp2,Floor,Frac,InverseSqrt,Log,Log2,Radians,Round,RoundEven,Sign,Sin,SinH,Sqrt,Tan,TanH,Trunc"), "set_function", "get_function");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Normalize,Saturate,Negate,Reciprocal,RGB2HSV,HSV2RGB,Abs,ACos,ACosH,ASin,ASinH,ATan,ATanH,Ceil,Cos,CosH,Degrees,Exp,Exp2,Floor,Frac,InverseSqrt,Log,Log2,Radians,Round,RoundEven,Sign,Sin,SinH,Sqrt,Tan,TanH,Trunc,OneMinus"), "set_function", "get_function");
|
||||
|
||||
BIND_ENUM_CONSTANT(FUNC_NORMALIZE);
|
||||
BIND_ENUM_CONSTANT(FUNC_SATURATE);
|
||||
|
@ -1441,6 +1444,7 @@ void VisualShaderNodeVectorFunc::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(FUNC_TAN);
|
||||
BIND_ENUM_CONSTANT(FUNC_TANH);
|
||||
BIND_ENUM_CONSTANT(FUNC_TRUNC);
|
||||
BIND_ENUM_CONSTANT(FUNC_ONEMINUS);
|
||||
}
|
||||
|
||||
VisualShaderNodeVectorFunc::VisualShaderNodeVectorFunc() {
|
||||
|
@ -3085,3 +3089,66 @@ VisualShaderNodeSwitch::VisualShaderNodeSwitch() {
|
|||
set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
|
||||
set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
////////////// Fresnel
|
||||
|
||||
String VisualShaderNodeFresnel::get_caption() const {
|
||||
return "Fresnel";
|
||||
}
|
||||
|
||||
int VisualShaderNodeFresnel::get_input_port_count() const {
|
||||
return 4;
|
||||
}
|
||||
|
||||
VisualShaderNodeFresnel::PortType VisualShaderNodeFresnel::get_input_port_type(int p_port) const {
|
||||
switch (p_port) {
|
||||
case 0:
|
||||
return PORT_TYPE_VECTOR;
|
||||
case 1:
|
||||
return PORT_TYPE_VECTOR;
|
||||
case 2:
|
||||
return PORT_TYPE_BOOLEAN;
|
||||
case 3:
|
||||
return PORT_TYPE_SCALAR;
|
||||
default:
|
||||
return PORT_TYPE_VECTOR;
|
||||
}
|
||||
}
|
||||
|
||||
String VisualShaderNodeFresnel::get_input_port_name(int p_port) const {
|
||||
switch (p_port) {
|
||||
case 0:
|
||||
return "normal";
|
||||
case 1:
|
||||
return "view";
|
||||
case 2:
|
||||
return "invert";
|
||||
case 3:
|
||||
return "power";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
int VisualShaderNodeFresnel::get_output_port_count() const {
|
||||
return 1;
|
||||
}
|
||||
|
||||
VisualShaderNodeFresnel::PortType VisualShaderNodeFresnel::get_output_port_type(int p_port) const {
|
||||
return PORT_TYPE_SCALAR;
|
||||
}
|
||||
|
||||
String VisualShaderNodeFresnel::get_output_port_name(int p_port) const {
|
||||
return "result";
|
||||
}
|
||||
|
||||
String VisualShaderNodeFresnel::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 {
|
||||
return "\t" + p_output_vars[0] + " = " + p_input_vars[2] + " ? (pow(clamp(dot(" + p_input_vars[0] + ", " + p_input_vars[1] + "), 0.0, 1.0), " + p_input_vars[3] + ")) : (pow(1.0 - clamp(dot(" + p_input_vars[0] + ", " + p_input_vars[1] + "), 0.0, 1.0), " + p_input_vars[3] + "));";
|
||||
}
|
||||
|
||||
VisualShaderNodeFresnel::VisualShaderNodeFresnel() {
|
||||
set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
|
||||
set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
|
||||
set_input_port_default_value(2, false);
|
||||
set_input_port_default_value(3, 1.0);
|
||||
}
|
||||
|
|
|
@ -562,7 +562,8 @@ public:
|
|||
FUNC_RADIANS,
|
||||
FUNC_RECIPROCAL,
|
||||
FUNC_ROUNDEVEN,
|
||||
FUNC_TRUNC
|
||||
FUNC_TRUNC,
|
||||
FUNC_ONEMINUS
|
||||
};
|
||||
|
||||
protected:
|
||||
|
@ -635,7 +636,8 @@ public:
|
|||
FUNC_SQRT,
|
||||
FUNC_TAN,
|
||||
FUNC_TANH,
|
||||
FUNC_TRUNC
|
||||
FUNC_TRUNC,
|
||||
FUNC_ONEMINUS
|
||||
};
|
||||
|
||||
protected:
|
||||
|
@ -1484,4 +1486,26 @@ public:
|
|||
VisualShaderNodeSwitch();
|
||||
};
|
||||
|
||||
///////////////////////////////////////
|
||||
/// FRESNEL
|
||||
///////////////////////////////////////
|
||||
|
||||
class VisualShaderNodeFresnel : public VisualShaderNode {
|
||||
GDCLASS(VisualShaderNodeFresnel, VisualShaderNode)
|
||||
public:
|
||||
virtual String get_caption() const;
|
||||
|
||||
virtual int get_input_port_count() const;
|
||||
virtual PortType get_input_port_type(int p_port) const;
|
||||
virtual String get_input_port_name(int p_port) const;
|
||||
|
||||
virtual int get_output_port_count() const;
|
||||
virtual PortType get_output_port_type(int p_port) const;
|
||||
virtual String get_output_port_name(int p_port) const;
|
||||
|
||||
virtual String 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 = false) const;
|
||||
|
||||
VisualShaderNodeFresnel();
|
||||
};
|
||||
|
||||
#endif // VISUAL_SHADER_NODES_H
|
||||
|
|
Loading…
Reference in a new issue