Home | History | Annotate | Download | only in include
      1 /*
      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 SkParticleAffector_DEFINED
      9 #define SkParticleAffector_DEFINED
     10 
     11 #include "SkReflected.h"
     12 
     13 #include "SkParticleData.h"
     14 #include "SkPoint.h"
     15 
     16 struct SkColorCurve;
     17 struct SkCurve;
     18 
     19 class SkParticleAffector : public SkReflected {
     20 public:
     21     REFLECTED_ABSTRACT(SkParticleAffector, SkReflected)
     22 
     23     void apply(const SkParticleUpdateParams& params, SkParticleState ps[], int count);
     24     void visitFields(SkFieldVisitor* v) override;
     25 
     26     static void RegisterAffectorTypes();
     27 
     28     // Affectors that can set the linear or angular velocity. Both have a 'force' option to apply
     29     // the resulting value as a force, rather than directly setting the velocity.
     30     static sk_sp<SkParticleAffector> MakeLinearVelocity(const SkCurve& angle,
     31                                                         const SkCurve& strength,
     32                                                         bool force,
     33                                                         SkParticleFrame frame);
     34     static sk_sp<SkParticleAffector> MakeAngularVelocity(const SkCurve& strength,
     35                                                          bool force);
     36 
     37     // Set the orientation of a particle, relative to the world, local, or velocity frame.
     38     static sk_sp<SkParticleAffector> MakeOrientation(const SkCurve& angle,
     39                                                      SkParticleFrame frame);
     40 
     41     static sk_sp<SkParticleAffector> MakePointForce(SkPoint point, SkScalar constant,
     42                                                     SkScalar invSquare);
     43 
     44     static sk_sp<SkParticleAffector> MakeSize(const SkCurve& curve);
     45     static sk_sp<SkParticleAffector> MakeFrame(const SkCurve& curve);
     46     static sk_sp<SkParticleAffector> MakeColor(const SkColorCurve& curve);
     47 
     48 private:
     49     virtual void onApply(const SkParticleUpdateParams& params, SkParticleState ps[], int count) = 0;
     50 
     51     bool fEnabled = true;
     52 };
     53 
     54 #endif // SkParticleAffector_DEFINED
     55