blob: 2e402c157e71349fd30151de2e290aa055001c82 [file] [log] [blame]
// Copyright 2017 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_LIB_UI_GFX_RESOURCES_COMPOSITOR_LAYER_H_
#define GARNET_LIB_UI_GFX_RESOURCES_COMPOSITOR_LAYER_H_
#include <set>
#include "garnet/lib/ui/gfx/engine/hit.h"
#include "garnet/lib/ui/gfx/engine/hit_tester.h"
#include "garnet/lib/ui/gfx/resources/resource.h"
#include "lib/escher/geometry/types.h"
#include "lib/escher/scene/viewing_volume.h"
namespace scenic_impl {
namespace gfx {
class Layer;
class LayerStack;
class Renderer;
class Scene;
using LayerPtr = fxl::RefPtr<Layer>;
using RendererPtr = fxl::RefPtr<Renderer>;
// A Layer can appear in a LayerStack, and be displayed by a Compositor.
// TODO(MZ-249): Layers can currently only use a rendered scene as content, but
// should also be able to directly use an Image/ImagePipe.
class Layer : public Resource {
public:
static const ResourceTypeInfo kTypeInfo;
Layer(Session* session, ResourceId id);
~Layer() override;
// | Resource |
void Accept(class ResourceVisitor* visitor) override;
// SetRendererCmd.
bool SetRenderer(RendererPtr renderer);
const RendererPtr& renderer() const { return renderer_; }
// SetSizeCmd.
bool SetSize(const escher::vec2& size);
const escher::vec2& size() const { return size_; }
// SetColorCmd.
bool SetColor(const escher::vec4& color);
const escher::vec4& color() const { return color_; }
// |Resource|, DetachCmd.
bool Detach() override;
// Add the scene rendered by this layer, if any, to |scenes_out|.
void CollectScenes(std::set<Scene*>* scenes_out);
bool IsDrawable() const;
const escher::vec3& translation() const { return translation_; }
uint32_t width() const { return static_cast<uint32_t>(size_.x); }
uint32_t height() const { return static_cast<uint32_t>(size_.y); }
// TODO(MZ-250): support detecting and/or setting layer opacity.
bool opaque() const { return false; }
// Performs a hit test into the scene of renderer, along the provided ray in
// the layer's coordinate system.
//
// The hit collection behavior depends on the hit tester.
std::vector<Hit> HitTest(const escher::ray4& ray,
HitTester* hit_tester) const;
// Returns the current viewing volume of the layer. Used by the compositor
// when initializing the stage, as well as for hit testing.
escher::ViewingVolume GetViewingVolume() const;
private:
friend class LayerStack;
RendererPtr renderer_;
escher::vec3 translation_ = escher::vec3(0, 0, 0);
escher::vec2 size_ = escher::vec2(0, 0);
escher::vec4 color_ = escher::vec4(1, 1, 1, 1);
LayerStack* layer_stack_ = nullptr;
};
} // namespace gfx
} // namespace scenic_impl
#endif // GARNET_LIB_UI_GFX_RESOURCES_COMPOSITOR_LAYER_H_