135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita/*
235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita * Copyright 2018 Google Inc.
335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita *
435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita * Use of this source code is governed by a BSD-style license that can be
535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita * found in the LICENSE file.
635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita */
735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#ifndef SkSGScene_DEFINED
935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#define SkSGScene_DEFINED
1035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
1135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#include "SkRefCnt.h"
1235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#include "SkTypes.h"
1335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
1435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#include <memory>
1535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#include <vector>
1635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
1735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaclass SkCanvas;
1835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
1935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitanamespace sksg {
2035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
2135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaclass RenderNode;
2235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
2335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita/**
2435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita * Base class for animators.
2535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita *
2635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita */
2735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaclass Animator : public SkNoncopyable {
2835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitapublic:
2935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    virtual ~Animator();
3035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
3135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    void tick(float t);
3235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
3335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaprotected:
3435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    Animator();
3535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
3635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    virtual void onTick(float t) = 0;
3735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
3835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaprivate:
3935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    using INHERITED = SkNoncopyable;
4035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita};
4135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
42cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malitausing AnimatorList = std::vector<std::unique_ptr<Animator>>;
43cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita
44cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malitaclass GroupAnimator : public Animator {
45cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malitaprotected:
46cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita    explicit GroupAnimator(AnimatorList&&);
47cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita
48cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita    void onTick(float t) override;
49cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita
50cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malitaprivate:
51cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita    const AnimatorList fAnimators;
52cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita
53cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita    using INHERITED = Animator;
54cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita};
55cca86f386cfd050cd03a25b305fc6fda48a8d6cdFlorin Malita
5635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita/**
5735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita * Holds a scene root and a list of animators.
5835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita *
5935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita * Provides high-level mehods for driving rendering and animations.
6035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita *
6135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita */
6235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaclass Scene final : SkNoncopyable {
6335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitapublic:
6435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    static std::unique_ptr<Scene> Make(sk_sp<RenderNode> root, AnimatorList&& animators);
6535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    ~Scene();
6635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
6735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    void render(SkCanvas*) const;
6835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    void animate(float t);
6935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
7035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    void setShowInval(bool show) { fShowInval = show; }
7135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
7235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malitaprivate:
7335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    Scene(sk_sp<RenderNode> root, AnimatorList&& animators);
7435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
7535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    const sk_sp<RenderNode> fRoot;
7635efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    const AnimatorList      fAnimators;
7735efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
7835efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    bool                    fShowInval = false;
7935efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
8035efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita    using INHERITED = SkNoncopyable;
8135efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita};
8235efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
8335efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita} // namespace sksg
8435efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita
8535efaa8fd7538f636dfd3593f172a961745a5cd8Florin Malita#endif // SkSGScene_DEFINED
86