blob: 4dedd0bd2c81967eeb972633b70c29f6b2bc3466 [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
Brian Osman7c979f52019-02-12 13:27:51 -050019class SkCanvas;
20class SkFieldVisitor;
Brian Osman7c979f52019-02-12 13:27:51 -050021class SkParticleAffector;
Brian Osman543d2e22019-02-15 14:29:38 -050022class SkParticleDrawable;
Brian Osman7c979f52019-02-12 13:27:51 -050023
Brian Osman7c979f52019-02-12 13:27:51 -050024class SkParticleEffectParams : public SkRefCnt {
25public:
Brian Osman8b6283f2019-02-14 16:55:21 -050026 int fMaxCount = 128;
27 float fEffectDuration = 1.0f;
28 float fRate = 8.0f;
29 SkCurve fLifetime = 1.0f;
Brian Osman7c979f52019-02-12 13:27:51 -050030
Brian Osman543d2e22019-02-15 14:29:38 -050031 // Drawable (image, sprite sheet, etc.)
32 sk_sp<SkParticleDrawable> fDrawable;
Brian Osman7c979f52019-02-12 13:27:51 -050033
Brian Osman5c1f8eb2019-02-14 14:49:55 -050034 // Rules that configure particles at spawn time
35 SkTArray<sk_sp<SkParticleAffector>> fSpawnAffectors;
36
37 // Rules that update existing particles over their lifetime
38 SkTArray<sk_sp<SkParticleAffector>> fUpdateAffectors;
Brian Osman7c979f52019-02-12 13:27:51 -050039
40 void visitFields(SkFieldVisitor* v);
41};
42
43class SkParticleEffect : public SkRefCnt {
44public:
Brian Osman5c1f8eb2019-02-14 14:49:55 -050045 SkParticleEffect(sk_sp<SkParticleEffectParams> params, const SkRandom& random);
Brian Osman7c979f52019-02-12 13:27:51 -050046
Kevin Lubick269fe892019-03-06 09:32:55 -050047 void start(double now, bool looping = false);
Kevin Lubick269fe892019-03-06 09:32:55 -050048 void update(double now);
Brian Osman7c979f52019-02-12 13:27:51 -050049 void draw(SkCanvas* canvas);
50
Brian Osmanb77d5022019-03-06 11:08:48 -050051 bool isAlive() const { return fSpawnTime >= 0; }
52 int getCount() const { return fCount; }
Brian Osman7c979f52019-02-12 13:27:51 -050053
54private:
55 void setCapacity(int capacity);
56
Brian Osman7c979f52019-02-12 13:27:51 -050057 sk_sp<SkParticleEffectParams> fParams;
Brian Osman7c979f52019-02-12 13:27:51 -050058
Brian Osman5c1f8eb2019-02-14 14:49:55 -050059 SkRandom fRandom;
60
61 bool fLooping;
62 double fSpawnTime;
63
Brian Osman7c979f52019-02-12 13:27:51 -050064 int fCount;
65 double fLastTime;
66 float fSpawnRemainder;
67
Brian Osman125daa42019-02-20 12:25:20 -050068 SkAutoTMalloc<SkParticleState> fParticles;
69 SkAutoTMalloc<SkRandom> fStableRandoms;
Brian Osman7c979f52019-02-12 13:27:51 -050070
71 // Cached
72 int fCapacity;
73};
74
75#endif // SkParticleEffect_DEFINED