public override void Reload(IResourceCache cache, ResourcePath path, CancellationToken ct = default)
        {
            ct = ct != default ? ct : new CancellationTokenSource(30000).Token;

            for (;;)
            {
                try
                {
                    using var stream = cache.ContentFileRead(path);
                    using var reader = new StreamReader(stream, EncodingHelpers.UTF8);
                    ParsedShader     = ShaderParser.Parse(reader, cache);
                    break;
                }
                catch (IOException ioe)
                {
                    if (!PathHelpers.IsFileInUse(ioe))
                    {
                        throw;
                    }

                    ct.ThrowIfCancellationRequested();

                    Thread.Sleep(3);
                }
            }

            var clyde = IoCManager.Resolve <IClydeInternal>();

            clyde.ReloadShader(ClydeHandle, ParsedShader);
        }
        public override void Load(IResourceCache cache, ResourcePath path)
        {
            using (var stream = cache.ContentFileRead(path))
                using (var reader = new StreamReader(stream, EncodingHelpers.UTF8))
                {
                    ParsedShader = ShaderParser.Parse(reader, cache);
                }

            var clyde = IoCManager.Resolve <IClydeInternal>();

            ClydeHandle = clyde.LoadShader(ParsedShader, path.ToString());
        }
        public override void Load(IResourceCache cache, ResourcePath path)
        {
            using (var stream = cache.ContentFileRead(path))
                using (var reader = new StreamReader(stream, Encoding.UTF8))
                {
                    ParsedShader = ShaderParser.Parse(reader);
                }

            switch (GameController.Mode)
            {
            case GameController.DisplayMode.Headless:
                return;

            case GameController.DisplayMode.Godot:
                GodotShader = new Godot.Shader
                {
                    Code = _getGodotCode(),
                };
                break;

            case GameController.DisplayMode.Clyde:
                ClydeHandle = IoCManager.Resolve <IClyde>().LoadShader(ParsedShader);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (GameController.OnGodot)
            {
                GodotShader = new Godot.Shader
                {
                    Code = _getGodotCode(),
                };
            }
            else
            {
                var clyde = IoCManager.Resolve <IClyde>();
                // TODO: vertex shaders.
                ClydeHandle = clyde.LoadShader(ParsedShader, path.ToString());
            }
        }
Пример #4
0
        public override ShaderContent Import(string filename, ContentImporterContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentException("Filename cannot be null or empty.", "filename");
            }
            FileInfo info = new FileInfo(filename);

            if (!info.Exists)
            {
                throw new FileNotFoundException("File not found", filename);
            }

            ContentIdentity identity = new ContentIdentity(info.FullName, ImporterName);

            string text = File.ReadAllText(filename);

            Lexer lexer = new Lexer(filename, text);

            lexer.Error += (sender, e) => ThrowParserException(e, info);
            Token[] tokens = lexer.GetTokens();

            ShaderParser parser = new ShaderParser(filename, tokens);

            parser.Error += (sender, e) => ThrowParserException(e, info);

            ShaderNode    shaderNode = parser.Parse();
            ShaderContent content    = new ShaderContent
            {
                ShaderNode = shaderNode
            };

            content.Identity = identity;
            return(content);
        }
Пример #5
0
        public void CanParseShader()
        {
            // Arrange.
            const string path   = "Resources/Shaders/Flat-Diffuse.shader";
            var          tokens = new Lexer(path, File.ReadAllText(path)).GetTokens();
            var          parser = new ShaderParser(path, tokens);

            parser.Error += (sender, args) =>
            {
                throw new Exception(args.Message + Environment.NewLine + args.Position);
            };

            // Act.
            var shaderNode = parser.Parse();

            // Assert.
            Assert.That(shaderNode, Is.Not.Null);
            Assert.That(shaderNode.Name, Is.EqualTo("Flat"));
            Assert.That(shaderNode.Properties, Has.Count.EqualTo(2));
            Assert.That(shaderNode.Technique, Is.Not.Null);
            Assert.That(shaderNode.Technique.State, Is.Not.Null);
            Assert.That(shaderNode.Technique.State.CullMode, Is.EqualTo(CullMode.CullClockwiseFace));
            Assert.That(shaderNode.Technique.State.FillMode, Is.Null);
            Assert.That(shaderNode.Technique.State.DepthBias, Is.EqualTo(0.001f));
            Assert.That(shaderNode.Technique.State.SlopeScaleDepthBias, Is.EqualTo(0.001f));
            Assert.That(shaderNode.Technique.State.DepthBufferFunction, Is.EqualTo(CompareFunction.LessEqual));
            Assert.That(shaderNode.Technique.State.DepthBufferWriteEnable, Is.True);
            Assert.That(shaderNode.Technique.State.DepthBufferEnable, Is.False);
            Assert.That(shaderNode.Technique.State.AlphaBlendFunction, Is.EqualTo(BlendFunction.Add));
            Assert.That(shaderNode.Technique.State.AlphaDestinationBlend, Is.EqualTo(Blend.One));
            Assert.That(shaderNode.Technique.State.AlphaSourceBlend, Is.EqualTo(Blend.Zero));
            Assert.That(shaderNode.Technique.State.ColorBlendFunction, Is.EqualTo(BlendFunction.Min));
            Assert.That(shaderNode.Technique.State.ColorDestinationBlend, Is.EqualTo(Blend.SourceAlpha));
            Assert.That(shaderNode.Technique.State.ColorSourceBlend, Is.EqualTo(Blend.SourceColor));
            Assert.That(shaderNode.Technique.Surface, Is.Not.Null);
            Assert.That(shaderNode.Technique.Surface.LightingModel, Is.EqualTo("FlatShading"));
        }