Skip to content

Commit

Permalink
Merge pull request #8367 from ZehMatt/paint-refactor2
Browse files Browse the repository at this point in the history
Paint refactor
  • Loading branch information
janisozaur committed Dec 5, 2018
2 parents cec8646 + 468d94a commit eca13b9
Show file tree
Hide file tree
Showing 21 changed files with 91 additions and 97 deletions.
9 changes: 2 additions & 7 deletions src/openrct2-ui/windows/RideConstruction.cpp
Expand Up @@ -2333,12 +2333,9 @@ static void sub_6CBCE2(
{
Ride* ride;
const rct_preview_track* trackBlock;
int32_t preserve_current_viewport_flags;
int32_t offsetX, offsetY;

paint_session* session = paint_session_alloc(dpi);
preserve_current_viewport_flags = gCurrentViewportFlags;
gCurrentViewportFlags = 0;
paint_session* session = paint_session_alloc(dpi, 0);
trackDirection &= 3;

ride = get_ride(rideIndex);
Expand Down Expand Up @@ -2450,10 +2447,8 @@ static void sub_6CBCE2(
gMapSizeMaxXY = preserveMapSizeMaxXY;

paint_session_arrange(session);
paint_draw_structs(session, gCurrentViewportFlags);
paint_draw_structs(session);
paint_session_free(session);

gCurrentViewportFlags = preserve_current_viewport_flags;
}

/**
Expand Down
9 changes: 7 additions & 2 deletions src/openrct2/drawing/Rain.cpp
Expand Up @@ -42,10 +42,15 @@ void DrawRain(rct_drawpixelinfo* dpi, IRainDrawer* rainDrawer)
{
if (gConfigGeneral.render_weather_effects)
{
uint32_t viewFlags = 0;

rct_viewport* viewport = window_get_viewport(window_get_main());
if (viewport != nullptr)
viewFlags = viewport->flags;

// Get rain draw function and draw rain
uint32_t rainType = gClimateCurrent.RainLevel;
if (rainType != RAIN_LEVEL_NONE && !gTrackDesignSaveMode
&& !(gCurrentViewportFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES))
if (rainType != RAIN_LEVEL_NONE && !gTrackDesignSaveMode && !(viewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES))
{
auto drawFunc = DrawRainFunctions[rainType];
auto uiContext = GetContext()->GetUiContext();
Expand Down
9 changes: 3 additions & 6 deletions src/openrct2/interface/Viewport.cpp
Expand Up @@ -50,7 +50,6 @@ uint8_t gSavedViewRotation;

paint_entry* gNextFreePaintStruct;
uint8_t gCurrentRotation;
uint32_t gCurrentViewportFlags = 0;

static uint32_t _currentImageType;

Expand Down Expand Up @@ -906,8 +905,6 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int16_t left

static void viewport_paint_column(rct_drawpixelinfo* dpi, uint32_t viewFlags)
{
gCurrentViewportFlags = viewFlags;

if (viewFlags
& (VIEWPORT_FLAG_HIDE_VERTICAL | VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_CLIP_VIEW))
{
Expand All @@ -919,10 +916,10 @@ static void viewport_paint_column(rct_drawpixelinfo* dpi, uint32_t viewFlags)
gfx_clear(dpi, colour);
}

paint_session* session = paint_session_alloc(dpi);
paint_session* session = paint_session_alloc(dpi, viewFlags);
paint_session_generate(session);
paint_session_arrange(session);
paint_draw_structs(session, viewFlags);
paint_draw_structs(session);
paint_session_free(session);

if (gConfigGeneral.render_weather_gloom && !gTrackDesignSaveMode && !(viewFlags & VIEWPORT_FLAG_INVISIBLE_SPRITES)
Expand Down Expand Up @@ -1644,7 +1641,7 @@ void get_map_coordinates_from_pos_window(
dpi->x = _viewportDpi1.x;
dpi->width = 1;

paint_session* session = paint_session_alloc(dpi);
paint_session* session = paint_session_alloc(dpi, myviewport->flags);
paint_session_generate(session);
paint_session_arrange(session);
sub_68862C(session);
Expand Down
1 change: 0 additions & 1 deletion src/openrct2/interface/Viewport.h
Expand Up @@ -115,7 +115,6 @@ extern uint8_t gSavedViewRotation;

extern paint_entry* gNextFreePaintStruct;
extern uint8_t gCurrentRotation;
extern uint32_t gCurrentViewportFlags;

void viewport_init_all();
void centre_2d_coordinates(int32_t x, int32_t y, int32_t z, int32_t* out_x, int32_t* out_y, rct_viewport* viewport);
Expand Down
43 changes: 22 additions & 21 deletions src/openrct2/paint/Paint.cpp
Expand Up @@ -47,20 +47,21 @@ bool gShowDirtyVisuals;
bool gPaintBoundingBoxes;
bool gPaintBlockedTiles;

static void paint_session_init(paint_session* session, rct_drawpixelinfo* dpi);
static void paint_session_init(paint_session* session, rct_drawpixelinfo* dpi, uint32_t viewFlags);
static void paint_attached_ps(rct_drawpixelinfo* dpi, paint_struct* ps, uint32_t viewFlags);
static void paint_ps_image_with_bounding_boxes(
rct_drawpixelinfo* dpi, paint_struct* ps, uint32_t imageId, int16_t x, int16_t y);
static void paint_ps_image(rct_drawpixelinfo* dpi, paint_struct* ps, uint32_t imageId, int16_t x, int16_t y);
static uint32_t paint_ps_colourify_image(uint32_t imageId, uint8_t spriteType, uint32_t viewFlags);

static void paint_session_init(paint_session* session, rct_drawpixelinfo* dpi)
static void paint_session_init(paint_session* session, rct_drawpixelinfo* dpi, uint32_t viewFlags)
{
session->DPI = dpi;
session->EndOfPaintStructArray = &session->PaintStructs[4000 - 1];
session->NextFreePaintStruct = session->PaintStructs;
session->UnkF1AD28 = nullptr;
session->LastRootPS = nullptr;
session->UnkF1AD2C = nullptr;
session->ViewFlags = viewFlags;
for (auto& quadrant : session->Quadrants)
{
quadrant = nullptr;
Expand Down Expand Up @@ -486,7 +487,7 @@ void paint_session_arrange(paint_session* session)
}
}

static void paint_draw_struct(paint_session* session, paint_struct* ps, uint32_t viewFlags)
static void paint_draw_struct(paint_session* session, paint_struct* ps)
{
rct_drawpixelinfo* dpi = session->DPI;

Expand All @@ -507,7 +508,7 @@ static void paint_draw_struct(paint_session* session, paint_struct* ps, uint32_t
}
}

uint32_t imageId = paint_ps_colourify_image(ps->image_id, ps->sprite_type, viewFlags);
uint32_t imageId = paint_ps_colourify_image(ps->image_id, ps->sprite_type, session->ViewFlags);
if (gPaintBoundingBoxes && dpi->zoom_level == 0)
{
paint_ps_image_with_bounding_boxes(dpi, ps, imageId, x, y);
Expand All @@ -519,25 +520,25 @@ static void paint_draw_struct(paint_session* session, paint_struct* ps, uint32_t

if (ps->children != nullptr)
{
paint_draw_struct(session, ps->children, viewFlags);
paint_draw_struct(session, ps->children);
}
else
{
paint_attached_ps(dpi, ps, viewFlags);
paint_attached_ps(dpi, ps, session->ViewFlags);
}
}

/**
*
* rct2: 0x00688485
*/
void paint_draw_structs(paint_session* session, uint32_t viewFlags)
void paint_draw_structs(paint_session* session)
{
paint_struct* ps = &session->PaintHead;

for (ps = ps->next_quadrant_ps; ps;)
{
paint_draw_struct(session, ps, viewFlags);
paint_draw_struct(session, ps);

ps = ps->next_quadrant_ps;
}
Expand Down Expand Up @@ -729,14 +730,14 @@ static void draw_pixel_info_crop_by_zoom(rct_drawpixelinfo* dpi)
dpi->height >>= zoom;
}

paint_session* paint_session_alloc(rct_drawpixelinfo* dpi)
paint_session* paint_session_alloc(rct_drawpixelinfo* dpi, uint32_t viewFlags)
{
// Currently limited to just one session at a time
assert(!_paintSessionInUse);
_paintSessionInUse = true;
paint_session* session = &gPaintSession;

paint_session_init(session, dpi);
paint_session_init(session, dpi, viewFlags);
return session;
}

Expand Down Expand Up @@ -764,7 +765,7 @@ paint_struct* sub_98196C(
assert((uint16_t)bound_box_length_x == (int16_t)bound_box_length_x);
assert((uint16_t)bound_box_length_y == (int16_t)bound_box_length_y);

session->UnkF1AD28 = nullptr;
session->LastRootPS = nullptr;
session->UnkF1AD2C = nullptr;

if (session->NextFreePaintStruct >= session->EndOfPaintStructArray)
Expand Down Expand Up @@ -866,7 +867,7 @@ paint_struct* sub_98196C(
ps->map_y = session->MapPosition.y;
ps->tileElement = (TileElement*)session->CurrentlyDrawnItem;

session->UnkF1AD28 = ps;
session->LastRootPS = ps;

int32_t positionHash = 0;
switch (session->CurrentRotation)
Expand Down Expand Up @@ -912,7 +913,7 @@ paint_struct* sub_98197C(
int16_t bound_box_length_y, int8_t bound_box_length_z, int16_t z_offset, int16_t bound_box_offset_x,
int16_t bound_box_offset_y, int16_t bound_box_offset_z)
{
session->UnkF1AD28 = nullptr;
session->LastRootPS = nullptr;
session->UnkF1AD2C = nullptr;

LocationXYZ16 offset = { x_offset, y_offset, z_offset };
Expand All @@ -925,7 +926,7 @@ paint_struct* sub_98197C(
return nullptr;
}

session->UnkF1AD28 = ps;
session->LastRootPS = ps;

LocationXY16 attach = { (int16_t)ps->bounds.x, (int16_t)ps->bounds.y };

Expand Down Expand Up @@ -974,7 +975,7 @@ paint_struct* sub_98198C(
assert((uint16_t)bound_box_length_x == bound_box_length_x);
assert((uint16_t)bound_box_length_y == bound_box_length_y);

session->UnkF1AD28 = nullptr;
session->LastRootPS = nullptr;
session->UnkF1AD2C = nullptr;

LocationXYZ16 offset = { x_offset, y_offset, z_offset };
Expand All @@ -987,7 +988,7 @@ paint_struct* sub_98198C(
return nullptr;
}

session->UnkF1AD28 = ps;
session->LastRootPS = ps;
session->NextFreePaintStruct++;
return ps;
}
Expand Down Expand Up @@ -1016,7 +1017,7 @@ paint_struct* sub_98199C(
assert((uint16_t)bound_box_length_x == (int16_t)bound_box_length_x);
assert((uint16_t)bound_box_length_y == (int16_t)bound_box_length_y);

if (session->UnkF1AD28 == nullptr)
if (session->LastRootPS == nullptr)
{
return sub_98197C(
session, image_id, x_offset, y_offset, bound_box_length_x, bound_box_length_y, bound_box_length_z, z_offset,
Expand All @@ -1033,10 +1034,10 @@ paint_struct* sub_98199C(
return nullptr;
}

paint_struct* old_ps = session->UnkF1AD28;
paint_struct* old_ps = session->LastRootPS;
old_ps->children = ps;

session->UnkF1AD28 = ps;
session->LastRootPS = ps;
session->NextFreePaintStruct++;
return ps;
}
Expand Down Expand Up @@ -1099,7 +1100,7 @@ bool paint_attach_to_previous_ps(paint_session* session, uint32_t image_id, uint
ps->y = y;
ps->flags = 0;

paint_struct* masterPs = session->UnkF1AD28;
paint_struct* masterPs = session->LastRootPS;
if (masterPs == nullptr)
{
return false;
Expand Down
10 changes: 5 additions & 5 deletions src/openrct2/paint/Paint.h
Expand Up @@ -143,14 +143,14 @@ struct paint_session
paint_entry PaintStructs[4000];
paint_struct* Quadrants[MAX_PAINT_QUADRANTS];
paint_struct PaintHead;
uint32_t ViewFlags;
uint32_t QuadrantBackIndex;
uint32_t QuadrantFrontIndex;
const void* CurrentlyDrawnItem;
paint_entry* EndOfPaintStructArray;
paint_entry* NextFreePaintStruct;
LocationXY16 SpritePosition;
paint_struct UnkF1A4CC;
paint_struct* UnkF1AD28;
paint_struct* LastRootPS;
attached_paint_struct* UnkF1AD2C;
uint8_t InteractionType;
uint8_t CurrentRotation;
Expand Down Expand Up @@ -224,12 +224,12 @@ void paint_floating_money_effect(
paint_session* session, money32 amount, rct_string_id string_id, int16_t y, int16_t z, int8_t y_offsets[], int16_t offset_x,
uint32_t rotation);

paint_session* paint_session_alloc(rct_drawpixelinfo* dpi);
void paint_session_free(paint_session*);
paint_session* paint_session_alloc(rct_drawpixelinfo* dpi, uint32_t viewFlags);
void paint_session_free(paint_session* session);
void paint_session_generate(paint_session* session);
void paint_session_arrange(paint_session* session);
paint_struct* paint_arrange_structs_helper(paint_struct* ps_next, uint16_t quadrantIndex, uint8_t flag, uint8_t rotation);
void paint_draw_structs(paint_session* session, uint32_t viewFlags);
void paint_draw_structs(paint_session* session);
void paint_draw_money_structs(rct_drawpixelinfo* dpi, paint_string_struct* ps);

// TESTING
Expand Down
12 changes: 6 additions & 6 deletions src/openrct2/paint/Supports.cpp
Expand Up @@ -344,7 +344,7 @@ bool wooden_a_supports_paint_setup(
*underground = false;
}

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
{
return false;
}
Expand Down Expand Up @@ -522,7 +522,7 @@ bool wooden_b_supports_paint_setup(
{
bool _9E32B1 = false;

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
{
if (underground != nullptr)
*underground = false; // AND
Expand Down Expand Up @@ -702,7 +702,7 @@ bool metal_a_supports_paint_setup(
{
support_height* supportSegments = session->SupportSegments;

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
{
return false;
}
Expand Down Expand Up @@ -907,7 +907,7 @@ bool metal_b_supports_paint_setup(
support_height* supportSegments = session->SupportSegments;
uint8_t originalSegment = segment;

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
{
return false; // AND
}
Expand Down Expand Up @@ -1090,7 +1090,7 @@ bool path_a_supports_paint_setup(
*underground = false; // AND
}

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
{
return false;
}
Expand Down Expand Up @@ -1234,7 +1234,7 @@ bool path_b_supports_paint_setup(
{
support_height* supportSegments = session->SupportSegments;

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)
{
return false; // AND
}
Expand Down
2 changes: 1 addition & 1 deletion src/openrct2/paint/sprite/Paint.Peep.cpp
Expand Up @@ -62,7 +62,7 @@ void peep_paint(paint_session* session, const rct_peep* peep, int32_t imageDirec
return;
}

if (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_PEEPS)
if (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_PEEPS)
{
return;
}
Expand Down
6 changes: 3 additions & 3 deletions src/openrct2/paint/sprite/Paint.Sprite.cpp
Expand Up @@ -29,7 +29,7 @@ void sprite_paint_setup(paint_session* session, const uint16_t x, const uint16_t
return;
}

if (gTrackDesignSaveMode || (gCurrentViewportFlags & VIEWPORT_FLAG_INVISIBLE_SPRITES))
if (gTrackDesignSaveMode || (session->ViewFlags & VIEWPORT_FLAG_INVISIBLE_SPRITES))
{
return;
}
Expand All @@ -46,7 +46,7 @@ void sprite_paint_setup(paint_session* session, const uint16_t x, const uint16_t
return;
}

const bool highlightPathIssues = (gCurrentViewportFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES);
const bool highlightPathIssues = (session->ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES);

for (const rct_sprite* spr = get_sprite(sprite_idx); sprite_idx != SPRITE_INDEX_NULL;
sprite_idx = spr->generic.next_in_quadrant)
Expand All @@ -73,7 +73,7 @@ void sprite_paint_setup(paint_session* session, const uint16_t x, const uint16_t
// Here converting from land/path/etc height scale to pixel height scale.
// Note: peeps/scenery on slopes will be above the base
// height of the slope element, and consequently clipped.
if ((gCurrentViewportFlags & VIEWPORT_FLAG_CLIP_VIEW))
if ((session->ViewFlags & VIEWPORT_FLAG_CLIP_VIEW))
{
if (spr->generic.z > (gClipHeight * 8))
{
Expand Down
2 changes: 1 addition & 1 deletion src/openrct2/paint/tile_element/Paint.Banner.cpp
Expand Up @@ -38,7 +38,7 @@ void banner_paint(paint_session* session, uint8_t direction, int32_t height, con

session->InteractionType = VIEWPORT_INTERACTION_ITEM_BANNER;

if (dpi->zoom_level > 1 || gTrackDesignSaveMode || (gCurrentViewportFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES))
if (dpi->zoom_level > 1 || gTrackDesignSaveMode || (session->ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES))
return;

height -= 16;
Expand Down

0 comments on commit eca13b9

Please sign in to comment.