// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GARNET_EXAMPLES_ESCHER_WATERFALL_SCENES_PAPER_DEMO_SCENE1_H_
#define GARNET_EXAMPLES_ESCHER_WATERFALL_SCENES_PAPER_DEMO_SCENE1_H_

#include "lib/escher/escher.h"
#include "lib/escher/paper/paper_shape_cache.h"
#include "lib/escher/shape/rounded_rect_factory.h"

#include "garnet/examples/escher/waterfall/scenes/scene.h"

// Demo scene specifically designed to exercise the new PaperRenderer components
// (e.g. PaperShapeCache and PaperRenderQueue).
class PaperDemoScene1 : public Scene {
 public:
  explicit PaperDemoScene1(Demo* demo);
  ~PaperDemoScene1();

  // Illegal, use the PaperScene version instead.
  void Init(escher::Stage* stage) override;

  // Illegal, use the PaperScene version instead.
  escher::Model* Update(const escher::Stopwatch& stopwatch,
                        uint64_t frame_count, escher::Stage* stage,
                        escher::PaperRenderer2* renderer) override;

  void Init(escher::PaperScene* scene) override;
  void Update(const escher::Stopwatch& stopwatch, uint64_t frame_count,
              escher::PaperScene* scene,
              escher::PaperRenderer2* renderer) override;

 private:
  struct AnimatedState {
    float cycle_duration;
    size_t cycle_count_before_pause;
    float inter_cycle_pause_duration;

    // Return an animation parameter between 0 and 1;
    float Update(float current_time_sec);

    // Private.
    float state_start_time = 0.f;  // seconds;
    bool paused = false;
  };

  struct RectState {
    AnimatedState animation;
    escher::MaterialPtr material;

    // Start and end animation positions.
    escher::vec3 pos1, pos2;

    // Start and end rounded-rect shape specs.
    escher::RoundedRectSpec spec1, spec2;
  };

  struct ClipPlaneState {
    AnimatedState animation;

    // Start and end position of a point on an oriented clip plane.
    escher::vec2 pos1, pos2;

    // Start and end direction of the normal for an oriented clip plane.
    float radians1, radians2;

    // Compute an animation parameter and return the corresponding clip plane.
    escher::plane3 Update(float current_time_sec);
  };

  std::vector<RectState> rectangles_;
  std::vector<ClipPlaneState> world_space_clip_planes_;
  std::vector<ClipPlaneState> object_space_clip_planes_;

  escher::MaterialPtr red_;
  escher::MaterialPtr bg_;
  escher::MaterialPtr color1_;
  escher::MaterialPtr color2_;

  FXL_DISALLOW_COPY_AND_ASSIGN(PaperDemoScene1);
};

#endif  // GARNET_EXAMPLES_ESCHER_WATERFALL_SCENES_PAPER_DEMO_SCENE1_H_
