BsViewport.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "RenderAPI/BsViewport.h"
  4. #include "RTTI/BsViewportRTTI.h"
  5. #include "Error/BsException.h"
  6. #include "RenderAPI/BsRenderTarget.h"
  7. #include "Math/BsMath.h"
  8. #include "RenderAPI/BsRenderAPI.h"
  9. #include "Allocators/BsFrameAlloc.h"
  10. namespace bs
  11. {
  12. const Color ViewportBase::DEFAULT_CLEAR_COLOR = Color(0.0f, 0.3685f, 0.7969f);
  13. ViewportBase::ViewportBase(float x, float y, float width, float height)
  14. : mNormArea(x, y, width, height), mClearFlags(ClearFlagBits::Color | ClearFlagBits::Depth)
  15. , mClearColorValue(DEFAULT_CLEAR_COLOR), mClearDepthValue(1.0f), mClearStencilValue(0)
  16. {
  17. }
  18. void ViewportBase::setArea(const Rect2& area)
  19. {
  20. mNormArea = area;
  21. _markCoreDirty();
  22. }
  23. Rect2I ViewportBase::getPixelArea() const
  24. {
  25. float width = (float)getTargetWidth();
  26. float height = (float)getTargetHeight();
  27. Rect2I area;
  28. area.x = (int)(mNormArea.x * width);
  29. area.y = (int)(mNormArea.y * height);
  30. area.width = (int)(mNormArea.width * width);
  31. area.height = (int)(mNormArea.height * height);
  32. return area;
  33. }
  34. void ViewportBase::setClearFlags(ClearFlags flags)
  35. {
  36. mClearFlags = flags;
  37. _markCoreDirty();
  38. }
  39. void ViewportBase::setClearValues(const Color& clearColor, float clearDepth, UINT16 clearStencil)
  40. {
  41. mClearColorValue = clearColor;
  42. mClearDepthValue = clearDepth;
  43. mClearStencilValue = clearStencil;
  44. _markCoreDirty();
  45. }
  46. void ViewportBase::setClearColorValue(const Color& color)
  47. {
  48. mClearColorValue = color;
  49. _markCoreDirty();
  50. }
  51. void ViewportBase::setClearDepthValue(float depth)
  52. {
  53. mClearDepthValue = depth;
  54. _markCoreDirty();
  55. }
  56. void ViewportBase::setClearStencilValue(UINT16 value)
  57. {
  58. mClearStencilValue = value;
  59. _markCoreDirty();
  60. }
  61. Viewport::Viewport()
  62. :ViewportBase()
  63. { }
  64. Viewport::Viewport(const SPtr<RenderTarget>& target, float x, float y, float width, float height)
  65. :ViewportBase(x, y, width, height), mTarget(target)
  66. {
  67. }
  68. void Viewport::setTarget(const SPtr<RenderTarget>& target)
  69. {
  70. mTarget = target;
  71. markDependenciesDirty();
  72. _markCoreDirty();
  73. }
  74. SPtr<ct::Viewport> Viewport::getCore() const
  75. {
  76. return std::static_pointer_cast<ct::Viewport>(mCoreSpecific);
  77. }
  78. void Viewport::_markCoreDirty()
  79. {
  80. markCoreDirty();
  81. }
  82. UINT32 Viewport::getTargetWidth() const
  83. {
  84. if (mTarget != nullptr)
  85. return mTarget->getProperties().width;
  86. return 0;
  87. }
  88. UINT32 Viewport::getTargetHeight() const
  89. {
  90. if(mTarget != nullptr)
  91. return mTarget->getProperties().height;
  92. return 0;
  93. }
  94. SPtr<ct::CoreObject> Viewport::createCore() const
  95. {
  96. SPtr<ct::RenderTarget> targetCore;
  97. if (mTarget != nullptr)
  98. targetCore = mTarget->getCore();
  99. ct::Viewport* viewport = new (bs_alloc<ct::Viewport>())
  100. ct::Viewport(targetCore, mNormArea.x, mNormArea.y, mNormArea.width, mNormArea.height);
  101. SPtr<ct::Viewport> viewportPtr = bs_shared_ptr<ct::Viewport>(viewport);
  102. viewportPtr->_setThisPtr(viewportPtr);
  103. return viewportPtr;
  104. }
  105. CoreSyncData Viewport::syncToCore(FrameAlloc* allocator)
  106. {
  107. UINT32 size = 0;
  108. size += rttiGetElemSize(mNormArea);
  109. size += rttiGetElemSize(mClearFlags);
  110. size += rttiGetElemSize(mClearColorValue);
  111. size += rttiGetElemSize(mClearDepthValue);
  112. size += rttiGetElemSize(mClearStencilValue);
  113. size += sizeof(SPtr<ct::RenderTarget>);
  114. UINT8* buffer = allocator->alloc(size);
  115. char* dataPtr = (char*)buffer;
  116. dataPtr = rttiWriteElem(mNormArea, dataPtr);
  117. dataPtr = rttiWriteElem(mClearFlags, dataPtr);
  118. dataPtr = rttiWriteElem(mClearColorValue, dataPtr);
  119. dataPtr = rttiWriteElem(mClearDepthValue, dataPtr);
  120. dataPtr = rttiWriteElem(mClearStencilValue, dataPtr);
  121. SPtr<ct::RenderTarget>* rtPtr = new (dataPtr) SPtr<ct::RenderTarget>();
  122. if (mTarget != nullptr)
  123. *rtPtr = mTarget->getCore();
  124. else
  125. *rtPtr = nullptr;
  126. return CoreSyncData(buffer, size);
  127. }
  128. void Viewport::getCoreDependencies(Vector<CoreObject*>& dependencies)
  129. {
  130. if (mTarget != nullptr)
  131. dependencies.push_back(mTarget.get());
  132. }
  133. SPtr<Viewport> Viewport::create(const SPtr<RenderTarget>& target, float x, float y, float width, float height)
  134. {
  135. Viewport* viewport = new (bs_alloc<Viewport>()) Viewport(target, x, y, width, height);
  136. SPtr<Viewport> viewportPtr = bs_core_ptr<Viewport>(viewport);
  137. viewportPtr->_setThisPtr(viewportPtr);
  138. viewportPtr->initialize();
  139. return viewportPtr;
  140. }
  141. SPtr<Viewport> Viewport::createEmpty()
  142. {
  143. Viewport* viewport = new (bs_alloc<Viewport>()) Viewport();
  144. SPtr<Viewport> viewportPtr = bs_core_ptr<Viewport>(viewport);
  145. viewportPtr->_setThisPtr(viewportPtr);
  146. return viewportPtr;
  147. }
  148. RTTITypeBase* Viewport::getRTTIStatic()
  149. {
  150. return ViewportRTTI::instance();
  151. }
  152. RTTITypeBase* Viewport::getRTTI() const
  153. {
  154. return Viewport::getRTTIStatic();
  155. }
  156. namespace ct
  157. {
  158. Viewport::Viewport(const SPtr<RenderTarget>& target, float x, float y, float width, float height)
  159. :ViewportBase(x, y, width, height), mTarget(target)
  160. {
  161. }
  162. SPtr<Viewport> Viewport::create(const SPtr<RenderTarget>& target, float x, float y, float width, float height)
  163. {
  164. Viewport* viewport = new (bs_alloc<Viewport>()) Viewport(target, x, y, width, height);
  165. SPtr<Viewport> viewportPtr = bs_shared_ptr<Viewport>(viewport);
  166. viewportPtr->_setThisPtr(viewportPtr);
  167. viewportPtr->initialize();
  168. return viewportPtr;
  169. }
  170. UINT32 Viewport::getTargetWidth() const
  171. {
  172. if (mTarget != nullptr)
  173. return mTarget->getProperties().width;
  174. return 0;
  175. }
  176. UINT32 Viewport::getTargetHeight() const
  177. {
  178. if (mTarget != nullptr)
  179. return mTarget->getProperties().height;
  180. return 0;
  181. }
  182. void Viewport::syncToCore(const CoreSyncData& data)
  183. {
  184. char* dataPtr = (char*)data.getBuffer();
  185. dataPtr = rttiReadElem(mNormArea, dataPtr);
  186. dataPtr = rttiReadElem(mClearFlags, dataPtr);
  187. dataPtr = rttiReadElem(mClearColorValue, dataPtr);
  188. dataPtr = rttiReadElem(mClearDepthValue, dataPtr);
  189. dataPtr = rttiReadElem(mClearStencilValue, dataPtr);
  190. SPtr<RenderTarget>* rtPtr = (SPtr<RenderTarget>*)dataPtr;
  191. mTarget = *rtPtr;
  192. rtPtr->~SPtr<RenderTarget>();
  193. }
  194. }
  195. }