CodeWalker/Forms/FxcForm.cs
2018-02-25 00:59:00 +11:00

199 lines
5.8 KiB
C#

using CodeWalker.GameFiles;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodeWalker.Forms
{
public partial class FxcForm : Form
{
private FxcFile Fxc;
private string fileName;
public string FileName
{
get { return fileName; }
set
{
fileName = value;
UpdateFormTitle();
}
}
public string FilePath { get; set; }
public FxcForm()
{
InitializeComponent();
}
private void UpdateFormTitle()
{
Text = fileName + " - FXC Viewer - CodeWalker by dexyfex";
}
public void LoadFxc(FxcFile fxc)
{
Fxc = fxc;
fileName = fxc?.Name;
if (string.IsNullOrEmpty(fileName))
{
fileName = fxc?.FileEntry?.Name;
}
UpdateFormTitle();
DetailsPropertyGrid.SelectedObject = fxc;
ShadersListView.Items.Clear();
TechniquesListView.Items.Clear();
if ((fxc == null) || (fxc.Shaders == null)) return;
foreach (var shader in fxc.Shaders)
{
var item = ShadersListView.Items.Add(shader.Name);
item.Tag = shader;
}
if (fxc.Techniques != null)
{
foreach (var technique in fxc.Techniques)
{
var item = TechniquesListView.Items.Add(technique.ToString());
item.Tag = technique;
}
}
if (!string.IsNullOrEmpty(fxc.LastError))
{
StatusLabel.Text = fxc.LastError;
}
else
{
StatusLabel.Text = (fxc.Shaders?.Length??0).ToString() + " shaders, " + (fxc.Techniques?.Length??0).ToString() + " techniques";
}
}
private void LoadShader(FxcShader s)
{
if (s == null)
{
ShaderPanel.Enabled = false;
ShaderTextBox.Text = string.Empty;
}
else
{
ShaderPanel.Enabled = true;
FxcParser.ParseShader(s);
if (!string.IsNullOrEmpty(s.LastError))
{
StringBuilder sb = new StringBuilder();
sb.Append("Error: ");
sb.AppendLine(s.LastError);
sb.AppendLine();
sb.AppendLine(s.Disassembly);
ShaderTextBox.Text = sb.ToString();
}
else
{
ShaderTextBox.Text = s.Disassembly;
}
}
}
private void LoadTechnique(FxcTechnique t)
{
if (t == null)
{
TechniquePanel.Enabled = false;
TechniqueTextBox.Text = string.Empty;
}
else
{
TechniquePanel.Enabled = true;
StringBuilder sb = new StringBuilder();
sb.AppendLine("technique " + t.Name);
sb.AppendLine("{");
if (t.Passes != null)
{
for (int i = 0; i < t.Passes.Length; i++)
{
var pass = t.Passes[i];
sb.AppendLine(" pass p" + i.ToString());// + pass.ToString());
sb.AppendLine(" {");
var vs = Fxc?.GetVS(pass.VS);
var ps = Fxc?.GetPS(pass.PS);
var cs = Fxc?.GetCS(pass.CS);
var ds = Fxc?.GetDS(pass.DS);
var gs = Fxc?.GetGS(pass.GS);
var hs = Fxc?.GetHS(pass.HS);
if (vs != null) sb.AppendLine(" vertexShader = " + vs.Name + "();");
if (ps != null) sb.AppendLine(" pixelShader = " + ps.Name + "();");
if (cs != null) sb.AppendLine(" computeShader = " + cs.Name + "();");
if (ds != null) sb.AppendLine(" domainShader = " + ds.Name + "();");
if (gs != null) sb.AppendLine(" geometryShader = " + gs.Name + "();");
if (hs != null) sb.AppendLine(" hullShader = " + hs.Name + "();");
if ((pass.Params != null) && (pass.Params.Length > 0))
{
//TODO: properly display the params (what are they all? cbuffers etc)
//sb.AppendLine();
//foreach (var param in pass.Params)
//{
// sb.AppendLine(" " + param.ToString());
//}
}
sb.AppendLine(" }");
}
}
sb.AppendLine("}");
TechniqueTextBox.Text = sb.ToString();
}
}
private void ShadersListView_SelectedIndexChanged(object sender, EventArgs e)
{
FxcShader s = null;
if (ShadersListView.SelectedItems.Count == 1)
{
s = ShadersListView.SelectedItems[0].Tag as FxcShader;
}
LoadShader(s);
}
private void TechniquesListView_SelectedIndexChanged(object sender, EventArgs e)
{
FxcTechnique t = null;
if (TechniquesListView.SelectedItems.Count == 1)
{
t = TechniquesListView.SelectedItems[0].Tag as FxcTechnique;
}
LoadTechnique(t);
}
}
}