using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Serialization;
namespace UnityEngine.Perception.GroundTruth
{
///
/// Required interface for entries in a . Exposes the string label which is the "key"
/// for the entry.
///
public interface ILabelEntry
{
///
/// The label to use as the key for the entry. This label will be matched with the labels in the GameObject's
/// component.
///
string label { get; }
}
///
/// A definition for how a should be resolved to a single label and id for ground truth generation.
///
/// The entry type. Must derive from
public class LabelConfig : ScriptableObject where T : ILabelEntry
{
///
/// The name of the serialized field for label entries.
///
public const string labelEntriesFieldName = nameof(m_LabelEntries);
///
/// List of LabelEntry items added to this label configuration
///
[FormerlySerializedAs("LabelEntries")]
[FormerlySerializedAs("LabelingConfigurations")]
[SerializeField]
protected List m_LabelEntries = new List();
///
/// Name of the public accessor for the list of label entries, used for reflection purposes.
///
public const string publicLabelEntriesFieldName = nameof(labelEntries);
///
/// A sequence of which defines the labels relevant for this configuration and their values.
///
public IReadOnlyList labelEntries => m_LabelEntries;
///
/// Attempts to find the matching index in for the given .
///
///
/// The matching index is the first class name in the given Labeling which matches an entry in .
///
/// The to match
/// When this method returns, contains the matching , or default
if no match was found.
/// Returns true if a match was found. False if not.
public bool TryGetMatchingConfigurationEntry(Labeling labeling, out T labelEntry)
{
return TryGetMatchingConfigurationEntry(labeling, out labelEntry, out int _);
}
///
/// Name of the function that checks whether a given string matches any of the label entries in this label configuration, used for reflection purposes.
///
public const string DoesLabelMatchAnEntryName = nameof(DoesLabelMatchAnEntry);
///
/// Does the given string match any of the label entries added to this label configuration.
///
///
///
public bool DoesLabelMatchAnEntry(string label)
{
return m_LabelEntries.Any(entry => string.Equals(entry.label, label));
}
///
/// Initialize the list of LabelEntries on this LabelingConfiguration. Should only be called immediately after instantiation.
///
/// The LabelEntry values to associate with this LabelingConfiguration
/// Thrown once the LabelConfig has been used at runtime.
/// The specific timing of this depends on the LabelConfig implementation.
public void Init(IEnumerable newLabelEntries)
{
m_LabelEntries = new List(newLabelEntries);
OnInit();
}
///
/// Called when the labelEntries list is assigned using
///
protected virtual void OnInit()
{
}
///
/// Attempts to find the matching index in for the given .
///
///
/// The matching index is the first class name in the given Labeling which matches an entry in .
///
/// The to match
/// When this method returns, contains the matching , or default
if no match was found.
/// When this method returns, contains the index of the matching , or -1
if no match was found.
/// Returns true if a match was found. False if not.
public bool TryGetMatchingConfigurationEntry(Labeling labeling, out T labelEntry, out int labelEntryIndex)
{
foreach (var labelingClass in labeling.labels)
{
for (var i = 0; i < m_LabelEntries.Count; i++)
{
var entry = m_LabelEntries[i];
if (string.Equals(entry.label, labelingClass))
{
labelEntry = m_LabelEntries[i];
labelEntryIndex = i;
return true;
}
}
}
labelEntryIndex = -1;
labelEntry = default;
return false;
}
}
}