BsRendererUtility.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "BsRendererUtility.h"
  2. #include "BsRenderAPI.h"
  3. #include "BsMesh.h"
  4. #include "BsVertexDataDesc.h"
  5. #include "BsMaterial.h"
  6. #include "BsPass.h"
  7. #include "BsBlendState.h"
  8. #include "BsDepthStencilState.h"
  9. #include "BsRasterizerState.h"
  10. namespace BansheeEngine
  11. {
  12. RendererUtility::RendererUtility()
  13. {
  14. VertexDataDescPtr vertexDesc = bs_shared_ptr_new<VertexDataDesc>();
  15. vertexDesc->addVertElem(VET_FLOAT3, VES_POSITION);
  16. MeshDataPtr meshData = bs_shared_ptr_new<MeshData>(4, 6, vertexDesc);
  17. auto vecIter = meshData->getVec3DataIter(VES_POSITION);
  18. vecIter.setValue(Vector3(-1.0f, 1.0, 0));
  19. vecIter.setValue(Vector3(1.0f, 1.0f, 0));
  20. vecIter.setValue(Vector3(-1.0f, -1.0f, 0));
  21. vecIter.setValue(Vector3(1.0f, -1.0f, 0));
  22. auto indices = meshData->getIndices32();
  23. indices[0] = 0;
  24. indices[1] = 1;
  25. indices[2] = 2;
  26. indices[3] = 1;
  27. indices[4] = 3;
  28. indices[5] = 2;
  29. mFullScreenQuadMesh = MeshCore::create(meshData);
  30. }
  31. RendererUtility::~RendererUtility()
  32. {
  33. }
  34. void RendererUtility::setPass(const SPtr<MaterialCore>& material, UINT32 passIdx)
  35. {
  36. RenderAPICore& rs = RenderAPICore::instance();
  37. SPtr<PassCore> pass = material->getPass(passIdx);
  38. SPtr<PassParametersCore> passParams = material->getPassParameters(passIdx);
  39. struct StageData
  40. {
  41. GpuProgramType type;
  42. bool enable;
  43. SPtr<GpuParamsCore> params;
  44. SPtr<GpuProgramCore> program;
  45. };
  46. const UINT32 numStages = 6;
  47. StageData stages[numStages] =
  48. {
  49. {
  50. GPT_VERTEX_PROGRAM, pass->hasVertexProgram(),
  51. passParams->mVertParams, pass->getVertexProgram()
  52. },
  53. {
  54. GPT_FRAGMENT_PROGRAM, pass->hasFragmentProgram(),
  55. passParams->mFragParams, pass->getFragmentProgram()
  56. },
  57. {
  58. GPT_GEOMETRY_PROGRAM, pass->hasGeometryProgram(),
  59. passParams->mGeomParams, pass->getGeometryProgram()
  60. },
  61. {
  62. GPT_HULL_PROGRAM, pass->hasHullProgram(),
  63. passParams->mHullParams, pass->getHullProgram()
  64. },
  65. {
  66. GPT_DOMAIN_PROGRAM, pass->hasDomainProgram(),
  67. passParams->mDomainParams, pass->getDomainProgram()
  68. },
  69. {
  70. GPT_COMPUTE_PROGRAM, pass->hasComputeProgram(),
  71. passParams->mComputeParams, pass->getComputeProgram()
  72. }
  73. };
  74. for (UINT32 i = 0; i < numStages; i++)
  75. {
  76. const StageData& stage = stages[i];
  77. if (stage.enable)
  78. {
  79. rs.bindGpuProgram(stage.program);
  80. rs.setGpuParams(stage.type, stage.params);
  81. }
  82. else
  83. rs.unbindGpuProgram(stage.type);
  84. }
  85. // Set up non-texture related pass settings
  86. if (pass->getBlendState() != nullptr)
  87. rs.setBlendState(pass->getBlendState());
  88. else
  89. rs.setBlendState(BlendStateCore::getDefault());
  90. if (pass->getDepthStencilState() != nullptr)
  91. rs.setDepthStencilState(pass->getDepthStencilState(), pass->getStencilRefValue());
  92. else
  93. rs.setDepthStencilState(DepthStencilStateCore::getDefault(), pass->getStencilRefValue());
  94. if (pass->getRasterizerState() != nullptr)
  95. rs.setRasterizerState(pass->getRasterizerState());
  96. else
  97. rs.setRasterizerState(RasterizerStateCore::getDefault());
  98. }
  99. void RendererUtility::draw(const SPtr<MeshCoreBase>& mesh, const SubMesh& subMesh)
  100. {
  101. RenderAPICore& rs = RenderAPICore::instance();
  102. const MeshProperties& meshProps = mesh->getProperties();
  103. std::shared_ptr<VertexData> vertexData = mesh->getVertexData();
  104. rs.setVertexDeclaration(vertexData->vertexDeclaration);
  105. auto& vertexBuffers = vertexData->getBuffers();
  106. if (vertexBuffers.size() > 0)
  107. {
  108. SPtr<VertexBufferCore> buffers[MAX_BOUND_VERTEX_BUFFERS];
  109. UINT32 endSlot = 0;
  110. UINT32 startSlot = MAX_BOUND_VERTEX_BUFFERS;
  111. for (auto iter = vertexBuffers.begin(); iter != vertexBuffers.end(); ++iter)
  112. {
  113. if (iter->first >= MAX_BOUND_VERTEX_BUFFERS)
  114. BS_EXCEPT(InvalidParametersException, "Buffer index out of range");
  115. startSlot = std::min(iter->first, startSlot);
  116. endSlot = std::max(iter->first, endSlot);
  117. }
  118. for (auto iter = vertexBuffers.begin(); iter != vertexBuffers.end(); ++iter)
  119. {
  120. buffers[iter->first - startSlot] = iter->second;
  121. }
  122. rs.setVertexBuffers(startSlot, buffers, endSlot - startSlot + 1);
  123. }
  124. rs.setDrawOperation(subMesh.drawOp);
  125. SPtr<IndexBufferCore> indexBuffer = mesh->getIndexBuffer();
  126. UINT32 indexCount = subMesh.indexCount;
  127. rs.setIndexBuffer(indexBuffer);
  128. rs.drawIndexed(subMesh.indexOffset + mesh->getIndexOffset(), indexCount, mesh->getVertexOffset(), vertexData->vertexCount);
  129. mesh->_notifyUsedOnGPU();
  130. }
  131. void RendererUtility::drawScreenQuad(const CameraCore& camera)
  132. {
  133. // Note: Consider drawing the quad using a single large triangle for possibly better performance
  134. Vector3 vertices[4];
  135. // TODO - Set up vertices
  136. SPtr<VertexBufferCore> vb = mFullScreenQuadMesh->getVertexData()->getBuffer(0);
  137. vb->writeData(0, sizeof(vertices), vertices, BufferWriteType::Discard);
  138. RenderAPICore& rapi = RenderAPICore::instance();
  139. draw(mFullScreenQuadMesh, mFullScreenQuadMesh->getProperties().getSubMesh());
  140. }
  141. RendererUtility& gRendererUtility()
  142. {
  143. return RendererUtility::instance();
  144. }
  145. }