// Copyright 2013 The Flutter 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 "impeller/scene/scene.h"

#include <memory>
#include <utility>

#include "flutter/fml/logging.h"
#include "impeller/renderer/render_target.h"
#include "impeller/scene/scene_context.h"
#include "impeller/scene/scene_encoder.h"

namespace impeller {
namespace scene {

Scene::Scene(std::shared_ptr<Context> context)
    : scene_context_(std::make_unique<SceneContext>(std::move(context))){};

void Scene::Add(const std::shared_ptr<SceneEntity>& child) {
  root_.Add(child);
}

bool Scene::Render(const RenderTarget& render_target,
                   const Camera& camera) const {
  // Collect the render commands from the scene.
  SceneEncoder encoder;
  if (!root_.Render(encoder)) {
    FML_LOG(ERROR) << "Failed to render frame.";
    return false;
  }

  // Encode the commands.

  std::shared_ptr<CommandBuffer> command_buffer =
      encoder.BuildSceneCommandBuffer(*scene_context_, camera, render_target);

  // TODO(bdero): Do post processing.

  if (!command_buffer->SubmitCommands()) {
    FML_LOG(ERROR) << "Failed to submit command buffer.";
    return false;
  }

  return true;
}

}  // namespace scene
}  // namespace impeller
