1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
3 | #pragma once |
4 | |
5 | #include "BsCorePrerequisites.h" |
6 | #include "RenderAPI/BsRenderTarget.h" |
7 | #include "RenderAPI/BsVideoModeInfo.h" |
8 | #include "Math/BsVector2I.h" |
9 | |
10 | namespace bs |
11 | { |
12 | class RenderWindowManager; |
13 | |
14 | /** @addtogroup RenderAPI-Internal |
15 | * @{ |
16 | */ |
17 | |
18 | /** Types of events that a RenderWindow can be notified of. */ |
19 | enum class WindowEventType |
20 | { |
21 | /** Triggered when window size changes. */ |
22 | Resized, |
23 | /** Triggered when window position changes. */ |
24 | Moved, |
25 | /** Triggered when window receives input focus. */ |
26 | FocusReceived, |
27 | /** Triggered when window loses input focus. */ |
28 | FocusLost, |
29 | /** Triggered when the window is minimized (iconified). */ |
30 | Minimized, |
31 | /** Triggered when the window is expanded to cover the current screen. */ |
32 | Maximized, |
33 | /** Triggered when the window leaves minimized or maximized state. */ |
34 | Restored, |
35 | /** Triggered when the mouse pointer leaves the window area. */ |
36 | MouseLeft, |
37 | /** Triggered when the user wants to close the window. */ |
38 | CloseRequested, |
39 | }; |
40 | |
41 | /** @} */ |
42 | |
43 | /** @addtogroup RenderAPI |
44 | * @{ |
45 | */ |
46 | |
47 | /** Structure that is used for initializing a render window. */ |
48 | struct BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:RenderAPI,pl:true,api:bsf) RENDER_WINDOW_DESC |
49 | { |
50 | /** Output monitor, frame buffer resize and refresh rate. */ |
51 | VideoMode videoMode; |
52 | |
53 | /** Should the window be opened in fullscreen mode. */ |
54 | bool fullscreen = false; |
55 | |
56 | /** Should the window wait for vertical sync before swapping buffers. */ |
57 | bool vsync = false; |
58 | |
59 | /** Determines how many vsync intervals occur per frame. FPS = refreshRate/interval. Usually 1 when vsync active. */ |
60 | UINT32 vsyncInterval = 1; |
61 | |
62 | /** Should the window be hidden initially. */ |
63 | bool hidden = false; |
64 | |
65 | /** Should the window be created with a depth/stencil buffer. */ |
66 | bool depthBuffer = false; |
67 | |
68 | /** If higher than 1, texture containing multiple samples per pixel is created. */ |
69 | UINT32 multisampleCount = 0; |
70 | |
71 | /** Hint about what kind of multisampling to use. Render system specific. */ |
72 | String multisampleHint = "" ; |
73 | |
74 | /** Should the written color pixels be gamma corrected before write. */ |
75 | bool gamma = false; |
76 | |
77 | /** Window origin on X axis in pixels. -1 == screen center. Relative to monitor provided in videoMode. */ |
78 | INT32 left = -1; |
79 | |
80 | /** Window origin on Y axis in pixels. -1 == screen center. Relative to monitor provided in videoMode. */ |
81 | INT32 top = -1; |
82 | |
83 | /** Title of the window. */ |
84 | String title = "" ; |
85 | |
86 | /** Determines if the title-bar should be shown or not. */ |
87 | bool showTitleBar = true; |
88 | |
89 | /** Determines if the window border should be shown or not. */ |
90 | bool showBorder = true; |
91 | |
92 | /** Determines if the user can resize the window by dragging on the window edges. */ |
93 | bool allowResize = true; |
94 | |
95 | /** Tool windows have no task bar entry and always remain on top of their parent window. */ |
96 | bool toolWindow = false; |
97 | |
98 | /** When a modal window is open all other windows will be locked until modal window is closed. */ |
99 | bool modal = false; |
100 | |
101 | /** Window will be created as hidden and only be shown when the first framebuffer swap happens. */ |
102 | bool hideUntilSwap = false; |
103 | |
104 | /** Platform-specific creation options. */ |
105 | BS_SCRIPT_EXPORT(ex:true) |
106 | UnorderedMap<String, String> platformSpecific; |
107 | }; |
108 | |
109 | /** Contains various properties that describe a render window. */ |
110 | class BS_CORE_EXPORT RenderWindowProperties : public RenderTargetProperties |
111 | { |
112 | public: |
113 | RenderWindowProperties(const RENDER_WINDOW_DESC& desc); |
114 | virtual ~RenderWindowProperties() = default; |
115 | |
116 | /** True if window is running in fullscreen mode. */ |
117 | bool isFullScreen = false; |
118 | |
119 | /** Horizontal origin of the window in pixels. */ |
120 | INT32 left = 0; |
121 | |
122 | /** Vertical origin of the window in pixels. */ |
123 | INT32 top = 0; |
124 | |
125 | /** Indicates whether the window currently has keyboard focus. */ |
126 | bool hasFocus = false; |
127 | |
128 | /** True if the window is hidden. */ |
129 | bool isHidden = false; |
130 | |
131 | /** True if the window is modal (blocks interaction with any non-modal window until closed). */ |
132 | bool isModal = false; |
133 | |
134 | /** True if the window is maximized. */ |
135 | bool isMaximized = false; |
136 | }; |
137 | |
138 | /** |
139 | * Operating system window with a specific position, size and style. Each window serves as a surface that can be |
140 | * rendered into by RenderAPI operations. |
141 | */ |
142 | class BS_CORE_EXPORT RenderWindow : public RenderTarget |
143 | { |
144 | public: |
145 | virtual ~RenderWindow() = default; |
146 | |
147 | /** Converts screen position into window local position. */ |
148 | virtual Vector2I screenToWindowPos(const Vector2I& screenPos) const = 0; |
149 | |
150 | /** Converts window local position to screen position. */ |
151 | virtual Vector2I windowToScreenPos(const Vector2I& windowPos) const = 0; |
152 | |
153 | /** |
154 | * Resize the window to specified width and height in pixels. |
155 | * |
156 | * @param[in] width Width of the window in pixels. |
157 | * @param[in] height Height of the window in pixels. |
158 | */ |
159 | virtual void resize(UINT32 width, UINT32 height); |
160 | |
161 | /** |
162 | * Move the window to specified screen coordinates. |
163 | * |
164 | * @param[in] left Position of the left border of the window on the screen. |
165 | * @param[in] top Position of the top border of the window on the screen. |
166 | * |
167 | * @note This is an @ref asyncMethod "asynchronous method". |
168 | */ |
169 | virtual void move(INT32 left, INT32 top); |
170 | |
171 | /** |
172 | * Hides the window. |
173 | * |
174 | * @note This is an @ref asyncMethod "asynchronous method". |
175 | */ |
176 | virtual void hide(); |
177 | |
178 | /** |
179 | * Shows a previously hidden window. |
180 | * |
181 | * @note This is an @ref asyncMethod "asynchronous method". |
182 | */ |
183 | virtual void show(); |
184 | |
185 | /** |
186 | * @copydoc ct::RenderWindow::minimize |
187 | * |
188 | * @note This is an @ref asyncMethod "asynchronous method". |
189 | */ |
190 | virtual void minimize(); |
191 | |
192 | /** |
193 | * @copydoc ct::RenderWindow::maximize |
194 | * |
195 | * @note This is an @ref asyncMethod "asynchronous method". |
196 | */ |
197 | virtual void maximize(); |
198 | |
199 | /** |
200 | * @copydoc ct::RenderWindow::restore |
201 | * |
202 | * @note This is an @ref asyncMethod "asynchronous method". |
203 | */ |
204 | virtual void restore(); |
205 | |
206 | /** |
207 | * @copydoc ct::RenderWindow::setFullscreen(UINT32, UINT32, float, UINT32) |
208 | * |
209 | * @note This is an @ref asyncMethod "asynchronous method". |
210 | */ |
211 | virtual void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0); |
212 | |
213 | /** |
214 | * @copydoc ct::RenderWindow::setFullscreen(const VideoMode&) |
215 | * |
216 | * @note This is an @ref asyncMethod "asynchronous method". |
217 | */ |
218 | virtual void setFullscreen(const VideoMode& videoMode); |
219 | |
220 | /** |
221 | * @copydoc ct::RenderWindow::setWindowed |
222 | * |
223 | * @note This is an @ref asyncMethod "asynchronous method". |
224 | */ |
225 | virtual void setWindowed(UINT32 width, UINT32 height); |
226 | |
227 | /** Retrieves a core implementation of a render window usable only from the core thread. */ |
228 | SPtr<ct::RenderWindow> getCore() const; |
229 | |
230 | /** Returns properties that describe the render window. */ |
231 | const RenderWindowProperties& getProperties() const; |
232 | |
233 | /** Closes and destroys the window. */ |
234 | void destroy() override; |
235 | |
236 | /** |
237 | * Creates a new render window using the specified options. Optionally makes the created window a child of another |
238 | * window. |
239 | */ |
240 | static SPtr<RenderWindow> create(RENDER_WINDOW_DESC& desc, SPtr<RenderWindow> parentWindow = nullptr); |
241 | |
242 | /** Triggers when the OS requests that the window is closed (e.g. user clicks on the X button in the title bar). */ |
243 | Event<void()> onCloseRequested; |
244 | |
245 | /** |
246 | * @name Internal |
247 | */ |
248 | |
249 | /** Notifies the window that a specific event occurred. Usually called by the platform specific main event loop. */ |
250 | void _notifyWindowEvent(WindowEventType type); |
251 | |
252 | /** Method that triggers whenever the window changes size or position. */ |
253 | virtual void _windowMovedOrResized() { } |
254 | |
255 | /** @} */ |
256 | |
257 | protected: |
258 | friend class RenderWindowManager; |
259 | |
260 | RenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId); |
261 | |
262 | /** Returns render window properties that may be edited. */ |
263 | RenderWindowProperties& getMutableProperties(); |
264 | |
265 | /** Updates window properties from the synced property data. */ |
266 | virtual void syncProperties() = 0; |
267 | |
268 | protected: |
269 | RENDER_WINDOW_DESC mDesc; |
270 | UINT32 mWindowId; |
271 | |
272 | /************************************************************************/ |
273 | /* SERIALIZATION */ |
274 | /************************************************************************/ |
275 | public: |
276 | friend class RenderWindowRTTI; |
277 | static RTTITypeBase* getRTTIStatic(); |
278 | RTTITypeBase* getRTTI() const override; |
279 | }; |
280 | |
281 | /** @} */ |
282 | |
283 | namespace ct |
284 | { |
285 | /** @addtogroup RenderAPI-Internal |
286 | * @{ |
287 | */ |
288 | |
289 | /** Core thread counterpart of bs::RenderWindow. */ |
290 | class BS_CORE_EXPORT RenderWindow : public RenderTarget |
291 | { |
292 | public: |
293 | RenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId); |
294 | virtual ~RenderWindow(); |
295 | |
296 | /** |
297 | * Switches the window to fullscreen mode. Child windows cannot go into fullscreen mode. |
298 | * |
299 | * @param[in] width Width of the window frame buffer in pixels. |
300 | * @param[in] height Height of the window frame buffer in pixels. |
301 | * @param[in] refreshRate Refresh rate of the window in Hertz. |
302 | * @param[in] monitorIdx Index of the monitor to go fullscreen on. |
303 | * |
304 | * @note If the exact provided mode isn't available, closest one is used instead. |
305 | */ |
306 | virtual void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0) { } |
307 | |
308 | /** |
309 | * Switches the window to fullscreen mode. Child windows cannot go into fullscreen mode. |
310 | * |
311 | * @param[in] videoMode Mode retrieved from VideoModeInfo in RenderAPI. |
312 | */ |
313 | virtual void setFullscreen(const VideoMode& videoMode) { } |
314 | |
315 | /** |
316 | * Switches the window to windowed mode. |
317 | * |
318 | * @param[in] width Window width in pixels. |
319 | * @param[in] height Window height in pixels. |
320 | */ |
321 | virtual void setWindowed(UINT32 width, UINT32 height) { } |
322 | |
323 | /** Hide or show the window. */ |
324 | virtual void setHidden(bool hidden); |
325 | |
326 | /** |
327 | * Makes the render target active or inactive. (for example in the case of a window, it will hide or restore the |
328 | * window). |
329 | */ |
330 | virtual void setActive(bool state); |
331 | |
332 | /** Minimizes the window to the taskbar. */ |
333 | virtual void minimize() { } |
334 | |
335 | /** Maximizes the window over the entire current screen. */ |
336 | virtual void maximize() { } |
337 | |
338 | /** Restores the window to original position and size if it is minimized or maximized. */ |
339 | virtual void restore() { } |
340 | |
341 | /** Change the size of the window. */ |
342 | virtual void resize(UINT32 width, UINT32 height) = 0; |
343 | |
344 | /** Reposition the window. */ |
345 | virtual void move(INT32 left, INT32 top) = 0; |
346 | |
347 | /** |
348 | * Enables or disables vertical synchronization. When enabled the system will wait for monitor refresh before |
349 | * presenting the back buffer. This eliminates tearing but can result in increased input lag. |
350 | * |
351 | * @param enabled True to enable vsync, false to disable. |
352 | * @param interval Interval at which to perform the sync. Value of one means the sync will be performed for |
353 | * each monitor refresh, value of two means it will be performs for every second (half the |
354 | * rate), and so on. |
355 | */ |
356 | virtual void setVSync(bool enabled, UINT32 interval = 1) = 0; |
357 | |
358 | /** Returns properties that describe the render window. */ |
359 | const RenderWindowProperties& getProperties() const; |
360 | |
361 | /** Notifies the window that a specific event occurred. Usually called by the platform specific main event loop. */ |
362 | void _notifyWindowEvent(WindowEventType type); |
363 | |
364 | /** Method that triggers whenever the window changes size or position. */ |
365 | virtual void _windowMovedOrResized() { } |
366 | protected: |
367 | friend class bs::RenderWindow; |
368 | friend class RenderWindowManager; |
369 | friend class bs::RenderWindowManager; |
370 | |
371 | /** |
372 | * Returns window properties that are always kept in sync between core and sim threads. |
373 | * |
374 | * @note Used for keeping up what are the most up to date settings. |
375 | */ |
376 | virtual RenderWindowProperties& getSyncedProperties() = 0; |
377 | |
378 | /** Updates window properties from the synced property data. */ |
379 | virtual void syncProperties() = 0; |
380 | |
381 | RENDER_WINDOW_DESC mDesc; |
382 | SpinLock mLock; |
383 | UINT32 mWindowId; |
384 | }; |
385 | |
386 | /** @} */ |
387 | } |
388 | } |
389 | |