diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index 9872675e54..eb67c83e20 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -243,10 +243,10 @@ uint16_t GetAirportTileCallback(CallbackID callback, uint32_t param1, uint32_t p static void AirportDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, Colours colour) { - const DrawTileSprites *dts = group->ProcessRegisters(nullptr); + auto dts = group->ProcessRegisters(nullptr); - SpriteID image = dts->ground.sprite; - SpriteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + SpriteID pal = dts.ground.pal; if (GB(image, 0, SPRITE_WIDTH) != 0) { if (image == SPR_FLAT_WATER_TILE && IsTileOnWater(ti->tile)) { @@ -256,7 +256,7 @@ static void AirportDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGrou } } - DrawNewGRFTileSeq(ti, dts, TO_BUILDINGS, 0, GetColourPalette(colour)); + DrawNewGRFTileSeq(ti, &dts, TO_BUILDINGS, 0, GetColourPalette(colour)); } bool DrawNewAirportTile(TileInfo *ti, Station *st, const AirportTileSpec *airts) diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index 8272f22583..a0d639514b 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -142,10 +142,9 @@ struct NewGRFSpriteLayout : DrawTileSprites { * @pre #PrepareLayout() and #ProcessRegisters() need calling first. * @return result spritelayout */ - std::span GetLayout(PalSpriteID *ground) const + DrawTileSpriteSpan GetLayout() const { - *ground = result_seq[0].image; - return {++result_seq.begin(), result_seq.end()}; + return {result_seq[0].image, {++result_seq.begin(), result_seq.end()}}; } std::span GetSequence() const override { return {this->seq.begin(), this->seq.end()}; } diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 06c2df614a..7562cd4df2 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -463,7 +463,7 @@ uint16_t GetHouseCallback(CallbackID callback, uint32_t param1, uint32_t param2, static void DrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, uint8_t stage, HouseID house_id) { - const DrawTileSprites *dts = group->ProcessRegisters(&stage); + auto dts = group->ProcessRegisters(&stage); const HouseSpec *hs = HouseSpec::Get(house_id); PaletteID palette = GetColourPalette(hs->random_colour[TileHash2Bit(ti->x, ti->y)]); @@ -475,8 +475,8 @@ static void DrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *grou } } - SpriteID image = dts->ground.sprite; - PaletteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + PaletteID pal = dts.ground.pal; if (HasBit(image, SPRITE_MODIFIER_CUSTOM_SPRITE)) image += stage; if (HasBit(pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) pal += stage; @@ -485,7 +485,7 @@ static void DrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *grou DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, palette)); } - DrawNewGRFTileSeq(ti, dts, TO_HOUSES, stage, palette); + DrawNewGRFTileSeq(ti, &dts, TO_HOUSES, stage, palette); } void DrawNewHouseTile(TileInfo *ti, HouseID 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; - const DrawTileSprites *dts = group->ProcessRegisters(&stage); + auto dts = group->ProcessRegisters(&stage); PaletteID palette = GetColourPalette(spec->random_colour[0]); if (spec->callback_mask.Test(HouseCallbackMask::Colour)) { @@ -539,8 +539,8 @@ void DrawNewHouseTileInGUI(int x, int y, const HouseSpec *spec, HouseID house_id } } - SpriteID image = dts->ground.sprite; - PaletteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + PaletteID pal = dts.ground.pal; if (HasBit(image, SPRITE_MODIFIER_CUSTOM_SPRITE)) image += stage; if (HasBit(pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) pal += stage; @@ -549,7 +549,7 @@ void DrawNewHouseTileInGUI(int x, int y, const HouseSpec *spec, HouseID house_id DrawSprite(image, GroundSpritePaletteTransform(image, pal, palette), x, y); } - DrawNewGRFTileSeqInGUI(x, y, dts, stage, palette); + DrawNewGRFTileSeqInGUI(x, y, &dts, stage, palette); } /* Simple wrapper for GetHouseCallback to keep the animation unified. */ diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index eaa4afbde7..e39b330e46 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -160,10 +160,10 @@ uint32_t IndustryTileResolverObject::GetDebugID() const static void IndustryDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, Colours rnd_colour, uint8_t stage) { - const DrawTileSprites *dts = group->ProcessRegisters(&stage); + auto dts = group->ProcessRegisters(&stage); - SpriteID image = dts->ground.sprite; - PaletteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + PaletteID pal = dts.ground.pal; if (HasBit(image, SPRITE_MODIFIER_CUSTOM_SPRITE)) image += stage; if (HasBit(pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) pal += stage; @@ -178,7 +178,7 @@ static void IndustryDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGro } } - DrawNewGRFTileSeq(ti, dts, TO_INDUSTRIES, stage, GetColourPalette(rnd_colour)); + DrawNewGRFTileSeq(ti, &dts, TO_INDUSTRIES, stage, GetColourPalette(rnd_colour)); } uint16_t GetIndustryTileCallback(CallbackID callback, uint32_t param1, uint32_t param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile) diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index b4c271e8c6..108df39e23 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -444,11 +444,11 @@ uint16_t GetObjectCallback(CallbackID callback, uint32_t param1, uint32_t param2 */ static void DrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, const ObjectSpec *spec) { - const DrawTileSprites *dts = group->ProcessRegisters(nullptr); + auto dts = group->ProcessRegisters(nullptr); PaletteID palette = (spec->flags.Test(ObjectFlag::Uses2CC) ? SPR_2CCMAP_BASE : PALETTE_RECOLOUR_START) + Object::GetByTile(ti->tile)->colour; - SpriteID image = dts->ground.sprite; - PaletteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + PaletteID pal = dts.ground.pal; if (GB(image, 0, SPRITE_WIDTH) != 0) { /* If the ground sprite is the default flat water sprite, draw also canal/river borders @@ -460,7 +460,7 @@ static void DrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *grou } } - DrawNewGRFTileSeq(ti, dts, TO_STRUCTURES, 0, palette); + DrawNewGRFTileSeq(ti, &dts, TO_STRUCTURES, 0, palette); } /** @@ -492,7 +492,7 @@ void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view) const auto *group = object.Resolve(); if (group == nullptr) return; - const DrawTileSprites *dts = group->ProcessRegisters(nullptr); + auto dts = group->ProcessRegisters(nullptr); PaletteID palette; if (Company::IsValidID(_local_company)) { @@ -508,14 +508,14 @@ void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view) palette = spec->flags.Test(ObjectFlag::Uses2CC) ? SPR_2CCMAP_BASE : PALETTE_RECOLOUR_START; } - SpriteID image = dts->ground.sprite; - PaletteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + PaletteID pal = dts.ground.pal; if (GB(image, 0, SPRITE_WIDTH) != 0) { DrawSprite(image, GroundSpritePaletteTransform(image, pal, palette), x, y); } - DrawNewGRFTileSeqInGUI(x, y, dts, 0, palette); + DrawNewGRFTileSeqInGUI(x, y, &dts, 0, palette); } /** diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index 05dec4f4bc..f17399400b 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -293,12 +293,12 @@ 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; - const DrawTileSprites *dts = group->ProcessRegisters(nullptr); + auto dts = group->ProcessRegisters(nullptr); PaletteID palette = GetCompanyPalette(_local_company); - SpriteID image = dts->ground.sprite; - PaletteID pal = dts->ground.pal; + SpriteID image = dts.ground.sprite; + PaletteID pal = dts.ground.pal; RoadStopDrawModes draw_mode; if (spec->flags.Test(RoadStopSpecFlag::DrawModeRegister)) { @@ -340,7 +340,7 @@ void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec, } } - DrawCommonTileSeqInGUI(x, y, dts, 0, 0, palette, true); + DrawCommonTileSeqInGUI(x, y, &dts, 0, 0, palette, true); } const TileLayoutSpriteGroup *GetRoadStopLayout(TileInfo *ti, const RoadStopSpec *spec, BaseStation *st, StationType type, int view) diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index f8f20cf558..0ccff23851 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -287,21 +287,19 @@ static bool RangeHighComparator(const DeterministicSpriteGroupRange &range, uint * @param[in,out] stage Construction stage (0-3), or nullptr if not applicable. * @return sprite layout to draw. */ -const DrawTileSprites *TileLayoutSpriteGroup::ProcessRegisters(uint8_t *stage) const +DrawTileSpriteSpan TileLayoutSpriteGroup::ProcessRegisters(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); - return &this->dts; + return {this->dts.ground, this->dts.seq}; } - static DrawTileSpriteSpan result; uint8_t actual_stage = stage != nullptr ? *stage : 0; this->dts.PrepareLayout(0, 0, 0, actual_stage, false); this->dts.ProcessRegisters(0, 0, false); - result.seq = this->dts.GetLayout(&result.ground); /* Stage has been processed by PrepareLayout(), set it to zero. */ if (stage != nullptr) *stage = 0; - return &result; + return this->dts.GetLayout(); } diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index 3afc45f9f0..b117c3491f 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -260,7 +260,7 @@ struct TileLayoutSpriteGroup : SpriteGroup { NewGRFSpriteLayout dts{}; - const DrawTileSprites *ProcessRegisters(uint8_t *stage) const; + DrawTileSpriteSpan ProcessRegisters(uint8_t *stage) const; }; struct IndustryProductionSpriteGroup : SpriteGroup { diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 6bae4d3d82..1824d39e17 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -824,7 +824,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID layout->ProcessRegisters(var10, var10_relocation, separate_ground); } - tmp_rail_layout.seq = layout->GetLayout(&tmp_rail_layout.ground); + tmp_rail_layout = layout->GetLayout(); sprites = &tmp_rail_layout; total_offset = 0; } else { diff --git a/src/sprite.h b/src/sprite.h index 948259c655..d02ffcad77 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -58,8 +58,7 @@ struct DrawTileSprites { struct DrawTileSpriteSpan : DrawTileSprites { std::span seq; ///< Child sprites, - template - DrawTileSpriteSpan(PalSpriteID ground, const DrawTileSeqStruct (&seq)[N]) : DrawTileSprites(ground), seq(std::begin(seq), std::end(seq)) {} + DrawTileSpriteSpan(PalSpriteID ground, std::span seq) : DrawTileSprites(ground), seq(seq) {} DrawTileSpriteSpan(PalSpriteID ground) : DrawTileSprites(ground) {}; DrawTileSpriteSpan() = default; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 00407f7668..0f93d36c80 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3076,7 +3076,7 @@ bool SplitGroundSpriteForOverlay(const TileInfo *ti, SpriteID *ground, RailTrack static void DrawTile_Station(TileInfo *ti) { const NewGRFSpriteLayout *layout = nullptr; - DrawTileSpriteSpan tmp_rail_layout; + DrawTileSpriteSpan tmp_layout; const DrawTileSprites *t = nullptr; int32_t total_offset; const RailTypeInfo *rti = nullptr; @@ -3273,8 +3273,8 @@ draw_default_foundation: uint32_t var10_relocation = GetCustomStationRelocation(statspec, st, ti->tile, var10); layout->ProcessRegisters(var10, var10_relocation, separate_ground); } - tmp_rail_layout.seq = layout->GetLayout(&tmp_rail_layout.ground); - t = &tmp_rail_layout; + tmp_layout = layout->GetLayout(); + t = &tmp_layout; total_offset = 0; } else if (statspec != nullptr) { /* Simple sprite layout */ @@ -3337,7 +3337,8 @@ draw_default_foundation: if (type == StationType::RoadWaypoint && stop_draw_mode.Test(RoadStopDrawMode::WaypGround)) { draw_ground = true; } - t = group->ProcessRegisters(nullptr); + tmp_layout = group->ProcessRegisters(nullptr); + t = &tmp_layout; } }