diff --git a/Source/Engine/Core/Types/LayersMask.cs b/Source/Engine/Core/Types/LayersMask.cs
index a6bd4bcab..2838e7219 100644
--- a/Source/Engine/Core/Types/LayersMask.cs
+++ b/Source/Engine/Core/Types/LayersMask.cs
@@ -39,6 +39,48 @@ namespace FlaxEngine
return HasLayer(Level.GetLayerIndex(layerName));
}
+ ///
+ /// Gets a layer mask based on a specific layer names.
+ ///
+ /// The names of the layers (from layers settings).
+ /// A layer mask with the mask set to the layers found. Returns a mask with 0 if not found.
+ public static LayersMask GetMask(params string[] layerNames)
+ {
+ LayersMask mask = new LayersMask();
+ foreach (var layerName in layerNames)
+ {
+ // Ignore blank entries
+ if (layerName.Length == 0)
+ continue;
+ int index = Level.GetLayerIndex(layerName);
+ if (index != -1 && !mask.HasLayer(index))
+ {
+ mask.Mask |= (uint)(1 << index);
+ }
+ }
+ return mask;
+ }
+
+ ///
+ /// Gets the layer index based on the layer name.
+ ///
+ /// The name of the layer.
+ /// The index if found, otherwise, returns -1.
+ public static int GetLayerIndex(string layerName)
+ {
+ return Level.GetLayerIndex(layerName);
+ }
+
+ ///
+ /// Gets the layer name based on the layer index.
+ ///
+ /// The index of the layer.
+ /// The name of the layer if found, otherwise, a blank string.
+ public static string GetLayerName(int layerIndex)
+ {
+ return Level.GetLayerName(layerIndex);
+ }
+
///
/// Adds two masks.
///
diff --git a/Source/Engine/Core/Types/LayersMask.h b/Source/Engine/Core/Types/LayersMask.h
index 3643af19e..3f175773e 100644
--- a/Source/Engine/Core/Types/LayersMask.h
+++ b/Source/Engine/Core/Types/LayersMask.h
@@ -27,12 +27,29 @@ public:
{
}
+ ///
+ /// Determines whether the specified layer index is set in the mask.
+ ///
+ /// Index of the layer (zero-based).
+ /// true if the specified layer is set; otherwise, false.
FORCE_INLINE bool HasLayer(int32 layerIndex) const
{
return (Mask & (1 << layerIndex)) != 0;
}
- bool HasLayer(const StringView& layerName) const;
+ ///
+ /// Determines whether the specified layer name is set in the mask.
+ ///
+ /// Name of the layer (from layers settings).
+ /// true if the specified layer is set; otherwise, false.
+ bool HasLayer(const StringView& layerName);
+
+ ///
+ /// Gets a layers mask from a specific layer name.
+ ///
+ /// The layer names.
+ /// A layers mask with the Mask set to the same Mask as the layer name passed in. Returns a LayersMask with a mask of 0 if no layer found.
+ static LayersMask GetMask(StringView layerNames[]);
operator uint32() const
{
diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp
index a96ba936a..1ff7d2cad 100644
--- a/Source/Engine/Level/Level.cpp
+++ b/Source/Engine/Level/Level.cpp
@@ -60,11 +60,31 @@ void LargeWorlds::UpdateOrigin(Vector3& origin, const Vector3& position)
}
}
-bool LayersMask::HasLayer(const StringView& layerName) const
+bool LayersMask::HasLayer(const StringView& layerName)
{
return HasLayer(Level::GetLayerIndex(layerName));
}
+LayersMask LayersMask::GetMask(StringView layerNames[])
+{
+ LayersMask mask(0);
+ if (layerNames == nullptr)
+ return mask;
+ for (int i = 0; i < layerNames->Length(); i++)
+ {
+ StringView& layerName = layerNames[i];
+ // Ignore blank entries
+ if (layerName.Length() == 0)
+ continue;
+ int index = Level::GetLayerIndex(layerName);
+ if (index != -1 && !mask.HasLayer(index))
+ {
+ mask.Mask |= static_cast(1 << index);
+ }
+ }
+ return mask;
+}
+
enum class SceneEventType
{
OnSceneSaving = 0,
@@ -729,6 +749,18 @@ int32 Level::GetLayerIndex(const StringView& layer)
return result;
}
+StringView Level::GetLayerName(const int32 layerIndex)
+{
+ for (int32 i = 0; i < 32; i++)
+ {
+ if (i == layerIndex)
+ {
+ return Layers[i];
+ }
+ }
+ return TEXT("");
+}
+
void Level::callActorEvent(ActorEventType eventType, Actor* a, Actor* b)
{
PROFILE_CPU();
diff --git a/Source/Engine/Level/Level.h b/Source/Engine/Level/Level.h
index f07a20c51..696ac5a22 100644
--- a/Source/Engine/Level/Level.h
+++ b/Source/Engine/Level/Level.h
@@ -534,6 +534,13 @@ public:
///
API_FUNCTION() static int32 GetLayerIndex(const StringView& layer);
+ ///
+ /// Gets the name of the layer based on the index.
+ ///
+ /// The index to find the layer string. 0 - 32.
+ /// The layer string. Returns a blank string if index not found.
+ API_FUNCTION() static StringView GetLayerName(const int32 layerIndex);
+
private:
// Actor API
enum class ActorEventType