Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }