// Distributed under the MIT License (MIT) (see accompanying LICENSE file) #pragma once #include "TextureManager.h" #include class FImGuiInputState; // Utilities to help standardise operations between Unreal and ImGui. namespace ImGuiInterops { //==================================================================================================== // ImGui Types //==================================================================================================== namespace ImGuiTypes { using FMouseButtonsArray = decltype(ImGuiIO::MouseDown); using FKeysArray = decltype(ImGuiIO::KeysDown); using FInputCharactersBuffer = decltype(ImGuiIO::InputCharacters); using FKeyMap = decltype(ImGuiIO::KeyMap); } //==================================================================================================== // Input Mapping //==================================================================================================== // Set in ImGui IO mapping to recognize indices generated from Unreal input events. void SetUnrealKeyMap(ImGuiIO& IO); // Map FKey to index in keys buffer. uint32 GetKeyIndex(const FKey& Key); // Map key event to index in keys buffer. FORCEINLINE uint32 GetKeyIndex(const FKeyEvent& KeyEvent) { return KeyEvent.GetKeyCode(); } // Map mouse FKey to index in mouse buttons buffer. uint32 GetMouseIndex(const FKey& MouseButton); // Map pointer event to index in mouse buttons buffer. FORCEINLINE uint32 GetMouseIndex(const FPointerEvent& MouseEvent) { return GetMouseIndex(MouseEvent.GetEffectingButton()); } //==================================================================================================== // Input State Copying //==================================================================================================== // Copy input to ImGui IO. // @param IO - Target ImGui IO // @param InputState - Input state to copy void CopyInput(ImGuiIO& IO, const FImGuiInputState& InputState); //==================================================================================================== // Conversions //==================================================================================================== // Convert from ImGui packed color to FColor. FORCEINLINE FColor UnpackImU32Color(ImU32 Color) { // We use IM_COL32_R/G/B/A_SHIFT macros to support different ImGui configurations. return FColor{ (uint8)((Color >> IM_COL32_R_SHIFT) & 0xFF), (uint8)((Color >> IM_COL32_G_SHIFT) & 0xFF), (uint8)((Color >> IM_COL32_B_SHIFT) & 0xFF), (uint8)((Color >> IM_COL32_A_SHIFT) & 0xFF) }; } // Convert from ImVec4 rectangle to FSlateRect. FORCEINLINE FSlateRect ToSlateRect(const ImVec4& ImGuiRect) { return FSlateRect{ ImGuiRect.x, ImGuiRect.y, ImGuiRect.z, ImGuiRect.w }; } // Convert from ImGui Texture Id to Texture Index that we use for texture resources. FORCEINLINE TextureIndex ToTextureIndex(ImTextureID Index) { return static_cast(reinterpret_cast(Index)); } // Convert from Texture Index to ImGui Texture Id that we pass to ImGui. FORCEINLINE ImTextureID ToImTextureID(TextureIndex Index) { return reinterpret_cast(static_cast(Index)); } }