|
@@ -33,6 +33,7 @@
|
|
#include "core/core_string_names.h"
|
|
#include "core/core_string_names.h"
|
|
#include "scene/2d/gpu_particles_2d.h"
|
|
#include "scene/2d/gpu_particles_2d.h"
|
|
#include "scene/resources/particle_process_material.h"
|
|
#include "scene/resources/particle_process_material.h"
|
|
|
|
+#include "scene/scene_string_names.h"
|
|
|
|
|
|
void CPUParticles2D::set_emitting(bool p_emitting) {
|
|
void CPUParticles2D::set_emitting(bool p_emitting) {
|
|
if (emitting == p_emitting) {
|
|
if (emitting == p_emitting) {
|
|
@@ -41,6 +42,7 @@ void CPUParticles2D::set_emitting(bool p_emitting) {
|
|
|
|
|
|
emitting = p_emitting;
|
|
emitting = p_emitting;
|
|
if (emitting) {
|
|
if (emitting) {
|
|
|
|
+ active = true;
|
|
set_process_internal(true);
|
|
set_process_internal(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -259,7 +261,6 @@ PackedStringArray CPUParticles2D::get_configuration_warnings() const {
|
|
|
|
|
|
void CPUParticles2D::restart() {
|
|
void CPUParticles2D::restart() {
|
|
time = 0;
|
|
time = 0;
|
|
- inactive_time = 0;
|
|
|
|
frame_remainder = 0;
|
|
frame_remainder = 0;
|
|
cycle = 0;
|
|
cycle = 0;
|
|
emitting = false;
|
|
emitting = false;
|
|
@@ -561,21 +562,15 @@ void CPUParticles2D::_update_internal() {
|
|
}
|
|
}
|
|
|
|
|
|
double delta = get_process_delta_time();
|
|
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);
|
|
_set_do_redraw(true);
|
|
|
|
|
|
@@ -650,6 +645,7 @@ void CPUParticles2D::_particles_process(double p_delta) {
|
|
|
|
|
|
double system_phase = time / lifetime;
|
|
double system_phase = time / lifetime;
|
|
|
|
|
|
|
|
+ bool should_be_active = false;
|
|
for (int i = 0; i < pcount; i++) {
|
|
for (int i = 0; i < pcount; i++) {
|
|
Particle &p = parray[i];
|
|
Particle &p = parray[i];
|
|
|
|
|
|
@@ -994,6 +990,12 @@ void CPUParticles2D::_particles_process(double p_delta) {
|
|
p.transform.columns[1] *= base_scale.y;
|
|
p.transform.columns[1] *= base_scale.y;
|
|
|
|
|
|
p.transform[2] += p.velocity * local_delta;
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1364,6 +1366,8 @@ void CPUParticles2D::_bind_methods() {
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("convert_from_particles", "particles"), &CPUParticles2D::convert_from_particles);
|
|
ClassDB::bind_method(D_METHOD("convert_from_particles", "particles"), &CPUParticles2D::convert_from_particles);
|
|
|
|
|
|
|
|
+ ADD_SIGNAL(MethodInfo("finished"));
|
|
|
|
+
|
|
ADD_GROUP("Emission Shape", "emission_");
|
|
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::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");
|
|
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");
|