diff --git a/include/RE/B/BlurEvent.h b/include/RE/B/BlurEvent.h new file mode 100644 index 00000000..9bfbc712 --- /dev/null +++ b/include/RE/B/BlurEvent.h @@ -0,0 +1,25 @@ +#pragma once + +#include "RE/B/BSTEvent.h" + +namespace RE +{ + struct BlurEvent + { + public: + enum class Type : std::uint32_t + { + kIncrement = 0, + kDecrement = 1 + }; + + [[nodiscard]] static BSTEventSource* GetEventSource() + { + static REL::Relocation*> source{ ID::BlurEvent::GetEventSource }; + return source.get(); + } + + Type type; // 00 + }; + static_assert(sizeof(BlurEvent) == 0x4); +} \ No newline at end of file diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 681fe7d8..ba993880 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -205,6 +205,11 @@ namespace RE::ID inline constexpr REL::ID GetEventSource{ 0 }; // 131237 } + namespace BlurEvent + { + inline constexpr REL::ID GetEventSource{ 940149 }; + } + namespace BooksRead::Event { inline constexpr REL::ID GetEventSource{ 0 }; // 103540 @@ -2401,6 +2406,13 @@ namespace RE::ID inline constexpr REL::ID RegisterMenu{ 0 }; // 80375 } + namespace UIBlurManager + { + inline constexpr REL::ID Singleton{ 949563 }; + inline constexpr REL::ID ProcessDefaultObjectsReadyEvent{ 114425 }; + inline constexpr REL::ID ProcessBlurEvent{ 114426 }; + } + namespace UIMenuChargenMenuDisablePaperdoll { inline constexpr REL::ID GetEventSource{ 0 }; // 141232 diff --git a/include/RE/Starfield.h b/include/RE/Starfield.h index f532ee9e..2d4d66bf 100644 --- a/include/RE/Starfield.h +++ b/include/RE/Starfield.h @@ -458,6 +458,7 @@ #include "RE/T/TLS.h" #include "RE/T/TypeInfo.h" #include "RE/U/UI.h" +#include "RE/U/UIBlurManager.h" #include "RE/U/UICellRenderer.h" #include "RE/U/UIMessageQueue.h" #include "RE/V/Variable.h" diff --git a/include/RE/U/UIBlurManager.h b/include/RE/U/UIBlurManager.h new file mode 100644 index 00000000..12101e38 --- /dev/null +++ b/include/RE/U/UIBlurManager.h @@ -0,0 +1,68 @@ +#pragma once + +#include "RE/B/BSTEvent.h" +#include "RE/B/BSTSingleton.h" + +namespace RE +{ + struct BlurEvent; + + class TESImageSpaceModifier; + class UIBlurManager; + + template <> + struct BSTSingletonSDM : + public BSTSingletonSDMBase>> + { + public: + using value_type = UIBlurManager; + + virtual ~BSTSingletonSDM(); // 00 + }; + static_assert(sizeof(BSTSingletonSDM) == 0x10); + + struct DefaultObjectsReadyEvent + { + public: + struct Event + { + public: + }; + }; + + class UIBlurManager : + public BSTSingletonSDM, // 00 + public BSTEventSink, // 10 + public BSTEventSink // 18 + { + public: + SF_RTTI_VTABLE(UIBlurManager); + + ~UIBlurManager() override; // 00 + + [[nodiscard]] static UIBlurManager* GetSingleton() + { + static REL::Relocation singleton{ ID::UIBlurManager::Singleton }; + return singleton.get(); + } + + void DecrementBlurCount(); + void IncrementBlurCount(); + + BSEventNotifyControl ProcessEvent( + const DefaultObjectsReadyEvent::Event& a_event, + BSTEventSource* a_source) override; + + BSEventNotifyControl ProcessEvent( + const BlurEvent& a_event, + BSTEventSource* a_source) override; + + // members + TESImageSpaceModifier* blurEffect; // 020 + std::uint32_t blurCount; // 028 + std::uint32_t pad02C; // 02C + }; + static_assert(offsetof(UIBlurManager, blurEffect) == 0x20); + static_assert(offsetof(UIBlurManager, blurCount) == 0x28); + static_assert(sizeof(UIBlurManager) == 0x30); +} diff --git a/src/RE/U/UIBlurManager.cpp b/src/RE/U/UIBlurManager.cpp new file mode 100644 index 00000000..d8a7fc89 --- /dev/null +++ b/src/RE/U/UIBlurManager.cpp @@ -0,0 +1,34 @@ +#include "RE/U/UIBlurManager.h" +#include "RE/B/BlurEvent.h" + +namespace RE +{ + namespace + { + using process_blur_event_t = BSEventNotifyControl (*)( + BSTEventSink*, + const BlurEvent&, + BSTEventSource*); + + void SendBlurEvent(UIBlurManager* a_manager, const BlurEvent::Type a_type) + { + if (!a_manager) { + return; + } + + static REL::Relocation processEvent{ ID::UIBlurManager::ProcessBlurEvent }; + const BlurEvent event{ a_type }; + processEvent(static_cast*>(a_manager), event, BlurEvent::GetEventSource()); + } + } + + void UIBlurManager::DecrementBlurCount() + { + SendBlurEvent(this, BlurEvent::Type::kDecrement); + } + + void UIBlurManager::IncrementBlurCount() + { + SendBlurEvent(this, BlurEvent::Type::kIncrement); + } +}