blob: c636409392c7c1ef1be99234a8e8e5c9f6175fce [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 -050024class SkParticleEmitter;
Brian Osman7c979f52019-02-12 13:27:51 -050025
Brian Osman7c979f52019-02-12 13:27:51 -050026class SkParticleEffectParams : public SkRefCnt {
27public:
Brian Osman8b6283f2019-02-14 16:55:21 -050028 int fMaxCount = 128;
29 float fEffectDuration = 1.0f;
30 float fRate = 8.0f;
31 SkCurve fLifetime = 1.0f;
Brian Osman7c979f52019-02-12 13:27:51 -050032
Brian Osman543d2e22019-02-15 14:29:38 -050033 // Drawable (image, sprite sheet, etc.)
34 sk_sp<SkParticleDrawable> fDrawable;
Brian Osman7c979f52019-02-12 13:27:51 -050035
36 // Emitter shape & parameters
37 sk_sp<SkParticleEmitter> fEmitter;
38
Brian Osman5c1f8eb2019-02-14 14:49:55 -050039 // Rules that configure particles at spawn time
40 SkTArray<sk_sp<SkParticleAffector>> fSpawnAffectors;
41
42 // Rules that update existing particles over their lifetime
43 SkTArray<sk_sp<SkParticleAffector>> fUpdateAffectors;
Brian Osman7c979f52019-02-12 13:27:51 -050044
45 void visitFields(SkFieldVisitor* v);
46};
47
48class SkParticleEffect : public SkRefCnt {
49public:
Brian Osman5c1f8eb2019-02-14 14:49:55 -050050 SkParticleEffect(sk_sp<SkParticleEffectParams> params, const SkRandom& random);
Brian Osman7c979f52019-02-12 13:27:51 -050051
Brian Osman5c1f8eb2019-02-14 14:49:55 -050052 void start(const SkAnimTimer& timer, bool looping = false);
53 void update(const SkAnimTimer& timer);
Brian Osman7c979f52019-02-12 13:27:51 -050054 void draw(SkCanvas* canvas);
55
Brian Osman5c1f8eb2019-02-14 14:49:55 -050056 bool isAlive() { return fSpawnTime >= 0; }
57
Brian Osman7c979f52019-02-12 13:27:51 -050058 SkParticleEffectParams* getParams() { return fParams.get(); }
59
60private:
61 void setCapacity(int capacity);
62
Brian Osman7c979f52019-02-12 13:27:51 -050063 sk_sp<SkParticleEffectParams> fParams;
Brian Osman7c979f52019-02-12 13:27:51 -050064
Brian Osman5c1f8eb2019-02-14 14:49:55 -050065 SkRandom fRandom;
66
67 bool fLooping;
68 double fSpawnTime;
69
Brian Osman7c979f52019-02-12 13:27:51 -050070 int fCount;
71 double fLastTime;
72 float fSpawnRemainder;
73
Brian Osman125daa42019-02-20 12:25:20 -050074 SkAutoTMalloc<SkParticleState> fParticles;
75 SkAutoTMalloc<SkRandom> fStableRandoms;
Brian Osman7c979f52019-02-12 13:27:51 -050076
77 // Cached
78 int fCapacity;
79};
80
81#endif // SkParticleEffect_DEFINED