Files
sbox-public/engine/Tools/ShaderProc/Program.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

77 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
namespace Facepunch.ShaderProc
{
public class Program
{
public static void Process( string directory )
{
var defPath = Path.Combine( directory, "Definitions", "shaders.def" );
var defs = Definition.FromFile( defPath );
if ( defs is null )
throw new Exception( "Definition files was not found!" );
// TODO This is scuffed shaderdir and InteropOutput handling and should be improved
var shaderDir = Path.Combine( directory, defs.ShaderDir );
var shaders = ProcessFolder( shaderDir, defs );
var cppShaders = new CppPacker( shaders );
var outPutDir = Path.Combine( directory, defs.InteropOutput );
WriteOutputToFile( outPutDir, cppShaders.ToString() );
Console.WriteLine( $"Packed {shaders.Count} shader source files to {outPutDir}" );
}
static List<ShaderCode> ProcessFolder( string directory, Definition defs )
{
List<ShaderCode> shaderList = new List<ShaderCode>();
var Folder = new System.IO.DirectoryInfo( directory );
foreach ( DirectoryInfo folder in Folder.GetDirectories() )
{
// Todo: Better way to join these?
var folderShaders = ProcessFolder( folder.FullName, defs );
foreach ( var shader in folderShaders )
shaderList.Add( shader );
}
foreach ( FileInfo file in Folder.GetFiles() )
{
if ( defs.Whitelist.Count > 0 && !defs.Whitelist.Contains( file.Name ) )
continue;
if ( file.Extension != ".fxc" )
continue;
shaderList.Add( MinifyShader( file ) );
}
return shaderList;
}
static ShaderCode MinifyShader( FileInfo file )
{
var name = file.Name;
var content = file.OpenText().ReadToEnd();
var shader = new ShaderCode( name, content );
return shader.Minify();
}
static bool WriteOutputToFile( string filepath, string buffer )
{
// Don't rewrite if contents are equal
if ( File.Exists( filepath ) )
{
if ( File.ReadAllText( filepath ) == buffer )
return true;
}
File.WriteAllText( filepath, buffer );
return true;
}
}
}