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