Skip to content

Commit f1f3f06

Browse files
committed
Merge pull request godotengine#97871 from AtlaStar/fix-issue-97680
Fix NaN populating ParticleProcessMaterial Transform
2 parents f7c9306 + c1b067f commit f1f3f06

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

scene/resources/particle_process_material.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,13 @@ void ParticleProcessMaterial::_update_shader() {
481481
code += "}\n\n";
482482
}
483483

484+
code += "vec3 normalize_or_else(vec3 _in, const vec3 _else) {\n";
485+
code += " if (_in == vec3(0.0)) {\n";
486+
code += " return _else;\n";
487+
code += " }\n";
488+
code += " return normalize(_in);\n";
489+
code += "}\n\n";
490+
484491
code += "vec4 rotate_hue(vec4 current_color, float hue_rot_angle) {\n";
485492
code += " float hue_rot_c = cos(hue_rot_angle);\n";
486493
code += " float hue_rot_s = sin(hue_rot_angle);\n";
@@ -1096,24 +1103,25 @@ void ParticleProcessMaterial::_update_shader() {
10961103
code += " TRANSFORM[2] = vec4(0.0, 0.0, 1.0, 0.0);\n";
10971104
}
10981105
} else {
1106+
//TODO Fix so 0 scaling on all axes doesn't break during normalization
10991107
// Orient particle Y towards velocity.
11001108
if (particle_flags[PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY]) {
11011109
code += " if (length(final_velocity) > 0.0) {\n";
1102-
code += " TRANSFORM[1].xyz = normalize(final_velocity);\n";
1110+
code += " TRANSFORM[1].xyz = normalize_or_else(final_velocity, vec3(0.0, 1.0, 0.0));\n";
11031111
code += " } else {\n";
1104-
code += " TRANSFORM[1].xyz = normalize(TRANSFORM[1].xyz);\n";
1112+
code += " TRANSFORM[1].xyz = normalize_or_else(TRANSFORM[1].xyz, vec3(0.0, 1.0, 0.0));\n";
11051113
code += " }\n";
1106-
code += " if (TRANSFORM[1].xyz == normalize(TRANSFORM[0].xyz)) {\n";
1107-
code += " TRANSFORM[0].xyz = normalize(cross(normalize(TRANSFORM[1].xyz), normalize(TRANSFORM[2].xyz)));\n";
1108-
code += " TRANSFORM[2].xyz = normalize(cross(normalize(TRANSFORM[0].xyz), normalize(TRANSFORM[1].xyz)));\n";
1114+
code += " if (TRANSFORM[1].xyz == normalize_or_else(TRANSFORM[0].xyz, vec3(1.0, 0.0, 0.0))) {\n";
1115+
code += " TRANSFORM[0].xyz = normalize_or_else(cross(TRANSFORM[1].xyz, TRANSFORM[2].xyz), vec3(1.0, 0.0, 0.0));\n";
1116+
code += " TRANSFORM[2].xyz = normalize_or_else(cross(TRANSFORM[0].xyz, TRANSFORM[1].xyz), vec3(0.0, 0.0, 1.0));\n";
11091117
code += " } else {\n";
1110-
code += " TRANSFORM[2].xyz = normalize(cross(normalize(TRANSFORM[0].xyz), normalize(TRANSFORM[1].xyz)));\n";
1111-
code += " TRANSFORM[0].xyz = normalize(cross(normalize(TRANSFORM[1].xyz), normalize(TRANSFORM[2].xyz)));\n";
1118+
code += " TRANSFORM[2].xyz = normalize_or_else(cross(TRANSFORM[0].xyz, TRANSFORM[1].xyz), vec3(0.0, 0.0, 1.0));\n";
1119+
code += " TRANSFORM[0].xyz = normalize_or_else(cross(TRANSFORM[1].xyz, TRANSFORM[2].xyz), vec3(1.0, 0.0, 0.0));\n";
11121120
code += " }\n";
11131121
} else {
1114-
code += " TRANSFORM[0].xyz = normalize(TRANSFORM[0].xyz);\n";
1115-
code += " TRANSFORM[1].xyz = normalize(TRANSFORM[1].xyz);\n";
1116-
code += " TRANSFORM[2].xyz = normalize(TRANSFORM[2].xyz);\n";
1122+
code += " TRANSFORM[0].xyz = normalize_or_else(TRANSFORM[0].xyz, vec3(1.0, 0.0, 0.0));\n";
1123+
code += " TRANSFORM[1].xyz = normalize_or_else(TRANSFORM[1].xyz, vec3(0.0, 1.0, 0.0));\n";
1124+
code += " TRANSFORM[2].xyz = normalize_or_else(TRANSFORM[2].xyz, vec3(0.0, 0.0, 1.0));\n";
11171125
}
11181126
// Turn particle by rotation in Y.
11191127
if (particle_flags[PARTICLE_FLAG_ROTATE_Y]) {

0 commit comments

Comments
 (0)