/// <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);
        }
Exemple #3
0
        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);
        }
Exemple #7
0
 /// <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)
 {
 }