/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkParticleEffect_DEFINED #define SkParticleEffect_DEFINED #include "SkAutoMalloc.h" #include "SkCurve.h" #include "SkRandom.h" #include "SkRefCnt.h" #include "SkTArray.h" class SkCanvas; class SkFieldVisitor; class SkParticleAffector; class SkParticleDrawable; struct SkParticleState; class SkParticleEffectParams : public SkRefCnt { public: int fMaxCount = 128; float fEffectDuration = 1.0f; float fRate = 8.0f; SkCurve fLifetime = 1.0f; // Drawable (image, sprite sheet, etc.) sk_sp<SkParticleDrawable> fDrawable; // Rules that configure particles at spawn time SkTArray<sk_sp<SkParticleAffector>> fSpawnAffectors; // Rules that update existing particles over their lifetime SkTArray<sk_sp<SkParticleAffector>> fUpdateAffectors; void visitFields(SkFieldVisitor* v); }; class SkParticleEffect : public SkRefCnt { public: SkParticleEffect(sk_sp<SkParticleEffectParams> params, const SkRandom& random); void start(double now, bool looping = false); void update(double now); void draw(SkCanvas* canvas); bool isAlive() const { return fSpawnTime >= 0; } int getCount() const { return fCount; } private: void setCapacity(int capacity); sk_sp<SkParticleEffectParams> fParams; SkRandom fRandom; bool fLooping; double fSpawnTime; int fCount; double fLastTime; float fSpawnRemainder; SkAutoTMalloc<SkParticleState> fParticles; SkAutoTMalloc<SkRandom> fStableRandoms; // Cached int fCapacity; }; #endif // SkParticleEffect_DEFINED