167 lines
5.4 KiB
C#
167 lines
5.4 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.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<AttribFormat>())
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|