BsViewport.cpp 6.1 KB

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