BsTechnique.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Material/BsTechnique.h"
  4. #include "Error/BsException.h"
  5. #include "RenderAPI/BsRenderAPI.h"
  6. #include "Renderer/BsRendererManager.h"
  7. #include "Material/BsPass.h"
  8. #include "Renderer/BsRenderer.h"
  9. #include "Allocators/BsFrameAlloc.h"
  10. #include "RTTI/BsTechniqueRTTI.h"
  11. namespace bs
  12. {
  13. TechniqueBase::TechniqueBase(const String& language, const StringID& renderer, const Vector<StringID>& tags)
  14. :mLanguage(language), mRenderer(renderer), mTags(tags)
  15. {
  16. }
  17. bool TechniqueBase::isSupported() const
  18. {
  19. if ((ct::RenderAPI::instancePtr()->getShadingLanguageName() == mLanguage || mLanguage == "Any") &&
  20. (RendererManager::instance().getActive()->getName() == mRenderer ||
  21. RendererAny == mRenderer))
  22. {
  23. return true;
  24. }
  25. return false;
  26. }
  27. bool TechniqueBase::hasTag(const StringID& tag)
  28. {
  29. for(auto& entry : mTags)
  30. {
  31. if (entry == tag)
  32. return true;
  33. }
  34. return false;
  35. }
  36. template<bool Core>
  37. TTechnique<Core>::TTechnique(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  38. const Vector<SPtr<PassType>>& passes)
  39. : TechniqueBase(language, renderer, tags), mPasses(passes)
  40. { }
  41. template<bool Core>
  42. TTechnique<Core>::TTechnique()
  43. : TechniqueBase("", "", {})
  44. { }
  45. template<bool Core>
  46. SPtr<typename TTechnique<Core>::PassType> TTechnique<Core>::getPass(UINT32 idx) const
  47. {
  48. if (idx < 0 || idx >= (UINT32)mPasses.size())
  49. BS_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx));
  50. return mPasses[idx];
  51. }
  52. template class TTechnique < false > ;
  53. template class TTechnique < true >;
  54. Technique::Technique(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  55. const Vector<SPtr<Pass>>& passes)
  56. :TTechnique(language, renderer, tags, passes)
  57. { }
  58. Technique::Technique()
  59. : TTechnique()
  60. { }
  61. SPtr<ct::Technique> Technique::getCore() const
  62. {
  63. return std::static_pointer_cast<ct::Technique>(mCoreSpecific);
  64. }
  65. SPtr<ct::CoreObject> Technique::createCore() const
  66. {
  67. Vector<SPtr<ct::Pass>> passes;
  68. for (auto& pass : mPasses)
  69. passes.push_back(pass->getCore());
  70. ct::Technique* technique = new (bs_alloc<ct::Technique>()) ct::Technique(mLanguage, mRenderer, mTags, passes);
  71. SPtr<ct::Technique> techniquePtr = bs_shared_ptr<ct::Technique>(technique);
  72. techniquePtr->_setThisPtr(techniquePtr);
  73. return techniquePtr;
  74. }
  75. void Technique::getCoreDependencies(Vector<CoreObject*>& dependencies)
  76. {
  77. for (auto& pass : mPasses)
  78. dependencies.push_back(pass.get());
  79. }
  80. SPtr<Technique> Technique::create(const String& language, const StringID& renderer, const Vector<SPtr<Pass>>& passes)
  81. {
  82. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, {}, passes);
  83. SPtr<Technique> techniquePtr = bs_core_ptr<Technique>(technique);
  84. techniquePtr->_setThisPtr(techniquePtr);
  85. techniquePtr->initialize();
  86. return techniquePtr;
  87. }
  88. SPtr<Technique> Technique::create(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  89. const Vector<SPtr<Pass>>& passes)
  90. {
  91. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, tags, passes);
  92. SPtr<Technique> techniquePtr = bs_core_ptr<Technique>(technique);
  93. techniquePtr->_setThisPtr(techniquePtr);
  94. techniquePtr->initialize();
  95. return techniquePtr;
  96. }
  97. SPtr<Technique> Technique::createEmpty()
  98. {
  99. Technique* technique = new (bs_alloc<Technique>()) Technique();
  100. SPtr<Technique> techniquePtr = bs_core_ptr<Technique>(technique);
  101. techniquePtr->_setThisPtr(techniquePtr);
  102. return techniquePtr;
  103. }
  104. RTTITypeBase* Technique::getRTTIStatic()
  105. {
  106. return TechniqueRTTI::instance();
  107. }
  108. RTTITypeBase* Technique::getRTTI() const
  109. {
  110. return Technique::getRTTIStatic();
  111. }
  112. namespace ct
  113. {
  114. Technique::Technique(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  115. const Vector<SPtr<Pass>>& passes)
  116. :TTechnique(language, renderer, tags, passes)
  117. { }
  118. SPtr<Technique> Technique::create(const String& language, const StringID& renderer,
  119. const Vector<SPtr<Pass>>& passes)
  120. {
  121. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, {}, passes);
  122. SPtr<Technique> techniquePtr = bs_shared_ptr<Technique>(technique);
  123. techniquePtr->_setThisPtr(techniquePtr);
  124. techniquePtr->initialize();
  125. return techniquePtr;
  126. }
  127. SPtr<Technique> Technique::create(const String& language, const StringID& renderer,
  128. const Vector<StringID>& tags, const Vector<SPtr<Pass>>& passes)
  129. {
  130. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, tags, passes);
  131. SPtr<Technique> techniquePtr = bs_shared_ptr<Technique>(technique);
  132. techniquePtr->_setThisPtr(techniquePtr);
  133. techniquePtr->initialize();
  134. return techniquePtr;
  135. }
  136. }
  137. }