BsRenderWindow.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. RenderWindowCore::~RenderWindowCore()
  30. {
  31. Platform::resetNonClientAreas(*this);
  32. RenderWindowCoreManager::instance().windowDestroyed(this);
  33. }
  34. void RenderWindowCore::setHidden(bool hidden)
  35. {
  36. THROW_IF_NOT_CORE_THREAD;
  37. }
  38. CoreSyncData RenderWindowCore::syncFromCore(FrameAlloc* allocator)
  39. {
  40. UINT32 size = sizeof(RenderWindowProperties);
  41. UINT8* buffer = allocator->alloc(size);
  42. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  43. memcpy(buffer, &props, size);
  44. return CoreSyncData(buffer, size);
  45. }
  46. void RenderWindowCore::syncToCore(const CoreSyncData& data)
  47. {
  48. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  49. props = data.getData<RenderWindowProperties>();
  50. }
  51. void RenderWindowCore::_windowMovedOrResized()
  52. {
  53. THROW_IF_NOT_CORE_THREAD;
  54. }
  55. void RenderWindowCore::_windowFocusReceived()
  56. {
  57. THROW_IF_NOT_CORE_THREAD;
  58. RenderWindowProperties& properties = const_cast<RenderWindowProperties&>(getProperties());
  59. properties.mHasFocus = true;
  60. markCoreDirty();
  61. }
  62. void RenderWindowCore::_windowFocusLost()
  63. {
  64. THROW_IF_NOT_CORE_THREAD;
  65. RenderWindowProperties& properties = const_cast<RenderWindowProperties&>(getProperties());
  66. properties.mHasFocus = false;
  67. markCoreDirty();
  68. }
  69. const RenderWindowProperties& RenderWindowCore::getProperties() const
  70. {
  71. return static_cast<const RenderWindowProperties&>(getPropertiesInternal());
  72. }
  73. void RenderWindow::destroy()
  74. {
  75. RenderWindowManager::instance().windowDestroyed(this);
  76. RenderTarget::destroy();
  77. }
  78. RenderWindow::RenderWindow(const RENDER_WINDOW_DESC& desc)
  79. :mDesc(desc)
  80. {
  81. }
  82. void RenderWindow::resize(CoreAccessor& accessor, UINT32 width, UINT32 height)
  83. {
  84. std::function<void(SPtr<RenderWindowCore>, UINT32, UINT32)> resizeFunc =
  85. [](SPtr<RenderWindowCore> renderWindow, UINT32 width, UINT32 height)
  86. {
  87. renderWindow->resize(width, height);
  88. };
  89. accessor.queueCommand(std::bind(resizeFunc, getCore(), width, height));
  90. }
  91. void RenderWindow::move(CoreAccessor& accessor, INT32 left, INT32 top)
  92. {
  93. std::function<void(SPtr<RenderWindowCore>, INT32, INT32)> moveFunc =
  94. [](SPtr<RenderWindowCore> renderWindow, INT32 left, INT32 top)
  95. {
  96. renderWindow->move(left, top);
  97. };
  98. accessor.queueCommand(std::bind(moveFunc, getCore(), left, top));
  99. }
  100. void RenderWindow::hide(CoreAccessor& accessor)
  101. {
  102. std::function<void(SPtr<RenderWindowCore>)> hideFunc =
  103. [](SPtr<RenderWindowCore> renderWindow)
  104. {
  105. renderWindow->setHidden(true);
  106. };
  107. accessor.queueCommand(std::bind(hideFunc, getCore()));
  108. }
  109. void RenderWindow::show(CoreAccessor& accessor)
  110. {
  111. std::function<void(SPtr<RenderWindowCore>)> showFunc =
  112. [](SPtr<RenderWindowCore> renderWindow)
  113. {
  114. renderWindow->setHidden(false);
  115. };
  116. accessor.queueCommand(std::bind(showFunc, getCore()));
  117. }
  118. void RenderWindow::setFullscreen(CoreAccessor& accessor, UINT32 width, UINT32 height,
  119. float refreshRate, UINT32 monitorIdx)
  120. {
  121. std::function<void(SPtr<RenderWindowCore>, UINT32, UINT32, float, UINT32)> fullscreenFunc =
  122. [](SPtr<RenderWindowCore> renderWindow, UINT32 width, UINT32 height, float refreshRate, UINT32 monitorIdx)
  123. {
  124. renderWindow->setFullscreen(width, height, refreshRate, monitorIdx);
  125. };
  126. accessor.queueCommand(std::bind(fullscreenFunc, getCore(), width, height, refreshRate, monitorIdx));
  127. }
  128. void RenderWindow::setFullscreen(CoreAccessor& accessor, const VideoMode& mode)
  129. {
  130. std::function<void(SPtr<RenderWindowCore>, const VideoMode&)> fullscreenFunc =
  131. [](SPtr<RenderWindowCore> renderWindow, const VideoMode& mode)
  132. {
  133. renderWindow->setFullscreen(mode);
  134. };
  135. accessor.queueCommand(std::bind(fullscreenFunc, getCore(), std::cref(mode)));
  136. }
  137. void RenderWindow::setWindowed(CoreAccessor& accessor, UINT32 width, UINT32 height)
  138. {
  139. std::function<void(SPtr<RenderWindowCore>, UINT32, UINT32)> windowedFunc =
  140. [](SPtr<RenderWindowCore> renderWindow, UINT32 width, UINT32 height)
  141. {
  142. renderWindow->setWindowed(width, height);
  143. };
  144. accessor.queueCommand(std::bind(windowedFunc, getCore(), width, height));
  145. }
  146. SPtr<RenderWindowCore> RenderWindow::getCore() const
  147. {
  148. return std::static_pointer_cast<RenderWindowCore>(mCoreSpecific);
  149. }
  150. SPtr<CoreObjectCore> RenderWindow::createCore() const
  151. {
  152. RENDER_WINDOW_DESC desc = mDesc;
  153. return RenderWindowCoreManager::instance().createInternal(desc);
  154. }
  155. RenderWindowPtr RenderWindow::create(RENDER_WINDOW_DESC& desc, RenderWindowPtr parentWindow)
  156. {
  157. return RenderWindowManager::instance().create(desc, parentWindow);
  158. }
  159. CoreSyncData RenderWindow::syncToCore(FrameAlloc* allocator)
  160. {
  161. UINT32 size = sizeof(RenderWindowProperties);
  162. UINT8* buffer = allocator->alloc(size);
  163. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  164. memcpy(buffer, &props, size);
  165. return CoreSyncData(buffer, size);
  166. }
  167. void RenderWindow::syncFromCore(const CoreSyncData& data)
  168. {
  169. RenderWindowProperties& props = const_cast<RenderWindowProperties&>(getProperties());
  170. const RenderWindowProperties& newProps = data.getData<RenderWindowProperties>();
  171. bool movedOrResized = props.getHeight() != newProps.getHeight() || props.getWidth() != newProps.getWidth() || props.getLeft() != newProps.getLeft()
  172. || props.getTop() != newProps.getTop() || props.isFullScreen() != newProps.isFullScreen();
  173. props = newProps;
  174. if (movedOrResized)
  175. RenderWindowManager::instance().windowMovedOrResized(this);
  176. }
  177. const RenderWindowProperties& RenderWindow::getProperties() const
  178. {
  179. return static_cast<const RenderWindowProperties&>(getPropertiesInternal());
  180. }
  181. }