diff options
Diffstat (limited to 'src/vehicle_base.h')
-rw-r--r-- | src/vehicle_base.h | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 8ef316df1..d6a02cc0c 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -124,13 +124,6 @@ struct VehicleCache { byte cached_vis_effect; ///< Visual effect to show (see #VisualEffect) }; -/** Values for controlling how a vehicle's sprites are refreshed */ -struct VehicleSpriteRefreshState { - Direction last_direction; ///< Last direction we obtained sprites for - bool is_viewport_candidate; ///< The vehicle has been in the hash for a shown viewport recently - bool sprite_has_viewport_changes; ///< There have been viewport changes since the sprite was last updated -}; - /** Sprite sequence for a vehicle part. */ struct VehicleSpriteSeq { PalSpriteID seq[4]; @@ -188,6 +181,17 @@ struct VehicleSpriteSeq { void Draw(int x, int y, PaletteID default_pal, bool force_pal) const; }; +/** + * Cache for vehicle sprites and values relating to whether they should be updated before drawing, + * or calculating the viewport. + */ +struct MutableSpriteCache { + Direction last_direction; ///< Last direction we obtained sprites for + mutable bool is_viewport_candidate; ///< The vehicle has been in the hash for a shown viewport recently + mutable bool sprite_has_viewport_changes; ///< There have been viewport changes since the sprite was last updated + mutable VehicleSpriteSeq sprite_seq; ///< Vehicle appearance. +}; + /** A vehicle pool for a little over 1 million vehicles. */ typedef Pool<Vehicle, VehicleID, 512, 0xFF000> VehiclePool; extern VehiclePool _vehicle_pool; @@ -282,7 +286,6 @@ public: * 0xff == reserved for another custom sprite */ byte spritenum; - VehicleSpriteSeq sprite_seq; ///< Vehicle appearance. byte x_extent; ///< x-extent of vehicle bounding box byte y_extent; ///< y-extent of vehicle bounding box byte z_extent; ///< z-extent of vehicle bounding box @@ -334,7 +337,7 @@ public: NewGRFCache grf_cache; ///< Cache of often used calculated NewGRF values VehicleCache vcache; ///< Cache of often used vehicle values. - VehicleSpriteRefreshState rstate; ///< Values relating to whether sprites should be refreshed, see #VehicleSpriteRefreshState + MutableSpriteCache sprite_cache; ///< Cache of sprites and values related to recalculating them, see #MutableSpriteCache Vehicle(VehicleType type = VEH_INVALID); @@ -1044,7 +1047,7 @@ struct SpecializedVehicle : public Vehicle { */ inline SpecializedVehicle<T, Type>() : Vehicle(Type) { - this->sprite_seq.count = 1; + this->sprite_cache.sprite_seq.count = 1; } /** @@ -1193,24 +1196,24 @@ struct SpecializedVehicle : public Vehicle { * there won't be enough change in bounding box or offsets to need * to resolve a new sprite. */ - if (this->direction != this->rstate.last_direction || this->rstate.is_viewport_candidate) { + if (this->direction != this->sprite_cache.last_direction || this->sprite_cache.is_viewport_candidate) { VehicleSpriteSeq seq; ((T*)this)->T::GetImage(this->direction, EIT_ON_MAP, &seq); - if (this->sprite_seq != seq) { + if (this->sprite_cache.sprite_seq != seq) { sprite_has_changed = true; - this->sprite_seq = seq; + this->sprite_cache.sprite_seq = seq; } - this->rstate.last_direction = this->direction; - this->rstate.is_viewport_candidate = false; - this->rstate.sprite_has_viewport_changes = false; + this->sprite_cache.last_direction = this->direction; + this->sprite_cache.is_viewport_candidate = false; + this->sprite_cache.sprite_has_viewport_changes = false; } else { /* * Changes could still be relevant when we render the vehicle even if * they don't alter the bounding box */ - this->rstate.sprite_has_viewport_changes = true; + this->sprite_cache.sprite_has_viewport_changes = true; } if (force_update || sprite_has_changed) { |