/****************************************************************************** * Copyright (C) Ultraleap, Inc. 2011-2021. * * * * Use subject to the terms of the Apache License 2.0 available at * * http://www.apache.org/licenses/LICENSE-2.0, or another agreement * * between Ultraleap and you, your company or other organization. * ******************************************************************************/ using System; namespace Leap.Unity { /// /// An object you can use to represent a single Unity layer /// as a dropdown in the inspector. Can be converted back and /// forth between the integer representation Unity usually /// uses in its own methods. /// [Serializable] public struct SingleLayer : IEquatable { public int layerIndex; public int layerMask { get { return 1 << layerIndex; } set { if (value == 0) { throw new ArgumentException("Single layer can only represent exactly one layer. The provided mask represents no layers (mask was zero)."); } int newIndex = 0; while ((value & 1) == 0) { value = value >> 1; newIndex++; } if (value != 1) { throw new ArgumentException("Single layer can only represent exactly one layer. The provided mask represents more than one layer."); } layerIndex = newIndex; } } public static implicit operator int(SingleLayer singleLayer) { return singleLayer.layerIndex; } public static implicit operator SingleLayer(int layerIndex) { SingleLayer singleLayer = new SingleLayer(); singleLayer.layerIndex = layerIndex; return singleLayer; } public bool Equals(SingleLayer other) { return this.layerIndex == other.layerIndex; } } }