2025-04-25 21:14:54 +09:00

111 lines
3.6 KiB
C#

using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace UniGLTF.MeshUtility
{
public class MeshIntegrationTab
{
bool _modified = false;
protected GltfMeshUtility _meshUtil;
Splitter _splitter;
ReorderableList _groupList;
ReorderableList _rendererList;
public List<Renderer> _renderers = new List<Renderer>();
protected int _selected = -1;
protected int Selected
{
set
{
if (_selected == value)
{
return;
}
if (value < 0 || value >= _meshUtil.MeshIntegrationGroups.Count)
{
return;
}
_selected = value;
_renderers.Clear();
_renderers.AddRange(_meshUtil.MeshIntegrationGroups[_selected].Renderers);
}
}
public MeshIntegrationTab(EditorWindow editor, GltfMeshUtility meshUtility)
{
_meshUtil = meshUtility;
_splitter = new VerticalSplitter(editor, 200, 50);
_groupList = new ReorderableList(_meshUtil.MeshIntegrationGroups, typeof(MeshIntegrationGroup));
_groupList.drawHeaderCallback = (Rect rect) =>
{
GUI.Label(rect, "Integration group");
};
_groupList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
{
// Flag / Name
var group = _meshUtil.MeshIntegrationGroups[index];
const float LEFT_WIDTH = 92.0f;
var left = rect;
left.width = LEFT_WIDTH;
var right = rect;
right.width -= LEFT_WIDTH;
right.x += LEFT_WIDTH;
group.IntegrationType = (MeshIntegrationGroup.MeshIntegrationTypes)EditorGUI.EnumPopup(left, group.IntegrationType);
group.Name = EditorGUI.TextField(right, group.Name);
};
_groupList.onSelectCallback = rl =>
{
Selected = (rl.selectedIndices.Count > 0) ? rl.selectedIndices[0] : -1;
};
_rendererList = new ReorderableList(_renderers, typeof(Renderer));
_rendererList.drawHeaderCallback = (Rect rect) =>
{
GUI.Label(rect, "Renderer");
};
_rendererList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
{
var r = _renderers[index];
EditorGUI.ObjectField(rect, r, typeof(Renderer), true);
};
// +ボタンが押された時のコールバック
_rendererList.onAddCallback = list => Debug.Log("+ clicked.");
// -ボタンが押された時のコールバック
_rendererList.onRemoveCallback = list => Debug.Log("- clicked : " + list.index + ".");
}
public void UpdateMeshIntegrationList(GameObject root)
{
_selected = -1;
_meshUtil.UpdateMeshIntegrationGroups(root);
Selected = 0;
}
private void ShowGroup(Rect rect)
{
_groupList.DoList(rect);
}
private void ShowSelected(Rect rect)
{
_rendererList.DoList(rect);
}
public bool OnGui(Rect rect)
{
_modified = false;
_splitter.OnGUI(
rect,
ShowGroup,
ShowSelected);
return _modified;
}
}
}