Skip to content

Commit 0a7fac4

Browse files
authored
Add particle curve input for number of existing particles (#6889)
* Add code to process global starts for modular curves * Add particle curve input for number of existing particles
1 parent 4c7e4fe commit 0a7fac4

File tree

4 files changed

+51
-1
lines changed

4 files changed

+51
-1
lines changed

code/particle/ParticleEffect.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#pragma once
44

55
#include "globalincs/pstypes.h"
6+
#include "globalincs/systemvars.h"
67
#include "particle/ParticleVolume.h"
78
#include "particle/ParticleSource.h"
89
#include "utils/RandomRange.h"
@@ -228,6 +229,11 @@ class ParticleEffect {
228229
std::pair {"Effects Running", modular_curves_math_input<
229230
modular_curves_submember_input<&ParticleSource::m_effect_is_running, &decltype(ParticleSource::m_effect_is_running)::count>,
230231
modular_curves_submember_input<&ParticleSource::getEffect, &SCP_vector<ParticleEffect>::size>,
232+
ModularCurvesMathOperators::division>{}},
233+
std::pair {"Total Particle Count", modular_curves_global_submember_input<get_particle_count>{}},
234+
std::pair {"Particle Usage Score", modular_curves_math_input<
235+
modular_curves_global_submember_input<get_particle_count>,
236+
modular_curves_global_submember_input<Detail, &detail_levels::num_particles>,
231237
ModularCurvesMathOperators::division>{}})
232238
.derive_modular_curves_input_only_subset<size_t>( //Effect Number
233239
std::pair {"Spawntime Left", modular_curves_functional_full_input<&ParticleSource::getEffectRemainingTime>{}},

code/particle/particle.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ namespace particle
113113
Particles.clear();
114114
}
115115

116+
size_t get_particle_count() {
117+
return Particles.size() + Persistent_particles.size();
118+
}
119+
116120
void page_in()
117121
{
118122
if (!Particles_enabled)

code/particle/particle.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ namespace particle
4040
// kill all active particles
4141
void kill_all();
4242

43+
size_t get_particle_count();
44+
4345

4446
//============================================================================
4547
//=============== LOW-LEVEL SINGLE PARTICLE CREATION CODE ====================

code/utils/modular_curves.h

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,44 @@ struct modular_curves_submember_input_full : public modular_curves_submember_inp
178178
}
179179
};
180180

181+
template<const auto& global, auto... grabbers>
182+
struct modular_curves_global_submember_input {
183+
protected:
184+
template<typename result_type>
185+
static inline float number_to_float(const result_type& number) {
186+
// if constexpr(std::is_same_v<std::decay_t<result_type>, fix>) // TODO: Make sure we can differentiate fixes from ints.
187+
// return f2fl(number);
188+
// else
189+
if constexpr(std::is_integral_v<std::decay_t<result_type>>)
190+
return static_cast<float>(number);
191+
else if constexpr(std::is_floating_point_v<std::decay_t<result_type>>)
192+
return static_cast<float>(number);
193+
else {
194+
static_assert(!std::is_same_v<result_type, result_type>, "Tried to return non-numeric value");
195+
return 0.f;
196+
}
197+
}
198+
199+
public:
200+
template<int /*tuple_idx*/, typename input_type>
201+
static inline float grab(const input_type& /*input*/) {
202+
if constexpr (sizeof...(grabbers) == 0) {
203+
if constexpr (std::is_invocable_v<std::decay_t<decltype(global)>>) {
204+
return number_to_float(global());
205+
} else {
206+
return number_to_float(global);
207+
}
208+
}
209+
else {
210+
if constexpr (std::is_invocable_v<std::decay_t<decltype(global)>>) {
211+
return modular_curves_submember_input<grabbers...>::template grab<-1, decltype(global())>(global());
212+
} else {
213+
return modular_curves_submember_input<grabbers...>::template grab<-1, std::decay_t<decltype(global)>>(global);
214+
}
215+
}
216+
}
217+
};
218+
181219
template<auto grabber_fnc>
182220
struct modular_curves_functional_input {
183221
private:
@@ -227,7 +265,7 @@ enum class ModularCurvesMathOperators {
227265
addition,
228266
subtraction,
229267
multiplication,
230-
division,
268+
division
231269
};
232270

233271
template <typename first, typename second, auto operation>

0 commit comments

Comments
 (0)