|
@@ -92,6 +92,10 @@ void CPUParticles::set_randomness_ratio(float p_ratio) {
|
|
|
|
|
|
randomness_ratio = p_ratio;
|
|
|
}
|
|
|
+void CPUParticles::set_lifetime_randomness(float p_random) {
|
|
|
+
|
|
|
+ lifetime_randomness = p_random;
|
|
|
+}
|
|
|
void CPUParticles::set_use_local_coordinates(bool p_enable) {
|
|
|
|
|
|
local_coords = p_enable;
|
|
@@ -130,6 +134,10 @@ float CPUParticles::get_randomness_ratio() const {
|
|
|
|
|
|
return randomness_ratio;
|
|
|
}
|
|
|
+float CPUParticles::get_lifetime_randomness() const {
|
|
|
+
|
|
|
+ return lifetime_randomness;
|
|
|
+}
|
|
|
|
|
|
bool CPUParticles::get_use_local_coordinates() const {
|
|
|
|
|
@@ -583,6 +591,10 @@ void CPUParticles::_particles_process(float p_delta) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (p.time * (1.0 - explosiveness_ratio) > p.lifetime) {
|
|
|
+ restart = true;
|
|
|
+ }
|
|
|
+
|
|
|
if (restart) {
|
|
|
|
|
|
if (!emitting) {
|
|
@@ -636,6 +648,7 @@ void CPUParticles::_particles_process(float p_delta) {
|
|
|
p.custom[2] = (parameters[PARAM_ANIM_OFFSET] + tex_anim_offset) * Math::lerp(1.0f, p.anim_offset_rand, randomness[PARAM_ANIM_OFFSET]); //animation offset (0-1)
|
|
|
p.transform = Transform();
|
|
|
p.time = 0;
|
|
|
+ p.lifetime = lifetime * (1.0 - Math::randf() * lifetime_randomness);
|
|
|
p.base_color = Color(1, 1, 1, 1);
|
|
|
|
|
|
switch (emission_shape) {
|
|
@@ -701,6 +714,8 @@ void CPUParticles::_particles_process(float p_delta) {
|
|
|
|
|
|
} else if (!p.active) {
|
|
|
continue;
|
|
|
+ } else if (p.time > p.lifetime) {
|
|
|
+ p.active = false;
|
|
|
} else {
|
|
|
|
|
|
uint32_t alt_seed = p.seed;
|
|
@@ -1221,6 +1236,7 @@ void CPUParticles::convert_from_particles(Node *p_particles) {
|
|
|
set_emission_box_extents(material->get_emission_box_extents());
|
|
|
|
|
|
set_gravity(material->get_gravity());
|
|
|
+ set_lifetime_randomness(material->get_lifetime_randomness());
|
|
|
|
|
|
#define CONVERT_PARAM(m_param) \
|
|
|
set_param(m_param, material->get_param(ParticlesMaterial::m_param)); \
|
|
@@ -1255,6 +1271,7 @@ void CPUParticles::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &CPUParticles::set_pre_process_time);
|
|
|
ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &CPUParticles::set_explosiveness_ratio);
|
|
|
ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &CPUParticles::set_randomness_ratio);
|
|
|
+ ClassDB::bind_method(D_METHOD("set_lifetime_randomness", "random"), &CPUParticles::set_lifetime_randomness);
|
|
|
ClassDB::bind_method(D_METHOD("set_use_local_coordinates", "enable"), &CPUParticles::set_use_local_coordinates);
|
|
|
ClassDB::bind_method(D_METHOD("set_fixed_fps", "fps"), &CPUParticles::set_fixed_fps);
|
|
|
ClassDB::bind_method(D_METHOD("set_fractional_delta", "enable"), &CPUParticles::set_fractional_delta);
|
|
@@ -1267,6 +1284,7 @@ void CPUParticles::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("get_pre_process_time"), &CPUParticles::get_pre_process_time);
|
|
|
ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &CPUParticles::get_explosiveness_ratio);
|
|
|
ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &CPUParticles::get_randomness_ratio);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_lifetime_randomness"), &CPUParticles::get_lifetime_randomness);
|
|
|
ClassDB::bind_method(D_METHOD("get_use_local_coordinates"), &CPUParticles::get_use_local_coordinates);
|
|
|
ClassDB::bind_method(D_METHOD("get_fixed_fps"), &CPUParticles::get_fixed_fps);
|
|
|
ClassDB::bind_method(D_METHOD("get_fractional_delta"), &CPUParticles::get_fractional_delta);
|
|
@@ -1290,6 +1308,7 @@ void CPUParticles::_bind_methods() {
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0,64,0.01"), "set_speed_scale", "get_speed_scale");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::REAL, "randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_randomness_ratio", "get_randomness_ratio");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime_randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_lifetime_randomness", "get_lifetime_randomness");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "fixed_fps", PROPERTY_HINT_RANGE, "0,1000,1"), "set_fixed_fps", "get_fixed_fps");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fract_delta"), "set_fractional_delta", "get_fractional_delta");
|
|
|
ADD_GROUP("Drawing", "");
|
|
@@ -1472,6 +1491,7 @@ CPUParticles::CPUParticles() {
|
|
|
set_pre_process_time(0);
|
|
|
set_explosiveness_ratio(0);
|
|
|
set_randomness_ratio(0);
|
|
|
+ set_lifetime_randomness(0);
|
|
|
set_use_local_coordinates(true);
|
|
|
|
|
|
set_draw_order(DRAW_ORDER_INDEX);
|