protected override TreeViewItem BuildRoot()
        {
            Debug.Assert(m_PrefabInstanceRoot != null, "We should always have a valid apply target");

            // Inner prefab asset root.
            m_AllModifications = GetPrefabOverrides(m_PrefabInstanceRoot, false);

            Dictionary <int, PrefabOverrides> instanceIDToPrefabOverridesMap;

            BuildPrefabOverridesPerObject(out instanceIDToPrefabOverridesMap);

            var hiddenRoot = new TreeViewItem {
                id = 0, depth = -1, displayName = "Hidden Root"
            };
            var idSequence = new IdSequence();

            hasModifications = AddTreeViewItemRecursive(hiddenRoot, m_PrefabInstanceRoot, instanceIDToPrefabOverridesMap, idSequence);
            if (!hasModifications)
            {
                hiddenRoot.AddChild(new TreeViewItem {
                    id = 1, depth = 0, displayName = "No Overrides"
                });
            }

            if (m_Debug)
            {
                AddDebugItems(hiddenRoot, idSequence);
            }

            return(hiddenRoot);
        }
        static PrefabOverrides GetPrefabOverridesForObject(int instanceID, Dictionary <int, PrefabOverrides> map)
        {
            PrefabOverrides modificationsForObject;

            if (!map.TryGetValue(instanceID, out modificationsForObject))
            {
                modificationsForObject = new PrefabOverrides();
                map[instanceID]        = modificationsForObject;
            }
            return(modificationsForObject);
        }
        protected override TreeViewItem BuildRoot()
        {
            Debug.Assert(m_PrefabInstanceRoot != null, "We should always have a valid apply target");

            // Inner prefab asset root.
            m_AllModifications = GetPrefabOverrides(m_PrefabInstanceRoot, false);

            Dictionary <int, PrefabOverrides> instanceIDToPrefabOverridesMap;

            BuildPrefabOverridesPerObject(out instanceIDToPrefabOverridesMap);

            var hiddenRoot = new TreeViewItem {
                id = 0, depth = -1, displayName = "Hidden Root"
            };
            var idSequence = new IdSequence();

            hasApplicableModifications = false;
            hasModifications           = AddTreeViewItemRecursive(hiddenRoot, m_PrefabInstanceRoot, instanceIDToPrefabOverridesMap, idSequence);
            if (!hasModifications)
            {
                hiddenRoot.AddChild(new TreeViewItem {
                    id = 1, depth = 0, displayName = "No Overrides"
                });
            }
            else
            {
                bool CanAnyPropertiesBeApplied()
                {
                    if (m_AllModifications.addedComponents.Count != 0 || m_AllModifications.removedComponents.Count != 0 || m_AllModifications.addedGameObjects.Count != 0)
                    {
                        return(true);
                    }

                    foreach (var objectOverride in m_AllModifications.objectOverrides)
                    {
                        if (PrefabUtility.HasApplicableObjectOverrides(objectOverride.instanceObject, false))
                        {
                            return(true);
                        }
                    }

                    return(false);
                }

                hasApplicableModifications = CanAnyPropertiesBeApplied();
            }

            if (m_Debug)
            {
                AddDebugItems(hiddenRoot, idSequence);
            }

            return(hiddenRoot);
        }
        void BuildPrefabOverridesPerObject(out Dictionary <int, PrefabOverrides> instanceIDToPrefabOverridesMap)
        {
            instanceIDToPrefabOverridesMap = new Dictionary <int, PrefabOverrides>();

            foreach (var modifiedObject in m_AllModifications.objectOverrides)
            {
                int instanceID = 0;
                if (modifiedObject.instanceObject is GameObject)
                {
                    instanceID = modifiedObject.instanceObject.GetInstanceID();
                }
                else if (modifiedObject.instanceObject is Component)
                {
                    instanceID = ((Component)modifiedObject.instanceObject).gameObject.GetInstanceID();
                }

                if (instanceID != 0)
                {
                    PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap);
                    modificationsForObject.objectOverrides.Add(modifiedObject);
                }
            }

            foreach (var addedGameObject in m_AllModifications.addedGameObjects)
            {
                int             instanceID             = addedGameObject.instanceGameObject.GetInstanceID();
                PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap);
                modificationsForObject.addedGameObjects.Add(addedGameObject);
            }

            foreach (var addedComponent in m_AllModifications.addedComponents)
            {
                // This is possible if there's a component with a missing script.
                if (addedComponent.instanceComponent == null)
                {
                    continue;
                }
                int             instanceID             = addedComponent.instanceComponent.gameObject.GetInstanceID();
                PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap);
                modificationsForObject.addedComponents.Add(addedComponent);
            }

            foreach (var removedComponent in m_AllModifications.removedComponents)
            {
                // This is possible if there's a component with a missing script.
                if (removedComponent.assetComponent == null)
                {
                    continue;
                }
                int             instanceID             = removedComponent.containingInstanceGameObject.gameObject.GetInstanceID();
                PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap);
                modificationsForObject.removedComponents.Add(removedComponent);
            }
        }
        static PrefabOverrides GetPrefabOverrides(GameObject prefabInstance, bool includeDefaultOverrides = false)
        {
            if (!PrefabUtility.IsPartOfNonAssetPrefabInstance(prefabInstance))
            {
                Debug.LogError("GeneratePrefabOverrides should only be called with GameObjects that are part of a prefab");
                return(new PrefabOverrides());
            }

            var mods = new PrefabOverrides();

            mods.objectOverrides   = PrefabOverridesUtility.GetObjectOverrides(prefabInstance, includeDefaultOverrides);
            mods.addedComponents   = PrefabOverridesUtility.GetAddedComponents(prefabInstance);
            mods.removedComponents = PrefabOverridesUtility.GetRemovedComponents(prefabInstance);
            mods.addedGameObjects  = PrefabOverridesUtility.GetAddedGameObjects(prefabInstance);
            return(mods);
        }