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

struct vec2 {
    float32 x;
    float32 y;
};

struct vec3 {
    float32 x;
    float32 y;
    float32 z;
};

struct vec4 {
    float32 x;
    float32 y;
    float32 z;
    float32 w;
};

struct mat4 {
    // Column major order.
    array<float32>:16 matrix;
};

// TODO(MZ-238): use float32s instead of uint8.
struct ColorRgba {
    uint8 red;
    uint8 green;
    uint8 blue;
    uint8 alpha;
};

struct ColorRgb {
    float32 red;
    float32 green;
    float32 blue;
};

struct Quaternion {
    float32 x;
    float32 y;
    float32 z;
    float32 w;
};

// Oriented plane described by a normal vector and a distance
// from the origin along that vector.
struct Plane3 {
    vec3 dir;
    float32 dist;
};

struct FactoredTransform {
    vec3 translation;
    vec3 scale;
    // Point around which rotation and scaling occur.
    vec3 anchor;
    Quaternion rotation;
};

union Value {
    float32 vector1;
    vec2 vector2;
    vec3 vector3;
    vec4 vector4;
    mat4 matrix4x4;
    ColorRgba color_rgba;
    ColorRgb color_rgb;
    // Degrees of counter-clockwise rotation in the XY plane.
    float32 degrees;
    Quaternion quaternion;
    FactoredTransform transform;
    // ID of a value-producing resource (an animation or an expression).
    // The type of this value matches the type produced by the named resource.
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a float32, and |value| is ignored.
struct FloatValue {
    float32 value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a vec2, and |value| is ignored.
struct Vector2Value {
    vec2 value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a vec3, and |value| is ignored.
struct Vector3Value {
    vec3 value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a vec4, and |value| is ignored.
struct Vector4Value {
    vec4 value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a vec4, and |value| is ignored.
struct Matrix4Value {
    mat4 value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a ColorRgb, and |value| is ignored.
struct ColorRgbValue {
    ColorRgb value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a ColorRgba, and |value| is ignored.
struct ColorRgbaValue {
    ColorRgba value;
    uint32 variable_id;
};

// A value that is specified explicitly by |value| if |variable_id| is zero,
// or is the value produced by the resource identified by |variable_id|, e.g.
// an animation or expression.  In the latter case, the value produced by the
// resource must be a Quaternion, and |value| is ignored.
struct QuaternionValue {
    Quaternion value;
    uint32 variable_id;
};

enum ValueType {
    kNone = 0;
    kVector1 = 1;
    kVector2 = 2;
    kVector3 = 3;
    kVector4 = 4;
    kMatrix4 = 5;
    kColorRgb = 6;
    kColorRgba = 7;
    kQuaternion = 8;
    kFactoredTransform = 9;
};

// Describes how nodes interact with hit testings.
enum HitTestBehavior {
    // Apply hit testing to the node's content, its parts, and its children.
    kDefault = 0;

    // Suppress hit testing of the node and everything it contains.
    kSuppress = 1;
};

// Rendering target metrics associated with a node.
// See also |MetricsEvent|.
struct Metrics {
    // The ratio between the size of one logical pixel within the node's local
    // coordinate system and the size of one physical pixel of the rendering
    // target.
    //
    // This scale factors change in relation to the resolution of the rendering
    // target and the scale transformations applied by containing nodes.
    // They are always strictly positive and non-zero.
    //
    // For example, suppose the rendering target is a high resolution display
    // with a device pixel ratio of 2.0 meaning that each logical pixel
    // within the model corresponds to two physical pixels of the display.
    // Assuming no scale transformations affect the node, then its metrics event
    // will report a scale factor of 2.0.
    //
    // Building on this example, if instead the node's parent applies a
    // scale transformation of 0.25 to the node, then the node's metrics event
    // will report a scale factor of 0.5 indicating that the node should render
    // its content at a reduced resolution and level of detail since a smaller
    // area of physical pixels (half the size in each dimension) will be rendered.
    float32 scale_x;
    float32 scale_y;
    float32 scale_z;
};

// Represents an axis-aligned bounding box.  If any of the dimensions has a
// negative extent (e.g. max.x < min.x) then the bounding box is treated as
// empty.
struct BoundingBox {
    vec3 min;
    vec3 max;
};

// Represents the properties for a View.
struct ViewProperties {
    // The View's bounding box extents can be defined as:
    //    { bounding_box.min - inset_from_min, bounding_box.max + inset_from_max }
    // Content contained within the View is clipped to this bounding box.
    //
    // TODO(SCN-819): should we just have a vec3 extent instead of a bounding box
    // with a potentially non-zero min?
    BoundingBox bounding_box;

    // |insets_from_min| and |insets_from_max| specify the distances between the
    // view's bounding box and that of its parent.
    vec3 inset_from_min;
    vec3 inset_from_max;

    // Whether the View can receive a focus event; default is true.  When
    // false, and this View is eligible to receive a focus event, no
    // focus/unfocus event is actually sent to any View.
    bool focus_change = true;

    // Whether the View allows geometrically underlying Views to receive input;
    // default is true. When false, Scenic does not send input events to
    // underlying Views.
    bool downward_input = true;
};

// Represents the state of a View in Scenic.
struct ViewState {
    // Whether the View is rendering. Default is false. Delivered to the View's
    // corresponding ViewHolder after the View's first frame render request.
    bool is_rendering;
};
