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

library fuchsia.ui.gfx;

// These are the types of nodes that can be created within a Mozart |Session|.
//
// All nodes have an associated transform, which distinguishes them from mere
// resources.  Nodes may also have one or more node Characteristics:
//
// These are characteristics that each type of |Node| either has or doesn't.
// These constrain operations that reference nodes; violations will cause the
// |Session| connection to be closed.  For example, |NodeAddChildOp| must target
// a node with the "has_children" characteristic.  These characteristics are not
// explicitly reflected in the Session API; instead, they must be enforced by
// implementations of the API.
// - has_children: The node can contain other nodes as children.
// - has_parent: The node can be a child of another node.  If this is false,
//   the node can only be a direct descendant of its containing scene.
// - has_parts:  The node can contain other nodes as parts.  All parts must be
//   from the same session as their parent.
// - has_clip:  The node can contain a clip node as a child.
// - is_clip:  The node can clip other nodes.
// - has_shape: The node can contain ShapeNodes as children.
// - has_material:  The node can have a Material resource applied to it.

// Characteristics:
// - has_parent
// - has_shape
// - has_material
struct ShapeNodeArgs {
  // TODO(SCN-694): Clean up dummy args.
  uint32 unused = 0;
};

// Characteristics:
// - has_parent
// - is_clip
// - has_parts
struct ClipNodeArgs {
  // TODO(SCN-694): Clean up dummy args.
  uint32 unused = 0;
};

// Characteristics:
// - has_transform
// - has_parent
// - has_children
// - has_parts
// - has_opacity
struct OpacityNodeArgs {
    uint32 unused = 0;
};

// Characteristics:
// - has_transform
// - has_children
// - has_parent
// - has_parts
// - has_clip
struct EntityNodeArgs {
  // TODO(SCN-694): Clean up dummy args.
  uint32 unused = 0;
};
