Switch-Toolbox/File_Format_Library/GUI/BCH/BCHModelEditor.cs
2020-01-14 20:26:51 -05:00

146 lines
No EOL
4.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 SPICA.Formats.CtrH3D.Model;
using SPICA.Formats.CtrH3D.Model.Mesh;
using Toolbox.Library.Forms;
namespace FirstPlugin.CtrLibrary.Forms
{
public partial class BCHModelEditor : UserControl
{
H3DModelWrapper ActiveModelWrapper;
private bool Loaded = false;
public BCHModelEditor()
{
InitializeComponent();
stDropDownPanel1.ResetColors();
stDropDownPanel2.ResetColors();
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
tranXUD.ValueChanged += OnTransformChanged;
tranYUD.ValueChanged += OnTransformChanged;
tranZUD.ValueChanged += OnTransformChanged;
rotXUD.ValueChanged += OnTransformChanged;
rotYUD.ValueChanged += OnTransformChanged;
rotZUD.ValueChanged += OnTransformChanged;
scaleXUD.ValueChanged += OnTransformChanged;
scaleYUD.ValueChanged += OnTransformChanged;
scaleZUD.ValueChanged += OnTransformChanged;
meshLayerCB.Items.Add("0 (Opaque)");
meshLayerCB.Items.Add("1 (Translucent)");
meshLayerCB.Items.Add("2 (Subtractive Blend)");
meshLayerCB.Items.Add("3 (Additive Blend)");
listViewCustom1.FullRowSelect = true;
tranXUD.SetTheme();
}
public void LoadModel(H3DModelWrapper wrapper)
{
ActiveModelWrapper = wrapper;
Loaded = false;
var model = wrapper.Model;
var transform = model.WorldTransform;
if (model.MetaData != null)
bchUserDataEditor1.LoadUserData(model.MetaData);
listViewCustom1.BeginUpdate();
listViewCustom1.Items.Clear();
for (int i = 0; i < model.Meshes.Count; i++) {
ListViewItem item = new ListViewItem();
UpdateMeshListItem(model.Meshes[i], item);
listViewCustom1.Items.Add(item);
}
listViewCustom1.EndUpdate();
if (listViewCustom1.Items.Count > 0)
listViewCustom1.TrySelectItem(0);
Loaded = true;
}
private static void UpdateMeshListItem(H3DMesh mesh, ListViewItem item)
{
string materialName = "";
if (mesh.Parent.Materials.Count > mesh.MaterialIndex)
materialName = mesh.Parent.Materials[mesh.MaterialIndex].Name;
item.SubItems.Clear();
item.Tag = mesh;
item.Text = mesh.NodeIndex.ToString();
item.SubItems.Add(materialName);
item.SubItems.Add($"mesh_{materialName}");
item.SubItems.Add(GetLayerString(mesh.Layer));
item.SubItems.Add(mesh.Priority.ToString());
}
private static string GetLayerString(int layer)
{
switch (layer)
{
case 0: return $"{layer} (Opaque)";
case 1: return $"{layer} (Translucent)";
case 2: return $"{layer} (Subtractive Blend)";
case 3: return $"{layer} (Additive Blend)";
default: return layer.ToString();
}
}
private void OnTransformChanged(object sender, EventArgs e)
{
if (!Loaded) return;
}
private void BCHModelEditor_Load(object sender, EventArgs e)
{
}
private void listViewCustom1_SelectedIndexChanged(object sender, EventArgs e) {
var mesh = GetActiveMesh();
if (mesh != null && Loaded) {
meshLayerCB.SelectedIndex = mesh.Layer;
renderPriorityUD.Value = mesh.Priority;
}
}
private void meshLayerCB_SelectedIndexChanged(object sender, EventArgs e) {
var mesh = GetActiveMesh();
if (mesh != null && Loaded) {
ActiveModelWrapper.Model.EditLayer(mesh, meshLayerCB.SelectedIndex);
UpdateMeshListItem(mesh, listViewCustom1.SelectedItems[0]);
}
}
private H3DMesh GetActiveMesh()
{
if (listViewCustom1.SelectedIndices.Count > 0)
return (H3DMesh)listViewCustom1.SelectedItems[0].Tag;
return null;
}
private void renderPriorityUD_Scroll(object sender, ScrollEventArgs e) {
var mesh = GetActiveMesh();
if (mesh != null && Loaded) {
mesh.Priority = (int)renderPriorityUD.Value;
UpdateMeshListItem(mesh, listViewCustom1.SelectedItems[0]);
}
}
}
}