| 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 | |