Skip to content

Commit 9c56102

Browse files
committed
Merge pull request #112538 from Chaosus/vs_instance_index
Add `instance_index` option to parameters in visual shaders
2 parents 2c11fac + 808faa0 commit 9c56102

File tree

4 files changed

+74
-3
lines changed

4 files changed

+74
-3
lines changed

doc/classes/VisualShaderNodeParameter.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
<tutorials>
1010
</tutorials>
1111
<members>
12+
<member name="instance_index" type="int" setter="set_instance_index" getter="get_instance_index" default="0">
13+
The index within 0-15 range, which is used to avoid clashes when shader used on multiple materials.
14+
</member>
1215
<member name="parameter_name" type="String" setter="set_parameter_name" getter="get_parameter_name" default="&quot;&quot;">
1316
Name of the parameter, by which it can be accessed through the [ShaderMaterial] properties.
1417
</member>
@@ -26,7 +29,10 @@
2629
<constant name="QUAL_INSTANCE" value="2" enum="Qualifier">
2730
The parameter will be tied to the node with attached [ShaderMaterial] using this shader.
2831
</constant>
29-
<constant name="QUAL_MAX" value="3" enum="Qualifier">
32+
<constant name="QUAL_INSTANCE_INDEX" value="3" enum="Qualifier">
33+
The parameter will be tied to the node with attached [ShaderMaterial] using this shader. Enables setting a [member instance_index] property.
34+
</constant>
35+
<constant name="QUAL_MAX" value="4" enum="Qualifier">
3036
Represents the size of the [enum Qualifier] enum.
3137
</constant>
3238
</constants>

scene/resources/visual_shader.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4389,6 +4389,16 @@ VisualShaderNodeParameter::Qualifier VisualShaderNodeParameter::get_qualifier()
43894389
return qualifier;
43904390
}
43914391

4392+
void VisualShaderNodeParameter::set_instance_index(int p_index) {
4393+
ERR_FAIL_INDEX(p_index, 16);
4394+
instance_index = p_index;
4395+
emit_changed();
4396+
}
4397+
4398+
int VisualShaderNodeParameter::get_instance_index() const {
4399+
return instance_index;
4400+
}
4401+
43924402
void VisualShaderNodeParameter::set_global_code_generated(bool p_enabled) {
43934403
global_code_generated = p_enabled;
43944404
}
@@ -4415,12 +4425,17 @@ void VisualShaderNodeParameter::_bind_methods() {
44154425
ClassDB::bind_method(D_METHOD("set_qualifier", "qualifier"), &VisualShaderNodeParameter::set_qualifier);
44164426
ClassDB::bind_method(D_METHOD("get_qualifier"), &VisualShaderNodeParameter::get_qualifier);
44174427

4428+
ClassDB::bind_method(D_METHOD("set_instance_index", "instance_index"), &VisualShaderNodeParameter::set_instance_index);
4429+
ClassDB::bind_method(D_METHOD("get_instance_index"), &VisualShaderNodeParameter::get_instance_index);
4430+
44184431
ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "parameter_name"), "set_parameter_name", "get_parameter_name");
4419-
ADD_PROPERTY(PropertyInfo(Variant::INT, "qualifier", PROPERTY_HINT_ENUM, "None,Global,Instance"), "set_qualifier", "get_qualifier");
4432+
ADD_PROPERTY(PropertyInfo(Variant::INT, "qualifier", PROPERTY_HINT_ENUM, "None,Global,Instance,Instance + Index"), "set_qualifier", "get_qualifier");
4433+
ADD_PROPERTY(PropertyInfo(Variant::INT, "instance_index", PROPERTY_HINT_RANGE, "0,15,1"), "set_instance_index", "get_instance_index");
44204434

44214435
BIND_ENUM_CONSTANT(QUAL_NONE);
44224436
BIND_ENUM_CONSTANT(QUAL_GLOBAL);
44234437
BIND_ENUM_CONSTANT(QUAL_INSTANCE);
4438+
BIND_ENUM_CONSTANT(QUAL_INSTANCE_INDEX);
44244439
BIND_ENUM_CONSTANT(QUAL_MAX);
44254440
}
44264441

@@ -4431,6 +4446,7 @@ String VisualShaderNodeParameter::_get_qual_str() const {
44314446
break;
44324447
case QUAL_GLOBAL:
44334448
return "global ";
4449+
case QUAL_INSTANCE_INDEX:
44344450
case QUAL_INSTANCE:
44354451
return "instance ";
44364452
default:
@@ -4454,6 +4470,7 @@ String VisualShaderNodeParameter::get_warning(Shader::Mode p_mode, VisualShader:
44544470
case QUAL_GLOBAL:
44554471
qualifier_str = "global";
44564472
break;
4473+
case QUAL_INSTANCE_INDEX:
44574474
case QUAL_INSTANCE:
44584475
qualifier_str = "instance";
44594476
break;
@@ -4537,6 +4554,9 @@ String VisualShaderNodeParameter::get_warning(Shader::Mode p_mode, VisualShader:
45374554
Vector<StringName> VisualShaderNodeParameter::get_editable_properties() const {
45384555
Vector<StringName> props;
45394556
props.push_back("qualifier");
4557+
if (qualifier == QUAL_INSTANCE_INDEX) {
4558+
props.push_back("instance_index");
4559+
}
45404560
return props;
45414561
}
45424562

scene/resources/visual_shader.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,13 +597,15 @@ class VisualShaderNodeParameter : public VisualShaderNode {
597597
QUAL_NONE,
598598
QUAL_GLOBAL,
599599
QUAL_INSTANCE,
600+
QUAL_INSTANCE_INDEX,
600601
QUAL_MAX,
601602
};
602603

603604
private:
604605
String parameter_name = "";
605606
Qualifier qualifier = QUAL_NONE;
606607
bool global_code_generated = false;
608+
int instance_index = 0;
607609

608610
protected:
609611
static void _bind_methods();
@@ -623,6 +625,9 @@ class VisualShaderNodeParameter : public VisualShaderNode {
623625
void set_global_code_generated(bool p_enabled);
624626
bool is_global_code_generated() const;
625627

628+
void set_instance_index(int p_index);
629+
int get_instance_index() const;
630+
626631
virtual bool is_qualifier_supported(Qualifier p_qual) const = 0;
627632
virtual bool is_convertible_to_constant() const = 0;
628633

scene/resources/visual_shader_nodes.cpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5213,12 +5213,22 @@ String VisualShaderNodeFloatParameter::get_output_port_name(int p_port) const {
52135213

52145214
String VisualShaderNodeFloatParameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
52155215
String code = "";
5216+
bool add_comma = true;
52165217
if (hint == HINT_RANGE) {
52175218
code += _get_qual_str() + "uniform float " + get_parameter_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ")";
52185219
} else if (hint == HINT_RANGE_STEP) {
52195220
code += _get_qual_str() + "uniform float " + get_parameter_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ")";
52205221
} else {
52215222
code += _get_qual_str() + "uniform float " + get_parameter_name();
5223+
add_comma = false;
5224+
}
5225+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
5226+
if (add_comma) {
5227+
code += ", ";
5228+
} else {
5229+
code += ": ";
5230+
}
5231+
code += vformat("instance_index(%d)", get_instance_index());
52225232
}
52235233
if (default_value_enabled) {
52245234
code += " = " + rtos(default_value);
@@ -5404,6 +5414,7 @@ String VisualShaderNodeIntParameter::get_output_port_name(int p_port) const {
54045414

54055415
String VisualShaderNodeIntParameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
54065416
String code = "";
5417+
bool add_comma = true;
54075418
if (hint == HINT_RANGE) {
54085419
code += _get_qual_str() + "uniform int " + get_parameter_name() + " : hint_range(" + itos(hint_range_min) + ", " + itos(hint_range_max) + ")";
54095420
} else if (hint == HINT_RANGE_STEP) {
@@ -5424,6 +5435,15 @@ String VisualShaderNodeIntParameter::generate_global(Shader::Mode p_mode, Visual
54245435
code += ")";
54255436
} else {
54265437
code += _get_qual_str() + "uniform int " + get_parameter_name();
5438+
add_comma = false;
5439+
}
5440+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
5441+
if (add_comma) {
5442+
code += ", ";
5443+
} else {
5444+
code += ": ";
5445+
}
5446+
code += vformat("instance_index(%d)", get_instance_index());
54275447
}
54285448
if (default_value_enabled) {
54295449
code += " = " + itos(default_value);
@@ -5629,6 +5649,9 @@ String VisualShaderNodeUIntParameter::get_output_port_name(int p_port) const {
56295649

56305650
String VisualShaderNodeUIntParameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
56315651
String code = _get_qual_str() + "uniform uint " + get_parameter_name();
5652+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
5653+
code += vformat(": instance_index(%d)", get_instance_index());
5654+
}
56325655
if (default_value_enabled) {
56335656
code += " = " + itos(default_value);
56345657
}
@@ -5759,6 +5782,9 @@ bool VisualShaderNodeBooleanParameter::get_default_value() const {
57595782

57605783
String VisualShaderNodeBooleanParameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
57615784
String code = _get_qual_str() + "uniform bool " + get_parameter_name();
5785+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
5786+
code += vformat(": instance_index(%d)", get_instance_index());
5787+
}
57625788
if (default_value_enabled) {
57635789
if (default_value) {
57645790
code += " = true";
@@ -5869,6 +5895,9 @@ Color VisualShaderNodeColorParameter::get_default_value() const {
58695895

58705896
String VisualShaderNodeColorParameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
58715897
String code = _get_qual_str() + "uniform vec4 " + get_parameter_name() + " : source_color";
5898+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
5899+
code += vformat(", instance_index(%d)", get_instance_index());
5900+
}
58725901
if (default_value_enabled) {
58735902
code += vformat(" = vec4(%.6f, %.6f, %.6f, %.6f)", default_value.r, default_value.g, default_value.b, default_value.a);
58745903
}
@@ -5965,6 +5994,9 @@ Vector2 VisualShaderNodeVec2Parameter::get_default_value() const {
59655994

59665995
String VisualShaderNodeVec2Parameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
59675996
String code = _get_qual_str() + "uniform vec2 " + get_parameter_name();
5997+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
5998+
code += vformat(": instance_index(%d)", get_instance_index());
5999+
}
59686000
if (default_value_enabled) {
59696001
code += vformat(" = vec2(%.6f, %.6f)", default_value.x, default_value.y);
59706002
}
@@ -6065,6 +6097,9 @@ Vector3 VisualShaderNodeVec3Parameter::get_default_value() const {
60656097

60666098
String VisualShaderNodeVec3Parameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
60676099
String code = _get_qual_str() + "uniform vec3 " + get_parameter_name();
6100+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
6101+
code += vformat(": instance_index(%d)", get_instance_index());
6102+
}
60686103
if (default_value_enabled) {
60696104
code += vformat(" = vec3(%.6f, %.6f, %.6f)", default_value.x, default_value.y, default_value.z);
60706105
}
@@ -6165,6 +6200,9 @@ Vector4 VisualShaderNodeVec4Parameter::get_default_value() const {
61656200

61666201
String VisualShaderNodeVec4Parameter::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
61676202
String code = _get_qual_str() + "uniform vec4 " + get_parameter_name();
6203+
if (get_qualifier() == QUAL_INSTANCE_INDEX) {
6204+
code += vformat(": instance_index(%d)", get_instance_index());
6205+
}
61686206
if (default_value_enabled) {
61696207
code += vformat(" = vec4(%.6f, %.6f, %.6f, %.6f)", default_value.x, default_value.y, default_value.z, default_value.w);
61706208
}
@@ -6300,7 +6338,7 @@ bool VisualShaderNodeTransformParameter::is_use_prop_slots() const {
63006338
}
63016339

63026340
bool VisualShaderNodeTransformParameter::is_qualifier_supported(Qualifier p_qual) const {
6303-
if (p_qual == Qualifier::QUAL_INSTANCE) {
6341+
if (p_qual == Qualifier::QUAL_INSTANCE || p_qual == Qualifier::QUAL_INSTANCE_INDEX) {
63046342
return false;
63056343
}
63066344
return true;
@@ -6703,6 +6741,8 @@ bool VisualShaderNodeTextureParameter::is_qualifier_supported(Qualifier p_qual)
67036741
return true;
67046742
case Qualifier::QUAL_INSTANCE:
67056743
return false;
6744+
case Qualifier::QUAL_INSTANCE_INDEX:
6745+
return false;
67066746
default:
67076747
break;
67086748
}

0 commit comments

Comments
 (0)