@@ -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+
527535real_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+
547563CPUParticles2D::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
0 commit comments