Skip to content

Commit 3d6ad3f

Browse files
committed
Merge pull request godotengine#94929 from StamesJames/emission-shape-ring-for-2d
Add emission shape ring for CPUParticles2D
2 parents c37aa90 + eaf9e7c commit 3d6ad3f

File tree

4 files changed

+64
-3
lines changed

4 files changed

+64
-3
lines changed

doc/classes/CPUParticles2D.xml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@
172172
<member name="emission_rect_extents" type="Vector2" setter="set_emission_rect_extents" getter="get_emission_rect_extents">
173173
The rectangle's extents if [member emission_shape] is set to [constant EMISSION_SHAPE_RECTANGLE].
174174
</member>
175+
<member name="emission_ring_inner_radius" type="float" setter="set_emission_ring_inner_radius" getter="get_emission_ring_inner_radius">
176+
The ring's inner radius if [member emission_shape] is set to [constant EMISSION_SHAPE_RING].
177+
</member>
178+
<member name="emission_ring_radius" type="float" setter="set_emission_ring_radius" getter="get_emission_ring_radius">
179+
The ring's outer radius if [member emission_shape] is set to [constant EMISSION_SHAPE_RING].
180+
</member>
175181
<member name="emission_shape" type="int" setter="set_emission_shape" getter="get_emission_shape" enum="CPUParticles2D.EmissionShape" default="0">
176182
Particles will be emitted inside this region.
177183
</member>
@@ -385,7 +391,10 @@
385391
<constant name="EMISSION_SHAPE_DIRECTED_POINTS" value="5" enum="EmissionShape">
386392
Particles will be emitted at a position chosen randomly among [member emission_points]. Particle velocity and rotation will be set based on [member emission_normals]. Particle color will be modulated by [member emission_colors].
387393
</constant>
388-
<constant name="EMISSION_SHAPE_MAX" value="6" enum="EmissionShape">
394+
<constant name="EMISSION_SHAPE_RING" value="6" enum="EmissionShape">
395+
Particles will be emitted in the area of a ring parameterized by its outer and inner radius.
396+
</constant>
397+
<constant name="EMISSION_SHAPE_MAX" value="7" enum="EmissionShape">
389398
Represents the size of the [enum EmissionShape] enum.
390399
</constant>
391400
</constants>

scene/2d/cpu_particles_2d.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,14 @@ void CPUParticles2D::set_emission_colors(const Vector<Color> &p_colors) {
524524
emission_colors = p_colors;
525525
}
526526

527+
void CPUParticles2D::set_emission_ring_inner_radius(real_t p_inner_radius) {
528+
emission_ring_inner_radius = p_inner_radius;
529+
}
530+
531+
void CPUParticles2D::set_emission_ring_radius(real_t p_ring_radius) {
532+
emission_ring_radius = p_ring_radius;
533+
}
534+
527535
real_t CPUParticles2D::get_emission_sphere_radius() const {
528536
return emission_sphere_radius;
529537
}
@@ -544,6 +552,14 @@ Vector<Color> CPUParticles2D::get_emission_colors() const {
544552
return emission_colors;
545553
}
546554

555+
real_t CPUParticles2D::get_emission_ring_inner_radius() const {
556+
return emission_ring_inner_radius;
557+
}
558+
559+
real_t CPUParticles2D::get_emission_ring_radius() const {
560+
return emission_ring_radius;
561+
}
562+
547563
CPUParticles2D::EmissionShape CPUParticles2D::get_emission_shape() const {
548564
return emission_shape;
549565
}
@@ -647,6 +663,13 @@ void CPUParticles2D::_validate_property(PropertyInfo &p_property) const {
647663
p_property.usage = PROPERTY_USAGE_NONE;
648664
}
649665

666+
if (p_property.name == "emission_ring_inner_radius" && emission_shape != EMISSION_SHAPE_RING) {
667+
p_property.usage = PROPERTY_USAGE_NONE;
668+
}
669+
if (p_property.name == "emission_ring_radius" && emission_shape != EMISSION_SHAPE_RING) {
670+
p_property.usage = PROPERTY_USAGE_NONE;
671+
}
672+
650673
if (p_property.name == "seed" && !use_fixed_seed) {
651674
p_property.usage = PROPERTY_USAGE_NONE;
652675
}
@@ -926,6 +949,13 @@ void CPUParticles2D::_particles_process(double p_delta) {
926949
p.base_color = emission_colors.get(random_idx);
927950
}
928951
} break;
952+
case EMISSION_SHAPE_RING: {
953+
real_t t = Math::TAU * Math::randf();
954+
real_t outer_sq = emission_ring_radius * emission_ring_radius;
955+
real_t inner_sq = emission_ring_inner_radius * emission_ring_inner_radius;
956+
real_t radius = Math::sqrt(Math::randf() * (outer_sq - inner_sq) + inner_sq);
957+
p.transform[2] = Vector2(Math::cos(t), Math::sin(t)) * radius;
958+
} break;
929959
case EMISSION_SHAPE_MAX: { // Max value for validity check.
930960
break;
931961
}
@@ -1379,6 +1409,9 @@ void CPUParticles2D::convert_from_particles(Node *p_particles) {
13791409
Vector2 rect_extents = Vector2(proc_mat->get_emission_box_extents().x, proc_mat->get_emission_box_extents().y);
13801410
set_emission_rect_extents(rect_extents);
13811411

1412+
set_emission_ring_radius(proc_mat->get_emission_ring_radius());
1413+
set_emission_ring_inner_radius(proc_mat->get_emission_ring_inner_radius());
1414+
13821415
Ref<CurveXYZTexture> scale3D = proc_mat->get_param_texture(ParticleProcessMaterial::PARAM_SCALE);
13831416
if (scale3D.is_valid()) {
13841417
split_scale = true;
@@ -1527,6 +1560,12 @@ void CPUParticles2D::_bind_methods() {
15271560
ClassDB::bind_method(D_METHOD("set_emission_colors", "array"), &CPUParticles2D::set_emission_colors);
15281561
ClassDB::bind_method(D_METHOD("get_emission_colors"), &CPUParticles2D::get_emission_colors);
15291562

1563+
ClassDB::bind_method(D_METHOD("set_emission_ring_inner_radius", "inner_radius"), &CPUParticles2D::set_emission_ring_inner_radius);
1564+
ClassDB::bind_method(D_METHOD("get_emission_ring_inner_radius"), &CPUParticles2D::get_emission_ring_inner_radius);
1565+
1566+
ClassDB::bind_method(D_METHOD("set_emission_ring_radius", "radius"), &CPUParticles2D::set_emission_ring_radius);
1567+
ClassDB::bind_method(D_METHOD("get_emission_ring_radius"), &CPUParticles2D::get_emission_ring_radius);
1568+
15301569
ClassDB::bind_method(D_METHOD("get_gravity"), &CPUParticles2D::get_gravity);
15311570
ClassDB::bind_method(D_METHOD("set_gravity", "accel_vec"), &CPUParticles2D::set_gravity);
15321571

@@ -1544,12 +1583,14 @@ void CPUParticles2D::_bind_methods() {
15441583
ADD_SIGNAL(MethodInfo("finished"));
15451584

15461585
ADD_GROUP("Emission Shape", "emission_");
1547-
ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_shape", PROPERTY_HINT_ENUM, "Point,Sphere,Sphere Surface,Rectangle,Points,Directed Points", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_emission_shape", "get_emission_shape");
1586+
ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_shape", PROPERTY_HINT_ENUM, "Point,Sphere,Sphere Surface,Rectangle,Points,Directed Points,Ring", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_emission_shape", "get_emission_shape");
15481587
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "emission_sphere_radius", PROPERTY_HINT_RANGE, "0.01,128,0.01,suffix:px"), "set_emission_sphere_radius", "get_emission_sphere_radius");
15491588
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "emission_rect_extents", PROPERTY_HINT_NONE, "suffix:px"), "set_emission_rect_extents", "get_emission_rect_extents");
15501589
ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "emission_points"), "set_emission_points", "get_emission_points");
15511590
ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "emission_normals"), "set_emission_normals", "get_emission_normals");
15521591
ADD_PROPERTY(PropertyInfo(Variant::PACKED_COLOR_ARRAY, "emission_colors"), "set_emission_colors", "get_emission_colors");
1592+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "emission_ring_inner_radius"), "set_emission_ring_inner_radius", "get_emission_ring_inner_radius");
1593+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "emission_ring_radius"), "set_emission_ring_radius", "get_emission_ring_radius");
15531594
ADD_GROUP("Particle Flags", "particle_flag_");
15541595
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "particle_flag_align_y"), "set_particle_flag", "get_particle_flag", PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY);
15551596
ADD_GROUP("Direction", "");
@@ -1638,6 +1679,7 @@ void CPUParticles2D::_bind_methods() {
16381679
BIND_ENUM_CONSTANT(EMISSION_SHAPE_RECTANGLE);
16391680
BIND_ENUM_CONSTANT(EMISSION_SHAPE_POINTS);
16401681
BIND_ENUM_CONSTANT(EMISSION_SHAPE_DIRECTED_POINTS);
1682+
BIND_ENUM_CONSTANT(EMISSION_SHAPE_RING);
16411683
BIND_ENUM_CONSTANT(EMISSION_SHAPE_MAX);
16421684
}
16431685

scene/2d/cpu_particles_2d.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ class CPUParticles2D : public Node2D {
7575
EMISSION_SHAPE_RECTANGLE,
7676
EMISSION_SHAPE_POINTS,
7777
EMISSION_SHAPE_DIRECTED_POINTS,
78-
EMISSION_SHAPE_MAX
78+
EMISSION_SHAPE_RING,
79+
EMISSION_SHAPE_MAX,
7980
};
8081

8182
private:
@@ -178,6 +179,8 @@ class CPUParticles2D : public Node2D {
178179
Vector<Vector2> emission_normals;
179180
Vector<Color> emission_colors;
180181
int emission_point_count = 0;
182+
real_t emission_ring_inner_radius = 0.8;
183+
real_t emission_ring_radius = 1.0;
181184

182185
Ref<Curve> scale_curve_x;
183186
Ref<Curve> scale_curve_y;
@@ -307,6 +310,8 @@ class CPUParticles2D : public Node2D {
307310
void set_emission_points(const Vector<Vector2> &p_points);
308311
void set_emission_normals(const Vector<Vector2> &p_normals);
309312
void set_emission_colors(const Vector<Color> &p_colors);
313+
void set_emission_ring_inner_radius(real_t p_inner_radius);
314+
void set_emission_ring_radius(real_t p_ring_radius);
310315
void set_scale_curve_x(Ref<Curve> p_scale_curve);
311316
void set_scale_curve_y(Ref<Curve> p_scale_curve);
312317
void set_split_scale(bool p_split_scale);
@@ -317,6 +322,8 @@ class CPUParticles2D : public Node2D {
317322
Vector<Vector2> get_emission_points() const;
318323
Vector<Vector2> get_emission_normals() const;
319324
Vector<Color> get_emission_colors() const;
325+
real_t get_emission_ring_inner_radius() const;
326+
real_t get_emission_ring_radius() const;
320327
Ref<Curve> get_scale_curve_x() const;
321328
Ref<Curve> get_scale_curve_y() const;
322329
bool get_split_scale();

scene/2d/gpu_particles_2d.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,9 @@ void GPUParticles2D::convert_from_particles(Node *p_particles) {
557557
proc_mat->set_emission_shape(ParticleProcessMaterial::EmissionShape(cpu_particles->get_emission_shape()));
558558
proc_mat->set_emission_sphere_radius(cpu_particles->get_emission_sphere_radius());
559559

560+
proc_mat->set_emission_ring_radius(cpu_particles->get_emission_ring_radius());
561+
proc_mat->set_emission_ring_inner_radius(cpu_particles->get_emission_ring_inner_radius());
562+
560563
Vector2 rect_extents = cpu_particles->get_emission_rect_extents();
561564
proc_mat->set_emission_box_extents(Vector3(rect_extents.x, rect_extents.y, 0));
562565

0 commit comments

Comments
 (0)