From f59cf73b8849e62fbc398f31b99475e05f8cca4e Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 5 May 2025 21:59:56 +0200 Subject: [PATCH] Codechange: Access temporary storage through ResolverObject during sprite layout preprocessing. --- src/newgrf_airporttiles.cpp | 2 +- src/newgrf_commons.cpp | 19 ++++++++++--------- src/newgrf_commons.h | 2 +- src/newgrf_house.cpp | 4 ++-- src/newgrf_industrytiles.cpp | 2 +- src/newgrf_object.cpp | 4 ++-- src/newgrf_roadstop.cpp | 4 ++-- src/newgrf_spritegroup.cpp | 5 +++-- src/newgrf_spritegroup.h | 2 +- src/newgrf_station.cpp | 2 +- 10 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index ed6e2d7203..dd976c0117 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -276,7 +276,7 @@ bool DrawNewAirportTile(TileInfo *ti, Station *st, const AirportTileSpec *airts) return false; } - auto processor = group->ProcessRegisters(nullptr); + auto processor = group->ProcessRegisters(object, nullptr); auto dts = processor.GetLayout(); AirportDrawTileLayout(ti, dts, Company::Get(st->owner)->colour); return true; diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index af4dc6b8ea..c4b642407b 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -651,10 +651,11 @@ SpriteLayoutProcessor::SpriteLayoutProcessor(const NewGRFSpriteLayout &raw_layou /** * Evaluates the register modifiers and integrates them into the preprocessed sprite layout. + * @param object ResolverObject owning the temporary storage. * @param resolved_var10 The value of var10 the action-1-2-3 chain was evaluated for. * @param resolved_sprite Result sprite of the action-1-2-3 chain. */ -void SpriteLayoutProcessor::ProcessRegisters(uint8_t resolved_var10, uint32_t resolved_sprite) +void SpriteLayoutProcessor::ProcessRegisters(const ResolverObject &object, uint8_t resolved_var10, uint32_t resolved_sprite) { assert(this->raw_layout != nullptr); const TileLayoutRegisters *regs = this->raw_layout->registers.empty() ? nullptr : this->raw_layout->registers.data(); @@ -669,12 +670,12 @@ void SpriteLayoutProcessor::ProcessRegisters(uint8_t resolved_var10, uint32_t re uint8_t var10 = (flags & TLF_SPRITE_VAR10) ? regs->sprite_var10 : (ground && this->separate_ground ? 1 : 0); if (var10 == resolved_var10) { /* Apply registers */ - if ((flags & TLF_DODRAW) && GetRegister(regs->dodraw) == 0) { + if ((flags & TLF_DODRAW) && object.GetRegister(regs->dodraw) == 0) { result.image.sprite = 0; } else { if (HasBit(result.image.sprite, SPRITE_MODIFIER_CUSTOM_SPRITE)) result.image.sprite += resolved_sprite; if (flags & TLF_SPRITE) { - int16_t offset = (int16_t)GetRegister(regs->sprite); // mask to 16 bits to avoid trouble + int16_t offset = static_cast(object.GetRegister(regs->sprite)); // mask to 16 bits to avoid trouble if (!HasBit(result.image.sprite, SPRITE_MODIFIER_CUSTOM_SPRITE) || (offset >= 0 && offset < regs->max_sprite_offset)) { result.image.sprite += offset; } else { @@ -684,13 +685,13 @@ void SpriteLayoutProcessor::ProcessRegisters(uint8_t resolved_var10, uint32_t re if (result.IsParentSprite()) { if (flags & TLF_BB_XY_OFFSET) { - result.delta_x += GetRegister(regs->delta.parent[0]); - result.delta_y += GetRegister(regs->delta.parent[1]); + result.delta_x += object.GetRegister(regs->delta.parent[0]); + result.delta_y += object.GetRegister(regs->delta.parent[1]); } - if (flags & TLF_BB_Z_OFFSET) result.delta_z += GetRegister(regs->delta.parent[2]); + if (flags & TLF_BB_Z_OFFSET) result.delta_z += object.GetRegister(regs->delta.parent[2]); } else { - if (flags & TLF_CHILD_X_OFFSET) result.delta_x += GetRegister(regs->delta.child[0]); - if (flags & TLF_CHILD_Y_OFFSET) result.delta_y += GetRegister(regs->delta.child[1]); + if (flags & TLF_CHILD_X_OFFSET) result.delta_x += object.GetRegister(regs->delta.child[0]); + if (flags & TLF_CHILD_Y_OFFSET) result.delta_y += object.GetRegister(regs->delta.child[1]); } } } @@ -704,7 +705,7 @@ void SpriteLayoutProcessor::ProcessRegisters(uint8_t resolved_var10, uint32_t re /* Apply registers */ if (HasBit(result.image.pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) result.image.pal += resolved_sprite; if (flags & TLF_PALETTE) { - int16_t offset = (int16_t)GetRegister(regs->palette); // mask to 16 bits to avoid trouble + int16_t offset = static_cast(object.GetRegister(regs->palette)); // mask to 16 bits to avoid trouble if (!HasBit(result.image.pal, SPRITE_MODIFIER_CUSTOM_SPRITE) || (offset >= 0 && offset < regs->max_palette_offset)) { result.image.pal += offset; } else { diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index 0b9b10fdae..0754a8887f 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -159,7 +159,7 @@ public: */ SetBitIterator Var10Values() const { return this->var10_values; } - void ProcessRegisters(uint8_t resolved_var10, uint32_t resolved_sprite); + void ProcessRegisters(const struct ResolverObject &object, uint8_t resolved_var10, uint32_t resolved_sprite); /** * Returns the result spritelayout after preprocessing. diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 0c2769df7b..f8b574ea14 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -507,7 +507,7 @@ void DrawNewHouseTile(TileInfo *ti, HouseID house_id) if (group != nullptr) { /* Limit the building stage to the number of stages supplied. */ uint8_t stage = GetHouseBuildingStage(ti->tile); - auto processor = group->ProcessRegisters(&stage); + auto processor = group->ProcessRegisters(object, &stage); auto dts = processor.GetLayout(); DrawTileLayout(ti, dts, stage, house_id); } @@ -528,7 +528,7 @@ void DrawNewHouseTileInGUI(int x, int y, const HouseSpec *spec, HouseID house_id if (group == nullptr) return; uint8_t stage = TOWN_HOUSE_COMPLETED; - auto processor = group->ProcessRegisters(&stage); + auto processor = group->ProcessRegisters(object, &stage); auto dts = processor.GetLayout(); PaletteID palette = GetColourPalette(spec->random_colour[0]); diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index d5db7331fd..0666aaf01f 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -208,7 +208,7 @@ bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const Indus /* Limit the building stage to the number of stages supplied. */ uint8_t stage = GetIndustryConstructionStage(ti->tile); - auto processor = group->ProcessRegisters(&stage); + auto processor = group->ProcessRegisters(object, &stage); auto dts = processor.GetLayout(); IndustryDrawTileLayout(ti, dts, i->random_colour, stage); return true; diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index e7cb9d31d5..0cd4f39178 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -476,7 +476,7 @@ void DrawNewObjectTile(TileInfo *ti, const ObjectSpec *spec) const auto *group = object.Resolve(); if (group == nullptr) return; - auto processor = group->ProcessRegisters(nullptr); + auto processor = group->ProcessRegisters(object, nullptr); auto dts = processor.GetLayout(); DrawTileLayout(ti, dts, spec); } @@ -494,7 +494,7 @@ void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view) const auto *group = object.Resolve(); if (group == nullptr) return; - auto processor = group->ProcessRegisters(nullptr); + auto processor = group->ProcessRegisters(object, nullptr); auto dts = processor.GetLayout(); PaletteID palette; diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index 0bdee27277..612c7b1a51 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -293,7 +293,7 @@ void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec, RoadStopResolverObject object(spec, nullptr, INVALID_TILE, roadtype, type, view); const auto *group = object.Resolve(); if (group == nullptr) return; - auto processor = group->ProcessRegisters(nullptr); + auto processor = group->ProcessRegisters(object, nullptr); auto dts = processor.GetLayout(); PaletteID palette = GetCompanyPalette(_local_company); @@ -349,7 +349,7 @@ std::optional GetRoadStopLayout(TileInfo *ti, const RoadS RoadStopResolverObject object(spec, st, ti->tile, INVALID_ROADTYPE, type, view); auto group = object.Resolve(); if (group == nullptr) return std::nullopt; - return group->ProcessRegisters(nullptr); + return group->ProcessRegisters(object, nullptr); } /** Wrapper for animation control, see GetRoadStopCallback. */ diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 05c5b0f168..9bdc6a1abb 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -284,10 +284,11 @@ static bool RangeHighComparator(const DeterministicSpriteGroupRange &range, uint * Process registers and the construction stage into the sprite layout. * The passed construction stage might get reset to zero, if it gets incorporated into the layout * during the preprocessing. + * @param object ResolverObject owning the temporary storage. * @param[in,out] stage Construction stage (0-3), or nullptr if not applicable. * @return sprite layout to draw. */ -SpriteLayoutProcessor TileLayoutSpriteGroup::ProcessRegisters(uint8_t *stage) const +SpriteLayoutProcessor TileLayoutSpriteGroup::ProcessRegisters(const ResolverObject &object, uint8_t *stage) const { if (!this->dts.NeedsPreprocessing()) { if (stage != nullptr && this->dts.consistent_max_offset > 0) *stage = GetConstructionStageOffset(*stage, this->dts.consistent_max_offset); @@ -296,7 +297,7 @@ SpriteLayoutProcessor TileLayoutSpriteGroup::ProcessRegisters(uint8_t *stage) co uint8_t actual_stage = stage != nullptr ? *stage : 0; SpriteLayoutProcessor result(this->dts, 0, 0, 0, actual_stage, false); - result.ProcessRegisters(0, 0); + result.ProcessRegisters(object, 0, 0); /* Stage has been processed by PrepareLayout(), set it to zero. */ if (stage != nullptr) *stage = 0; diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index b0d1ef1136..04613d12d6 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -260,7 +260,7 @@ struct TileLayoutSpriteGroup : SpriteGroup { NewGRFSpriteLayout dts{}; - SpriteLayoutProcessor ProcessRegisters(uint8_t *stage) const; + SpriteLayoutProcessor ProcessRegisters(const ResolverObject &object, uint8_t *stage) const; }; struct IndustryProductionSpriteGroup : SpriteGroup { diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 0a27ba428a..14276b341c 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -635,7 +635,7 @@ void GetCustomStationRelocation(SpriteLayoutProcessor &processor, const StationS object.callback_param1 = var10; const auto *group = object.Resolve(); if (group == nullptr || group->num_sprites == 0) continue; - processor.ProcessRegisters(var10, group->sprite - SPR_RAIL_PLATFORM_Y_FRONT); + processor.ProcessRegisters(object, var10, group->sprite - SPR_RAIL_PLATFORM_Y_FRONT); } }