// 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(fxbug.dev/23916): Clean up dummy args.
    uint32 unused = 0;
};

/// Characteristics:
/// - has_parent
/// - is_clip
/// - has_parts
struct ClipNodeArgs {
    // TODO(fxbug.dev/23916): 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(fxbug.dev/23916): Clean up dummy args.
    uint32 unused = 0;
};
