@@ -20,6 +20,48 @@ using namespace asset;
20
20
using namespace ui ;
21
21
using namespace video ;
22
22
23
+ class CEventCallback : public ISimpleManagedSurface ::ICallback
24
+ {
25
+ public:
26
+ CEventCallback (nbl::core::smart_refctd_ptr<InputSystem>&& m_inputSystem, nbl::system::logger_opt_smart_ptr&& logger) : m_inputSystem(std::move(m_inputSystem)), m_logger(std::move(logger)) {}
27
+ CEventCallback () {}
28
+
29
+ void setLogger (nbl::system::logger_opt_smart_ptr& logger)
30
+ {
31
+ m_logger = logger;
32
+ }
33
+ void setInputSystem (nbl::core::smart_refctd_ptr<InputSystem>&& m_inputSystem)
34
+ {
35
+ m_inputSystem = std::move (m_inputSystem);
36
+ }
37
+ private:
38
+
39
+ void onMouseConnected_impl (nbl::core::smart_refctd_ptr<nbl::ui::IMouseEventChannel>&& mch) override
40
+ {
41
+ m_logger.log (" A mouse %p has been connected" , nbl::system::ILogger::ELL_INFO, mch.get ());
42
+ m_inputSystem.get ()->add (m_inputSystem.get ()->m_mouse , std::move (mch));
43
+ }
44
+ void onMouseDisconnected_impl (nbl::ui::IMouseEventChannel* mch) override
45
+ {
46
+ m_logger.log (" A mouse %p has been disconnected" , nbl::system::ILogger::ELL_INFO, mch);
47
+ m_inputSystem.get ()->remove (m_inputSystem.get ()->m_mouse , mch);
48
+ }
49
+ void onKeyboardConnected_impl (nbl::core::smart_refctd_ptr<nbl::ui::IKeyboardEventChannel>&& kbch) override
50
+ {
51
+ m_logger.log (" A keyboard %p has been connected" , nbl::system::ILogger::ELL_INFO, kbch.get ());
52
+ m_inputSystem.get ()->add (m_inputSystem.get ()->m_keyboard , std::move (kbch));
53
+ }
54
+ void onKeyboardDisconnected_impl (nbl::ui::IKeyboardEventChannel* kbch) override
55
+ {
56
+ m_logger.log (" A keyboard %p has been disconnected" , nbl::system::ILogger::ELL_INFO, kbch);
57
+ m_inputSystem.get ()->remove (m_inputSystem.get ()->m_keyboard , kbch);
58
+ }
59
+
60
+ private:
61
+ nbl::core::smart_refctd_ptr<InputSystem> m_inputSystem = nullptr ;
62
+ nbl::system::logger_opt_smart_ptr m_logger = nullptr ;
63
+ };
64
+
23
65
class UISampleApp final : public examples::SimpleWindowedApplication
24
66
{
25
67
using device_base_t = examples::SimpleWindowedApplication;
@@ -39,14 +81,16 @@ class UISampleApp final : public examples::SimpleWindowedApplication
39
81
if (!m_surface)
40
82
{
41
83
{
84
+ auto windowCallback = core::make_smart_refctd_ptr<CEventCallback>(smart_refctd_ptr (m_inputSystem), smart_refctd_ptr (m_logger));
42
85
IWindow::SCreationParams params = {};
43
86
params.callback = core::make_smart_refctd_ptr<nbl::video::ISimpleManagedSurface::ICallback>();
44
- params.width = 256 ;
45
- params.height = 256 ;
87
+ params.width = WIN_W ;
88
+ params.height = WIN_H ;
46
89
params.x = 32 ;
47
90
params.y = 32 ;
48
91
params.flags = ui::IWindow::ECF_HIDDEN | IWindow::ECF_BORDERLESS | IWindow::ECF_RESIZABLE;
49
92
params.windowCaption = " UISampleApp" ;
93
+ params.callback = windowCallback;
50
94
const_cast <std::remove_const_t <decltype (m_window)>&>(m_window) = m_winMgr->createWindow (std::move (params));
51
95
}
52
96
@@ -62,6 +106,8 @@ class UISampleApp final : public examples::SimpleWindowedApplication
62
106
63
107
inline bool onAppInitialized (smart_refctd_ptr<ISystem>&& system) override
64
108
{
109
+ m_inputSystem = make_smart_refctd_ptr<InputSystem>(logger_opt_smart_ptr (smart_refctd_ptr (m_logger)));
110
+
65
111
if (!device_base_t::onAppInitialized (smart_refctd_ptr (system)))
66
112
return false ;
67
113
@@ -99,7 +145,9 @@ class UISampleApp final : public examples::SimpleWindowedApplication
99
145
};
100
146
101
147
auto scResources = std::make_unique<CDefaultSwapchainFramebuffers>(m_device.get (), swapchainParams.surfaceFormat .format , dependencies);
102
- if (!scResources->getRenderpass ())
148
+ auto * renderpass = scResources->getRenderpass ();
149
+
150
+ if (!renderpass)
103
151
return logFail (" Failed to create Renderpass!" );
104
152
105
153
auto gQueue = getGraphicsQueue ();
@@ -123,7 +171,7 @@ class UISampleApp final : public examples::SimpleWindowedApplication
123
171
return logFail (" Couldn't create Command Buffer!" );
124
172
}
125
173
126
- ui = core::make_smart_refctd_ptr<nbl::ext::imgui::UI>(smart_refctd_ptr (m_device), (int )m_maxFramesInFlight, scResources-> getRenderpass () , nullptr , smart_refctd_ptr (m_window));
174
+ ui = core::make_smart_refctd_ptr<nbl::ext::imgui::UI>(smart_refctd_ptr (m_device), (int )m_maxFramesInFlight, renderpass , nullptr , smart_refctd_ptr (m_window));
127
175
ui->Register ([this ]() -> void
128
176
{
129
177
ui->BeginWindow (" Test window" );
@@ -135,6 +183,10 @@ class UISampleApp final : public examples::SimpleWindowedApplication
135
183
}
136
184
);
137
185
186
+ m_winMgr->setWindowSize (m_window.get (), WIN_W, WIN_H);
187
+ m_surface->recreateSwapchain ();
188
+ m_winMgr->show (m_window.get ());
189
+
138
190
return true ;
139
191
}
140
192
@@ -243,24 +295,34 @@ class UISampleApp final : public examples::SimpleWindowedApplication
243
295
}
244
296
245
297
static std::chrono::microseconds previousEventTimestamp{};
246
- std::vector<SMouseEvent> validEvents{};
247
298
248
- mouse.consumeEvents ([&validEvents](const IMouseEventChannel::range_t & events) -> void
299
+ struct
300
+ {
301
+ std::vector<SMouseEvent> mouse{};
302
+ } capturedEvents;
303
+
304
+ m_inputSystem->getDefaultMouse (&mouse);
305
+ m_inputSystem->getDefaultKeyboard (&keyboard);
306
+
307
+ mouse.consumeEvents ([&](const IMouseEventChannel::range_t & events) -> void
249
308
{
250
309
for (auto event : events)
251
310
{
252
311
if (event.timeStamp < previousEventTimestamp)
253
312
continue ;
254
313
255
314
previousEventTimestamp = event.timeStamp ;
256
-
257
- validEvents.push_back (event);
315
+ capturedEvents.mouse .push_back (event);
258
316
}
259
- });
317
+ }, m_logger. get () );
260
318
261
- auto const mousePosition = m_window->getCursorControl ()->getPosition ();
319
+ keyboard.consumeEvents ([&](const IKeyboardEventChannel::range_t & events) -> void
320
+ {
321
+ // TOOD
322
+ }, m_logger.get ());
262
323
263
- ui->Update (deltaTimeInSec, static_cast <float >(mousePosition.x ), static_cast <float >(mousePosition.y ), validEvents.size (), validEvents.data ());
324
+ const auto mousePosition = m_window->getCursorControl ()->getPosition ();
325
+ ui->Update (deltaTimeInSec, static_cast <float >(mousePosition.x ), static_cast <float >(mousePosition.y ), capturedEvents.mouse .size (), capturedEvents.mouse .data ());
264
326
}
265
327
266
328
inline bool keepRunning () override
0 commit comments