| 242 | } |
| 243 | |
| 244 | void TerrainCellMaterial::init( TerrainBlock *block, |
| 245 | U64 activeMaterials, |
| 246 | bool deferredMat, |
| 247 | bool reflectMat, |
| 248 | bool baseOnly ) |
| 249 | { |
| 250 | // This isn't allowed for now. |
| 251 | AssertFatal( !( deferredMat && reflectMat ), "TerrainCellMaterial::init - We shouldn't get deferred and reflection in the same material!" ); |
| 252 | |
| 253 | mTerrain = block; |
| 254 | mMaterials = activeMaterials; |
| 255 | |
| 256 | mMaterialInfos.clear(); |
| 257 | for ( U32 i = 0; i < 64; i++ ) |
| 258 | { |
| 259 | if ( !( mMaterials & ((U64)1 << i ) ) ) |
| 260 | continue; |
| 261 | |
| 262 | TerrainMaterial *mat = block->getMaterial( i ); |
| 263 | |
| 264 | MaterialInfo *info = new MaterialInfo(); |
| 265 | info->layerId = i; |
| 266 | info->mat = mat; |
| 267 | mMaterialInfos.push_back(info); |
| 268 | } |
| 269 | |
| 270 | if (!_initShader(deferredMat, |
| 271 | reflectMat, |
| 272 | baseOnly)) |
| 273 | { |
| 274 | Con::errorf("TerrainCellMaterial::init - Failed to init shader!"); |
| 275 | |
| 276 | T3D::for_each(mMaterialInfos.begin(), mMaterialInfos.end(), T3D::delete_pointer()); |
| 277 | mMaterialInfos.clear(); |
| 278 | return; |
| 279 | } |
| 280 | |
| 281 | // If we have attached mats then update them too. |
| 282 | if ( mDeferredMat ) |
| 283 | mDeferredMat->init( mTerrain, mMaterials, true, false, baseOnly ); |
| 284 | if ( mReflectMat ) |
| 285 | mReflectMat->init( mTerrain, mMaterials, false, true, baseOnly ); |
| 286 | } |
| 287 | |
| 288 | bool TerrainCellMaterial::_initShader(bool deferredMat, |
| 289 | bool reflectMat, |
no test coverage detected