From ffddbb455f36c65af0bd3a7f9662fd636265340f Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 9 Jul 2024 11:57:41 +0200 Subject: [PATCH 1/2] Add Scripting events to C++ api similar to C# ones --- Source/Engine/Scripting/Scripting.cpp | 10 +++++++-- Source/Engine/Scripting/Scripting.h | 30 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 67806a2ee..e5e5d1543 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -156,6 +156,12 @@ Action Scripting::ScriptsLoaded; Action Scripting::ScriptsUnload; Action Scripting::ScriptsReloading; Action Scripting::ScriptsReloaded; +Action Scripting::Update; +Action Scripting::LateUpdate; +Action Scripting::FixedUpdate; +Action Scripting::LateFixedUpdate; +Action Scripting::Draw; +Action Scripting::Exit; ThreadLocal Scripting::ObjectsLookupIdMapping; ScriptingService ScriptingServiceInstance; @@ -205,9 +211,9 @@ bool ScriptingService::Init() } #if COMPILE_WITHOUT_CSHARP -#define INVOKE_EVENT(name) +#define INVOKE_EVENT(name) Scripting::name(); #else -#define INVOKE_EVENT(name) \ +#define INVOKE_EVENT(name) Scripting::name(); \ if (!_isEngineAssemblyLoaded) return; \ if (_method_##name == nullptr) \ { \ diff --git a/Source/Engine/Scripting/Scripting.h b/Source/Engine/Scripting/Scripting.h index dad5a02fb..1a616ed79 100644 --- a/Source/Engine/Scripting/Scripting.h +++ b/Source/Engine/Scripting/Scripting.h @@ -44,6 +44,36 @@ public: /// static Delegate<> ScriptsReloaded; +public: + /// + /// Occurs on scripting update. + /// + static Delegate<> Update; + + /// + /// Occurs on scripting late update. + /// + static Delegate<> LateUpdate; + + /// + /// Occurs on scripting fixed update. + /// + static Delegate<> FixedUpdate; + + /// + /// Occurs on scripting late fixed update. + /// + static Delegate<> LateFixedUpdate; + + /// + /// Occurs on scripting draw update. Called during frame rendering and can be used to invoke custom rendering with GPUDevice. + /// + static Delegate<> Draw; + + /// + /// Occurs when scripting engine is disposing. Engine is during closing and some services may be unavailable (eg. loading scenes). This may be called after the engine fatal error event. + /// + static Delegate<> Exit; public: /// From 70912e1d564d91ab742ba29b9c1e0a61483f3630 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 9 Jul 2024 11:57:59 +0200 Subject: [PATCH 2/2] Add support for using InputAction editor on string variable --- .../CustomEditors/Editors/InputEditor.cs | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/Source/Editor/CustomEditors/Editors/InputEditor.cs b/Source/Editor/CustomEditors/Editors/InputEditor.cs index 5662aea0c..f73fe19f8 100644 --- a/Source/Editor/CustomEditors/Editors/InputEditor.cs +++ b/Source/Editor/CustomEditors/Editors/InputEditor.cs @@ -33,11 +33,25 @@ namespace FlaxEditor.CustomEditors.Editors names.Add(mapping.Name); } _comboBox.Items = names; - if (Values[0] is InputEvent inputEvent && names.Contains(inputEvent.Name)) + var prev = GetValue(); + if (prev is InputEvent inputEvent && names.Contains(inputEvent.Name)) _comboBox.SelectedItem = inputEvent.Name; + else if (prev is string name && names.Contains(name)) + _comboBox.SelectedItem = name; _comboBox.SelectedIndexChanged += OnSelectedIndexChanged; } + private object GetValue() + { + if (Values[0] is InputEvent inputEvent) + return inputEvent; + if (Values[0] is string str) + return str; + if (Values.Type.Type == typeof(string)) + return string.Empty; + return null; + } + private void OnSetupContextMenu(PropertyNameLabel label, ContextMenu menu, CustomEditor linkedEditor) { var button = menu.AddButton("Set to null"); @@ -46,7 +60,16 @@ namespace FlaxEditor.CustomEditors.Editors private void OnSelectedIndexChanged(ComboBox comboBox) { - SetValue(comboBox.SelectedItem == null ? null : new InputEvent(comboBox.SelectedItem)); + object value = null; + if (comboBox.SelectedItem != null) + { + var prev = GetValue(); + if (prev is InputEvent) + value = new InputEvent(comboBox.SelectedItem); + else if (prev is string) + value = comboBox.SelectedItem; + } + SetValue(value); } /// @@ -59,8 +82,11 @@ namespace FlaxEditor.CustomEditors.Editors } else { - if (Values[0] is InputEvent inputEvent && _comboBox.Items.Contains(inputEvent.Name)) + var prev = GetValue(); + if (prev is InputEvent inputEvent && _comboBox.Items.Contains(inputEvent.Name)) _comboBox.SelectedItem = inputEvent.Name; + else if (prev is string name && _comboBox.Items.Contains(name)) + _comboBox.SelectedItem = name; else _comboBox.SelectedItem = null; }