1
0
Fork 0

Codechange: Access temporary storage through ResolverObject during sprite layout preprocessing.

pull/14224/head
frosch 2025-05-05 21:59:56 +02:00 committed by frosch
parent 85be7a4d92
commit f59cf73b88
10 changed files with 24 additions and 22 deletions

View File

@ -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;

View File

@ -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<int16_t>(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<int16_t>(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 {

View File

@ -159,7 +159,7 @@ public:
*/
SetBitIterator<uint8_t, uint32_t> 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.

View File

@ -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]);

View File

@ -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;

View File

@ -476,7 +476,7 @@ void DrawNewObjectTile(TileInfo *ti, const ObjectSpec *spec)
const auto *group = object.Resolve<TileLayoutSpriteGroup>();
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<TileLayoutSpriteGroup>();
if (group == nullptr) return;
auto processor = group->ProcessRegisters(nullptr);
auto processor = group->ProcessRegisters(object, nullptr);
auto dts = processor.GetLayout();
PaletteID palette;

View File

@ -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<TileLayoutSpriteGroup>();
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<SpriteLayoutProcessor> GetRoadStopLayout(TileInfo *ti, const RoadS
RoadStopResolverObject object(spec, st, ti->tile, INVALID_ROADTYPE, type, view);
auto group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr) return std::nullopt;
return group->ProcessRegisters(nullptr);
return group->ProcessRegisters(object, nullptr);
}
/** Wrapper for animation control, see GetRoadStopCallback. */

View File

@ -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;

View File

@ -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 {

View File

@ -635,7 +635,7 @@ void GetCustomStationRelocation(SpriteLayoutProcessor &processor, const StationS
object.callback_param1 = var10;
const auto *group = object.Resolve<ResultSpriteGroup>();
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);
}
}