NAP
imguiservice.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "imguiicon.h"
9 #include "imguistyle.h"
10 
11 // External includes
12 #include <nap/service.h>
13 #include <renderwindow.h>
14 #include <inputevent.h>
15 #include <nap/resourceptr.h>
16 #include <descriptorsetallocator.h>
17 #include <nap/signalslot.h>
18 
19 // ImGUI forward declares
20 struct ImGuiContext;
21 
22 namespace nap
23 {
24  // Forward Declares
25  class RenderService;
26  class Display;
27  class GuiWindow;
28  class IMGuiService;
29 
39  namespace icon
40  {
41  inline constexpr const char* save = "save.png";
42  inline constexpr const char* saveAs = "save_as.png";
43  inline constexpr const char* cancel = "cancel.png";
44  inline constexpr const char* ok = "ok.png";
45  inline constexpr const char* del = "delete.png";
46  inline constexpr const char* file = "file.png";
47  inline constexpr const char* help = "help.png";
48  inline constexpr const char* settings = "settings.png";
49  inline constexpr const char* reload = "reload.png";
50  inline constexpr const char* folder = "folder.png";
51  inline constexpr const char* load = "load.png";
52  inline constexpr const char* info = "info.png";
53  inline constexpr const char* warning = "warning.png";
54  inline constexpr const char* error = "error.png";
55  inline constexpr const char* copy = "copy.png";
56  inline constexpr const char* paste = "paste.png";
57  inline constexpr const char* insert = "insert.png";
58  inline constexpr const char* edit = "edit.png";
59  inline constexpr const char* remove = "remove.png";
60  inline constexpr const char* add = "add.png";
61  inline constexpr const char* change = "change.png";
62  inline constexpr const char* subtract = "subtract.png";
63  inline constexpr const char* frame = "frame.png";
64  }
65 
66 
71  {
72  RTTI_ENABLE(ServiceConfiguration)
73  public:
75  float mFontSize = 17.0f;
76  float mScale = 1.0f;
77  std::string mFontFile = "";
78  glm::ivec2 mFontOversampling = { 5, 3 };
79  float mFontSpacing = 0.25f;
82  virtual rtti::TypeInfo getServiceType() const override { return RTTI_OF(IMGuiService); }
83  };
84 
85 
95  class NAPAPI IMGuiService : public Service
96  {
97  RTTI_ENABLE(Service)
98  friend class GuiWindow;
99  public:
103  IMGuiService(ServiceConfiguration* configuration);
104 
129  void draw();
130 
149  void selectWindow(nap::ResourcePtr<RenderWindow> window);
150 
156  ImGuiContext* getContext(nap::ResourcePtr<RenderWindow> window);
157 
163  ImGuiContext* findContext(int windowID);
164 
171  float getScale() const;
172 
180  float getScale(const ImGuiContext* context) const;
181 
186  const gui::ColorPalette& getPalette() const;
187 
192  void setPalette(gui::EColorScheme palette);
193 
198  ImGuiContext* processInputEvent(const InputEvent& event);
199 
203  bool isCapturingKeyboard(ImGuiContext* context);
204 
208  bool isCapturingMouse(ImGuiContext* context);
209 
215  void addInputCharachter(ImGuiContext* context, nap::uint character);
216 
230  ImTextureID getTextureHandle(const nap::Texture2D& texture) const;
231 
245  nap::Icon& getIcon(std::string&& name);
246 
269  bool loadIcon(const std::string& name, const nap::Module& module, utility::ErrorState& error);
270 
271  protected:
278  bool init(utility::ErrorState& error) override;
279 
284  void getDependentServices(std::vector<rtti::TypeInfo>& dependencies) override;
285 
290  void update(double deltaTime) override;
291 
295  void postUpdate(double deltaTime) override;
296 
300  void preShutdown() override;
301 
305  void shutdown() override;
306 
310  void registerObjectCreators(rtti::Factory& factory) override;
311 
312  private:
317  struct NAPAPI GUIContext
318  {
319  GUIContext(ImGuiContext* context, ImGuiStyle* style);
320  ~GUIContext();
321 
322  using ESource = PointerEvent::ESource;
323  static constexpr int keyCount = 512;
324  using KeyArray = std::array<bool, keyCount>;
325 
326  std::array<bool,3> mMousePressed = { false };
327  std::array<bool,3> mMouseRelease = { false };
328  std::array<bool,3> mModPressed = { false };
329  std::array<bool,3> mModRelease = { false };
330  std::array<int, 3> mPointerID = { gui::pointerInvalidID };
331  KeyArray mKeyPressed = { false };
332  std::vector<int> mKeyRelease;
333  glm::ivec2 mMousePosition = { 0, 0 };
334  float mMouseWheel = 0.0f;
335  float mScale = 1.0f;
336  int mDisplayIndex = -1;
337  ImGuiContext* mContext = nullptr;
338  ImGuiContext* mPreviousContext = nullptr;
339  ImGuiStyle* mStyle = nullptr;
340 
341  // Activates current context
342  void activate();
343 
344  // Deactivates current context, restores previous
345  void deactivate();
346  };
347 
351  void onWindowAdded(RenderWindow& window);
352  nap::Slot<RenderWindow&> mWindowAddedSlot = { this, &IMGuiService::onWindowAdded };
353 
357  void onWindowRemoved(RenderWindow& window);
358  nap::Slot<RenderWindow&> mWindowRemovedSlot = { this, &IMGuiService::onWindowRemoved };
359 
363  void onWindowEvent(const WindowEvent& windowEvent);
364  nap::Slot<const WindowEvent&> mWindowEventSlot = { this, &IMGuiService::onWindowEvent };
365 
369  void createVulkanResources(nap::RenderWindow& window);
370 
374  void newFrame(RenderWindow& window, GUIContext& context, double deltaTime);
375 
379  void pushScale(GUIContext& context, const nap::RenderWindow& window);
380 
384  void handleKeyEvent(const KeyEvent& keyEvent, GUIContext& context);
385 
389  void handlePointerEvent(const PointerEvent& pointerEvent, GUIContext& context);
390 
394  void handleTouchEvent(const TouchEvent& touchEvent, GUIContext& context);
395 
396  // Everything related to ImGUI
397  RenderService* mRenderService = nullptr;
398  std::unordered_map<RenderWindow*, std::unique_ptr<GUIContext>> mContexts;
399  std::unique_ptr<ImFontAtlas> mFontAtlas = nullptr;
400  std::unique_ptr<ImGuiStyle> mStyle = nullptr;
401  float mGuiScale = 1.0f;
402  float mReferenceScale = 1.0f;
403 
404  // Selected colour palette and style
405  IMGuiServiceConfiguration* mConfiguration = nullptr;
406  const gui::ColorPalette* mColorPalette = nullptr;
407 
408  // Icons
409  std::unordered_map<std::string, std::unique_ptr<Icon>> mIcons;
410 
411  // Vulkan data associated with ImGUI
412  std::unique_ptr<DescriptorSetAllocator> mAllocator;
413  VkDescriptorPool mDescriptorPool = VK_NULL_HANDLE;
414  VkDescriptorSetLayout mDescriptorSetLayout = VK_NULL_HANDLE;
415  VkSampler mSampler = VK_NULL_HANDLE;
416  mutable std::unordered_map<const Texture2D*, VkDescriptorSet> mDescriptors;
417  };
418 }
nap::uint
unsigned int uint
Definition: numeric.h:23
nap::RenderWindow
Definition: renderwindow.h:43
nap::icon::paste
constexpr const char * paste
Definition: imguiservice.h:56
nap::IMGuiServiceConfiguration::getServiceType
virtual rtti::TypeInfo getServiceType() const override
Definition: imguiservice.h:82
nap::icon::add
constexpr const char * add
Definition: imguiservice.h:60
nap::icon::saveAs
constexpr const char * saveAs
Definition: imguiservice.h:42
nap::icon::file
constexpr const char * file
Definition: imguiservice.h:46
nap::icon::error
constexpr const char * error
Definition: imguiservice.h:54
nap::Slot
Definition: signalslot.h:18
nap::gui::EColorScheme::Dark
@ Dark
Darker color scheme (default)
nap::icon::remove
constexpr const char * remove
Definition: imguiservice.h:59
nap::icon::help
constexpr const char * help
Definition: imguiservice.h:47
nap::icon::subtract
constexpr const char * subtract
Definition: imguiservice.h:62
nap::icon::save
constexpr const char * save
Definition: imguiservice.h:41
nap::rtti::ObjectPtr
Definition: objectptr.h:150
nap::icon::load
constexpr const char * load
Definition: imguiservice.h:51
nap::icon::insert
constexpr const char * insert
Definition: imguiservice.h:57
nap::icon::edit
constexpr const char * edit
Definition: imguiservice.h:58
nap::gui::EColorScheme
EColorScheme
Definition: imguistyle.h:26
nap::icon::settings
constexpr const char * settings
Definition: imguiservice.h:48
nap::IMGuiServiceConfiguration
Definition: imguiservice.h:70
nap::gui::pointerInvalidID
constexpr int pointerInvalidID
Invalid pointer ID.
Definition: imguistyle.h:19
nap::icon::warning
constexpr const char * warning
Definition: imguiservice.h:53
nap::ServiceConfiguration
Definition: service.h:28
nap::icon::cancel
constexpr const char * cancel
Definition: imguiservice.h:43
nap::Icon
Definition: imguiicon.h:24
nap::icon::change
constexpr const char * change
Definition: imguiservice.h:61
nap::gui::ColorPalette
Definition: imguistyle.h:38
nap::icon::ok
constexpr const char * ok
Definition: imguiservice.h:44
nap::Texture2D
Definition: texture.h:117
nap::icon::frame
constexpr const char * frame
Definition: imguiservice.h:63
nap::Service
Definition: templateservice.h:8
nap::icon::info
constexpr const char * info
Definition: imguiservice.h:52
nap::icon::folder
constexpr const char * folder
Definition: imguiservice.h:50
nap::icon::del
constexpr const char * del
Definition: imguiservice.h:45
nap::IMGuiService
Definition: imguiservice.h:95
nap::rtti::Factory
Definition: factory.h:78
nap::gui::Style
Definition: imguistyle.h:58
nap
Definition: templateapp.h:17
nap::PointerEvent::ESource
ESource
Definition: inputevent.h:135
nap::icon::reload
constexpr const char * reload
Definition: imguiservice.h:49
nap::icon::copy
constexpr const char * copy
Definition: imguiservice.h:55
nap::rtti::TypeInfo
rttr::type TypeInfo
Definition: typeinfo.h:141
nap::IMGuiServiceConfiguration::mCustomColors
gui::ColorPalette mCustomColors
Property: 'Colors' Color overrides if scheme is set to custom.
Definition: imguiservice.h:80
nap::IMGuiServiceConfiguration::mStyle
gui::Style mStyle
Property: 'Style' Configurable style elements.
Definition: imguiservice.h:81
nap::Module
Definition: modulecache.h:26
nap::InputEvent
Definition: inputevent.h:27