// 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 Scenic `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 OpacityNodeArgsHACK {
    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;
};
