static bool ContentsSync(MarsMarkerLibrary marsMarkerLibrary, XRReferenceImageLibrary xrReferenceImageLibrary) { var needsSave = false; // Find all changes and synchronize var referenceImages = new Dictionary <Guid, XRReferenceImage>(); foreach (var xrRefImage in xrReferenceImageLibrary) { referenceImages.Add(xrRefImage.guid, xrRefImage); } var markersToAdd = new List <MarsMarkerDefinition>(); var markersToUpdateDictionary = new Dictionary <MarsMarkerDefinition, XRReferenceImage>(); foreach (var marsDefinition in marsMarkerLibrary) { if (referenceImages.ContainsKey(marsDefinition.MarkerId)) { var refImage = referenceImages[marsDefinition.MarkerId]; if (refImage.name != marsDefinition.Label || refImage.specifySize != marsDefinition.SpecifySize || refImage.size != marsDefinition.Size || refImage.texture != marsDefinition.Texture) { markersToUpdateDictionary.Add(marsDefinition, refImage); needsSave = true; } referenceImages.Remove(marsDefinition.MarkerId); } else { markersToAdd.Add(marsDefinition); needsSave = true; } } // Whatever is left in referenceImages needs to be deleted, since none of the marker definitions match needsSave = needsSave || referenceImages.Count > 0; foreach (var refImageEntry in referenceImages) { var index = xrReferenceImageLibrary.indexOf(refImageEntry.Value); xrReferenceImageLibrary.RemoveAt(index); } foreach (var marsMarkerDefinition in markersToAdd) { var refImage = AddRefImageFromMarker(xrReferenceImageLibrary, marsMarkerDefinition); marsMarkerLibrary.SetGuid(marsMarkerLibrary.IndexOf(marsMarkerDefinition), refImage.guid); } foreach (var dictEntry in markersToUpdateDictionary) { var index = xrReferenceImageLibrary.indexOf(dictEntry.Value); UpdateRefImage(xrReferenceImageLibrary, index, dictEntry.Key); } return(needsSave); }