Skip to content

Commit

Permalink
Add finished signal to CPUParticles
Browse files Browse the repository at this point in the history
  • Loading branch information
HolonProduction committed Jul 12, 2023
1 parent 7030ac5 commit a1c0d20
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 34 deletions.
7 changes: 7 additions & 0 deletions doc/classes/CPUParticles2D.xml
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,13 @@
Particle texture. If [code]null[/code], particles will be squares.
</member>
</members>
<signals>
<signal name="finished">
<description>
Emitted when all active particles have finished processing. When [member one_shot] is disabled, particles will process continuously, so this is never emitted.
</description>
</signal>
</signals>
<constants>
<constant name="DRAW_ORDER_INDEX" value="0" enum="DrawOrder">
Particles are drawn in the order emitted.
Expand Down
7 changes: 7 additions & 0 deletions doc/classes/CPUParticles3D.xml
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,13 @@
Minimum tangent acceleration.
</member>
</members>
<signals>
<signal name="finished">
<description>
Emitted when all active particles have finished processing. When [member one_shot] is disabled, particles will process continuously, so this is never emitted.
</description>
</signal>
</signals>
<constants>
<constant name="DRAW_ORDER_INDEX" value="0" enum="DrawOrder">
Particles are drawn in the order emitted.
Expand Down
34 changes: 19 additions & 15 deletions scene/2d/cpu_particles_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "core/core_string_names.h"
#include "scene/2d/gpu_particles_2d.h"
#include "scene/resources/particle_process_material.h"
#include "scene/scene_string_names.h"

void CPUParticles2D::set_emitting(bool p_emitting) {
if (emitting == p_emitting) {
Expand All @@ -41,6 +42,7 @@ void CPUParticles2D::set_emitting(bool p_emitting) {

emitting = p_emitting;
if (emitting) {
active = true;
set_process_internal(true);
}
}
Expand Down Expand Up @@ -259,7 +261,6 @@ PackedStringArray CPUParticles2D::get_configuration_warnings() const {

void CPUParticles2D::restart() {
time = 0;
inactive_time = 0;
frame_remainder = 0;
cycle = 0;
emitting = false;
Expand Down Expand Up @@ -561,21 +562,15 @@ void CPUParticles2D::_update_internal() {
}

double delta = get_process_delta_time();
if (emitting) {
inactive_time = 0;
} else {
inactive_time += delta;
if (inactive_time > lifetime * 1.2) {
set_process_internal(false);
_set_do_redraw(false);
if (!active && !emitting) {
set_process_internal(false);
_set_do_redraw(false);

//reset variables
time = 0;
inactive_time = 0;
frame_remainder = 0;
cycle = 0;
return;
}
//reset variables
time = 0;
frame_remainder = 0;
cycle = 0;
return;
}
_set_do_redraw(true);

Expand Down Expand Up @@ -650,6 +645,7 @@ void CPUParticles2D::_particles_process(double p_delta) {

double system_phase = time / lifetime;

bool should_be_active = false;
for (int i = 0; i < pcount; i++) {
Particle &p = parray[i];

Expand Down Expand Up @@ -994,6 +990,12 @@ void CPUParticles2D::_particles_process(double p_delta) {
p.transform.columns[1] *= base_scale.y;

p.transform[2] += p.velocity * local_delta;

should_be_active = true;
}
if (!Math::is_equal_approx(time, 0.0) && active && !should_be_active) {
active = false;
emit_signal(SceneStringNames::get_singleton()->finished);
}
}

Expand Down Expand Up @@ -1364,6 +1366,8 @@ void CPUParticles2D::_bind_methods() {

ClassDB::bind_method(D_METHOD("convert_from_particles", "particles"), &CPUParticles2D::convert_from_particles);

ADD_SIGNAL(MethodInfo("finished"));

ADD_GROUP("Emission Shape", "emission_");
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");
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");
Expand Down
2 changes: 1 addition & 1 deletion scene/2d/cpu_particles_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ class CPUParticles2D : public Node2D {

private:
bool emitting = false;
bool active = false;

struct Particle {
Transform2D transform;
Expand All @@ -99,7 +100,6 @@ class CPUParticles2D : public Node2D {
};

double time = 0.0;
double inactive_time = 0.0;
double frame_remainder = 0.0;
int cycle = 0;
bool do_redraw = false;
Expand Down
34 changes: 19 additions & 15 deletions scene/3d/cpu_particles_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "scene/3d/gpu_particles_3d.h"
#include "scene/main/viewport.h"
#include "scene/resources/particle_process_material.h"
#include "scene/scene_string_names.h"

AABB CPUParticles3D::get_aabb() const {
return AABB();
Expand All @@ -46,6 +47,7 @@ void CPUParticles3D::set_emitting(bool p_emitting) {

emitting = p_emitting;
if (emitting) {
active = true;
set_process_internal(true);

// first update before rendering to avoid one frame delay after emitting starts
Expand Down Expand Up @@ -220,7 +222,6 @@ PackedStringArray CPUParticles3D::get_configuration_warnings() const {

void CPUParticles3D::restart() {
time = 0;
inactive_time = 0;
frame_remainder = 0;
cycle = 0;
emitting = false;
Expand Down Expand Up @@ -575,21 +576,15 @@ void CPUParticles3D::_update_internal() {
}

double delta = get_process_delta_time();
if (emitting) {
inactive_time = 0;
} else {
inactive_time += delta;
if (inactive_time > lifetime * 1.2) {
set_process_internal(false);
_set_redraw(false);
if (!active && !emitting) {
set_process_internal(false);
_set_redraw(false);

//reset variables
time = 0;
inactive_time = 0;
frame_remainder = 0;
cycle = 0;
return;
}
//reset variables
time = 0;
frame_remainder = 0;
cycle = 0;
return;
}
_set_redraw(true);

Expand Down Expand Up @@ -670,6 +665,7 @@ void CPUParticles3D::_particles_process(double p_delta) {

double system_phase = time / lifetime;

bool should_be_active = false;
for (int i = 0; i < pcount; i++) {
Particle &p = parray[i];

Expand Down Expand Up @@ -1136,6 +1132,12 @@ void CPUParticles3D::_particles_process(double p_delta) {
}

p.transform.origin += p.velocity * local_delta;

should_be_active = true;
}
if (!Math::is_equal_approx(time, 0.0) && active && !should_be_active) {
active = false;
emit_signal(SceneStringNames::get_singleton()->finished);
}
}

Expand Down Expand Up @@ -1543,6 +1545,8 @@ void CPUParticles3D::_bind_methods() {

ClassDB::bind_method(D_METHOD("convert_from_particles", "particles"), &CPUParticles3D::convert_from_particles);

ADD_SIGNAL(MethodInfo("finished"));

ADD_GROUP("Emission Shape", "emission_");
ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_shape", PROPERTY_HINT_ENUM, "Point,Sphere,Sphere Surface,Box,Points,Directed Points,Ring", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_emission_shape", "get_emission_shape");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "emission_sphere_radius", PROPERTY_HINT_RANGE, "0.01,128,0.01"), "set_emission_sphere_radius", "get_emission_sphere_radius");
Expand Down
2 changes: 1 addition & 1 deletion scene/3d/cpu_particles_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class CPUParticles3D : public GeometryInstance3D {

private:
bool emitting = false;
bool active = false;

struct Particle {
Transform3D transform;
Expand All @@ -101,7 +102,6 @@ class CPUParticles3D : public GeometryInstance3D {
};

double time = 0.0;
double inactive_time = 0.0;
double frame_remainder = 0.0;
int cycle = 0;
bool redraw = false;
Expand Down
1 change: 0 additions & 1 deletion scene/scene_string_names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ SceneStringNames::SceneStringNames() {
sleeping_state_changed = StaticCString::create("sleeping_state_changed");

finished = StaticCString::create("finished");
emission_finished = StaticCString::create("emission_finished");
animation_finished = StaticCString::create("animation_finished");
animation_changed = StaticCString::create("animation_changed");
animation_started = StaticCString::create("animation_started");
Expand Down
1 change: 0 additions & 1 deletion scene/scene_string_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ class SceneStringNames {
StringName sort_children;

StringName finished;
StringName emission_finished;
StringName animation_finished;
StringName animation_changed;
StringName animation_started;
Expand Down

0 comments on commit a1c0d20

Please sign in to comment.