BsHandleDrawManager.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include "BsHandleDrawManager.h"
  2. #include "BsDrawHelper.h"
  3. #include "BsMaterial.h"
  4. #include "BsBuiltinEditorResources.h"
  5. #include "BsCoreThread.h"
  6. #include "BsRendererManager.h"
  7. #include "BsRenderer.h"
  8. #include "BsTransientMesh.h"
  9. #include "BsCamera.h"
  10. using namespace std::placeholders;
  11. namespace BansheeEngine
  12. {
  13. const UINT32 HandleDrawManager::SPHERE_QUALITY = 1;
  14. const UINT32 HandleDrawManager::WIRE_SPHERE_QUALITY = 10;
  15. const UINT32 HandleDrawManager::ARC_QUALITY = 10;
  16. HandleDrawManager::HandleDrawManager()
  17. :mCore(nullptr)
  18. {
  19. mDrawHelper = bs_new<DrawHelper>();
  20. HMaterial solidMaterial = BuiltinEditorResources::instance().createSolidGizmoMat();
  21. HMaterial wireMaterial = BuiltinEditorResources::instance().createWireGizmoMat();
  22. MaterialProxyPtr solidMaterialProxy = solidMaterial->_createProxy();
  23. MaterialProxyPtr wireMaterialProxy = wireMaterial->_createProxy();
  24. mCore = bs_new<HandleDrawManagerCore>(HandleDrawManagerCore::PrivatelyConstruct());
  25. gCoreAccessor().queueCommand(std::bind(&HandleDrawManager::initializeCore, this, wireMaterialProxy, solidMaterialProxy));
  26. }
  27. HandleDrawManager::~HandleDrawManager()
  28. {
  29. if (mSolidMesh != nullptr)
  30. mDrawHelper->releaseSolidMesh(mSolidMesh);
  31. if (mWireMesh != nullptr)
  32. mDrawHelper->releaseWireMesh(mWireMesh);
  33. bs_delete(mDrawHelper);
  34. gCoreAccessor().queueCommand(std::bind(&HandleDrawManager::destroyCore, this, mCore));
  35. }
  36. void HandleDrawManager::initializeCore(const MaterialProxyPtr& wireMatProxy, const MaterialProxyPtr& solidMatProxy)
  37. {
  38. THROW_IF_NOT_CORE_THREAD;
  39. mCore->initialize(wireMatProxy, solidMatProxy);
  40. }
  41. void HandleDrawManager::destroyCore(HandleDrawManagerCore* core)
  42. {
  43. THROW_IF_NOT_CORE_THREAD;
  44. bs_delete(core);
  45. }
  46. void HandleDrawManager::setColor(const Color& color)
  47. {
  48. mDrawHelper->setColor(color);
  49. }
  50. void HandleDrawManager::setTransform(const Matrix4& transform)
  51. {
  52. mDrawHelper->setTransform(transform);
  53. }
  54. void HandleDrawManager::drawCube(const Vector3& position, const Vector3& extents)
  55. {
  56. mDrawHelper->cube(position, extents);
  57. }
  58. void HandleDrawManager::drawSphere(const Vector3& position, float radius)
  59. {
  60. mDrawHelper->sphere(position, radius);
  61. }
  62. void HandleDrawManager::drawWireCube(const Vector3& position, const Vector3& extents)
  63. {
  64. mDrawHelper->wireCube(position, extents);
  65. }
  66. void HandleDrawManager::drawWireSphere(const Vector3& position, float radius)
  67. {
  68. mDrawHelper->wireSphere(position, radius);
  69. }
  70. void HandleDrawManager::drawCone(const Vector3& base, const Vector3& normal, float height, float radius)
  71. {
  72. mDrawHelper->cone(base, normal, height, radius);
  73. }
  74. void HandleDrawManager::drawLine(const Vector3& start, const Vector3& end)
  75. {
  76. mDrawHelper->line(start, end);
  77. }
  78. void HandleDrawManager::drawDisc(const Vector3& position, const Vector3& normal, float radius)
  79. {
  80. mDrawHelper->disc(position, normal, radius);
  81. }
  82. void HandleDrawManager::drawWireDisc(const Vector3& position, const Vector3& normal, float radius)
  83. {
  84. mDrawHelper->wireDisc(position, normal, radius);
  85. }
  86. void HandleDrawManager::drawArc(const Vector3& position, const Vector3& normal, float radius, Degree startAngle, Degree amountAngle)
  87. {
  88. mDrawHelper->arc(position, normal, radius, startAngle, amountAngle);
  89. }
  90. void HandleDrawManager::drawWireArc(const Vector3& position, const Vector3& normal, float radius, Degree startAngle, Degree amountAngle)
  91. {
  92. mDrawHelper->wireArc(position, normal, radius, startAngle, amountAngle);
  93. }
  94. void HandleDrawManager::drawRect(const Rect3& area)
  95. {
  96. mDrawHelper->rectangle(area);
  97. }
  98. void HandleDrawManager::draw(const HCamera& camera)
  99. {
  100. if (mSolidMesh != nullptr)
  101. mDrawHelper->releaseSolidMesh(mSolidMesh);
  102. if (mWireMesh != nullptr)
  103. mDrawHelper->releaseWireMesh(mWireMesh);
  104. mSolidMesh = mDrawHelper->buildSolidMesh();
  105. mWireMesh = mDrawHelper->buildWireMesh();
  106. MeshProxyPtr solidMeshProxy = mSolidMesh->_createProxy(0);
  107. MeshProxyPtr wireMeshProxy = mWireMesh->_createProxy(0);
  108. RenderTargetPtr sceneRenderTarget = camera->getViewport()->getTarget();
  109. gCoreAccessor().queueCommand(std::bind(&HandleDrawManagerCore::updateData, mCore,
  110. sceneRenderTarget, solidMeshProxy, wireMeshProxy));
  111. mDrawHelper->clear();
  112. }
  113. void HandleDrawManagerCore::initialize(const MaterialProxyPtr& wireMatProxy, const MaterialProxyPtr& solidMatProxy)
  114. {
  115. // TODO - Make a better interface when dealing with parameters through proxies?
  116. {
  117. mWireMaterial.proxy = wireMatProxy;
  118. GpuParamsPtr vertParams = wireMatProxy->params[wireMatProxy->passes[0].vertexProgParamsIdx];
  119. vertParams->getParam("matViewProj", mWireMaterial.mViewProj);
  120. }
  121. {
  122. mSolidMaterial.proxy = solidMatProxy;
  123. GpuParamsPtr vertParams = solidMatProxy->params[solidMatProxy->passes[0].vertexProgParamsIdx];
  124. vertParams->getParam("matViewProj", mSolidMaterial.mViewProj);
  125. }
  126. RendererPtr activeRenderer = RendererManager::instance().getActive();
  127. activeRenderer->onCorePostRenderViewport.connect(std::bind(&HandleDrawManagerCore::render, this, _1));
  128. }
  129. void HandleDrawManagerCore::updateData(const RenderTargetPtr& rt, const MeshProxyPtr& solidMeshProxy, const MeshProxyPtr& wireMeshProxy)
  130. {
  131. mSceneRenderTarget = rt;
  132. mSolidMeshProxy = solidMeshProxy;
  133. mWireMeshProxy = wireMeshProxy;
  134. }
  135. void HandleDrawManagerCore::render(const CameraProxy& camera)
  136. {
  137. if (camera.viewport.getTarget() != mSceneRenderTarget)
  138. return;
  139. float width = (float)mSceneRenderTarget->getCore()->getProperties().getWidth();
  140. float height = (float)mSceneRenderTarget->getCore()->getProperties().getHeight();
  141. Rect2 normArea = camera.viewport.getNormArea();
  142. Rect2I screenArea;
  143. screenArea.x = (int)(normArea.x * width);
  144. screenArea.y = (int)(normArea.y * height);
  145. screenArea.width = (int)(normArea.width * width);
  146. screenArea.height = (int)(normArea.height * height);
  147. renderSolid(camera.viewMatrix, camera.projMatrix, mSolidMeshProxy);
  148. renderWire(camera.viewMatrix, camera.projMatrix, mWireMeshProxy);
  149. }
  150. void HandleDrawManagerCore::renderSolid(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr meshProxy)
  151. {
  152. THROW_IF_NOT_CORE_THREAD;
  153. Matrix4 viewProjMat = projMatrix * viewMatrix;
  154. mSolidMaterial.mViewProj.set(viewProjMat);
  155. Renderer::setPass(*mSolidMaterial.proxy, 0);
  156. Renderer::draw(*meshProxy);
  157. }
  158. void HandleDrawManagerCore::renderWire(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr meshProxy)
  159. {
  160. THROW_IF_NOT_CORE_THREAD;
  161. Matrix4 viewProjMat = projMatrix * viewMatrix;
  162. mWireMaterial.mViewProj.set(viewProjMat);
  163. Renderer::setPass(*mWireMaterial.proxy, 0);
  164. Renderer::draw(*meshProxy);
  165. }
  166. }