From fe34478b317336cb4810f5c332197d641def3fd8 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:15:21 +0800 Subject: [PATCH 1/6] update --- src/Connectors/EcsWorldProvider.cs | 2 +- .../Editor/EcsWorldProviderBaseEditor.cs | 3 +- .../Monitors/Editor/WorldMonitorEditor.cs | 2 + src/Internal/Editor/EcsGUI.cs | 90 ++++++++++++++++--- 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/src/Connectors/EcsWorldProvider.cs b/src/Connectors/EcsWorldProvider.cs index c9623a8..0f711f8 100644 --- a/src/Connectors/EcsWorldProvider.cs +++ b/src/Connectors/EcsWorldProvider.cs @@ -123,7 +123,7 @@ namespace DCFApixels.DragonECS { EcsWorldConfig config = new EcsWorldConfig(_entitiesCapacity, _groupCapacity, _poolsCapacity, _poolComponentsCapacity, _poolRecycledComponentsCapacity); ConfigContainer configs = new ConfigContainer().Set(config); - return (TWorld)Activator.CreateInstance(typeof(TWorld), new object[] { configs, _worldID }); + return (TWorld)Activator.CreateInstance(typeof(TWorld), new object[] { configs, null, _worldID }); } protected virtual void OnWorldCreated(TWorld world) { } #endregion diff --git a/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs b/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs index 2d8a12b..8d61c90 100644 --- a/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs +++ b/src/Connectors/Editor/EcsWorldProviderBaseEditor.cs @@ -33,7 +33,6 @@ namespace DCFApixels.DragonECS.Unity.Editors } EcsGUI.Layout.DrawWorldBaseInfo(Target.GetCurrentWorldRaw()); - base.OnInspectorGUI(); GUILayout.Space(10); @@ -53,6 +52,8 @@ namespace DCFApixels.DragonECS.Unity.Editors c.a = 0.3f; EditorGUI.DrawRect(r, c); GUILayout.Space(10); + + EcsGUI.Layout.DrawWorldComponents(Target.GetCurrentWorldRaw()); } } } diff --git a/src/DebugUtils/Monitors/Editor/WorldMonitorEditor.cs b/src/DebugUtils/Monitors/Editor/WorldMonitorEditor.cs index 67149d2..ea734fc 100644 --- a/src/DebugUtils/Monitors/Editor/WorldMonitorEditor.cs +++ b/src/DebugUtils/Monitors/Editor/WorldMonitorEditor.cs @@ -118,6 +118,8 @@ namespace DCFApixels.DragonECS.Unity.Editors EcsGUI.Layout.DrawWorldBaseInfo(Target.World); + + EcsGUI.Layout.DrawWorldComponents(Target.World); } } } diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index 39f84c2..9649305 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -453,18 +453,6 @@ namespace DCFApixels.DragonECS.Unity.Editors } #endregion - //#region One line elems - //public static bool LeftToggle(Rect position, GUIContent label, bool value) - //{ - // position = position.AddPadding(indent, 0, 0, 0); - // Rect togglePos; - // (togglePos, position) = position.HorizontalSliceLeft(18f); - // - // EditorGUI.togg(position, label); - // GUI.Label(position, label); - //} - //#endregion - #region entity bar public static void EntityBarForAlive(Rect position, EntityStatus status, int id, short gen, short world) { @@ -1088,16 +1076,92 @@ namespace DCFApixels.DragonECS.Unity.Editors bool isNull = world == null || world.IsDestroyed || world.ID == 0; int entitesCount = isNull ? 0 : world.Count; int capacity = isNull ? 0 : world.Capacity; + long Version = isNull ? 0 : world.Version; int leakedEntitesCount = isNull ? 0 : world.CountLeakedEntitesDebug(); EditorGUILayout.IntField("Entities", entitesCount, EditorStyles.boldLabel); EditorGUILayout.IntField("Capacity", capacity, EditorStyles.boldLabel); - EditorGUILayout.LongField("Version", world.Version, EditorStyles.boldLabel); + EditorGUILayout.LongField("Version", Version, EditorStyles.boldLabel); Color color = leakedEntitesCount > 0 ? Color.yellow : GUI.contentColor; using (new ContentColorScope(color)) { EditorGUILayout.IntField("Leaked Entites", leakedEntitesCount, EditorStyles.boldLabel); } } + public static void DrawWorldComponents(EcsWorld world) + { + bool isNull = world == null || world.IsDestroyed || world.ID == 0; + if (isNull) { return; } + using (BeginVertical(UnityEditorUtility.GetStyle(Color.black, 0.2f))) + { + IsShowRuntimeComponents = EditorGUILayout.BeginFoldoutHeaderGroup(IsShowRuntimeComponents, "RUNTIME COMPONENTS", EditorStyles.foldout); + EditorGUILayout.EndFoldoutHeaderGroup(); + if (IsShowRuntimeComponents == false) { return; } + + var worldID = world.ID; + var cmps = world.GetWorldComponents(); + int index = -1; + int total = 9; + foreach (var cmp in cmps) + { + index++; + var meta = cmp.ComponentType.ToMeta(); + if (meta.IsHidden == false || IsShowHidden) + { + Type componentType = cmp.ComponentType; + + object data = cmp.GetRaw(worldID); + + ExpandMatrix expandMatrix = ExpandMatrix.Take(componentType); + + float padding = EditorGUIUtility.standardVerticalSpacing; + Rect optionButton = GUILayoutUtility.GetLastRect(); + optionButton.yMin = optionButton.yMax; + optionButton.yMax += HeadIconsRect.height; + optionButton.xMin = optionButton.xMax - 64; + optionButton.center += Vector2.up * padding * 2f; + //Canceling isExpanded + if (ClickTest(optionButton)) + { + ref bool isExpanded = ref expandMatrix.Down(); + isExpanded = !isExpanded; + } + + Color panelColor = SelectPanelColor(meta, index, total); + GUILayout.BeginVertical(UnityEditorUtility.GetStyle(panelColor, EscEditorConsts.COMPONENT_DRAWER_ALPHA)); + EditorGUI.BeginChangeCheck(); + + ////Close button + //optionButton.xMin = optionButton.xMax - HeadIconsRect.width; + //if (CloseButton(optionButton)) + //{ + // cmp.Del(worldID); + // return; + //} + + //Edit script button + if (ScriptsCache.TryGetScriptAsset(meta, out MonoScript script)) + { + optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); + EcsGUI.ScriptAssetButton(optionButton, script); + } + //Description icon + if (string.IsNullOrEmpty(meta.Description.Text) == false) + { + optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); + DescriptionIcon(optionButton, meta.Description.Text); + } + + RuntimeComponentReflectionCache.FieldInfoData componentInfoData = new RuntimeComponentReflectionCache.FieldInfoData(null, componentType, meta.Name); + if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) + { + cmp.SetRaw(worldID, resultData); + } + + GUILayout.EndVertical(); + } + } + } + } #region entity bar public static void EntityBarForAlive(EntityStatus status, int id, short gen, short world) From 0aaffd0240df091e589344c79df559b04204ee2e Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:38:04 +0800 Subject: [PATCH 2/6] stash --- src/Buildin/EcsDefaultWorldProvider.cs | 2 +- .../EcsDefaultWorldSingletonProvider.cs | 2 +- src/Buildin/EcsRootUnity.cs | 1 + src/Buildin/EcsWorldProvider.cs | 2 +- src/Internal/ArrayUtility.cs | 71 +++++ src/Internal/Editor/EcsGUI.cs | 293 +++++++++++++++++- src/Internal/Editor/ExtendedEditor.cs | 27 +- src/Internal/Editor/UnityEditorUtility.cs | 4 + src/Internal/Icons/Color_Icon.png | Bin 0 -> 13139 bytes src/Internal/Icons/Color_Icon.png.meta | 122 ++++++++ src/Internal/Icons/Gray_Icon.png | Bin 0 -> 12860 bytes src/Internal/Icons/Gray_Icon.png.meta | 122 ++++++++ src/Internal/Utils/StructList.cs | 165 ++++++++++ src/Internal/Utils/StructList.cs.meta | 11 + src/Internal/Utils/Throw.cs | 12 + src/Internal/Utils/Throw.cs.meta | 11 + .../Editor/EntityTemplateEditor.cs | 2 + .../Templates/MonoEntityTemplate.cs | 1 + 18 files changed, 840 insertions(+), 8 deletions(-) create mode 100644 src/Internal/Icons/Color_Icon.png create mode 100644 src/Internal/Icons/Color_Icon.png.meta create mode 100644 src/Internal/Icons/Gray_Icon.png create mode 100644 src/Internal/Icons/Gray_Icon.png.meta create mode 100644 src/Internal/Utils/StructList.cs create mode 100644 src/Internal/Utils/StructList.cs.meta create mode 100644 src/Internal/Utils/Throw.cs create mode 100644 src/Internal/Utils/Throw.cs.meta diff --git a/src/Buildin/EcsDefaultWorldProvider.cs b/src/Buildin/EcsDefaultWorldProvider.cs index 4892e3f..21cf271 100644 --- a/src/Buildin/EcsDefaultWorldProvider.cs +++ b/src/Buildin/EcsDefaultWorldProvider.cs @@ -5,6 +5,6 @@ namespace DCFApixels.DragonECS [CreateAssetMenu(fileName = nameof(EcsDefaultWorldProvider), menuName = EcsConsts.FRAMEWORK_NAME + "/WorldProviders/" + nameof(EcsDefaultWorldProvider), order = 1)] public class EcsDefaultWorldProvider : EcsWorldProvider { - protected override EcsDefaultWorld BuildWorld(ConfigContainer configs) { return new EcsDefaultWorld(configs, WorldID); } + protected override EcsDefaultWorld BuildWorld(ConfigContainer configs) { return new EcsDefaultWorld(configs, null, WorldID); } } } diff --git a/src/Buildin/EcsDefaultWorldSingletonProvider.cs b/src/Buildin/EcsDefaultWorldSingletonProvider.cs index fbd0b25..2f2abc2 100644 --- a/src/Buildin/EcsDefaultWorldSingletonProvider.cs +++ b/src/Buildin/EcsDefaultWorldSingletonProvider.cs @@ -14,6 +14,6 @@ return _instance; } } - protected override EcsDefaultWorld BuildWorld(ConfigContainer configs) { return new EcsDefaultWorld(configs, WorldID); } + protected override EcsDefaultWorld BuildWorld(ConfigContainer configs) { return new EcsDefaultWorld(configs, null, WorldID); } } } diff --git a/src/Buildin/EcsRootUnity.cs b/src/Buildin/EcsRootUnity.cs index fbf4531..d859dab 100644 --- a/src/Buildin/EcsRootUnity.cs +++ b/src/Buildin/EcsRootUnity.cs @@ -77,6 +77,7 @@ namespace DCFApixels.DragonECS private void OnDrawGizmos() { + Gizmos.DrawIcon(transform.position, "", false); _pipeline?.DrawGizmos(); } diff --git a/src/Buildin/EcsWorldProvider.cs b/src/Buildin/EcsWorldProvider.cs index 45e2735..8f4f35e 100644 --- a/src/Buildin/EcsWorldProvider.cs +++ b/src/Buildin/EcsWorldProvider.cs @@ -5,6 +5,6 @@ namespace DCFApixels.DragonECS [CreateAssetMenu(fileName = nameof(EcsWorldProvider), menuName = EcsConsts.FRAMEWORK_NAME + "/WorldProviders/" + nameof(EcsWorldProvider), order = 1)] public class EcsWorldProvider : EcsWorldProvider { - protected override EcsWorld BuildWorld(ConfigContainer configs) { return new EcsWorld(configs, WorldID); } + protected override EcsWorld BuildWorld(ConfigContainer configs) { return new EcsWorld(configs, null, WorldID); } } } diff --git a/src/Internal/ArrayUtility.cs b/src/Internal/ArrayUtility.cs index f55393e..b17c463 100644 --- a/src/Internal/ArrayUtility.cs +++ b/src/Internal/ArrayUtility.cs @@ -71,4 +71,75 @@ namespace DCFApixels.DragonECS.Unity.Internal void IEnumerator.Reset() { throw new NotSupportedException(); } } } + + internal static class ArrayUtility + { + private static int GetHighBitNumber(uint bits) + { + if (bits == 0) + { + return -1; + } + int bit = 0; + if ((bits & 0xFFFF0000) != 0) + { + bits >>= 16; + bit |= 16; + } + if ((bits & 0xFF00) != 0) + { + bits >>= 8; + bit |= 8; + } + if ((bits & 0xF0) != 0) + { + bits >>= 4; + bit |= 4; + } + if ((bits & 0xC) != 0) + { + bits >>= 2; + bit |= 2; + } + if ((bits & 0x2) != 0) + { + bit |= 1; + } + return bit; + } + public static int NormalizeSizeToPowerOfTwo(int minSize) + { + unchecked + { + return 1 << (GetHighBitNumber((uint)minSize - 1u) + 1); + } + } + public static int NormalizeSizeToPowerOfTwo_ClampOverflow(int minSize) + { + unchecked + { + int hibit = (GetHighBitNumber((uint)minSize - 1u) + 1); + if (hibit >= 32) + { + return int.MaxValue; + } + return 1 << hibit; + } + } + public static void Fill(T[] array, T value, int startIndex = 0, int length = -1) + { + if (length < 0) + { + length = array.Length; + } + else + { + length = startIndex + length; + } + for (int i = startIndex; i < length; i++) + { + array[i] = value; + } + } + } } \ No newline at end of file diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index 9649305..8dac123 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -3,8 +3,10 @@ using DCFApixels.DragonECS.Unity.Internal; using System; using System.Collections.Generic; + //using System.Drawing; using System.Reflection; +using System.Runtime.InteropServices; using Unity.Collections.LowLevel.Unsafe; using UnityEditor; using UnityEditor.IMGUI.Controls; @@ -15,7 +17,7 @@ using UnityObject = UnityEngine.Object; namespace DCFApixels.DragonECS.Unity.Editors { - internal static class EcsGUI + internal static partial class EcsGUI { #region Scores private static int _changedCounter = 0; @@ -1013,7 +1015,6 @@ namespace DCFApixels.DragonECS.Unity.Editors /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - public static partial class Layout { public static void ScriptAssetButton(MonoScript script, params GUILayoutOption[] options) @@ -1302,12 +1303,14 @@ namespace DCFApixels.DragonECS.Unity.Editors GUILayout.EndVertical(); } } + + #region Default DrawRuntimeData [InitializeOnLoadMethod] private static void ResetRuntimeComponentReflectionCache() { _runtimeComponentReflectionCaches.Clear(); } - private class RuntimeComponentReflectionCache + internal class RuntimeComponentReflectionCache { public readonly Type Type; @@ -1481,6 +1484,290 @@ namespace DCFApixels.DragonECS.Unity.Editors expandMatrix.Up(); return changed; } + #endregion + + #region FactMode DrawRuntimeData + private class InspectorTypeInfo + { + #region cahce + private static Dictionary _typeInfosCache = new Dictionary(); + public static InspectorTypeInfo Get(Type type) + { + if (_typeInfosCache.TryGetValue(type, out InspectorTypeInfo info) == false) + { + info = new InspectorTypeInfo(type); + _typeInfosCache.Add(type, info); + } + + return info; + } + #endregion + + public readonly Type Type; + public readonly InspectorFieldInfo[] Fields; + + #region Constructors + private static StructList CnstrBuffer = new StructList(32); + private static readonly char[] VectorFields = new char[] { 'x', 'y', 'z', 'w' }; + private static readonly char[] ColorFields = new char[] { 'r', 'g', 'b', 'a' }; + public InspectorTypeInfo(Type type) + { + CnstrBuffer.FastClear(); + Type = type; + var fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + foreach (var fieldInfo in fieldInfos) + { + InspectorFieldInfo.Union infoUniton = default; + ref InspectorFieldInfo.Constructor infocstr = ref infoUniton.Constructor; + + var fieldType = fieldInfo.FieldType; + + infocstr.FieldInfo = fieldInfo; + infocstr.Offset = UnsafeUtility.GetFieldOffset(fieldInfo); ; + infocstr.Size = UnsafeUtility.SizeOf(fieldType); ; + infocstr.Name = UnityEditorUtility.TransformFieldName(fieldType.Name); + infocstr.TypeID = FieldTypeIDUtitlity.GetFieldTypeIDFor(fieldType); + + #region Def custom types + if (infocstr.TypeID == FieldTypeID.Struct) + { + InspectorTypeInfo preDefinedTypeInfo = Get(fieldType); + infocstr.PreDefinedType = preDefinedTypeInfo; + int length = preDefinedTypeInfo.Fields.Length; + if (length >= 2 && length <= 3) + { + bool isCheck = true; + for (int i = 0; i < length; i++) + { + ref var field = ref preDefinedTypeInfo.Fields[i]; + if (char.ToLower(field.Name[0]) != VectorFields[i]) + { + isCheck = false; + break; + } + } + if (isCheck) + { + infocstr.TypeID = FieldTypeID.StructVector; + } + else + { + isCheck = true; + for (int i = 0; i < length; i++) + { + ref var field = ref preDefinedTypeInfo.Fields[i]; + if (char.ToLower(field.Name[0]) != ColorFields[i]) + { + isCheck = false; + break; + } + } + if (isCheck) + { + infocstr.TypeID = FieldTypeID.StructColor; + } + } + } + } + #endregion + + CnstrBuffer.Add(infoUniton.Result); + } + + Fields = CnstrBuffer.ToArray(); + Array.Sort(Fields); + } + #endregion + } + + private static class FieldTypeIDUtitlity + { + #region GetFieldTypeIDFor + public static FieldTypeID GetFieldTypeIDFor(Type type) + { + var size = UnsafeUtility.SizeOf(type); + if (type.IsClass) + { + if (typeof(UnityObject).IsAssignableFrom(type)) + { + return FieldTypeID.UnityObject; + } + if (type == typeof(string)) + { + return FieldTypeID.String; + } + if (type == typeof(AnimationCurve)) + { + return FieldTypeID.AnimationCurve; + } + if (type == typeof(Gradient)) + { + return FieldTypeID.Gradient; + } + if (type == typeof(Array)) + { + return FieldTypeID.RefArray; + } + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) + { + return FieldTypeID.RefArray; + } + + return FieldTypeID.Ref; + } + else + { + if (type.IsPrimitive) + { + if (UnsafeUtility.IsBlittable(type)) + { + switch (size) + { + case 1: + if (type == typeof(byte)) + { + return FieldTypeID.UInt; + } + if (type == typeof(sbyte)) + { + return FieldTypeID.Int; + } + break; + case 2: + if (type == typeof(ushort)) + { + return FieldTypeID.UInt; + } + if (type == typeof(short)) + { + return FieldTypeID.Int; + } + break; + case 4: + if (type == typeof(uint)) + { + return FieldTypeID.UInt; + } + if (type == typeof(int)) + { + return FieldTypeID.Int; + } + if (type == typeof(float)) + { + return FieldTypeID.Real; + } + break; + case 8: + if (type == typeof(ulong)) + { + return FieldTypeID.UInt; + } + if (type == typeof(long)) + { + return FieldTypeID.Int; + } + if (type == typeof(double)) + { + return FieldTypeID.Real; + } + break; + } + } + else + { + if (type == typeof(bool)) + { + return FieldTypeID.Bool; + } + } + } + else if (type.IsEnum) + { + return FieldTypeID.Enum; + } + + if (type == typeof(LayerMask)) + { + return FieldTypeID.LayerMask; + } + + return FieldTypeID.Struct; + } + } + #endregion + } + private enum FieldTypeID : byte + { + None = 0, + CantDisplayed, + + // leaf types + Bool, + Int, + UInt, + Real, + String, + Enum, + + UnityObject, + LayerMask, + Gradient, + AnimationCurve, + + // struct types + Struct, + Ref, + + // custom struct types + StructVector, + StructColor, + RefArray, + RefList, + } + + [StructLayout(LayoutKind.Sequential)] + private unsafe readonly struct InspectorFieldInfo : IEquatable, IComparable + { + public readonly FieldInfo FieldInfo; + public readonly InspectorTypeInfo PreDefinedType; + public readonly string Name; + public readonly int Offset; + public readonly int Size; + public readonly FieldTypeID ID; + + public int CompareTo(InspectorFieldInfo other) + { + return other.Offset - Offset; + } + public bool Equals(InspectorFieldInfo other) + { + return EqualityComparer.Default.Equals(this, other); + } + [StructLayout(LayoutKind.Sequential)] + public unsafe struct Constructor + { + public FieldInfo FieldInfo; + public InspectorTypeInfo PreDefinedType; + public string Name; + public int Offset; + public int Size; + public byte AxisCount; + public FieldTypeID TypeID; + } + [StructLayout(LayoutKind.Explicit)] + public struct Union + { + [FieldOffset(0)] + public Constructor Constructor; + [FieldOffset(0)] + public InspectorFieldInfo Result; + } + } + private unsafe static bool FastDrawRuntimeData(void* data, InspectorTypeInfo cache) + { + throw new NotImplementedException(); + } + #endregion } } } diff --git a/src/Internal/Editor/ExtendedEditor.cs b/src/Internal/Editor/ExtendedEditor.cs index 5648dc7..f9d4e6c 100644 --- a/src/Internal/Editor/ExtendedEditor.cs +++ b/src/Internal/Editor/ExtendedEditor.cs @@ -92,12 +92,35 @@ namespace DCFApixels.DragonECS.Unity.Editors { base.OnInspectorGUI(); } - - protected SerializedProperty FindProperty(string name) { return serializedObject.FindProperty(name); } + + + //Color proColor = (Color)new Color32(56, 56, 56, 255); + //Color plebColor = (Color)new Color32(194, 194, 194, 255); + //protected override void OnHeaderGUI() + //{ + // //base.OnHeaderGUI(); + // var rect = EditorGUILayout.GetControlRect(false, 0f); + // rect.height = EditorGUIUtility.singleLineHeight; + // rect.y -= rect.height; + // rect.x = 48; + // rect.xMax -= rect.x * 2f; + // + // //GUI.skin.settings + // EditorGUI.DrawRect(rect, EditorGUIUtility.isProSkin ? proColor : plebColor); + // + // //string header = (target as ComponentFolder).folderName; // <--- your variable + // string header = ""; + // if (string.IsNullOrEmpty(header)) + // { + // header = target.ToString() + 1; + // } + // + // EditorGUI.LabelField(rect, header, EditorStyles.boldLabel); + //} } internal abstract class ExtendedEditor : ExtendedEditor { diff --git a/src/Internal/Editor/UnityEditorUtility.cs b/src/Internal/Editor/UnityEditorUtility.cs index 4ec3289..7df6d82 100644 --- a/src/Internal/Editor/UnityEditorUtility.cs +++ b/src/Internal/Editor/UnityEditorUtility.cs @@ -103,12 +103,15 @@ namespace DCFApixels.DragonECS.Unity.Editors namespace DCFApixels.DragonECS.Unity.Editors { using UnityEditor; + using Assembly = System.Reflection.Assembly; [InitializeOnLoad] internal static partial class UnityEditorUtility { static UnityEditorUtility() { + _integrationAssembly = typeof(UnityEditorUtility).Assembly; + colorBoxeStyles = new SparseArray(); List serializableTypes = new List(); @@ -144,6 +147,7 @@ namespace DCFApixels.DragonECS.Unity.Editors //}).ToArray(); } + internal static readonly Assembly _integrationAssembly; internal static readonly Type[] _serializableTypes; internal static readonly TypeMeta[] _serializableTypeWithMetaIDMetas; private static readonly Dictionary _metaIDTypePairs = new Dictionary(); diff --git a/src/Internal/Icons/Color_Icon.png b/src/Internal/Icons/Color_Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..69278be0e0c0ef665c5155c9a970bf9adff9a537 GIT binary patch literal 13139 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 + { + internal T[] _items; + internal int _count; + public int Count + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _count; } + } + public int Capacity + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _items.Length; } + set + { + if (value <= _items.Length) { return; } + value = ArrayUtility.NormalizeSizeToPowerOfTwo(value); + Array.Resize(ref _items, value); + } + } + public T this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { +#if DEBUG + if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); } +#endif + return _items[index]; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { +#if DEBUG + if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); } +#endif + _items[index] = value; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public StructList(int capacity) + { + _items = new T[ArrayUtility.NormalizeSizeToPowerOfTwo(capacity)]; + _count = 0; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Add(T item) + { + if (_count >= _items.Length) + { + Array.Resize(ref _items, _items.Length << 1); + } + _items[_count++] = item; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int IndexOf(T item) + { + return Array.IndexOf(_items, item, 0, _count); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void SwapAt(int idnex1, int idnex2) + { + T tmp = _items[idnex1]; + _items[idnex1] = _items[idnex2]; + _items[idnex2] = tmp; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void FastRemoveAt(int index) + { +#if DEBUG + if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); } +#endif + _items[index] = _items[--_count]; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void RemoveAt(int index) + { +#if DEBUG + if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); } +#endif + _items[index] = _items[--_count]; + _items[_count] = default; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void RemoveAtWithOrder(int index) + { +#if DEBUG + if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); } +#endif + for (int i = index; i < _count;) + { + _items[i++] = _items[i]; + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Remove(T item) + { + int index = IndexOf(item); + if (index >= 0) + { + RemoveAt(index); + return true; + } + return false; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool RemoveWithOrder(T item) + { + int index = IndexOf(item); + if (index >= 0) + { + RemoveAtWithOrder(index); + return true; + } + return false; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void FastClear() + { + _count = 0; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Clear() + { + for (int i = 0; i < _count; i++) + { + _items[i] = default; + } + _count = 0; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ReadOnlySpan.Enumerator GetEnumerator() + { + return new ReadOnlySpan(_items, 0, _count).GetEnumerator(); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ReadOnlySpan ToReadOnlySpan() + { + return new ReadOnlySpan(_items, 0, _count); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public IEnumerable ToEnumerable() + { + return _items.Take(_count); + } + + public T[] ToArray() + { + T[] result = new T[_count]; + Array.Copy(_items, result, _count); + return _items; + } + } +} \ No newline at end of file diff --git a/src/Internal/Utils/StructList.cs.meta b/src/Internal/Utils/StructList.cs.meta new file mode 100644 index 0000000..1aeea41 --- /dev/null +++ b/src/Internal/Utils/StructList.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 366ced1c4c1442c4db00c5a2b8c5787d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Internal/Utils/Throw.cs b/src/Internal/Utils/Throw.cs new file mode 100644 index 0000000..03aa65d --- /dev/null +++ b/src/Internal/Utils/Throw.cs @@ -0,0 +1,12 @@ +using System; + +namespace DCFApixels.DragonECS.Unity.Internal +{ + internal static class Throw + { + internal static void ArgumentOutOfRange() + { + throw new ArgumentOutOfRangeException(); + } + } +} diff --git a/src/Internal/Utils/Throw.cs.meta b/src/Internal/Utils/Throw.cs.meta new file mode 100644 index 0000000..4b32348 --- /dev/null +++ b/src/Internal/Utils/Throw.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 525c4a5bc83fb3343b3b93a02d3caf59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs index 24f4085..96e2f52 100644 --- a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs +++ b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs @@ -1,7 +1,9 @@ #if UNITY_EDITOR using DCFApixels.DragonECS.Unity.Internal; using DCFApixels.DragonECS.Unity.RefRepairer.Editors; +using System; using UnityEditor; +using UnityEditor.Graphs; using UnityEditorInternal; using UnityEngine; diff --git a/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs b/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs index d5b7811..3f84c8f 100644 --- a/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs +++ b/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs @@ -2,6 +2,7 @@ using DCFApixels.DragonECS.Unity.Internal; using System; using UnityEngine; +using static UnityEngine.GraphicsBuffer; namespace DCFApixels.DragonECS { From f1666d2fcbd41589ab49cc67dec9043ee36d1946 Mon Sep 17 00:00:00 2001 From: ByteWarsJedi <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:34:15 +0800 Subject: [PATCH 3/6] stash --- src/DebugUtils/Editor/SettingsEditor.cs | 12 +- src/DebugUtils/Editor/UserSettingsPrefs.cs | 14 + src/Internal/Editor/EcsGUI.Layout.cs | 502 ++++++++++ src/Internal/Editor/EcsGUI.Layout.cs.meta | 11 + .../Editor/EcsGUI.RuntimeCumponents.cs | 896 ++++++++++++++++++ .../Editor/EcsGUI.RuntimeCumponents.cs.meta | 11 + src/Internal/Editor/EcsGUI.cs | 778 +-------------- src/Internal/Icons/Color_Icon.png | Bin 13139 -> 0 bytes src/Internal/Icons/Color_Icon.png.meta | 122 --- src/Internal/Icons/Gray_Icon.png | Bin 12860 -> 0 bytes src/Internal/Icons/Gray_Icon.png.meta | 122 --- src/Internal/Utils/StructList.cs | 16 + 12 files changed, 1465 insertions(+), 1019 deletions(-) create mode 100644 src/Internal/Editor/EcsGUI.Layout.cs create mode 100644 src/Internal/Editor/EcsGUI.Layout.cs.meta create mode 100644 src/Internal/Editor/EcsGUI.RuntimeCumponents.cs create mode 100644 src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta delete mode 100644 src/Internal/Icons/Color_Icon.png delete mode 100644 src/Internal/Icons/Color_Icon.png.meta delete mode 100644 src/Internal/Icons/Gray_Icon.png delete mode 100644 src/Internal/Icons/Gray_Icon.png.meta diff --git a/src/DebugUtils/Editor/SettingsEditor.cs b/src/DebugUtils/Editor/SettingsEditor.cs index 42ab0ed..6d63854 100644 --- a/src/DebugUtils/Editor/SettingsEditor.cs +++ b/src/DebugUtils/Editor/SettingsEditor.cs @@ -53,29 +53,25 @@ namespace DCFApixels.DragonECS.Unity.Editors //using (prefs.DisableAutoSave()) { - GUILayout.BeginHorizontal(); prefs.IsShowHidden = EditorGUILayout.ToggleLeft( UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsShowHidden)), prefs.IsShowHidden); - GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); prefs.IsShowInterfaces = EditorGUILayout.ToggleLeft( UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsShowInterfaces)), prefs.IsShowInterfaces); - GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); prefs.IsShowRuntimeComponents = EditorGUILayout.ToggleLeft( UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsShowRuntimeComponents)), prefs.IsShowRuntimeComponents); - GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); prefs.IsUseCustomNames = EditorGUILayout.ToggleLeft( UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsUseCustomNames)), prefs.IsUseCustomNames); - GUILayout.EndHorizontal(); + + prefs.IsFastModeRuntimeComponents = EditorGUILayout.ToggleLeft( + UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsFastModeRuntimeComponents)), + prefs.IsFastModeRuntimeComponents); prefs.ComponentColorMode = (ComponentColorMode)EditorGUILayout.EnumPopup(UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.ComponentColorMode)), prefs.ComponentColorMode); } diff --git a/src/DebugUtils/Editor/UserSettingsPrefs.cs b/src/DebugUtils/Editor/UserSettingsPrefs.cs index eb7f9cc..03a9c4c 100644 --- a/src/DebugUtils/Editor/UserSettingsPrefs.cs +++ b/src/DebugUtils/Editor/UserSettingsPrefs.cs @@ -69,6 +69,20 @@ namespace DCFApixels.DragonECS.Unity.Editors } } } + [SerializeField] + private bool _isFastModeRuntimeComponents = false; + public bool IsFastModeRuntimeComponents + { + get => _isFastModeRuntimeComponents; + set + { + if (_isFastModeRuntimeComponents != value) + { + _isFastModeRuntimeComponents = value; + AutoSave(); + } + } + } //[SerializeField] //private bool _poolsToggle = false; diff --git a/src/Internal/Editor/EcsGUI.Layout.cs b/src/Internal/Editor/EcsGUI.Layout.cs new file mode 100644 index 0000000..04dd5f0 --- /dev/null +++ b/src/Internal/Editor/EcsGUI.Layout.cs @@ -0,0 +1,502 @@ +#if UNITY_EDITOR +using DCFApixels.DragonECS.Unity.Internal; +using System; +using System.Collections.Generic; +using System.Reflection; +using Unity.Collections.LowLevel.Unsafe; +using UnityEditor; +using UnityEngine; +using Color = UnityEngine.Color; +using UnityComponent = UnityEngine.Component; +using UnityObject = UnityEngine.Object; + +namespace DCFApixels.DragonECS.Unity.Editors +{ + internal static partial class EcsGUI + { + public static partial class Layout + { + public static void ScriptAssetButton(MonoScript script, params GUILayoutOption[] options) + { + EcsGUI.ScriptAssetButton(GUILayoutUtility.GetRect(UnityEditorUtility.GetLabelTemp(), EditorStyles.miniButton, options), script); + } + + + public static void CopyMetaIDButton(string metaID, params GUILayoutOption[] options) + { + Rect r = GUILayoutUtility.GetRect(UnityEditorUtility.GetLabelTemp(), EditorStyles.miniButton, options); + var current = Event.current; + var hover = IconHoverScan(r, current); + using (new ColorScope(new Color(1f, 1f, 1f, hover ? 1f : 0.8f))) + { + DrawIcon(r, Icons.Instance.MetaIDIcon, hover ? 1f : 2f, metaID); + if (hover && current.type == EventType.MouseUp) + { + GUIUtility.systemCopyBuffer = metaID; + } + } + } + public static bool IconButton(Texture icon, params GUILayoutOption[] options) + { + bool result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty), options); + DrawIcon(GUILayoutUtility.GetLastRect(), icon, 0, null); + return result; + } + public static bool IconButton(Texture icon, float iconPadding = 0, string description = null) + { + bool result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty)); + DrawIcon(GUILayoutUtility.GetLastRect(), icon, iconPadding, description); + return result; + } + public static bool IconButton(Texture icon, float iconPadding = 0, string description = null, GUIStyle style = null, params GUILayoutOption[] options) + { + bool result; + if (style == null) + { + result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty), options); + } + else + { + result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty), style, options); + } + DrawIcon(GUILayoutUtility.GetLastRect(), icon, iconPadding, description); + return result; + } + + public static void DrawEmptyComponentProperty(SerializedProperty property, string name, bool isDisplayEmpty) + { + EcsGUI.DrawEmptyComponentProperty(GUILayoutUtility.GetRect(UnityEditorUtility.GetLabel(name), EditorStyles.label), property, name, isDisplayEmpty); + } + public static void DrawEmptyComponentProperty(SerializedProperty property, GUIContent label, bool isDisplayEmpty) + { + EcsGUI.DrawEmptyComponentProperty(GUILayoutUtility.GetRect(label, EditorStyles.label), property, label, isDisplayEmpty); + } + public static void DrawWorldBaseInfo(EcsWorld world) + { + bool isNull = world == null || world.IsDestroyed || world.ID == 0; + int entitesCount = isNull ? 0 : world.Count; + int capacity = isNull ? 0 : world.Capacity; + long Version = isNull ? 0 : world.Version; + int leakedEntitesCount = isNull ? 0 : world.CountLeakedEntitesDebug(); + EditorGUILayout.IntField("Entities", entitesCount, EditorStyles.boldLabel); + EditorGUILayout.IntField("Capacity", capacity, EditorStyles.boldLabel); + EditorGUILayout.LongField("Version", Version, EditorStyles.boldLabel); + Color color = leakedEntitesCount > 0 ? Color.yellow : GUI.contentColor; + using (new ContentColorScope(color)) + { + EditorGUILayout.IntField("Leaked Entites", leakedEntitesCount, EditorStyles.boldLabel); + } + } + public static void DrawWorldComponents(EcsWorld world) + { + bool isNull = world == null || world.IsDestroyed || world.ID == 0; + if (isNull) { return; } + using (BeginVertical(UnityEditorUtility.GetStyle(Color.black, 0.2f))) + { + IsShowRuntimeComponents = EditorGUILayout.BeginFoldoutHeaderGroup(IsShowRuntimeComponents, "RUNTIME COMPONENTS", EditorStyles.foldout); + EditorGUILayout.EndFoldoutHeaderGroup(); + if (IsShowRuntimeComponents == false) { return; } + + var worldID = world.ID; + var cmps = world.GetWorldComponents(); + int index = -1; + int total = 9; + foreach (var cmp in cmps) + { + index++; + var meta = cmp.ComponentType.ToMeta(); + if (meta.IsHidden == false || IsShowHidden) + { + Type componentType = cmp.ComponentType; + + object data = cmp.GetRaw(worldID); + + ExpandMatrix expandMatrix = ExpandMatrix.Take(componentType); + + float padding = EditorGUIUtility.standardVerticalSpacing; + Rect optionButton = GUILayoutUtility.GetLastRect(); + optionButton.yMin = optionButton.yMax; + optionButton.yMax += HeadIconsRect.height; + optionButton.xMin = optionButton.xMax - 64; + optionButton.center += Vector2.up * padding * 2f; + //Canceling isExpanded + if (ClickTest(optionButton)) + { + ref bool isExpanded = ref expandMatrix.Down(); + isExpanded = !isExpanded; + } + + Color panelColor = SelectPanelColor(meta, index, total); + GUILayout.BeginVertical(UnityEditorUtility.GetStyle(panelColor, EscEditorConsts.COMPONENT_DRAWER_ALPHA)); + EditorGUI.BeginChangeCheck(); + + ////Close button + //optionButton.xMin = optionButton.xMax - HeadIconsRect.width; + //if (CloseButton(optionButton)) + //{ + // cmp.Del(worldID); + // return; + //} + + //Edit script button + if (ScriptsCache.TryGetScriptAsset(meta, out MonoScript script)) + { + optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); + EcsGUI.ScriptAssetButton(optionButton, script); + } + //Description icon + if (string.IsNullOrEmpty(meta.Description.Text) == false) + { + optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); + DescriptionIcon(optionButton, meta.Description.Text); + } + + RuntimeComponentReflectionCache.FieldInfoData componentInfoData = new RuntimeComponentReflectionCache.FieldInfoData(null, componentType, meta.Name); + if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) + { + cmp.SetRaw(worldID, resultData); + } + + GUILayout.EndVertical(); + } + } + } + } + + #region entity bar + public static void EntityBarForAlive(EntityStatus status, int id, short gen, short world) + { + float width = EditorGUIUtility.currentViewWidth; + float height = EntityBarHeight; + EcsGUI.EntityBarForAlive(GUILayoutUtility.GetRect(width, height), status, id, gen, world); + } + public static void EntityBar(EntityStatus status, bool isPlaceholder, int id, short gen, short world) + { + float width = EditorGUIUtility.currentViewWidth; + float height = EntityBarHeight; + EcsGUI.EntityBar(GUILayoutUtility.GetRect(width, height), isPlaceholder, status, id, gen, world); + } + public static void EntityBar(int id, short gen, short world) + { + float width = EditorGUIUtility.currentViewWidth; + float height = EntityBarHeight; + EcsGUI.EntityBar(GUILayoutUtility.GetRect(width, height), id, gen, world); + } + public static void EntityBar() + { + float width = EditorGUIUtility.currentViewWidth; + float height = EntityBarHeight; + EcsGUI.EntityBar(GUILayoutUtility.GetRect(width, height)); + } + #endregion + + public static bool AddComponentButtons(out Rect dropDownRect) + { + return EcsGUI.AddComponentButton(GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, 24f), out dropDownRect); + } + public static AddClearButton AddClearComponentButtons(out Rect dropDownRect) + { + return EcsGUI.AddClearComponentButtons(GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, 24f), out dropDownRect); + } + public static AddClearButton AddClearSystemButtons(out Rect dropDownRect) + { + return EcsGUI.AddClearSystemButtons(GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, 24f), out dropDownRect); + } + public static void DrawRuntimeComponents(entlong entity, bool isWithFoldout = true) + { + if (entity.TryUnpackForUnityEditor(out int entityID, out _, out _, out EcsWorld world)) + { + DrawRuntimeComponents(entityID, world, isWithFoldout); + } + } + + [ThreadStatic] + private static List _componentPoolsBuffer; + public static void DrawRuntimeComponents(int entityID, EcsWorld world, bool isWithFoldout = true) + { + using (BeginVertical(UnityEditorUtility.GetStyle(Color.black, 0.2f))) + { + if (isWithFoldout) + { + IsShowRuntimeComponents = EditorGUILayout.BeginFoldoutHeaderGroup(IsShowRuntimeComponents, "RUNTIME COMPONENTS", EditorStyles.foldout); + EditorGUILayout.EndFoldoutHeaderGroup(); + } + if (isWithFoldout == false || IsShowRuntimeComponents) + { + if (AddComponentButtons(out Rect dropDownRect)) + { + RuntimeComponentsUtility.GetAddComponentGenericMenu(world).Open(dropDownRect, entityID); + } + + GUILayout.Box("", UnityEditorUtility.GetStyle(GUI.color, 0.16f), GUILayout.ExpandWidth(true)); + IsShowHidden = EditorGUI.Toggle(GUILayoutUtility.GetLastRect(), "Show Hidden", IsShowHidden); + + if (_componentPoolsBuffer == null) + { + _componentPoolsBuffer = new List(64); + } + world.GetComponentPoolsFor(entityID, _componentPoolsBuffer); + int i = 0; + //int iMax = _componentPoolsBuffer.Count; + foreach (var componentPool in _componentPoolsBuffer) + { + DrawRuntimeComponent(entityID, componentPool, 9, i++); + } + } + } + } + private static void DrawRuntimeComponent(int entityID, IEcsPool pool, int total, int index) + { + var meta = pool.ComponentType.ToMeta(); + if (meta.IsHidden == false || IsShowHidden) + { + Type componentType = pool.ComponentType; + + object data = pool.GetRaw(entityID); + + ExpandMatrix expandMatrix = ExpandMatrix.Take(componentType); + + float padding = EditorGUIUtility.standardVerticalSpacing; + Rect optionButton = GUILayoutUtility.GetLastRect(); + optionButton.yMin = optionButton.yMax; + optionButton.yMax += HeadIconsRect.height; + optionButton.xMin = optionButton.xMax - 64; + optionButton.center += Vector2.up * padding * 2f; + //Canceling isExpanded + if (ClickTest(optionButton)) + { + ref bool isExpanded = ref expandMatrix.Down(); + isExpanded = !isExpanded; + } + + Color panelColor = SelectPanelColor(meta, index, total); + GUILayout.BeginVertical(UnityEditorUtility.GetStyle(panelColor, EscEditorConsts.COMPONENT_DRAWER_ALPHA)); + EditorGUI.BeginChangeCheck(); + + //Close button + optionButton.xMin = optionButton.xMax - HeadIconsRect.width; + if (CloseButton(optionButton)) + { + pool.Del(entityID); + return; + } + //Edit script button + if (ScriptsCache.TryGetScriptAsset(meta, out MonoScript script)) + { + optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); + EcsGUI.ScriptAssetButton(optionButton, script); + } + //Description icon + if (string.IsNullOrEmpty(meta.Description.Text) == false) + { + optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); + DescriptionIcon(optionButton, meta.Description.Text); + } + + RuntimeComponentReflectionCache.FieldInfoData componentInfoData = new RuntimeComponentReflectionCache.FieldInfoData(null, componentType, meta.Name); + + if (IsFastModeRuntimeComponents) + { + if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) + { + pool.SetRaw(entityID, resultData); + } + } + else + { + if (DrawProperty(data)) + { + pool.SetRaw(entityID, data); + } + } + + + GUILayout.EndVertical(); + } + } + + #region Default DrawRuntimeData + [InitializeOnLoadMethod] + private static void ResetRuntimeComponentReflectionCache() + { + _runtimeComponentReflectionCaches.Clear(); + } + internal class RuntimeComponentReflectionCache + { + public readonly Type Type; + + public readonly bool IsUnityObjectType; + public readonly bool IsUnitySerializable; + public readonly bool IsUnmanaged; + + public readonly FieldInfoData[] Fields; + + public readonly RefEditorWrapper Wrapper; + + public RuntimeComponentReflectionCache(Type type) + { + Type = type; + + IsUnmanaged = UnsafeUtility.IsUnmanaged(type); + IsUnityObjectType = typeof(UnityObject).IsAssignableFrom(type); + IsUnitySerializable = IsUnityObjectType || (!type.IsGenericType && type.IsSerializable); + + Wrapper = RefEditorWrapper.Take(); + + if (type == typeof(void)) { return; } + + if (IsUnitySerializable == false) + { + var fs = type.GetFields(fieldFlags); + Fields = new FieldInfoData[fs.Length]; + for (int i = 0; i < fs.Length; i++) + { + var f = fs[i]; + Fields[i] = new FieldInfoData(f); + } + } + } + public readonly struct FieldInfoData + { + public readonly FieldInfo FieldInfo; + public readonly Type FieldType; + public readonly string UnityFormatName; + public readonly bool IsUnityObjectField; + public FieldInfoData(FieldInfo fieldInfo) + { + FieldInfo = fieldInfo; + FieldType = fieldInfo.FieldType; + IsUnityObjectField = typeof(UnityObject).IsAssignableFrom(fieldInfo.FieldType); + UnityFormatName = UnityEditorUtility.TransformFieldName(fieldInfo.Name); + } + public FieldInfoData(FieldInfo fieldInfo, Type fieldType, string unityFormatName) + { + FieldInfo = fieldInfo; + FieldType = fieldType; + UnityFormatName = unityFormatName; + IsUnityObjectField = typeof(UnityObject).IsAssignableFrom(fieldType); + } + } + } + private static Dictionary _runtimeComponentReflectionCaches = new Dictionary(); + private static RuntimeComponentReflectionCache GetRuntimeComponentReflectionCache(Type type) + { + if (_runtimeComponentReflectionCaches.TryGetValue(type, out RuntimeComponentReflectionCache result) == false) + { + result = new RuntimeComponentReflectionCache(type); + _runtimeComponentReflectionCaches.Add(type, result); + } + return result; + } + private static bool DrawRuntimeData(ref RuntimeComponentReflectionCache.FieldInfoData fieldInfoData, GUIContent label, ExpandMatrix expandMatrix, object data, out object outData) + { + outData = data; + Type type = data == null ? typeof(void) : data.GetType(); + + RuntimeComponentReflectionCache cache = GetRuntimeComponentReflectionCache(type); + + bool isUnityObjectField = fieldInfoData.IsUnityObjectField; + if (isUnityObjectField == false && data == null) + { + EditorGUILayout.TextField(label, "Null"); + return false; + } + bool isUnityObjectType = cache.IsUnityObjectType; + + ref bool isExpanded = ref expandMatrix.Down(); + bool changed = false; + + + if (cache.IsUnitySerializable == false) + { + isExpanded = EditorGUILayout.BeginFoldoutHeaderGroup(isExpanded, label, EditorStyles.foldout); + EditorGUILayout.EndFoldoutHeaderGroup(); + + if (isExpanded) + { + using (UpIndentLevel()) + { + for (int j = 0, jMax = cache.Fields.Length; j < jMax; j++) + { + var field = cache.Fields[j]; + if (DrawRuntimeData(ref field, UnityEditorUtility.GetLabel(field.UnityFormatName), expandMatrix, field.FieldInfo.GetValue(data), out object fieldData)) + { + field.FieldInfo.SetValue(data, fieldData); + outData = data; + changed = true; + } + } + } + } + } + else + { + Type fieldType = fieldInfoData.FieldType; + if (isUnityObjectType || isUnityObjectField) + { + EditorGUI.BeginChangeCheck(); + var uobj = UnsafeUtility.As(ref data); + + bool isComponent = typeof(UnityComponent).IsAssignableFrom(fieldType); + if (isComponent) + { + uobj = EditorGUILayout.ObjectField(label, uobj, typeof(UnityObject), true); + } + else + { + uobj = EditorGUILayout.ObjectField(label, uobj, fieldType, true); + } + + if (EditorGUI.EndChangeCheck()) + { + if (isComponent && uobj is GameObject go) + { + uobj = go.GetComponent(fieldType); + } + + outData = uobj; + changed = true; + } + } + else + { + EditorGUI.BeginChangeCheck(); + //WrapperBase wrapper = RefEditorWrapper.Take(data); + + RefEditorWrapper wrapper = cache.Wrapper; + + wrapper.data = data; + wrapper.SO.Update(); + + wrapper.IsExpanded = isExpanded; + try + { + EditorGUILayout.PropertyField(wrapper.Property, label, true); + } + catch (ArgumentException) + { + if (Event.current.type != EventType.Repaint) + { + throw; + } + } + + if (EditorGUI.EndChangeCheck()) + { + isExpanded = wrapper.IsExpanded; + wrapper.SO.ApplyModifiedProperties(); + outData = wrapper.Data; + changed = true; + } + //wrapper.Release(); + } + } + + expandMatrix.Up(); + return changed; + } + #endregion + } + } +} +#endif \ No newline at end of file diff --git a/src/Internal/Editor/EcsGUI.Layout.cs.meta b/src/Internal/Editor/EcsGUI.Layout.cs.meta new file mode 100644 index 0000000..f0151db --- /dev/null +++ b/src/Internal/Editor/EcsGUI.Layout.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7a7468927b696e4899e73de0866d947 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs new file mode 100644 index 0000000..fce80f9 --- /dev/null +++ b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs @@ -0,0 +1,896 @@ +using DCFApixels.DragonECS.Unity.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using Unity.Collections.LowLevel.Unsafe; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; +using Color = UnityEngine.Color; +using Debug = UnityEngine.Debug; +using UnityObject = UnityEngine.Object; + +namespace DCFApixels.DragonECS.Unity.Editors +{ + internal unsafe static partial class EcsGUI + { + [StructLayout(LayoutKind.Explicit)] + private struct PtrRefUnion + { + [FieldOffset(0)] + public void* Ptr; + [FieldOffset(0)] + public object Ref; + public PtrRefUnion(void* ptr) : this() + { + Ptr = ptr; + } + } + + #region Value + private readonly unsafe struct Value + { + public readonly byte* FieldPtr; + public readonly byte* ValuePtr; + public Value(byte* fieldPtr, byte* valuePtr) + { + FieldPtr = fieldPtr; + ValuePtr = valuePtr; + } + public Value Read(in InspectorFieldInfo field) + { + return Read(in this, field.Offset, field.Flag == FieldFlag.Ref); + } + public Value Read(int fieldOffset, bool isRef) + { + return Read(in this, fieldOffset, isRef); + } + public static Value Read(in Value source, in InspectorFieldInfo field) + { + return Read(in source, field.Offset, field.Flag == FieldFlag.Ref); + } + public static Value Read(in Value source, int fieldOffset, bool isRef) + { + byte* fieldPtr = source.ValuePtr + fieldOffset; + byte* valuePtr; + if (isRef) + { + IntPtr* refPtr = (IntPtr*)fieldPtr; + valuePtr = (byte*)&refPtr; + } + else + { + valuePtr = fieldPtr; + } + return new Value(fieldPtr, valuePtr); + } + public ref T AsValue() where T : struct + { +#if DEV_MODE + if (FieldPtr != ValuePtr) { throw new Exception(); } +#endif + return ref UnsafeUtility.AsRef(FieldPtr); + } + public T AsRef() where T : class + { +#if DEV_MODE + if (FieldPtr == ValuePtr) { throw new Exception(); } +#endif + + //ref IntPtr p = ref UnsafeUtility.AsRef(ValuePtr); + //byte* pp = (byte*)p; + // + //Union union = default; + ////union.Ptr = ValuePtr; // ValuePtr это какраз и есть реф + //union.Ptr = pp; // ValuePtr это какраз и есть реф + ////object result = union.Ref; + // + //object result = UnsafeUtility.As(ref p); + //return (T)result; + + PtrRefUnion union = default; + union.Ptr = ValuePtr; // ValuePtr это какраз и есть реф + object result = union.Ref; + return (T)result; + } + public object AsRef() + { + return AsRef(); + } + } + #endregion + + #region FieldValueProcessor + private abstract class FieldValueProcessor + { + private static readonly Dictionary _processors = new Dictionary(); + private static readonly StructFieldValueProcessor _defaultProcessor = new StructFieldValueProcessor(); + static FieldValueProcessor() + { + _processors.Clear(); + _defaultProcessor._valueInfo = InspectorTypeInfo.Get(typeof(object)); + _processors.Add(typeof(object), _defaultProcessor); + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + foreach (var processorType in assembly.GetTypes()) + { + if (processorType.IsGenericType == false && + processorType.IsAbstract == false && + typeof(FieldValueProcessor).IsAssignableFrom(processorType) && + processorType != typeof(StructFieldValueProcessor)) + { + var processor = (FieldValueProcessor)Activator.CreateInstance(processorType); + processor._valueInfo = InspectorTypeInfo.Get(processor.ProcessedType); + _processors.Add(processor.ProcessedType, processor); + } + } + } + } + public static FieldValueProcessor GetProcessor(Type type) + { + if(type == null) + { + throw new ArgumentNullException("type"); + } + + if (_processors == null) + { + throw new Exception("_processors == null"); + } + if (_processors.TryGetValue(type, out FieldValueProcessor processor) == false) + { + FieldValueProcessor otherProcessor; + if (type.IsValueType) + { + otherProcessor = _defaultProcessor; + } + else + { + otherProcessor = GetProcessor(type.BaseType); + } + + processor = (FieldValueProcessor)otherProcessor.MemberwiseClone(); + processor._valueInfo = InspectorTypeInfo.Get(type); + _processors.Add(type, processor); + } + return processor; + } + + + private InspectorTypeInfo _valueInfo; + public InspectorTypeInfo ValueInfo + { + get { return _valueInfo; } + } + public bool IsDefault + { + get { return this == _defaultProcessor; } + } + public abstract Type ProcessedType { get; } + public abstract float GetHeight(in InspectorFieldInfo field, in Value value); + public abstract void Draw(Rect rect, in InspectorFieldInfo field, in Value value); + + public override string ToString() + { + if(_valueInfo == null) + { + return "ERROR"; + } + return _valueInfo.Type.Name + " " + GetType().Name; + } + } + private class StructFieldValueProcessor : FieldValueProcessor + { + public override Type ProcessedType { get { return typeof(object); } } + public override float GetHeight(in InspectorFieldInfo field, in Value value) + { + float result = GetPropertyHeight(field, ValueInfo, value); + Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + return result; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) + { + Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + DrawProperty(rect, field, ValueInfo, value); + } + } + private class ValueFieldValueProcessor : StructFieldValueProcessor where T : struct + { + public sealed override Type ProcessedType { get { return typeof(T); } } + public sealed override float GetHeight(in InspectorFieldInfo field, in Value value) + { + float result = GetHeight(field, value, ref value.AsValue()); + Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + return result; + } + public sealed override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) + { + Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + Draw(rect, field, value, ref value.AsValue()); + } + public virtual float GetHeight(in InspectorFieldInfo field, in Value raw, ref T value) + { + return base.GetHeight(field, raw); + } + public virtual void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref T value) + { + base.Draw(rect, field, raw); + } + } + private class RefFieldValueProcessor : StructFieldValueProcessor where T : class + { + public sealed override Type ProcessedType { get { return typeof(T); } } + public sealed override float GetHeight(in InspectorFieldInfo field, in Value value) + { + float result = GetHeight(field, value, value.AsRef()); + Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + return result; + } + public sealed override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) + { + Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + Draw(rect, field, value, value.AsRef()); + } + public virtual float GetHeight(in InspectorFieldInfo field, in Value raw, T value) + { + return base.GetHeight(field, raw); + } + public virtual void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, T value) + { + base.Draw(rect, field, raw); + } + } + private unsafe class ArrayFieldValueProcessor : RefFieldValueProcessor + { + private static readonly int _mappingDataOffset; + static ArrayFieldValueProcessor() + { + Array array = new int[] { 1, 2, 3 }; + ulong handle; + + byte* ptrObject = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(array, out handle); + UnsafeUtility.ReleaseGCObject(handle); + byte* ptrData = (byte*)UnsafeUtility.PinGCArrayAndGetDataAddress(array, out handle); + UnsafeUtility.ReleaseGCObject(handle); + + _mappingDataOffset = (int)(ptrData - ptrObject); + } + + + private readonly ReorderableList _listDragCache; // сюда попадает _list если было вызвано событие драг енд дропа, а изначальный _listDragCache перемещается в _list + private readonly ReorderableList _list; + public ArrayFieldValueProcessor() + { + //_list.list + } + public override float GetHeight(in InspectorFieldInfo field, in Value raw, Array value) + { + //var elemType = value.GetType().GetElementType(); + //int length = value.Length; + //byte* ptr = raw.ValuePtr + _mappingDataOffset; + // + // + //_list.heigh + // + //ReorderableList l = null; + //l.onMouseDragCallback + // + //float result = 0; + //var processor = GetProcessor(elemType); + //for (int i = 0; i < length; i++) + //{ + // + //} + + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, Array value) + { + //var elemType = value.GetType().GetElementType(); + //int length = value.Length; + //byte* ptr = raw.ValuePtr + _mappingDataOffset; + // + + EditorGUI.LabelField(rect, UnityEditorUtility.GetLabel(field.Name), "Array Unsupport"); + } + } + private class SByteFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref sbyte value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref sbyte value) + { + value = (sbyte)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class ByteFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref byte value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref byte value) + { + value = (byte)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class ShortFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref short value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref short value) + { + value = (short)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class UShortFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref ushort value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref ushort value) + { + value = (ushort)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class IntFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref int value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref int value) + { + value = EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class UIntFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref uint value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref uint value) + { + value = (uint)EditorGUI.LongField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class LongFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref long value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref long value) + { + value = EditorGUI.LongField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class ULongFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref ulong value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref ulong value) + { + value = (ulong)EditorGUI.LongField(rect, UnityEditorUtility.GetLabel(field.Name), (long)value); + } + } + private class FloatFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref float value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref float value) + { + value = EditorGUI.FloatField(rect, UnityEditorUtility.GetLabel(field.Name), (long)value); + } + } + private class DoubleFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref double value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref double value) + { + value = EditorGUI.DoubleField(rect, UnityEditorUtility.GetLabel(field.Name), (long)value); + } + } + private class CharFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref char value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref char value) + { + var result = EditorGUI.TextField(rect, UnityEditorUtility.GetLabel(field.Name), value.ToString()); + if(result.Length > 0) + { + value = result[0]; + } + value = default; + } + } + private class ColorFieldValueProcessor : ValueFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref Color value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref Color value) + { + value = EditorGUI.ColorField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class StringFieldValueProcessor : RefFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, string value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, string value) + { + value = EditorGUI.TextField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class GradientFieldValueProcessor : RefFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, Gradient value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, Gradient value) + { + value = EditorGUI.GradientField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class CurveFieldValueProcessor : RefFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, AnimationCurve value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, AnimationCurve value) + { + value = EditorGUI.CurveField(rect, UnityEditorUtility.GetLabel(field.Name), value); + } + } + private class UnityObjectFieldValueProcessor : RefFieldValueProcessor + { + public override float GetHeight(in InspectorFieldInfo field, in Value raw, UnityObject value) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, UnityObject value) + { + value = EditorGUI.ObjectField(rect, UnityEditorUtility.GetLabel(field.Name), value, ValueInfo.Type, true); + } + } + #endregion + + #region InspectorTypeInfo + private class InspectorTypeInfo + { + #region cahce + private static Dictionary _typeInfosCache = new Dictionary(); + static InspectorTypeInfo() + { + _typeInfosCache.Clear(); + } + public static InspectorTypeInfo Get(Type type) + { + if (_typeInfosCache.TryGetValue(type, out InspectorTypeInfo info) == false) + { + info = new InspectorTypeInfo(type); + _typeInfosCache.Add(type, info); + } + + return info; + } + #endregion + private struct FakeNull { } + public static readonly InspectorTypeInfo PtrTypeInfo = new InspectorTypeInfo(typeof(IntPtr)); + public static readonly InspectorTypeInfo NullTypeInfo = new InspectorTypeInfo(typeof(FakeNull)); + + public readonly Type Type; + //public readonly int Size; + public readonly InspectorFieldInfo[] Fields; + //public readonly float DefaultInspectorHegiht; + + public readonly bool IsVector; + public readonly bool IsColor; + + public bool IsNull + { + get { return this == NullTypeInfo; } + } + public bool IsPrt + { + get { return this == PtrTypeInfo; } + } + + #region Constructors + //private static StructList CnstrBuffer = new StructList(32); + private static readonly char[] VectorFields = new char[] { 'x', 'y', 'z', 'w' }; + private static readonly char[] ColorFields = new char[] { 'r', 'g', 'b', 'a' }; + public InspectorTypeInfo(Type type) + { + StructList CnstrBuffer = new StructList(32); + //if (CnstrBuffer.IsNull) + //{ + // CnstrBuffer = new StructList(32); + //} + CnstrBuffer.FastClear(); + Type = type; + //Size = UnsafeUtility.SizeOf(type); + var fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + foreach (var fieldInfo in fieldInfos) + { + InspectorFieldInfo.Union infoUniton = default; + ref InspectorFieldInfo.Constructor infocstr = ref infoUniton.Constructor; + + var fieldType = fieldInfo.FieldType; + + infocstr.FieldInfo = fieldInfo; + infocstr.Offset = UnsafeUtility.GetFieldOffset(fieldInfo); + infocstr.Name = UnityEditorUtility.TransformFieldName(fieldType.Name); + infocstr.Flag = FieldFlagUtitlity.GetFieldFlag(fieldType); + + Debug.LogWarning("Offset: " + type.Name + "." + infocstr.Name + "." + infocstr.Offset); + + + if (infocstr.Flag == FieldFlag.Struct) + { + infocstr.PreDefinedType = Get(fieldType); + } + else if (infocstr.Flag == FieldFlag.Ref) + { + infocstr.PreDefinedType = PtrTypeInfo; + } + else + { + infocstr.PreDefinedType = NullTypeInfo; + } + + CnstrBuffer.Add(infoUniton.Result); + } + + Fields = CnstrBuffer.Enumerable.ToArray(); + Array.Sort(Fields); + + int length = Fields.Length; + if (length >= 2 && length <= 3) + { + bool isCheck = true; + for (int i = 0; i < length; i++) + { + ref var field = ref Fields[i]; + + if (field.Flag == FieldFlag.Leaf && + field.PreDefinedType.Type.IsPrimitive && + char.ToLower(field.Name[0]) != VectorFields[i]) + { + isCheck = false; + break; + } + } + if (isCheck) + { + IsVector = true; + } + else + { + isCheck = true; + for (int i = 0; i < length; i++) + { + ref var field = ref Fields[i]; + if (field.Flag == FieldFlag.Leaf && + field.PreDefinedType.Type.IsPrimitive && + char.ToLower(field.Name[0]) != ColorFields[i]) + { + isCheck = false; + break; + } + } + if (isCheck) + { + IsColor = true; + } + } + } + } + #endregion + + public override string ToString() + { + return Type.Name; + } + } + #endregion + + #region InspectorFieldInfo + [StructLayout(LayoutKind.Sequential)] + private unsafe readonly struct InspectorFieldInfo : IEquatable, IComparable + { + public readonly FieldInfo FieldInfo; + public readonly InspectorTypeInfo PreDefinedType; + public readonly string Name; + public readonly int Offset; + public readonly FieldFlag Flag; + + public int CompareTo(InspectorFieldInfo other) + { + return other.Offset - Offset; + } + public bool Equals(InspectorFieldInfo other) + { + return EqualityComparer.Default.Equals(this, other); + } + [StructLayout(LayoutKind.Sequential)] + public unsafe struct Constructor + { + public FieldInfo FieldInfo; + public InspectorTypeInfo PreDefinedType; + public string Name; + public int Offset; + public FieldFlag Flag; + public override string ToString() { return Name; } + } + [StructLayout(LayoutKind.Explicit)] + public struct Union + { + [FieldOffset(0)] + public Constructor Constructor; + [FieldOffset(0)] + public InspectorFieldInfo Result; + } + public override string ToString() { return Name; } + } + private static class FieldFlagUtitlity + { + private static readonly HashSet _cantDisplayedTypes = new HashSet() + { + typeof(IntPtr), + typeof(UIntPtr), + }; + private static readonly HashSet _leafTypes = new HashSet() + { + typeof(string), + typeof(AnimationCurve), + typeof(Gradient), + typeof(LayerMask), + typeof(Color), + }; + public static FieldFlag GetFieldFlag(Type fieldType) + { + if (fieldType.IsPointer || _cantDisplayedTypes.Contains(fieldType)) + { + return FieldFlag.CantDisplayed; + } + if (fieldType.IsClass || fieldType.IsInterface) + { + return FieldFlag.Ref; + } + if (fieldType.IsPrimitive || fieldType.IsEnum || _leafTypes.Contains(fieldType)) + { + return FieldFlag.Leaf; + } + return FieldFlag.Struct; + } + public static bool IsValueField(FieldFlag flag) + { + return flag == FieldFlag.Leaf || flag == FieldFlag.Struct; + } + public static bool IsCanDisplayed(FieldFlag flag) + { + return flag != FieldFlag.None && flag != FieldFlag.CantDisplayed; + } + } + private enum FieldFlag : byte + { + None = 0, + CantDisplayed, + Leaf, + Struct, + Ref, + } + private unsafe static bool FastDrawRuntimeData(void* data, InspectorTypeInfo cache) + { + throw new NotImplementedException(); + } + #endregion + + private static void DrawProperty(Rect rect, in InspectorFieldInfo field, InspectorTypeInfo valueInfo, in Value value) + { + if (field.Flag == FieldFlag.Leaf) + { + EditorGUI.LabelField(rect, UnityEditorUtility.GetLabel(field.Name)); + return; + } + float y = rect.y; + float height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + Rect subRect = rect; + subRect.y = y; + subRect.height = height - EditorGUIUtility.standardVerticalSpacing; + y += height; + + EditorGUI.LabelField(subRect, field.Name); + + using (UpIndentLevel()) + { + foreach (var subField in valueInfo.Fields) + { + if (FieldFlagUtitlity.IsCanDisplayed(subField.Flag) == false) { continue; } + + var subValue = value.Read(subField); + Type subValueType; + + switch (subField.Flag) + { + case FieldFlag.Leaf: + case FieldFlag.Struct: + subValueType = subField.PreDefinedType.Type; + break; + case FieldFlag.Ref: + var obj = subValue.AsRef(); + subValueType = obj.GetType(); + break; + case FieldFlag.None: + case FieldFlag.CantDisplayed: + default: + subValueType = null; + break; + } + + if (subValueType == null) { continue; } + + var processor = FieldValueProcessor.GetProcessor(subValueType); + height = processor.GetHeight(subField, subValue); + subRect = rect; + subRect.y = y; + subRect.height = height - EditorGUIUtility.standardVerticalSpacing; + y += height; + + if (subField.Flag == FieldFlag.Struct && processor.IsDefault) + { + if (subField.PreDefinedType.IsVector) + { + float defLabelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 14f; + subRect.xMin += EditorGUIUtility.labelWidth; + var vectorFields = subField.PreDefinedType.Fields; + var widthOne = subRect.width / vectorFields.Length; + foreach (var vectorField in vectorFields) + { + var vectorFieldProcessor = FieldValueProcessor.GetProcessor(vectorField.PreDefinedType.Type); + vectorFieldProcessor.Draw(subRect, vectorField, subValue.Read(vectorField)); + } + EditorGUIUtility.labelWidth = defLabelWidth; + } + //else if (subField.PreDefinedType.IsColor) + //{ + // EditorGUI.ColorField(subRect, ); + //} + } + + processor.Draw(subRect, subField, subValue); + } + } + } + private static float GetPropertyHeight(in InspectorFieldInfo field, InspectorTypeInfo valueInfo, in Value value) + { + float result = 0; + if (field.Flag == FieldFlag.Leaf) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + + Debug.Log(string.Join("\r\n", valueInfo.Fields)); + + foreach (var subField in valueInfo.Fields) + { + if (FieldFlagUtitlity.IsCanDisplayed(subField.Flag) == false) { continue; } + + var subValue = value.Read(subField); + Type subValueType; + + switch (subField.Flag) + { + case FieldFlag.None: + case FieldFlag.CantDisplayed: + default: + subValueType = null; + break; + case FieldFlag.Leaf: + case FieldFlag.Struct: + subValueType = subField.PreDefinedType.Type; + break; + case FieldFlag.Ref: + var obj = subValue.AsRef(); + subValueType = obj.GetType(); + break; + } + + if (subValueType == null) { continue; } + + var processor = FieldValueProcessor.GetProcessor(subValueType); + if (subField.Flag == FieldFlag.Struct && processor.IsDefault) + { + if (subField.PreDefinedType.IsVector) + //if (subField.PreDefinedType.IsVector || subField.PreDefinedType.IsColor) + { + return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + } + } + result += EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + result += processor.GetHeight(subField, subValue); + } + return result; + } + + public static unsafe partial class Layout + { + private static bool DrawProperty(object data) + { + Debug.LogWarning("--------------------------------------------"); + EditorGUI.BeginChangeCheck(); + Type type = data.GetType(); + byte* ptr = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(data, out ulong gcHandle); + + try + { + InspectorTypeInfo inspectorTypeInfo = InspectorTypeInfo.Get(type); + Value value = new Value(null, ptr); + +#if DEV_MODE + if (data is GameObjectConnect goc) + { + byte* ptrX = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(goc.Connect, out ulong gcHandleX); + UnsafeUtility.ReleaseGCObject(gcHandleX); + + var fieldX = inspectorTypeInfo.Fields[0]; + + Value valueX = value.Read(fieldX); + byte* ptrX2 = valueX.ValuePtr; + + PtrRefUnion u = default; + u.Ref = goc.Connect; + + + Debug.Log((IntPtr)ptrX + " " + (IntPtr)ptrX2); + } +#endif + + + InspectorFieldInfo f = default; + float h = GetPropertyHeight(in f, inspectorTypeInfo, in value); + var r = GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, h); + EcsGUI.DrawProperty(r, in f, inspectorTypeInfo, in value); + + + UnsafeUtility.ReleaseGCObject(gcHandle); + } + catch (Exception) + { + UnsafeUtility.ReleaseGCObject(gcHandle); + throw; + } + + + return EditorGUI.EndChangeCheck(); + } + + } + } +} diff --git a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta new file mode 100644 index 0000000..a8c426f --- /dev/null +++ b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b50e8a16e06a37438743ce90a39f93d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index 8dac123..954a4d6 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -2,18 +2,11 @@ using DCFApixels.DragonECS.Unity.Internal; using System; using System.Collections.Generic; - - -//using System.Drawing; using System.Reflection; -using System.Runtime.InteropServices; -using Unity.Collections.LowLevel.Unsafe; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; using Color = UnityEngine.Color; -using UnityComponent = UnityEngine.Component; -using UnityObject = UnityEngine.Object; namespace DCFApixels.DragonECS.Unity.Editors { @@ -24,7 +17,10 @@ namespace DCFApixels.DragonECS.Unity.Editors private static bool _changed = false; private static bool _delayedChanged = false; - public static int ChangedCounter => _changedCounter; + public static int ChangedCounter + { + get { return _changedCounter; } + } public static bool Changed { get @@ -275,6 +271,7 @@ namespace DCFApixels.DragonECS.Unity.Editors public static float EntityBarHeight => EditorGUIUtility.singleLineHeight + 3f; private static float indent => (float)EditorGUI.indentLevel * 15f; + private static float indentLevel => EditorGUI.indentLevel; #region Properties private static ComponentColorMode AutoColorMode @@ -292,6 +289,11 @@ namespace DCFApixels.DragonECS.Unity.Editors get { return UserSettingsPrefs.instance.IsShowRuntimeComponents; } set { UserSettingsPrefs.instance.IsShowRuntimeComponents = value; } } + private static bool IsFastModeRuntimeComponents + { + get { return UserSettingsPrefs.instance.IsFastModeRuntimeComponents; } + set { UserSettingsPrefs.instance.IsFastModeRuntimeComponents = value; } + } private static float OneLineHeight { get => EditorGUIUtility.singleLineHeight; @@ -1009,766 +1011,8 @@ namespace DCFApixels.DragonECS.Unity.Editors _currentProperty = property; GetReferenceDropDown(sortedPredicateTypes, sortedWithOutTypes).Show(position); } - #endregion - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - public static partial class Layout - { - public static void ScriptAssetButton(MonoScript script, params GUILayoutOption[] options) - { - EcsGUI.ScriptAssetButton(GUILayoutUtility.GetRect(UnityEditorUtility.GetLabelTemp(), EditorStyles.miniButton, options), script); - } - - - public static void CopyMetaIDButton(string metaID, params GUILayoutOption[] options) - { - Rect r = GUILayoutUtility.GetRect(UnityEditorUtility.GetLabelTemp(), EditorStyles.miniButton, options); - var current = Event.current; - var hover = IconHoverScan(r, current); - using (new ColorScope(new Color(1f, 1f, 1f, hover ? 1f : 0.8f))) - { - DrawIcon(r, Icons.Instance.MetaIDIcon, hover ? 1f : 2f, metaID); - if (hover && current.type == EventType.MouseUp) - { - GUIUtility.systemCopyBuffer = metaID; - } - } - } - public static bool IconButton(Texture icon, params GUILayoutOption[] options) - { - bool result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty), options); - DrawIcon(GUILayoutUtility.GetLastRect(), icon, 0, null); - return result; - } - public static bool IconButton(Texture icon, float iconPadding = 0, string description = null) - { - bool result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty)); - DrawIcon(GUILayoutUtility.GetLastRect(), icon, iconPadding, description); - return result; - } - public static bool IconButton(Texture icon, float iconPadding = 0, string description = null, GUIStyle style = null, params GUILayoutOption[] options) - { - bool result; - if (style == null) - { - result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty), options); - } - else - { - result = GUILayout.Button(UnityEditorUtility.GetLabel(string.Empty), style, options); - } - DrawIcon(GUILayoutUtility.GetLastRect(), icon, iconPadding, description); - return result; - } - - public static void DrawEmptyComponentProperty(SerializedProperty property, string name, bool isDisplayEmpty) - { - EcsGUI.DrawEmptyComponentProperty(GUILayoutUtility.GetRect(UnityEditorUtility.GetLabel(name), EditorStyles.label), property, name, isDisplayEmpty); - } - public static void DrawEmptyComponentProperty(SerializedProperty property, GUIContent label, bool isDisplayEmpty) - { - EcsGUI.DrawEmptyComponentProperty(GUILayoutUtility.GetRect(label, EditorStyles.label), property, label, isDisplayEmpty); - } - public static void DrawWorldBaseInfo(EcsWorld world) - { - bool isNull = world == null || world.IsDestroyed || world.ID == 0; - int entitesCount = isNull ? 0 : world.Count; - int capacity = isNull ? 0 : world.Capacity; - long Version = isNull ? 0 : world.Version; - int leakedEntitesCount = isNull ? 0 : world.CountLeakedEntitesDebug(); - EditorGUILayout.IntField("Entities", entitesCount, EditorStyles.boldLabel); - EditorGUILayout.IntField("Capacity", capacity, EditorStyles.boldLabel); - EditorGUILayout.LongField("Version", Version, EditorStyles.boldLabel); - Color color = leakedEntitesCount > 0 ? Color.yellow : GUI.contentColor; - using (new ContentColorScope(color)) - { - EditorGUILayout.IntField("Leaked Entites", leakedEntitesCount, EditorStyles.boldLabel); - } - } - public static void DrawWorldComponents(EcsWorld world) - { - bool isNull = world == null || world.IsDestroyed || world.ID == 0; - if (isNull) { return; } - using (BeginVertical(UnityEditorUtility.GetStyle(Color.black, 0.2f))) - { - IsShowRuntimeComponents = EditorGUILayout.BeginFoldoutHeaderGroup(IsShowRuntimeComponents, "RUNTIME COMPONENTS", EditorStyles.foldout); - EditorGUILayout.EndFoldoutHeaderGroup(); - if (IsShowRuntimeComponents == false) { return; } - - var worldID = world.ID; - var cmps = world.GetWorldComponents(); - int index = -1; - int total = 9; - foreach (var cmp in cmps) - { - index++; - var meta = cmp.ComponentType.ToMeta(); - if (meta.IsHidden == false || IsShowHidden) - { - Type componentType = cmp.ComponentType; - - object data = cmp.GetRaw(worldID); - - ExpandMatrix expandMatrix = ExpandMatrix.Take(componentType); - - float padding = EditorGUIUtility.standardVerticalSpacing; - Rect optionButton = GUILayoutUtility.GetLastRect(); - optionButton.yMin = optionButton.yMax; - optionButton.yMax += HeadIconsRect.height; - optionButton.xMin = optionButton.xMax - 64; - optionButton.center += Vector2.up * padding * 2f; - //Canceling isExpanded - if (ClickTest(optionButton)) - { - ref bool isExpanded = ref expandMatrix.Down(); - isExpanded = !isExpanded; - } - - Color panelColor = SelectPanelColor(meta, index, total); - GUILayout.BeginVertical(UnityEditorUtility.GetStyle(panelColor, EscEditorConsts.COMPONENT_DRAWER_ALPHA)); - EditorGUI.BeginChangeCheck(); - - ////Close button - //optionButton.xMin = optionButton.xMax - HeadIconsRect.width; - //if (CloseButton(optionButton)) - //{ - // cmp.Del(worldID); - // return; - //} - - //Edit script button - if (ScriptsCache.TryGetScriptAsset(meta, out MonoScript script)) - { - optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); - EcsGUI.ScriptAssetButton(optionButton, script); - } - //Description icon - if (string.IsNullOrEmpty(meta.Description.Text) == false) - { - optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); - DescriptionIcon(optionButton, meta.Description.Text); - } - - RuntimeComponentReflectionCache.FieldInfoData componentInfoData = new RuntimeComponentReflectionCache.FieldInfoData(null, componentType, meta.Name); - if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) - { - cmp.SetRaw(worldID, resultData); - } - - GUILayout.EndVertical(); - } - } - } - } - - #region entity bar - public static void EntityBarForAlive(EntityStatus status, int id, short gen, short world) - { - float width = EditorGUIUtility.currentViewWidth; - float height = EntityBarHeight; - EcsGUI.EntityBarForAlive(GUILayoutUtility.GetRect(width, height), status, id, gen, world); - } - public static void EntityBar(EntityStatus status, bool isPlaceholder, int id, short gen, short world) - { - float width = EditorGUIUtility.currentViewWidth; - float height = EntityBarHeight; - EcsGUI.EntityBar(GUILayoutUtility.GetRect(width, height), isPlaceholder, status, id, gen, world); - } - public static void EntityBar(int id, short gen, short world) - { - float width = EditorGUIUtility.currentViewWidth; - float height = EntityBarHeight; - EcsGUI.EntityBar(GUILayoutUtility.GetRect(width, height), id, gen, world); - } - public static void EntityBar() - { - float width = EditorGUIUtility.currentViewWidth; - float height = EntityBarHeight; - EcsGUI.EntityBar(GUILayoutUtility.GetRect(width, height)); - } - #endregion - - public static bool AddComponentButtons(out Rect dropDownRect) - { - return EcsGUI.AddComponentButton(GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, 24f), out dropDownRect); - } - public static AddClearButton AddClearComponentButtons(out Rect dropDownRect) - { - return EcsGUI.AddClearComponentButtons(GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, 24f), out dropDownRect); - } - public static AddClearButton AddClearSystemButtons(out Rect dropDownRect) - { - return EcsGUI.AddClearSystemButtons(GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, 24f), out dropDownRect); - } - public static void DrawRuntimeComponents(entlong entity, bool isWithFoldout = true) - { - if (entity.TryUnpackForUnityEditor(out int entityID, out _, out _, out EcsWorld world)) - { - DrawRuntimeComponents(entityID, world, isWithFoldout); - } - } - - [ThreadStatic] - private static List _componentPoolsBuffer; - public static void DrawRuntimeComponents(int entityID, EcsWorld world, bool isWithFoldout = true) - { - using (BeginVertical(UnityEditorUtility.GetStyle(Color.black, 0.2f))) - { - if (isWithFoldout) - { - IsShowRuntimeComponents = EditorGUILayout.BeginFoldoutHeaderGroup(IsShowRuntimeComponents, "RUNTIME COMPONENTS", EditorStyles.foldout); - EditorGUILayout.EndFoldoutHeaderGroup(); - } - if (isWithFoldout == false || IsShowRuntimeComponents) - { - if (AddComponentButtons(out Rect dropDownRect)) - { - RuntimeComponentsUtility.GetAddComponentGenericMenu(world).Open(dropDownRect, entityID); - } - - GUILayout.Box("", UnityEditorUtility.GetStyle(GUI.color, 0.16f), GUILayout.ExpandWidth(true)); - IsShowHidden = EditorGUI.Toggle(GUILayoutUtility.GetLastRect(), "Show Hidden", IsShowHidden); - - if (_componentPoolsBuffer == null) - { - _componentPoolsBuffer = new List(64); - } - world.GetComponentPoolsFor(entityID, _componentPoolsBuffer); - int i = 0; - //int iMax = _componentPoolsBuffer.Count; - foreach (var componentPool in _componentPoolsBuffer) - { - DrawRuntimeComponent(entityID, componentPool, 9, i++); - } - } - } - } - private static void DrawRuntimeComponent(int entityID, IEcsPool pool, int total, int index) - { - var meta = pool.ComponentType.ToMeta(); - if (meta.IsHidden == false || IsShowHidden) - { - Type componentType = pool.ComponentType; - - object data = pool.GetRaw(entityID); - - ExpandMatrix expandMatrix = ExpandMatrix.Take(componentType); - - float padding = EditorGUIUtility.standardVerticalSpacing; - Rect optionButton = GUILayoutUtility.GetLastRect(); - optionButton.yMin = optionButton.yMax; - optionButton.yMax += HeadIconsRect.height; - optionButton.xMin = optionButton.xMax - 64; - optionButton.center += Vector2.up * padding * 2f; - //Canceling isExpanded - if (ClickTest(optionButton)) - { - ref bool isExpanded = ref expandMatrix.Down(); - isExpanded = !isExpanded; - } - - Color panelColor = SelectPanelColor(meta, index, total); - GUILayout.BeginVertical(UnityEditorUtility.GetStyle(panelColor, EscEditorConsts.COMPONENT_DRAWER_ALPHA)); - EditorGUI.BeginChangeCheck(); - - //Close button - optionButton.xMin = optionButton.xMax - HeadIconsRect.width; - if (CloseButton(optionButton)) - { - pool.Del(entityID); - return; - } - //Edit script button - if (ScriptsCache.TryGetScriptAsset(meta, out MonoScript script)) - { - optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); - EcsGUI.ScriptAssetButton(optionButton, script); - } - //Description icon - if (string.IsNullOrEmpty(meta.Description.Text) == false) - { - optionButton = HeadIconsRect.MoveTo(optionButton.center - (Vector2.right * optionButton.width)); - DescriptionIcon(optionButton, meta.Description.Text); - } - - RuntimeComponentReflectionCache.FieldInfoData componentInfoData = new RuntimeComponentReflectionCache.FieldInfoData(null, componentType, meta.Name); - if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) - { - pool.SetRaw(entityID, resultData); - } - - GUILayout.EndVertical(); - } - } - - #region Default DrawRuntimeData - [InitializeOnLoadMethod] - private static void ResetRuntimeComponentReflectionCache() - { - _runtimeComponentReflectionCaches.Clear(); - } - internal class RuntimeComponentReflectionCache - { - public readonly Type Type; - - public readonly bool IsUnityObjectType; - public readonly bool IsUnitySerializable; - public readonly bool IsUnmanaged; - - public readonly FieldInfoData[] Fields; - - public readonly RefEditorWrapper Wrapper; - - public RuntimeComponentReflectionCache(Type type) - { - Type = type; - - IsUnmanaged = UnsafeUtility.IsUnmanaged(type); - IsUnityObjectType = typeof(UnityObject).IsAssignableFrom(type); - IsUnitySerializable = IsUnityObjectType || (!type.IsGenericType && type.IsSerializable); - - Wrapper = RefEditorWrapper.Take(); - - if (type == typeof(void)) { return; } - - if (IsUnitySerializable == false) - { - var fs = type.GetFields(fieldFlags); - Fields = new FieldInfoData[fs.Length]; - for (int i = 0; i < fs.Length; i++) - { - var f = fs[i]; - Fields[i] = new FieldInfoData(f); - } - } - } - public readonly struct FieldInfoData - { - public readonly FieldInfo FieldInfo; - public readonly Type FieldType; - public readonly string UnityFormatName; - public readonly bool IsUnityObjectField; - public FieldInfoData(FieldInfo fieldInfo) - { - FieldInfo = fieldInfo; - FieldType = fieldInfo.FieldType; - IsUnityObjectField = typeof(UnityObject).IsAssignableFrom(fieldInfo.FieldType); - UnityFormatName = UnityEditorUtility.TransformFieldName(fieldInfo.Name); - } - public FieldInfoData(FieldInfo fieldInfo, Type fieldType, string unityFormatName) - { - FieldInfo = fieldInfo; - FieldType = fieldType; - UnityFormatName = unityFormatName; - IsUnityObjectField = typeof(UnityObject).IsAssignableFrom(fieldType); - } - } - } - private static Dictionary _runtimeComponentReflectionCaches = new Dictionary(); - private static RuntimeComponentReflectionCache GetRuntimeComponentReflectionCache(Type type) - { - if (_runtimeComponentReflectionCaches.TryGetValue(type, out RuntimeComponentReflectionCache result) == false) - { - result = new RuntimeComponentReflectionCache(type); - _runtimeComponentReflectionCaches.Add(type, result); - } - return result; - } - private static bool DrawRuntimeData(ref RuntimeComponentReflectionCache.FieldInfoData fieldInfoData, GUIContent label, ExpandMatrix expandMatrix, object data, out object outData) - { - outData = data; - Type type = data == null ? typeof(void) : data.GetType(); - - RuntimeComponentReflectionCache cache = GetRuntimeComponentReflectionCache(type); - - bool isUnityObjectField = fieldInfoData.IsUnityObjectField; - if (isUnityObjectField == false && data == null) - { - EditorGUILayout.TextField(label, "Null"); - return false; - } - bool isUnityObjectType = cache.IsUnityObjectType; - - ref bool isExpanded = ref expandMatrix.Down(); - bool changed = false; - - - if (cache.IsUnitySerializable == false) - { - isExpanded = EditorGUILayout.BeginFoldoutHeaderGroup(isExpanded, label, EditorStyles.foldout); - EditorGUILayout.EndFoldoutHeaderGroup(); - - if (isExpanded) - { - using (UpIndentLevel()) - { - for (int j = 0, jMax = cache.Fields.Length; j < jMax; j++) - { - var field = cache.Fields[j]; - if (DrawRuntimeData(ref field, UnityEditorUtility.GetLabel(field.UnityFormatName), expandMatrix, field.FieldInfo.GetValue(data), out object fieldData)) - { - field.FieldInfo.SetValue(data, fieldData); - outData = data; - changed = true; - } - } - } - } - } - else - { - Type fieldType = fieldInfoData.FieldType; - if (isUnityObjectType || isUnityObjectField) - { - EditorGUI.BeginChangeCheck(); - var uobj = UnsafeUtility.As(ref data); - - bool isComponent = typeof(UnityComponent).IsAssignableFrom(fieldType); - if (isComponent) - { - uobj = EditorGUILayout.ObjectField(label, uobj, typeof(UnityObject), true); - } - else - { - uobj = EditorGUILayout.ObjectField(label, uobj, fieldType, true); - } - - if (EditorGUI.EndChangeCheck()) - { - if (isComponent && uobj is GameObject go) - { - uobj = go.GetComponent(fieldType); - } - - outData = uobj; - changed = true; - } - } - else - { - EditorGUI.BeginChangeCheck(); - //WrapperBase wrapper = RefEditorWrapper.Take(data); - - RefEditorWrapper wrapper = cache.Wrapper; - - wrapper.data = data; - wrapper.SO.Update(); - - wrapper.IsExpanded = isExpanded; - try - { - EditorGUILayout.PropertyField(wrapper.Property, label, true); - } - catch (ArgumentException) - { - if (Event.current.type != EventType.Repaint) - { - throw; - } - } - - if (EditorGUI.EndChangeCheck()) - { - isExpanded = wrapper.IsExpanded; - wrapper.SO.ApplyModifiedProperties(); - outData = wrapper.Data; - changed = true; - } - //wrapper.Release(); - } - } - - expandMatrix.Up(); - return changed; - } - #endregion - - #region FactMode DrawRuntimeData - private class InspectorTypeInfo - { - #region cahce - private static Dictionary _typeInfosCache = new Dictionary(); - public static InspectorTypeInfo Get(Type type) - { - if (_typeInfosCache.TryGetValue(type, out InspectorTypeInfo info) == false) - { - info = new InspectorTypeInfo(type); - _typeInfosCache.Add(type, info); - } - - return info; - } - #endregion - - public readonly Type Type; - public readonly InspectorFieldInfo[] Fields; - - #region Constructors - private static StructList CnstrBuffer = new StructList(32); - private static readonly char[] VectorFields = new char[] { 'x', 'y', 'z', 'w' }; - private static readonly char[] ColorFields = new char[] { 'r', 'g', 'b', 'a' }; - public InspectorTypeInfo(Type type) - { - CnstrBuffer.FastClear(); - Type = type; - var fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); - foreach (var fieldInfo in fieldInfos) - { - InspectorFieldInfo.Union infoUniton = default; - ref InspectorFieldInfo.Constructor infocstr = ref infoUniton.Constructor; - - var fieldType = fieldInfo.FieldType; - - infocstr.FieldInfo = fieldInfo; - infocstr.Offset = UnsafeUtility.GetFieldOffset(fieldInfo); ; - infocstr.Size = UnsafeUtility.SizeOf(fieldType); ; - infocstr.Name = UnityEditorUtility.TransformFieldName(fieldType.Name); - infocstr.TypeID = FieldTypeIDUtitlity.GetFieldTypeIDFor(fieldType); - - #region Def custom types - if (infocstr.TypeID == FieldTypeID.Struct) - { - InspectorTypeInfo preDefinedTypeInfo = Get(fieldType); - infocstr.PreDefinedType = preDefinedTypeInfo; - int length = preDefinedTypeInfo.Fields.Length; - if (length >= 2 && length <= 3) - { - bool isCheck = true; - for (int i = 0; i < length; i++) - { - ref var field = ref preDefinedTypeInfo.Fields[i]; - if (char.ToLower(field.Name[0]) != VectorFields[i]) - { - isCheck = false; - break; - } - } - if (isCheck) - { - infocstr.TypeID = FieldTypeID.StructVector; - } - else - { - isCheck = true; - for (int i = 0; i < length; i++) - { - ref var field = ref preDefinedTypeInfo.Fields[i]; - if (char.ToLower(field.Name[0]) != ColorFields[i]) - { - isCheck = false; - break; - } - } - if (isCheck) - { - infocstr.TypeID = FieldTypeID.StructColor; - } - } - } - } - #endregion - - CnstrBuffer.Add(infoUniton.Result); - } - - Fields = CnstrBuffer.ToArray(); - Array.Sort(Fields); - } - #endregion - } - - private static class FieldTypeIDUtitlity - { - #region GetFieldTypeIDFor - public static FieldTypeID GetFieldTypeIDFor(Type type) - { - var size = UnsafeUtility.SizeOf(type); - if (type.IsClass) - { - if (typeof(UnityObject).IsAssignableFrom(type)) - { - return FieldTypeID.UnityObject; - } - if (type == typeof(string)) - { - return FieldTypeID.String; - } - if (type == typeof(AnimationCurve)) - { - return FieldTypeID.AnimationCurve; - } - if (type == typeof(Gradient)) - { - return FieldTypeID.Gradient; - } - if (type == typeof(Array)) - { - return FieldTypeID.RefArray; - } - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) - { - return FieldTypeID.RefArray; - } - - return FieldTypeID.Ref; - } - else - { - if (type.IsPrimitive) - { - if (UnsafeUtility.IsBlittable(type)) - { - switch (size) - { - case 1: - if (type == typeof(byte)) - { - return FieldTypeID.UInt; - } - if (type == typeof(sbyte)) - { - return FieldTypeID.Int; - } - break; - case 2: - if (type == typeof(ushort)) - { - return FieldTypeID.UInt; - } - if (type == typeof(short)) - { - return FieldTypeID.Int; - } - break; - case 4: - if (type == typeof(uint)) - { - return FieldTypeID.UInt; - } - if (type == typeof(int)) - { - return FieldTypeID.Int; - } - if (type == typeof(float)) - { - return FieldTypeID.Real; - } - break; - case 8: - if (type == typeof(ulong)) - { - return FieldTypeID.UInt; - } - if (type == typeof(long)) - { - return FieldTypeID.Int; - } - if (type == typeof(double)) - { - return FieldTypeID.Real; - } - break; - } - } - else - { - if (type == typeof(bool)) - { - return FieldTypeID.Bool; - } - } - } - else if (type.IsEnum) - { - return FieldTypeID.Enum; - } - - if (type == typeof(LayerMask)) - { - return FieldTypeID.LayerMask; - } - - return FieldTypeID.Struct; - } - } - #endregion - } - private enum FieldTypeID : byte - { - None = 0, - CantDisplayed, - - // leaf types - Bool, - Int, - UInt, - Real, - String, - Enum, - - UnityObject, - LayerMask, - Gradient, - AnimationCurve, - - // struct types - Struct, - Ref, - - // custom struct types - StructVector, - StructColor, - RefArray, - RefList, - } - - [StructLayout(LayoutKind.Sequential)] - private unsafe readonly struct InspectorFieldInfo : IEquatable, IComparable - { - public readonly FieldInfo FieldInfo; - public readonly InspectorTypeInfo PreDefinedType; - public readonly string Name; - public readonly int Offset; - public readonly int Size; - public readonly FieldTypeID ID; - - public int CompareTo(InspectorFieldInfo other) - { - return other.Offset - Offset; - } - public bool Equals(InspectorFieldInfo other) - { - return EqualityComparer.Default.Equals(this, other); - } - [StructLayout(LayoutKind.Sequential)] - public unsafe struct Constructor - { - public FieldInfo FieldInfo; - public InspectorTypeInfo PreDefinedType; - public string Name; - public int Offset; - public int Size; - public byte AxisCount; - public FieldTypeID TypeID; - } - [StructLayout(LayoutKind.Explicit)] - public struct Union - { - [FieldOffset(0)] - public Constructor Constructor; - [FieldOffset(0)] - public InspectorFieldInfo Result; - } - } - private unsafe static bool FastDrawRuntimeData(void* data, InspectorTypeInfo cache) - { - throw new NotImplementedException(); - } - #endregion - } +#endregion } } #endif \ No newline at end of file diff --git a/src/Internal/Icons/Color_Icon.png b/src/Internal/Icons/Color_Icon.png deleted file mode 100644 index 69278be0e0c0ef665c5155c9a970bf9adff9a537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13139 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 Enumerable + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _items.Take(_count); } + } + public bool IsNull + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _items == null; } + } + public bool IsNullOrEmpty + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _items == null || _items.Length <= 0; } + } public int Count { [MethodImpl(MethodImplOptions.AggressiveInlining)] From 8a2200982b583b1b26e839feeb9e608e2052b1d5 Mon Sep 17 00:00:00 2001 From: ByteWarsJedi <99481254+DCFApixels@users.noreply.github.com> Date: Sat, 14 Dec 2024 17:47:13 +0800 Subject: [PATCH 4/6] stash --- src/Internal/Editor/EcsGUI.Layout.cs | 2 +- .../Editor/EcsGUI.RuntimeCumponents.cs | 168 ++++++++---------- .../Templates/MonoEntityTemplate.cs | 1 - 3 files changed, 74 insertions(+), 97 deletions(-) diff --git a/src/Internal/Editor/EcsGUI.Layout.cs b/src/Internal/Editor/EcsGUI.Layout.cs index 04dd5f0..92a226d 100644 --- a/src/Internal/Editor/EcsGUI.Layout.cs +++ b/src/Internal/Editor/EcsGUI.Layout.cs @@ -304,7 +304,7 @@ namespace DCFApixels.DragonECS.Unity.Editors } else { - if (DrawProperty(data)) + if (DrawProperty(data, meta.Name)) { pool.SetRaw(entityID, data); } diff --git a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs index fce80f9..1b2e63b 100644 --- a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs +++ b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using System.Xml.Schema; using Unity.Collections.LowLevel.Unsafe; using UnityEditor; using UnityEditorInternal; @@ -20,10 +21,10 @@ namespace DCFApixels.DragonECS.Unity.Editors private struct PtrRefUnion { [FieldOffset(0)] - public void* Ptr; + public byte* Ptr; [FieldOffset(0)] public object Ref; - public PtrRefUnion(void* ptr) : this() + public PtrRefUnion(byte* ptr) : this() { Ptr = ptr; } @@ -58,7 +59,7 @@ namespace DCFApixels.DragonECS.Unity.Editors if (isRef) { IntPtr* refPtr = (IntPtr*)fieldPtr; - valuePtr = (byte*)&refPtr; + valuePtr = (byte*)(refPtr[0]); } else { @@ -187,12 +188,12 @@ namespace DCFApixels.DragonECS.Unity.Editors public override float GetHeight(in InspectorFieldInfo field, in Value value) { float result = GetPropertyHeight(field, ValueInfo, value); - Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + //Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); return result; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) { - Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + //Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); DrawProperty(rect, field, ValueInfo, value); } } @@ -202,12 +203,12 @@ namespace DCFApixels.DragonECS.Unity.Editors public sealed override float GetHeight(in InspectorFieldInfo field, in Value value) { float result = GetHeight(field, value, ref value.AsValue()); - Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + //Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); return result; } public sealed override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) { - Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + //Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); Draw(rect, field, value, ref value.AsValue()); } public virtual float GetHeight(in InspectorFieldInfo field, in Value raw, ref T value) @@ -225,12 +226,12 @@ namespace DCFApixels.DragonECS.Unity.Editors public sealed override float GetHeight(in InspectorFieldInfo field, in Value value) { float result = GetHeight(field, value, value.AsRef()); - Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + //Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); return result; } public sealed override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) { - Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); + //Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); Draw(rect, field, value, value.AsRef()); } public virtual float GetHeight(in InspectorFieldInfo field, in Value raw, T value) @@ -284,7 +285,7 @@ namespace DCFApixels.DragonECS.Unity.Editors // //} - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, Array value) { @@ -300,7 +301,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref sbyte value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref sbyte value) { @@ -311,7 +312,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref byte value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref byte value) { @@ -322,7 +323,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref short value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref short value) { @@ -333,7 +334,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref ushort value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref ushort value) { @@ -344,7 +345,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref int value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref int value) { @@ -355,7 +356,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref uint value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref uint value) { @@ -366,7 +367,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref long value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref long value) { @@ -377,7 +378,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref ulong value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref ulong value) { @@ -388,7 +389,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref float value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref float value) { @@ -399,7 +400,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref double value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref double value) { @@ -410,7 +411,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref char value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref char value) { @@ -426,7 +427,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref Color value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref Color value) { @@ -437,7 +438,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, string value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, string value) { @@ -448,7 +449,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, Gradient value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, Gradient value) { @@ -459,7 +460,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, AnimationCurve value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, AnimationCurve value) { @@ -470,7 +471,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { public override float GetHeight(in InspectorFieldInfo field, in Value raw, UnityObject value) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, UnityObject value) { @@ -544,13 +545,10 @@ namespace DCFApixels.DragonECS.Unity.Editors infocstr.FieldInfo = fieldInfo; infocstr.Offset = UnsafeUtility.GetFieldOffset(fieldInfo); - infocstr.Name = UnityEditorUtility.TransformFieldName(fieldType.Name); + infocstr.Name = UnityEditorUtility.TransformFieldName(fieldInfo.Name); infocstr.Flag = FieldFlagUtitlity.GetFieldFlag(fieldType); - Debug.LogWarning("Offset: " + type.Name + "." + infocstr.Name + "." + infocstr.Offset); - - - if (infocstr.Flag == FieldFlag.Struct) + if (infocstr.Flag == FieldFlag.StructValue) { infocstr.PreDefinedType = Get(fieldType); } @@ -560,8 +558,16 @@ namespace DCFApixels.DragonECS.Unity.Editors } else { - infocstr.PreDefinedType = NullTypeInfo; + if (type == infocstr.FieldInfo.FieldType) + { + infocstr.PreDefinedType = NullTypeInfo; + } + else + { + infocstr.PreDefinedType = Get(fieldType); + } } + CnstrBuffer.Add(infoUniton.Result); } @@ -577,7 +583,7 @@ namespace DCFApixels.DragonECS.Unity.Editors { ref var field = ref Fields[i]; - if (field.Flag == FieldFlag.Leaf && + if (field.Flag == FieldFlag.LeafValue && field.PreDefinedType.Type.IsPrimitive && char.ToLower(field.Name[0]) != VectorFields[i]) { @@ -595,7 +601,7 @@ namespace DCFApixels.DragonECS.Unity.Editors for (int i = 0; i < length; i++) { ref var field = ref Fields[i]; - if (field.Flag == FieldFlag.Leaf && + if (field.Flag == FieldFlag.LeafValue && field.PreDefinedType.Type.IsPrimitive && char.ToLower(field.Name[0]) != ColorFields[i]) { @@ -631,7 +637,7 @@ namespace DCFApixels.DragonECS.Unity.Editors public int CompareTo(InspectorFieldInfo other) { - return other.Offset - Offset; + return Offset - other.Offset; } public bool Equals(InspectorFieldInfo other) { @@ -684,13 +690,13 @@ namespace DCFApixels.DragonECS.Unity.Editors } if (fieldType.IsPrimitive || fieldType.IsEnum || _leafTypes.Contains(fieldType)) { - return FieldFlag.Leaf; + return FieldFlag.LeafValue; } - return FieldFlag.Struct; + return FieldFlag.StructValue; } public static bool IsValueField(FieldFlag flag) { - return flag == FieldFlag.Leaf || flag == FieldFlag.Struct; + return flag == FieldFlag.LeafValue || flag == FieldFlag.StructValue; } public static bool IsCanDisplayed(FieldFlag flag) { @@ -701,23 +707,19 @@ namespace DCFApixels.DragonECS.Unity.Editors { None = 0, CantDisplayed, - Leaf, - Struct, + LeafValue, + StructValue, Ref, } - private unsafe static bool FastDrawRuntimeData(void* data, InspectorTypeInfo cache) - { - throw new NotImplementedException(); - } #endregion private static void DrawProperty(Rect rect, in InspectorFieldInfo field, InspectorTypeInfo valueInfo, in Value value) { - if (field.Flag == FieldFlag.Leaf) - { - EditorGUI.LabelField(rect, UnityEditorUtility.GetLabel(field.Name)); - return; - } + //if (field.Flag == FieldFlag.LeafValue) + //{ + // EditorGUI.LabelField(rect, UnityEditorUtility.GetLabel(field.Name)); + // return; + //} float y = rect.y; float height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; Rect subRect = rect; @@ -738,8 +740,8 @@ namespace DCFApixels.DragonECS.Unity.Editors switch (subField.Flag) { - case FieldFlag.Leaf: - case FieldFlag.Struct: + case FieldFlag.LeafValue: + case FieldFlag.StructValue: subValueType = subField.PreDefinedType.Type; break; case FieldFlag.Ref: @@ -762,7 +764,7 @@ namespace DCFApixels.DragonECS.Unity.Editors subRect.height = height - EditorGUIUtility.standardVerticalSpacing; y += height; - if (subField.Flag == FieldFlag.Struct && processor.IsDefault) + if (subField.Flag == FieldFlag.StructValue && processor.IsDefault) { if (subField.PreDefinedType.IsVector) { @@ -791,29 +793,24 @@ namespace DCFApixels.DragonECS.Unity.Editors private static float GetPropertyHeight(in InspectorFieldInfo field, InspectorTypeInfo valueInfo, in Value value) { float result = 0; - if (field.Flag == FieldFlag.Leaf) - { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; - } + //if (field.Flag == FieldFlag.LeafValue) + //{ + // return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + //} - Debug.Log(string.Join("\r\n", valueInfo.Fields)); + //Debug.Log(string.Join("\r\n", valueInfo.Fields)); foreach (var subField in valueInfo.Fields) { if (FieldFlagUtitlity.IsCanDisplayed(subField.Flag) == false) { continue; } var subValue = value.Read(subField); - Type subValueType; + Type subValueType = null; switch (subField.Flag) { - case FieldFlag.None: - case FieldFlag.CantDisplayed: - default: - subValueType = null; - break; - case FieldFlag.Leaf: - case FieldFlag.Struct: + case FieldFlag.LeafValue: + case FieldFlag.StructValue: subValueType = subField.PreDefinedType.Type; break; case FieldFlag.Ref: @@ -825,15 +822,15 @@ namespace DCFApixels.DragonECS.Unity.Editors if (subValueType == null) { continue; } var processor = FieldValueProcessor.GetProcessor(subValueType); - if (subField.Flag == FieldFlag.Struct && processor.IsDefault) + if (subField.Flag == FieldFlag.StructValue && processor.IsDefault) { if (subField.PreDefinedType.IsVector) //if (subField.PreDefinedType.IsVector || subField.PreDefinedType.IsColor) { - return EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } } - result += EditorGUIUtility.currentViewWidth + EditorGUIUtility.standardVerticalSpacing; + result += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; result += processor.GetHeight(subField, subValue); } return result; @@ -841,42 +838,23 @@ namespace DCFApixels.DragonECS.Unity.Editors public static unsafe partial class Layout { - private static bool DrawProperty(object data) + private static bool DrawProperty(object data, string name) { - Debug.LogWarning("--------------------------------------------"); + //Debug.LogWarning("--------------------------------------------"); EditorGUI.BeginChangeCheck(); Type type = data.GetType(); byte* ptr = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(data, out ulong gcHandle); - + ptr += sizeof(IntPtr) * 2; //TODO тут надо просчитать что констатно ли значение смещения для упакованных данных try { InspectorTypeInfo inspectorTypeInfo = InspectorTypeInfo.Get(type); - Value value = new Value(null, ptr); + Value value = new Value(ptr, ptr); -#if DEV_MODE - if (data is GameObjectConnect goc) - { - byte* ptrX = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(goc.Connect, out ulong gcHandleX); - UnsafeUtility.ReleaseGCObject(gcHandleX); - - var fieldX = inspectorTypeInfo.Fields[0]; - - Value valueX = value.Read(fieldX); - byte* ptrX2 = valueX.ValuePtr; - - PtrRefUnion u = default; - u.Ref = goc.Connect; - - - Debug.Log((IntPtr)ptrX + " " + (IntPtr)ptrX2); - } -#endif - - - InspectorFieldInfo f = default; - float h = GetPropertyHeight(in f, inspectorTypeInfo, in value); + InspectorFieldInfo.Union f = default; + f.Constructor.Name = name; + float h = GetPropertyHeight(in f.Result, inspectorTypeInfo, in value); var r = GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, h); - EcsGUI.DrawProperty(r, in f, inspectorTypeInfo, in value); + EcsGUI.DrawProperty(r, in f.Result, inspectorTypeInfo, in value); UnsafeUtility.ReleaseGCObject(gcHandle); diff --git a/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs b/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs index 3f84c8f..d5b7811 100644 --- a/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs +++ b/src/Templates/EntityTemplate/Templates/MonoEntityTemplate.cs @@ -2,7 +2,6 @@ using DCFApixels.DragonECS.Unity.Internal; using System; using UnityEngine; -using static UnityEngine.GraphicsBuffer; namespace DCFApixels.DragonECS { From d7c50a011bfd24d3e45bf970af13d6bf6db94f70 Mon Sep 17 00:00:00 2001 From: ByteWarsJedi <99481254+DCFApixels@users.noreply.github.com> Date: Sun, 15 Dec 2024 17:01:55 +0800 Subject: [PATCH 5/6] remove unsafe runtime components --- src/DebugUtils/Editor/SettingsEditor.cs | 6 +- src/DebugUtils/Editor/UserSettingsPrefs.cs | 29 +- src/Internal/Editor/EcsGUI.Layout.cs | 16 +- .../Editor/EcsGUI.RuntimeCumponents.cs | 874 ------------------ .../Editor/EcsGUI.RuntimeCumponents.cs.meta | 11 - src/Internal/Editor/EcsGUI.cs | 10 +- 6 files changed, 19 insertions(+), 927 deletions(-) delete mode 100644 src/Internal/Editor/EcsGUI.RuntimeCumponents.cs delete mode 100644 src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta diff --git a/src/DebugUtils/Editor/SettingsEditor.cs b/src/DebugUtils/Editor/SettingsEditor.cs index 6d63854..d8ad072 100644 --- a/src/DebugUtils/Editor/SettingsEditor.cs +++ b/src/DebugUtils/Editor/SettingsEditor.cs @@ -69,9 +69,9 @@ namespace DCFApixels.DragonECS.Unity.Editors UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsUseCustomNames)), prefs.IsUseCustomNames); - prefs.IsFastModeRuntimeComponents = EditorGUILayout.ToggleLeft( - UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsFastModeRuntimeComponents)), - prefs.IsFastModeRuntimeComponents); + //prefs.IsFastModeRuntimeComponents = EditorGUILayout.ToggleLeft( + // UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.IsFastModeRuntimeComponents)), + // prefs.IsFastModeRuntimeComponents); prefs.ComponentColorMode = (ComponentColorMode)EditorGUILayout.EnumPopup(UnityEditorUtility.TransformFieldName(nameof(UserSettingsPrefs.ComponentColorMode)), prefs.ComponentColorMode); } diff --git a/src/DebugUtils/Editor/UserSettingsPrefs.cs b/src/DebugUtils/Editor/UserSettingsPrefs.cs index 03a9c4c..35707df 100644 --- a/src/DebugUtils/Editor/UserSettingsPrefs.cs +++ b/src/DebugUtils/Editor/UserSettingsPrefs.cs @@ -69,31 +69,18 @@ namespace DCFApixels.DragonECS.Unity.Editors } } } - [SerializeField] - private bool _isFastModeRuntimeComponents = false; - public bool IsFastModeRuntimeComponents - { - get => _isFastModeRuntimeComponents; - set - { - if (_isFastModeRuntimeComponents != value) - { - _isFastModeRuntimeComponents = value; - AutoSave(); - } - } - } - //[SerializeField] - //private bool _poolsToggle = false; - //public bool PoolsToggle + //private bool _isFastModeRuntimeComponents = false; + //public bool IsFastModeRuntimeComponents //{ - // get => _poolsToggle; + // get => _isFastModeRuntimeComponents; // set // { - // _isChanged = _poolsToggle != value; - // _poolsToggle = value; - // AutoSave(); + // if (_isFastModeRuntimeComponents != value) + // { + // _isFastModeRuntimeComponents = value; + // AutoSave(); + // } // } //} diff --git a/src/Internal/Editor/EcsGUI.Layout.cs b/src/Internal/Editor/EcsGUI.Layout.cs index 92a226d..1bfa5b9 100644 --- a/src/Internal/Editor/EcsGUI.Layout.cs +++ b/src/Internal/Editor/EcsGUI.Layout.cs @@ -295,21 +295,11 @@ namespace DCFApixels.DragonECS.Unity.Editors RuntimeComponentReflectionCache.FieldInfoData componentInfoData = new RuntimeComponentReflectionCache.FieldInfoData(null, componentType, meta.Name); - if (IsFastModeRuntimeComponents) + if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) { - if (DrawRuntimeData(ref componentInfoData, UnityEditorUtility.GetLabel(meta.Name), expandMatrix, data, out object resultData)) - { - pool.SetRaw(entityID, resultData); - } + pool.SetRaw(entityID, resultData); } - else - { - if (DrawProperty(data, meta.Name)) - { - pool.SetRaw(entityID, data); - } - } - + GUILayout.EndVertical(); } diff --git a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs deleted file mode 100644 index 1b2e63b..0000000 --- a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs +++ /dev/null @@ -1,874 +0,0 @@ -using DCFApixels.DragonECS.Unity.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Xml.Schema; -using Unity.Collections.LowLevel.Unsafe; -using UnityEditor; -using UnityEditorInternal; -using UnityEngine; -using Color = UnityEngine.Color; -using Debug = UnityEngine.Debug; -using UnityObject = UnityEngine.Object; - -namespace DCFApixels.DragonECS.Unity.Editors -{ - internal unsafe static partial class EcsGUI - { - [StructLayout(LayoutKind.Explicit)] - private struct PtrRefUnion - { - [FieldOffset(0)] - public byte* Ptr; - [FieldOffset(0)] - public object Ref; - public PtrRefUnion(byte* ptr) : this() - { - Ptr = ptr; - } - } - - #region Value - private readonly unsafe struct Value - { - public readonly byte* FieldPtr; - public readonly byte* ValuePtr; - public Value(byte* fieldPtr, byte* valuePtr) - { - FieldPtr = fieldPtr; - ValuePtr = valuePtr; - } - public Value Read(in InspectorFieldInfo field) - { - return Read(in this, field.Offset, field.Flag == FieldFlag.Ref); - } - public Value Read(int fieldOffset, bool isRef) - { - return Read(in this, fieldOffset, isRef); - } - public static Value Read(in Value source, in InspectorFieldInfo field) - { - return Read(in source, field.Offset, field.Flag == FieldFlag.Ref); - } - public static Value Read(in Value source, int fieldOffset, bool isRef) - { - byte* fieldPtr = source.ValuePtr + fieldOffset; - byte* valuePtr; - if (isRef) - { - IntPtr* refPtr = (IntPtr*)fieldPtr; - valuePtr = (byte*)(refPtr[0]); - } - else - { - valuePtr = fieldPtr; - } - return new Value(fieldPtr, valuePtr); - } - public ref T AsValue() where T : struct - { -#if DEV_MODE - if (FieldPtr != ValuePtr) { throw new Exception(); } -#endif - return ref UnsafeUtility.AsRef(FieldPtr); - } - public T AsRef() where T : class - { -#if DEV_MODE - if (FieldPtr == ValuePtr) { throw new Exception(); } -#endif - - //ref IntPtr p = ref UnsafeUtility.AsRef(ValuePtr); - //byte* pp = (byte*)p; - // - //Union union = default; - ////union.Ptr = ValuePtr; // ValuePtr это какраз и есть реф - //union.Ptr = pp; // ValuePtr это какраз и есть реф - ////object result = union.Ref; - // - //object result = UnsafeUtility.As(ref p); - //return (T)result; - - PtrRefUnion union = default; - union.Ptr = ValuePtr; // ValuePtr это какраз и есть реф - object result = union.Ref; - return (T)result; - } - public object AsRef() - { - return AsRef(); - } - } - #endregion - - #region FieldValueProcessor - private abstract class FieldValueProcessor - { - private static readonly Dictionary _processors = new Dictionary(); - private static readonly StructFieldValueProcessor _defaultProcessor = new StructFieldValueProcessor(); - static FieldValueProcessor() - { - _processors.Clear(); - _defaultProcessor._valueInfo = InspectorTypeInfo.Get(typeof(object)); - _processors.Add(typeof(object), _defaultProcessor); - foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) - { - foreach (var processorType in assembly.GetTypes()) - { - if (processorType.IsGenericType == false && - processorType.IsAbstract == false && - typeof(FieldValueProcessor).IsAssignableFrom(processorType) && - processorType != typeof(StructFieldValueProcessor)) - { - var processor = (FieldValueProcessor)Activator.CreateInstance(processorType); - processor._valueInfo = InspectorTypeInfo.Get(processor.ProcessedType); - _processors.Add(processor.ProcessedType, processor); - } - } - } - } - public static FieldValueProcessor GetProcessor(Type type) - { - if(type == null) - { - throw new ArgumentNullException("type"); - } - - if (_processors == null) - { - throw new Exception("_processors == null"); - } - if (_processors.TryGetValue(type, out FieldValueProcessor processor) == false) - { - FieldValueProcessor otherProcessor; - if (type.IsValueType) - { - otherProcessor = _defaultProcessor; - } - else - { - otherProcessor = GetProcessor(type.BaseType); - } - - processor = (FieldValueProcessor)otherProcessor.MemberwiseClone(); - processor._valueInfo = InspectorTypeInfo.Get(type); - _processors.Add(type, processor); - } - return processor; - } - - - private InspectorTypeInfo _valueInfo; - public InspectorTypeInfo ValueInfo - { - get { return _valueInfo; } - } - public bool IsDefault - { - get { return this == _defaultProcessor; } - } - public abstract Type ProcessedType { get; } - public abstract float GetHeight(in InspectorFieldInfo field, in Value value); - public abstract void Draw(Rect rect, in InspectorFieldInfo field, in Value value); - - public override string ToString() - { - if(_valueInfo == null) - { - return "ERROR"; - } - return _valueInfo.Type.Name + " " + GetType().Name; - } - } - private class StructFieldValueProcessor : FieldValueProcessor - { - public override Type ProcessedType { get { return typeof(object); } } - public override float GetHeight(in InspectorFieldInfo field, in Value value) - { - float result = GetPropertyHeight(field, ValueInfo, value); - //Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); - return result; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) - { - //Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); - DrawProperty(rect, field, ValueInfo, value); - } - } - private class ValueFieldValueProcessor : StructFieldValueProcessor where T : struct - { - public sealed override Type ProcessedType { get { return typeof(T); } } - public sealed override float GetHeight(in InspectorFieldInfo field, in Value value) - { - float result = GetHeight(field, value, ref value.AsValue()); - //Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); - return result; - } - public sealed override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) - { - //Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); - Draw(rect, field, value, ref value.AsValue()); - } - public virtual float GetHeight(in InspectorFieldInfo field, in Value raw, ref T value) - { - return base.GetHeight(field, raw); - } - public virtual void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref T value) - { - base.Draw(rect, field, raw); - } - } - private class RefFieldValueProcessor : StructFieldValueProcessor where T : class - { - public sealed override Type ProcessedType { get { return typeof(T); } } - public sealed override float GetHeight(in InspectorFieldInfo field, in Value value) - { - float result = GetHeight(field, value, value.AsRef()); - //Debug.Log("GetHeight: " + result + " : " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); - return result; - } - public sealed override void Draw(Rect rect, in InspectorFieldInfo field, in Value value) - { - //Debug.Log("Draw: " + ValueInfo.Type + " : " + ValueInfo.Fields + " : " + ValueInfo.IsNull); - Draw(rect, field, value, value.AsRef()); - } - public virtual float GetHeight(in InspectorFieldInfo field, in Value raw, T value) - { - return base.GetHeight(field, raw); - } - public virtual void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, T value) - { - base.Draw(rect, field, raw); - } - } - private unsafe class ArrayFieldValueProcessor : RefFieldValueProcessor - { - private static readonly int _mappingDataOffset; - static ArrayFieldValueProcessor() - { - Array array = new int[] { 1, 2, 3 }; - ulong handle; - - byte* ptrObject = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(array, out handle); - UnsafeUtility.ReleaseGCObject(handle); - byte* ptrData = (byte*)UnsafeUtility.PinGCArrayAndGetDataAddress(array, out handle); - UnsafeUtility.ReleaseGCObject(handle); - - _mappingDataOffset = (int)(ptrData - ptrObject); - } - - - private readonly ReorderableList _listDragCache; // сюда попадает _list если было вызвано событие драг енд дропа, а изначальный _listDragCache перемещается в _list - private readonly ReorderableList _list; - public ArrayFieldValueProcessor() - { - //_list.list - } - public override float GetHeight(in InspectorFieldInfo field, in Value raw, Array value) - { - //var elemType = value.GetType().GetElementType(); - //int length = value.Length; - //byte* ptr = raw.ValuePtr + _mappingDataOffset; - // - // - //_list.heigh - // - //ReorderableList l = null; - //l.onMouseDragCallback - // - //float result = 0; - //var processor = GetProcessor(elemType); - //for (int i = 0; i < length; i++) - //{ - // - //} - - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, Array value) - { - //var elemType = value.GetType().GetElementType(); - //int length = value.Length; - //byte* ptr = raw.ValuePtr + _mappingDataOffset; - // - - EditorGUI.LabelField(rect, UnityEditorUtility.GetLabel(field.Name), "Array Unsupport"); - } - } - private class SByteFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref sbyte value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref sbyte value) - { - value = (sbyte)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class ByteFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref byte value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref byte value) - { - value = (byte)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class ShortFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref short value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref short value) - { - value = (short)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class UShortFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref ushort value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref ushort value) - { - value = (ushort)EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class IntFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref int value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref int value) - { - value = EditorGUI.IntField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class UIntFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref uint value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref uint value) - { - value = (uint)EditorGUI.LongField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class LongFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref long value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref long value) - { - value = EditorGUI.LongField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class ULongFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref ulong value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref ulong value) - { - value = (ulong)EditorGUI.LongField(rect, UnityEditorUtility.GetLabel(field.Name), (long)value); - } - } - private class FloatFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref float value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref float value) - { - value = EditorGUI.FloatField(rect, UnityEditorUtility.GetLabel(field.Name), (long)value); - } - } - private class DoubleFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref double value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref double value) - { - value = EditorGUI.DoubleField(rect, UnityEditorUtility.GetLabel(field.Name), (long)value); - } - } - private class CharFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref char value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref char value) - { - var result = EditorGUI.TextField(rect, UnityEditorUtility.GetLabel(field.Name), value.ToString()); - if(result.Length > 0) - { - value = result[0]; - } - value = default; - } - } - private class ColorFieldValueProcessor : ValueFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, ref Color value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, ref Color value) - { - value = EditorGUI.ColorField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class StringFieldValueProcessor : RefFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, string value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, string value) - { - value = EditorGUI.TextField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class GradientFieldValueProcessor : RefFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, Gradient value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, Gradient value) - { - value = EditorGUI.GradientField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class CurveFieldValueProcessor : RefFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, AnimationCurve value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, AnimationCurve value) - { - value = EditorGUI.CurveField(rect, UnityEditorUtility.GetLabel(field.Name), value); - } - } - private class UnityObjectFieldValueProcessor : RefFieldValueProcessor - { - public override float GetHeight(in InspectorFieldInfo field, in Value raw, UnityObject value) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - public override void Draw(Rect rect, in InspectorFieldInfo field, in Value raw, UnityObject value) - { - value = EditorGUI.ObjectField(rect, UnityEditorUtility.GetLabel(field.Name), value, ValueInfo.Type, true); - } - } - #endregion - - #region InspectorTypeInfo - private class InspectorTypeInfo - { - #region cahce - private static Dictionary _typeInfosCache = new Dictionary(); - static InspectorTypeInfo() - { - _typeInfosCache.Clear(); - } - public static InspectorTypeInfo Get(Type type) - { - if (_typeInfosCache.TryGetValue(type, out InspectorTypeInfo info) == false) - { - info = new InspectorTypeInfo(type); - _typeInfosCache.Add(type, info); - } - - return info; - } - #endregion - private struct FakeNull { } - public static readonly InspectorTypeInfo PtrTypeInfo = new InspectorTypeInfo(typeof(IntPtr)); - public static readonly InspectorTypeInfo NullTypeInfo = new InspectorTypeInfo(typeof(FakeNull)); - - public readonly Type Type; - //public readonly int Size; - public readonly InspectorFieldInfo[] Fields; - //public readonly float DefaultInspectorHegiht; - - public readonly bool IsVector; - public readonly bool IsColor; - - public bool IsNull - { - get { return this == NullTypeInfo; } - } - public bool IsPrt - { - get { return this == PtrTypeInfo; } - } - - #region Constructors - //private static StructList CnstrBuffer = new StructList(32); - private static readonly char[] VectorFields = new char[] { 'x', 'y', 'z', 'w' }; - private static readonly char[] ColorFields = new char[] { 'r', 'g', 'b', 'a' }; - public InspectorTypeInfo(Type type) - { - StructList CnstrBuffer = new StructList(32); - //if (CnstrBuffer.IsNull) - //{ - // CnstrBuffer = new StructList(32); - //} - CnstrBuffer.FastClear(); - Type = type; - //Size = UnsafeUtility.SizeOf(type); - var fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); - foreach (var fieldInfo in fieldInfos) - { - InspectorFieldInfo.Union infoUniton = default; - ref InspectorFieldInfo.Constructor infocstr = ref infoUniton.Constructor; - - var fieldType = fieldInfo.FieldType; - - infocstr.FieldInfo = fieldInfo; - infocstr.Offset = UnsafeUtility.GetFieldOffset(fieldInfo); - infocstr.Name = UnityEditorUtility.TransformFieldName(fieldInfo.Name); - infocstr.Flag = FieldFlagUtitlity.GetFieldFlag(fieldType); - - if (infocstr.Flag == FieldFlag.StructValue) - { - infocstr.PreDefinedType = Get(fieldType); - } - else if (infocstr.Flag == FieldFlag.Ref) - { - infocstr.PreDefinedType = PtrTypeInfo; - } - else - { - if (type == infocstr.FieldInfo.FieldType) - { - infocstr.PreDefinedType = NullTypeInfo; - } - else - { - infocstr.PreDefinedType = Get(fieldType); - } - } - - - CnstrBuffer.Add(infoUniton.Result); - } - - Fields = CnstrBuffer.Enumerable.ToArray(); - Array.Sort(Fields); - - int length = Fields.Length; - if (length >= 2 && length <= 3) - { - bool isCheck = true; - for (int i = 0; i < length; i++) - { - ref var field = ref Fields[i]; - - if (field.Flag == FieldFlag.LeafValue && - field.PreDefinedType.Type.IsPrimitive && - char.ToLower(field.Name[0]) != VectorFields[i]) - { - isCheck = false; - break; - } - } - if (isCheck) - { - IsVector = true; - } - else - { - isCheck = true; - for (int i = 0; i < length; i++) - { - ref var field = ref Fields[i]; - if (field.Flag == FieldFlag.LeafValue && - field.PreDefinedType.Type.IsPrimitive && - char.ToLower(field.Name[0]) != ColorFields[i]) - { - isCheck = false; - break; - } - } - if (isCheck) - { - IsColor = true; - } - } - } - } - #endregion - - public override string ToString() - { - return Type.Name; - } - } - #endregion - - #region InspectorFieldInfo - [StructLayout(LayoutKind.Sequential)] - private unsafe readonly struct InspectorFieldInfo : IEquatable, IComparable - { - public readonly FieldInfo FieldInfo; - public readonly InspectorTypeInfo PreDefinedType; - public readonly string Name; - public readonly int Offset; - public readonly FieldFlag Flag; - - public int CompareTo(InspectorFieldInfo other) - { - return Offset - other.Offset; - } - public bool Equals(InspectorFieldInfo other) - { - return EqualityComparer.Default.Equals(this, other); - } - [StructLayout(LayoutKind.Sequential)] - public unsafe struct Constructor - { - public FieldInfo FieldInfo; - public InspectorTypeInfo PreDefinedType; - public string Name; - public int Offset; - public FieldFlag Flag; - public override string ToString() { return Name; } - } - [StructLayout(LayoutKind.Explicit)] - public struct Union - { - [FieldOffset(0)] - public Constructor Constructor; - [FieldOffset(0)] - public InspectorFieldInfo Result; - } - public override string ToString() { return Name; } - } - private static class FieldFlagUtitlity - { - private static readonly HashSet _cantDisplayedTypes = new HashSet() - { - typeof(IntPtr), - typeof(UIntPtr), - }; - private static readonly HashSet _leafTypes = new HashSet() - { - typeof(string), - typeof(AnimationCurve), - typeof(Gradient), - typeof(LayerMask), - typeof(Color), - }; - public static FieldFlag GetFieldFlag(Type fieldType) - { - if (fieldType.IsPointer || _cantDisplayedTypes.Contains(fieldType)) - { - return FieldFlag.CantDisplayed; - } - if (fieldType.IsClass || fieldType.IsInterface) - { - return FieldFlag.Ref; - } - if (fieldType.IsPrimitive || fieldType.IsEnum || _leafTypes.Contains(fieldType)) - { - return FieldFlag.LeafValue; - } - return FieldFlag.StructValue; - } - public static bool IsValueField(FieldFlag flag) - { - return flag == FieldFlag.LeafValue || flag == FieldFlag.StructValue; - } - public static bool IsCanDisplayed(FieldFlag flag) - { - return flag != FieldFlag.None && flag != FieldFlag.CantDisplayed; - } - } - private enum FieldFlag : byte - { - None = 0, - CantDisplayed, - LeafValue, - StructValue, - Ref, - } - #endregion - - private static void DrawProperty(Rect rect, in InspectorFieldInfo field, InspectorTypeInfo valueInfo, in Value value) - { - //if (field.Flag == FieldFlag.LeafValue) - //{ - // EditorGUI.LabelField(rect, UnityEditorUtility.GetLabel(field.Name)); - // return; - //} - float y = rect.y; - float height = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - Rect subRect = rect; - subRect.y = y; - subRect.height = height - EditorGUIUtility.standardVerticalSpacing; - y += height; - - EditorGUI.LabelField(subRect, field.Name); - - using (UpIndentLevel()) - { - foreach (var subField in valueInfo.Fields) - { - if (FieldFlagUtitlity.IsCanDisplayed(subField.Flag) == false) { continue; } - - var subValue = value.Read(subField); - Type subValueType; - - switch (subField.Flag) - { - case FieldFlag.LeafValue: - case FieldFlag.StructValue: - subValueType = subField.PreDefinedType.Type; - break; - case FieldFlag.Ref: - var obj = subValue.AsRef(); - subValueType = obj.GetType(); - break; - case FieldFlag.None: - case FieldFlag.CantDisplayed: - default: - subValueType = null; - break; - } - - if (subValueType == null) { continue; } - - var processor = FieldValueProcessor.GetProcessor(subValueType); - height = processor.GetHeight(subField, subValue); - subRect = rect; - subRect.y = y; - subRect.height = height - EditorGUIUtility.standardVerticalSpacing; - y += height; - - if (subField.Flag == FieldFlag.StructValue && processor.IsDefault) - { - if (subField.PreDefinedType.IsVector) - { - float defLabelWidth = EditorGUIUtility.labelWidth; - EditorGUIUtility.labelWidth = 14f; - subRect.xMin += EditorGUIUtility.labelWidth; - var vectorFields = subField.PreDefinedType.Fields; - var widthOne = subRect.width / vectorFields.Length; - foreach (var vectorField in vectorFields) - { - var vectorFieldProcessor = FieldValueProcessor.GetProcessor(vectorField.PreDefinedType.Type); - vectorFieldProcessor.Draw(subRect, vectorField, subValue.Read(vectorField)); - } - EditorGUIUtility.labelWidth = defLabelWidth; - } - //else if (subField.PreDefinedType.IsColor) - //{ - // EditorGUI.ColorField(subRect, ); - //} - } - - processor.Draw(subRect, subField, subValue); - } - } - } - private static float GetPropertyHeight(in InspectorFieldInfo field, InspectorTypeInfo valueInfo, in Value value) - { - float result = 0; - //if (field.Flag == FieldFlag.LeafValue) - //{ - // return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - //} - - //Debug.Log(string.Join("\r\n", valueInfo.Fields)); - - foreach (var subField in valueInfo.Fields) - { - if (FieldFlagUtitlity.IsCanDisplayed(subField.Flag) == false) { continue; } - - var subValue = value.Read(subField); - Type subValueType = null; - - switch (subField.Flag) - { - case FieldFlag.LeafValue: - case FieldFlag.StructValue: - subValueType = subField.PreDefinedType.Type; - break; - case FieldFlag.Ref: - var obj = subValue.AsRef(); - subValueType = obj.GetType(); - break; - } - - if (subValueType == null) { continue; } - - var processor = FieldValueProcessor.GetProcessor(subValueType); - if (subField.Flag == FieldFlag.StructValue && processor.IsDefault) - { - if (subField.PreDefinedType.IsVector) - //if (subField.PreDefinedType.IsVector || subField.PreDefinedType.IsColor) - { - return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } - } - result += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - result += processor.GetHeight(subField, subValue); - } - return result; - } - - public static unsafe partial class Layout - { - private static bool DrawProperty(object data, string name) - { - //Debug.LogWarning("--------------------------------------------"); - EditorGUI.BeginChangeCheck(); - Type type = data.GetType(); - byte* ptr = (byte*)UnsafeUtility.PinGCObjectAndGetAddress(data, out ulong gcHandle); - ptr += sizeof(IntPtr) * 2; //TODO тут надо просчитать что констатно ли значение смещения для упакованных данных - try - { - InspectorTypeInfo inspectorTypeInfo = InspectorTypeInfo.Get(type); - Value value = new Value(ptr, ptr); - - InspectorFieldInfo.Union f = default; - f.Constructor.Name = name; - float h = GetPropertyHeight(in f.Result, inspectorTypeInfo, in value); - var r = GUILayoutUtility.GetRect(EditorGUIUtility.currentViewWidth, h); - EcsGUI.DrawProperty(r, in f.Result, inspectorTypeInfo, in value); - - - UnsafeUtility.ReleaseGCObject(gcHandle); - } - catch (Exception) - { - UnsafeUtility.ReleaseGCObject(gcHandle); - throw; - } - - - return EditorGUI.EndChangeCheck(); - } - - } - } -} diff --git a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta b/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta deleted file mode 100644 index a8c426f..0000000 --- a/src/Internal/Editor/EcsGUI.RuntimeCumponents.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2b50e8a16e06a37438743ce90a39f93d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index 954a4d6..0837fd5 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -289,11 +289,11 @@ namespace DCFApixels.DragonECS.Unity.Editors get { return UserSettingsPrefs.instance.IsShowRuntimeComponents; } set { UserSettingsPrefs.instance.IsShowRuntimeComponents = value; } } - private static bool IsFastModeRuntimeComponents - { - get { return UserSettingsPrefs.instance.IsFastModeRuntimeComponents; } - set { UserSettingsPrefs.instance.IsFastModeRuntimeComponents = value; } - } + //private static bool IsFastModeRuntimeComponents + //{ + // get { return UserSettingsPrefs.instance.IsFastModeRuntimeComponents; } + // set { UserSettingsPrefs.instance.IsFastModeRuntimeComponents = value; } + //} private static float OneLineHeight { get => EditorGUIUtility.singleLineHeight; From a75a0c32130f9b3de4bd52bc54bac3d6a7d3529c Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 31 Dec 2024 23:24:15 +0800 Subject: [PATCH 6/6] up version to 0.5.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d02bfc0..204a4da 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "displayName": "DragonECS-Unity", "description": "Integration with Unity for DragonECS", "unity": "2021.2", - "version": "0.5.7", + "version": "0.5.9", "repository": { "type": "git", "url": "https://github.com/DCFApixels/DragonECS-Unity.git"