Cache whether ground vehicles currently have 0 slope resistance

This commit is contained in:
Jonathan G Rennison
2019-02-16 21:27:08 +00:00
parent e6b788591d
commit 3b55f5d765
5 changed files with 12 additions and 1 deletions

View File

@@ -112,6 +112,7 @@ void GroundVehicle<T, Type>::CargoChanged()
u->gcache.cached_slope_resistance = current_weight * u->GetSlopeSteepness() * 100; u->gcache.cached_slope_resistance = current_weight * u->GetSlopeSteepness() * 100;
u->cur_image_valid_dir = INVALID_DIR; u->cur_image_valid_dir = INVALID_DIR;
} }
ClrBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
/* Store consist weight in cache. */ /* Store consist weight in cache. */
this->gcache.cached_weight = max<uint32>(1, weight); this->gcache.cached_weight = max<uint32>(1, weight);
@@ -332,12 +333,14 @@ void GroundVehicle<T, Type>::UpdateZPositionInWormhole()
if (delta != 2) { if (delta != 2) {
slope = slope_north; slope = slope_north;
SetBit(this->gv_flags, going_north ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT); SetBit(this->gv_flags, going_north ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT);
ClrBit(this->First()->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
} }
} else if ((delta = south_coord - pos_coord) <= 3) { } else if ((delta = south_coord - pos_coord) <= 3) {
this->z_pos = TILE_HEIGHT * (delta == 3 ? -2 : -1); this->z_pos = TILE_HEIGHT * (delta == 3 ? -2 : -1);
if (delta != 2) { if (delta != 2) {
slope = SLOPE_ELEVATED ^ slope_north; slope = SLOPE_ELEVATED ^ slope_north;
SetBit(this->gv_flags, going_north ? GVF_GOINGDOWN_BIT : GVF_GOINGUP_BIT); SetBit(this->gv_flags, going_north ? GVF_GOINGDOWN_BIT : GVF_GOINGUP_BIT);
ClrBit(this->First()->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
} }
} }

View File

@@ -118,8 +118,10 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
* Calculates the total slope resistance for this vehicle. * Calculates the total slope resistance for this vehicle.
* @return Slope resistance. * @return Slope resistance.
*/ */
inline int64 GetSlopeResistance() const inline int64 GetSlopeResistance()
{ {
if (likely(HasBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST))) return 0;
int64 incl = 0; int64 incl = 0;
for (const T *u = T::From(this); u != NULL; u = u->Next()) { for (const T *u = T::From(this); u != NULL; u = u->Next()) {
@@ -129,6 +131,7 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
incl -= u->gcache.cached_slope_resistance; incl -= u->gcache.cached_slope_resistance;
} }
} }
if (incl == 0) SetBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
return incl; return incl;
} }
@@ -154,6 +157,7 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
if (middle_z != this->z_pos) { if (middle_z != this->z_pos) {
SetBit(this->gv_flags, (middle_z > this->z_pos) ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT); SetBit(this->gv_flags, (middle_z > this->z_pos) ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT);
ClrBit(this->First()->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
} }
} }
} }

View File

@@ -2175,6 +2175,8 @@ void ReverseTrainDirection(Train *v)
AdvanceWagonsAfterSwap(v); AdvanceWagonsAfterSwap(v);
ClrBit(v->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
if (IsRailDepotTile(v->tile)) { if (IsRailDepotTile(v->tile)) {
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
} }

View File

@@ -3706,6 +3706,7 @@ char *Vehicle::DumpVehicleFlags(char *b, const char *last) const
dump('a', HasBit(this->vehicle_flags, VF_AUTOMATE_TIMETABLE)); dump('a', HasBit(this->vehicle_flags, VF_AUTOMATE_TIMETABLE));
b += seprintf(b, last, ", vcf:"); b += seprintf(b, last, ", vcf:");
dump('l', HasBit(this->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT)); dump('l', HasBit(this->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT));
dump('z', HasBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST));
if (this->IsGroundVehicle()) { if (this->IsGroundVehicle()) {
uint16 gv_flags = this->GetGroundVehicleFlags(); uint16 gv_flags = this->GetGroundVehicleFlags();
b += seprintf(b, last, ", gvf:"); b += seprintf(b, last, ", gvf:");

View File

@@ -135,6 +135,7 @@ enum GroundVehicleSubtypeFlags {
*/ */
enum VehicleCacheFlags { enum VehicleCacheFlags {
VCF_LAST_VISUAL_EFFECT = 0, ///< Last vehicle in the consist with a visual effect. VCF_LAST_VISUAL_EFFECT = 0, ///< Last vehicle in the consist with a visual effect.
VCF_GV_ZERO_SLOPE_RESIST = 1, ///< GrounVehicle: Consist has zero slope resistance (valid only for the first engine), may be false negative.
}; };
/** Cached often queried values common to all vehicles. */ /** Cached often queried values common to all vehicles. */