BsRenderWindow.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "BsRenderWindow.h"
  2. #include "BsCoreThread.h"
  3. #include "BsRenderWindowManager.h"
  4. #include "BsViewport.h"
  5. #include "BsPlatform.h"
  6. #include "BsFrameAlloc.h"
  7. namespace BansheeEngine
  8. {
  9. RenderWindowProperties::RenderWindowProperties(const RENDER_WINDOW_DESC& desc)
  10. {
  11. mWidth = desc.videoMode.getWidth();
  12. mHeight = desc.videoMode.getHeight();
  13. mHwGamma = desc.gamma;
  14. mVSync = desc.vsync;
  15. mVSyncInterval = desc.vsyncInterval;
  16. mMultisampleCount = desc.multisampleCount;
  17. mLeft = desc.left;
  18. mTop = desc.top;
  19. mIsFullScreen = desc.fullscreen;
  20. mHidden = desc.hidden;
  21. mIsModal = desc.modal;
  22. mIsWindow = true;
  23. mRequiresTextureFlipping = false;
  24. }
  25. RenderWindowCore::RenderWindowCore(const RENDER_WINDOW_DESC& desc)
  26. :mDesc(desc)
  27. {
  28. }
  29. void RenderWindowCore::destroy()
  30. {
  31. Platform::resetNonClientAreas(*this);
  32. RenderWindowCoreManager::instance().windowDestroyed(this);
  33. RenderTargetCore::destroy();
  34. }
  35. void RenderWindowCore::setHidden(bool hidden)
  36. {
  37. THROW_IF_NOT_CORE_THREAD;
  38. }
  39. CoreSyncData RenderWindowCore::syncFromCore(FrameAlloc* allocator)
  40. {
  41. UINT32 size = sizeof(RenderWindowProperties);
  42. UINT8* buffer = allocator->alloc(size);
  43. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  44. memcpy(buffer, &props, size);
  45. return CoreSyncData(buffer, size);
  46. }
  47. void RenderWindowCore::syncToCore(const CoreSyncData& data)
  48. {
  49. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  50. props = data.getData<RenderWindowProperties>();
  51. }
  52. void RenderWindowCore::_windowMovedOrResized()
  53. {
  54. THROW_IF_NOT_CORE_THREAD;
  55. }
  56. void RenderWindowCore::_windowFocusReceived()
  57. {
  58. THROW_IF_NOT_CORE_THREAD;
  59. RenderWindowProperties& properties = const_cast<RenderWindowProperties&>(getProperties());
  60. properties.mHasFocus = true;
  61. markCoreDirty();
  62. }
  63. void RenderWindowCore::_windowFocusLost()
  64. {
  65. THROW_IF_NOT_CORE_THREAD;
  66. RenderWindowProperties& properties = const_cast<RenderWindowProperties&>(getProperties());
  67. properties.mHasFocus = false;
  68. markCoreDirty();
  69. }
  70. const RenderWindowProperties& RenderWindowCore::getProperties() const
  71. {
  72. return static_cast<const RenderWindowProperties&>(getPropertiesInternal());
  73. }
  74. void RenderWindow::destroy()
  75. {
  76. RenderWindowManager::instance().windowDestroyed(this);
  77. RenderTarget::destroy();
  78. }
  79. RenderWindow::RenderWindow(const RENDER_WINDOW_DESC& desc)
  80. :mDesc(desc)
  81. {
  82. }
  83. void RenderWindow::resize(CoreAccessor& accessor, UINT32 width, UINT32 height)
  84. {
  85. std::function<void(SPtr<RenderWindowCore>, UINT32, UINT32)> resizeFunc =
  86. [](SPtr<RenderWindowCore> renderWindow, UINT32 width, UINT32 height)
  87. {
  88. renderWindow->resize(width, height);
  89. };
  90. accessor.queueCommand(std::bind(resizeFunc, getCore(), width, height));
  91. }
  92. void RenderWindow::move(CoreAccessor& accessor, INT32 left, INT32 top)
  93. {
  94. std::function<void(SPtr<RenderWindowCore>, INT32, INT32)> moveFunc =
  95. [](SPtr<RenderWindowCore> renderWindow, INT32 left, INT32 top)
  96. {
  97. renderWindow->move(left, top);
  98. };
  99. accessor.queueCommand(std::bind(moveFunc, getCore(), left, top));
  100. }
  101. void RenderWindow::hide(CoreAccessor& accessor)
  102. {
  103. std::function<void(SPtr<RenderWindowCore>)> hideFunc =
  104. [](SPtr<RenderWindowCore> renderWindow)
  105. {
  106. renderWindow->setHidden(true);
  107. };
  108. accessor.queueCommand(std::bind(hideFunc, getCore()));
  109. }
  110. void RenderWindow::show(CoreAccessor& accessor)
  111. {
  112. std::function<void(SPtr<RenderWindowCore>)> showFunc =
  113. [](SPtr<RenderWindowCore> renderWindow)
  114. {
  115. renderWindow->setHidden(false);
  116. };
  117. accessor.queueCommand(std::bind(showFunc, getCore()));
  118. }
  119. void RenderWindow::setFullscreen(CoreAccessor& accessor, UINT32 width, UINT32 height,
  120. float refreshRate, UINT32 monitorIdx)
  121. {
  122. std::function<void(SPtr<RenderWindowCore>, UINT32, UINT32, float, UINT32)> fullscreenFunc =
  123. [](SPtr<RenderWindowCore> renderWindow, UINT32 width, UINT32 height, float refreshRate, UINT32 monitorIdx)
  124. {
  125. renderWindow->setFullscreen(width, height, refreshRate, monitorIdx);
  126. };
  127. accessor.queueCommand(std::bind(fullscreenFunc, getCore(), width, height, refreshRate, monitorIdx));
  128. }
  129. void RenderWindow::setFullscreen(CoreAccessor& accessor, const VideoMode& mode)
  130. {
  131. std::function<void(SPtr<RenderWindowCore>, const VideoMode&)> fullscreenFunc =
  132. [](SPtr<RenderWindowCore> renderWindow, const VideoMode& mode)
  133. {
  134. renderWindow->setFullscreen(mode);
  135. };
  136. accessor.queueCommand(std::bind(fullscreenFunc, getCore(), std::cref(mode)));
  137. }
  138. void RenderWindow::setWindowed(CoreAccessor& accessor, UINT32 width, UINT32 height)
  139. {
  140. std::function<void(SPtr<RenderWindowCore>, UINT32, UINT32)> windowedFunc =
  141. [](SPtr<RenderWindowCore> renderWindow, UINT32 width, UINT32 height)
  142. {
  143. renderWindow->setWindowed(width, height);
  144. };
  145. accessor.queueCommand(std::bind(windowedFunc, getCore(), width, height));
  146. }
  147. SPtr<RenderWindowCore> RenderWindow::getCore() const
  148. {
  149. return std::static_pointer_cast<RenderWindowCore>(mCoreSpecific);
  150. }
  151. SPtr<CoreObjectCore> RenderWindow::createCore() const
  152. {
  153. RENDER_WINDOW_DESC desc = mDesc;
  154. return RenderWindowCoreManager::instance().createInternal(desc);
  155. }
  156. RenderWindowPtr RenderWindow::create(RENDER_WINDOW_DESC& desc, RenderWindowPtr parentWindow)
  157. {
  158. return RenderWindowManager::instance().create(desc, parentWindow);
  159. }
  160. CoreSyncData RenderWindow::syncToCore(FrameAlloc* allocator)
  161. {
  162. UINT32 size = sizeof(RenderWindowProperties);
  163. UINT8* buffer = allocator->alloc(size);
  164. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  165. memcpy(buffer, &props, size);
  166. return CoreSyncData(buffer, size);
  167. }
  168. void RenderWindow::syncFromCore(const CoreSyncData& data)
  169. {
  170. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  171. props = data.getData<RenderWindowProperties>();
  172. }
  173. const RenderWindowProperties& RenderWindow::getProperties() const
  174. {
  175. return static_cast<const RenderWindowProperties&>(getPropertiesInternal());
  176. }
  177. }