blob: c4086d37bdb4e760f909f1ae6b318f7ca4f8a2c4 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkRefCnt.h"
12#include "include/private/SkTArray.h"
13#include "include/utils/SkRandom.h"
14#include "modules/particles/include/SkCurve.h"
15#include "src/core/SkAutoMalloc.h"
Brian Osman7c979f52019-02-12 13:27:51 -050016
Brian Osman7c979f52019-02-12 13:27:51 -050017class SkCanvas;
18class SkFieldVisitor;
Brian Osman7c979f52019-02-12 13:27:51 -050019class SkParticleAffector;
Brian Osman543d2e22019-02-15 14:29:38 -050020class SkParticleDrawable;
Brian Osmand0c1bd42019-03-06 16:56:58 -050021struct SkParticleState;
Brian Osman7c979f52019-02-12 13:27:51 -050022
Brian Osman7c979f52019-02-12 13:27:51 -050023class SkParticleEffectParams : public SkRefCnt {
24public:
Brian Osman8b6283f2019-02-14 16:55:21 -050025 int fMaxCount = 128;
26 float fEffectDuration = 1.0f;
27 float fRate = 8.0f;
28 SkCurve fLifetime = 1.0f;
Brian Osman7c979f52019-02-12 13:27:51 -050029
Brian Osman543d2e22019-02-15 14:29:38 -050030 // Drawable (image, sprite sheet, etc.)
31 sk_sp<SkParticleDrawable> fDrawable;
Brian Osman7c979f52019-02-12 13:27:51 -050032
Brian Osman5c1f8eb2019-02-14 14:49:55 -050033 // Rules that configure particles at spawn time
34 SkTArray<sk_sp<SkParticleAffector>> fSpawnAffectors;
35
36 // Rules that update existing particles over their lifetime
37 SkTArray<sk_sp<SkParticleAffector>> fUpdateAffectors;
Brian Osman7c979f52019-02-12 13:27:51 -050038
39 void visitFields(SkFieldVisitor* v);
40};
41
42class SkParticleEffect : public SkRefCnt {
43public:
Brian Osman5c1f8eb2019-02-14 14:49:55 -050044 SkParticleEffect(sk_sp<SkParticleEffectParams> params, const SkRandom& random);
Brian Osman7c979f52019-02-12 13:27:51 -050045
Kevin Lubick269fe892019-03-06 09:32:55 -050046 void start(double now, bool looping = false);
Kevin Lubick269fe892019-03-06 09:32:55 -050047 void update(double now);
Brian Osman7c979f52019-02-12 13:27:51 -050048 void draw(SkCanvas* canvas);
49
Brian Osmanb77d5022019-03-06 11:08:48 -050050 bool isAlive() const { return fSpawnTime >= 0; }
51 int getCount() const { return fCount; }
Brian Osman7c979f52019-02-12 13:27:51 -050052
53private:
54 void setCapacity(int capacity);
55
Brian Osman7c979f52019-02-12 13:27:51 -050056 sk_sp<SkParticleEffectParams> fParams;
Brian Osman7c979f52019-02-12 13:27:51 -050057
Brian Osman5c1f8eb2019-02-14 14:49:55 -050058 SkRandom fRandom;
59
60 bool fLooping;
61 double fSpawnTime;
62
Brian Osman7c979f52019-02-12 13:27:51 -050063 int fCount;
64 double fLastTime;
65 float fSpawnRemainder;
66
Brian Osman125daa42019-02-20 12:25:20 -050067 SkAutoTMalloc<SkParticleState> fParticles;
68 SkAutoTMalloc<SkRandom> fStableRandoms;
Brian Osman7c979f52019-02-12 13:27:51 -050069
70 // Cached
71 int fCapacity;
72};
73
74#endif // SkParticleEffect_DEFINED