From f71bdd09625cea8964ef2e9515648b7cab061e00 Mon Sep 17 00:00:00 2001 From: Norite SC <162097313+cNori@users.noreply.github.com> Date: Tue, 13 May 2025 01:13:16 +0200 Subject: [PATCH 1/3] Create GPUTextureEditor.cs --- Source/Editor/GUI/GPUTextureEditor.cs | 112 ++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 Source/Editor/GUI/GPUTextureEditor.cs diff --git a/Source/Editor/GUI/GPUTextureEditor.cs b/Source/Editor/GUI/GPUTextureEditor.cs new file mode 100644 index 000000000..5dd672941 --- /dev/null +++ b/Source/Editor/GUI/GPUTextureEditor.cs @@ -0,0 +1,112 @@ +#if FLAX_EDITOR +using FlaxEditor.CustomEditors; +using FlaxEditor.CustomEditors.Editors; +using FlaxEditor.CustomEditors.Elements; +using FlaxEditor.GUI.ContextMenu; +using FlaxEditor.Scripting; +using FlaxEditor.Tools.Foliage; +using FlaxEngine; +using FlaxEngine.GUI; +using FlaxEngine.Utilities; + +namespace FlaxEditor.GUI +{ + /// + /// basic custom property editor for GPUTexture + /// + [CustomEditor(typeof(GPUTexture))] + public class GPUTexturePropertyEditor : GenericEditor + { + public override DisplayStyle Style => DisplayStyle.Inline; + + ImageElement imageElement; + GroupElement group; + /// + /// + /// + public override void Initialize(LayoutElementsContainer layout) + { + imageElement = (group = layout.Group("")).Image(SpriteHandle.Default); + + //todo fix the AddSettingsButton func + //shit is buged + //the code below (until the Paint) is untested the Clear might not work + group.AddSettingsButton(); + group.SetupContextMenu += (ContextMenu.ContextMenu cxm, DropPanel dp) => + { + cxm.AddButton("Clear", (ContextMenuButton bt) => + { + SetValue(null); + }); + + cxm.AddSeparator(); + + //todo + //editor is needed + //cxm.AddButton("Display Full Texture", (ContextMenuButton bt) => + //{ + //}); + + //todo + // + //cxm.AddButton("Save To Asset", (ContextMenuButton bt) => + //{ + //}); + }; + Paint(); + group.Panel.Close(); + } + /// + /// + public override void Refresh() + { + Paint(); + base.Refresh(); + } + private void Paint() + { + string name = null; + string tt = null; + if (Values[0] is GPUTexture gputex) + { + name = gputex.Name; + tt += "Type: " + gputex.ResourceType.ToString() + "\n"; + tt += "Memory Usage: " + gputex.MemoryUsage + "B" + "\n"; + tt += "Format: " + gputex.Format.ToString() + "\n"; + //shorten the name it is a full path + if (name.EndsWith(".flax")) + { + if (name != ".flax")//sanity guard + { + var nameStartIndexWithEx = Globals.ProjectFolder.Length + 9 /* +9 to remove the "/Content/" */; + name = name.Substring + ( + nameStartIndexWithEx, + nameStartIndexWithEx - 5 /* -5 to remove the .flax */ + 2 + ); + + tt += "Path: " + gputex.Name.Remove(0, Globals.ProjectFolder.Length + 1); + } + } + + if (imageElement.Image.Brush is GPUTextureBrush brush) + { + brush.Texture = gputex; + imageElement.Control.Size = new Float2(group.Control.Width); + } + else + { + imageElement.Image.Brush = new GPUTextureBrush(); + Paint(); + } + } + name ??= "..."; + + DropPanel p = group.Control as DropPanel; + + p.HeaderText = name; + p.TooltipText = tt; + } + } +} +#endif From 56077a268abaac7b80afeb17cc1bf34e4066f652 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 16 Sep 2025 00:15:48 +0200 Subject: [PATCH 2/3] SImplify and cleanup GPUTexture editor #3452 #3194 --- .../Dedicated/GPUTextureEditor.cs | 63 ++++++++++ Source/Editor/GUI/GPUTextureEditor.cs | 112 ------------------ 2 files changed, 63 insertions(+), 112 deletions(-) create mode 100644 Source/Editor/CustomEditors/Dedicated/GPUTextureEditor.cs delete mode 100644 Source/Editor/GUI/GPUTextureEditor.cs diff --git a/Source/Editor/CustomEditors/Dedicated/GPUTextureEditor.cs b/Source/Editor/CustomEditors/Dedicated/GPUTextureEditor.cs new file mode 100644 index 000000000..9df7ca377 --- /dev/null +++ b/Source/Editor/CustomEditors/Dedicated/GPUTextureEditor.cs @@ -0,0 +1,63 @@ +// Copyright (c) Wojciech Figat. All rights reserved. + +using FlaxEditor.GUI.ContextMenu; +using FlaxEngine; +using FlaxEngine.GUI; + +namespace FlaxEditor.CustomEditors.Dedicated +{ + /// + /// Basic editor/viewer for . + /// + [CustomEditor(typeof(GPUTexture)), DefaultEditor] + public class GPUTextureEditor : CustomEditor + { + private Image _image; + + /// + public override DisplayStyle Style => DisplayStyle.Inline; + + /// + public override void Initialize(LayoutElementsContainer layout) + { + _image = new Image + { + Brush = new GPUTextureBrush(), + Size = new Float2(200, 100), + Parent = layout.ContainerControl, + }; + _image.Clicked += OnImageClicked; + } + + private void OnImageClicked(Image image, MouseButton button) + { + var texture = Values[0] as GPUTexture; + if (!texture) + return; + var menu = new ContextMenu(); + menu.AddButton("Save...", () => Screenshot.Capture(Values[0] as GPUTexture)); + menu.AddButton("Enlarge", () => _image.Size *= 2); + menu.AddButton("Shrink", () => _image.Size /= 2).Enabled = _image.Height > 32; + var location = image.PointFromScreen(Input.MouseScreenPosition); + menu.Show(image, location); + } + + /// + public override void Refresh() + { + base.Refresh(); + + var texture = Values[0] as GPUTexture; + ((GPUTextureBrush)_image.Brush).Texture = texture; + if (texture) + { + var desc = texture.Description; + _image.TooltipText = $"{texture.Name}\nType: {texture.ResourceType}\nSize: {desc.Width}x{desc.Height}\nFormat: {desc.Format}\nMemory: {Utilities.Utils.FormatBytesCount(texture.MemoryUsage)}"; + } + else + { + _image.TooltipText = "None"; + } + } + } +} diff --git a/Source/Editor/GUI/GPUTextureEditor.cs b/Source/Editor/GUI/GPUTextureEditor.cs deleted file mode 100644 index 5dd672941..000000000 --- a/Source/Editor/GUI/GPUTextureEditor.cs +++ /dev/null @@ -1,112 +0,0 @@ -#if FLAX_EDITOR -using FlaxEditor.CustomEditors; -using FlaxEditor.CustomEditors.Editors; -using FlaxEditor.CustomEditors.Elements; -using FlaxEditor.GUI.ContextMenu; -using FlaxEditor.Scripting; -using FlaxEditor.Tools.Foliage; -using FlaxEngine; -using FlaxEngine.GUI; -using FlaxEngine.Utilities; - -namespace FlaxEditor.GUI -{ - /// - /// basic custom property editor for GPUTexture - /// - [CustomEditor(typeof(GPUTexture))] - public class GPUTexturePropertyEditor : GenericEditor - { - public override DisplayStyle Style => DisplayStyle.Inline; - - ImageElement imageElement; - GroupElement group; - /// - /// - /// - public override void Initialize(LayoutElementsContainer layout) - { - imageElement = (group = layout.Group("")).Image(SpriteHandle.Default); - - //todo fix the AddSettingsButton func - //shit is buged - //the code below (until the Paint) is untested the Clear might not work - group.AddSettingsButton(); - group.SetupContextMenu += (ContextMenu.ContextMenu cxm, DropPanel dp) => - { - cxm.AddButton("Clear", (ContextMenuButton bt) => - { - SetValue(null); - }); - - cxm.AddSeparator(); - - //todo - //editor is needed - //cxm.AddButton("Display Full Texture", (ContextMenuButton bt) => - //{ - //}); - - //todo - // - //cxm.AddButton("Save To Asset", (ContextMenuButton bt) => - //{ - //}); - }; - Paint(); - group.Panel.Close(); - } - /// - /// - public override void Refresh() - { - Paint(); - base.Refresh(); - } - private void Paint() - { - string name = null; - string tt = null; - if (Values[0] is GPUTexture gputex) - { - name = gputex.Name; - tt += "Type: " + gputex.ResourceType.ToString() + "\n"; - tt += "Memory Usage: " + gputex.MemoryUsage + "B" + "\n"; - tt += "Format: " + gputex.Format.ToString() + "\n"; - //shorten the name it is a full path - if (name.EndsWith(".flax")) - { - if (name != ".flax")//sanity guard - { - var nameStartIndexWithEx = Globals.ProjectFolder.Length + 9 /* +9 to remove the "/Content/" */; - name = name.Substring - ( - nameStartIndexWithEx, - nameStartIndexWithEx - 5 /* -5 to remove the .flax */ + 2 - ); - - tt += "Path: " + gputex.Name.Remove(0, Globals.ProjectFolder.Length + 1); - } - } - - if (imageElement.Image.Brush is GPUTextureBrush brush) - { - brush.Texture = gputex; - imageElement.Control.Size = new Float2(group.Control.Width); - } - else - { - imageElement.Image.Brush = new GPUTextureBrush(); - Paint(); - } - } - name ??= "..."; - - DropPanel p = group.Control as DropPanel; - - p.HeaderText = name; - p.TooltipText = tt; - } - } -} -#endif From 521518bde4bb00803ea47b343f3f21e27ec639a7 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 16 Sep 2025 00:15:58 +0200 Subject: [PATCH 3/3] Add hack to use GPUTextureEditor on ref pickers --- Source/Editor/CustomEditors/CustomEditorsUtil.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Editor/CustomEditors/CustomEditorsUtil.cs b/Source/Editor/CustomEditors/CustomEditorsUtil.cs index 7d7ef123d..476219960 100644 --- a/Source/Editor/CustomEditors/CustomEditorsUtil.cs +++ b/Source/Editor/CustomEditors/CustomEditorsUtil.cs @@ -87,8 +87,11 @@ namespace FlaxEditor.CustomEditors var targetTypeType = TypeUtils.GetType(targetType); if (canUseRefPicker) { + // TODO: add generic way of CustomEditor for ref pickers (use it on AssetRefEditor/GPUTextureEditor/...) if (typeof(Asset).IsAssignableFrom(targetTypeType)) return new AssetRefEditor(); + if (typeof(GPUTexture).IsAssignableFrom(targetTypeType)) + return new GPUTextureEditor(); if (typeof(FlaxEngine.Object).IsAssignableFrom(targetTypeType)) return new FlaxObjectRefEditor(); }