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

/// Describes where a hit occurred within the content of a node tagged
/// by this session.
///
/// To compute the point of intersection within the node's local coordinate
/// system, perform the following calculation using the ray which was
/// originally passed to `Session.HitTest()`.
///
///   hit_point = ray.origin + (hit.distance * ray.direction)
///   local_point = hit.inverse_transform * hit_point
struct Hit {
    /// The node's tag value.
    uint32 tag_value;

    /// The origin of the ray that was used for the hit test, in the hit
    /// node's coordinate system.
    vec4 ray_origin;

    /// The direction of the ray that was used for the hit test, in the hit
    /// node's coordinate system.
    vec4 ray_direction;

    /// The inverse transformation matrix which maps the coordinate system of
    /// the node at which the hit test was initiated into the local coordinate
    /// system of the node which was hit.
    mat4 inverse_transform;

    /// The distance from the ray's origin to the closest point of intersection
    /// in multiples of the ray's direction vector.
    float32 distance;
};
