//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #include "Material/BsTechnique.h" #include "Error/BsException.h" #include "RenderAPI/BsRenderAPI.h" #include "Renderer/BsRendererManager.h" #include "Material/BsPass.h" #include "Renderer/BsRenderer.h" #include "Allocators/BsFrameAlloc.h" #include "RTTI/BsTechniqueRTTI.h" namespace bs { TechniqueBase::TechniqueBase(const String& language, const StringID& renderer, const Vector& tags) :mLanguage(language), mRenderer(renderer), mTags(tags) { } bool TechniqueBase::isSupported() const { if ((ct::RenderAPI::instancePtr()->getShadingLanguageName() == mLanguage || mLanguage == "Any") && (RendererManager::instance().getActive()->getName() == mRenderer || RendererAny == mRenderer)) { return true; } return false; } bool TechniqueBase::hasTag(const StringID& tag) { for(auto& entry : mTags) { if (entry == tag) return true; } return false; } template TTechnique::TTechnique(const String& language, const StringID& renderer, const Vector& tags, const Vector>& passes) : TechniqueBase(language, renderer, tags), 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 >; Technique::Technique(const String& language, const StringID& renderer, const Vector& tags, const Vector>& passes) :TTechnique(language, renderer, tags, 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()); ct::Technique* technique = new (bs_alloc()) ct::Technique(mLanguage, mRenderer, mTags, 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.get()); } SPtr Technique::create(const String& language, const StringID& renderer, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, renderer, {}, passes); SPtr techniquePtr = bs_core_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } SPtr Technique::create(const String& language, const StringID& renderer, const Vector& tags, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, renderer, tags, passes); SPtr techniquePtr = bs_core_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } SPtr Technique::createEmpty() { Technique* technique = new (bs_alloc()) Technique(); SPtr techniquePtr = bs_core_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); return techniquePtr; } RTTITypeBase* Technique::getRTTIStatic() { return TechniqueRTTI::instance(); } RTTITypeBase* Technique::getRTTI() const { return Technique::getRTTIStatic(); } namespace ct { Technique::Technique(const String& language, const StringID& renderer, const Vector& tags, const Vector>& passes) :TTechnique(language, renderer, tags, passes) { } SPtr Technique::create(const String& language, const StringID& renderer, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, renderer, {}, passes); SPtr techniquePtr = bs_shared_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } SPtr Technique::create(const String& language, const StringID& renderer, const Vector& tags, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, renderer, tags, passes); SPtr techniquePtr = bs_shared_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } } }