BsHandleDrawManager.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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(const HCamera& camera)
  17. :mCamera(camera)
  18. {
  19. mSceneRenderTarget = mCamera->getViewport()->getTarget();
  20. mDrawHelper = bs_new<DrawHelper>();
  21. mSolidMaterial.material = BuiltinEditorResources::instance().createSolidGizmoMat();
  22. mWireMaterial.material = BuiltinEditorResources::instance().createWireGizmoMat();
  23. mSolidMaterial.proxy = mSolidMaterial.material->_createProxy();
  24. mWireMaterial.proxy = mWireMaterial.material->_createProxy();
  25. gCoreAccessor().queueCommand(std::bind(&HandleDrawManager::initializeCore, this));
  26. }
  27. HandleDrawManager::~HandleDrawManager()
  28. {
  29. bs_delete(mDrawHelper);
  30. if (mSolidMesh != nullptr)
  31. mDrawHelper->releaseSolidMesh(mSolidMesh);
  32. if (mWireMesh != nullptr)
  33. mDrawHelper->releaseWireMesh(mWireMesh);
  34. }
  35. void HandleDrawManager::initializeCore()
  36. {
  37. THROW_IF_NOT_CORE_THREAD;
  38. // TODO - Make a better interface when dealing with parameters through proxies?
  39. {
  40. MaterialProxyPtr proxy = mWireMaterial.proxy;
  41. GpuParamsPtr vertParams = proxy->params[proxy->passes[0].vertexProgParamsIdx];
  42. vertParams->getParam("matViewProj", mWireMaterial.mViewProj);
  43. }
  44. {
  45. MaterialProxyPtr proxy = mSolidMaterial.proxy;
  46. GpuParamsPtr vertParams = proxy->params[proxy->passes[0].vertexProgParamsIdx];
  47. vertParams->getParam("matViewProj", mSolidMaterial.mViewProj);
  48. vertParams->getParam("matViewIT", mSolidMaterial.mViewIT);
  49. }
  50. RendererPtr activeRenderer = RendererManager::instance().getActive();
  51. activeRenderer->onCorePostRenderViewport.connect(std::bind(&HandleDrawManager::coreRender, this, _1));
  52. }
  53. void HandleDrawManager::setColor(const Color& color)
  54. {
  55. mDrawHelper->setColor(color);
  56. }
  57. void HandleDrawManager::setTransform(const Matrix4& transform)
  58. {
  59. mDrawHelper->setTransform(transform);
  60. }
  61. void HandleDrawManager::drawCube(const Vector3& position, const Vector3& extents)
  62. {
  63. mDrawHelper->cube(position, extents);
  64. }
  65. void HandleDrawManager::drawSphere(const Vector3& position, float radius)
  66. {
  67. mDrawHelper->sphere(position, radius);
  68. }
  69. void HandleDrawManager::drawWireCube(const Vector3& position, const Vector3& extents)
  70. {
  71. mDrawHelper->wireCube(position, extents);
  72. }
  73. void HandleDrawManager::drawWireSphere(const Vector3& position, float radius)
  74. {
  75. mDrawHelper->wireSphere(position, radius);
  76. }
  77. void HandleDrawManager::drawCone(const Vector3& base, const Vector3& normal, float height, float radius)
  78. {
  79. mDrawHelper->cone(base, normal, height, radius);
  80. }
  81. void HandleDrawManager::drawLine(const Vector3& start, const Vector3& end)
  82. {
  83. mDrawHelper->line(start, end);
  84. }
  85. void HandleDrawManager::drawDisc(const Vector3& position, const Vector3& normal, float radius)
  86. {
  87. mDrawHelper->disc(position, normal, radius);
  88. }
  89. void HandleDrawManager::drawWireDisc(const Vector3& position, const Vector3& normal, float radius)
  90. {
  91. mDrawHelper->wireDisc(position, normal, radius);
  92. }
  93. void HandleDrawManager::drawArc(const Vector3& position, const Vector3& normal, float radius, Degree startAngle, Degree amountAngle)
  94. {
  95. mDrawHelper->arc(position, normal, radius, startAngle, amountAngle);
  96. }
  97. void HandleDrawManager::drawWireArc(const Vector3& position, const Vector3& normal, float radius, Degree startAngle, Degree amountAngle)
  98. {
  99. mDrawHelper->wireArc(position, normal, radius, startAngle, amountAngle);
  100. }
  101. void HandleDrawManager::drawRect(const Rect3& area)
  102. {
  103. mDrawHelper->rectangle(area);
  104. }
  105. void HandleDrawManager::draw()
  106. {
  107. if (mSolidMesh != nullptr)
  108. mDrawHelper->releaseSolidMesh(mSolidMesh);
  109. if (mWireMesh != nullptr)
  110. mDrawHelper->releaseWireMesh(mWireMesh);
  111. mSolidMesh = mDrawHelper->buildSolidMesh();
  112. mWireMesh = mDrawHelper->buildWireMesh();
  113. MeshProxyPtr solidMeshProxy = mSolidMesh->_createProxy(0);
  114. MeshProxyPtr wireMeshProxy = mWireMesh->_createProxy(0);
  115. gCoreAccessor().queueCommand(std::bind(&HandleDrawManager::coreUpdateData, this, solidMeshProxy, wireMeshProxy));
  116. mDrawHelper->clear();
  117. }
  118. void HandleDrawManager::coreUpdateData(const MeshProxyPtr& solidMeshProxy, const MeshProxyPtr& wireMeshProxy)
  119. {
  120. mSolidMeshProxy = solidMeshProxy;
  121. mWireMeshProxy = wireMeshProxy;
  122. }
  123. void HandleDrawManager::coreRender(const CameraProxy& camera)
  124. {
  125. if (camera.viewport.getTarget() != mSceneRenderTarget)
  126. return;
  127. float width = (float)mSceneRenderTarget->getCore()->getProperties().getWidth();
  128. float height = (float)mSceneRenderTarget->getCore()->getProperties().getHeight();
  129. Rect2 normArea = camera.viewport.getNormArea();
  130. Rect2I screenArea;
  131. screenArea.x = (int)(normArea.x * width);
  132. screenArea.y = (int)(normArea.y * height);
  133. screenArea.width = (int)(normArea.width * width);
  134. screenArea.height = (int)(normArea.height * height);
  135. coreRenderSolid(camera.viewMatrix, camera.projMatrix, mSolidMeshProxy);
  136. coreRenderWire(camera.viewMatrix, camera.projMatrix, mWireMeshProxy);
  137. }
  138. void HandleDrawManager::coreRenderSolid(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr meshProxy)
  139. {
  140. THROW_IF_NOT_CORE_THREAD;
  141. Matrix4 viewProjMat = projMatrix * viewMatrix;
  142. Matrix4 viewIT = viewMatrix.inverse().transpose();
  143. mSolidMaterial.mViewProj.set(viewProjMat);
  144. mSolidMaterial.mViewIT.set(viewIT);
  145. Renderer::setPass(*mSolidMaterial.proxy, 0);
  146. Renderer::draw(*meshProxy);
  147. }
  148. void HandleDrawManager::coreRenderWire(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr meshProxy)
  149. {
  150. THROW_IF_NOT_CORE_THREAD;
  151. Matrix4 viewProjMat = projMatrix * viewMatrix;
  152. Matrix4 viewIT = viewMatrix.inverse().transpose();
  153. mWireMaterial.mViewProj.set(viewProjMat);
  154. Renderer::setPass(*mWireMaterial.proxy, 0);
  155. Renderer::draw(*meshProxy);
  156. }
  157. }