bool ProcessedShaderMaterial::_createPasses( MaterialFeatureData &stageFeatures, U32 stageNum, const FeatureSet &features ) { // Creates passes for the given stage ShaderRenderPassData passData; U32 texIndex = 0; for( U32 i=0; i < FEATUREMGR->getFeatureCount(); i++ ) { const FeatureInfo &info = FEATUREMGR->getAt( i ); if ( !stageFeatures.features.hasFeature( *info.type ) ) continue; U32 numTexReg = info.feature->getResources( stageFeatures ).numTexReg; // adds pass if blend op changes for feature _setPassBlendOp( info.feature, passData, texIndex, stageFeatures, stageNum, features ); // Add pass if num tex reg is going to be too high if( passData.mNumTexReg + numTexReg > GFX->getNumSamplers() ) { if( !_addPass( passData, texIndex, stageFeatures, stageNum, features ) ) return false; _setPassBlendOp( info.feature, passData, texIndex, stageFeatures, stageNum, features ); } passData.mNumTexReg += numTexReg; passData.mFeatureData.features.addFeature( *info.type ); info.feature->setTexData( mStages[stageNum], stageFeatures, passData, texIndex ); // Add pass if tex units are maxed out if( texIndex > GFX->getNumSamplers() ) { if( !_addPass( passData, texIndex, stageFeatures, stageNum, features ) ) return false; _setPassBlendOp( info.feature, passData, texIndex, stageFeatures, stageNum, features ); } } const FeatureSet &passFeatures = passData.mFeatureData.codify(); if ( passFeatures.isNotEmpty() ) { mFeatures.merge( passFeatures ); if( !_addPass( passData, texIndex, stageFeatures, stageNum, features ) ) { mFeatures.clear(); return false; } } return true; }
void ProcessedShaderMaterial::_setPassBlendOp( ShaderFeature *sf, ShaderRenderPassData &passData, U32 &texIndex, MaterialFeatureData &stageFeatures, U32 stageNum, const FeatureSet &features ) { if( sf->getBlendOp() == Material::None ) { return; } // set up the current blend operation for multi-pass materials if( mPasses.size() > 0) { // If passData.numTexReg is 0, this is a brand new pass, so set the // blend operation to the first feature. if( passData.mNumTexReg == 0 ) { passData.mBlendOp = sf->getBlendOp(); } else { // numTegReg is more than zero, if this feature // doesn't have the same blend operation, then // we need to create yet another pass if( sf->getBlendOp() != passData.mBlendOp && mPasses[mPasses.size()-1]->mStageNum == stageNum) { _addPass( passData, texIndex, stageFeatures, stageNum, features ); passData.mBlendOp = sf->getBlendOp(); } } } }
void ProcessedFFMaterial::_createPasses( U32 stageNum, const FeatureSet &features ) { FixedFuncFeatureData featData; _determineFeatures(stageNum, featData, features); // Just create a simple pass! _addPass(0, featData); mFeatures.clear(); if ( featData.features[FixedFuncFeatureData::DiffuseMap] ) mFeatures.addFeature( MFT_DiffuseMap ); if ( featData.features[FixedFuncFeatureData::LightMap] ) mFeatures.addFeature( MFT_LightMap ); if ( featData.features[FixedFuncFeatureData::ToneMap] ) mFeatures.addFeature( MFT_ToneMap ); }