CmTechnique.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "CmTechnique.h"
  2. #include "CmException.h"
  3. #include "CmRenderSystem.h"
  4. #include "CmRendererManager.h"
  5. #include "CmPass.h"
  6. #include "CmRenderer.h"
  7. #include "CmTechniqueRTTI.h"
  8. namespace CamelotEngine
  9. {
  10. Technique::Technique(const String& renderSystem, const String& renderer)
  11. :mRenderSystem(renderSystem), mRenderer(renderer)
  12. {
  13. }
  14. PassPtr Technique::addPass()
  15. {
  16. PassPtr newPass(CM_NEW(Pass, PoolAlloc) Pass(), &MemAllocDeleter<Pass, PoolAlloc>::deleter);
  17. mPasses.push_back(newPass);
  18. return newPass;
  19. }
  20. void Technique::removePass(UINT32 idx)
  21. {
  22. if(idx < 0 || idx >= mPasses.size())
  23. CM_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx));
  24. int count = 0;
  25. auto iter = mPasses.begin();
  26. while(count != idx)
  27. {
  28. ++count;
  29. ++iter;
  30. }
  31. mPasses.erase(iter);
  32. }
  33. PassPtr Technique::getPass(UINT32 idx) const
  34. {
  35. if(idx < 0 || idx >= mPasses.size())
  36. CM_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx));
  37. return mPasses[idx];
  38. }
  39. bool Technique::isSupported() const
  40. {
  41. if(RenderSystem::instancePtr()->getName() == mRenderSystem &&
  42. (RendererManager::instance().getActive()->getName() == mRenderer ||
  43. RendererManager::getCoreRendererName() == mRenderer))
  44. {
  45. return true;
  46. }
  47. return false;
  48. }
  49. RTTITypeBase* Technique::getRTTIStatic()
  50. {
  51. return TechniqueRTTI::instance();
  52. }
  53. RTTITypeBase* Technique::getRTTI() const
  54. {
  55. return Technique::getRTTIStatic();
  56. }
  57. }