Merge pull request #90810 from Arnklit/particles_processing_ring_shape_emission_axis_fix

Fix shader crash on zero vector and negative x vector in particles processing
This commit is contained in:
Rémi Verschelde 2024-04-17 20:26:50 +02:00
commit 54ba8d6882
No known key found for this signature in database
GPG Key ID: C3336907360768E1
2 changed files with 4 additions and 4 deletions

View File

@ -881,9 +881,9 @@ void CPUParticles3D::_particles_process(double p_delta) {
case EMISSION_SHAPE_RING: { case EMISSION_SHAPE_RING: {
real_t ring_random_angle = Math::randf() * Math_TAU; real_t ring_random_angle = Math::randf() * Math_TAU;
real_t ring_random_radius = Math::randf() * (emission_ring_radius - emission_ring_inner_radius) + emission_ring_inner_radius; real_t ring_random_radius = Math::randf() * (emission_ring_radius - emission_ring_inner_radius) + emission_ring_inner_radius;
Vector3 axis = emission_ring_axis.normalized(); Vector3 axis = emission_ring_axis == Vector3(0.0, 0.0, 0.0) ? Vector3(0.0, 0.0, 1.0) : emission_ring_axis.normalized();
Vector3 ortho_axis; Vector3 ortho_axis;
if (axis == Vector3(1.0, 0.0, 0.0)) { if (axis.abs() == Vector3(1.0, 0.0, 0.0)) {
ortho_axis = Vector3(0.0, 1.0, 0.0).cross(axis); ortho_axis = Vector3(0.0, 1.0, 0.0).cross(axis);
} else { } else {
ortho_axis = Vector3(1.0, 0.0, 0.0).cross(axis); ortho_axis = Vector3(1.0, 0.0, 0.0).cross(axis);

View File

@ -635,9 +635,9 @@ void ParticleProcessMaterial::_update_shader() {
code += " \n"; code += " \n";
code += " float ring_spawn_angle = rand_from_seed(alt_seed) * 2.0 * pi;\n"; code += " float ring_spawn_angle = rand_from_seed(alt_seed) * 2.0 * pi;\n";
code += " float ring_random_radius = rand_from_seed(alt_seed) * (emission_ring_radius - emission_ring_inner_radius) + emission_ring_inner_radius;\n"; code += " float ring_random_radius = rand_from_seed(alt_seed) * (emission_ring_radius - emission_ring_inner_radius) + emission_ring_inner_radius;\n";
code += " vec3 axis = normalize(emission_ring_axis);\n"; code += " vec3 axis = emission_ring_axis == vec3(0.0) ? vec3(0.0, 0.0, 1.0) : normalize(emission_ring_axis);\n";
code += " vec3 ortho_axis = vec3(0.0);\n"; code += " vec3 ortho_axis = vec3(0.0);\n";
code += " if (axis == vec3(1.0, 0.0, 0.0)) {\n"; code += " if (abs(axis) == vec3(1.0, 0.0, 0.0)) {\n";
code += " ortho_axis = cross(axis, vec3(0.0, 1.0, 0.0));\n"; code += " ortho_axis = cross(axis, vec3(0.0, 1.0, 0.0));\n";
code += " } else {\n"; code += " } else {\n";
code += " ortho_axis = cross(axis, vec3(1.0, 0.0, 0.0));\n"; code += " ortho_axis = cross(axis, vec3(1.0, 0.0, 0.0));\n";