/// <summary> /// Invoke a refreeze operation on the plugin, and make all necessary adjustments /// in bookeeping after. /// </summary> /// <returns>True for successful refreeze.</returns> public bool Refreeze() { FragmentId targetFragmentId; FragmentId[] absorbedIds; if (!plugin.Refreeze(out targetFragmentId, out absorbedIds)) { return(false); } Debug.Assert(targetFragmentId.IsKnown(), "Received invalid merged fragment id from successful refreeze"); Fragment targetFragment = EnsureFragment(targetFragmentId); Debug.Assert(targetFragment != null, "Valid fragmentId but no fragment found"); for (int i = 0; i < absorbedIds.Length; ++i) { FragmentId sourceId = absorbedIds[i]; if (sourceId != targetFragmentId) { Fragment sourceFragment; if (fragments.TryGetValue(sourceId, out sourceFragment)) { targetFragment.AbsorbOtherFragment(sourceFragment); fragments.Remove(sourceId); } else { Debug.LogError($"Try to merge in a non-existent fragment {sourceId.ToString()}"); } } } CurrentFragmentId = targetFragmentId; // now apply individual adjustments to each attachment point. targetFragment.AdjustAll(plugin); // now that all adjustments have been made, notify the plugin to finish up the operation. plugin.RefreezeFinish(); refitNotifications?.Invoke(targetFragment.FragmentId, absorbedIds); return(true); }
/// <summary> /// Call on the plugin to compute the merge, then apply by /// setting transforms and adjusting scene graph. /// </summary> /// <returns>True for successful merge.</returns> public bool Merge() { FragmentId targetFragmentId; FragmentPose[] mergeAdjustments; if (!plugin.Merge(out targetFragmentId, out mergeAdjustments)) { return(false); } Debug.Assert(targetFragmentId.IsKnown(), "Received invalid merged fragment id from successful merge"); Fragment targetFragment = EnsureFragment(targetFragmentId); Debug.Assert(targetFragment != null, "Valid fragmentId but null target fragment from Merge"); int numAbsorbed = mergeAdjustments.Length; for (int i = 0; i < numAbsorbed; ++i) { FragmentId sourceId = mergeAdjustments[i].fragmentId; Pose adjustment = mergeAdjustments[i].pose; Fragment sourceFragment; if (fragments.TryGetValue(sourceId, out sourceFragment)) { targetFragment.AbsorbOtherFragment(sourceFragment, adjustment); fragments.Remove(sourceId); } else { Debug.LogError($"Try to merge in a non-existent fragment {sourceId.ToString()}"); } } CurrentFragmentId = targetFragmentId; ApplyActiveCurrentFragment(); refitNotifications?.Invoke(targetFragment.FragmentId, ExtractFragmentIds(mergeAdjustments)); return(true); }