BsRenderWindow.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "RenderAPI/BsRenderWindow.h"
  4. #include "CoreThread/BsCoreThread.h"
  5. #include "Managers/BsRenderWindowManager.h"
  6. #include "RenderAPI/BsViewport.h"
  7. #include "Platform/BsPlatform.h"
  8. namespace bs
  9. {
  10. RenderWindowProperties::RenderWindowProperties(const RENDER_WINDOW_DESC& desc)
  11. {
  12. width = desc.videoMode.getWidth();
  13. height = desc.videoMode.getHeight();
  14. hwGamma = desc.gamma;
  15. vsync = desc.vsync;
  16. vsyncInterval = desc.vsyncInterval;
  17. multisampleCount = desc.multisampleCount;
  18. left = desc.left;
  19. top = desc.top;
  20. isFullScreen = desc.fullscreen;
  21. isHidden = desc.hidden;
  22. isModal = desc.modal;
  23. isWindow = true;
  24. requiresTextureFlipping = false;
  25. }
  26. void RenderWindow::destroy()
  27. {
  28. RenderWindowManager::instance().notifyWindowDestroyed(this);
  29. RenderTarget::destroy();
  30. }
  31. RenderWindow::RenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId)
  32. :mDesc(desc), mWindowId(windowId)
  33. {
  34. }
  35. void RenderWindow::resize(UINT32 width, UINT32 height)
  36. {
  37. std::function<void(SPtr<ct::RenderWindow>, UINT32, UINT32)> resizeFunc =
  38. [](SPtr<ct::RenderWindow> renderWindow, UINT32 width, UINT32 height)
  39. {
  40. renderWindow->resize(width, height);
  41. };
  42. getMutableProperties().width = width;
  43. getMutableProperties().height = height;
  44. gCoreThread().queueCommand(std::bind(resizeFunc, getCore(), width, height));
  45. }
  46. void RenderWindow::move(INT32 left, INT32 top)
  47. {
  48. std::function<void(SPtr<ct::RenderWindow>, INT32, INT32)> moveFunc =
  49. [](SPtr<ct::RenderWindow> renderWindow, INT32 left, INT32 top)
  50. {
  51. renderWindow->move(left, top);
  52. };
  53. getMutableProperties().left = left;
  54. getMutableProperties().top = top;
  55. gCoreThread().queueCommand(std::bind(moveFunc, getCore(), left, top));
  56. }
  57. void RenderWindow::hide()
  58. {
  59. std::function<void(SPtr<ct::RenderWindow>)> hideFunc =
  60. [](SPtr<ct::RenderWindow> renderWindow)
  61. {
  62. renderWindow->setHidden(true);
  63. };
  64. getMutableProperties().isHidden = true;
  65. gCoreThread().queueCommand(std::bind(hideFunc, getCore()));
  66. }
  67. void RenderWindow::show()
  68. {
  69. std::function<void(SPtr<ct::RenderWindow>)> showFunc =
  70. [](SPtr<ct::RenderWindow> renderWindow)
  71. {
  72. renderWindow->setHidden(false);
  73. };
  74. getMutableProperties().isHidden = false;
  75. gCoreThread().queueCommand(std::bind(showFunc, getCore()));
  76. }
  77. void RenderWindow::minimize()
  78. {
  79. std::function<void(SPtr<ct::RenderWindow>)> minimizeFunc =
  80. [](SPtr<ct::RenderWindow> renderWindow)
  81. {
  82. renderWindow->minimize();
  83. };
  84. getMutableProperties().isMaximized = false;
  85. gCoreThread().queueCommand(std::bind(minimizeFunc, getCore()));
  86. }
  87. void RenderWindow::maximize()
  88. {
  89. std::function<void(SPtr<ct::RenderWindow>)> maximizeFunc =
  90. [](SPtr<ct::RenderWindow> renderWindow)
  91. {
  92. renderWindow->maximize();
  93. };
  94. getMutableProperties().isMaximized = true;
  95. gCoreThread().queueCommand(std::bind(maximizeFunc, getCore()));
  96. }
  97. void RenderWindow::restore()
  98. {
  99. std::function<void(SPtr<ct::RenderWindow>)> restoreFunc =
  100. [](SPtr<ct::RenderWindow> renderWindow)
  101. {
  102. renderWindow->restore();
  103. };
  104. getMutableProperties().isMaximized = false;
  105. gCoreThread().queueCommand(std::bind(restoreFunc, getCore()));
  106. }
  107. void RenderWindow::setFullscreen(UINT32 width, UINT32 height, float refreshRate, UINT32 monitorIdx)
  108. {
  109. std::function<void(SPtr<ct::RenderWindow>, UINT32, UINT32, float, UINT32)> fullscreenFunc =
  110. [](SPtr<ct::RenderWindow> renderWindow, UINT32 width, UINT32 height, float refreshRate, UINT32 monitorIdx)
  111. {
  112. renderWindow->setFullscreen(width, height, refreshRate, monitorIdx);
  113. };
  114. gCoreThread().queueCommand(std::bind(fullscreenFunc, getCore(), width, height, refreshRate, monitorIdx));
  115. }
  116. void RenderWindow::setFullscreen(const VideoMode& mode)
  117. {
  118. std::function<void(SPtr<ct::RenderWindow>, const VideoMode&)> fullscreenFunc =
  119. [](SPtr<ct::RenderWindow> renderWindow, const VideoMode& mode)
  120. {
  121. renderWindow->setFullscreen(mode);
  122. };
  123. gCoreThread().queueCommand(std::bind(fullscreenFunc, getCore(), std::cref(mode)));
  124. }
  125. void RenderWindow::setWindowed(UINT32 width, UINT32 height)
  126. {
  127. std::function<void(SPtr<ct::RenderWindow>, UINT32, UINT32)> windowedFunc =
  128. [](SPtr<ct::RenderWindow> renderWindow, UINT32 width, UINT32 height)
  129. {
  130. renderWindow->setWindowed(width, height);
  131. };
  132. gCoreThread().queueCommand(std::bind(windowedFunc, getCore(), width, height));
  133. }
  134. SPtr<ct::RenderWindow> RenderWindow::getCore() const
  135. {
  136. return std::static_pointer_cast<ct::RenderWindow>(mCoreSpecific);
  137. }
  138. SPtr<RenderWindow> RenderWindow::create(RENDER_WINDOW_DESC& desc, SPtr<RenderWindow> parentWindow)
  139. {
  140. return RenderWindowManager::instance().create(desc, parentWindow);
  141. }
  142. RenderWindowProperties& RenderWindow::getMutableProperties()
  143. {
  144. return const_cast<RenderWindowProperties&>(getProperties());
  145. }
  146. const RenderWindowProperties& RenderWindow::getProperties() const
  147. {
  148. return static_cast<const RenderWindowProperties&>(getPropertiesInternal());
  149. }
  150. void RenderWindow::_notifyWindowEvent(WindowEventType type)
  151. {
  152. THROW_IF_CORE_THREAD;
  153. ct::RenderWindow* coreWindow = getCore().get();
  154. RenderWindowProperties& syncProps = coreWindow->getSyncedProperties();
  155. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  156. switch(type)
  157. {
  158. case WindowEventType::Resized:
  159. {
  160. _windowMovedOrResized();
  161. {
  162. ScopedSpinLock lock(coreWindow->mLock);
  163. syncProps.width = props.width;
  164. syncProps.height = props.height;
  165. }
  166. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  167. RenderWindowManager::instance().notifyMovedOrResized(coreWindow);
  168. break;
  169. }
  170. case WindowEventType::Moved:
  171. {
  172. _windowMovedOrResized();
  173. {
  174. ScopedSpinLock lock(coreWindow->mLock);
  175. syncProps.top = props.top;
  176. syncProps.left = props.left;
  177. }
  178. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  179. RenderWindowManager::instance().notifyMovedOrResized(coreWindow);
  180. break;
  181. }
  182. case WindowEventType::FocusReceived:
  183. {
  184. {
  185. ScopedSpinLock lock(coreWindow->mLock);
  186. syncProps.hasFocus = true;
  187. }
  188. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  189. RenderWindowManager::instance().notifyFocusReceived(coreWindow);
  190. break;
  191. }
  192. case WindowEventType::FocusLost:
  193. {
  194. {
  195. ScopedSpinLock lock(coreWindow->mLock);
  196. syncProps.hasFocus = false;
  197. }
  198. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  199. RenderWindowManager::instance().notifyFocusLost(coreWindow);
  200. break;
  201. }
  202. case WindowEventType::Minimized:
  203. {
  204. {
  205. ScopedSpinLock lock(coreWindow->mLock);
  206. syncProps.isMaximized = false;
  207. }
  208. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  209. break;
  210. }
  211. case WindowEventType::Maximized:
  212. {
  213. {
  214. ScopedSpinLock lock(coreWindow->mLock);
  215. syncProps.isMaximized = true;
  216. }
  217. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  218. break;
  219. }
  220. case WindowEventType::Restored:
  221. {
  222. {
  223. ScopedSpinLock lock(coreWindow->mLock);
  224. syncProps.isMaximized = false;
  225. }
  226. ct::RenderWindowManager::instance().notifySyncDataDirty(coreWindow);
  227. break;
  228. }
  229. case WindowEventType::MouseLeft:
  230. {
  231. RenderWindowManager::instance().notifyMouseLeft(coreWindow);
  232. break;
  233. }
  234. case WindowEventType::CloseRequested:
  235. {
  236. RenderWindowManager::instance().notifyCloseRequested(coreWindow);
  237. break;
  238. }
  239. }
  240. }
  241. namespace ct
  242. {
  243. RenderWindow::RenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId)
  244. :mDesc(desc), mWindowId(windowId)
  245. {
  246. RenderWindowManager::instance().windowCreated(this);
  247. }
  248. RenderWindow::~RenderWindow()
  249. {
  250. RenderWindowManager::instance().windowDestroyed(this);
  251. }
  252. void RenderWindow::setHidden(bool hidden)
  253. {
  254. THROW_IF_NOT_CORE_THREAD;
  255. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  256. props.isHidden = hidden;
  257. {
  258. ScopedSpinLock lock(mLock);
  259. getSyncedProperties().isHidden = hidden;
  260. }
  261. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  262. }
  263. void RenderWindow::setActive(bool state)
  264. {
  265. THROW_IF_NOT_CORE_THREAD;
  266. }
  267. void RenderWindow::_notifyWindowEvent(WindowEventType type)
  268. {
  269. THROW_IF_NOT_CORE_THREAD;
  270. RenderWindowProperties& syncProps = getSyncedProperties();
  271. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  272. switch(type)
  273. {
  274. case WindowEventType::Resized:
  275. {
  276. _windowMovedOrResized();
  277. {
  278. ScopedSpinLock lock(mLock);
  279. syncProps.width = props.width;
  280. syncProps.height = props.height;
  281. }
  282. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  283. bs::RenderWindowManager::instance().notifyMovedOrResized(this);
  284. break;
  285. }
  286. case WindowEventType::Moved:
  287. {
  288. _windowMovedOrResized();
  289. {
  290. ScopedSpinLock lock(mLock);
  291. syncProps.top = props.top;
  292. syncProps.left = props.left;
  293. }
  294. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  295. bs::RenderWindowManager::instance().notifyMovedOrResized(this);
  296. break;
  297. }
  298. case WindowEventType::FocusReceived:
  299. {
  300. {
  301. ScopedSpinLock lock(mLock);
  302. syncProps.hasFocus = true;
  303. }
  304. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  305. bs::RenderWindowManager::instance().notifyFocusReceived(this);
  306. break;
  307. }
  308. case WindowEventType::FocusLost:
  309. {
  310. {
  311. ScopedSpinLock lock(mLock);
  312. syncProps.hasFocus = false;
  313. }
  314. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  315. bs::RenderWindowManager::instance().notifyFocusLost(this);
  316. break;
  317. }
  318. case WindowEventType::Minimized:
  319. {
  320. {
  321. ScopedSpinLock lock(mLock);
  322. syncProps.isMaximized = false;
  323. }
  324. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  325. break;
  326. }
  327. case WindowEventType::Maximized:
  328. {
  329. {
  330. ScopedSpinLock lock(mLock);
  331. syncProps.isMaximized = true;
  332. }
  333. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  334. break;
  335. }
  336. case WindowEventType::Restored:
  337. {
  338. {
  339. ScopedSpinLock lock(mLock);
  340. syncProps.isMaximized = false;
  341. }
  342. bs::RenderWindowManager::instance().notifySyncDataDirty(this);
  343. break;
  344. }
  345. case WindowEventType::MouseLeft:
  346. {
  347. bs::RenderWindowManager::instance().notifyMouseLeft(this);
  348. break;
  349. }
  350. case WindowEventType::CloseRequested:
  351. {
  352. bs::RenderWindowManager::instance().notifyCloseRequested(this);
  353. break;
  354. }
  355. }
  356. }
  357. const RenderWindowProperties& RenderWindow::getProperties() const
  358. {
  359. return static_cast<const RenderWindowProperties&>(getPropertiesInternal());
  360. }
  361. }
  362. }