//********************************** 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 "Managers/BsGpuProgramManager.h" #include "Private/RTTI/BsTechniqueRTTI.h" namespace bs { TechniqueBase::TechniqueBase(const String& language, const Vector& tags, const ShaderVariation& variation) :mLanguage(language), mTags(tags), mVariation(variation) { } bool TechniqueBase::isSupported() const { if (ct::GpuProgramManager::instance().isLanguageSupported(mLanguage) || mLanguage == "Any") 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 Vector& tags, const ShaderVariation& variation, const Vector>& passes) : TechniqueBase(language, tags, variation), mPasses(passes) { } template TTechnique::TTechnique() : TechniqueBase("", {}, ShaderVariation()) { } 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 Vector& tags, const ShaderVariation& variation, const Vector>& passes) :TTechnique(language, tags, variation, 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, mTags, mVariation, 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 Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, {}, ShaderVariation(), passes); SPtr techniquePtr = bs_core_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } SPtr Technique::create(const String& language, const Vector& tags, const ShaderVariation& variation, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, tags, variation, 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 Vector& tags, const ShaderVariation& variation, const Vector>& passes) :TTechnique(language, tags, variation, passes) { } SPtr Technique::create(const String& language, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, {}, ShaderVariation(), passes); SPtr techniquePtr = bs_shared_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } SPtr Technique::create(const String& language, const Vector& tags, const ShaderVariation& variation, const Vector>& passes) { Technique* technique = new (bs_alloc()) Technique(language, tags, variation, passes); SPtr techniquePtr = bs_shared_ptr(technique); techniquePtr->_setThisPtr(techniquePtr); techniquePtr->initialize(); return techniquePtr; } } }