BsTechnique.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 "RTTI/BsTechniqueRTTI.h"
  10. namespace bs
  11. {
  12. TechniqueBase::TechniqueBase(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  13. const ShaderVariation& variation)
  14. :mLanguage(language), mRenderer(renderer), mTags(tags), mVariation(variation)
  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 ShaderVariation& variation, const Vector<SPtr<PassType>>& passes)
  39. : TechniqueBase(language, renderer, tags, variation), mPasses(passes)
  40. { }
  41. template<bool Core>
  42. TTechnique<Core>::TTechnique()
  43. : TechniqueBase("", "", {}, ShaderVariation())
  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 ShaderVariation& variation, const Vector<SPtr<Pass>>& passes)
  56. :TTechnique(language, renderer, tags, variation, 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(
  71. mLanguage,
  72. mRenderer,
  73. mTags,
  74. mVariation,
  75. passes);
  76. SPtr<ct::Technique> techniquePtr = bs_shared_ptr<ct::Technique>(technique);
  77. techniquePtr->_setThisPtr(techniquePtr);
  78. return techniquePtr;
  79. }
  80. void Technique::getCoreDependencies(Vector<CoreObject*>& dependencies)
  81. {
  82. for (auto& pass : mPasses)
  83. dependencies.push_back(pass.get());
  84. }
  85. SPtr<Technique> Technique::create(const String& language, const StringID& renderer, const Vector<SPtr<Pass>>& passes)
  86. {
  87. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, {}, ShaderVariation(), passes);
  88. SPtr<Technique> techniquePtr = bs_core_ptr<Technique>(technique);
  89. techniquePtr->_setThisPtr(techniquePtr);
  90. techniquePtr->initialize();
  91. return techniquePtr;
  92. }
  93. SPtr<Technique> Technique::create(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  94. const ShaderVariation& variation, const Vector<SPtr<Pass>>& passes)
  95. {
  96. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, tags, variation, passes);
  97. SPtr<Technique> techniquePtr = bs_core_ptr<Technique>(technique);
  98. techniquePtr->_setThisPtr(techniquePtr);
  99. techniquePtr->initialize();
  100. return techniquePtr;
  101. }
  102. SPtr<Technique> Technique::createEmpty()
  103. {
  104. Technique* technique = new (bs_alloc<Technique>()) Technique();
  105. SPtr<Technique> techniquePtr = bs_core_ptr<Technique>(technique);
  106. techniquePtr->_setThisPtr(techniquePtr);
  107. return techniquePtr;
  108. }
  109. RTTITypeBase* Technique::getRTTIStatic()
  110. {
  111. return TechniqueRTTI::instance();
  112. }
  113. RTTITypeBase* Technique::getRTTI() const
  114. {
  115. return Technique::getRTTIStatic();
  116. }
  117. namespace ct
  118. {
  119. Technique::Technique(const String& language, const StringID& renderer, const Vector<StringID>& tags,
  120. const ShaderVariation& variation, const Vector<SPtr<Pass>>& passes)
  121. :TTechnique(language, renderer, tags, variation, passes)
  122. { }
  123. SPtr<Technique> Technique::create(const String& language, const StringID& renderer,
  124. const Vector<SPtr<Pass>>& passes)
  125. {
  126. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, {}, ShaderVariation(), passes);
  127. SPtr<Technique> techniquePtr = bs_shared_ptr<Technique>(technique);
  128. techniquePtr->_setThisPtr(techniquePtr);
  129. techniquePtr->initialize();
  130. return techniquePtr;
  131. }
  132. SPtr<Technique> Technique::create(const String& language, const StringID& renderer,
  133. const Vector<StringID>& tags, const ShaderVariation& variation, const Vector<SPtr<Pass>>& passes)
  134. {
  135. Technique* technique = new (bs_alloc<Technique>()) Technique(language, renderer, tags, variation, passes);
  136. SPtr<Technique> techniquePtr = bs_shared_ptr<Technique>(technique);
  137. techniquePtr->_setThisPtr(techniquePtr);
  138. techniquePtr->initialize();
  139. return techniquePtr;
  140. }
  141. }
  142. }