Beispiel #1
0
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 );
}
Beispiel #2
0
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();
  }
}