From f8e0778fc9e402674b091fcf529d0295acd4ddd0 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 5 Apr 2023 20:22:38 +0200 Subject: Particle spawner: Move definitions to source Long functions were moved to the source file to keep the header short to speed up compiling. This has no functional change. --- src/particles.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) (limited to 'src/particles.cpp') diff --git a/src/particles.cpp b/src/particles.cpp index e495ecd03..74ccc2aae 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -19,8 +19,122 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "particles.h" #include + using namespace ParticleParamTypes; +template +void RangedParameter::serialize(std::ostream &os) const +{ + min.serialize(os); + max.serialize(os); + writeF32(os, bias); +} + +template +void RangedParameter::deSerialize(std::istream &is) +{ + min.deSerialize(is); + max.deSerialize(is); + bias = readF32(is); +} + + +template +T RangedParameter::pickWithin() const +{ + typename T::pickFactors values; + auto p = numericAbsolute(bias) + 1; + for (size_t i = 0; i < sizeof(values) / sizeof(values[0]); ++i) { + if (bias < 0) + values[i] = 1.0f - pow(myrand_float(), p); + else + values[i] = pow(myrand_float(), p); + } + return T::pick(values, min, max); +} + + +template +T TweenedParameter::blend(float fac) const +{ + // warp time coordinates in accordance w/ settings + if (fac > beginning) { + // remap for beginning offset + auto len = 1 - beginning; + fac -= beginning; + fac /= len; + + // remap for repetitions + fac *= reps; + if (fac > 1) // poor man's modulo + fac -= (decltype(reps))fac; + + // remap for style + switch (style) { + case TweenStyle::fwd: /* do nothing */ break; + case TweenStyle::rev: fac = 1.0f - fac; break; + case TweenStyle::pulse: + case TweenStyle::flicker: { + if (fac > 0.5f) { + fac = 1.f - (fac*2.f - 1.f); + } else { + fac = fac * 2; + } + if (style == TweenStyle::flicker) { + fac *= myrand_range(0.7f, 1.0f); + } + } + } + if (fac>1.f) + fac = 1.f; + else if (fac<0.f) + fac = 0.f; + } else { + fac = (style == TweenStyle::rev) ? 1.f : 0.f; + } + + return start.interpolate(fac, end); +} + +template +void TweenedParameter::serialize(std::ostream &os) const +{ + writeU8(os, static_cast(style)); + writeU16(os, reps); + writeF32(os, beginning); + start.serialize(os); + end.serialize(os); +} + +template +void TweenedParameter::deSerialize(std::istream &is) +{ + style = static_cast(readU8(is)); + reps = readU16(is); + beginning = readF32(is); + start.deSerialize(is); + end.deSerialize(is); +} + +namespace ParticleParamTypes { + // For function definitions + template struct RangedParameter; + template struct RangedParameter; + + template struct TweenedParameter; + template struct TweenedParameter; + template struct TweenedParameter; + template struct TweenedParameter; + template struct TweenedParameter; +} + +// Linear interpolation +template +static T numericalBlend(float fac, T min, T max) +{ + return min + ((max - min) * fac); +} + #define PARAM_PVFN(n) ParticleParamTypes::n##ParameterValue v2f PARAM_PVFN(pick) (float* f, const v2f a, const v2f b) { return v2f( -- cgit v1.2.3