blob: 993ffbbcb64acbcc8097643135d9e3d88118e13b [file] [log] [blame]
Brian Osman7c979f52019-02-12 13:27:51 -05001/*
2* Copyright 2019 Google LLC
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#ifndef SkParticleEffect_DEFINED
9#define SkParticleEffect_DEFINED
10
11#include "SkAutoMalloc.h"
12#include "SkColor.h"
13#include "SkCurve.h"
14#include "SkParticleData.h"
15#include "SkRandom.h"
Brian Osman7c979f52019-02-12 13:27:51 -050016#include "SkRefCnt.h"
Brian Osman7c979f52019-02-12 13:27:51 -050017#include "SkTArray.h"
18
19class SkAnimTimer;
20class SkCanvas;
21class SkFieldVisitor;
Brian Osman7c979f52019-02-12 13:27:51 -050022class SkParticleAffector;
Brian Osman543d2e22019-02-15 14:29:38 -050023class SkParticleDrawable;
Brian Osman7c979f52019-02-12 13:27:51 -050024
Brian Osman7c979f52019-02-12 13:27:51 -050025class SkParticleEffectParams : public SkRefCnt {
26public:
Brian Osman8b6283f2019-02-14 16:55:21 -050027 int fMaxCount = 128;
28 float fEffectDuration = 1.0f;
29 float fRate = 8.0f;
30 SkCurve fLifetime = 1.0f;
Brian Osman7c979f52019-02-12 13:27:51 -050031
Brian Osman543d2e22019-02-15 14:29:38 -050032 // Drawable (image, sprite sheet, etc.)
33 sk_sp<SkParticleDrawable> fDrawable;
Brian Osman7c979f52019-02-12 13:27:51 -050034
Brian Osman5c1f8eb2019-02-14 14:49:55 -050035 // Rules that configure particles at spawn time
36 SkTArray<sk_sp<SkParticleAffector>> fSpawnAffectors;
37
38 // Rules that update existing particles over their lifetime
39 SkTArray<sk_sp<SkParticleAffector>> fUpdateAffectors;
Brian Osman7c979f52019-02-12 13:27:51 -050040
41 void visitFields(SkFieldVisitor* v);
42};
43
44class SkParticleEffect : public SkRefCnt {
45public:
Brian Osman5c1f8eb2019-02-14 14:49:55 -050046 SkParticleEffect(sk_sp<SkParticleEffectParams> params, const SkRandom& random);
Brian Osman7c979f52019-02-12 13:27:51 -050047
Brian Osman5c1f8eb2019-02-14 14:49:55 -050048 void start(const SkAnimTimer& timer, bool looping = false);
49 void update(const SkAnimTimer& timer);
Brian Osman7c979f52019-02-12 13:27:51 -050050 void draw(SkCanvas* canvas);
51
Brian Osman5c1f8eb2019-02-14 14:49:55 -050052 bool isAlive() { return fSpawnTime >= 0; }
53
Brian Osman7c979f52019-02-12 13:27:51 -050054 SkParticleEffectParams* getParams() { return fParams.get(); }
55
56private:
57 void setCapacity(int capacity);
58
Brian Osman7c979f52019-02-12 13:27:51 -050059 sk_sp<SkParticleEffectParams> fParams;
Brian Osman7c979f52019-02-12 13:27:51 -050060
Brian Osman5c1f8eb2019-02-14 14:49:55 -050061 SkRandom fRandom;
62
63 bool fLooping;
64 double fSpawnTime;
65
Brian Osman7c979f52019-02-12 13:27:51 -050066 int fCount;
67 double fLastTime;
68 float fSpawnRemainder;
69
Brian Osman125daa42019-02-20 12:25:20 -050070 SkAutoTMalloc<SkParticleState> fParticles;
71 SkAutoTMalloc<SkRandom> fStableRandoms;
Brian Osman7c979f52019-02-12 13:27:51 -050072
73 // Cached
74 int fCapacity;
75};
76
77#endif // SkParticleEffect_DEFINED