Fix particles not properly modified by their lifetime
This commit is contained in:
@ -646,6 +646,8 @@ void CPUParticles3D::_particles_process(float p_delta) {
|
||||
restart = true;
|
||||
}
|
||||
|
||||
float tv = 0.0;
|
||||
|
||||
if (restart) {
|
||||
if (!emitting) {
|
||||
p.active = false;
|
||||
@ -660,12 +662,12 @@ void CPUParticles3D::_particles_process(float p_delta) {
|
||||
|
||||
float tex_angle = 0.0;
|
||||
if (curve_parameters[PARAM_ANGLE].is_valid()) {
|
||||
tex_angle = curve_parameters[PARAM_ANGLE]->interpolate(0);
|
||||
tex_angle = curve_parameters[PARAM_ANGLE]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_anim_offset = 0.0;
|
||||
if (curve_parameters[PARAM_ANGLE].is_valid()) {
|
||||
tex_anim_offset = curve_parameters[PARAM_ANGLE]->interpolate(0);
|
||||
tex_anim_offset = curve_parameters[PARAM_ANGLE]->interpolate(tv);
|
||||
}
|
||||
|
||||
p.seed = Math::rand();
|
||||
@ -771,61 +773,63 @@ void CPUParticles3D::_particles_process(float p_delta) {
|
||||
continue;
|
||||
} else if (p.time > p.lifetime) {
|
||||
p.active = false;
|
||||
tv = 1.0;
|
||||
} else {
|
||||
uint32_t alt_seed = p.seed;
|
||||
|
||||
p.time += local_delta;
|
||||
p.custom[1] = p.time / lifetime;
|
||||
tv = p.time / p.lifetime;
|
||||
|
||||
float tex_linear_velocity = 0.0;
|
||||
if (curve_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) {
|
||||
tex_linear_velocity = curve_parameters[PARAM_INITIAL_LINEAR_VELOCITY]->interpolate(p.custom[1]);
|
||||
tex_linear_velocity = curve_parameters[PARAM_INITIAL_LINEAR_VELOCITY]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_orbit_velocity = 0.0;
|
||||
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
|
||||
if (curve_parameters[PARAM_ORBIT_VELOCITY].is_valid()) {
|
||||
tex_orbit_velocity = curve_parameters[PARAM_ORBIT_VELOCITY]->interpolate(p.custom[1]);
|
||||
tex_orbit_velocity = curve_parameters[PARAM_ORBIT_VELOCITY]->interpolate(tv);
|
||||
}
|
||||
}
|
||||
|
||||
float tex_angular_velocity = 0.0;
|
||||
if (curve_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) {
|
||||
tex_angular_velocity = curve_parameters[PARAM_ANGULAR_VELOCITY]->interpolate(p.custom[1]);
|
||||
tex_angular_velocity = curve_parameters[PARAM_ANGULAR_VELOCITY]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_linear_accel = 0.0;
|
||||
if (curve_parameters[PARAM_LINEAR_ACCEL].is_valid()) {
|
||||
tex_linear_accel = curve_parameters[PARAM_LINEAR_ACCEL]->interpolate(p.custom[1]);
|
||||
tex_linear_accel = curve_parameters[PARAM_LINEAR_ACCEL]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_tangential_accel = 0.0;
|
||||
if (curve_parameters[PARAM_TANGENTIAL_ACCEL].is_valid()) {
|
||||
tex_tangential_accel = curve_parameters[PARAM_TANGENTIAL_ACCEL]->interpolate(p.custom[1]);
|
||||
tex_tangential_accel = curve_parameters[PARAM_TANGENTIAL_ACCEL]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_radial_accel = 0.0;
|
||||
if (curve_parameters[PARAM_RADIAL_ACCEL].is_valid()) {
|
||||
tex_radial_accel = curve_parameters[PARAM_RADIAL_ACCEL]->interpolate(p.custom[1]);
|
||||
tex_radial_accel = curve_parameters[PARAM_RADIAL_ACCEL]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_damping = 0.0;
|
||||
if (curve_parameters[PARAM_DAMPING].is_valid()) {
|
||||
tex_damping = curve_parameters[PARAM_DAMPING]->interpolate(p.custom[1]);
|
||||
tex_damping = curve_parameters[PARAM_DAMPING]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_angle = 0.0;
|
||||
if (curve_parameters[PARAM_ANGLE].is_valid()) {
|
||||
tex_angle = curve_parameters[PARAM_ANGLE]->interpolate(p.custom[1]);
|
||||
tex_angle = curve_parameters[PARAM_ANGLE]->interpolate(tv);
|
||||
}
|
||||
float tex_anim_speed = 0.0;
|
||||
if (curve_parameters[PARAM_ANIM_SPEED].is_valid()) {
|
||||
tex_anim_speed = curve_parameters[PARAM_ANIM_SPEED]->interpolate(p.custom[1]);
|
||||
tex_anim_speed = curve_parameters[PARAM_ANIM_SPEED]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_anim_offset = 0.0;
|
||||
if (curve_parameters[PARAM_ANIM_OFFSET].is_valid()) {
|
||||
tex_anim_offset = curve_parameters[PARAM_ANIM_OFFSET]->interpolate(p.custom[1]);
|
||||
tex_anim_offset = curve_parameters[PARAM_ANIM_OFFSET]->interpolate(tv);
|
||||
}
|
||||
|
||||
Vector3 force = gravity;
|
||||
@ -887,12 +891,12 @@ void CPUParticles3D::_particles_process(float p_delta) {
|
||||
|
||||
float tex_scale = 1.0;
|
||||
if (curve_parameters[PARAM_SCALE].is_valid()) {
|
||||
tex_scale = curve_parameters[PARAM_SCALE]->interpolate(p.custom[1]);
|
||||
tex_scale = curve_parameters[PARAM_SCALE]->interpolate(tv);
|
||||
}
|
||||
|
||||
float tex_hue_variation = 0.0;
|
||||
if (curve_parameters[PARAM_HUE_VARIATION].is_valid()) {
|
||||
tex_hue_variation = curve_parameters[PARAM_HUE_VARIATION]->interpolate(p.custom[1]);
|
||||
tex_hue_variation = curve_parameters[PARAM_HUE_VARIATION]->interpolate(tv);
|
||||
}
|
||||
|
||||
float hue_rot_angle = (parameters[PARAM_HUE_VARIATION] + tex_hue_variation) * Math_PI * 2.0 * Math::lerp(1.0f, p.hue_rot_rand * 2.0f - 1.0f, randomness[PARAM_HUE_VARIATION]);
|
||||
@ -911,7 +915,7 @@ void CPUParticles3D::_particles_process(float p_delta) {
|
||||
}
|
||||
|
||||
if (color_ramp.is_valid()) {
|
||||
p.color = color_ramp->get_color_at_offset(p.custom[1]) * color;
|
||||
p.color = color_ramp->get_color_at_offset(tv) * color;
|
||||
} else {
|
||||
p.color = color;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user