using System;
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.ProBuilder;
using System.Linq;
using System.Reflection;
namespace UnityEditor.ProBuilder
{
///
/// Responsible for loading menu actions in to the pb_Toolbar.
///
static class EditorToolbarLoader
{
static List s_LoadedMenuActions;
public static T GetInstance() where T : MenuAction, new()
{
T instance = (T)GetActions().FirstOrDefault(x => x is T);
if (instance == null)
{
instance = new T();
if (s_LoadedMenuActions != null)
s_LoadedMenuActions.Add(instance);
else
s_LoadedMenuActions = new List() { instance };
}
return instance;
}
internal static List GetActions(bool forceReload = false)
{
if (s_LoadedMenuActions != null && !forceReload)
return s_LoadedMenuActions;
s_LoadedMenuActions = new List()
{
// tools
new Actions.OpenShapeEditor(),
new Actions.NewBezierShape(),
new Actions.NewPolyShape(),
new Actions.OpenMaterialEditor(),
new Actions.OpenUVEditor(),
new Actions.OpenVertexColorEditor(),
new Actions.OpenSmoothingEditor(),
new Actions.ToggleSelectBackFaces(),
new Actions.ToggleHandleOrientation(),
new Actions.ToggleDragSelectionMode(),
new Actions.ToggleDragRectMode(),
// selection
new Actions.GrowSelection(),
new Actions.ShrinkSelection(),
new Actions.InvertSelection(),
new Actions.SelectEdgeLoop(),
new Actions.SelectEdgeRing(),
new Actions.SelectFaceLoop(),
new Actions.SelectFaceRing(),
new Actions.SelectHole(),
new Actions.SelectVertexColor(),
new Actions.SelectMaterial(),
new Actions.SelectSmoothingGroup(),
// object
new Actions.MergeObjects(),
new Actions.MirrorObjects(),
new Actions.FlipObjectNormals(),
new Actions.SubdivideObject(),
new Actions.FreezeTransform(),
new Actions.CenterPivot(),
new Actions.ConformObjectNormals(),
new Actions.TriangulateObject(),
new Actions.GenerateUV2(),
new Actions.ProBuilderize(),
new Actions.Export(),
// new Actions.ExportFbx(),
new Actions.ExportObj(),
new Actions.ExportAsset(),
new Actions.ExportPly(),
new Actions.ExportStlAscii(),
new Actions.ExportStlBinary(),
// All
new Actions.SetPivotToSelection(),
// Faces (All)
new Actions.DeleteFaces(),
new Actions.DetachFaces(),
new Actions.ExtrudeFaces(),
// Face
new Actions.ConformFaceNormals(),
new Actions.FlipFaceEdge(),
new Actions.FlipFaceNormals(),
new Actions.MergeFaces(),
new Actions.SubdivideFaces(),
new Actions.TriangulateFaces(),
// Edge
new Actions.BridgeEdges(),
new Actions.BevelEdges(),
new Actions.ConnectEdges(),
new Actions.ExtrudeEdges(),
new Actions.InsertEdgeLoop(),
new Actions.SubdivideEdges(),
// Vertex
new Actions.CollapseVertices(),
new Actions.WeldVertices(),
new Actions.ConnectVertices(),
new Actions.FillHole(),
// new Actions.CreatePolygon(),
new Actions.SplitVertices(),
// Entity
#if ENABLE_ENTITY_TYPES
new Actions.SetEntityType_Detail(),
new Actions.SetEntityType_Mover(),
new Actions.SetEntityType_Collider(),
new Actions.SetEntityType_Trigger(),
#endif
new Actions.SetTrigger(),
new Actions.SetCollider(),
};
SearchForMenuAttributes(s_LoadedMenuActions);
s_LoadedMenuActions.Sort(MenuAction.CompareActionsByGroupAndPriority);
return s_LoadedMenuActions;
}
static void SearchForMenuAttributes(List list)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
try
{
var menuActionTypes = assembly.GetTypes().Where(x =>
{
if (!typeof(MenuAction).IsAssignableFrom(x)
|| x.IsAbstract
|| !Attribute.IsDefined(x, typeof(ProBuilderMenuActionAttribute)))
return false;
var constructors = x.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (!constructors.Any(y => y.GetParameters().Length < 1))
{
Log.Error("{0} type does not contain a parameterless constructor. Only parameterless constructors are invoked with creating MenuItem instances.", x.ToString());
return false;
}
if (constructors.Any(z => z.GetParameters().Length > 0))
Log.Warning("{0} type contains a non-parameterless constructor. Only parameterless constructors are invoked with creating MenuItem instances.", x.ToString());
return true;
});
list.AddRange(menuActionTypes.Select(x => (MenuAction)Activator.CreateInstance(x)));
}
catch
{
// some assemblies cannot be reflected (jetbrains plugin, for example)
}
}
}
}
}