- more work on our own ContentPipeline implementation: effect files are now imported, processed (compiled using fxc.exe) and serialized to a .xnb file. Needs testing...
81 lines
2.6 KiB
C#
81 lines
2.6 KiB
C#
#region Using Statements
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
using System.Text.RegularExpressions;
|
|
using System.Runtime.InteropServices;
|
|
|
|
#endregion
|
|
|
|
namespace ANX.Framework.Content.Pipeline.Processors
|
|
{
|
|
public class HLSLCompilerFactory
|
|
{
|
|
private List<HLSLCompiler> compilers = new List<HLSLCompiler>();
|
|
|
|
public IEnumerable<HLSLCompiler> Compilers
|
|
{
|
|
get
|
|
{
|
|
if (compilers == null || compilers.Count <= 0)
|
|
{
|
|
HashSet<HLSLCompiler> tempCompilers = new HashSet<HLSLCompiler>();
|
|
HLSLCompilerExecutables.All(x => tempCompilers.Add(x)); // deduplicate list
|
|
compilers = new List<HLSLCompiler>(tempCompilers);
|
|
compilers.Sort();
|
|
}
|
|
|
|
foreach (HLSLCompiler compiler in compilers)
|
|
{
|
|
yield return compiler;
|
|
}
|
|
}
|
|
}
|
|
|
|
private IEnumerable<string> ExecutablePaths
|
|
{
|
|
get
|
|
{
|
|
foreach (String subdir in new String[] { "x64", "x86" })
|
|
{
|
|
string sdkPath = Environment.GetEnvironmentVariable("DXSDK_DIR");
|
|
if (String.IsNullOrEmpty(sdkPath) == false)
|
|
{
|
|
yield return Path.Combine(sdkPath, subdir);
|
|
}
|
|
|
|
foreach (String programFilesPath in new String[] { Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
|
|
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) })
|
|
{
|
|
yield return Path.Combine(Path.Combine(programFilesPath, @"Windows Kits\8.0\bin\"), subdir);
|
|
yield return Path.Combine(Path.Combine(programFilesPath, @"Microsoft DirectX SDK (June 2010)\Utilities\bin\"), subdir);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private IEnumerable<HLSLCompiler> HLSLCompilerExecutables
|
|
{
|
|
get
|
|
{
|
|
string fxcFile;
|
|
|
|
foreach (string path in ExecutablePaths)
|
|
{
|
|
fxcFile = Path.Combine(path, @"fxc.exe");
|
|
|
|
if (File.Exists(fxcFile))
|
|
{
|
|
yield return new HLSLCompiler(fxcFile);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|