Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DefaultIncludeHandler.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 using System.IO;
6 
7 namespace SiliconStudio.Shaders.Parser
8 {
9  /// <summary>
10  /// Default <see cref="IncludeHandler"/> implementation loading files from a set of predefined directories.
11  /// </summary>
13  {
14  private Stack<string> CurrentDirectory;
15  private List<string> includeDirectories;
16  private HashSet<FileStream> files;
17 
18  /// <summary>
19  /// Initializes a new instance of the <see cref="DefaultIncludeHandler"/> class.
20  /// </summary>
22  {
23  CurrentDirectory = new Stack<string>();
24  includeDirectories = new List<string>();
25  files = new HashSet<FileStream>();
26  }
27 
28 
29  /// <summary>
30  /// Gets the include directories used by this handler.
31  /// </summary>
32  public string[] IncludeDirectories
33  {
34  get
35  {
36  return includeDirectories.ToArray();
37  }
38  }
39 
40  /// <summary>
41  /// Adds the directory.
42  /// </summary>
43  /// <param name="directory">The directory.</param>
44  public void AddDirectory(string directory)
45  {
46  if (includeDirectories.Count > 0)
47  {
48  if (string.Compare(includeDirectories[0], directory, StringComparison.InvariantCultureIgnoreCase) == 0)
49  return;
50  }
51 
52  includeDirectories.Add(directory);
53  }
54 
55  /// <summary>
56  /// Adds the directories.
57  /// </summary>
58  public void AddDirectories(IEnumerable<string> directories)
59  {
60  foreach (var directory in directories)
61  AddDirectory(directory);
62  }
63 
64  /// <summary>
65  /// Finds the full path for filename from the set of <see cref="IncludeDirectories"/> defined.
66  /// </summary>
67  /// <param name="name">The filename.</param>
68  /// <returns>The full filepath or null if file was not found</returns>
69  public string FindFullPathForFilename(string name)
70  {
71  var directories = new List<string>();
72  directories.AddRange(includeDirectories);
73  if (CurrentDirectory.Count > 0)
74  directories.Add(CurrentDirectory.Peek());
75 
76  for (int i = directories.Count - 1; i >= 0; i--)
77  {
78  var includeDirectory = directories[i];
79  string filePath = Path.Combine(includeDirectory, name);
80  if (File.Exists(filePath))
81  return filePath;
82  }
83  return null;
84  }
85 
86  public Stream Open(IncludeType type, string fileName, Stream parentStream)
87  {
88  string filePath = FindFullPathForFilename(fileName);
89  if (filePath != null)
90  {
91  var dirPath = Path.GetDirectoryName(filePath);
92  CurrentDirectory.Push(dirPath);
93  return new FileStream(filePath, FileMode.Open, FileAccess.Read);
94  }
95  Console.WriteLine("Warning, unable to find include file [{0}] from directories [{1}]", fileName, string.Join(" ; ", IncludeDirectories));
96  return null;
97  }
98 
99  public void Close(Stream stream)
100  {
101  stream.Close();
102  CurrentDirectory.Pop();
103  }
104  }
105 }
void AddDirectory(string directory)
Adds the directory.
Default IncludeHandler implementation loading files from a set of predefined directories.
System.IO.FileMode FileMode
Definition: ScriptSync.cs:33
Stream Open(IncludeType type, string fileName, Stream parentStream)
A user-implemented method for opening and reading the contents of a shader #include file...
void AddDirectories(IEnumerable< string > directories)
Adds the directories.
IncludeType
Type of include file.
Definition: IncludeType.cs:8
System.IO.File File
DefaultIncludeHandler()
Initializes a new instance of the DefaultIncludeHandler class.
string FindFullPathForFilename(string name)
Finds the full path for filename from the set of IncludeDirectories defined.
Callback interface to handle included file requested by the PreProcessor.
void Close(Stream stream)
A user-implemented method for closing a shader #include file.