Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions flow/scene_update_context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,14 @@ void SceneUpdateContext::CreateFrame(scenic::EntityNode& entity_node,
SkAlpha opacity,
const SkRect& paint_bounds,
std::vector<Layer*> paint_layers) {
// We don't need a shape if the frame is zero size.
if (rrect.isEmpty())
return;

// Frames always clip their children.
SkRect shape_bounds = rrect.getBounds();
SetEntityNodeClipPlanes(entity_node, shape_bounds);

// and possibly for its texture.
// TODO(SCN-137): Need to be able to express the radii as vectors.
scenic::ShapeNode shape_node(session_.get());
scenic::Rectangle shape(session_.get(), rrect.width(), rrect.height());
Expand All @@ -140,7 +140,7 @@ void SceneUpdateContext::CreateFrame(scenic::EntityNode& entity_node,
entity_node.AddChild(shape_node);

// Check whether a solid color will suffice.
if (paint_layers.empty() || shape_bounds.isEmpty()) {
if (paint_layers.empty()) {
SetMaterialColor(material, color, opacity);
} else {
// The final shape's color is material_color * texture_color. The passed in
Expand Down Expand Up @@ -182,6 +182,9 @@ void SceneUpdateContext::UpdateView(int64_t view_id,
view_holder->UpdateScene(session_.get(), top_entity_->embedder_node(), offset,
size, SkScalarRoundToInt(alphaf() * 255),
hit_testable);

// Assume embedded views are 10 "layers" wide.
next_elevation_ += 10 * kScenicZElevationBetweenLayers;
}

void SceneUpdateContext::CreateView(int64_t view_id,
Expand Down Expand Up @@ -286,13 +289,17 @@ SceneUpdateContext::Frame::Frame(SceneUpdateContext& context,
opacity_(opacity),
opacity_node_(context.session_.get()),
paint_bounds_(SkRect::MakeEmpty()) {
entity_node().SetLabel(label);
entity_node().SetTranslation(0.f, 0.f,
context.next_elevation_ - previous_elevation_);
// Increment elevation trackers before calculating any local elevation.
// |UpdateView| can modify context.next_elevation_, which is why it is
// neccesary to track this addtional state.
context.top_elevation_ += kScenicZElevationBetweenLayers;
context.next_elevation_ += kScenicZElevationBetweenLayers;

float local_elevation = context.next_elevation_ - previous_elevation_;
entity_node().SetTranslation(0.f, 0.f, -local_elevation);
entity_node().SetLabel(label);
entity_node().AddChild(opacity_node_);

// Scenic currently lacks an API to enable rendering of alpha channel; alpha
// channels are only rendered if there is a OpacityNode higher in the tree
// with opacity != 1. For now, clamp to a infinitesimally smaller value than
Expand All @@ -301,11 +308,11 @@ SceneUpdateContext::Frame::Frame(SceneUpdateContext& context,
}

SceneUpdateContext::Frame::~Frame() {
context().top_elevation_ = previous_elevation_;

// Add a part which represents the frame's geometry for clipping purposes
context().CreateFrame(entity_node(), rrect_, color_, opacity_, paint_bounds_,
std::move(paint_layers_));

context().top_elevation_ = previous_elevation_;
}

void SceneUpdateContext::Frame::AddPaintLayer(Layer* layer) {
Expand Down