#include "BsTechnique.h" #include "BsException.h" #include "BsRenderAPI.h" #include "BsRendererManager.h" #include "BsPass.h" #include "BsCoreRenderer.h" #include "BsFrameAlloc.h" #include "BsTechniqueRTTI.h" namespace BansheeEngine { TechniqueBase::TechniqueBase(const String& renderSystem, const String& renderer) :mRenderSystem(renderSystem), mRenderer(renderer) { } bool TechniqueBase::isSupported() const { if (RenderAPICore::instancePtr()->getName() == mRenderSystem && (RendererManager::instance().getActive()->getName() == mRenderer || RendererManager::getCoreRendererName() == mRenderer)) { return true; } return false; } template TTechnique::TTechnique(const String& renderSystem, const String& renderer, const Vector>& passes) : TechniqueBase(renderSystem, renderer), mPasses(passes) { } template TTechnique::TTechnique() : TechniqueBase("", "") { } template SPtr::PassType> TTechnique::getPass(UINT32 idx) const { if (idx < 0 || idx >= (UINT32)mPasses.size()) BS_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx)); return mPasses[idx]; } template class TTechnique < false > ; template class TTechnique < true >; TechniqueCore::TechniqueCore(const String& renderSystem, const String& renderer, const Vector>& passes) :TTechnique(renderSystem, renderer, passes) { } SPtr TechniqueCore::create(const String& renderSystem, const String& renderer, const Vector>& passes) { TechniqueCore* technique = new (bs_alloc()) TechniqueCore(renderSystem, renderer, passes); SPtr techniquePtr = bs_shared_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } Technique::Technique(const String& renderSystem, const String& renderer, const Vector>& passes) :TTechnique(renderSystem, renderer, passes) { } Technique::Technique() : TTechnique() { } SPtr Technique::getCore() const { return std::static_pointer_cast(mCoreSpecific); } SPtr Technique::createCore() const { Vector> passes; for (auto& pass : mPasses) passes.push_back(pass->getCore()); TechniqueCore* technique = new (bs_alloc()) TechniqueCore(mRenderSystem, mRenderer, passes); SPtr techniquePtr = bs_shared_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); return techniquePtr; } void Technique::getCoreDependencies(Vector>& dependencies) { for (auto& pass : mPasses) dependencies.push_back(pass); } TechniquePtr Technique::create(const String& renderSystem, const String& renderer, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(renderSystem, renderer, passes); TechniquePtr techniquePtr = bs_core_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } TechniquePtr Technique::createEmpty() { Technique* technique = new (bs_alloc()) Technique(); TechniquePtr techniquePtr = bs_core_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); return techniquePtr; } RTTITypeBase* Technique::getRTTIStatic() { return TechniqueRTTI::instance(); } RTTITypeBase* Technique::getRTTI() const { return Technique::getRTTIStatic(); } }