private void CreateOptions() { var inlinedefs = PreProcOptionsHelper.Instance.DefinedInline.Matches(ShaderText); foreach (Match match in inlinedefs) { var defname = match.Groups["name"].Value; if (Root.FlatOptions.Any(o => o.Name == defname)) { continue; } var linerange = ShaderText.LineRangeFromCharIndex(match.Index); var defargsmatch = PreProcOptionsHelper.Instance.DefinedArgs.Match(ShaderText, linerange.Start, linerange.Length); if (!defargsmatch.Success) { continue; } PreProcOptionArgs defargs; try { var defargstext = Args.Convert(defargsmatch.Groups["args"].Value.Trim()); defargs = Args.Parse <PreProcOptionArgs>(defargstext); } catch (Exception e) { continue; } Root.DefineExtract += ShaderText.Substring(linerange.Start, linerange.Length).Trim() + "\n"; var option = new PreProcOption { Name = defname, Value = "0", Arguments = defargs, OrderInGroup = 0, Type = defargs.GetTypeAt(0) }; if (option.Type == PreProcOptionType.Switch || option.Type == PreProcOptionType.Bool) { option.Arguments.Pin.Min = 0; option.Arguments.Pin.Max = 1; } Root.FlatOptions.Add(option); Options.Add(option); var defGroupContent = ShaderText.Remove(0, linerange.Start); defGroupContent = defGroupContent.Remove(ShaderText.IndexOf("#endif", linerange.Start, StringComparison.InvariantCultureIgnoreCase) - linerange.Start); var defGroup = PreProcOptionsHelper.Instance.DefaultDefines.Matches(defGroupContent); int i = 0; foreach (Match groupmember in defGroup) { var gdefname = groupmember.Groups["name"].Value; if (gdefname == defname) { option.OrderInGroup = i; option.Type = defargs.GetTypeAt(i); option.Value = groupmember.Groups["value"].Value; if (option.Type == PreProcOptionType.String) { option.Value = option.Value.Trim('"'); } } else { if (Root.FlatOptions.Any(o => o.Name == gdefname)) { continue; } var goption = new PreProcOption { Name = gdefname, Value = groupmember.Groups["value"].Value, Arguments = defargs, OrderInGroup = i, Type = defargs.GetTypeAt(i) }; if (goption.Type == PreProcOptionType.String) { goption.Value = goption.Value.Trim('"'); } if (goption.Type == PreProcOptionType.Switch || goption.Type == PreProcOptionType.Bool) { goption.Arguments.Pin.Min = 0; goption.Arguments.Pin.Max = 1; } Root.FlatOptions.Add(goption); Options.Add(goption); } var gdefline = defGroupContent.LineRangeFromCharIndex(groupmember.Groups["name"].Index); Root.DefineExtract += defGroupContent.Substring(gdefline.Start, gdefline.Length).Trim() + "\n"; i++; } Root.DefineExtract += "#endif\n"; } }
public FontRenderer() { Shader = new ShaderText(); }