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