diff --git a/Source/Editor/GUI/Row.cs b/Source/Editor/GUI/Row.cs index 2e672ac49..3587dd834 100644 --- a/Source/Editor/GUI/Row.cs +++ b/Source/Editor/GUI/Row.cs @@ -218,11 +218,27 @@ namespace FlaxEditor.GUI /// public Action RightClick; + /// + /// The double click event. + /// + public Action RowDoubleClick; + + /// + /// The left mouse button click event. + /// + public Action RowLeftClick; + + /// + /// The right mouse button click event. + /// + public Action RowRightClick; + /// public override bool OnMouseDoubleClick(Float2 location, MouseButton button) { DoubleClick?.Invoke(); - + RowDoubleClick?.Invoke(this); + return base.OnMouseDoubleClick(location, button); } @@ -244,11 +260,13 @@ namespace FlaxEditor.GUI { _leftClick = false; LeftClick?.Invoke(); + RowLeftClick?.Invoke(this); } else if (button == MouseButton.Right && _isRightDown) { _isRightDown = false; RightClick?.Invoke(); + RowRightClick?.Invoke(this); } return base.OnMouseUp(location, button); diff --git a/Source/Editor/Windows/Profiler/MemoryGPU.cs b/Source/Editor/Windows/Profiler/MemoryGPU.cs index b288819da..3d1a4f7de 100644 --- a/Source/Editor/Windows/Profiler/MemoryGPU.cs +++ b/Source/Editor/Windows/Profiler/MemoryGPU.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Text; using FlaxEditor.GUI; using FlaxEngine; using FlaxEngine.GUI; @@ -17,9 +18,11 @@ namespace FlaxEditor.Windows.Profiler private struct Resource { public string Name; + public string Tooltip; public GPUResourceType Type; public ulong MemoryUsage; public Guid AssetId; + public bool IsAssetItem; } private readonly SingleChart _memoryUsageChart; @@ -29,6 +32,7 @@ namespace FlaxEditor.Windows.Profiler private string[] _resourceTypesNames; private Dictionary _assetPathToId; private Dictionary _resourceCache; + private StringBuilder _stringBuilder; public MemoryGPU() : base("GPU Memory") @@ -111,10 +115,14 @@ namespace FlaxEditor.Windows.Profiler _resourceCache = new Dictionary(); if (_assetPathToId == null) _assetPathToId = new Dictionary(); + if (_stringBuilder == null) + _stringBuilder = new StringBuilder(); // Capture current GPU resources usage info + var contentDatabase = Editor.Instance.ContentDatabase; var gpuResources = GPUDevice.Instance.Resources; var resources = new Resource[gpuResources.Length]; + var sb = _stringBuilder; for (int i = 0; i < resources.Length; i++) { var gpuResource = gpuResources[i]; @@ -129,6 +137,35 @@ namespace FlaxEditor.Windows.Profiler Type = gpuResource.ResourceType, }; + // Create tooltip + sb.Clear(); + if (gpuResource is GPUTexture gpuTexture) + { + var desc = gpuTexture.Description; + sb.Append("Format: ").Append(desc.Format).AppendLine(); + sb.Append("Size: ").Append(desc.Width).Append('x').Append(desc.Height); + if (desc.Depth != 1) + sb.Append('x').Append(desc.Depth); + if (desc.ArraySize != 1) + sb.Append('[').Append(desc.ArraySize).Append(']'); + sb.AppendLine(); + sb.Append("Mip Levels: ").Append(desc.MipLevels).AppendLine(); + if (desc.IsMultiSample) + sb.Append("MSAA: ").Append('x').Append((int)desc.MultiSampleLevel).AppendLine(); + sb.Append("Flags: ").Append(desc.Flags).AppendLine(); + sb.Append("Usage: ").Append(desc.Usage); + } + else if (gpuResource is GPUBuffer gpuBuffer) + { + var desc = gpuBuffer.Description; + sb.Append("Format: ").Append(desc.Format).AppendLine(); + sb.Append("Stride: ").Append(desc.Stride).AppendLine(); + sb.Append("Elements: ").Append(desc.ElementsCount).AppendLine(); + sb.Append("Flags: ").Append(desc.Flags).AppendLine(); + sb.Append("Usage: ").Append(desc.Usage); + } + resource.Tooltip = _stringBuilder.ToString(); + // Detect asset path in the resource name int ext = resource.Name.LastIndexOf(".flax", StringComparison.OrdinalIgnoreCase); if (ext != -1) @@ -141,6 +178,12 @@ namespace FlaxEditor.Windows.Profiler resource.AssetId = asset.ID; _assetPathToId.Add(assetPath, resource.AssetId); } + var assetItem = contentDatabase.FindAsset(resource.AssetId); + if (assetItem != null) + { + resource.IsAssetItem = true; + resource.Name = assetItem.NamePath + resource.Name.Substring(ext + 5); // Use text after asset path to display (eg. subobject) + } } _resourceCache.Add(gpuResourceId, resource); @@ -190,6 +233,7 @@ namespace FlaxEditor.Windows.Profiler _resourceCache?.Clear(); _assetPathToId?.Clear(); _tableRowsCache?.Clear(); + _stringBuilder?.Clear(); base.OnDestroy(); } @@ -234,7 +278,6 @@ namespace FlaxEditor.Windows.Profiler // Add rows var rowColor2 = Style.Current.Background * 1.4f; - var contentDatabase = Editor.Instance.ContentDatabase; for (int i = 0; i < resources.Length; i++) { ref var e = ref resources[i]; @@ -259,15 +302,12 @@ namespace FlaxEditor.Windows.Profiler row.Values[2] = e.MemoryUsage; // Setup row interactions - row.TooltipText = null; - row.DoubleClick = null; - var assetItem = contentDatabase.FindAsset(e.AssetId); - if (assetItem != null) + row.Tag = e; + row.TooltipText = e.Tooltip; + row.RowDoubleClick = null; + if (e.IsAssetItem) { - row.Values[0] = assetItem.NamePath; - assetItem.UpdateTooltipText(); - row.TooltipText = assetItem.TooltipText; - row.DoubleClick = () => { Editor.Instance.ContentEditing.Open(assetItem); }; + row.RowDoubleClick = OnRowDoubleClickAsset; } // Add row to the table @@ -276,5 +316,12 @@ namespace FlaxEditor.Windows.Profiler row.Parent = _table; } } + + private void OnRowDoubleClickAsset(ClickableRow row) + { + var e = (Resource)row.Tag; + var assetItem = Editor.Instance.ContentDatabase.FindAsset(e.AssetId); + Editor.Instance.ContentEditing.Open(assetItem); + } } }