1
0
mirror of synced 2024-12-02 11:07:26 +01:00
Switch-Toolbox/Switch_FileFormatsMain/GUI/TextureLoader.cs
KillzXGaming d5f50d91b8 More fixes to UI and file saving. Also add in bflim editing.
Fixed the shader param editor not adjusting the height for float4 types.
Fixed the shape editor not adjusting some lists properly.
Fixed hash based sarcs not saving right (menu.szs for example).
Fixed bflim sarc alignment from being corrupted.
Add alignment for effect file formats in sarc.
Add bflim to the texture loader in sarc for batch previewing/edits
2019-03-29 15:28:35 -04:00

342 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Switch_Toolbox.Library.Forms;
using Switch_Toolbox.Library;
using Bfres.Structs;
using System.Threading;
namespace FirstPlugin.Forms
{
public partial class TextureLoader : STUserControl
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern Int32 SendMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam);
const int LVM_FIRST = 0x1000;
const int LVM_SETICONSPACING = LVM_FIRST + 53;
public static void SetControlSpacing(Control control, Int16 x, Int16 y)
{
SendMessage(control.Handle, LVM_SETICONSPACING, 0, x * 65536 + y);
control.Refresh();
}
BNTX activeBntx;
BFRESGroupNode activeFtexContainer;
ImageList imgList = new ImageList();
public TextureLoader()
{
InitializeComponent();
imgList = new ImageList()
{
ColorDepth = ColorDepth.Depth32Bit,
ImageSize = new Size(70, 70),
};
int i = 0;
foreach (var tex in PluginRuntime.bntxContainers)
stComboBox1.Items.Add($"BNTX File {i++}");
i = 0;
foreach (var tex in PluginRuntime.ftexContainers)
stComboBox1.Items.Add($"FTEX Folder {i++}");
}
public void LoadTexture()
{
int imageIndex = 0;
imgList.Images.Clear();
listViewCustom1.LargeImageList = imgList;
listViewCustom1.Items.Clear();
listViewCustom1.View = View.LargeIcon;
SetControlSpacing(listViewCustom1, 75, 75);
Console.WriteLine($"activeBntx " + (activeBntx != null));
if (activeBntx != null)
{
Thread Thread = new Thread((ThreadStart)(() =>
{
foreach (var tex in activeBntx.Textures.Values)
{
Bitmap temp = tex.GetBitmap();
if (listViewCustom1.InvokeRequired)
{
listViewCustom1.Invoke((MethodInvoker)delegate {
listViewCustom1.Items.Add(tex.Text, imageIndex++);
// Running on the UI thread
imgList.Images.Add(temp);
var dummy = imgList.Handle;
});
}
temp.Dispose();
}
}));
Thread.Start();
}
imageIndex = 0;
if (activeFtexContainer != null)
{
foreach (var tex in activeFtexContainer.ResourceNodes.Values)
{
FTEX ftex = (FTEX)tex;
listViewCustom1.Items.Add(ftex.Text, imageIndex++);
Bitmap temp = ftex.GetBitmap();
imgList.Images.Add(temp);
var dummy = imgList.Handle;
temp.Dispose();
}
}
}
private void stComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int index = stComboBox1.SelectedIndex;
if (index < 0)
return;
if (PluginRuntime.bntxContainers.Count > 0)
{
activeBntx = PluginRuntime.bntxContainers[index];
LoadTexture();
}
if (PluginRuntime.ftexContainers.Count > 0)
{
activeFtexContainer = PluginRuntime.ftexContainers[index];
LoadTexture();
}
}
private void barSlider1_Scroll(object sender, ScrollEventArgs e)
{
}
private void barSlider1_ValueChanged(object sender, EventArgs e)
{
}
private void btnRemove_Click(object sender, EventArgs e)
{
if (listViewCustom1.SelectedItems.Count > 0)
{
if (activeBntx != null)
{
foreach (ListViewItem item in listViewCustom1.SelectedItems)
{
string SelectedTexture = item.Text;
if (activeBntx.Textures.ContainsKey(SelectedTexture))
{
activeBntx.Nodes.Remove(activeBntx.Textures[SelectedTexture]);
activeBntx.Textures.Remove(SelectedTexture);
listViewCustom1.Items.Remove(item);
}
}
}
if (activeFtexContainer != null)
{
foreach (ListViewItem item in listViewCustom1.SelectedItems)
{
string SelectedTexture = item.Text;
if (activeFtexContainer.ResourceNodes.ContainsKey(SelectedTexture))
{
activeFtexContainer.Nodes.Remove(activeFtexContainer.ResourceNodes[SelectedTexture]);
activeFtexContainer.ResourceNodes.Remove(SelectedTexture);
listViewCustom1.Items.Remove(item);
}
}
}
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
if (activeBntx != null)
{
activeBntx.ImportTexture();
LoadTexture();
}
}
private void listViewCustom1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listViewCustom1.SelectedIndices != null &&
listViewCustom1.SelectedIndices.Count > 0)
{
btnRemove.Enabled = true;
}
else
{
btnRemove.Enabled = false;
}
}
ImageEditorForm imageEditorForm;
private TextureData GetSelectedBntxTexture()
{
if (activeBntx == null)
return null;
if (activeBntx.Textures.ContainsKey(listViewCustom1.SelectedItems[0].Text))
{
return activeBntx.Textures[listViewCustom1.SelectedItems[0].Text];
}
return null;
}
private FTEX GetSelectedFtexTexture()
{
if (activeFtexContainer == null)
return null;
if (activeFtexContainer.ResourceNodes.ContainsKey(listViewCustom1.SelectedItems[0].Text))
{
return (FTEX)activeFtexContainer.ResourceNodes[listViewCustom1.SelectedItems[0].Text];
}
return null;
}
private void textureListView_DoubleClick(object sender, EventArgs e)
{
if (activeBntx != null)
{
TextureData tex = GetSelectedBntxTexture();
if (tex != null)
LoadImageEditor(tex, tex.Texture);
}
if (activeFtexContainer != null)
{
FTEX tex = GetSelectedFtexTexture();
if (tex != null)
LoadImageEditor(tex, tex.texture);
}
}
private void LoadImageEditor(STGenericTexture texture, object Properties)
{
if (imageEditorForm == null || imageEditorForm.IsDisposed)
{
imageEditorForm = new ImageEditorForm(false);
imageEditorForm.Show(this);
}
imageEditorForm.editorBase.Text = Text;
imageEditorForm.editorBase.Dock = DockStyle.Fill;
imageEditorForm.editorBase.LoadProperties(Properties);
imageEditorForm.editorBase.LoadImage(texture);
}
public override void OnControlClosing()
{
imgList.Images.Clear();
listViewCustom1.Items.Clear();
imgList = null;
}
private void textureListView_MouseClick(object sender, MouseEventArgs e)
{
if (listViewCustom1.SelectedItems.Count <= 0)
return;
switch (e.Button)
{
case MouseButtons.Right:
{
Point p = new Point(e.X, e.Y);
textureContextMenuStrip1.Show(listViewCustom1, p);
}
break;
}
}
private void exportToolStripMenuItem_Click(object sender, EventArgs e)
{
if (activeBntx != null)
{
TextureData tex = GetSelectedBntxTexture();
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = tex.ExportFilter;
if (sfd.ShowDialog() == DialogResult.OK)
{
tex.Export(sfd.FileName);
}
}
if (activeFtexContainer != null)
{
FTEX tex = GetSelectedFtexTexture();
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = tex.ExportFilter;
if (sfd.ShowDialog() == DialogResult.OK)
{
tex.Export(sfd.FileName);
}
}
}
private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
{
if (activeBntx != null)
{
TextureData tex = GetSelectedBntxTexture();
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = tex.ExportFilter;
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
tex.Replace(ofd.FileName);
}
}
if (activeFtexContainer != null)
{
FTEX tex = GetSelectedFtexTexture();
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = tex.ExportFilter;
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK) {
tex.Replace(ofd.FileName);
}
}
}
}
}