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"); } }