xml::XMLElement* RenderMaterial::loadXMLSettings(xml::XMLElement* elem){ IResource::loadFromXML(elem); xml::XMLElement*e=elem->getSubElement(mT("Technique")); while(e) { core::string name=e->getValueString("Name"); video::RenderTechnique* t= GetTechniqueByName(name); bool loaded=false; if(!t) t=new RenderTechnique(this); else loaded=true; t->loadXMLSettings(e); if(!loaded) AddTechnique(t); e=e->nextSiblingElement(mT("Technique")); } m_activeTechnique=0; for(int i=0;i<m_techniques.size();++i) { if(m_techniques[i]->IsSupported()) { m_activeTechnique=m_techniques[i]; break; } } return elem; }
RenderTechnique* RenderMaterial::CreateTechnique(const core::string& name) { RenderTechnique* t=new RenderTechnique(this); t->SetName(name); AddTechnique(t); if (m_activeTechnique == 0) m_activeTechnique = t; return t; }
/** * @brief * Copy operator */ Effect &Effect::operator =(const Effect &cSource) { // Clear effect Unload(); m_sFilename = cSource.m_sFilename; m_nFlags = cSource.GetFlags(); m_bBlend = cSource.GetBlend(); m_nSelectedTechnique = cSource.GetSelectedTechniqueIndex(); for (uint32 i=0; i<cSource.m_lstTechnique.GetNumOfElements(); i++) *AddTechnique() = *cSource.m_lstTechnique[i]; /* [TODO] Check me for (uint32 i=0; i<cSource.m_lstParameters.GetNumOfElements(); i++) { m_lstParameters.Add(); *m_lstParameters[i] = *cSource.m_lstParameters[i]; } */ // Done return *this; }
EffectTexture::EffectTexture(): Effect(), m_hRasterizerState(), m_hDepthStencilState(), m_hBlendState(), m_hIL(), m_hPass(), m_hTechnique() { // Create render states m_hRasterizerState.Bind(); m_hDepthStencilState.Bind(); m_hBlendState.Bind(); // Create shaders GPUShaderCompilationData hCompilationData; hCompilationData.arrMacros = NULL; hCompilationData.iFlags = ( GPUSHADER_COMPILE_STRICT | GPUSHADER_COMPILE_PACK_MATRIX_COLUMN_MAJOR | GPUSHADER_COMPILE_OPTIMIZATION_LEVEL1 ); hCompilationData.iEffectFlags = 0; hCompilationData.iTarget = GPUSHADER_VERTEX; hCompilationData.strName = "EffectLib.Texture.VS"; hCompilationData.strEntryPoint = "_VS_Main"; m_hCompiledVS.Compile( sm_strHLSLCode, sm_iHLSLCodeLength, &hCompilationData ); m_hVS.Bind( &m_hCompiledVS, false, false ); hCompilationData.iTarget = GPUSHADER_PIXEL; hCompilationData.strName = "EffectLib.Texture.PS"; hCompilationData.strEntryPoint = "_PS_Main"; m_hCompiledPS.Compile( sm_strHLSLCode, sm_iHLSLCodeLength, &hCompilationData ); m_hPS.Bind( &m_hCompiledPS, false, false ); // Create input layout GPUInputFieldDesc hField; hField.iSlot = 0; hField.iSlotClass = GPUINPUTFIELD_SLOTCLASS_PER_VERTEX; hField.iInstanceDataStepRate = 0; hField.iType = GPUINPUTFIELD_TYPE_FLOAT4; hField.strSemantic = GPUINPUTFIELD_SEMANTIC_POSITION; hField.iSemanticIndex = 0; m_hIL.PushField( &hField ); hField.iType = GPUINPUTFIELD_TYPE_FLOAT2; hField.strSemantic = GPUINPUTFIELD_SEMANTIC_TEXCOORD; hField.iSemanticIndex = 0; m_hIL.PushField( &hField ); m_hIL.Finalize(); m_hIL.Bind( &m_hCompiledVS ); // Build effect m_hPass.SetRasterizerState( &m_hRasterizerState ); m_hPass.SetDepthStencilState( &m_hDepthStencilState ); m_hPass.SetBlendState( &m_hBlendState ); m_hPass.SetInputLayout( &m_hIL ); m_hPass.SetVertexShader( &m_hVS ); m_hPass.SetPixelShader( &m_hPS ); m_hTechnique.AddPass( &m_hPass ); AddTechnique( &m_hTechnique ); }