void TerrCell::updateGrid( const RectI &gridRect, bool opacityOnly ) { PROFILE_SCOPE( TerrCell_UpdateGrid ); // If we have a VB... then update it. if ( mVertexBuffer.isValid() && !opacityOnly ) _updateVertexBuffer(); // Update our PB, if any _updatePrimitiveBuffer(); // If we don't have children... then we're // a leaf at the bottom of the cell quadtree // and we should just update our bounds. if ( !mChildren[0] ) { if ( !opacityOnly ) _updateBounds(); _updateMaterials(); return; } // Otherwise, we must call updateGrid on our children // and then update our bounds/materials AFTER to contain them. mMaterials = 0; for ( U32 i = 0; i < 4; i++ ) { TerrCell *cell = mChildren[i]; // The overlap test doesn't hit shared edges // so grow it a bit when we create it. const RectI cellRect( cell->mPoint.x - 1, cell->mPoint.y - 1, cell->mSize + 2, cell->mSize + 2 ); // We do an overlap and containment test as it // properly handles zero sized rects. if ( cellRect.contains( gridRect ) || cellRect.overlaps( gridRect ) ) cell->updateGrid( gridRect, opacityOnly ); // Update the bounds from our children. if ( !opacityOnly ) { if ( i == 0 ) mBounds = mChildren[i]->getBounds(); else mBounds.intersect( mChildren[i]->getBounds() ); mRadius = mBounds.len() * 0.5f; } // Update the material flags. mMaterials |= mChildren[i]->getMaterials(); } if ( mMaterial ) mMaterial->init( mTerrain, mMaterials ); }