void Build::drawTile( const RenderInfo& rinfo, Tile& tile ) { __D_IMPL(_d,Build); ConstructionPtr cntr = tile.overlay<Construction>(); city::AreaInfo info( _city(), tile.epos(), &_d->buildTiles ); const Picture* picBasic = 0; const Picture* picOver = 0; if( cntr.isValid() && info.tiles().size() > 0 ) { picBasic = &cntr->picture(); picOver = &cntr->picture( info ); } if( picOver && picBasic != picOver ) { Point screenPos = tile.mappos() + rinfo.offset; drawLandTile( rinfo, tile ); rinfo.engine.draw( *picOver, screenPos ); drawPass( rinfo, tile, Renderer::overlayAnimation ); } else if( _d->lastLayer.isValid() ) { _d->lastLayer->drawTile( rinfo, tile ); } else { Layer::drawTile( rinfo, tile ); } if( !_d->overdrawBuilding ) _tryDrawBuildTile( rinfo, tile ); }
void Build::_drawBuildTile( const RenderInfo& rinfo, Tile* tile) { if( tile == nullptr ) return; __D_IMPL(_d,Build); city::AreaInfo areaInfo( _city(), TilePos(), &_d->buildTiles ); Tile* postTile = tile; postTile->resetRendered(); if( postTile->master() ) postTile = postTile->master(); ConstructionPtr construction = postTile->overlay<Construction>(); rinfo.engine.resetColorMask(); areaInfo.pos = postTile->epos(); bool maskSet = false; Size size(1,1); if( construction.isValid() && construction->canBuild( areaInfo ) ) { rinfo.engine.setColorMask( 0x00000000, 0x0000ff00, 0, 0xff000000 ); maskSet = true; size = construction->size(); } if( postTile == tile && maskSet ) { TilesArray area = _city()->tilemap().area( areaInfo.pos, size ); for( auto gtile : area ) drawLandTile( rinfo, *gtile ); } drawLandTile( rinfo, *postTile ); if( maskSet ) { const Picture& picOver = construction->picture( areaInfo ); rinfo.engine.draw( picOver, postTile->mappos() + rinfo.offset ); drawPass( rinfo, *postTile, Renderer::overlayAnimation ); rinfo.engine.resetColorMask(); } }