private string GetFilePath(IVsHierarchy hierarchy, uint itemId)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            // GetMkDocument and GetCanonicalName don't work on the solution/root node.
            if (hierarchy == null ||
                HierarchyUtilities.IsSolutionNode(hierarchy, itemId))
            {
                return(RetrieveCurrentSolutionPath());
            }

            int    hr;
            string?file;

            // We prefer IVsProject, but it's not available in all projects.
            if (hierarchy is IVsProject project)
            {
                hr = project.GetMkDocument(itemId, out file);
            }
            else
            {
                hr = hierarchy.GetCanonicalName(itemId, out file);
            }

            if (ErrorHandler.Failed(hr) || file == null)
            {
                file = string.Empty;
            }

            return(file);
        }
        private void InspectHierarchyItems(IVsHierarchy hier, uint itemid, int level, List <uint> sharedItemIds)
        {
            string caption = HierarchyUtilities.GetHierarchyProperty <string>(hier, itemid, (int)__VSHPROPID.VSHPROPID_Caption);

            this.Output(string.Format("{0}{1}\n", new string('\t', level), caption));

            bool isSharedItem;

            if (HierarchyUtilities.TryGetHierarchyProperty(hier, itemid, (int)__VSHPROPID7.VSHPROPID_IsSharedItem, out isSharedItem) &&
                isSharedItem)
            {
                sharedItemIds.Add(itemid);
            }

            uint child;

            if (HierarchyUtilities.TryGetHierarchyProperty(hier, itemid, (int)__VSHPROPID.VSHPROPID_FirstChild, Unbox.AsUInt32, out child) &&
                child != (uint)VSConstants.VSITEMID.Nil)
            {
                this.InspectHierarchyItems(hier, child, level + 1, sharedItemIds);

                while (HierarchyUtilities.TryGetHierarchyProperty(hier, child, (int)__VSHPROPID.VSHPROPID_NextSibling, Unbox.AsUInt32, out child) &&
                       child != (uint)VSConstants.VSITEMID.Nil)
                {
                    this.InspectHierarchyItems(hier, child, level + 1, sharedItemIds);
                }
            }
        }
            protected override async Task <IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable <IVsHierarchyItem> rootItems)
            {
                if (this.branchDiffValidator.ValidateBranch(this.package))
                {
                    // Create new tag tables everytime the filter is applied
                    BranchDiffFilterProvider.TagManager.CreateTagTables();
                    IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems);

                    if (this.branchDiffValidator.ValidateSolution(this.solutionDirectory))
                    {
                        try
                        {
                            this.changeSet = this.branchDiffWorker.GenerateDiff(this.solutionDirectory, this.package.BranchToDiffAgainst);
                        }
                        catch (GitOperationException e)
                        {
                            this.errorPresenter.ShowError(e.Message);
                            return(null);
                        }

                        IReadOnlyObservableSet <IVsHierarchyItem> sourceItems = await this.vsHierarchyItemCollectionProvider.GetDescendantsAsync(
                            root.HierarchyIdentity.NestedHierarchy,
                            CancellationToken);

                        IFilteredHierarchyItemSet includedItems = await this.vsHierarchyItemCollectionProvider.GetFilteredHierarchyItemsAsync(
                            sourceItems,
                            ShouldIncludeInFilter,
                            CancellationToken);

                        return(includedItems);
                    }
                }

                return(null);
            }
Пример #4
0
        /// <summary>
        /// Instantiates new prefab
        /// </summary>
        public void InstantiatePrefab(int prefabId, string relativePath, string objectName)
        {
            if (prefabId < 0 || prefabId >= Settings.DistributedObjectPrefabs.Length)
            {
                throw new ArgumentException(
                          $"Prefab of distributed object with id {prefabId} is not defined in {typeof(NetworkSettings).Name}.");
            }

            var rootTransform = transform;
            var newGameObject = Instantiate(
                Settings.DistributedObjectPrefabs[prefabId],
                rootTransform.position,
                rootTransform.rotation,
                HierarchyUtilities.GetOrCreateChild(rootTransform, relativePath));

            newGameObject.name = objectName;
            var distributedObject = newGameObject.GetComponent <DistributedObject>();

            if (distributedObject == null)
            {
                throw new ArgumentException(
                          $"Prefab of distributed object with id {prefabId} has no {typeof(DistributedObject).Name} component in the root game object.");
            }

            instantiatedObjects.Add(new InstantiatedObjectData(prefabId, distributedObject));
        }
            private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem)
            {
                ThreadHelper.ThrowIfNotOnUIThread();
                if (hierarchyItem == null)
                {
                    return(false);
                }

                if (HierarchyUtilities.IsPhysicalFile(hierarchyItem.HierarchyIdentity) ||
                    HierarchyUtilities.IsProject(hierarchyItem.HierarchyIdentity))
                {
                    var absoluteFilePath = string.Empty;
                    if (HierarchyUtilities.IsPhysicalFile(hierarchyItem.HierarchyIdentity))
                    {
                        absoluteFilePath = hierarchyItem.CanonicalName;
                    }
                    else if (HierarchyUtilities.IsProject(hierarchyItem.HierarchyIdentity))
                    {
                        var vsHierarchy = hierarchyItem.HierarchyIdentity.Hierarchy;
                        vsHierarchy.ParseCanonicalName(hierarchyItem.CanonicalName, out uint itemId);
                        vsHierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_ExtObject, out object itemObject);
                        if (itemObject is EnvDTE.Project project)
                        {
                            absoluteFilePath = project.FullName;
                        }
                    }

                    if (!string.IsNullOrEmpty(absoluteFilePath))
                    {
                        DiffResultItem diffResultItem = this.branchDiffWorker.GetItemFromChangeSet(this.changeSet, absoluteFilePath);

                        if (diffResultItem != null)
                        {
                            // If the physical file in changeSet is under "External Dependencies" folder of a C++ project, always ignore. This file is a link, and already shows up elsewhere.
                            if (HierarchyUtilities.IsPhysicalFile(hierarchyItem.HierarchyIdentity) && IsCPPExternalDependencyFile(hierarchyItem))
                            {
                                return(false);
                            }

                            // Mark all Project nodes found in changeset, so we only enable "Open Diff With Base" button for these project nodes.
                            if (HierarchyUtilities.IsProject(hierarchyItem.HierarchyIdentity))
                            {
                                BranchDiffFilterProvider.TagManager.MarkProjAsChanged(hierarchyItem);
                            }

                            // If item renamed in working branch. Tag the old path so we find the Base branch version of file using the Old Path.
                            if (!string.IsNullOrEmpty(diffResultItem.OldAbsoluteFilePath))
                            {
                                BranchDiffFilterProvider.TagManager.SetOldFilePathOnRenamedItem(hierarchyItem, diffResultItem.OldAbsoluteFilePath);
                            }

                            return(true);
                        }
                    }
                }

                return(false);
            }
            protected override async Task <IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable <IVsHierarchyItem> rootItems)
            {
                IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems);
                IReadOnlyObservableSet <IVsHierarchyItem> sourceItems;

                sourceItems = await _hierarchyCollectionProvider.GetDescendantsAsync(root.HierarchyIdentity.NestedHierarchy, CancellationToken);

                return(await _hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(sourceItems, MeetsFilter, CancellationToken));
            }
Пример #7
0
            public static bool IsFileWithBookmarks(IVsHierarchyItem hierarchyItem)
            {
                if (hierarchyItem == null || !HierarchyUtilities.IsPhysicalFile(hierarchyItem.HierarchyIdentity))
                {
                    return(false);
                }

                return(BookmarksManager.HasBookmarks(hierarchyItem.CanonicalName));
            }
Пример #8
0
 bool IsItemForFile(IVsHierarchyItem item, string filePath)
 {
     if (item.IsDisposed)
     {
         return(false);
     }
     return(HierarchyUtilities.IsPhysicalFile(item.HierarchyIdentity) &&
            item.CanonicalName.Equals(filePath, StringComparison.OrdinalIgnoreCase));
 }
Пример #9
0
    public static string GetName(this IVsSolution4 solution, Guid identifier)
    {
        ThreadHelper.ThrowIfNotOnUIThread();

        TryGetHierarchy(solution, identifier, out IVsHierarchy hierarchy);

        if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_Name, out string name))
        {
            return(name);
        }

        return("?");
    }
Пример #10
0
    private static bool IsLoaded(IVsSolution4 solution, Guid identifier)
    {
        ThreadHelper.ThrowIfNotOnUIThread();

        if (solution.TryGetHierarchy(identifier, out IVsHierarchy hierarchy))
        {
            return(!HierarchyUtilities.IsStubHierarchy(hierarchy));
        }
        else
        {
            return(false);
        }
    }
        public IEnumerable <IVsHierarchy> EnumImportingProjects(IVsHierarchy hierarchy)
        {
            IVsSharedAssetsProject sharedAssetsProject;

            if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID7.VSHPROPID_SharedAssetsProject, out sharedAssetsProject) &&
                sharedAssetsProject != null)
            {
                foreach (IVsHierarchy importingProject in sharedAssetsProject.EnumImportingProjects())
                {
                    yield return(importingProject);
                }
            }
        }
        public IVsHierarchy GetActiveProjectContext(IVsHierarchy hierarchy)
        {
            IVsHierarchy activeProjectContext;

            if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID7.VSHPROPID_SharedItemContextHierarchy, out activeProjectContext))
            {
                return(activeProjectContext);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// This function is the callback used to execute a command when the a menu item is clicked.
        /// See the Initialize method to see how the menu item is associated to this function using
        /// the OleMenuCommandService service and the MenuCommand class.
        /// </summary>
        private void MenuItemCallback(object sender, EventArgs e)
        {
            var    sharedHier    = this.FindSharedProject();
            string sharedCaption = HierarchyUtilities.GetHierarchyProperty <string>(sharedHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption);

            this.Output(string.Format("Found shared project: {0}\n", sharedCaption));

            var    activePlatformHier = this.GetActiveProjectContext(sharedHier);
            string activeCaption      = HierarchyUtilities.GetHierarchyProperty <string>(activePlatformHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption);

            this.Output(string.Format("The active platform project: {0}\n", activeCaption));

            this.Output("Platform projects:\n");
            foreach (IVsHierarchy platformHier in this.EnumImportingProjects(sharedHier))
            {
                string platformCaption = HierarchyUtilities.GetHierarchyProperty <string>(platformHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption);
                this.Output(string.Format(" * {0}\n", platformCaption));
            }

            this.Output("Walk the active platform project:\n");
            var sharedItemIds = new List <uint>();

            this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, sharedItemIds);

            var    sharedItemId = sharedItemIds[0];
            string fullPath;

            ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(sharedItemId, out fullPath));
            this.Output(string.Format("Shared item full path: {0}\n", fullPath));

            var dte       = (EnvDTE.DTE) this.GetService(typeof(EnvDTE.DTE));
            var dteEvents = (EnvDTE80.Events2)dte.Events;

            dteEvents.ProjectItemsEvents.ItemRenamed += this.OnItemRenamed;
            HierarchyUtilities.TryGetHierarchyProperty(activePlatformHier, sharedItemId, (int)__VSHPROPID7.VSHPROPID_SharedProjectHierarchy, out sharedHier);

            uint itemIdInSharedHier;
            int  found;

            VSDOCUMENTPRIORITY[] priority = new VSDOCUMENTPRIORITY[1];
            if (ErrorHandler.Succeeded(((IVsProject)sharedHier).IsDocumentInProject(fullPath, out found, priority, out itemIdInSharedHier)) &&
                found != 0)
            {
                var newName = DateTime.Now.Ticks.ToString() + Path.GetExtension(fullPath);
                ErrorHandler.ThrowOnFailure(sharedHier.SetProperty(itemIdInSharedHier, (int)__VSHPROPID.VSHPROPID_EditLabel, newName));
                this.Output(string.Format("Renamed {0} to {1}\n", fullPath, newName));
            }

            dteEvents.ProjectItemsEvents.ItemRenamed -= this.OnItemRenamed;
        }
Пример #14
0
    private static HierarchyNode CreateNode(IVsHierarchy hierarchy, Guid identifier, IVsImageService2 imageService, IVsHierarchyItemManager hierarchyItemManager)
    {
        ThreadHelper.ThrowIfNotOnUIThread();

        ImageMoniker collapsedIcon;
        ImageMoniker expandedIcon;
        string       name;
        bool         isFolder;


        name = HierarchyUtilities.GetHierarchyProperty <string>(
            hierarchy,
            VSConstants.VSITEMID_ROOT,
            (int)__VSHPROPID.VSHPROPID_Name
            );

        isFolder = HierarchyUtilities.IsSolutionFolder(
            hierarchyItemManager.GetHierarchyItem(hierarchy, VSConstants.VSITEMID_ROOT).HierarchyIdentity
            );

        collapsedIcon = imageService.GetImageMonikerForHierarchyItem(
            hierarchy,
            VSConstants.VSITEMID_ROOT,
            (int)__VSHIERARCHYIMAGEASPECT.HIA_Icon
            );

        expandedIcon = imageService.GetImageMonikerForHierarchyItem(
            hierarchy,
            VSConstants.VSITEMID_ROOT,
            (int)__VSHIERARCHYIMAGEASPECT.HIA_OpenFolderIcon
            );

        // Sometimes the icons can be blank.
        // In those cases, use some default icons.
        if (collapsedIcon.Id == 0 && collapsedIcon.Guid == default)
        {
            collapsedIcon = isFolder ? KnownMonikers.FolderClosed : KnownMonikers.DocumentCollection;
        }

        if (expandedIcon.Id == 0 && expandedIcon.Guid == default)
        {
            expandedIcon = isFolder ? KnownMonikers.FolderOpened : KnownMonikers.DocumentCollection;
        }

        return(new HierarchyNode(identifier, name, collapsedIcon, expandedIcon)
        {
            IsLoaded = !HierarchyUtilities.IsStubHierarchy(hierarchy),
            IsFolder = isFolder
        });
    }
Пример #15
0
            // Gets the items to be included from this filter provider.
            // rootItems is a collection that contains the root of your solution
            // Returns a collection of items to be included as part of the filter
            protected override async Task <IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable <IVsHierarchyItem> rootItems)
            {
                IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems);
                IReadOnlyObservableSet <IVsHierarchyItem> sourceItems;

                sourceItems = await _hierarchyCollectionProvider.GetDescendantsAsync(
                    root.HierarchyIdentity.NestedHierarchy,
                    CancellationToken);

                IFilteredHierarchyItemSet includedItems = await _hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(
                    sourceItems,
                    _shouldInclude == null?(Predicate <IVsHierarchyItem>) ShouldIncludeInFilterByRegex : (Predicate <IVsHierarchyItem>)ShouldIncludeInFilterByFunc,
                    CancellationToken);

                return(includedItems);
            }
Пример #16
0
            private bool ShouldIncludeInFilter(IVsHierarchyItem hierarchyItem)
            {
                ThreadHelper.ThrowIfNotOnUIThread();
                if (hierarchyItem == null)
                {
                    return(false);
                }

                if (HierarchyUtilities.IsPhysicalFile(hierarchyItem.HierarchyIdentity) ||
                    HierarchyUtilities.IsProject(hierarchyItem.HierarchyIdentity))
                {
                    var absoluteFilePath = string.Empty;
                    if (HierarchyUtilities.IsPhysicalFile(hierarchyItem.HierarchyIdentity))
                    {
                        absoluteFilePath = hierarchyItem.CanonicalName;
                    }
                    else if (HierarchyUtilities.IsProject(hierarchyItem.HierarchyIdentity))
                    {
                        hierarchyItem.HierarchyIdentity.Hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out var prjObject);
                        if (prjObject is EnvDTE.Project project)
                        {
                            absoluteFilePath = project.FullName;
                        }
                    }

                    if (!string.IsNullOrEmpty(absoluteFilePath))
                    {
                        DiffResultItem diffResultItem = this.branchDiffWorker.GetItemFromChangeSet(this.changeSet, hierarchyItem.CanonicalName);

                        if (diffResultItem != null)
                        {
                            // Tag the old path so we find the Base branch version of file using the Old Path (for files renamed in the working branch)
                            if (!string.IsNullOrEmpty(diffResultItem.OldAbsoluteFilePath))
                            {
                                BranchDiffFilterProvider.TagManager.SetOldFilePathOnRenamedItem(
                                    hierarchyItem.HierarchyIdentity.Hierarchy,
                                    hierarchyItem.CanonicalName,
                                    diffResultItem.OldAbsoluteFilePath);
                            }

                            return(true);
                        }
                    }
                }

                return(false);
            }
Пример #17
0
        /// <summary>
        /// Returns the <see cref="IVsSharedAssetsProject"/> for the <see cref="IVsHierarchy"/>.
        /// </summary>
        /// <param name="hierarchy"></param>
        public static IVsSharedAssetsProject?GetSharedAssetsProject(this IVsHierarchy hierarchy)
        {
            if (hierarchy == null)
            {
                throw new ArgumentNullException(nameof(hierarchy));
            }

            ThreadHelper.ThrowIfNotOnUIThread();

            HierarchyUtilities.TryGetHierarchyProperty <IVsSharedAssetsProject>(
                hierarchy,
                (uint)VSConstants.VSITEMID.Root,
                (int)__VSHPROPID7.VSHPROPID_SharedAssetsProject,
                out IVsSharedAssetsProject? sharedAssetsProject);

            return(sharedAssetsProject);
        }
Пример #18
0
        private bool TryGetManager(out IVsReferenceManagerUser manager)
        {
            _project.GetItemInfo(out IVsHierarchy hierarchy, out uint itemId, out _);

            IVsReferenceManagerUser?value = HierarchyUtilities.GetHierarchyProperty <IVsReferenceManagerUser?>(
                hierarchy,
                itemId,
                (int)__VSHPROPID5.VSHPROPID_ReferenceManagerUser
                );

            if (value is not null)
            {
                manager = value;
                return(true);
            }

            manager = null !;
            return(false);
        }
Пример #19
0
        /// <inheritdoc/>
        public void UnicastInitialMessages(IPEndPoint endPoint)
        {
            for (var i = 0; i < instantiatedObjects.Count; i++)
            {
                var instantiatedObject = instantiatedObjects[i];
                if (instantiatedObject.DistributedObject == null)
                {
                    continue;
                }

                var message = GetInstantiationMessage(
                    instantiatedObject.PrefabId,
                    HierarchyUtilities.GetRelativePath(
                        transform,
                        instantiatedObject.DistributedObject.transform),
                    instantiatedObject.DistributedObject.name);
                UnicastMessage(endPoint, message);
                instantiatedObject.DistributedObject.UnicastInitialMessages(endPoint);
            }
        }
Пример #20
0
    private static Guid GetParentIdentifier(IVsSolution solution, IVsHierarchy hierarchy)
    {
        IVsHierarchy?parentHierarchy;


        ThreadHelper.ThrowIfNotOnUIThread();

        parentHierarchy = HierarchyUtilities.GetHierarchyProperty <IVsHierarchy?>(
            hierarchy,
            VSConstants.VSITEMID_ROOT,
            (int)__VSHPROPID.VSHPROPID_ParentHierarchy
            );

        if (parentHierarchy is not null)
        {
            if (TryGetIdentifier(solution, parentHierarchy, out Guid parentIdentifier))
            {
                return(parentIdentifier);
            }
        }

        return(default);
Пример #21
0
            // Gets the items to be included from this filter provider.
            // rootItems is a collection that contains the root of your solution
            // Returns a collection of items to be included as part of the filter
            protected override async Task <IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable <IVsHierarchyItem> rootItems)
            {
                // get default hierarchy
                var root        = HierarchyUtilities.FindCommonAncestor(rootItems);
                var sourceItems = await _hierarchyCollectionProvider.GetDescendantsAsync(
                    root.HierarchyIdentity.NestedHierarchy,
                    CancellationToken);

                // switch thread context
                await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(CancellationToken);

                // get diff stats
                var stats = GetRepoStats();

                if (stats == null)
                {
                    return(sourceItems);
                }
                return(await _hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(
                           sourceItems,
                           ShouldIncludeInFilter(stats),
                           CancellationToken));
            }
Пример #22
0
        /// <summary>
        /// Instantiates selected prefab in the unique relative path
        /// </summary>
        /// <param name="prefabId">Id of instantiated prefab in <see cref="NetworkSettings.DistributedObjectPrefabs"/></param>
        /// <param name="relativePath">Relative path to the root where object will be created, can be changed if object name is not unique</param>
        /// <returns>Instantiated new distributed object</returns>
        /// <exception cref="ArgumentException">Invalid configuration of the instantiated prefab</exception>
        private DistributedObject InstantiatePrefab(int prefabId, string relativePath)
        {
            if (prefabId < 0 || prefabId >= Settings.DistributedObjectPrefabs.Length)
            {
                throw new ArgumentException(
                          $"Prefab of distributed object with id {prefabId} is not defined in {typeof(NetworkSettings).Name}.");
            }

            var distributedObjectParent = HierarchyUtilities.GetOrCreateChild(transform, relativePath);
            var newGameObject           = Instantiate(Settings.DistributedObjectPrefabs[prefabId], distributedObjectParent);

            HierarchyUtilities.ChangeToUniqueName(newGameObject);
            var distributedObject = newGameObject.GetComponent <DistributedObject>();

            if (distributedObject == null)
            {
                throw new ArgumentException(
                          $"Prefab of distributed object with id {prefabId} has no {typeof(DistributedObject).Name} component in the root game object.");
            }

            instantiatedObjects.Add(new InstantiatedObjectData(prefabId, distributedObject));
            return(distributedObject);
        }
Пример #23
0
            protected override async Task <IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable <IVsHierarchyItem> rootItems)
            {
                if (BranchDiffFilterValidator.ValidateBranch(this.package))
                {
                    // Create new tag tables everytime the filter is applied
                    BranchDiffFilterProvider.TagManager.CreateTagTables();
                    IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems);

                    if (BranchDiffFilterValidator.ValidateSolution(this.solutionDirectory, this.solutionFile))
                    {
                        try
                        {
                            // TODO: The solution directory path may not always be the Git repo path!
                            // Git repo could be setup higher up. Write a service to find the Git repo upwards in the heirarchy and pass that here.
                            this.changeSet = this.branchDiffWorker.GenerateDiff(this.solutionDirectory, this.package.BranchToDiffAgainst);
                        }
                        catch (GitOperationException e)
                        {
                            ErrorPresenter.ShowError(e.Message);
                            return(null);
                        }

                        IReadOnlyObservableSet <IVsHierarchyItem> sourceItems = await this.vsHierarchyItemCollectionProvider.GetDescendantsAsync(
                            root.HierarchyIdentity.NestedHierarchy,
                            CancellationToken);

                        IFilteredHierarchyItemSet includedItems = await this.vsHierarchyItemCollectionProvider.GetFilteredHierarchyItemsAsync(
                            sourceItems,
                            ShouldIncludeInFilter,
                            CancellationToken);

                        return(includedItems);
                    }
                }

                return(null);
            }
Пример #24
0
            // Gets the items to be included from this filter provider.
            // rootItems is a collection that contains the root of your solution
            // Returns a collection of items to be included as part of the filter
            protected override async Task <IReadOnlyObservableSet> GetIncludedItemsAsync(IEnumerable <IVsHierarchyItem> rootItems)
            {
                IVsHierarchyItem root = HierarchyUtilities.FindCommonAncestor(rootItems);
                IReadOnlyObservableSet <IVsHierarchyItem> sourceItems;

                sourceItems = await hierarchyCollectionProvider.GetDescendantsAsync(
                    root.HierarchyIdentity.NestedHierarchy,
                    CancellationToken);

                IFilteredHierarchyItemSet includedItems = await hierarchyCollectionProvider.GetFilteredHierarchyItemsAsync(
                    sourceItems,
                    FilesWithBookmarksFilteredHierarchyItemSet.IsFileWithBookmarks,
                    CancellationToken);

                var wrapper = new FilesWithBookmarksFilteredHierarchyItemSet(sourceItems, includedItems);

                if (FilesWithBookmarksFilteredHierarchyItemSet.Instance != null)
                {
                    FilesWithBookmarksFilteredHierarchyItemSet.Instance.Dispose();
                }
                FilesWithBookmarksFilteredHierarchyItemSet.Instance = wrapper;

                return(wrapper);
            }
Пример #25
0
    public GameObject SpawnAgent(AgentConfig config)
    {
        var go = Instantiate(config.Prefab, transform);

        go.name = config.Name;
        var agentController = go.GetComponent <AgentController>();

        agentController.SensorsChanged += AgentControllerOnSensorsChanged;
        agentController.Config          = config;
        agentController.Config.AgentGO  = go;
        SIM.LogSimulation(SIM.Simulation.VehicleStart, config.Name);

        ActiveAgents.Add(agentController.Config);
        agentController.GTID        = ++SimulatorManager.Instance.GTIDs;
        agentController.Config.GTID = agentController.GTID;

        BridgeClient bridgeClient = null;

        if (config.Bridge != null)
        {
            bridgeClient = go.AddComponent <BridgeClient>();
            bridgeClient.Init(config.Bridge);

            if (config.Connection != null)
            {
                var split = config.Connection.Split(':');
                if (split.Length != 2)
                {
                    throw new Exception("Incorrect bridge connection string, expected HOSTNAME:PORT");
                }
                bridgeClient.Connect(split[0], int.Parse(split[1]));
            }
        }
        SIM.LogSimulation(SIM.Simulation.BridgeTypeStart, config.Bridge != null ? config.Bridge.Name : "None");
        var sensorsController = go.AddComponent <SensorsController>();

        agentController.AgentSensorsController = sensorsController;
        sensorsController.SetupSensors(config.Sensors);

        //Add required components for distributing rigidbody from master to clients
        var network = Loader.Instance.Network;

        if (network.IsClusterSimulation)
        {
            HierarchyUtilities.ChangeToUniqueName(go);
            if (network.IsClient)
            {
                //Disable controller and dynamics on clients so it will not interfere mocked components
                agentController.enabled = false;
                var vehicleDynamics = agentController.GetComponent <IVehicleDynamics>() as MonoBehaviour;
                if (vehicleDynamics != null)
                {
                    vehicleDynamics.enabled = false;
                }
            }

            //Change the simulation type only if it's not set in the prefab
            var distributedRigidbody = go.GetComponent <DistributedRigidbody>();
            if (distributedRigidbody == null)
            {
                distributedRigidbody = go.AddComponent <DistributedRigidbody>();
                distributedRigidbody.SimulationType = DistributedRigidbody.MockingSimulationType.ExtrapolateVelocities;
            }

            //Add the rest required components for cluster simulation
            ClusterSimulationUtilities.AddDistributedComponents(go);
        }

        go.transform.position = config.Position;
        go.transform.rotation = config.Rotation;
        agentController.Init();

#if UNITY_EDITOR
        // TODO remove hack for editor opaque with alpha clipping 2019.3.3
        Array.ForEach(go.GetComponentsInChildren <Renderer>(), renderer =>
        {
            foreach (var m in renderer.materials)
            {
                m.shader = Shader.Find(m.shader.name);
            }
        });

        Array.ForEach(go.GetComponentsInChildren <DecalProjector>(), decal =>
        {
            decal.material.shader = Shader.Find(decal.material.shader.name);
        });
#endif

        return(go);
    }
Пример #26
0
 /// <summary>
 /// Tries to get a property from a hierarchy item.
 /// </summary>
 /// <remarks>
 /// Inspired by https://github.com/dotnet/roslyn/blob/main/src/VisualStudio/Core/Def/Implementation/ProjectSystem/Extensions/IVsHierarchyExtensions.cs
 /// </remarks>
 public static bool TryGetItemProperty <T>(this IVsHierarchy hierarchy, uint itemId, int propertyId, out T?value)
 {
     return(HierarchyUtilities.TryGetHierarchyProperty <T>(hierarchy, itemId, propertyId, out value));
 }
Пример #27
0
    public GameObject SpawnAgent(AgentConfig config)
    {
        var go = Instantiate(config.Prefab, transform);

        go.name = config.Name;
        // set it inactive until we can be sure setting up sensors etc worked without exceptions and it AgentController was initialized
        go.SetActive(false);
        var controller = go.GetComponent <IAgentController>();

        if (controller == null)
        {
            Debug.LogWarning($"{nameof(IAgentController)} implementation not found on the {config.Name} vehicle. This vehicle can't be used as an ego vehicle.");
        }
        else
        {
            controller.Config         = config;
            controller.Config.AgentGO = go;
            ActiveAgents.Add(controller.Config);
            controller.GTID        = ++SimulatorManager.Instance.GTIDs;
            controller.Config.GTID = controller.GTID;
        }

        var lane = go.AddComponent <VehicleLane>();

        var baseLink = go.GetComponentInChildren <BaseLink>();

        if (baseLink == null)
        {
            baseLink = new GameObject("BaseLink").AddComponent <BaseLink>();
            baseLink.transform.SetParent(go.transform, false);
        }

        var sensorsController = go.GetComponent <ISensorsController>() ?? go.AddComponent <SensorsController>();

        if (controller != null)
        {
            controller.AgentSensorsController = sensorsController;
        }

        //Add required components for distributing rigidbody from master to clients
        var network = Loader.Instance.Network;

        if (network.IsClusterSimulation)
        {
            HierarchyUtilities.ChangeToUniqueName(go);

            //Add the rest required components for cluster simulation
            ClusterSimulationUtilities.AddDistributedComponents(go);
            if (network.IsClient)
            {
                controller?.DisableControl();
            }
        }

        BridgeClient bridgeClient = null;

        if (config.BridgeData != null)
        {
            var dir = Path.Combine(Simulator.Web.Config.PersistentDataPath, "Bridges");
            var vfs = VfsEntry.makeRoot(dir);
            Simulator.Web.Config.CheckDir(vfs.GetChild(config.BridgeData.AssetGuid), Simulator.Web.Config.LoadBridgePlugin);

            bridgeClient  = go.AddComponent <BridgeClient>();
            config.Bridge = BridgePlugins.Get(config.BridgeData.Type);
            bridgeClient.Init(config.Bridge);

            if (!String.IsNullOrEmpty(config.Connection))
            {
                bridgeClient.Connect(config.Connection);
            }
        }

        go.transform.position = config.Position;
        go.transform.rotation = config.Rotation;
        sensorsController.SetupSensors(config.Sensors);

        controller?.Init();

        if (SimulatorManager.Instance.IsAPI)
        {
            SimulatorManager.Instance.EnvironmentEffectsManager.InitRainVFX(go.transform);
        }

        go.SetActive(true);
        return(go);
    }
Пример #28
0
    public GameObject SpawnAgent(AgentConfig config)
    {
        var go = Instantiate(config.Prefab, transform);

        go.name = config.Name;
        // set it inactive until we can be sure setting up sensors etc worked without exceptions and it AgentController was initialized
        go.SetActive(false);
        var agentController = go.GetComponent <AgentController>();

        agentController.Config         = config;
        agentController.Config.AgentGO = go;

        var lane = go.AddComponent <VehicleLane>();

        var baseLink = go.GetComponentInChildren <BaseLink>();

        if (baseLink == null)
        {
            baseLink = new GameObject("BaseLink").AddComponent <BaseLink>();
            baseLink.transform.SetParent(go.transform, false);
        }

        ActiveAgents.Add(agentController.Config);
        agentController.GTID        = ++SimulatorManager.Instance.GTIDs;
        agentController.Config.GTID = agentController.GTID;

        BridgeClient bridgeClient = null;

        if (config.Bridge != null)
        {
            bridgeClient = go.AddComponent <BridgeClient>();
            bridgeClient.Init(config.Bridge);

            if (!String.IsNullOrEmpty(config.Connection))
            {
                bridgeClient.Connect(config.Connection);
            }
        }
        var sensorsController = go.AddComponent <SensorsController>();

        agentController.AgentSensorsController = sensorsController;

        //Add required components for distributing rigidbody from master to clients
        var network = Loader.Instance.Network;

        if (network.IsClusterSimulation)
        {
            HierarchyUtilities.ChangeToUniqueName(go);
            if (network.IsClient)
            {
                //Disable controller and dynamics on clients so it will not interfere mocked components
                agentController.enabled = false;
                var vehicleDynamics = agentController.GetComponent <IVehicleDynamics>() as MonoBehaviour;
                if (vehicleDynamics != null)
                {
                    vehicleDynamics.enabled = false;
                }
            }

            //Change the simulation type only if it's not set in the prefab
            var distributedRigidbody = go.GetComponent <DistributedRigidbody>();
            if (distributedRigidbody == null)
            {
                distributedRigidbody = go.AddComponent <DistributedRigidbody>();
                distributedRigidbody.SimulationType = DistributedRigidbody.MockingSimulationType.ExtrapolateVelocities;
            }

            //Add the rest required components for cluster simulation
            ClusterSimulationUtilities.AddDistributedComponents(go);
        }

        go.transform.position = config.Position;
        go.transform.rotation = config.Rotation;
        sensorsController.SetupSensors(config.Sensors);
        agentController.Init();

        go.SetActive(true);
        return(go);
    }