private void NavigateToShader(ShaderViewModel s)
 {
     if (s != null)
     {
         SetShaderCode(s);
         forwardStack.Push(s);
     }
 }
 private static IEnumerable <ShaderViewModel> ShadersInPostOrder(ShaderViewModel shader)
 {
     foreach (var child in shader.DerivedShaders)
     {
         foreach (var s in ShadersInPostOrder(child))
         {
             yield return(s);
         }
     }
     yield return(shader);
 }
        private void SetShaderCode(ShaderViewModel shader, bool isNavigation = false)
        {
            if (shader != null)
            {
                ViewModel.SelectedShader = shader;

                if (!isNavigation)
                {
                    backStack.Push(shader);
                    BackButton.IsEnabled = backStack.Count > 1;
                    forwardStack.Clear();
                    ForwardButton.IsEnabled = false;
                }
            }
        }
        public bool FindMember(string name, ShaderViewModel shader, out MemberList mems, out List <ShaderViewModel> scopedShaders)
        {
            mems          = null;
            scopedShaders = null;
            var result = members.TryGetValue(name, out var memberCandidates);

            if (result)
            {
                // defined locally?
                if (memberCandidates.TryGetValue(shader, out mems))
                {
                }

                //find base shaders that defines the member, could be multiple for method overrides
                scopedShaders = new List <ShaderViewModel>();
                var definingShader = shader;
                foreach (var baseShader in shader.BaseShaders)
                {
                    if (memberCandidates.TryGetValue(baseShader, out var ms))
                    {
                        //find highest definition in hierarchy
                        if (definingShader.BaseShaders.Contains(baseShader))
                        {
                            mems = ms;
                        }

                        scopedShaders.Add(baseShader);
                    }
                }

                //also add derived shaders
                foreach (var derivedShader in shader.DerivedShaders)
                {
                    if (memberCandidates.TryGetValue(derivedShader, out var _))
                    {
                        scopedShaders.Add(derivedShader);
                    }
                }
            }

            return(result);
        }
        private IEnumerable <ShaderViewModel> BuildShaderTree()
        {
            var files = Paths.Where(p => !string.IsNullOrWhiteSpace(p) && Directory.Exists(p))
                        .SelectMany(path => Directory.GetFiles(path, "*.sdsl", SearchOption.AllDirectories));

            shaders.Clear();
            var duplicates = new Dictionary <string, ShaderViewModel>();

            foreach (var file in files)
            {
                var name = Path.GetFileNameWithoutExtension(file);
                if (!shaders.ContainsKey(name))
                {
                    shaders[name] = new ShaderViewModel {
                        Path = file, Name = name
                    }
                }
                ;
                else
                {
                    duplicates[name] = new ShaderViewModel {
                        Path = file, Name = name
                    }
                };
            }

            foreach (var shader in shaders.Values)
            {
                if (EffectUtils.TryParseEffect(shader.Name, shaders, out var parsedShader))
                {
                    var baseShaderNames = parsedShader.BaseShaders.Select(s => s.ShaderClass.Name.Text).ToList();
                    shader.ParsedShader = parsedShader;

                    // get all declrarations in this shader
                    foreach (var m in parsedShader.ShaderClass.Members.OfType <IDeclaration>() ?? Enumerable.Empty <IDeclaration>())
                    {
                        var mn = m.Name.Text;
                        if (string.IsNullOrWhiteSpace(mn))
                        {
                            continue;
                        }

                        if (!members.TryGetValue(mn, out var memberCandidates))
                        {
                            memberCandidates = new Dictionary <ShaderViewModel, MemberList>();
                        }

                        if (!memberCandidates.TryGetValue(shader, out var mems))
                        {
                            mems = new MemberList();
                        }

                        mems.Add(new MemberViewModel(mn, m));

                        memberCandidates[shader] = mems;
                        members[mn] = memberCandidates;
                    }

                    if (baseShaderNames.Count > 0)
                    {
                        var baseShaders = baseShaderNames
                                          .Select(s => shaders.TryGetValue(s, out var b) ? b : null)
                                          .Where(s => s != null);

                        foreach (var baseShader in baseShaders)
                        {
                            shader.BaseShaders.Add(baseShader);
                            baseShader.DerivedShaders.Add(shader);
                            if (_directParentsOnly)
                            {
                                if (parsedShader.ShaderClass.BaseClasses.FirstOrDefault(bc => bc.Name.Text == baseShader.Name) != null)
                                {
                                    baseShader.TreeViewChildren.Add(shader);
                                }
                            }
                            else
                            {
                                baseShader.TreeViewChildren.Add(shader);
                            }
                        }
                    }
                    else
                    {
                        yield return(shader);
                    }
                }
            }

            Debug.WriteLine($"Found {shaders.Count} shaders");
        }
    }