// 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
@available(deprecated=13, removed=17)
type ShapeNodeArgs = struct {
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};

/// Characteristics:
/// - has_parent
/// - is_clip
/// - has_parts
@available(deprecated=13, removed=17)
type ClipNodeArgs = struct {
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};

/// Characteristics:
/// - has_transform
/// - has_parent
/// - has_children
/// - has_parts
/// - has_opacity
@available(deprecated=13, removed=17)
type OpacityNodeArgsHACK = struct {
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};

/// Characteristics:
/// - has_transform
/// - has_children
/// - has_parent
/// - has_parts
/// - has_clip
@available(deprecated=13, removed=17)
type EntityNodeArgs = struct {
    @allow_deprecated_struct_defaults
    unused uint32 = 0;
};
