summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKasper Arnklit Frandsen <kasper.arnklit@gmail.com>2024-04-26 21:00:23 +0100
committerKasper Frandsen <kasper.arnklit@gmail.com>2024-04-30 17:24:58 +0100
commitaf22d504dada4ceb7da6fd965e0b1a7d304b4fa9 (patch)
treee7f109a37e6cbbea44a0232f4436568156627f7d
parentd282e4f0e6b6ebcf3bd6e05cd62f2a8fe1f9a238 (diff)
downloadredot-engine-af22d504dada4ceb7da6fd965e0b1a7d304b4fa9.tar.gz
Fix particle cylinder emission shape random distribution
-rw-r--r--scene/3d/cpu_particles_3d.cpp2
-rw-r--r--scene/resources/particle_process_material.cpp2
2 files changed, 2 insertions, 2 deletions
diff --git a/scene/3d/cpu_particles_3d.cpp b/scene/3d/cpu_particles_3d.cpp
index 0dc9834539..db7b80683c 100644
--- a/scene/3d/cpu_particles_3d.cpp
+++ b/scene/3d/cpu_particles_3d.cpp
@@ -880,7 +880,7 @@ void CPUParticles3D::_particles_process(double p_delta) {
} break;
case EMISSION_SHAPE_RING: {
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::sqrt(Math::randf() * (emission_ring_radius - emission_ring_inner_radius * emission_ring_inner_radius) + emission_ring_inner_radius * emission_ring_inner_radius);
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;
if (axis.abs() == Vector3(1.0, 0.0, 0.0)) {
diff --git a/scene/resources/particle_process_material.cpp b/scene/resources/particle_process_material.cpp
index 685625ab72..53da142b28 100644
--- a/scene/resources/particle_process_material.cpp
+++ b/scene/resources/particle_process_material.cpp
@@ -634,7 +634,7 @@ void ParticleProcessMaterial::_update_shader() {
if (emission_shape == EMISSION_SHAPE_RING) {
code += " \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 = sqrt(rand_from_seed(alt_seed) * (emission_ring_radius - emission_ring_inner_radius * emission_ring_inner_radius) + emission_ring_inner_radius * emission_ring_inner_radius);\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 += " if (abs(axis) == vec3(1.0, 0.0, 0.0)) {\n";