// Copyright HTC Corporation All Rights Reserved.
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditorInternal;
#endif
namespace VIVE.OpenXR.Toolkits.Spectator.Helper
{
public static class LayerMaskHelper
{
public static bool HasLayer(this LayerMask layerMask, int layer)
{
if (layerMask == (layerMask | (1 << layer)))
{
return true;
}
return false;
}
public static bool[] HasLayers(this LayerMask layerMask)
{
var hasLayers = new bool[32];
for (int i = 0; i < 32; i++)
{
if (layerMask == (layerMask | (1 << i)))
{
Debug.Log($"LayerMask.LayerToName = {LayerMask.LayerToName(i)}");
hasLayers[i] = true;
}
}
return hasLayers;
}
#if UNITY_EDITOR
public static class LayerMaskDrawer
{
public static int LayerMaskField(string label, int layermask)
{
return FieldToLayerMask(EditorGUILayout.MaskField(label, LayerMaskToField(layermask),
InternalEditorUtility.layers));
}
public static int LayerMaskField(Rect position, string label, int layermask)
{
return FieldToLayerMask(EditorGUI.MaskField(position, label, LayerMaskToField(layermask),
InternalEditorUtility.layers));
}
///
/// Converts field LayerMask values to in game LayerMask values
///
///
///
private static int FieldToLayerMask(int field)
{
if (field == -1) return -1;
int mask = 0;
var layers = InternalEditorUtility.layers;
for (int c = 0; c < layers.Length; c++)
{
if ((field & (1 << c)) != 0)
{
mask |= 1 << LayerMask.NameToLayer(layers[c]);
}
else
{
mask &= ~(1 << LayerMask.NameToLayer(layers[c]));
}
}
return mask;
}
///
/// Converts in game LayerMask values to field LayerMask values
///
///
///
private static int LayerMaskToField(int mask)
{
if (mask == -1) return -1;
int field = 0;
var layers = InternalEditorUtility.layers;
for (int c = 0; c < layers.Length; c++)
{
if ((mask & (1 << LayerMask.NameToLayer(layers[c]))) != 0)
{
field |= 1 << c;
}
}
return field;
}
}
#endif
}
}