Skip to content

Commit e827011

Browse files
authored
Particle source duration curve + life remaining input (#7231)
* Add curve to control the duration of a particle source * Also add fractional Life Left curve input for sources * Actually register new particle curve output
1 parent 4fbfa84 commit e827011

4 files changed

Lines changed: 22 additions & 6 deletions

File tree

code/particle/ParticleEffect.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,13 +416,17 @@ void ParticleEffect::pageIn() {
416416
}
417417
}
418418

419-
std::pair<TIMESTAMP, TIMESTAMP> ParticleEffect::getEffectDuration() const {
419+
std::pair<TIMESTAMP, TIMESTAMP> ParticleEffect::getEffectDuration(float interp, const ParticleSource& source, size_t effectNumber) const {
420420
std::pair<TIMESTAMP, TIMESTAMP> timing;
421421
timing.first = _timestamp(fl2i(m_delayRange.next() * 1000.0f));
422422
if (m_duration == Duration::ALWAYS)
423423
timing.second = TIMESTAMP::never();
424-
else
425-
timing.second = timestamp_delta(timing.first, fl2i(m_durationRange.next() * 1000.0f));
424+
else {
425+
const auto& [pos, hostOrientation] = source.m_host->getPositionAndOrientation(m_parent_local, interp, m_manual_offset);
426+
auto modularCurvesInput = std::forward_as_tuple(source, effectNumber, pos);
427+
428+
timing.second = timestamp_delta(timing.first, fl2i(m_durationRange.next() * 1000.0f * m_modular_curves.get_output(ParticleCurvesOutput::SOURCE_DURATION_MULT, modularCurvesInput)));
429+
}
426430
return timing;
427431
}
428432

code/particle/ParticleEffect.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class ParticleEffect {
7575
RADIUS_MULT,
7676
LENGTH_MULT,
7777
LIFETIME_MULT,
78+
SOURCE_DURATION_MULT,
7879
VOLUME_VELOCITY_MULT,
7980
INHERIT_VELOCITY_MULT,
8081
POSITION_INHERIT_VELOCITY_MULT,
@@ -236,7 +237,7 @@ class ParticleEffect {
236237

237238
const SCP_string& getName() const { return m_name; }
238239

239-
std::pair<TIMESTAMP, TIMESTAMP> getEffectDuration() const;
240+
std::pair<TIMESTAMP, TIMESTAMP> getEffectDuration(float interp, const ParticleSource& source, size_t effectNumber) const;
240241

241242
float getNextSpawnDelay() const;
242243

@@ -251,6 +252,7 @@ class ParticleEffect {
251252
std::pair {"Radius Mult", ParticleCurvesOutput::RADIUS_MULT},
252253
std::pair {"Length Mult", ParticleCurvesOutput::LENGTH_MULT},
253254
std::pair {"Lifetime Mult", ParticleCurvesOutput::LIFETIME_MULT},
255+
std::pair {"Source Duration Mult", ParticleCurvesOutput::SOURCE_DURATION_MULT},
254256
std::pair {"Velocity Volume Mult", ParticleCurvesOutput::VOLUME_VELOCITY_MULT},
255257
std::pair {"Velocity Inherit Mult", ParticleCurvesOutput::INHERIT_VELOCITY_MULT},
256258
std::pair {"Velocity Position Inherit Mult", ParticleCurvesOutput::POSITION_INHERIT_VELOCITY_MULT},
@@ -299,6 +301,7 @@ class ParticleEffect {
299301
std::pair {"Host Ship Time Until Explosion", modular_curves_submember_input<&ParticleSource::m_host, &EffectHost::getParentObjAndSig, 0, &Objects, &obj_get_instance_maybe<OBJ_SHIP>, &ship::final_death_time, static_cast<int (*)(int)>(&timestamp_until)>{}})
300302
.derive_modular_curves_input_only_subset<size_t>( //Effect Number
301303
std::pair {"Spawntime Left", modular_curves_functional_full_input<&ParticleSource::getEffectRemainingTime>{}},
304+
std::pair {"Life Left", modular_curves_functional_full_input<&ParticleSource::getEffectRemainingLife>{}},
302305
std::pair {"Time Running", modular_curves_functional_full_input<&ParticleSource::getEffectRunningTime>{}})
303306
.derive_modular_curves_input_only_subset<vec3d>( //Sampled spawn position
304307
std::pair {"Pixel Size At Emitter", modular_curves_functional_full_input<&ParticleSource::getEffectPixelSize>{}},

code/particle/ParticleSource.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ void ParticleSource::finishCreation() {
3434

3535
m_host->setupProcessing();
3636

37-
for (const auto& effect : ParticleManager::get()->getEffect(m_effect)) {
38-
const auto& [begin, end] = effect.getEffectDuration();
37+
const auto& effectList = ParticleManager::get()->getEffect(m_effect);
38+
for (size_t i = 0; i < effectList.size(); i++) {
39+
const auto& effect = effectList[i];
40+
const auto& [begin, end] = effect.getEffectDuration(0.0, *this, i);
3941
m_timing.emplace_back(SourceTiming{timestamp_delta(begin, 0), begin, end});
4042
}
4143
}
@@ -111,6 +113,11 @@ float ParticleSource::getEffectRunningTime(const std::tuple<const ParticleSource
111113
return i2fl(timestamp_get_delta(timing.m_startTimestamp, timing.m_nextCreation)) / i2fl(MILLISECONDS_PER_SECOND);
112114
}
113115

116+
float ParticleSource::getEffectRemainingLife(const std::tuple<const ParticleSource&, const size_t&>& source) {
117+
const auto& timing = std::get<0>(source).m_timing[std::get<1>(source)];
118+
return i2fl(timestamp_get_delta(timing.m_nextCreation, timing.m_endTimestamp)) / i2fl(timestamp_get_delta(timing.m_startTimestamp, timing.m_endTimestamp)) ;
119+
}
120+
114121
float ParticleSource::getEffectPixelSize(const std::tuple<const ParticleSource&, const size_t&, const vec3d&>& source) {
115122
return std::get<0>(source).getEffect()[std::get<1>(source)].getApproximatePixelSize(std::get<2>(source));
116123
}

code/particle/ParticleSource.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class ParticleSource {
7575

7676
static float getEffectRunningTime(const std::tuple<const ParticleSource&, const size_t&>& source);
7777

78+
static float getEffectRemainingLife(const std::tuple<const ParticleSource&, const size_t&>& source);
79+
7880
static float getEffectPixelSize(const std::tuple<const ParticleSource&, const size_t&, const vec3d&>& source);
7981

8082
static float getEffectApparentSize(const std::tuple<const ParticleSource&, const size_t&, const vec3d&>& source);

0 commit comments

Comments
 (0)