Ejemplo n.º 1
0
        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";
            }
        }
Ejemplo n.º 2
0
 public FontRenderer()
 {
     Shader = new ShaderText();
 }