blob: 75ad5db69b37f578cdb126da165991f292aec1d4 [file] [log] [blame]
// 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.
#ifndef GARNET_EXAMPLES_ESCHER_WATERFALL_SCENES_SCENE_H_
#define GARNET_EXAMPLES_ESCHER_WATERFALL_SCENES_SCENE_H_
#include "garnet/examples/escher/common/demo.h"
#include "lib/escher/escher.h"
#include "lib/escher/paper/paper_renderer2.h"
namespace escher {
class Stopwatch;
}
class Scene {
public:
Scene(Demo* demo);
virtual ~Scene();
// Convenience method for initializing scene. Use this to create meshes,
// materials, and other long-lived objects.
// TODO(ES-155): deprecated, use PaperScene instead.
virtual void Init(escher::Stage* stage) = 0;
// Convenience method for initializing scene. Use this to create meshes,
// materials, and other long-lived objects.
// Default implementation invokes Init(Stage*);
// TODO(ES-155): make this pure virtual when Init(Stage*) dies.
virtual void Init(escher::PaperScene* scene);
// Returns a |Model| for the specified time and frame_count, and gives
// subclasses a chance to update properties on |stage| (mainly brightness).
// The returned Model only needs to be valid for the duration of the
// frame.
// NOTE: this method signature allows the Scene to be used with both the
// Waterfall and Waterfall2 demos, the former by iterating over the returned
// Model, and the latter by pushing objects into |render_queue|. In the
// near-ish future, Waterfall will be deleted, and the |render_queue| argument
// to this method will become non-optional.
// TODO(ES-155): deprecated, use PaperScene instead.
virtual escher::Model* Update(const escher::Stopwatch& stopwatch,
uint64_t frame_count, escher::Stage* stage,
escher::PaperRenderer2* renderer = nullptr) = 0;
// Default implementation delegates to the escher::Stage version.
// TODO(ES-155): make this pure virtual when Init(Stage*) dies.
virtual void Update(const escher::Stopwatch& stopwatch, uint64_t frame_count,
escher::PaperScene* scene,
escher::PaperRenderer2* renderer);
// Optionally returns a |Model| for the specified time, frame_count, and
// screen dimensions. The returned Model only needs to be valid for the
// duration of the frame.
virtual escher::Model* UpdateOverlay(const escher::Stopwatch& stopwatch,
uint64_t frame_count, uint32_t width,
uint32_t height) {
return nullptr;
}
protected:
const escher::VulkanContext& vulkan_context() const {
return demo_->vulkan_context();
}
escher::Escher* escher() { return demo_->escher(); }
private:
Demo* demo_;
FXL_DISALLOW_COPY_AND_ASSIGN(Scene);
};
#endif // GARNET_EXAMPLES_ESCHER_WATERFALL_SCENES_SCENE_H_