public override void AddPickerObject(UnityEngine.Object pickerObject, GPUInstancerPrototype overridePrototype = null)
        {
            base.AddPickerObject(pickerObject, overridePrototype);

            if (pickerObject == null)
            {
                return;
            }

            if (!(pickerObject is GameObject))
            {
                EditorUtility.DisplayDialog(GPUInstancerConstants.TEXT_PREFAB_TYPE_WARNING_TITLE, GPUInstancerConstants.TEXT_TREE_PREFAB_TYPE_WARNING, GPUInstancerConstants.TEXT_OK);
                return;
            }

            GameObject prefabObject = (GameObject)pickerObject;

#if UNITY_2018_3_OR_NEWER
            PrefabAssetType prefabType = PrefabUtility.GetPrefabAssetType(pickerObject);

            if (prefabType == PrefabAssetType.Regular || prefabType == PrefabAssetType.Variant || prefabType == PrefabAssetType.Model)
            {
                GameObject newPrefabObject = (GameObject)PrefabUtility.GetCorrespondingObjectFromSource(prefabObject);
                if (newPrefabObject != null)
                {
                    while (newPrefabObject.transform.parent != null)
                    {
                        newPrefabObject = newPrefabObject.transform.parent.gameObject;
                    }
                    prefabObject = newPrefabObject;
                }
            }
            else
            {
                EditorUtility.DisplayDialog(GPUInstancerConstants.TEXT_PREFAB_TYPE_WARNING_TITLE, GPUInstancerConstants.TEXT_TREE_PREFAB_TYPE_WARNING, GPUInstancerConstants.TEXT_OK);
                return;
            }
#else
            PrefabType prefabType = PrefabUtility.GetPrefabType(pickerObject);

            if (prefabType != PrefabType.Prefab && prefabType != PrefabType.ModelPrefab)
            {
                bool instanceFound = false;
                if (prefabType == PrefabType.PrefabInstance || prefabType == PrefabType.ModelPrefabInstance)
                {
#if UNITY_2018_2_OR_NEWER
                    GameObject newPrefabObject = (GameObject)PrefabUtility.GetCorrespondingObjectFromSource(prefabObject);
#else
                    GameObject newPrefabObject = (GameObject)PrefabUtility.GetPrefabParent(prefabObject);
#endif
                    if (PrefabUtility.GetPrefabType(newPrefabObject) == PrefabType.Prefab || PrefabUtility.GetPrefabType(newPrefabObject) == PrefabType.ModelPrefab)
                    {
                        while (newPrefabObject.transform.parent != null)
                        {
                            newPrefabObject = newPrefabObject.transform.parent.gameObject;
                        }
                        prefabObject  = newPrefabObject;
                        instanceFound = true;
                    }
                }
                if (!instanceFound)
                {
                    EditorUtility.DisplayDialog(GPUInstancerConstants.TEXT_PREFAB_TYPE_WARNING_TITLE, GPUInstancerConstants.TEXT_TREE_PREFAB_TYPE_WARNING, GPUInstancerConstants.TEXT_OK);
                    return;
                }
            }
#endif

            Undo.RecordObject(this, "Add tree prototype");

            if (_treeManager.terrainSettings != null && _treeManager.terrain != null && _treeManager.terrain.terrainData != null)
            {
                if (overridePrototype != null)
                {
                    int prototypeIndex = prototypeList.IndexOf(overridePrototype);
                    if (prototypeIndex >= 0 && prototypeIndex < _treeManager.terrain.terrainData.treePrototypes.Length)
                    {
                        TreePrototype[] treePrototypes = _treeManager.terrain.terrainData.treePrototypes;

                        treePrototypes[prototypeIndex].prefab           = prefabObject;
                        overridePrototype.prefabObject                  = prefabObject;
                        _treeManager.terrain.terrainData.treePrototypes = treePrototypes;
                        _treeManager.terrain.terrainData.RefreshPrototypes();

                        GPUInstancerUtility.DetermineTreePrototypeType(overridePrototype);

                        if (overridePrototype.billboard != null && overridePrototype.useGeneratedBillboard)
                        {
                            GPUInstancerUtility.GeneratePrototypeBillboard(overridePrototype, true);
                        }
                    }
                }
                else
                {
                    List <TreePrototype> newTreePrototypes = new List <TreePrototype>(_treeManager.terrain.terrainData.treePrototypes);

                    TreePrototype terrainTreePrototype = new TreePrototype()
                    {
                        prefab     = prefabObject,
                        bendFactor = 0
                    };
                    newTreePrototypes.Add(terrainTreePrototype);

                    _treeManager.terrain.terrainData.treePrototypes = newTreePrototypes.ToArray();
                    _treeManager.terrain.terrainData.RefreshPrototypes();
                    GPUInstancerUtility.AddTreeInstancePrototypeFromTerrainPrototype(_treeManager.gameObject, prototypeList, terrainTreePrototype,
                                                                                     newTreePrototypes.Count - 1, _treeManager.terrainSettings);
                }
            }
        }