/// <summary> /// Invoked when a new [XRReferenceObject](xref:UnityEngine.XR.ARSubsystems.XRReferenceObject) is added to an /// [XRReferenceObjectLibrary](xref:UnityEngine.XR.ARSubsystems.XRReferenceObjectLibrary). /// </summary> /// <param name="library">The library to which the reference object is being added.</param> /// <param name="xrReferenceObject">The reference object being added to the <paramref name="library"/>.</param> protected override void OnAddToLibrary(XRReferenceObjectLibrary library, XRReferenceObject xrReferenceObject) { base.OnAddToLibrary(library, xrReferenceObject); if (m_ARKitReferenceObject == null) { return; } var instance = XRGeneralSettings.Instance; if (instance == null) { return; } var manager = instance.Manager; if (manager == null) { return; } var loader = manager.activeLoader; if (loader == null) { return; } if (loader.GetLoadedSubsystem <XRObjectTrackingSubsystem>() is ARKitXRObjectTrackingSubsystem subsystem) { subsystem.AddReferenceObject(library, GetARKitReferenceObject(xrReferenceObject)); } }
/// <summary> /// Removes the <c>XRReferenceObject</c> at <paramref name="index"/>. /// </summary> /// <param name="library">The <c>XRReferenceObjectLibrary</c> being extended.</param> /// <param name="index">The index of the <c>XRReferenceObject</c> to remove.</param> /// <exception cref="System.ArgumentNullException">Thrown if <paramref name="library"/> is null.</exception> /// <exception cref="System.IndexOutOfRangeException">Thrown if <paramref name="index"/> is not between 0 and <c>library.count - 1</c>.</exception> public static void RemoveAt(this XRReferenceObjectLibrary library, int index) { if (library == null) { throw new ArgumentNullException("library"); } if (index < 0 || index >= library.count) { throw new IndexOutOfRangeException(string.Format("index {0} is out of range [0 - {1}]", index, library.count - 1)); } library.m_ReferenceObjects.RemoveAt(index); }
internal void AddReferenceObject(XRReferenceObjectLibrary library, ARReferenceObject referenceObject) { if (library == null) { throw new ArgumentNullException(nameof(library)); } if (referenceObject == null) { throw new ArgumentNullException(nameof(referenceObject)); } if (this.library == library) { ARKitProvider.AddReferenceObject(referenceObject); } }
/// <summary> /// Sets the name of the <c>XRReferenceObject</c> at <paramref name="index"/>. /// </summary> /// <param name="library">The <c>XRReferenceObjectLibrary</c> being extended.</param> /// <param name="index">The index of the <c>XRReferenceObject</c> to modify.</param> /// <param name="name">The new name of the <c>XRReferenceObject</c>.</param> /// <exception cref="System.ArgumentNullException">Thrown if <paramref name="library"/> is null.</exception> /// <exception cref="System.IndexOutOfRangeException">Thrown if <paramref name="index"/> is not between 0 and <c>library.count - 1</c>.</exception> public static void SetReferenceObjectName(this XRReferenceObjectLibrary library, int index, string name) { if (library == null) { throw new ArgumentNullException("library"); } if (index < 0 || index >= library.count) { throw new IndexOutOfRangeException(string.Format("index {0} is out of range [0 - {1}]", index, library.count - 1)); } var referenceObject = library.m_ReferenceObjects[index]; referenceObject.m_Name = name; library.m_ReferenceObjects[index] = referenceObject; }
/// <summary> /// Creates a new <c>XRReferenceObject</c> and adds it to the library. /// </summary> /// <param name="library">The <c>XRReferenceObjectLibrary</c> being extended.</param> /// <returns>The index in the library at which the new reference object was created.</returns> /// <exception cref="System.ArgumentNullException">Thrown if <paramref name="library"/> is null.</exception> public static int Add(this XRReferenceObjectLibrary library) { if (library == null) { throw new ArgumentNullException("library"); } ulong guidLow, guidHigh; Guid.NewGuid().Decompose(out guidLow, out guidHigh); library.m_ReferenceObjects.Add(new XRReferenceObject { m_Entries = new List <XRReferenceObjectEntry>(), m_GuidLow = guidLow, m_GuidHigh = guidHigh }); return(library.m_ReferenceObjects.Count - 1); }
/// <summary> /// Sets the entry for the given <paramref name="type"/> of the <c>XRReferenceObject</c> at index <paramref name="index"/>. /// </summary> /// <remarks> /// Each reference object contains a list of "entries", one for each provider (implementation of <c>XRObjectTrackingSubsystem</c>). /// This method sets the entry for a given type, which is the data that will be used when that provider is active. /// </remarks> /// <param name="library">The <c>XRReferenceObjectLibrary</c> being extended.</param> /// <param name="index">The index of the <c>XRReferenceObject</c> to modify.</param> /// <param name="type">The type of the <see cref="XRReferenceObjectEntry"/> being set.</param> /// <param name="entry">The entry to use for the given <paramref name="type"/>.</param> /// <exception cref="System.ArgumentNullException">Thrown if <paramref name="library"/> is null.</exception> /// <exception cref="System.ArgumentNullException">Thrown if <paramref name="type"/> is null.</exception> /// <exception cref="System.IndexOutOfRangeException">Thrown if <paramref name="index"/> is not between 0 and <c>library.count - 1</c>.</exception> /// <exception cref="System.ArgumentException">Thrown if <paramref name="type"/> does not derive from <c>XRReferenceObjectEntry</c>.</exception> public static void SetReferenceObjectEntry(this XRReferenceObjectLibrary library, int index, Type type, XRReferenceObjectEntry entry) { if (library == null) { throw new ArgumentNullException("library"); } if (type == null) { throw new ArgumentNullException("type"); } if (!type.IsSubclassOf(typeof(XRReferenceObjectEntry))) { throw new ArgumentException("The type must derive from XRReferenceObjectEntry", "type"); } if (index < 0 || index >= library.m_ReferenceObjects.Count) { throw new IndexOutOfRangeException(string.Format("index {0} is out of range [0 - {1}]", index, library.m_ReferenceObjects.Count - 1)); } var referenceObject = library.m_ReferenceObjects[index]; for (int i = 0; i < referenceObject.m_Entries.Count; ++i) { if (referenceObject.m_Entries[i].GetType() == type) { if (entry == null) { referenceObject.m_Entries.RemoveAt(i); } else { referenceObject.m_Entries[i] = entry; } return; } } // There isn't an entry for the given type, so add it. referenceObject.m_Entries.Add(entry); }
/// <summary> /// Invoked when an <see cref="XRReferenceObject"/> is added to an <see cref="XRReferenceObjectLibrary"/>. /// </summary> /// <remarks> /// Override this method if your <see cref="XRReferenceObjectEntry"/> needs to perform logic when a novel /// <see cref="XRReferenceObject"/> is added to an <see cref="XRReferenceObjectLibrary"/>. /// /// The default implementation takes no action and has no effect. /// </remarks> /// <param name="library">The library to which <param name="referenceObject"> is being added.</param></param> /// <param name="referenceObject">The reference object being added to <paramref name="library"/>.</param> protected internal virtual void OnAddToLibrary(XRReferenceObjectLibrary library, XRReferenceObject referenceObject) { }