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; using Bfres.Structs; using Syroot.NintenTools.NSW.Bfres.GFX; namespace FirstPlugin { public partial class AttributeEditor : Form { public AttributeEditor() { InitializeComponent(); foreach (var type in Enum.GetValues(typeof(AttribFormat)).Cast()) formatCB.Items.Add(type); } private FMDL ActiveFMDL; private FSHP ActiveFSHP; private FSHP.VertexAttribute ActiveAttribute; public void LoadObjects(FMDL fmdl) { ActiveFMDL = fmdl; objectList.Items.Clear(); foreach (var shape in fmdl.shapes) { ListViewItem item = new ListViewItem(); item.Text = shape.Text; foreach (var attribute in shape.vertexAttributes) { item.SubItems.Add(attribute.Name); } objectList.Items.Add(shape.Text); } objectList.Items[0].Selected = true; objectList.Select(); } private void listView1_SelectedIndexChanged(object sender, EventArgs e) { if (objectList.SelectedItems.Count > 0) { ActiveFSHP = ActiveFMDL.shapes[objectList.SelectedIndices[0]]; attributeCB.Items.Clear(); foreach (var attribute in ActiveFSHP.vertexAttributes) { attributeCB.Items.Add(attribute.Name); } if (attributeCB.Items.Count > 0) attributeCB.SelectedIndex = 0; } } private void AttributeEditor_Load(object sender, EventArgs e) { } private void panel2_Paint(object sender, PaintEventArgs e) { } private void attributeCB_SelectedIndexChanged(object sender, EventArgs e) { if (attributeCB.SelectedIndex >= 0) { string SelectedText = attributeCB.GetItemText(attributeCB.SelectedItem); hintLabel.Text = $"Hint: {SetHintLabel(SelectedText)}"; foreach (var attribute in ActiveFSHP.vertexAttributes) if (SelectedText == attribute.Name) ActiveAttribute = attribute; if (ActiveAttribute != null) formatCB.SelectedItem = ActiveAttribute.Format; } } private void button1_Click(object sender, EventArgs e) { if (formatCB.SelectedIndex < 0) return; string SelectedText = attributeCB.GetItemText(attributeCB.SelectedItem); DialogResult dialogResult = MessageBox.Show($"Are you sure you want to remove all {SelectedText} from" + $" FMDL {ActiveFMDL}? )", "", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { foreach (var shape in ActiveFMDL.shapes) { foreach (var att in shape.vertexAttributes) { if (att.Name == SelectedText) { shape.vertexAttributes.Remove(att); shape.SaveVertexBuffer(); if (shape.IsWiiU) BfresWiiU.ReadShapesVertices(shape, shape.ShapeU, shape.VertexBufferU, ActiveFMDL); else BfresSwitch.ReadShapesVertices(shape, shape.Shape, shape.VertexBuffer, ActiveFMDL); attributeCB.Items.Remove(att.Name); if (attributeCB.Items.Count > 0) attributeCB.SelectedIndex = 0; break; } } } LoadObjects(ActiveFMDL); ActiveFMDL.UpdateVertexData(); } } private string SetHintLabel(string attributeName) { switch (attributeName) { case "_p0": return "Position"; case "_n0": return "Normal"; case "_c0": return "Color"; case "_u0": return "UV"; case "_u1": return "UV Layer"; case "_u2": return "UV Layer 2"; case "_t0": return "Tangent"; case "_b0": return "Bitangent"; case "_w0": return "Weight"; case "_i0": return "Index"; case "_w1": return "Weight (Additional 4)"; case "_i1": return "Index (Additional 4)"; default: return ""; } } private void formatCB_SelectedIndexChanged(object sender, EventArgs e) { if (attributeCB.SelectedIndex >= 0) { ActiveAttribute.Format = (AttribFormat)formatCB.SelectedItem; } } private void button3_Click(object sender, EventArgs e) { ActiveFSHP.vertexAttributes.Remove(ActiveAttribute); attributeCB.Items.Remove(ActiveAttribute.Name); if (attributeCB.Items.Count > 0) attributeCB.SelectedIndex = 0; } } }