ea::shared_ptr<Technique> Technique::CloneWithDefines(const ea::string& vsDefines, const ea::string& psDefines) { // Return self if no actual defines if (vsDefines.empty() && psDefines.empty()) return ea::shared_ptr<Technique>(this); ea::pair<StringHash, StringHash> key = ea::make_pair(StringHash(vsDefines), StringHash(psDefines)); // Return existing if possible auto i = cloneTechniques_.find(key); if (i != cloneTechniques_.end()) return i->second; // Set same name as the original for the clones to ensure proper serialization of the material. This should not be a problem // since the clones are never stored to the resource cache i = cloneTechniques_.insert(ea::make_pair(key, Clone(GetName()))).first; for (auto j = i->second->passes_.begin(); j != i->second->passes_.end(); ++j) { Pass* pass = (*j); if (!pass) continue; if (!vsDefines.empty()) pass->SetVertexShaderDefines(pass->GetVertexShaderDefines() + " " + vsDefines); if (!psDefines.empty()) pass->SetPixelShaderDefines(pass->GetPixelShaderDefines() + " " + psDefines); } return i->second; }
SharedPtr<Technique> Technique::CloneWithDefines(const String& vsDefines, const String& psDefines) { // Return self if no actual defines if (vsDefines.Empty() && psDefines.Empty()) return SharedPtr<Technique>(this); Pair<StringHash, StringHash> key = MakePair(StringHash(vsDefines), StringHash(psDefines)); // Return existing if possible HashMap<Pair<StringHash, StringHash>, SharedPtr<Technique> >::Iterator i = cloneTechniques_.Find(key); if (i != cloneTechniques_.End()) return i->second_; // Set same name as the original for the clones to ensure proper serialization of the material. This should not be a problem // since the clones are never stored to the resource cache i = cloneTechniques_.Insert(MakePair(key, Clone(GetName()))); for (Vector<SharedPtr<Pass> >::ConstIterator j = i->second_->passes_.Begin(); j != i->second_->passes_.End(); ++j) { Pass* pass = (*j); if (!pass) continue; if (!vsDefines.Empty()) pass->SetVertexShaderDefines(pass->GetVertexShaderDefines() + " " + vsDefines); if (!psDefines.Empty()) pass->SetPixelShaderDefines(pass->GetPixelShaderDefines() + " " + psDefines); } return i->second_; }
ea::shared_ptr<Technique> Technique::Clone(const ea::string& cloneName) const { ea::shared_ptr<Technique> ret(context_->CreateObject<Technique>()); ret->SetIsDesktop(isDesktop_); ret->SetName(cloneName); // Deep copy passes for (auto i = passes_.begin(); i != passes_.end(); ++i) { Pass* srcPass = i->get(); if (!srcPass) continue; Pass* newPass = ret->CreatePass(srcPass->GetName()); newPass->SetBlendMode(srcPass->GetBlendMode()); newPass->SetDepthTestMode(srcPass->GetDepthTestMode()); newPass->SetLightingMode(srcPass->GetLightingMode()); newPass->SetDepthWrite(srcPass->GetDepthWrite()); newPass->SetAlphaToCoverage(srcPass->GetAlphaToCoverage()); newPass->SetIsDesktop(srcPass->IsDesktop()); newPass->SetVertexShader(srcPass->GetVertexShader()); newPass->SetPixelShader(srcPass->GetPixelShader()); newPass->SetVertexShaderDefines(srcPass->GetVertexShaderDefines()); newPass->SetPixelShaderDefines(srcPass->GetPixelShaderDefines()); newPass->SetVertexShaderDefineExcludes(srcPass->GetVertexShaderDefineExcludes()); newPass->SetPixelShaderDefineExcludes(srcPass->GetPixelShaderDefineExcludes()); } return ret; }
SharedPtr<Technique> Technique::Clone(const String& cloneName) const { SharedPtr<Technique> ret(new Technique(context_)); ret->SetIsDesktop(isDesktop_); ret->SetName(cloneName); // Deep copy passes for (Vector<SharedPtr<Pass> >::ConstIterator i = passes_.Begin(); i != passes_.End(); ++i) { Pass* srcPass = i->Get(); if (!srcPass) continue; Pass* newPass = ret->CreatePass(srcPass->GetName()); newPass->SetBlendMode(srcPass->GetBlendMode()); newPass->SetDepthTestMode(srcPass->GetDepthTestMode()); newPass->SetLightingMode(srcPass->GetLightingMode()); newPass->SetDepthWrite(srcPass->GetDepthWrite()); newPass->SetAlphaToCoverage(srcPass->GetAlphaToCoverage()); newPass->SetIsDesktop(srcPass->IsDesktop()); newPass->SetVertexShader(srcPass->GetVertexShader()); newPass->SetPixelShader(srcPass->GetPixelShader()); newPass->SetVertexShaderDefines(srcPass->GetVertexShaderDefines()); newPass->SetPixelShaderDefines(srcPass->GetPixelShaderDefines()); newPass->SetVertexShaderDefineExcludes(srcPass->GetVertexShaderDefineExcludes()); newPass->SetPixelShaderDefineExcludes(srcPass->GetPixelShaderDefineExcludes()); } return ret; }