Skip to content

Commit

Permalink
Fogging outside city tiles works but needs some maps flush
Browse files Browse the repository at this point in the history
  • Loading branch information
mir3x committed Nov 11, 2020
1 parent 96b0a41 commit 8969938
Show file tree
Hide file tree
Showing 12 changed files with 111 additions and 22 deletions.
31 changes: 31 additions & 0 deletions client/gui-qt/canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,37 @@ void qtg_canvas_put_sprite_fogged(struct canvas *pcanvas, int canvas_x,
p.end();
}

void qtg_canvas_put_sprite_citymode(struct canvas *pcanvas, int canvas_x,
int canvas_y, struct sprite *psprite,
bool fog, int fog_x, int fog_y)
{
QPainter p;

p.begin(&pcanvas->map_pixmap);
p.setCompositionMode(QPainter::CompositionMode_Difference);
p.setOpacity(0.5);
p.drawPixmap(canvas_x, canvas_y, *psprite->pm);
p.end();
// QPainter p, q;
// QPixmap pix(psprite->pm->width(), psprite->pm->height());
// pix.fill(Qt::transparent);
// pix = psprite->pm->copy();

// q.begin(&pix);
// q.setCompositionMode(QPainter::RasterOp_NotSourceOrNotDestination);
// q.drawPixmap(canvas_x, canvas_y, *psprite->pm);
// q.end();

// p.begin(&pcanvas->map_pixmap);
// p.setOpacity(0.8);
// //p.setCompositionMode(QPainter::CompositionMode_SourceIn);
// p.drawPixmap(canvas_x, canvas_y, pix);
// p.setOpacity(0.5);
// p.setCompositionMode(QPainter::CompositionMode_Lighten);
// p.drawPixmap(canvas_x, canvas_y, *psprite->pm);
// p.end();
}

/************************************************************************/ /**
Draw a filled-in colored rectangle onto canvas.
****************************************************************************/
Expand Down
49 changes: 35 additions & 14 deletions client/gui-qt/citydlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@
#include "climisc.h"
#include "control.h"
#include "global_worklist.h"
#include "mapview_common.h"
#include "mapctrl_common.h"
#include "mapview_common.h"
#include "mapview_g.h"
#include "sprite.h"
#include "text.h"
#include "tilespec.h"
Expand Down Expand Up @@ -511,7 +512,7 @@ void impr_info::update_buildings()
h = ui->height();
layout->addWidget(ui, 0, Qt::AlignVCenter);
}
layout->setContentsMargins(0,0,0,0);
layout->setContentsMargins(0, 0, 0, 0);
if (impr_list.count() > 0) {
parentWidget()->parentWidget()->setFixedHeight(h + 12);
} else {
Expand Down Expand Up @@ -974,11 +975,10 @@ void unit_info::update_units()
ui = unit_list[j];
layout->addWidget(ui, 0, Qt::AlignVCenter);
}
layout->setContentsMargins(0,0,0,0);
layout->setContentsMargins(0, 0, 0, 0);

if (unit_list.count() > 0) {
parentWidget()->parentWidget()->setFixedHeight(
ui->height() + 12);
parentWidget()->parentWidget()->setFixedHeight(ui->height() + 12);
} else {
parentWidget()->parentWidget()->setFixedHeight(0);
}
Expand Down Expand Up @@ -1022,10 +1022,7 @@ city_label::city_label(QWidget *parent) : QLabel(parent), pcity(nullptr)
type = FEELING_FINAL;
}

void city_label::set_type(int x)
{
type = x;
}
void city_label::set_type(int x) { type = x; }
/************************************************************************/ /**
Mouse handler for city_label
****************************************************************************/
Expand All @@ -1035,7 +1032,8 @@ void city_label::mousePressEvent(QMouseEvent *event)
int w = tileset_small_sprite_width(tileset) / king()->map_scale;
int num_citizens;

if (!pcity) return;
if (!pcity)
return;
if (cma_is_city_under_agent(pcity, NULL)) {
return;
}
Expand Down Expand Up @@ -1721,7 +1719,6 @@ void city_dialog::city_rename()
ask->show();
}


/************************************************************************/ /**
Save cma dialog input
****************************************************************************/
Expand All @@ -1740,7 +1737,8 @@ void city_dialog::save_cma()
param.allow_disorder = false;
param.allow_specialists = true;
param.require_happy = ui.qsliderbox->cma_celeb_checkbox->isChecked();
param.happy_factor = ui.qsliderbox->slider_tab[2 * O_LAST + 1]->value();
param.happy_factor =
ui.qsliderbox->slider_tab[2 * O_LAST + 1]->value();

for (int i = O_FOOD; i < O_LAST; i++) {
param.minimal_surplus[i] = ui.qsliderbox->slider_tab[2 * i]->value();
Expand Down Expand Up @@ -1929,7 +1927,6 @@ void city_dialog::cma_remove()
ask->show();
}


/************************************************************************/ /**
Received signal about changed qcheckbox - allow disbanding city
****************************************************************************/
Expand Down Expand Up @@ -2338,6 +2335,8 @@ void city_dialog::drop()
}
}

bool city_dialog::exist() { return m_instance ? true : false; }

/************************************************************************/ /**
Removes selected item from city worklist
****************************************************************************/
Expand Down Expand Up @@ -2894,6 +2893,8 @@ void qtg_real_city_dialog_popup(struct city *pcity)
city_dialog::instance()->show();
city_dialog::instance()->activateWindow();
city_dialog::instance()->raise();
dirty_all();
flush_dirty();
}

/************************************************************************/ /**
Expand Down Expand Up @@ -2965,12 +2966,32 @@ void qtg_refresh_unit_city_dialogs(struct unit *punit)
qtg_real_city_dialog_refresh(pcity_pre);
}

struct city *is_any_city_dialog_open()
{
// some checks not to iterate cities
if (!city_dialog::exist())
return nullptr;
if (!city_dialog::instance()->isVisible())
return nullptr;
if (client_is_global_observer() || client_is_observer())
return nullptr;

city_list_iterate(client.conn.playing->cities, pcity)
{
if (qtg_city_dialog_is_open(pcity))
return pcity;
}
city_list_iterate_end;
return nullptr;
}

/************************************************************************/ /**
Return whether the dialog for the given city is open.
****************************************************************************/
bool qtg_city_dialog_is_open(struct city *pcity)
{

if (!city_dialog::exist())
return false;
if (city_dialog::instance()->pcity == pcity
&& city_dialog::instance()->isVisible()) {
return true;
Expand Down
1 change: 1 addition & 0 deletions client/gui-qt/citydlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ class city_dialog : public qfc_dialog {
void setup_ui(struct city *qcity);
void refresh();
void cma_check_agent();
static bool exist();
struct city *pcity;
int scroll_height;

Expand Down
1 change: 1 addition & 0 deletions client/gui-qt/qtg_cxxside.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ void setup_gui_funcs()
funcs->canvas_put_sprite = qtg_canvas_put_sprite;
funcs->canvas_put_sprite_full = qtg_canvas_put_sprite_full;
funcs->canvas_put_sprite_fogged = qtg_canvas_put_sprite_fogged;
funcs->canvas_put_sprite_citymode = qtg_canvas_put_sprite_citymode;
funcs->canvas_put_rectangle = qtg_canvas_put_rectangle;
funcs->canvas_fill_sprite_area = qtg_canvas_fill_sprite_area;
funcs->canvas_put_line = qtg_canvas_put_line;
Expand Down
3 changes: 3 additions & 0 deletions client/gui-qt/qtg_cxxside.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ void qtg_canvas_put_sprite_full(struct canvas *pcanvas, int canvas_x,
void qtg_canvas_put_sprite_fogged(struct canvas *pcanvas, int canvas_x,
int canvas_y, struct sprite *psprite,
bool fog, int fog_x, int fog_y);
void qtg_canvas_put_sprite_citymode(struct canvas *pcanvas, int canvas_x,
int canvas_y, struct sprite *psprite,
bool fog, int fog_x, int fog_y);
void qtg_canvas_put_rectangle(struct canvas *pcanvas, struct color *pcolor,
int canvas_x, int canvas_y, int width,
int height);
Expand Down
1 change: 1 addition & 0 deletions client/gui_cbsetter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ void setup_gui_funcs(void)
funcs->canvas_put_sprite = gui_canvas_put_sprite;
funcs->canvas_put_sprite_full = gui_canvas_put_sprite_full;
funcs->canvas_put_sprite_fogged = gui_canvas_put_sprite_fogged;
funcs->canvas_put_sprite_citymode = gui_canvas_put_sprite_citymode;
funcs->canvas_put_rectangle = gui_canvas_put_rectangle;
funcs->canvas_fill_sprite_area = gui_canvas_fill_sprite_area;
funcs->canvas_put_line = gui_canvas_put_line;
Expand Down
8 changes: 8 additions & 0 deletions client/gui_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,14 @@ void canvas_put_sprite_fogged(struct canvas *pcanvas, int canvas_x,
fog_x, fog_y);
}

void canvas_put_sprite_citymode(struct canvas *pcanvas, int canvas_x,
int canvas_y, struct sprite *psprite, bool fog,
int fog_x, int fog_y)
{
funcs.canvas_put_sprite_citymode(pcanvas, canvas_x, canvas_y, psprite, fog,
fog_x, fog_y);
}

/**********************************************************************/ /**
Call canvas_put_rectangle callback
**************************************************************************/
Expand Down
3 changes: 3 additions & 0 deletions client/gui_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ struct gui_funcs {
void (*canvas_put_sprite_fogged)(struct canvas *pcanvas, int canvas_x,
int canvas_y, struct sprite *psprite,
bool fog, int fog_x, int fog_y);
void (*canvas_put_sprite_citymode)(struct canvas *pcanvas, int canvas_x,
int canvas_y, struct sprite *psprite,
bool fog, int fog_x, int fog_y);
void (*canvas_put_rectangle)(struct canvas *pcanvas, struct color *pcolor,
int canvas_x, int canvas_y, int width,
int height);
Expand Down
3 changes: 3 additions & 0 deletions client/include/canvas_g.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ GUI_FUNC_PROTO(void, canvas_put_sprite_full, struct canvas *pcanvas,
GUI_FUNC_PROTO(void, canvas_put_sprite_fogged, struct canvas *pcanvas,
int canvas_x, int canvas_y, struct sprite *psprite, bool fog,
int fog_x, int fog_y)
GUI_FUNC_PROTO(void, canvas_put_sprite_citymode, struct canvas *pcanvas,
int canvas_x, int canvas_y, struct sprite *psprite, bool fog,
int fog_x, int fog_y)
GUI_FUNC_PROTO(void, canvas_put_rectangle, struct canvas *pcanvas,
struct color *pcolor, int canvas_x, int canvas_y, int width,
int height)
Expand Down
1 change: 1 addition & 0 deletions client/include/citydlg_g.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ GUI_FUNC_PROTO(bool, city_dialog_is_open, struct city *pcity)
/* Actually defined in update_queue.c */
void popup_city_dialog(struct city *pcity);
void refresh_city_dialog(struct city *pcity);
struct city * is_any_city_dialog_open();

#endif /* FC__CITYDLG_G_H */
30 changes: 23 additions & 7 deletions client/mapview_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "unitlist.h"

/* client/include */
#include "citydlg_g.h"
#include "graphics_g.h"
#include "gui_main_g.h"
#include "mapctrl_g.h"
Expand Down Expand Up @@ -1290,7 +1291,7 @@ bool tile_visible_and_not_on_border_mapcanvas(struct tile *ptile)
****************************************************************************/
void put_drawn_sprites(struct canvas *pcanvas, float zoom, int canvas_x,
int canvas_y, int count, struct drawn_sprite *pdrawn,
bool fog)
bool fog, bool city_dialog)
{
int i;

Expand All @@ -1299,8 +1300,12 @@ void put_drawn_sprites(struct canvas *pcanvas, float zoom, int canvas_x,
/* This can happen, although it should probably be avoided. */
continue;
}

if (fog && pdrawn[i].foggable) {
if (city_dialog) {
canvas_put_sprite_citymode(pcanvas,
canvas_x / zoom + pdrawn[i].offset_x,
canvas_y / zoom + pdrawn[i].offset_y,
pdrawn[i].sprite, TRUE, canvas_x, canvas_y);
} else if (fog && pdrawn[i].foggable) {
canvas_put_sprite_fogged(pcanvas, canvas_x / zoom + pdrawn[i].offset_x,
canvas_y / zoom + pdrawn[i].offset_y,
pdrawn[i].sprite, TRUE, canvas_x, canvas_y);
Expand All @@ -1314,7 +1319,7 @@ void put_drawn_sprites(struct canvas *pcanvas, float zoom, int canvas_x,
}
}
}

#include <QDebug>
/************************************************************************/ /**
Draw one layer of a tile, edge, corner, unit, and/or city onto the
canvas at the given position.
Expand All @@ -1328,14 +1333,25 @@ void put_one_element(struct canvas *pcanvas, float zoom,
const struct unit_type *putype)
{
struct drawn_sprite tile_sprs[80];
bool city_mode = false;
int count = fill_sprite_array(tileset, tile_sprs, layer, ptile, pedge,
pcorner, punit, pcity, citymode, putype);
bool fog = (ptile && gui_options.draw_fog_of_war
&& TILE_KNOWN_UNSEEN == client_tile_get_known(ptile));

if (ptile) {
struct city *xcity = is_any_city_dialog_open();
if (xcity) {
int dummy_x, dummy_y;
//struct city *xcity = find_city_near_tile(ptile);
if (xcity
&& !city_base_to_city_map(&dummy_x, &dummy_y, xcity, ptile)) {
city_mode = true;
}
}
}
/*** Draw terrain and specials ***/
put_drawn_sprites(pcanvas, zoom, canvas_x, canvas_y, count, tile_sprs,
fog);
put_drawn_sprites(pcanvas, zoom, canvas_x, canvas_y, count, tile_sprs, fog,
city_mode);
}

/************************************************************************/ /**
Expand Down
2 changes: 1 addition & 1 deletion client/mapview_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ void put_one_element(struct canvas *pcanvas, float zoom,

void put_drawn_sprites(struct canvas *pcanvas, float zoom, int canvas_x,
int canvas_y, int count, struct drawn_sprite *pdrawn,
bool fog);
bool fog, bool citydialog = false);

void update_map_canvas(int canvas_x, int canvas_y, int width, int height);
void update_map_canvas_visible(void);
Expand Down

0 comments on commit 8969938

Please sign in to comment.