mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Access temporary storage through ResolverObject during sprite layout preprocessing.
parent
85be7a4d92
commit
f59cf73b88
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue