using System; using System.Collections.Generic; namespace UnityEngine.XR.ARFoundation { /// /// Several method extensions to Transform for transforming and inverse-transforming additional Unity types. /// public static class TransformExtensions { /// /// Transforms a Ray /// /// The Transform component /// The Ray to transform /// A new Ray representing the transformed public static Ray TransformRay(this Transform transform, Ray ray) { if (transform == null) throw new ArgumentNullException(nameof(transform)); return new Ray( transform.TransformPoint(ray.origin), transform.TransformDirection(ray.direction)); } /// /// Inverse transforms a Ray /// /// The Transform component /// The Ray to inversely transform /// A new Ray representing the inversely transformed public static Ray InverseTransformRay(this Transform transform, Ray ray) { if (transform == null) throw new ArgumentNullException(nameof(transform)); return new Ray( transform.InverseTransformPoint(ray.origin), transform.InverseTransformDirection(ray.direction)); } /// /// Transforms a Pose /// /// The Transform component /// The Pose to transform /// A new Pose representing the transformed public static Pose TransformPose(this Transform transform, Pose pose) { return pose.GetTransformedBy(transform); } /// /// Inverse transforms a Pose /// /// The Transform component /// The Pose to inversely transform /// A new Pose representing the inversely transformed public static Pose InverseTransformPose(this Transform transform, Pose pose) { if (transform == null) throw new ArgumentNullException(nameof(transform)); return new Pose { position = transform.InverseTransformPoint(pose.position), rotation = Quaternion.Inverse(transform.rotation) * pose.rotation }; } /// /// Transforms a List of positions. /// /// The Transform component /// The points to transform. The points are transformed in-place. public static void TransformPointList(this Transform transform, List points) { if (transform == null) throw new ArgumentNullException(nameof(transform)); if (points == null) throw new ArgumentNullException(nameof(points)); for (int i = 0; i < points.Count; ++i) { points[i] = transform.TransformPoint(points[i]); } } /// /// Inverse transforms a List of Vector3s. /// /// The Transform component /// The points to inverse transform. This is done in-place. public static void InverseTransformPointList(this Transform transform, List points) { if (transform == null) throw new ArgumentNullException(nameof(transform)); if (points == null) throw new ArgumentNullException(nameof(points)); for (int i = 0; i < points.Count; ++i) { points[i] = transform.InverseTransformPoint(points[i]); } } /// /// Sets the layer for the GameObject associated with and all its children. /// /// The Transform component /// The layer in which the game object should be. public static void SetLayerRecursively(this Transform transform, int layer) { if (transform == null) throw new ArgumentNullException(nameof(transform)); // Set self transform.gameObject.layer = layer; // Set all child layers recursively for (var i = 0; i < transform.childCount; ++i) { var child = transform.GetChild(i); child.SetLayerRecursively(layer); } } } }