mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Add Vector4 to VisualShader
This commit is contained in:
parent
a49079947b
commit
cf58d23a72
27 changed files with 952 additions and 64 deletions
|
@ -74,6 +74,10 @@ void VisualShaderNode::set_input_port_default_value(int p_port, const Variant &p
|
|||
Vector3 pv = p_prev_value;
|
||||
value = pv.x;
|
||||
} break;
|
||||
case Variant::QUATERNION: {
|
||||
Quaternion pv = p_prev_value;
|
||||
value = pv.x;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -94,6 +98,10 @@ void VisualShaderNode::set_input_port_default_value(int p_port, const Variant &p
|
|||
Vector3 pv = p_prev_value;
|
||||
value = (int)pv.x;
|
||||
} break;
|
||||
case Variant::QUATERNION: {
|
||||
Quaternion pv = p_prev_value;
|
||||
value = (int)pv.x;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -115,6 +123,10 @@ void VisualShaderNode::set_input_port_default_value(int p_port, const Variant &p
|
|||
Vector3 pv = p_prev_value;
|
||||
value = Vector2(pv.x, pv.y);
|
||||
} break;
|
||||
case Variant::QUATERNION: {
|
||||
Quaternion pv = p_prev_value;
|
||||
value = Vector2(pv.x, pv.y);
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -136,6 +148,35 @@ void VisualShaderNode::set_input_port_default_value(int p_port, const Variant &p
|
|||
case Variant::VECTOR3: {
|
||||
value = p_prev_value;
|
||||
} break;
|
||||
case Variant::QUATERNION: {
|
||||
Quaternion pv = p_prev_value;
|
||||
value = Vector3(pv.x, pv.y, pv.z);
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
case Variant::QUATERNION: {
|
||||
switch (p_prev_value.get_type()) {
|
||||
case Variant::INT: {
|
||||
float pv = (float)(int)p_prev_value;
|
||||
value = Quaternion(pv, pv, pv, pv);
|
||||
} break;
|
||||
case Variant::FLOAT: {
|
||||
float pv = p_prev_value;
|
||||
value = Quaternion(pv, pv, pv, pv);
|
||||
} break;
|
||||
case Variant::VECTOR2: {
|
||||
Vector2 pv = p_prev_value;
|
||||
value = Quaternion(pv.x, pv.y, pv.y, pv.y);
|
||||
} break;
|
||||
case Variant::VECTOR3: {
|
||||
Vector3 pv = p_prev_value;
|
||||
value = Quaternion(pv.x, pv.y, pv.z, pv.z);
|
||||
} break;
|
||||
case Variant::QUATERNION: {
|
||||
value = p_prev_value;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -253,6 +294,9 @@ int VisualShaderNode::get_expanded_output_port_count() const {
|
|||
case PORT_TYPE_VECTOR_3D: {
|
||||
count2 += 3;
|
||||
} break;
|
||||
case PORT_TYPE_VECTOR_4D: {
|
||||
count2 += 4;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -360,6 +404,7 @@ void VisualShaderNode::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR_INT);
|
||||
BIND_ENUM_CONSTANT(PORT_TYPE_VECTOR_2D);
|
||||
BIND_ENUM_CONSTANT(PORT_TYPE_VECTOR_3D);
|
||||
BIND_ENUM_CONSTANT(PORT_TYPE_VECTOR_4D);
|
||||
BIND_ENUM_CONSTANT(PORT_TYPE_BOOLEAN);
|
||||
BIND_ENUM_CONSTANT(PORT_TYPE_TRANSFORM);
|
||||
BIND_ENUM_CONSTANT(PORT_TYPE_SAMPLER);
|
||||
|
@ -1203,6 +1248,9 @@ String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
code += " COLOR.rgb = n_out" + itos(p_node) + "p" + itos(p_port) + ";\n";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
code += " COLOR.rgb = n_out" + itos(p_node) + "p" + itos(p_port) + ".xyz;\n";
|
||||
} break;
|
||||
default: {
|
||||
code += " COLOR.rgb = vec3(0.0);\n";
|
||||
} break;
|
||||
|
@ -1687,11 +1735,14 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
inputs[i] = "(" + src_var + " ? 1.0 : 0.0)";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_2D: {
|
||||
inputs[i] = "dot(" + src_var + ", vec2(0.333333, 0.333333))";
|
||||
inputs[i] = "dot(" + src_var + ", vec2(0.5, 0.5))";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
inputs[i] = "dot(" + src_var + ", vec3(0.333333, 0.333333, 0.333333))";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
inputs[i] = "dot(" + src_var + ", vec4(0.25, 0.25, 0.25, 0.25))";
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1705,11 +1756,14 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
inputs[i] = "(" + src_var + " ? 1 : 0)";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_2D: {
|
||||
inputs[i] = "dot(float(" + src_var + "), vec2(0.333333, 0.333333))";
|
||||
inputs[i] = "dot(float(" + src_var + "), vec2(0.5, 0.5))";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
inputs[i] = "dot(float(" + src_var + "), vec3(0.333333, 0.333333, 0.333333))";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
inputs[i] = "dot(float(" + src_var + "), vec4(0.25, 0.25, 0.25, 0.25))";
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1728,6 +1782,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
inputs[i] = "all(bvec3(" + src_var + "))";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
inputs[i] = "all(bvec4(" + src_var + "))";
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1743,7 +1800,8 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_BOOLEAN: {
|
||||
inputs[i] = "vec2(" + src_var + " ? 1.0 : 0.0)";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_3D:
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
inputs[i] = "vec2(" + src_var + ".xy)";
|
||||
} break;
|
||||
default:
|
||||
|
@ -1765,6 +1823,30 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_2D: {
|
||||
inputs[i] = "vec3(" + src_var + ", 0.0)";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
inputs[i] = "vec3(" + src_var + ".xyz)";
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
switch (out_type) {
|
||||
case VisualShaderNode::PORT_TYPE_SCALAR: {
|
||||
inputs[i] = "vec4(" + src_var + ")";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_SCALAR_INT: {
|
||||
inputs[i] = "vec4(float(" + src_var + "))";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_BOOLEAN: {
|
||||
inputs[i] = "vec4(" + src_var + " ? 1.0 : 0.0)";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_2D: {
|
||||
inputs[i] = "vec4(" + src_var + ", 0.0, 0.0)";
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
inputs[i] = "vec4(" + src_var + ", 0.0)";
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1799,6 +1881,10 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
Vector3 val = defval;
|
||||
inputs[i] = "n_in" + itos(node) + "p" + itos(i);
|
||||
node_code += " vec3 " + inputs[i] + " = " + vformat("vec3(%.5f, %.5f, %.5f);\n", val.x, val.y, val.z);
|
||||
} else if (defval.get_type() == Variant::QUATERNION) {
|
||||
Quaternion val = defval;
|
||||
inputs[i] = "n_in" + itos(node) + "p" + itos(i);
|
||||
node_code += " vec4 " + inputs[i] + " = " + vformat("vec4(%.5f, %.5f, %.5f, %.5f);\n", val.x, val.y, val.z, val.w);
|
||||
} else if (defval.get_type() == Variant::TRANSFORM3D) {
|
||||
Transform3D val = defval;
|
||||
val.basis.transpose();
|
||||
|
@ -1838,6 +1924,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
output_count += 3;
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
output_count += 4;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1865,6 +1954,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D:
|
||||
outputs[i] = "vec3 " + var_name;
|
||||
break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D:
|
||||
outputs[i] = "vec4 " + var_name;
|
||||
break;
|
||||
case VisualShaderNode::PORT_TYPE_BOOLEAN:
|
||||
outputs[i] = "bool " + var_name;
|
||||
break;
|
||||
|
@ -1882,6 +1974,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
j += 3;
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
j += 4;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1904,6 +1999,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D:
|
||||
code += " vec3 " + outputs[i] + ";\n";
|
||||
break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D:
|
||||
code += " vec4 " + outputs[i] + ";\n";
|
||||
break;
|
||||
case VisualShaderNode::PORT_TYPE_BOOLEAN:
|
||||
code += " bool " + outputs[i] + ";\n";
|
||||
break;
|
||||
|
@ -1921,6 +2019,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
case VisualShaderNode::PORT_TYPE_VECTOR_3D: {
|
||||
j += 3;
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
j += 4;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1995,6 +2096,49 @@ Error VisualShader::_write_node(Type type, StringBuilder *global_code, StringBui
|
|||
|
||||
i += 3;
|
||||
} break;
|
||||
case VisualShaderNode::PORT_TYPE_VECTOR_4D: {
|
||||
if (vsnode->is_output_port_connected(i + 1) || (for_preview && vsnode->get_output_port_for_preview() == (i + 1))) { // red-component
|
||||
if (!new_line_inserted) {
|
||||
code += "\n";
|
||||
new_line_inserted = true;
|
||||
}
|
||||
String r = "n_out" + itos(node) + "p" + itos(i + 1);
|
||||
code += " float " + r + " = n_out" + itos(node) + "p" + itos(i) + ".r;\n";
|
||||
outputs[i + 1] = r;
|
||||
}
|
||||
|
||||
if (vsnode->is_output_port_connected(i + 2) || (for_preview && vsnode->get_output_port_for_preview() == (i + 2))) { // green-component
|
||||
if (!new_line_inserted) {
|
||||
code += "\n";
|
||||
new_line_inserted = true;
|
||||
}
|
||||
String g = "n_out" + itos(node) + "p" + itos(i + 2);
|
||||
code += " float " + g + " = n_out" + itos(node) + "p" + itos(i) + ".g;\n";
|
||||
outputs[i + 2] = g;
|
||||
}
|
||||
|
||||
if (vsnode->is_output_port_connected(i + 3) || (for_preview && vsnode->get_output_port_for_preview() == (i + 3))) { // blue-component
|
||||
if (!new_line_inserted) {
|
||||
code += "\n";
|
||||
new_line_inserted = true;
|
||||
}
|
||||
String b = "n_out" + itos(node) + "p" + itos(i + 3);
|
||||
code += " float " + b + " = n_out" + itos(node) + "p" + itos(i) + ".b;\n";
|
||||
outputs[i + 3] = b;
|
||||
}
|
||||
|
||||
if (vsnode->is_output_port_connected(i + 4) || (for_preview && vsnode->get_output_port_for_preview() == (i + 4))) { // alpha-component
|
||||
if (!new_line_inserted) {
|
||||
code += "\n";
|
||||
new_line_inserted = true;
|
||||
}
|
||||
String b = "n_out" + itos(node) + "p" + itos(i + 3);
|
||||
code += " float " + b + " = n_out" + itos(node) + "p" + itos(i) + ".a;\n";
|
||||
outputs[i + 4] = b;
|
||||
}
|
||||
|
||||
i += 4;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -2147,6 +2291,9 @@ void VisualShader::_update_shader() const {
|
|||
case VaryingType::VARYING_TYPE_VECTOR_3D:
|
||||
global_code += "vec3 ";
|
||||
break;
|
||||
case VaryingType::VARYING_TYPE_VECTOR_4D:
|
||||
global_code += "vec4 ";
|
||||
break;
|
||||
case VaryingType::VARYING_TYPE_COLOR:
|
||||
global_code += "vec4 ";
|
||||
break;
|
||||
|
@ -2207,6 +2354,9 @@ void VisualShader::_update_shader() const {
|
|||
case VaryingType::VARYING_TYPE_VECTOR_3D:
|
||||
code2 += "vec3(0.0)";
|
||||
break;
|
||||
case VaryingType::VARYING_TYPE_VECTOR_4D:
|
||||
code2 += "vec4(0.0)";
|
||||
break;
|
||||
case VaryingType::VARYING_TYPE_COLOR:
|
||||
code2 += "vec4(0.0)";
|
||||
break;
|
||||
|
@ -2527,6 +2677,7 @@ void VisualShader::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(VARYING_TYPE_FLOAT);
|
||||
BIND_ENUM_CONSTANT(VARYING_TYPE_VECTOR_2D);
|
||||
BIND_ENUM_CONSTANT(VARYING_TYPE_VECTOR_3D);
|
||||
BIND_ENUM_CONSTANT(VARYING_TYPE_VECTOR_4D);
|
||||
BIND_ENUM_CONSTANT(VARYING_TYPE_COLOR);
|
||||
BIND_ENUM_CONSTANT(VARYING_TYPE_TRANSFORM);
|
||||
BIND_ENUM_CONSTANT(VARYING_TYPE_MAX);
|
||||
|
@ -2970,6 +3121,9 @@ String VisualShaderNodeInput::generate_code(Shader::Mode p_mode, VisualShader::T
|
|||
case PORT_TYPE_VECTOR_3D: {
|
||||
code = " " + p_output_vars[0] + " = vec3(0.0);\n";
|
||||
} break;
|
||||
case PORT_TYPE_VECTOR_4D: {
|
||||
code = " " + p_output_vars[0] + " = vec4(0.0);\n";
|
||||
} break;
|
||||
case PORT_TYPE_BOOLEAN: {
|
||||
code = " " + p_output_vars[0] + " = false;\n";
|
||||
} break;
|
||||
|
@ -3186,6 +3340,8 @@ int VisualShaderNodeUniformRef::get_output_port_count() const {
|
|||
return 1;
|
||||
case UniformType::UNIFORM_TYPE_VECTOR3:
|
||||
return 1;
|
||||
case UniformType::UNIFORM_TYPE_VECTOR4:
|
||||
return 1;
|
||||
case UniformType::UNIFORM_TYPE_TRANSFORM:
|
||||
return 1;
|
||||
case UniformType::UNIFORM_TYPE_COLOR:
|
||||
|
@ -3210,6 +3366,8 @@ VisualShaderNodeUniformRef::PortType VisualShaderNodeUniformRef::get_output_port
|
|||
return PortType::PORT_TYPE_VECTOR_2D;
|
||||
case UniformType::UNIFORM_TYPE_VECTOR3:
|
||||
return PortType::PORT_TYPE_VECTOR_3D;
|
||||
case UniformType::UNIFORM_TYPE_VECTOR4:
|
||||
return PortType::PORT_TYPE_VECTOR_4D;
|
||||
case UniformType::UNIFORM_TYPE_TRANSFORM:
|
||||
return PortType::PORT_TYPE_TRANSFORM;
|
||||
case UniformType::UNIFORM_TYPE_COLOR:
|
||||
|
@ -3239,6 +3397,8 @@ String VisualShaderNodeUniformRef::get_output_port_name(int p_port) const {
|
|||
return "";
|
||||
case UniformType::UNIFORM_TYPE_VECTOR3:
|
||||
return "";
|
||||
case UniformType::UNIFORM_TYPE_VECTOR4:
|
||||
return "";
|
||||
case UniformType::UNIFORM_TYPE_TRANSFORM:
|
||||
return "";
|
||||
case UniformType::UNIFORM_TYPE_COLOR:
|
||||
|
@ -3311,6 +3471,8 @@ VisualShaderNodeUniformRef::PortType VisualShaderNodeUniformRef::get_port_type_b
|
|||
return PORT_TYPE_VECTOR_2D;
|
||||
case UniformType::UNIFORM_TYPE_VECTOR3:
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
case UniformType::UNIFORM_TYPE_VECTOR4:
|
||||
return PORT_TYPE_VECTOR_4D;
|
||||
case UniformType::UNIFORM_TYPE_TRANSFORM:
|
||||
return PORT_TYPE_TRANSFORM;
|
||||
case UniformType::UNIFORM_TYPE_COLOR:
|
||||
|
@ -3697,6 +3859,11 @@ String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::T
|
|||
incompatible_type = true;
|
||||
}
|
||||
} break;
|
||||
case RS::GLOBAL_VAR_TYPE_VEC4: {
|
||||
if (!Object::cast_to<VisualShaderNodeVec4Uniform>(this)) {
|
||||
incompatible_type = true;
|
||||
}
|
||||
} break;
|
||||
case RS::GLOBAL_VAR_TYPE_TRANSFORM: {
|
||||
if (!Object::cast_to<VisualShaderNodeTransformUniform>(this)) {
|
||||
incompatible_type = true;
|
||||
|
@ -4404,6 +4571,9 @@ String VisualShaderNodeExpression::generate_code(Shader::Mode p_mode, VisualShad
|
|||
case PORT_TYPE_VECTOR_3D:
|
||||
tk = "vec3(0.0, 0.0, 0.0)";
|
||||
break;
|
||||
case PORT_TYPE_VECTOR_4D:
|
||||
tk = "vec4(0.0, 0.0, 0.0, 0.0)";
|
||||
break;
|
||||
case PORT_TYPE_BOOLEAN:
|
||||
tk = "false";
|
||||
break;
|
||||
|
@ -4542,6 +4712,8 @@ String VisualShaderNodeVarying::get_type_str() const {
|
|||
return "vec2";
|
||||
case VisualShader::VARYING_TYPE_VECTOR_3D:
|
||||
return "vec3";
|
||||
case VisualShader::VARYING_TYPE_VECTOR_4D:
|
||||
return "vec4";
|
||||
case VisualShader::VARYING_TYPE_COLOR:
|
||||
return "vec4";
|
||||
case VisualShader::VARYING_TYPE_TRANSFORM:
|
||||
|
@ -4558,6 +4730,8 @@ VisualShaderNodeVarying::PortType VisualShaderNodeVarying::get_port_type(VisualS
|
|||
return PORT_TYPE_VECTOR_2D;
|
||||
case VisualShader::VARYING_TYPE_VECTOR_3D:
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
case VisualShader::VARYING_TYPE_VECTOR_4D:
|
||||
return PORT_TYPE_VECTOR_4D;
|
||||
case VisualShader::VARYING_TYPE_COLOR:
|
||||
if (p_port == 1) {
|
||||
break; // scalar
|
||||
|
@ -4718,6 +4892,9 @@ String VisualShaderNodeVaryingGetter::generate_code(Shader::Mode p_mode, VisualS
|
|||
case VisualShader::VARYING_TYPE_VECTOR_3D:
|
||||
from = "vec3(0.0)";
|
||||
break;
|
||||
case VisualShader::VARYING_TYPE_VECTOR_4D:
|
||||
from = "vec4(0.0)";
|
||||
break;
|
||||
case VisualShader::VARYING_TYPE_COLOR:
|
||||
from = "vec3(0.0)";
|
||||
from2 = "0.0";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue