BsViewport.cpp 6.8 KB

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