// 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
type ShapeNodeArgs = struct {
    // TODO(fxbug.dev/23916): Clean up dummy args.
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};

/// Characteristics:
/// - has_parent
/// - is_clip
/// - has_parts
type ClipNodeArgs = struct {
    // TODO(fxbug.dev/23916): Clean up dummy args.
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};

/// Characteristics:
/// - has_transform
/// - has_parent
/// - has_children
/// - has_parts
/// - has_opacity
type OpacityNodeArgsHACK = struct {
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};

/// Characteristics:
/// - has_transform
/// - has_children
/// - has_parent
/// - has_parts
/// - has_clip
type EntityNodeArgs = struct {
    // TODO(fxbug.dev/23916): Clean up dummy args.
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};
