1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00
Files
OpenRCT2/src/openrct2-ui/windows/Transparency.cpp
Kane 20cd8465f5 Code cleanup, remove ignore_invisible_flag.
Known issues:
- Some flat-rides have transparency issues
2022-03-14 21:43:12 +00:00

232 lines
9.6 KiB
C++

/*****************************************************************************
* Copyright (c) 2014-2020 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include <algorithm>
#include <iterator>
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Theme.h>
#include <openrct2-ui/interface/Widget.h>
#include <openrct2-ui/windows/Window.h>
#include <openrct2/Context.h>
#include <openrct2/Game.h>
#include <openrct2/OpenRCT2.h>
#include <openrct2/actions/ParkSetDateAction.h>
#include <openrct2/actions/SetCheatAction.h>
#include <openrct2/config/Config.h>
#include <openrct2/localisation/Date.h>
#include <openrct2/localisation/Localisation.h>
#include <openrct2/network/network.h>
#include <openrct2/peep/Staff.h>
#include <openrct2/sprites.h>
#include <openrct2/util/Util.h>
#include <openrct2/world/Climate.h>
#include <openrct2/world/Park.h>
#include <openrct2/world/Surface.h>
// clang-format off
enum WINDOW_TRANSPARENCY_WIDGET_IDX
{
WIDX_BACKGROUND,
WIDX_TITLE,
WIDX_CLOSE,
WIDX_SEE_THROUGH_RIDES,
WIDX_SEE_THROUGH_VEHICLES,
WIDX_SEE_THROUGH_SCENERY,
WIDX_SEE_THROUGH_TREES,
WIDX_SEE_THROUGH_PATHS,
WIDX_SEE_THROUGH_SUPPORTS,
WIDX_INVISIBLE_GUESTS,
WIDX_INVISIBLE_STAFF,
WIDX_INVISIBLE_RIDES,
WIDX_INVISIBLE_VEHICLES,
WIDX_INVISIBLE_SCENERY,
WIDX_INVISIBLE_TREES,
WIDX_INVISIBLE_PATHS,
WIDX_INVISIBLE_SUPPORTS,
};
#pragma region MEASUREMENTS
static constexpr const rct_string_id WINDOW_TITLE = STR_TRANSPARENCY_OPTIONS_TITLE;
static constexpr const int32_t WW = 204;
static constexpr const int32_t WH = 57;
static constexpr ScreenSize ICON_BUTTON = {24, 24};
static constexpr ScreenSize FLAT_BUTTON = {24, 12};
#pragma endregion
static rct_widget window_transparency_main_widgets[] =
{
WINDOW_SHIM(WINDOW_TITLE, WW, WH),
MakeWidget({ 77, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_RIDE, STR_SEE_THROUGH_RIDES),
MakeWidget({102, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_COASTER_TRAIN, STR_SEE_THROUGH_VEHICLES),
MakeWidget({ 27, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_LARGE_SCENERY, STR_SEE_THROUGH_SCENERY),
MakeWidget({ 2, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_TREES, STR_SEE_THROUGH_TREES),
MakeWidget({ 52, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_FOOTPATH, STR_SEE_THROUGH_PATHS),
MakeWidget({127, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_SUPPORTS, STR_SEE_THROUGH_SUPPORTS),
MakeWidget({152, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_GUESTS, STR_INVISIBLE_GUESTS),
MakeWidget({177, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_INVISIBLE_STAFF),
MakeWidget({ 77, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_RIDES),
MakeWidget({102, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_VEHICLES),
MakeWidget({ 27, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_SCENERY),
MakeWidget({ 2, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_TREES),
MakeWidget({ 52, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_PATHS),
MakeWidget({127, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_SUPPORTS),
{ WIDGETS_END },
};
// clang-format on
class TransparencyWindow final : public Window
{
private:
public:
void OnOpen() override
{
widgets = window_transparency_main_widgets;
enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_SEE_THROUGH_RIDES) | (1ULL << WIDX_SEE_THROUGH_VEHICLES)
| (1ULL << WIDX_SEE_THROUGH_SCENERY) | (1ULL << WIDX_SEE_THROUGH_TREES) | (1ULL << WIDX_SEE_THROUGH_PATHS)
| (1ULL << WIDX_INVISIBLE_RIDES) | (1ULL << WIDX_INVISIBLE_VEHICLES) | (1ULL << WIDX_INVISIBLE_SCENERY)
| (1ULL << WIDX_INVISIBLE_TREES) | (1ULL << WIDX_INVISIBLE_PATHS) | (1ULL << WIDX_INVISIBLE_SUPPORTS)
| (1ULL << WIDX_INVISIBLE_GUESTS) | (1ULL << WIDX_INVISIBLE_STAFF) | (1ULL << WIDX_SEE_THROUGH_SUPPORTS);
window_push_others_below(this);
auto* w = window_get_main();
if (w != nullptr)
windowPos.x = ((w->width / 2) - (width / 2));
}
void OnMouseUp(rct_widgetindex widgetIndex) override
{
switch (widgetIndex)
{
case WIDX_CLOSE:
Close();
break;
default:
OnMouseUpMain(widgetIndex);
break;
}
}
void OnPrepareDraw() override
{
uint32_t wflags = 0;
rct_window* w = window_get_main();
pressed_widgets = 0;
disabled_widgets = 0;
if (w != nullptr)
wflags = w->viewport->flags;
SetWidgetPressed(WIDX_SEE_THROUGH_RIDES, (wflags & VIEWPORT_FLAG_SEETHROUGH_RIDES));
SetWidgetPressed(WIDX_SEE_THROUGH_VEHICLES, (wflags & VIEWPORT_FLAG_SEETHROUGH_VEHICLES));
SetWidgetPressed(WIDX_SEE_THROUGH_SCENERY, (wflags & VIEWPORT_FLAG_SEETHROUGH_SCENERY));
SetWidgetPressed(WIDX_SEE_THROUGH_TREES, (wflags & VIEWPORT_FLAG_SEETHROUGH_TREES));
SetWidgetPressed(WIDX_SEE_THROUGH_PATHS, (wflags & VIEWPORT_FLAG_SEETHROUGH_PATHS));
SetWidgetPressed(WIDX_SEE_THROUGH_SUPPORTS, (wflags & VIEWPORT_FLAG_SEETHROUGH_SUPPORTS));
SetWidgetPressed(WIDX_INVISIBLE_RIDES, (wflags & VIEWPORT_FLAG_INVISIBLE_RIDES));
SetWidgetPressed(WIDX_INVISIBLE_VEHICLES, (wflags & VIEWPORT_FLAG_INVISIBLE_VEHICLES));
SetWidgetPressed(WIDX_INVISIBLE_SCENERY, (wflags & VIEWPORT_FLAG_INVISIBLE_SCENERY));
SetWidgetPressed(WIDX_INVISIBLE_TREES, (wflags & VIEWPORT_FLAG_INVISIBLE_TREES));
SetWidgetPressed(WIDX_INVISIBLE_PATHS, (wflags & VIEWPORT_FLAG_INVISIBLE_PATHS));
SetWidgetPressed(WIDX_INVISIBLE_SUPPORTS, (wflags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS));
SetWidgetPressed(WIDX_INVISIBLE_GUESTS, (wflags & VIEWPORT_FLAG_INVISIBLE_GUESTS));
SetWidgetPressed(WIDX_INVISIBLE_STAFF, (wflags & VIEWPORT_FLAG_INVISIBLE_STAFF));
}
void OnDraw(rct_drawpixelinfo& dpi) override
{
DrawWidgets(dpi);
// Locate mechanic button image
const auto& widget = widgets[WIDX_INVISIBLE_STAFF];
auto screenCoords = windowPos + ScreenCoordsXY{ widget.left, widget.top };
gfx_draw_sprite(
&dpi, (gStaffMechanicColour << 24) | IMAGE_TYPE_REMAP | IMAGE_TYPE_REMAP_2_PLUS | SPR_MECHANIC, screenCoords, 0);
}
private:
void OnMouseUpMain(rct_widgetindex widgetIndex)
{
uint32_t wflags = 0;
rct_window* w = window_get_main();
if (w == nullptr)
return;
wflags = w->viewport->flags;
switch (widgetIndex)
{
case WIDX_SEE_THROUGH_RIDES:
wflags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES;
break;
case WIDX_SEE_THROUGH_VEHICLES:
wflags ^= VIEWPORT_FLAG_SEETHROUGH_VEHICLES;
break;
case WIDX_SEE_THROUGH_SCENERY:
wflags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY;
break;
case WIDX_SEE_THROUGH_TREES:
wflags ^= VIEWPORT_FLAG_SEETHROUGH_TREES;
break;
case WIDX_SEE_THROUGH_PATHS:
wflags ^= VIEWPORT_FLAG_SEETHROUGH_PATHS;
break;
case WIDX_SEE_THROUGH_SUPPORTS:
wflags ^= VIEWPORT_FLAG_SEETHROUGH_SUPPORTS;
break;
case WIDX_INVISIBLE_RIDES:
wflags ^= VIEWPORT_FLAG_INVISIBLE_RIDES;
break;
case WIDX_INVISIBLE_VEHICLES:
wflags ^= VIEWPORT_FLAG_INVISIBLE_VEHICLES;
break;
case WIDX_INVISIBLE_SCENERY:
wflags ^= VIEWPORT_FLAG_INVISIBLE_SCENERY;
break;
case WIDX_INVISIBLE_TREES:
wflags ^= VIEWPORT_FLAG_INVISIBLE_TREES;
break;
case WIDX_INVISIBLE_PATHS:
wflags ^= VIEWPORT_FLAG_INVISIBLE_PATHS;
break;
case WIDX_INVISIBLE_SUPPORTS:
wflags ^= VIEWPORT_FLAG_INVISIBLE_SUPPORTS;
break;
case WIDX_INVISIBLE_GUESTS:
wflags ^= VIEWPORT_FLAG_INVISIBLE_GUESTS;
break;
case WIDX_INVISIBLE_STAFF:
wflags ^= VIEWPORT_FLAG_INVISIBLE_STAFF;
break;
}
if (w->viewport->flags == wflags)
return;
w->viewport->flags = wflags;
w->Invalidate();
}
};
rct_window* WindowTransparencyOpen()
{
auto* window = window_bring_to_front_by_class(WC_TRANSPARENCY);
if (window == nullptr)
window = WindowCreate<TransparencyWindow>(WC_TRANSPARENCY, ScreenCoordsXY(32, 32), WW, WH);
return window;
}