You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-09 12:50:35 +00:00
Add some more fixes to visual shader
This commit is contained in:
@@ -39,6 +39,9 @@ int VisualShaderNodeParticleEmitter::get_output_port_count() const {
|
||||
}
|
||||
|
||||
VisualShaderNodeParticleEmitter::PortType VisualShaderNodeParticleEmitter::get_output_port_type(int p_port) const {
|
||||
if (mode_2d) {
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
}
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
}
|
||||
|
||||
@@ -54,6 +57,9 @@ bool VisualShaderNodeParticleEmitter::has_output_port_preview(int p_port) const
|
||||
}
|
||||
|
||||
void VisualShaderNodeParticleEmitter::set_mode_2d(bool p_enabled) {
|
||||
if (mode_2d == p_enabled) {
|
||||
return;
|
||||
}
|
||||
mode_2d = p_enabled;
|
||||
emit_changed();
|
||||
}
|
||||
@@ -111,7 +117,7 @@ String VisualShaderNodeParticleSphereEmitter::get_input_port_name(int p_port) co
|
||||
return String();
|
||||
}
|
||||
|
||||
String VisualShaderNodeParticleSphereEmitter::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
|
||||
String VisualShaderNodeParticleSphereEmitter::generate_global_per_node(Shader::Mode p_mode, int p_id) const {
|
||||
String code;
|
||||
|
||||
code += "vec2 __get_random_point_in_circle(inout uint seed, float radius, float inner_radius) {\n";
|
||||
@@ -129,7 +135,7 @@ String VisualShaderNodeParticleSphereEmitter::generate_code(Shader::Mode p_mode,
|
||||
String code;
|
||||
|
||||
if (mode_2d) {
|
||||
code += " " + p_output_vars[0] + " = vec3(__get_random_point_in_circle(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ", " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + "), 0.0);\n";
|
||||
code += " " + p_output_vars[0] + " = __get_random_point_in_circle(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ", " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ");\n";
|
||||
} else {
|
||||
code += " " + p_output_vars[0] + " = __get_random_point_in_sphere(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ", " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ");\n";
|
||||
}
|
||||
@@ -154,11 +160,27 @@ int VisualShaderNodeParticleBoxEmitter::get_input_port_count() const {
|
||||
|
||||
VisualShaderNodeParticleBoxEmitter::PortType VisualShaderNodeParticleBoxEmitter::get_input_port_type(int p_port) const {
|
||||
if (p_port == 0) {
|
||||
if (mode_2d) {
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
}
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
}
|
||||
return PORT_TYPE_SCALAR;
|
||||
}
|
||||
|
||||
void VisualShaderNodeParticleBoxEmitter::set_mode_2d(bool p_enabled) {
|
||||
if (mode_2d == p_enabled) {
|
||||
return;
|
||||
}
|
||||
if (p_enabled) {
|
||||
set_input_port_default_value(0, Vector2(), get_input_port_default_value(0));
|
||||
} else {
|
||||
set_input_port_default_value(0, Vector3(), get_input_port_default_value(0));
|
||||
}
|
||||
mode_2d = p_enabled;
|
||||
emit_changed();
|
||||
}
|
||||
|
||||
String VisualShaderNodeParticleBoxEmitter::get_input_port_name(int p_port) const {
|
||||
if (p_port == 0) {
|
||||
return "extents";
|
||||
@@ -166,7 +188,7 @@ String VisualShaderNodeParticleBoxEmitter::get_input_port_name(int p_port) const
|
||||
return String();
|
||||
}
|
||||
|
||||
String VisualShaderNodeParticleBoxEmitter::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
|
||||
String VisualShaderNodeParticleBoxEmitter::generate_global_per_node(Shader::Mode p_mode, int p_id) const {
|
||||
String code;
|
||||
|
||||
code += "vec2 __get_random_point_in_box2d(inout uint seed, vec2 extents) {\n";
|
||||
@@ -185,7 +207,7 @@ String VisualShaderNodeParticleBoxEmitter::generate_global_per_node(Shader::Mode
|
||||
String VisualShaderNodeParticleBoxEmitter::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;
|
||||
if (mode_2d) {
|
||||
code += " " + p_output_vars[0] + " = vec3(__get_random_point_in_box2d(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ".xy), 0.0);\n";
|
||||
code += " " + p_output_vars[0] + " = __get_random_point_in_box2d(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ");\n";
|
||||
} else {
|
||||
code += " " + p_output_vars[0] + " = __get_random_point_in_box3d(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ");\n";
|
||||
}
|
||||
@@ -221,7 +243,7 @@ String VisualShaderNodeParticleRingEmitter::get_input_port_name(int p_port) cons
|
||||
return String();
|
||||
}
|
||||
|
||||
String VisualShaderNodeParticleRingEmitter::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
|
||||
String VisualShaderNodeParticleRingEmitter::generate_global_per_node(Shader::Mode p_mode, int p_id) const {
|
||||
String code;
|
||||
|
||||
code += "vec2 __get_random_point_on_ring2d(inout uint seed, float radius, float inner_radius) {\n";
|
||||
@@ -243,7 +265,7 @@ String VisualShaderNodeParticleRingEmitter::generate_code(Shader::Mode p_mode, V
|
||||
String code;
|
||||
|
||||
if (mode_2d) {
|
||||
code = " " + p_output_vars[0] + " = vec3(__get_random_point_on_ring2d(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ", " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + "), 0.0);\n";
|
||||
code = " " + p_output_vars[0] + " = __get_random_point_on_ring2d(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ", " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ");\n";
|
||||
} else {
|
||||
code = " " + p_output_vars[0] + " = __get_random_point_on_ring3d(__seed, " + (p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0]) + ", " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ", " + (p_input_vars[2].is_empty() ? (String)get_input_port_default_value(2) : p_input_vars[2]) + ");\n";
|
||||
}
|
||||
@@ -269,18 +291,24 @@ int VisualShaderNodeParticleMeshEmitter::get_output_port_count() const {
|
||||
|
||||
VisualShaderNodeParticleBoxEmitter::PortType VisualShaderNodeParticleMeshEmitter::get_output_port_type(int p_port) const {
|
||||
switch (p_port) {
|
||||
case 0:
|
||||
return PORT_TYPE_VECTOR_3D; // position
|
||||
case 1:
|
||||
return PORT_TYPE_VECTOR_3D; // normal
|
||||
case 2:
|
||||
return PORT_TYPE_VECTOR_3D; // color
|
||||
case 3:
|
||||
return PORT_TYPE_SCALAR; // alpha
|
||||
case 4:
|
||||
return PORT_TYPE_VECTOR_3D; // uv
|
||||
case 5:
|
||||
return PORT_TYPE_VECTOR_3D; // uv2
|
||||
case 0: // position
|
||||
if (mode_2d) {
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
}
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
case 1: // normal
|
||||
if (mode_2d) {
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
}
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
case 2: // color
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
case 3: // alpha
|
||||
return PORT_TYPE_SCALAR;
|
||||
case 4: // uv
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
case 5: // uv2
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
}
|
||||
return PORT_TYPE_SCALAR;
|
||||
}
|
||||
@@ -341,18 +369,22 @@ String VisualShaderNodeParticleMeshEmitter::generate_global(Shader::Mode p_mode,
|
||||
return code;
|
||||
}
|
||||
|
||||
String VisualShaderNodeParticleMeshEmitter::_generate_code(VisualShader::Type p_type, int p_id, const String *p_output_vars, int p_index, const String &p_texture_name, bool p_ignore_mode2d) const {
|
||||
String VisualShaderNodeParticleMeshEmitter::_generate_code(VisualShader::Type p_type, int p_id, const String *p_output_vars, int p_index, const String &p_texture_name, PortType p_port_type) const {
|
||||
String code;
|
||||
if (is_output_port_connected(p_index)) {
|
||||
if (mode_2d && !p_ignore_mode2d) {
|
||||
code += " " + p_output_vars[p_index] + " = vec3(";
|
||||
code += "texelFetch(";
|
||||
code += make_unique_id(p_type, p_id, p_texture_name) + ", ";
|
||||
code += "ivec2(__scalar_ibuff, 0), 0).xy, 0.0);\n";
|
||||
} else {
|
||||
code += " " + p_output_vars[p_index] + " = texelFetch(";
|
||||
code += make_unique_id(p_type, p_id, p_texture_name) + ", ";
|
||||
code += "ivec2(__scalar_ibuff, 0), 0).xyz;\n";
|
||||
switch (p_port_type) {
|
||||
case PORT_TYPE_VECTOR_2D: {
|
||||
code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xy;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name));
|
||||
} break;
|
||||
case PORT_TYPE_VECTOR_3D: {
|
||||
if (mode_2d) {
|
||||
code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xy;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name));
|
||||
} else {
|
||||
code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xyz;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name));
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return code;
|
||||
@@ -362,27 +394,22 @@ String VisualShaderNodeParticleMeshEmitter::generate_code(Shader::Mode p_mode, V
|
||||
String code;
|
||||
code += " __scalar_ibuff = int(__rand_from_seed(__seed) * 65535.0) % " + itos(position_texture->get_width()) + ";\n";
|
||||
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 0, "mesh_vx");
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 1, "mesh_nm");
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 0, "mesh_vx", VisualShaderNode::PORT_TYPE_VECTOR_3D);
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 1, "mesh_nm", VisualShaderNode::PORT_TYPE_VECTOR_3D);
|
||||
|
||||
if (is_output_port_connected(2) || is_output_port_connected(3)) {
|
||||
code += " __vec4_buff = texelFetch(";
|
||||
code += make_unique_id(p_type, p_id, "mesh_col") + ", ";
|
||||
code += "ivec2(__scalar_ibuff, 0), 0);\n";
|
||||
code += vformat(" __vec4_buff = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0);\n", make_unique_id(p_type, p_id, "mesh_col"));
|
||||
|
||||
if (is_output_port_connected(2)) {
|
||||
code += " " + p_output_vars[2] + " = __vec4_buff.rgb;\n";
|
||||
} else {
|
||||
code += " " + p_output_vars[2] + " = vec3(0.0);\n";
|
||||
}
|
||||
if (is_output_port_connected(3)) {
|
||||
code += " " + p_output_vars[3] + " = __vec4_buff.a;\n";
|
||||
} else {
|
||||
code += " " + p_output_vars[3] + " = 0.0;\n";
|
||||
}
|
||||
}
|
||||
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 4, "mesh_uv", true);
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 5, "mesh_uv2", true);
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 4, "mesh_uv", VisualShaderNode::PORT_TYPE_VECTOR_2D);
|
||||
code += _generate_code(p_type, p_id, p_output_vars, 5, "mesh_uv2", VisualShaderNode::PORT_TYPE_VECTOR_2D);
|
||||
|
||||
return code;
|
||||
}
|
||||
@@ -876,10 +903,11 @@ void VisualShaderNodeParticleRandomness::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeParticleRandomness::set_op_type);
|
||||
ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeParticleRandomness::get_op_type);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Scalar,Vector"), "set_op_type", "get_op_type");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Scalar,Vector2,Vector3"), "set_op_type", "get_op_type");
|
||||
|
||||
BIND_ENUM_CONSTANT(OP_TYPE_SCALAR);
|
||||
BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
|
||||
BIND_ENUM_CONSTANT(OP_TYPE_VECTOR_2D);
|
||||
BIND_ENUM_CONSTANT(OP_TYPE_VECTOR_3D);
|
||||
BIND_ENUM_CONSTANT(OP_TYPE_MAX);
|
||||
}
|
||||
|
||||
@@ -898,8 +926,13 @@ int VisualShaderNodeParticleRandomness::get_output_port_count() const {
|
||||
}
|
||||
|
||||
VisualShaderNodeParticleRandomness::PortType VisualShaderNodeParticleRandomness::get_output_port_type(int p_port) const {
|
||||
if (op_type == OP_TYPE_VECTOR) {
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
switch (op_type) {
|
||||
case OP_TYPE_VECTOR_2D:
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
case OP_TYPE_VECTOR_3D:
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return PORT_TYPE_SCALAR;
|
||||
}
|
||||
@@ -913,8 +946,13 @@ int VisualShaderNodeParticleRandomness::get_input_port_count() const {
|
||||
}
|
||||
|
||||
VisualShaderNodeParticleRandomness::PortType VisualShaderNodeParticleRandomness::get_input_port_type(int p_port) const {
|
||||
if (op_type == OP_TYPE_VECTOR) {
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
switch (op_type) {
|
||||
case OP_TYPE_VECTOR_2D:
|
||||
return PORT_TYPE_VECTOR_2D;
|
||||
case OP_TYPE_VECTOR_3D:
|
||||
return PORT_TYPE_VECTOR_3D;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return PORT_TYPE_SCALAR;
|
||||
}
|
||||
@@ -930,10 +968,18 @@ String VisualShaderNodeParticleRandomness::get_input_port_name(int p_port) const
|
||||
|
||||
String VisualShaderNodeParticleRandomness::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;
|
||||
if (op_type == OP_TYPE_SCALAR) {
|
||||
code += vformat(" %s = __randf_range(__seed, %s, %s);\n", p_output_vars[0], p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0], p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]);
|
||||
} else if (op_type == OP_TYPE_VECTOR) {
|
||||
code += vformat(" %s = __randv_range(__seed, %s, %s);\n", p_output_vars[0], p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0], p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]);
|
||||
switch (op_type) {
|
||||
case OP_TYPE_SCALAR: {
|
||||
code += vformat(" %s = __randf_range(__seed, %s, %s);\n", p_output_vars[0], p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0], p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]);
|
||||
} break;
|
||||
case OP_TYPE_VECTOR_2D: {
|
||||
code += vformat(" %s = __randv2_range(__seed, %s, %s);\n", p_output_vars[0], p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0], p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]);
|
||||
} break;
|
||||
case OP_TYPE_VECTOR_3D: {
|
||||
code += vformat(" %s = __randv3_range(__seed, %s, %s);\n", p_output_vars[0], p_input_vars[0].is_empty() ? (String)get_input_port_default_value(0) : p_input_vars[0], p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]);
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return code;
|
||||
}
|
||||
@@ -943,12 +989,21 @@ void VisualShaderNodeParticleRandomness::set_op_type(OpType p_op_type) {
|
||||
if (op_type == p_op_type) {
|
||||
return;
|
||||
}
|
||||
if (p_op_type == OP_TYPE_SCALAR) {
|
||||
set_input_port_default_value(0, 0.0);
|
||||
set_input_port_default_value(1, 1.0);
|
||||
} else {
|
||||
set_input_port_default_value(0, Vector3(-1.0, -1.0, -1.0));
|
||||
set_input_port_default_value(1, Vector3(1.0, 1.0, 1.0));
|
||||
switch (p_op_type) {
|
||||
case OP_TYPE_SCALAR: {
|
||||
set_input_port_default_value(0, 0.0, get_input_port_default_value(0));
|
||||
set_input_port_default_value(1, 0.0, get_input_port_default_value(1));
|
||||
} break;
|
||||
case OP_TYPE_VECTOR_2D: {
|
||||
set_input_port_default_value(0, Vector2(), get_input_port_default_value(0));
|
||||
set_input_port_default_value(1, Vector2(), get_input_port_default_value(1));
|
||||
} break;
|
||||
case OP_TYPE_VECTOR_3D: {
|
||||
set_input_port_default_value(0, Vector3(), get_input_port_default_value(0));
|
||||
set_input_port_default_value(1, Vector3(), get_input_port_default_value(1));
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
op_type = p_op_type;
|
||||
emit_changed();
|
||||
@@ -963,7 +1018,7 @@ bool VisualShaderNodeParticleRandomness::has_output_port_preview(int p_port) con
|
||||
}
|
||||
|
||||
VisualShaderNodeParticleRandomness::VisualShaderNodeParticleRandomness() {
|
||||
set_input_port_default_value(0, 0.0);
|
||||
set_input_port_default_value(0, -1.0);
|
||||
set_input_port_default_value(1, 1.0);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user