blob: 3f41b9e4181de748b22edd3b2d14ee992d011711 [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);
Kevin Lubick269fe892019-03-06 09:32:55 -050049 void start(double now, bool looping = false);
Brian Osman5c1f8eb2019-02-14 14:49:55 -050050 void update(const SkAnimTimer& timer);
Kevin Lubick269fe892019-03-06 09:32:55 -050051 void update(double now);
Brian Osman7c979f52019-02-12 13:27:51 -050052 void draw(SkCanvas* canvas);
53
Brian Osman5c1f8eb2019-02-14 14:49:55 -050054 bool isAlive() { return fSpawnTime >= 0; }
55
Brian Osman7c979f52019-02-12 13:27:51 -050056 SkParticleEffectParams* getParams() { return fParams.get(); }
57
58private:
59 void setCapacity(int capacity);
60
Brian Osman7c979f52019-02-12 13:27:51 -050061 sk_sp<SkParticleEffectParams> fParams;
Brian Osman7c979f52019-02-12 13:27:51 -050062
Brian Osman5c1f8eb2019-02-14 14:49:55 -050063 SkRandom fRandom;
64
65 bool fLooping;
66 double fSpawnTime;
67
Brian Osman7c979f52019-02-12 13:27:51 -050068 int fCount;
69 double fLastTime;
70 float fSpawnRemainder;
71
Brian Osman125daa42019-02-20 12:25:20 -050072 SkAutoTMalloc<SkParticleState> fParticles;
73 SkAutoTMalloc<SkRandom> fStableRandoms;
Brian Osman7c979f52019-02-12 13:27:51 -050074
75 // Cached
76 int fCapacity;
77};
78
79#endif // SkParticleEffect_DEFINED