using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using ResU = Syroot.NintenTools.Bfres; using Syroot.NintenTools.NSW.Bfres; using System.Threading.Tasks; using System.Windows.Forms; using Bfres.Structs; using Switch_Toolbox.Library.Forms; using Switch_Toolbox.Library.Animations; using BrightIdeasSoftware; namespace FirstPlugin.Forms { public partial class BoneVisualAnimEditor : UserControl { public BoneVisualAnimEditor() { InitializeComponent(); } public void UpdateDataGrid() { if (activeFVIS == null) return; if (activeFVIS.VisibilityAnimU != null) { activeFVIS.FrameCount = activeFVIS.VisibilityAnimU.FrameCount; if (activeFVIS.FrameCount != dataGridView1.RowCount) { UpdateFrameCells(activeFVIS); } } else { activeFVIS.FrameCount = activeFVIS.VisibilityAnim.FrameCount; if (activeFVIS.FrameCount != dataGridView1.RowCount) { UpdateFrameCells(activeFVIS); } } } FVIS activeFVIS; bool isLoaded = false; public void LoadVisualAnim(FVIS vis) { activeFVIS = vis; UpdateBoneColumns(vis); UpdateFrameCells(vis); isLoaded = true; } private void UpdateBoneColumns(FVIS vis) { dataGridView1.Columns.Clear(); dataGridView1.Refresh(); //Load frame column always first! var column = new DataGridViewTextBoxColumn() { HeaderText = "Frame", Name = "FrameColumn", ReadOnly = true, }; dataGridView1.Columns.Add(column); //Set bone columns for (int curve = 0; curve < vis.Values.Count; curve++) { var col4 = new DataGridViewCheckBoxColumn() { HeaderText = vis.Values[curve].Text, Name = vis.Values[curve].Text, }; dataGridView1.Columns.Add(col4); } dataGridView1.ApplyStyles(); } private void UpdateFrameCells(FVIS vis) { dataGridView1.DataSource = null; dataGridView1.Rows.Clear(); for (int frame = 0; frame < vis.FrameCount; frame++) { if (IsKeyed(vis, frame)) { int rowIndex = 0; if (frame != 0) rowIndex = this.dataGridView1.Rows.Add(); var row = this.dataGridView1.Rows[rowIndex]; row.Cells["FrameColumn"].Value = frame; for (int curve = 0; curve < vis.Values.Count; curve++) { bool IsVisible = vis.Values[curve].GetValue(frame); string boneName = vis.Values[curve].Text; row.Cells[boneName].Value = IsVisible; } } } dataGridView1.ApplyStyles(); } private bool IsKeyed(FVIS fvis, int Frame) { foreach (BooleanKeyGroup track in fvis.Values) { if (track.GetKeyFrame(Frame).IsKeyed == true) return true; } return false; } public void AddBone(string BoneName) { var column = new DataGridViewColumn { HeaderText = BoneName, Name = BoneName, CellTemplate = new DataGridViewCheckBoxCell(), HeaderCell = new DataGridViewColumnHeaderCell() { }, }; dataGridView1.Columns.Add(column); if (activeFVIS.VisibilityAnimU != null) { activeFVIS.VisibilityAnimU.Names.Add(BoneName); } else { activeFVIS.VisibilityAnim.Names.Add(BoneName); } } public void RemoveBone(string BoneName) { dataGridView1.Columns.Remove(dataGridView1.Columns[BoneName]); if (activeFVIS.VisibilityAnimU != null) { activeFVIS.VisibilityAnimU.Names.Remove(BoneName); } else { activeFVIS.VisibilityAnim.Names.Remove(BoneName); } } public class BoneObject { public int Frame { get; set; } public bool IsVisible { get; set; } public string Name { get; set; } } private void btnAdd_Click(object sender, EventArgs e) { BoneVisListEditor editor = new BoneVisListEditor(); editor.LoadBones(activeFVIS.BoneNames); if (editor.ShowDialog() == DialogResult.OK) { activeFVIS.BoneNames = editor.GetNewBones(); foreach (string bone in activeFVIS.BoneNames) { bool HasBone = activeFVIS.Values.Any(x => x.Text == bone); if (!HasBone) { BooleanKeyGroup group = new BooleanKeyGroup(); group.Text = bone; group.Offset = 0; group.Scale = 0; group.Delta = 0; for (int frame = 0; frame < activeFVIS.FrameCount; frame++) { group.Keys.Add(new BooleanKeyFrame() { Frame = frame, InterType = InterpolationType.STEPBOOL, Visible = false }); } activeFVIS.Values.Add(group); } } //If a keygroup exists not in the bonename, we need to remove it as it was removed from the list activeFVIS.Values.RemoveAll(x => !activeFVIS.BoneNames.Contains(x.Text)); UpdateBoneColumns(activeFVIS); UpdateFrameCells(activeFVIS); } } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (!isLoaded) return; var row = dataGridView1.Rows[e.RowIndex]; DataGridViewCheckBoxCell cell = row.Cells[e.ColumnIndex] as DataGridViewCheckBoxCell; if (cell != null && cell.Value != null) { float Frame = e.RowIndex; string BoneName = dataGridView1.Columns[e.ColumnIndex].HeaderText; foreach (var value in activeFVIS.Values) { if (value.Text == BoneName) { bool IsChecked = (bool)(Convert.ToBoolean(cell.Value) == true); bool IsNotChecked = (bool)(Convert.ToBoolean(cell.Value) == false); if (IsChecked) { value.SetBoolean(Frame, true); } if (IsNotChecked) { value.SetBoolean(Frame, false); } activeFVIS.IsEdited = true; } } } } } }