1
0
mirror of synced 2024-12-04 20:08:00 +01:00
Switch-Toolbox/Switch_FileFormatsMain/GUI/BFRES/ParamAnim/AnimParamEditor.cs

251 lines
8.7 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Syroot.NintenTools.Bfres;
using Switch_Toolbox.Library;
using Bfres.Structs;
using Switch_Toolbox.Library.Animations;
namespace FirstPlugin.Forms
{
public partial class AnimParamEditor : UserControl
{
public AnimParamEditor()
{
InitializeComponent();
}
public enum ColorOffsets
{
Red = 0,
Green = 4,
Blue = 8,
Alpha = 12,
}
public enum TexSRT
{
Mode = 0,
ScaleX = 4,
ScaleY = 8,
Rotate = 12,
TransX = 16,
TransY = 20,
}
MaterialAnimation activeAnimation;
MaterialAnimation.Material activeMaterial;
public bool ShowKeyedOnly = true;
public void LoadAnim(MaterialAnimation anim)
{
activeAnimation = anim;
listViewCustom1.Items.Clear();
listViewCustom1.Columns.Clear();
materialCB.Items.Clear();
foreach (var material in anim.Materials) {
materialCB.Items.Add(material.Text);
}
if (materialCB.Items.Count > 0)
materialCB.SelectedIndex = 0;
}
private void LoadParam(MaterialAnimation anim, MaterialAnimation.ParamKeyGroup paramAnim)
{
listViewCustom1.Columns.Clear();
listViewCustom1.Items.Clear();
ColumnHeader frameColumn = new ColumnHeader() { Text = $"Frame" };
listViewCustom1.Columns.Add(frameColumn);
if (paramAnim.Type == MaterialAnimation.AnimationType.Color)
{
ReadColorAnim(anim, paramAnim);
}
else if (anim.AnimType == MaterialAnimation.AnimationType.TextureSrt)
{
foreach (var track in paramAnim.Values)
{
ColumnHeader valueColumn = new ColumnHeader() { Text = $"{(TexSRT)track.AnimDataOffset}" };
listViewCustom1.Columns.Add(valueColumn);
}
for (int Frame = 0; Frame <= anim.FrameCount; Frame++)
{
if (IsKeyed(paramAnim, Frame))
{
var item1 = new ListViewItem($"{Frame}");
listViewCustom1.Items.Add(item1);
foreach (var track in paramAnim.Values)
{
var keyFrame = track.GetKeyFrame(Frame, false);
if (keyFrame != null)
{
if (track.AnimDataOffset == (uint)TexSRT.Mode)
item1.SubItems.Add(((uint)keyFrame.Value).ToString());
else
item1.SubItems.Add(keyFrame.Value.ToString());
}
else
item1.SubItems.Add("");
}
}
}
}
else
{
int columnCount = paramAnim.Values.Count;
for (int col = 0; col < columnCount; col++)
{
ColumnHeader valueColumn = new ColumnHeader() { Text = $"Value {col}" };
listViewCustom1.Columns.Add(valueColumn);
}
for (int Frame = 0; Frame <= anim.FrameCount; Frame++)
{
if (IsKeyed(paramAnim, Frame))
{
var item1 = new ListViewItem($"{Frame}");
listViewCustom1.Items.Add(item1);
foreach (var track in paramAnim.Values)
{
var keyFrame = track.GetKeyFrame(Frame);
if (keyFrame != null)
item1.SubItems.Add(keyFrame.Value.ToString());
else
item1.SubItems.Add("");
}
}
}
}
}
private bool IsKeyed(MaterialAnimation.ParamKeyGroup paramKeyGroup, int Frame)
{
foreach (var track in paramKeyGroup.Values)
{
if (track.GetKeyFrame(Frame, false) != null && track.GetKeyFrame(Frame).IsKeyed == true)
return true;
}
return false;
}
private void ReadColorAnim(MaterialAnimation anim, MaterialAnimation.ParamKeyGroup paramAnim)
{
ColumnHeader colorHeader = new ColumnHeader() { Text = "Color" };
ColumnHeader alphaHeader = new ColumnHeader() { Text = "Alpha" };
ColumnHeader RHeader = new ColumnHeader() { Text = "R" };
ColumnHeader GHeader = new ColumnHeader() { Text = "G" };
ColumnHeader BHeader = new ColumnHeader() { Text = "B" };
ColumnHeader AHeader = new ColumnHeader() { Text = "A" };
listViewCustom1.Columns.Add(colorHeader);
listViewCustom1.Columns.Add(alphaHeader);
listViewCustom1.Columns.Add(RHeader);
listViewCustom1.Columns.Add(GHeader);
listViewCustom1.Columns.Add(BHeader);
listViewCustom1.Columns.Add(AHeader);
for (int Frame = 0; Frame <= anim.FrameCount; Frame++)
{
var item1 = new ListViewItem($"{Frame}");
item1.SubItems.Add("Color");
item1.SubItems.Add("Alpha");
item1.UseItemStyleForSubItems = false;
int Red = 0, Green = 0, Blue = 0, Alpha = 255;
foreach (var track in paramAnim.Values)
{
Console.WriteLine((ColorOffsets)track.AnimDataOffset + " " + track.GetValue(Frame) + " " + paramAnim.UniformName);
if ((ColorOffsets)track.AnimDataOffset == ColorOffsets.Red)
{
Red = Utils.FloatToIntClamp(track.GetValue(Frame));
item1.SubItems.Add($"R {track.GetValue(Frame)}");
}
if ((ColorOffsets)track.AnimDataOffset == ColorOffsets.Green)
{
Green = Utils.FloatToIntClamp(track.GetValue(Frame));
item1.SubItems.Add($"G {track.GetValue(Frame)}");
}
if ((ColorOffsets)track.AnimDataOffset == ColorOffsets.Blue)
{
Blue = Utils.FloatToIntClamp(track.GetValue(Frame));
item1.SubItems.Add($"B {track.GetValue(Frame)}");
}
if ((ColorOffsets)track.AnimDataOffset == ColorOffsets.Alpha)
{
Alpha = Utils.FloatToIntClamp(track.GetValue(Frame));
item1.SubItems.Add($"A {track.GetValue(Frame)}");
}
}
item1.SubItems[1].BackColor = Color.FromArgb(Red, Green, Blue);
item1.SubItems[2].BackColor = Color.FromArgb(Alpha, Alpha, Alpha);
listViewCustom1.Items.Add(item1);
}
}
private void stButton1_Click(object sender, EventArgs e)
{
}
private void btnEditMaterial_Click(object sender, EventArgs e)
{
ParamPatternMaterialEditor editor = new ParamPatternMaterialEditor();
editor.LoadAnim(activeAnimation);
if (editor.ShowDialog() == DialogResult.OK)
{
}
}
private void btnEditSamplers_Click(object sender, EventArgs e)
{
}
private void materialCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (materialCB.SelectedIndex >= 0)
{
activeMaterial = activeAnimation.Materials[materialCB.SelectedIndex];
paramCB.Items.Clear();
foreach (var param in activeMaterial.Params)
{
paramCB.Items.Add(param.Text);
}
if (paramCB.Items.Count > 0)
paramCB.SelectedIndex = 0;
}
}
private void paramCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (paramCB.SelectedIndex >= 0)
{
var activeParam = activeMaterial.Params[paramCB.SelectedIndex];
LoadParam(activeAnimation, activeParam);
}
}
}
}