78 lines
2.5 KiB
C#
78 lines
2.5 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.IO;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.Windows.Forms;
|
|||
|
using Switch_Toolbox.Library;
|
|||
|
|
|||
|
namespace FirstPlugin
|
|||
|
{
|
|||
|
public class NSWShaderDecompile
|
|||
|
{
|
|||
|
public enum NswShaderType
|
|||
|
{
|
|||
|
Vertex,
|
|||
|
Geometry,
|
|||
|
Fragment,
|
|||
|
Compute
|
|||
|
}
|
|||
|
|
|||
|
public static string DecompileShader(NswShaderType shaderType, byte[] Data)
|
|||
|
{
|
|||
|
string TypeArg = "v";
|
|||
|
|
|||
|
switch (shaderType)
|
|||
|
{
|
|||
|
case NswShaderType.Vertex: TypeArg = "v"; break;
|
|||
|
case NswShaderType.Fragment: TypeArg = "f"; break;
|
|||
|
case NswShaderType.Geometry: TypeArg = "g"; break;
|
|||
|
}
|
|||
|
|
|||
|
if (!Directory.Exists("temp"))
|
|||
|
Directory.CreateDirectory("temp");
|
|||
|
|
|||
|
if (!Directory.Exists("ShaderTools"))
|
|||
|
Directory.CreateDirectory("ShaderTools");
|
|||
|
|
|||
|
// File.WriteAllBytes("temp/shader1.bin", Utils.CombineByteArray(data.ToArray()));
|
|||
|
File.WriteAllBytes("temp/shader1.bin", Data);
|
|||
|
|
|||
|
if (!File.Exists($"{Runtime.ExecutableDir}/ShaderTools/Ryujinx.ShaderTools.exe"))
|
|||
|
{
|
|||
|
MessageBox.Show("No shader decompiler found in ShaderTools. If you want to decompile a shader, you can use Ryujinx's ShaderTools.exe and put in the ShaderTools folder of the toolbox.");
|
|||
|
return "";
|
|||
|
}
|
|||
|
|
|||
|
ProcessStartInfo start = new ProcessStartInfo();
|
|||
|
start.FileName = "ShaderTools/Ryujinx.ShaderTools.exe";
|
|||
|
start.WorkingDirectory = Runtime.ExecutableDir;
|
|||
|
start.CreateNoWindow = false;
|
|||
|
start.Arguments = $"{TypeArg} {Utils.AddQuotesIfRequired("temp/shader1.bin")}";
|
|||
|
start.UseShellExecute = false;
|
|||
|
start.RedirectStandardOutput = true;
|
|||
|
start.CreateNoWindow = true;
|
|||
|
start.WindowStyle = ProcessWindowStyle.Hidden;
|
|||
|
using (Process process = Process.Start(start))
|
|||
|
{
|
|||
|
using (StreamReader reader = process.StandardOutput)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
return reader.ReadToEnd();
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
return "";
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// File.WriteAllBytes("temp/shader1.bin", Utils.CombineByteArray(data.ToArray()));
|
|||
|
|
|||
|
return "";
|
|||
|
}
|
|||
|
}
|
|||
|
}
|