public unsafe override TrackableChanges <XRTrackedImage> GetChanges( XRTrackedImage defaultTrackedImage, Allocator allocator) { void *addedPtr, updatedPtr, removedPtr; int addedLength, updatedLength, removedLength, stride; var context = UnityARKit_ImageTracking_AcquireChanges( out addedPtr, out addedLength, out updatedPtr, out updatedLength, out removedPtr, out removedLength, out stride); try { return(new TrackableChanges <XRTrackedImage>( addedPtr, addedLength, updatedPtr, updatedLength, removedPtr, removedLength, defaultTrackedImage, stride, allocator)); } finally { UnityARKit_ImageTracking_ReleaseChanges(context); } }
public unsafe override TrackableChanges <XRTrackedImage> GetChanges(XRTrackedImage defaultTrackedImage, Allocator allocator) { if (!IsSubsystemStateValid()) { return(default(TrackableChanges <XRTrackedImage>)); } void *addedPtr, updatedPtr, removedPtr; int addedLength, updatedLength, removedLength, stride; var context = Native.AcquireChanges( s_NativeProviderPtr, out addedPtr, out addedLength, out updatedPtr, out updatedLength, out removedPtr, out removedLength, out stride); try { return(new TrackableChanges <XRTrackedImage>( addedPtr, addedLength, updatedPtr, updatedLength, removedPtr, removedLength, defaultTrackedImage, stride, allocator)); } finally { Native.ReleaseChanges(context); } }
public override TrackableChanges <XRTrackedImage> GetChanges(XRTrackedImage defaultTrackedImage, Allocator allocator) { TrackableChanges <XRTrackedImage> changes; var numAddedMarkers = m_Added.Count; if (numAddedMarkers > 0) { Utils.EnsureCapacity(ref m_ConversionBuffer, numAddedMarkers); for (var i = 0; i < numAddedMarkers; i++) { var added = m_Added[i]; // if the same trackable ID is present more than once in a frame, the ARF validation utility // will throw an error in the editor and dev builds. Because subsystem tracking doesn't update every frame, // it's possible to get the same marker in both. Use the most recent version as an add if this happens. if (m_Updated.TryGetValue(added.id, out var updatedValue)) { m_Added[i] = updatedValue; m_Updated.Remove(added.id); } } // create this after in case any have been removed from the updated collection changes = new TrackableChanges <XRTrackedImage>(m_Added.Count, m_Updated.Count, m_Removed.Count, allocator); for (var i = 0; i < numAddedMarkers; i++) { m_ConversionBuffer[i] = TrackedImageFromMRMarker(m_Added[i]); } NativeArray <XRTrackedImage> .Copy(m_ConversionBuffer, changes.added, numAddedMarkers); m_Added.Clear(); } else { changes = new TrackableChanges <XRTrackedImage>(m_Added.Count, m_Updated.Count, m_Removed.Count, allocator); } var numUpdatedMarkers = m_Updated.Count; if (numUpdatedMarkers > 0) { Utils.EnsureCapacity(ref m_ConversionBuffer, numUpdatedMarkers); var i = 0; foreach (var updatedMarker in m_Updated.Values) { m_ConversionBuffer[i++] = TrackedImageFromMRMarker(updatedMarker); } NativeArray <XRTrackedImage> .Copy(m_ConversionBuffer, changes.updated, numUpdatedMarkers); m_Updated.Clear(); } var numRemovedMarkers = m_Removed.Count; if (numRemovedMarkers > 0) { Utils.EnsureCapacity(ref m_IdConversionBuffer, numRemovedMarkers); var i = 0; foreach (var id in m_Removed) { m_IdConversionBuffer[i++] = new TrackableId(id.subId1, id.subId2); } NativeArray <TrackableId> .Copy(m_IdConversionBuffer, changes.removed, numRemovedMarkers); m_Removed.Clear(); } return(changes); }
/// <summary> /// Get the changes (added, updated, removed) to the tracked images since the last call to this method. /// </summary> /// <param name="defaultTrackedImage">An <see cref="XRTrackedImage"/> populated with default values. /// The implementation should first fill arrays of added, updated, and removed with copies of this /// before copying in its own values. This guards against additional fields added to the <see cref="XRTrackedImage"/> in the future.</param> /// <param name="allocator">The allocator to use for the returned data.</param> /// <returns>The set of changes (added, updated, removed) tracked images since the last call to this method.</returns> public abstract TrackableChanges <XRTrackedImage> GetChanges(XRTrackedImage defaultTrackedImage, Allocator allocator);