// Copyright 2016 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.

#include "garnet/examples/ui/spinning_square/spinning_square_view.h"

#include <math.h>

#include <algorithm>

namespace examples {
namespace {
constexpr float kBackgroundElevation = 0.f;
constexpr float kSquareElevation = 8.f;

constexpr float kSpeed = 0.25f;
constexpr float kSecondsPerNanosecond = .000'000'001f;
}  // namespace

SpinningSquareView::SpinningSquareView(scenic::ViewContext context)
    : BaseView(std::move(context), "Spinning Square"),
      background_node_(session()),
      square_node_(session()) {
  scenic::Material background_material(session());
  background_material.SetColor(0x67, 0x3a, 0xb7, 0xff);  // Deep Purple 500
  background_node_.SetMaterial(background_material);
  root_node().AddChild(background_node_);

  scenic::Material square_material(session());
  square_material.SetColor(0xf5, 0x00, 0x57, 0xff);  // Pink A400
  square_node_.SetMaterial(square_material);
  root_node().AddChild(square_node_);
}

SpinningSquareView::~SpinningSquareView() {}

void SpinningSquareView::OnSceneInvalidated(
    fuchsia::images::PresentationInfo presentation_info) {
  if (!has_logical_size())
    return;

  uint64_t presentation_time = presentation_info.presentation_time;
  if (!start_time_)
    start_time_ = presentation_time;

  const float center_x = logical_size().x * .5f;
  const float center_y = logical_size().y * .5f;
  const float square_size = std::min(logical_size().x, logical_size().y) * .6f;
  const float t = fmod(
      (presentation_time - start_time_) * kSecondsPerNanosecond * kSpeed, 1.f);
  const float angle = t * M_PI * 2;

  scenic::Rectangle background_shape(session(), logical_size().x,
                                     logical_size().y);
  background_node_.SetShape(background_shape);
  background_node_.SetTranslation(
      (float[]){center_x, center_y, -kBackgroundElevation});

  scenic::Rectangle square_shape(session(), square_size, square_size);
  square_node_.SetShape(square_shape);
  square_node_.SetTranslation((float[]){center_x, center_y, -kSquareElevation});
  square_node_.SetRotation(
      (float[]){0.f, 0.f, sinf(angle * .5f), cosf(angle * .5f)});

  InvalidateScene();
}

}  // namespace examples
