@@ -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