From 93a0facd9331b13cc44affb33e4d13ba5858f927 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Tue, 29 Nov 2022 21:30:17 -0600 Subject: [PATCH 01/30] Allows user to left click to end editing text and right click to change text back to its original and end editing. --- Source/Editor/GUI/Input/SliderControl.cs | 1 + Source/Editor/GUI/Input/ValueBox.cs | 3 +++ Source/Engine/UI/GUI/Common/TextBoxBase.cs | 26 ++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/Source/Editor/GUI/Input/SliderControl.cs b/Source/Editor/GUI/Input/SliderControl.cs index 7a8b82622..8dc129d0a 100644 --- a/Source/Editor/GUI/Input/SliderControl.cs +++ b/Source/Editor/GUI/Input/SliderControl.cs @@ -371,6 +371,7 @@ namespace FlaxEditor.GUI.Input Parent = this, Location = new Float2(split, 0), Size = new Float2(Height, TextBoxSize), + CanEndEditByClick = true, }; _textBox.EditEnd += OnTextBoxEditEnd; } diff --git a/Source/Editor/GUI/Input/ValueBox.cs b/Source/Editor/GUI/Input/ValueBox.cs index 7f4fb51e0..6cfbbddfb 100644 --- a/Source/Editor/GUI/Input/ValueBox.cs +++ b/Source/Editor/GUI/Input/ValueBox.cs @@ -125,6 +125,7 @@ namespace FlaxEditor.GUI.Input _min = min; _max = max; _slideSpeed = sliderSpeed; + CanEndEditByClick = true; } /// @@ -173,6 +174,7 @@ namespace FlaxEditor.GUI.Input private void EndSliding() { _isSliding = false; + CanEndEditByClick = true; EndMouseCapture(); if (_cursorChanged) { @@ -245,6 +247,7 @@ namespace FlaxEditor.GUI.Input _startSlideLocation = location; _startSlideValue = _value; StartMouseCapture(true); + CanEndEditByClick = false; // Hide cursor and cache location Cursor = CursorType.Hidden; diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index 69b4fa123..78ab040a2 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -139,6 +139,12 @@ namespace FlaxEngine.GUI /// public event Action KeyUp; + /// + /// Gets or sets a value indicating whether the text box can end edit via left click outside of the control + /// + [HideInEditor] + public bool CanEndEditByClick { get; set; } = false; + /// /// Gets or sets a value indicating whether this is a multiline text box control. /// @@ -1041,6 +1047,26 @@ namespace FlaxEngine.GUI // Animate view offset _viewOffset = isDeltaSlow ? _targetViewOffset : Float2.Lerp(_viewOffset, _targetViewOffset, deltaTime * 20.0f); + + // Clicking outside of the text box will end text editing. Left will keep the value, right will restore original value + if (_isEditing && CanEndEditByClick) + { + if (!IsMouseOver && RootWindow.ContainsFocus) + { + if (Input.GetMouseButtonDown(MouseButton.Left)) + { + RemoveFocus(); + } + else if (Input.GetMouseButtonDown(MouseButton.Right)) + { + // Restore text from start + SetSelection(-1); + _text = _onStartEditValue; + OnTextChanged(); + RemoveFocus(); + } + } + } base.Update(deltaTime); } From 5e5d88ed8eacbe5dc1117380658a8081344df40f Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sat, 3 Dec 2022 15:43:52 +0200 Subject: [PATCH 02/30] Fix input actions/axis lookups to not use StringView The stored strings might point to temporary strings, causing garbage data to be present in the dictionary at times. --- Source/Engine/Input/Input.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Input/Input.cpp b/Source/Engine/Input/Input.cpp index 91bde0625..51f1831f0 100644 --- a/Source/Engine/Input/Input.cpp +++ b/Source/Engine/Input/Input.cpp @@ -55,8 +55,8 @@ struct AxisData namespace InputImpl { - Dictionary Actions; - Dictionary Axes; + Dictionary Actions; + Dictionary Axes; bool GamepadsChanged = true; Array AxesValues; InputDevice::EventQueue InputEvents; From 9b828601542b98de73f5715ebd97413d2f8486ee Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Tue, 29 Nov 2022 21:30:17 -0600 Subject: [PATCH 03/30] Allows user to left click to end editing text and right click to change text back to its original and end editing. --- Source/Editor/GUI/Input/SliderControl.cs | 1 + Source/Editor/GUI/Input/ValueBox.cs | 3 +++ Source/Engine/UI/GUI/Common/TextBoxBase.cs | 26 ++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/Source/Editor/GUI/Input/SliderControl.cs b/Source/Editor/GUI/Input/SliderControl.cs index 7a8b82622..8dc129d0a 100644 --- a/Source/Editor/GUI/Input/SliderControl.cs +++ b/Source/Editor/GUI/Input/SliderControl.cs @@ -371,6 +371,7 @@ namespace FlaxEditor.GUI.Input Parent = this, Location = new Float2(split, 0), Size = new Float2(Height, TextBoxSize), + CanEndEditByClick = true, }; _textBox.EditEnd += OnTextBoxEditEnd; } diff --git a/Source/Editor/GUI/Input/ValueBox.cs b/Source/Editor/GUI/Input/ValueBox.cs index 7f4fb51e0..6cfbbddfb 100644 --- a/Source/Editor/GUI/Input/ValueBox.cs +++ b/Source/Editor/GUI/Input/ValueBox.cs @@ -125,6 +125,7 @@ namespace FlaxEditor.GUI.Input _min = min; _max = max; _slideSpeed = sliderSpeed; + CanEndEditByClick = true; } /// @@ -173,6 +174,7 @@ namespace FlaxEditor.GUI.Input private void EndSliding() { _isSliding = false; + CanEndEditByClick = true; EndMouseCapture(); if (_cursorChanged) { @@ -245,6 +247,7 @@ namespace FlaxEditor.GUI.Input _startSlideLocation = location; _startSlideValue = _value; StartMouseCapture(true); + CanEndEditByClick = false; // Hide cursor and cache location Cursor = CursorType.Hidden; diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index 69b4fa123..78ab040a2 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -139,6 +139,12 @@ namespace FlaxEngine.GUI /// public event Action KeyUp; + /// + /// Gets or sets a value indicating whether the text box can end edit via left click outside of the control + /// + [HideInEditor] + public bool CanEndEditByClick { get; set; } = false; + /// /// Gets or sets a value indicating whether this is a multiline text box control. /// @@ -1041,6 +1047,26 @@ namespace FlaxEngine.GUI // Animate view offset _viewOffset = isDeltaSlow ? _targetViewOffset : Float2.Lerp(_viewOffset, _targetViewOffset, deltaTime * 20.0f); + + // Clicking outside of the text box will end text editing. Left will keep the value, right will restore original value + if (_isEditing && CanEndEditByClick) + { + if (!IsMouseOver && RootWindow.ContainsFocus) + { + if (Input.GetMouseButtonDown(MouseButton.Left)) + { + RemoveFocus(); + } + else if (Input.GetMouseButtonDown(MouseButton.Right)) + { + // Restore text from start + SetSelection(-1); + _text = _onStartEditValue; + OnTextChanged(); + RemoveFocus(); + } + } + } base.Update(deltaTime); } From eab775b9a22cae553de8f4bf600d6e15d0457fed Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 08:02:43 -0600 Subject: [PATCH 04/30] Added RstoreTextFromStart function and changed the calls. Renamed bool. --- Source/Editor/GUI/Input/SliderControl.cs | 2 +- Source/Editor/GUI/Input/ValueBox.cs | 6 +++--- Source/Engine/UI/GUI/Common/TextBoxBase.cs | 25 +++++++++++++--------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Source/Editor/GUI/Input/SliderControl.cs b/Source/Editor/GUI/Input/SliderControl.cs index 8dc129d0a..6fe9a246e 100644 --- a/Source/Editor/GUI/Input/SliderControl.cs +++ b/Source/Editor/GUI/Input/SliderControl.cs @@ -371,7 +371,7 @@ namespace FlaxEditor.GUI.Input Parent = this, Location = new Float2(split, 0), Size = new Float2(Height, TextBoxSize), - CanEndEditByClick = true, + EndEditOnClick = true, }; _textBox.EditEnd += OnTextBoxEditEnd; } diff --git a/Source/Editor/GUI/Input/ValueBox.cs b/Source/Editor/GUI/Input/ValueBox.cs index 6cfbbddfb..c25455612 100644 --- a/Source/Editor/GUI/Input/ValueBox.cs +++ b/Source/Editor/GUI/Input/ValueBox.cs @@ -125,7 +125,7 @@ namespace FlaxEditor.GUI.Input _min = min; _max = max; _slideSpeed = sliderSpeed; - CanEndEditByClick = true; + EndEditOnClick = true; } /// @@ -174,7 +174,7 @@ namespace FlaxEditor.GUI.Input private void EndSliding() { _isSliding = false; - CanEndEditByClick = true; + EndEditOnClick = true; EndMouseCapture(); if (_cursorChanged) { @@ -247,7 +247,7 @@ namespace FlaxEditor.GUI.Input _startSlideLocation = location; _startSlideValue = _value; StartMouseCapture(true); - CanEndEditByClick = false; + EndEditOnClick = false; // Hide cursor and cache location Cursor = CursorType.Hidden; diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index 78ab040a2..85b5c537c 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -143,7 +143,7 @@ namespace FlaxEngine.GUI /// Gets or sets a value indicating whether the text box can end edit via left click outside of the control /// [HideInEditor] - public bool CanEndEditByClick { get; set; } = false; + public bool EndEditOnClick { get; set; } = false; /// /// Gets or sets a value indicating whether this is a multiline text box control. @@ -1049,7 +1049,7 @@ namespace FlaxEngine.GUI _viewOffset = isDeltaSlow ? _targetViewOffset : Float2.Lerp(_viewOffset, _targetViewOffset, deltaTime * 20.0f); // Clicking outside of the text box will end text editing. Left will keep the value, right will restore original value - if (_isEditing && CanEndEditByClick) + if (_isEditing && EndEditOnClick) { if (!IsMouseOver && RootWindow.ContainsFocus) { @@ -1059,10 +1059,7 @@ namespace FlaxEngine.GUI } else if (Input.GetMouseButtonDown(MouseButton.Right)) { - // Restore text from start - SetSelection(-1); - _text = _onStartEditValue; - OnTextChanged(); + RestoreTextFromStart(); RemoveFocus(); } } @@ -1071,6 +1068,17 @@ namespace FlaxEngine.GUI base.Update(deltaTime); } + /// + /// Restores the Text from the start. + /// + public void RestoreTextFromStart() + { + // Restore text from start + SetSelection(-1); + _text = _onStartEditValue; + OnTextChanged(); + } + /// public override void OnGotFocus() { @@ -1326,13 +1334,10 @@ namespace FlaxEngine.GUI } case KeyboardKeys.Escape: { - // Restore text from start - SetSelection(-1); - _text = _onStartEditValue; + RestoreTextFromStart(); if (!IsNavFocused) RemoveFocus(); - OnTextChanged(); return true; } From 95db33e614537fe1a851e098b172adb0da8cbc2b Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 09:00:37 -0600 Subject: [PATCH 05/30] Added string text box to end on click --- Source/Editor/CustomEditors/Editors/StringEditor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Editor/CustomEditors/Editors/StringEditor.cs b/Source/Editor/CustomEditors/Editors/StringEditor.cs index d2d214eb5..22e6b2e71 100644 --- a/Source/Editor/CustomEditors/Editors/StringEditor.cs +++ b/Source/Editor/CustomEditors/Editors/StringEditor.cs @@ -30,6 +30,7 @@ namespace FlaxEditor.CustomEditors.Editors } _element = layout.TextBox(isMultiLine); + _element.TextBox.EndEditOnClick = true; _element.TextBox.EditEnd += () => SetValue(_element.Text); } From ad0aadbf29cd1f60dac915223860cc61ea752125 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 16:06:39 -0600 Subject: [PATCH 06/30] Changed location of renaming box for ActorTreeNodes to start at the label for better UX. --- Source/Editor/SceneGraph/GUI/ActorTreeNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs index ca0aaee77..10857f685 100644 --- a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs +++ b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs @@ -282,7 +282,7 @@ namespace FlaxEditor.SceneGraph.GUI (window as PrefabWindow).ScrollingOnTreeView(false); // Start renaming the actor - var dialog = RenamePopup.Show(this, HeaderRect, _actorNode.Name, false); + var dialog = RenamePopup.Show(this, TextRect, _actorNode.Name, false); dialog.Renamed += OnRenamed; dialog.Closed += popup => { From 1a3bcc5d2710415405c49063f7a337a9d915565f Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 16:21:10 -0600 Subject: [PATCH 07/30] Changed default to true. --- Source/Editor/CustomEditors/Editors/StringEditor.cs | 1 - Source/Editor/GUI/Input/SliderControl.cs | 1 - Source/Editor/GUI/Input/ValueBox.cs | 1 - Source/Engine/UI/GUI/Common/TextBoxBase.cs | 2 +- 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Source/Editor/CustomEditors/Editors/StringEditor.cs b/Source/Editor/CustomEditors/Editors/StringEditor.cs index 22e6b2e71..d2d214eb5 100644 --- a/Source/Editor/CustomEditors/Editors/StringEditor.cs +++ b/Source/Editor/CustomEditors/Editors/StringEditor.cs @@ -30,7 +30,6 @@ namespace FlaxEditor.CustomEditors.Editors } _element = layout.TextBox(isMultiLine); - _element.TextBox.EndEditOnClick = true; _element.TextBox.EditEnd += () => SetValue(_element.Text); } diff --git a/Source/Editor/GUI/Input/SliderControl.cs b/Source/Editor/GUI/Input/SliderControl.cs index 6fe9a246e..7a8b82622 100644 --- a/Source/Editor/GUI/Input/SliderControl.cs +++ b/Source/Editor/GUI/Input/SliderControl.cs @@ -371,7 +371,6 @@ namespace FlaxEditor.GUI.Input Parent = this, Location = new Float2(split, 0), Size = new Float2(Height, TextBoxSize), - EndEditOnClick = true, }; _textBox.EditEnd += OnTextBoxEditEnd; } diff --git a/Source/Editor/GUI/Input/ValueBox.cs b/Source/Editor/GUI/Input/ValueBox.cs index c25455612..ac253b79d 100644 --- a/Source/Editor/GUI/Input/ValueBox.cs +++ b/Source/Editor/GUI/Input/ValueBox.cs @@ -125,7 +125,6 @@ namespace FlaxEditor.GUI.Input _min = min; _max = max; _slideSpeed = sliderSpeed; - EndEditOnClick = true; } /// diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index addf967dc..0e9c34954 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -143,7 +143,7 @@ namespace FlaxEngine.GUI /// Gets or sets a value indicating whether the text box can end edit via left click outside of the control /// [HideInEditor] - public bool EndEditOnClick { get; set; } = false; + public bool EndEditOnClick { get; set; } = true; /// /// Gets or sets a value indicating whether this is a multiline text box control. From 2e055d190918e8312e95595d706b8656d0887500 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 20:40:21 -0600 Subject: [PATCH 08/30] Changed saved window layouts to be accessable from any project. added apply and delete buttons as well. --- Source/Editor/Modules/UIModule.cs | 12 +++++++++--- Source/Editor/Modules/WindowsModule.cs | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Source/Editor/Modules/UIModule.cs b/Source/Editor/Modules/UIModule.cs index 7c71c5628..5d0b6ff09 100644 --- a/Source/Editor/Modules/UIModule.cs +++ b/Source/Editor/Modules/UIModule.cs @@ -738,7 +738,11 @@ namespace FlaxEditor.Modules return; // Find layout to use - var searchFolder = Globals.ProjectCacheFolder; + var searchFolder = StringUtils.CombinePaths(Editor.LocalCachePath, "LayoutsCache") ; + if (!Directory.Exists(searchFolder)) + { + Directory.CreateDirectory(searchFolder); + } var files = Directory.GetFiles(searchFolder, "Layout_*.xml", SearchOption.TopDirectoryOnly); var layouts = _menuWindowApplyWindowLayout.ContextMenu; layouts.DisposeAllItems(); @@ -746,8 +750,10 @@ namespace FlaxEditor.Modules { var file = files[i]; var name = file.Substring(searchFolder.Length + 8, file.Length - searchFolder.Length - 12); - var button = layouts.AddButton(name, OnApplyLayoutButtonClicked); - button.Tag = file; + var nameCM = layouts.AddChildMenu(name); + var applyButton = nameCM.ContextMenu.AddButton("Apply", OnApplyLayoutButtonClicked); + nameCM.ContextMenu.AddButton("Delete", () => File.Delete(file)); + applyButton.Tag = file; } _menuWindowApplyWindowLayout.Enabled = files.Length > 0; } diff --git a/Source/Editor/Modules/WindowsModule.cs b/Source/Editor/Modules/WindowsModule.cs index 0e341581f..04182f81d 100644 --- a/Source/Editor/Modules/WindowsModule.cs +++ b/Source/Editor/Modules/WindowsModule.cs @@ -555,8 +555,8 @@ namespace FlaxEditor.Modules } base.OnSubmit(); - - var path = StringUtils.CombinePaths(Globals.ProjectCacheFolder, "Layout_" + name + ".xml"); + + var path = StringUtils.CombinePaths(Editor.LocalCachePath, "LayoutsCache", "Layout_" + name + ".xml"); Editor.Instance.Windows.SaveLayout(path); } } From ffc5a4d24fc660dd38d42631e89676ba0e47698b Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 20:42:39 -0600 Subject: [PATCH 09/30] Style fix --- Source/Editor/Modules/UIModule.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Editor/Modules/UIModule.cs b/Source/Editor/Modules/UIModule.cs index 5d0b6ff09..83ff4a74b 100644 --- a/Source/Editor/Modules/UIModule.cs +++ b/Source/Editor/Modules/UIModule.cs @@ -740,9 +740,7 @@ namespace FlaxEditor.Modules // Find layout to use var searchFolder = StringUtils.CombinePaths(Editor.LocalCachePath, "LayoutsCache") ; if (!Directory.Exists(searchFolder)) - { Directory.CreateDirectory(searchFolder); - } var files = Directory.GetFiles(searchFolder, "Layout_*.xml", SearchOption.TopDirectoryOnly); var layouts = _menuWindowApplyWindowLayout.ContextMenu; layouts.DisposeAllItems(); From a45f7a86f23ee74351d919620ae9eecae617ff09 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 8 Dec 2022 21:21:03 -0600 Subject: [PATCH 10/30] Added Tooltips --- Source/Editor/Modules/UIModule.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Editor/Modules/UIModule.cs b/Source/Editor/Modules/UIModule.cs index 83ff4a74b..80f0bb97c 100644 --- a/Source/Editor/Modules/UIModule.cs +++ b/Source/Editor/Modules/UIModule.cs @@ -750,7 +750,8 @@ namespace FlaxEditor.Modules var name = file.Substring(searchFolder.Length + 8, file.Length - searchFolder.Length - 12); var nameCM = layouts.AddChildMenu(name); var applyButton = nameCM.ContextMenu.AddButton("Apply", OnApplyLayoutButtonClicked); - nameCM.ContextMenu.AddButton("Delete", () => File.Delete(file)); + applyButton.TooltipText = "Applies the selected layout."; + nameCM.ContextMenu.AddButton("Delete", () => File.Delete(file)).TooltipText = "Permanently deletes the selected layout."; applyButton.Tag = file; } _menuWindowApplyWindowLayout.Enabled = files.Length > 0; From 8d9e3ded7459008f215f4755efa0cdb3d74108a2 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 12 Dec 2022 16:55:12 -0600 Subject: [PATCH 11/30] Remove sorting children in convtent view treeand make it so the game is on top, plugins in the middle, and engine at the bottom of the tree. This is for better UX. --- Source/Editor/Windows/ContentWindow.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs index 22808a1f1..bb179f9e9 100644 --- a/Source/Editor/Windows/ContentWindow.cs +++ b/Source/Editor/Windows/ContentWindow.cs @@ -837,13 +837,19 @@ namespace FlaxEditor.Windows }; _root.Expand(true); + // Add game project on top, plugins in the middle and engine at bottom + _root.AddChild(Editor.ContentDatabase.Game); foreach (var project in Editor.ContentDatabase.Projects) + { + if (project == Editor.ContentDatabase.Game || project == Editor.ContentDatabase.Engine) + continue; _root.AddChild(project); + } + _root.AddChild(Editor.ContentDatabase.Engine); Editor.ContentDatabase.Game?.Expand(true); _tree.Margin = new Margin(0.0f, 0.0f, -16.0f, 2.0f); // Hide root node _tree.AddChild(_root); - _root.SortChildrenRecursive(); // Setup navigation _navigationUnlocked = true; From 7eab3fe5b367575b474a83f2ccddb6fc66e9766c Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 12 Dec 2022 18:18:48 -0600 Subject: [PATCH 12/30] Added back sorting sub project directories. --- Source/Editor/Windows/ContentWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs index bb179f9e9..3b1d0a11f 100644 --- a/Source/Editor/Windows/ContentWindow.cs +++ b/Source/Editor/Windows/ContentWindow.cs @@ -841,6 +841,7 @@ namespace FlaxEditor.Windows _root.AddChild(Editor.ContentDatabase.Game); foreach (var project in Editor.ContentDatabase.Projects) { + project.SortChildrenRecursive(); if (project == Editor.ContentDatabase.Game || project == Editor.ContentDatabase.Engine) continue; _root.AddChild(project); From de79e43fb19925da9fda8837674602beb97ea197 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 14 Dec 2022 08:30:44 -0600 Subject: [PATCH 13/30] Code Style Fix --- Source/Editor/Modules/WindowsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/Modules/WindowsModule.cs b/Source/Editor/Modules/WindowsModule.cs index 04182f81d..993d51778 100644 --- a/Source/Editor/Modules/WindowsModule.cs +++ b/Source/Editor/Modules/WindowsModule.cs @@ -555,7 +555,7 @@ namespace FlaxEditor.Modules } base.OnSubmit(); - + var path = StringUtils.CombinePaths(Editor.LocalCachePath, "LayoutsCache", "Layout_" + name + ".xml"); Editor.Instance.Windows.SaveLayout(path); } From 86be1acd7a0e36dd6b52b3e7604388643a1b1d6b Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 07:45:08 -0600 Subject: [PATCH 14/30] Cached sate of anchor drop down closed. --- Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs index 602c6d0ee..1050139be 100644 --- a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs @@ -407,6 +407,7 @@ namespace FlaxEditor.CustomEditors.Dedicated public class UIControlControlEditor : GenericEditor { private Type _cachedType; + private bool _anchorDropDownClosed = true; /// public override void Initialize(LayoutElementsContainer layout) @@ -498,7 +499,8 @@ namespace FlaxEditor.CustomEditors.Dedicated ItemInfo maxItem = new ItemInfo(maxInfo); GroupElement ng = main.Group("Anchors", true); - ng.Panel.Close(false); + ng.Panel.IsClosed = _anchorDropDownClosed; + ng.Panel.IsClosedChanged += panel => _anchorDropDownClosed = panel.IsClosed; ng.Property("Min", minItem.GetValues(Values)); ng.Property("Max", maxItem.GetValues(Values)); } From af5f3cbd95e8c46762fac91cf8632f4b1de717ed Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 08:18:09 -0600 Subject: [PATCH 15/30] Return null if type is abstract but trying to be added as an actor or script --- Source/Engine/Level/Actor.cs | 15 +++++++++++++++ Source/Engine/Level/Actor.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/Source/Engine/Level/Actor.cs b/Source/Engine/Level/Actor.cs index 936d38565..cd774fca6 100644 --- a/Source/Engine/Level/Actor.cs +++ b/Source/Engine/Level/Actor.cs @@ -123,6 +123,9 @@ namespace FlaxEngine /// The child actor. public Actor AddChild(Type type) { + if (type.IsAbstract) + return null; + var result = (Actor)New(type); result.SetParent(this, false, false); return result; @@ -135,6 +138,9 @@ namespace FlaxEngine /// The child actor. public T AddChild() where T : Actor { + if (typeof(T).IsAbstract) + return null; + var result = New(); result.SetParent(this, false, false); return result; @@ -172,6 +178,9 @@ namespace FlaxEngine var result = GetChild(); if (result == null) { + if (typeof(T).IsAbstract) + return null; + result = New(); result.SetParent(this, false, false); } @@ -185,6 +194,9 @@ namespace FlaxEngine /// The created script instance, null otherwise. public Script AddScript(Type type) { + if (type.IsAbstract) + return null; + var script = (Script)New(type); script.Parent = this; return script; @@ -197,6 +209,9 @@ namespace FlaxEngine /// The created script instance, null otherwise. public T AddScript() where T : Script { + if (typeof(T).IsAbstract) + return null; + var script = New(); script.Parent = this; return script; diff --git a/Source/Engine/Level/Actor.h b/Source/Engine/Level/Actor.h index e9ad7793c..e108b0756 100644 --- a/Source/Engine/Level/Actor.h +++ b/Source/Engine/Level/Actor.h @@ -227,6 +227,10 @@ public: T* result = (T*)GetChild(T::GetStaticClass()); if (!result) { + const MClass* type = T::GetStaticClass(); + if (type->IsAbstract()) + return nullptr; + result = New(); result->SetParent(this, false, false); } From c3f23d13902581ad5ae7c8268660e72c1f453393 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 08:49:52 -0600 Subject: [PATCH 16/30] Added abstract check to spawning actor --- Source/Engine/Level/Level.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 98ad5a694..485b1a3b6 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -177,6 +177,12 @@ bool LevelImpl::spawnActor(Actor* actor, Actor* parent) return true; } + if (actor->GetType().ManagedClass->IsAbstract()) + { + Log::Exception(TEXT("Cannot spawn abstract actor type.")); + return true; + } + if (actor->Is()) { // Spawn scene From 66771775341b94d90080da6c70f4cc233d39032e Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 08:52:37 -0600 Subject: [PATCH 17/30] Removed variable MClass --- Source/Engine/Level/Actor.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Engine/Level/Actor.h b/Source/Engine/Level/Actor.h index e108b0756..ec52a8c74 100644 --- a/Source/Engine/Level/Actor.h +++ b/Source/Engine/Level/Actor.h @@ -227,8 +227,7 @@ public: T* result = (T*)GetChild(T::GetStaticClass()); if (!result) { - const MClass* type = T::GetStaticClass(); - if (type->IsAbstract()) + if (T::GetStaticClass()->IsAbstract()) return nullptr; result = New(); From 1b919b9fae086d8ef3df9e32a3935d81edb2afdf Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 20:45:51 -0600 Subject: [PATCH 18/30] Created new SearchBox class with button to clear the search. --- Source/Editor/GUI/Input/SearchBox.cs | 50 ++++++++++++++++++++++++ Source/Editor/Windows/ContentWindow.cs | 5 +-- Source/Editor/Windows/OutputLogWindow.cs | 4 +- Source/Editor/Windows/SceneTreeWindow.cs | 4 +- Source/Editor/Windows/ToolboxWindow.cs | 4 +- 5 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 Source/Editor/GUI/Input/SearchBox.cs diff --git a/Source/Editor/GUI/Input/SearchBox.cs b/Source/Editor/GUI/Input/SearchBox.cs new file mode 100644 index 000000000..485c7f99a --- /dev/null +++ b/Source/Editor/GUI/Input/SearchBox.cs @@ -0,0 +1,50 @@ +using FlaxEngine.GUI; + +namespace FlaxEditor.GUI.Input +{ + /// + /// Search box control which can gather text search input from the user. + /// + public class SearchBox : TextBox + { + /// + /// A button that clears the search bar. + /// + public Button ClearSearchButton { get; } + + /// + /// Init search box + /// + public SearchBox() + : this(false, 0, 0) + { + } + + /// + /// Init search box + /// + public SearchBox(bool isMultiline, float x, float y, float width = 120) + : base(isMultiline, x, y, width) + { + WatermarkText = "Search..."; + + ClearSearchButton = new Button + { + Parent = this, + Width = 15.0f, + Height = 14.0f, + AnchorPreset = AnchorPresets.TopRight, + Text = "X", + TooltipText = "Cancel Search.", + BackgroundColor = Style.Current.TextBoxBackground, + BorderColor = Style.Current.TextBoxBackground, + Visible = false, + }; + ClearSearchButton.LocalY += 2; + ClearSearchButton.LocalX -= 2; + ClearSearchButton.Clicked += Clear; + + TextChanged += () => ClearSearchButton.Visible = !string.IsNullOrEmpty(Text); + } + } +} diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs index 22808a1f1..703dc8c81 100644 --- a/Source/Editor/Windows/ContentWindow.cs +++ b/Source/Editor/Windows/ContentWindow.cs @@ -113,10 +113,9 @@ namespace FlaxEditor.Windows IsScrollable = false, Offsets = new Margin(0, 0, 0, 18 + 6), }; - _foldersSearchBox = new TextBox + _foldersSearchBox = new SearchBox { AnchorPreset = AnchorPresets.HorizontalStretchMiddle, - WatermarkText = "Search...", Parent = headerPanel, Bounds = new Rectangle(4, 4, headerPanel.Width - 8, 18), }; @@ -149,7 +148,7 @@ namespace FlaxEditor.Windows Parent = _split.Panel2, }; const float viewDropdownWidth = 50.0f; - _itemsSearchBox = new TextBox + _itemsSearchBox = new SearchBox { AnchorPreset = AnchorPresets.HorizontalStretchMiddle, WatermarkText = "Search...", diff --git a/Source/Editor/Windows/OutputLogWindow.cs b/Source/Editor/Windows/OutputLogWindow.cs index c9f3ac6e2..22989124f 100644 --- a/Source/Editor/Windows/OutputLogWindow.cs +++ b/Source/Editor/Windows/OutputLogWindow.cs @@ -7,6 +7,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Xml; using FlaxEditor.GUI.ContextMenu; +using FlaxEditor.GUI.Input; using FlaxEditor.Options; using FlaxEngine; using FlaxEngine.GUI; @@ -157,9 +158,8 @@ namespace FlaxEditor.Windows Parent = this, }; _viewDropdown.Clicked += OnViewButtonClicked; - _searchBox = new TextBox(false, _viewDropdown.Right + 2, 2, Width - _viewDropdown.Right - 2 - _scrollSize) + _searchBox = new SearchBox(false, _viewDropdown.Right + 2, 2, Width - _viewDropdown.Right - 2 - _scrollSize) { - WatermarkText = "Search...", Parent = this, }; _searchBox.TextChanged += Refresh; diff --git a/Source/Editor/Windows/SceneTreeWindow.cs b/Source/Editor/Windows/SceneTreeWindow.cs index 8fd6e33ee..28ab83ff5 100644 --- a/Source/Editor/Windows/SceneTreeWindow.cs +++ b/Source/Editor/Windows/SceneTreeWindow.cs @@ -6,6 +6,7 @@ using FlaxEditor.Gizmo; using FlaxEditor.Content; using FlaxEditor.GUI.Tree; using FlaxEditor.GUI.Drag; +using FlaxEditor.GUI.Input; using FlaxEditor.SceneGraph; using FlaxEditor.SceneGraph.GUI; using FlaxEditor.Scripting; @@ -49,10 +50,9 @@ namespace FlaxEditor.Windows IsScrollable = false, Offsets = new Margin(0, 0, 0, 18 + 6), }; - _searchBox = new TextBox + _searchBox = new SearchBox { AnchorPreset = AnchorPresets.HorizontalStretchMiddle, - WatermarkText = "Search...", Parent = headerPanel, Bounds = new Rectangle(4, 4, headerPanel.Width - 8, 18), }; diff --git a/Source/Editor/Windows/ToolboxWindow.cs b/Source/Editor/Windows/ToolboxWindow.cs index ff03d8e0d..6c1b3d9cc 100644 --- a/Source/Editor/Windows/ToolboxWindow.cs +++ b/Source/Editor/Windows/ToolboxWindow.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using FlaxEditor.GUI.Input; using FlaxEditor.GUI.Tabs; using FlaxEditor.GUI.Tree; using FlaxEditor.Scripting; @@ -130,10 +131,9 @@ namespace FlaxEditor.Windows }; _groupSearch = CreateGroupWithList(_actorGroups, "Search", 26); - _searchBox = new TextBox + _searchBox = new SearchBox { AnchorPreset = AnchorPresets.HorizontalStretchTop, - WatermarkText = "Search...", Parent = _groupSearch.Parent.Parent, Bounds = new Rectangle(4, 4, _actorGroups.Width - 8, 18), }; From 1c85b30e9fb3fa1aede43e2bfabb686ea131629f Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 20:53:47 -0600 Subject: [PATCH 19/30] Change color of button on hover. --- Source/Editor/GUI/Input/SearchBox.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Source/Editor/GUI/Input/SearchBox.cs b/Source/Editor/GUI/Input/SearchBox.cs index 485c7f99a..04ae0c2d5 100644 --- a/Source/Editor/GUI/Input/SearchBox.cs +++ b/Source/Editor/GUI/Input/SearchBox.cs @@ -1,3 +1,4 @@ +using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.GUI.Input @@ -11,6 +12,8 @@ namespace FlaxEditor.GUI.Input /// A button that clears the search bar. /// public Button ClearSearchButton { get; } + + private Color _defaultButtonTextColor; /// /// Init search box @@ -36,15 +39,28 @@ namespace FlaxEditor.GUI.Input AnchorPreset = AnchorPresets.TopRight, Text = "X", TooltipText = "Cancel Search.", - BackgroundColor = Style.Current.TextBoxBackground, - BorderColor = Style.Current.TextBoxBackground, + BackgroundColor = Color.Transparent, + BorderColor = Color.Transparent, + BackgroundColorHighlighted = Color.Transparent, + BorderColorHighlighted = Color.Transparent, + BackgroundColorSelected = Color.Transparent, + BorderColorSelected = Color.Transparent, Visible = false, }; ClearSearchButton.LocalY += 2; ClearSearchButton.LocalX -= 2; ClearSearchButton.Clicked += Clear; + _defaultButtonTextColor = ClearSearchButton.TextColor; TextChanged += () => ClearSearchButton.Visible = !string.IsNullOrEmpty(Text); } + + /// + public override void Update(float deltaTime) + { + base.Update(deltaTime); + + ClearSearchButton.TextColor = ClearSearchButton.IsMouseOver ? Style.Current.ForegroundGrey : _defaultButtonTextColor; + } } } From a468053f4674d256e1626bb17cb075f2bfe62351 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Dec 2022 21:09:34 -0600 Subject: [PATCH 20/30] Added hover begin and end event to button --- Source/Engine/UI/GUI/Common/Button.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Source/Engine/UI/GUI/Common/Button.cs b/Source/Engine/UI/GUI/Common/Button.cs index f9bc54655..190ba8eff 100644 --- a/Source/Engine/UI/GUI/Common/Button.cs +++ b/Source/Engine/UI/GUI/Common/Button.cs @@ -71,6 +71,16 @@ namespace FlaxEngine.GUI /// public event Action public Button ClearSearchButton { get; } - private Color _defaultButtonTextColor; - /// /// Init search box /// @@ -34,33 +32,25 @@ namespace FlaxEditor.GUI.Input ClearSearchButton = new Button { Parent = this, - Width = 15.0f, + Width = 14.0f, Height = 14.0f, AnchorPreset = AnchorPresets.TopRight, - Text = "X", + Text = "", TooltipText = "Cancel Search.", - BackgroundColor = Color.Transparent, + BackgroundColor = TextColor, BorderColor = Color.Transparent, - BackgroundColorHighlighted = Color.Transparent, + BackgroundColorHighlighted = Style.Current.ForegroundGrey, BorderColorHighlighted = Color.Transparent, - BackgroundColorSelected = Color.Transparent, + BackgroundColorSelected = Style.Current.ForegroundGrey, BorderColorSelected = Color.Transparent, + BackgroundBrush = new SpriteBrush(Editor.Instance.Icons.Cross12), Visible = false, }; ClearSearchButton.LocalY += 2; ClearSearchButton.LocalX -= 2; ClearSearchButton.Clicked += Clear; - _defaultButtonTextColor = ClearSearchButton.TextColor; TextChanged += () => ClearSearchButton.Visible = !string.IsNullOrEmpty(Text); } - - /// - public override void Update(float deltaTime) - { - base.Update(deltaTime); - - ClearSearchButton.TextColor = ClearSearchButton.IsMouseOver ? Style.Current.ForegroundGrey : _defaultButtonTextColor; - } } } From d7d7c1e98f26eff2d19952cb633c2d62a8047ac5 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 22 Dec 2022 12:44:34 -0600 Subject: [PATCH 24/30] Center the context menu that is spawned from clicking the add scripts button on an actor --- Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index 47147381e..68dca9883 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -72,7 +72,7 @@ namespace FlaxEditor.CustomEditors.Dedicated } cm.ItemClicked += item => AddScript((ScriptType)item.Tag); cm.SortItems(); - cm.Show(this, button.BottomLeft); + cm.Show(this, button.BottomLeft - new Float2((cm.Width - button.Width) / 2, 0)); } /// From cb6590e7ef77a9b03a5e29ea942179afa4f07f3a Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 27 Dec 2022 18:50:08 +0100 Subject: [PATCH 25/30] Format code --- Source/Engine/UI/GUI/Common/TextBoxBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index 0e9c34954..2999fe957 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -1047,7 +1047,7 @@ namespace FlaxEngine.GUI // Animate view offset _viewOffset = isDeltaSlow ? _targetViewOffset : Float2.Lerp(_viewOffset, _targetViewOffset, deltaTime * 20.0f); - + // Clicking outside of the text box will end text editing. Left will keep the value, right will restore original value if (_isEditing && EndEditOnClick) { From 9050377526d7aa67ce6c71a298a021c38c94007e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 27 Dec 2022 19:04:09 +0100 Subject: [PATCH 26/30] Fix imported shader source last char value to prevent strange diffs in Version Control Systems --- Content/Shaders/AtmospherePreCompute.flax | 4 ++-- Content/Shaders/BakeLightmap.flax | 4 ++-- Content/Shaders/BitonicSort.flax | 4 ++-- Content/Shaders/ColorGrading.flax | 4 ++-- Content/Shaders/DebugDraw.flax | 4 ++-- Content/Shaders/Editor/LightmapUVsDensity.flax | 4 ++-- Content/Shaders/Editor/MaterialComplexity.flax | 4 ++-- Content/Shaders/Editor/QuadOverdraw.flax | 4 ++-- Content/Shaders/Editor/VertexColors.flax | 4 ++-- Content/Shaders/EyeAdaptation.flax | 4 ++-- Content/Shaders/FXAA.flax | 4 ++-- Content/Shaders/Fog.flax | 4 ++-- Content/Shaders/Forward.flax | 4 ++-- Content/Shaders/GBuffer.flax | 4 ++-- Content/Shaders/GI/DDGI.flax | 4 ++-- Content/Shaders/GI/GlobalSurfaceAtlas.flax | 4 ++-- Content/Shaders/GPUParticlesSorting.flax | 4 ++-- Content/Shaders/GUI.flax | 4 ++-- Content/Shaders/GlobalSignDistanceField.flax | 4 ++-- Content/Shaders/Histogram.flax | 4 ++-- Content/Shaders/Lights.flax | 4 ++-- Content/Shaders/MotionBlur.flax | 4 ++-- Content/Shaders/MultiScaler.flax | 4 ++-- Content/Shaders/PostProcessing.flax | 2 +- Content/Shaders/ProbesFilter.flax | 4 ++-- Content/Shaders/Quad.flax | 4 ++-- Content/Shaders/Reflections.flax | 4 ++-- Content/Shaders/SMAA.flax | 4 ++-- Content/Shaders/SSAO.flax | 4 ++-- Content/Shaders/Shadows.flax | 4 ++-- Content/Shaders/Sky.flax | 4 ++-- Content/Shaders/TAA.flax | 4 ++-- Content/Shaders/VolumetricFog.flax | 4 ++-- Source/Engine/ContentImporters/ImportShader.cpp | 6 ++++-- 34 files changed, 69 insertions(+), 67 deletions(-) diff --git a/Content/Shaders/AtmospherePreCompute.flax b/Content/Shaders/AtmospherePreCompute.flax index 527275f61..20491857f 100644 --- a/Content/Shaders/AtmospherePreCompute.flax +++ b/Content/Shaders/AtmospherePreCompute.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f06c5ac062366b3ef86c355c6cc8b3a984b8eb9bc027ffc0874bc51dbaef4b3e -size 11720 +oid sha256:68e1592216496fd6749ac4538dd2d549c39813d17ec3114514889100782007a6 +size 11418 diff --git a/Content/Shaders/BakeLightmap.flax b/Content/Shaders/BakeLightmap.flax index ef3e02163..03af565fc 100644 --- a/Content/Shaders/BakeLightmap.flax +++ b/Content/Shaders/BakeLightmap.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:18eb0ec2642a8f87ee3d4dbe7af8771b0f79f983637aee1a9e5baebce435976b -size 16284 +oid sha256:0cf36b83e0bdbbf47b2d88b39d18ae3e1ac85246d46a05f1e6c58f89f4abc105 +size 15794 diff --git a/Content/Shaders/BitonicSort.flax b/Content/Shaders/BitonicSort.flax index 980b664f3..c49c2b73f 100644 --- a/Content/Shaders/BitonicSort.flax +++ b/Content/Shaders/BitonicSort.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8d1a797f813d3af8a98bcb8110981ea8c033324e94fb6413615c811b5c5bfd7 -size 6808 +oid sha256:fbecce17a3a0dba01aa1e8d537041c27339a5f171c04cdeb83c68765fd6ac652 +size 6548 diff --git a/Content/Shaders/ColorGrading.flax b/Content/Shaders/ColorGrading.flax index a7a466d5e..d36626d2c 100644 --- a/Content/Shaders/ColorGrading.flax +++ b/Content/Shaders/ColorGrading.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2bda196600fbc9d6f362e85471399331941272cdd92f9888bdcf7a1b8b04ada7 -size 10925 +oid sha256:1841743cd96e3efba196cba05678658463c1c1fcd6b06ac7703e87bb2850d641 +size 10618 diff --git a/Content/Shaders/DebugDraw.flax b/Content/Shaders/DebugDraw.flax index ea3807153..4e824c30c 100644 --- a/Content/Shaders/DebugDraw.flax +++ b/Content/Shaders/DebugDraw.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b25f3b058f2bca838a661e46e90931f347b7e9984626e2b0112270e0f3e4fa47 -size 2115 +oid sha256:9fc85c05a9203d53f03db74f4d04a39e651e34d310de119f06279a1ce0299bcc +size 2053 diff --git a/Content/Shaders/Editor/LightmapUVsDensity.flax b/Content/Shaders/Editor/LightmapUVsDensity.flax index c817058f7..145040bbe 100644 --- a/Content/Shaders/Editor/LightmapUVsDensity.flax +++ b/Content/Shaders/Editor/LightmapUVsDensity.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f23c12db6332866a9ac91d576575448af02e1a4e0fff20529f32911970de72e5 -size 4509 +oid sha256:7df3b4a9464524bb0354ab9f4e7dc6256af56d3f13f3b347a946742ecbf4c1d1 +size 4391 diff --git a/Content/Shaders/Editor/MaterialComplexity.flax b/Content/Shaders/Editor/MaterialComplexity.flax index 3c8770e50..490f72a38 100644 --- a/Content/Shaders/Editor/MaterialComplexity.flax +++ b/Content/Shaders/Editor/MaterialComplexity.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a891d1a83c1c99f17f43f75fbe09ffe5df99bd52f150875771f70ee67f2f52e0 -size 1336 +oid sha256:446446a3e8e3e72793cfdf3cf76d705917a61814fd1f40cb60827ad3c002b21d +size 1303 diff --git a/Content/Shaders/Editor/QuadOverdraw.flax b/Content/Shaders/Editor/QuadOverdraw.flax index 7eba0013e..7e6bdfb9a 100644 --- a/Content/Shaders/Editor/QuadOverdraw.flax +++ b/Content/Shaders/Editor/QuadOverdraw.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6a25d8d4db381507c4c2a33d794b7eec8994ae8d281478e057232adf788224db -size 1448 +oid sha256:50ab3a3734b0cd349aadd61c404739b48146cc1f326412dc5e4604da3fe03dc6 +size 1414 diff --git a/Content/Shaders/Editor/VertexColors.flax b/Content/Shaders/Editor/VertexColors.flax index 2d862a36d..92b00ddac 100644 --- a/Content/Shaders/Editor/VertexColors.flax +++ b/Content/Shaders/Editor/VertexColors.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf47e691ee17a3bf17948cc365a327685e5298568a993fec47a920934d1a86fb -size 2102 +oid sha256:66e418d872f95996806ff866e4786d8d22e504c5209f4b7b8e140c29a77ce93f +size 2053 diff --git a/Content/Shaders/EyeAdaptation.flax b/Content/Shaders/EyeAdaptation.flax index a81177004..1f52e67da 100644 --- a/Content/Shaders/EyeAdaptation.flax +++ b/Content/Shaders/EyeAdaptation.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:00e1a4e4fc4153cb83b090169b9d600686e9bf6a6565914de46d55b1b945025e -size 4610 +oid sha256:0f1a19e5a918049d093d4536e540d4ffb779c2b0b4524a277b1503afbecea79b +size 4453 diff --git a/Content/Shaders/FXAA.flax b/Content/Shaders/FXAA.flax index 7f8e18d8a..4b6bdfe25 100644 --- a/Content/Shaders/FXAA.flax +++ b/Content/Shaders/FXAA.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8a6d89039e93acb1ac658b4b63ab9baa21c7777d948f14732571529a8cfe519 -size 25139 +oid sha256:142d7ede22ed99b095dd07fcce722b7668554911e57a1b41e17842e0383a8d24 +size 24484 diff --git a/Content/Shaders/Fog.flax b/Content/Shaders/Fog.flax index 37410e1af..f19396bd8 100644 --- a/Content/Shaders/Fog.flax +++ b/Content/Shaders/Fog.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:58dab7514164b3cf941636dbead945da12b13dc485dbec997227711c2e67e58f -size 2878 +oid sha256:4703c3f843dec8248938344d04778d4705eb61247610906af9ec22b4d42f1eae +size 2795 diff --git a/Content/Shaders/Forward.flax b/Content/Shaders/Forward.flax index b922a3b16..393603913 100644 --- a/Content/Shaders/Forward.flax +++ b/Content/Shaders/Forward.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d18f21b456efe8c9f5c38c35aa0ce6e13552966aa48445cb33826837bea2819 -size 1221 +oid sha256:0c76097d4a231be004658cdbbeae05058ff5408cb003d38ac5ef6ca927c04484 +size 1197 diff --git a/Content/Shaders/GBuffer.flax b/Content/Shaders/GBuffer.flax index 78308a4bb..a22a76fb1 100644 --- a/Content/Shaders/GBuffer.flax +++ b/Content/Shaders/GBuffer.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:180768a9304d7bc12c8fb487a39a9991575d55cfaf5fe3135a4985098340d042 -size 2845 +oid sha256:255a153284978cff6e0285f40355ba8695679f97215c2efe39082ae7422f7d8f +size 2774 diff --git a/Content/Shaders/GI/DDGI.flax b/Content/Shaders/GI/DDGI.flax index 9e45adb50..6b0a66187 100644 --- a/Content/Shaders/GI/DDGI.flax +++ b/Content/Shaders/GI/DDGI.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3816b8fdd088656e385f46832c2719c77d386d12ec14ac3d0ac6df017b2c7e4 -size 23668 +oid sha256:e8a1f629462b91a6e520bff1c52e6144e157aa6c0b64508785f867e38f6fa051 +size 23092 diff --git a/Content/Shaders/GI/GlobalSurfaceAtlas.flax b/Content/Shaders/GI/GlobalSurfaceAtlas.flax index 3450fa8c6..ba31eea60 100644 --- a/Content/Shaders/GI/GlobalSurfaceAtlas.flax +++ b/Content/Shaders/GI/GlobalSurfaceAtlas.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c342070b981a0dbf335276434ce59f345861e8f9e7d4f2cf07ae2016542642e8 -size 12954 +oid sha256:8247f56712db3e47150b4f75416ff8baee778f43f4825d9c802e6a95e57c802e +size 12614 diff --git a/Content/Shaders/GPUParticlesSorting.flax b/Content/Shaders/GPUParticlesSorting.flax index 6b2a31931..08b6a4d78 100644 --- a/Content/Shaders/GPUParticlesSorting.flax +++ b/Content/Shaders/GPUParticlesSorting.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f5d131298c4f138278a5339e7d1a2dd8263c4afa4e27f3fa345ebda21989ea15 -size 2726 +oid sha256:fcfaa7567daaeac0ba0e3d135db52c674b7f17f8bace31b8a4f75ef8a24b21a7 +size 2639 diff --git a/Content/Shaders/GUI.flax b/Content/Shaders/GUI.flax index a6e231bd4..18f16aa34 100644 --- a/Content/Shaders/GUI.flax +++ b/Content/Shaders/GUI.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5512b7584d43b571a9a30cec4b5c160cebd8924f4305c8de0ae439a664d143a7 -size 5111 +oid sha256:b4b204acc4b60f93a490e3178a853a7ae059ac5e6e1e4ee4dc7ebc0b8771413c +size 4943 diff --git a/Content/Shaders/GlobalSignDistanceField.flax b/Content/Shaders/GlobalSignDistanceField.flax index ec1d39d8f..50ca8c78d 100644 --- a/Content/Shaders/GlobalSignDistanceField.flax +++ b/Content/Shaders/GlobalSignDistanceField.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e14a67948d93abb8ef6124b39fdb7b1bc682e1fdf5341ce6255eefe2606a2dfc -size 11787 +oid sha256:dd3a18c7831eba6b531d82528733e2f7ab58a02b076441a974e2b999b26da616 +size 11498 diff --git a/Content/Shaders/Histogram.flax b/Content/Shaders/Histogram.flax index 4c5967874..9df23aad7 100644 --- a/Content/Shaders/Histogram.flax +++ b/Content/Shaders/Histogram.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92a990f5286c449d3274bd90766d022d03aeaa43ecb93c0589d391828842b16b -size 2609 +oid sha256:761d2f9eea984a5cb46ba7a83f3f49c9cb7452a05420faecc70c55c3b56cfa45 +size 2532 diff --git a/Content/Shaders/Lights.flax b/Content/Shaders/Lights.flax index 612a634ab..c76a501fe 100644 --- a/Content/Shaders/Lights.flax +++ b/Content/Shaders/Lights.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86919e780799e02ebae7ce13f876925219e5b03234c7fdae3b610623d8bc81b8 -size 5299 +oid sha256:37b0d62eff4ed0ea2cd48c351e0f8e0ed98f1aac3b272fd0849227eda6cb6856 +size 5122 diff --git a/Content/Shaders/MotionBlur.flax b/Content/Shaders/MotionBlur.flax index 5dac7c3eb..a2c201bc6 100644 --- a/Content/Shaders/MotionBlur.flax +++ b/Content/Shaders/MotionBlur.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82109c08b00acfcd46818e35b05732ccdfd7f453bf6b3cea5b450603b2d1baa8 -size 9685 +oid sha256:7b468b522e29e3464a2e310334e011d793a10ebc20092e5bedd76d33ed608054 +size 9428 diff --git a/Content/Shaders/MultiScaler.flax b/Content/Shaders/MultiScaler.flax index 3b71c27aa..8e5790610 100644 --- a/Content/Shaders/MultiScaler.flax +++ b/Content/Shaders/MultiScaler.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:737c91950c010adb13cee6669f77d95737aa671f17d71fb6bee8ca5c3c627e27 -size 7206 +oid sha256:a0412a83a79884e77e09f5debfedf45b5856756b2e2298edef196c9434d4bf19 +size 7006 diff --git a/Content/Shaders/PostProcessing.flax b/Content/Shaders/PostProcessing.flax index a771d9882..bba56658c 100644 --- a/Content/Shaders/PostProcessing.flax +++ b/Content/Shaders/PostProcessing.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f72955c7285fb135c80ba73ac0a1e62463394c86979bdad1e0a789158ad7728c +oid sha256:5f3c7923418f5872dc4bbfb08c39327f46d357c62827711da5e4e50332f26bc0 size 16522 diff --git a/Content/Shaders/ProbesFilter.flax b/Content/Shaders/ProbesFilter.flax index 760a91040..59ec47ef3 100644 --- a/Content/Shaders/ProbesFilter.flax +++ b/Content/Shaders/ProbesFilter.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3765117ee658c768184f9af0c7aa7799c575cfc68f5ce0d824e211570d887135 -size 2108 +oid sha256:bfc735d6646e35594c1441298a4718ea8cffe4517762f65982dabed50af8215e +size 2030 diff --git a/Content/Shaders/Quad.flax b/Content/Shaders/Quad.flax index 485a11fbf..6a6897dfb 100644 --- a/Content/Shaders/Quad.flax +++ b/Content/Shaders/Quad.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04c502c31eaceba9738444cd3a9419474ebfbfd42e7efa39b7cc5778a19e267c -size 2310 +oid sha256:f9225e31ac76e66a2f4c09f70af326229c563155dc0c34eccb9f243f80c07908 +size 2242 diff --git a/Content/Shaders/Reflections.flax b/Content/Shaders/Reflections.flax index 9cf210fec..e594c5727 100644 --- a/Content/Shaders/Reflections.flax +++ b/Content/Shaders/Reflections.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b651d798d3e2a36d3afe960e087f061cf53cac826ac48fff17eebba7293ed46f -size 3288 +oid sha256:772f6b54b8ab6f6f054935bd9593616896c9e7b56249f0b084d85858a50f4f00 +size 3193 diff --git a/Content/Shaders/SMAA.flax b/Content/Shaders/SMAA.flax index e315c9ef5..605524a5d 100644 --- a/Content/Shaders/SMAA.flax +++ b/Content/Shaders/SMAA.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c53b7a4929736b7f603f47475e2d668100e52f53c6ba176397b06b2ebc0f050d -size 47673 +oid sha256:8071432958f2e295bc22f7058970c18135c001a4f705f20c4c99385d8acf1daa +size 46449 diff --git a/Content/Shaders/SSAO.flax b/Content/Shaders/SSAO.flax index e4a48b1f8..232e72a8c 100644 --- a/Content/Shaders/SSAO.flax +++ b/Content/Shaders/SSAO.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8ed05e81b6c7822c725976551f75960e770f3a32fdb23ab49f60e32e366ae15 -size 37614 +oid sha256:b6747405d3ef0698c9b84ceebfc1ba2fb3d255ffcec10bd5e5fb86b1ff632187 +size 36841 diff --git a/Content/Shaders/Shadows.flax b/Content/Shaders/Shadows.flax index 8c45d669a..9c5e5b142 100644 --- a/Content/Shaders/Shadows.flax +++ b/Content/Shaders/Shadows.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61ea612b8ee409c1de4bb4ff4455f31bf32ed756a6612d9c5a9a152ff6b034d0 -size 7847 +oid sha256:b823730a83d35980f63d3adb7d23c8ee4585826c6e6dd09555dd97aa77dad269 +size 7654 diff --git a/Content/Shaders/Sky.flax b/Content/Shaders/Sky.flax index 2ff583cfc..e7bc71130 100644 --- a/Content/Shaders/Sky.flax +++ b/Content/Shaders/Sky.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ad54e191498e2c0067b32b041cfb351fa18f928d36372ae259a8b64a9dfb311 -size 3572 +oid sha256:0791b4d9504a0284ecb7f45b8339abab12a00396c2b4063ee4320ac15d92bc9b +size 3473 diff --git a/Content/Shaders/TAA.flax b/Content/Shaders/TAA.flax index 768ffd750..65d5a2fae 100644 --- a/Content/Shaders/TAA.flax +++ b/Content/Shaders/TAA.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e15b9c0eed4678e45c681a789159fff3ff13d5f0cbd0a4880df1f6c6f68d9812 -size 3371 +oid sha256:f8103f574606ee8a27a3e1ac9d2bc796c5110711bb12246e1ff20e67d8844591 +size 3284 diff --git a/Content/Shaders/VolumetricFog.flax b/Content/Shaders/VolumetricFog.flax index 997b1ab8f..660b70338 100644 --- a/Content/Shaders/VolumetricFog.flax +++ b/Content/Shaders/VolumetricFog.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fd020a2c82854ed852a2bb7682dc69b7abe31f139ecff485082d21d9188993d -size 14257 +oid sha256:819c97f3b6d28209f0fe3f09a0b89af88e24cff5bf57658e696b586f1ec040ed +size 13843 diff --git a/Source/Engine/ContentImporters/ImportShader.cpp b/Source/Engine/ContentImporters/ImportShader.cpp index fe1253644..c6394c91b 100644 --- a/Source/Engine/ContentImporters/ImportShader.cpp +++ b/Source/Engine/ContentImporters/ImportShader.cpp @@ -32,12 +32,14 @@ CreateAssetResult ImportShader::Import(CreateAssetContext& context) LOG(Warning, "Empty shader source file."); return CreateAssetResult::Error; } - context.Data.Header.Chunks[SourceCodeChunk]->Data.Allocate(sourceCodeSize + 1); - const auto sourceCode = context.Data.Header.Chunks[SourceCodeChunk]->Get(); + const auto& sourceCodeChunk = context.Data.Header.Chunks[SourceCodeChunk]; + sourceCodeChunk->Data.Allocate(sourceCodeSize + 1); + const auto sourceCode = sourceCodeChunk->Get(); Platform::MemoryCopy(sourceCode, sourceCodeText.Get(), sourceCodeSize); // Encrypt source code Encryption::EncryptBytes(sourceCode, sourceCodeSize); + sourceCode[sourceCodeSize] = 0; // Set Custom Data with Header ShaderStorage::Header20 shaderHeader; From 25028e1d67537356df08fef1081157bc23c6c682 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 27 Dec 2022 19:07:24 +0100 Subject: [PATCH 27/30] Improve renaming ContentTreeNode as in #849 --- Source/Editor/Content/Tree/ContentTreeNode.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/Editor/Content/Tree/ContentTreeNode.cs b/Source/Editor/Content/Tree/ContentTreeNode.cs index 1d70a8252..27e7cf76c 100644 --- a/Source/Editor/Content/Tree/ContentTreeNode.cs +++ b/Source/Editor/Content/Tree/ContentTreeNode.cs @@ -95,19 +95,17 @@ namespace FlaxEditor.Content { if (!_folder.CanRename) return; - Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(false); + // Start renaming the folder - var dialog = RenamePopup.Show(this, HeaderRect, _folder.ShortName, false); + Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(false); + var dialog = RenamePopup.Show(this, TextRect, _folder.ShortName, false); dialog.Tag = _folder; dialog.Renamed += popup => { Editor.Instance.Windows.ContentWin.Rename((ContentFolder)popup.Tag, popup.Text); Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true); }; - dialog.Closed += popup => - { - Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true); - }; + dialog.Closed += popup => { Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true); }; } /// From 5bccd010cb8f3958307cdf45cf85eda8fa2e0b08 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 27 Dec 2022 19:22:17 +0100 Subject: [PATCH 28/30] Code style fix --- Source/Editor/Modules/UIModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/Modules/UIModule.cs b/Source/Editor/Modules/UIModule.cs index 80f0bb97c..a0b9ca19b 100644 --- a/Source/Editor/Modules/UIModule.cs +++ b/Source/Editor/Modules/UIModule.cs @@ -738,7 +738,7 @@ namespace FlaxEditor.Modules return; // Find layout to use - var searchFolder = StringUtils.CombinePaths(Editor.LocalCachePath, "LayoutsCache") ; + var searchFolder = StringUtils.CombinePaths(Editor.LocalCachePath, "LayoutsCache"); if (!Directory.Exists(searchFolder)) Directory.CreateDirectory(searchFolder); var files = Directory.GetFiles(searchFolder, "Layout_*.xml", SearchOption.TopDirectoryOnly); From 6b0ead59d2774c2f484d0fdb18880149d5bd04b5 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 27 Dec 2022 20:24:01 +0100 Subject: [PATCH 29/30] Fix code style --- Source/Engine/UI/GUI/Common/Button.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/Engine/UI/GUI/Common/Button.cs b/Source/Engine/UI/GUI/Common/Button.cs index 190ba8eff..30ff25aa1 100644 --- a/Source/Engine/UI/GUI/Common/Button.cs +++ b/Source/Engine/UI/GUI/Common/Button.cs @@ -75,7 +75,7 @@ namespace FlaxEngine.GUI /// Event fired when users mouse enters the control. /// public event Action HoverBegin; - + /// /// Event fired when users mouse leaves the control. /// @@ -246,6 +246,7 @@ namespace FlaxEngine.GUI public override void OnMouseEnter(Float2 location) { base.OnMouseEnter(location); + HoverBegin?.Invoke(); } @@ -256,7 +257,7 @@ namespace FlaxEngine.GUI { OnPressEnd(); } - + HoverEnd?.Invoke(); base.OnMouseLeave(); From 3a393b6825df00936c46ee41fa8fd423f372663c Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 28 Dec 2022 16:28:50 +0100 Subject: [PATCH 30/30] Fix crash on Clang-platforms when calling base method from overriden scripting method (C# or Visual Script) --- Source/Engine/Scripting/InternalCalls.h | 24 ++++++++ .../Bindings/BindingsGenerator.Cpp.cs | 55 ++++++++++++++----- .../Build/Plugins/VisualScriptingPlugin.cs | 14 +---- 3 files changed, 66 insertions(+), 27 deletions(-) diff --git a/Source/Engine/Scripting/InternalCalls.h b/Source/Engine/Scripting/InternalCalls.h index 8e7ef9d27..a7b7c2ebd 100644 --- a/Source/Engine/Scripting/InternalCalls.h +++ b/Source/Engine/Scripting/InternalCalls.h @@ -7,6 +7,30 @@ #include "ScriptingType.h" #include "Types.h" +#if defined(__clang__) +// Helper utility to override vtable entry with automatic restore +// See BindingsGenerator.Cpp.cs that generates virtuall method wrappers for scripting to properly call overriden base method +struct FLAXENGINE_API VTableFunctionInjector +{ + void** VTableAddr; + void* OriginalValue; + + VTableFunctionInjector(void* object, void* originalFunc, void* func) + { + void** vtable = *(void***)object; + const int32 vtableIndex = GetVTableIndex(vtable, 200, originalFunc); + VTableAddr = vtable + vtableIndex; + OriginalValue = *VTableAddr; + *VTableAddr = func; + } + + ~VTableFunctionInjector() + { + *VTableAddr = OriginalValue; + } +}; +#endif + #if USE_MONO extern "C" FLAXENGINE_API void mono_add_internal_call(const char* name, const void* method); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 921043e1d..e57449f40 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -236,6 +236,41 @@ namespace Flax.Build.Bindings return $"({typeInfo}){value}"; } + public static void GenerateCppVirtualWrapperCallBaseMethod(BuildData buildData, StringBuilder contents, VirtualClassInfo classInfo, FunctionInfo functionInfo, string scriptVTableBase, string scriptVTableOffset) + { + contents.AppendLine(" // Prevent stack overflow by calling native base method"); + if (buildData.Toolchain is Platforms.UnixToolchain) + { + // Clang compiler + // TODO: secure VTableFunctionInjector with mutex (even at cost of performance) + contents.AppendLine($" {functionInfo.UniqueName}_Signature funcPtr = &{classInfo.NativeName}::{functionInfo.Name};"); + contents.AppendLine($" VTableFunctionInjector vtableInjector(object, *(void**)&funcPtr, {scriptVTableBase}[{scriptVTableOffset} + 2]); // TODO: this is not thread-safe"); + if (classInfo is InterfaceInfo) + { + contents.Append($" return (({classInfo.NativeName}*)(void*)object)->{functionInfo.Name}("); + } + else + { + contents.Append(" return (object->*funcPtr)("); + } + } + else + { + // MSVC or other compiler + contents.Append($" return (this->**({functionInfo.UniqueName}_Internal_Signature*)&{scriptVTableBase}[{scriptVTableOffset} + 2])("); + } + bool separator = false; + for (var i = 0; i < functionInfo.Parameters.Count; i++) + { + var parameterInfo = functionInfo.Parameters[i]; + if (separator) + contents.Append(", "); + separator = true; + contents.Append(parameterInfo.Name); + } + contents.AppendLine(");"); + } + private static string GenerateCppGetNativeClass(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, FunctionInfo functionInfo) { // Optimal path for in-build types @@ -1190,19 +1225,7 @@ namespace Flax.Build.Bindings contents.AppendLine(" if (WrapperCallInstance == object)"); contents.AppendLine(" {"); - contents.AppendLine(" // Prevent stack overflow by calling native base method"); - contents.AppendLine(" const auto scriptVTableBase = managedTypePtr->Script.ScriptVTableBase;"); - contents.Append($" return (this->**({functionInfo.UniqueName}_Internal_Signature*)&scriptVTableBase[{scriptVTableOffset} + 2])("); - separator = false; - for (var i = 0; i < functionInfo.Parameters.Count; i++) - { - var parameterInfo = functionInfo.Parameters[i]; - if (separator) - contents.Append(", "); - separator = true; - contents.Append(parameterInfo.Name); - } - contents.AppendLine(");"); + GenerateCppVirtualWrapperCallBaseMethod(buildData, contents, classInfo, functionInfo, "managedTypePtr->Script.ScriptVTableBase", scriptVTableOffset); contents.AppendLine(" }"); contents.AppendLine(" auto scriptVTable = (MMethod**)managedTypePtr->Script.ScriptVTable;"); contents.AppendLine($" ASSERT(scriptVTable && scriptVTable[{scriptVTableOffset}]);"); @@ -1311,7 +1334,11 @@ namespace Flax.Build.Bindings } var t = functionInfo.IsConst ? " const" : string.Empty; contents.AppendLine($" typedef {functionInfo.ReturnType} ({classInfo.NativeName}::*{functionInfo.UniqueName}_Signature)({thunkParams}){t};"); - contents.AppendLine($" typedef {functionInfo.ReturnType} ({classInfo.NativeName}Internal::*{functionInfo.UniqueName}_Internal_Signature)({thunkParams}){t};"); + if (!(buildData.Toolchain is Platforms.UnixToolchain)) + { + // MSVC or other compiler + contents.AppendLine($" typedef {functionInfo.ReturnType} ({classInfo.NativeName}Internal::*{functionInfo.UniqueName}_Internal_Signature)({thunkParams}){t};"); + } } contents.AppendLine(""); diff --git a/Source/Tools/Flax.Build/Build/Plugins/VisualScriptingPlugin.cs b/Source/Tools/Flax.Build/Build/Plugins/VisualScriptingPlugin.cs index 603b66c9f..1fa8ed4f0 100644 --- a/Source/Tools/Flax.Build/Build/Plugins/VisualScriptingPlugin.cs +++ b/Source/Tools/Flax.Build/Build/Plugins/VisualScriptingPlugin.cs @@ -67,19 +67,7 @@ namespace Flax.Build.Plugins contents.AppendLine(" static THREADLOCAL void* WrapperCallInstance = nullptr;"); contents.AppendLine(" if (WrapperCallInstance == object)"); contents.AppendLine(" {"); - contents.AppendLine(" // Prevent stack overflow by calling base method"); - contents.AppendLine(" const auto scriptVTableBase = object->GetType().Script.ScriptVTableBase;"); - contents.Append($" return (this->**({functionInfo.UniqueName}_Internal_Signature*)&scriptVTableBase[{scriptVTableOffset} + 2])("); - separator = false; - for (var i = 0; i < functionInfo.Parameters.Count; i++) - { - var parameterInfo = functionInfo.Parameters[i]; - if (separator) - contents.Append(", "); - separator = true; - contents.Append(parameterInfo.Name); - } - contents.AppendLine(");"); + BindingsGenerator.GenerateCppVirtualWrapperCallBaseMethod(buildData, contents, classInfo, functionInfo, "object->GetType().Script.ScriptVTableBase", scriptVTableOffset); contents.AppendLine(" }"); contents.AppendLine(" auto scriptVTable = (VisualScript::Method**)object->GetType().Script.ScriptVTable;"); contents.AppendLine($" ASSERT(scriptVTable && scriptVTable[{scriptVTableOffset}]);");