Cache whether ground vehicles currently have 0 slope resistance

pull/78/head
Jonathan G Rennison 5 years ago
parent e6b788591d
commit 3b55f5d765

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

@ -118,8 +118,10 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
* Calculates the total slope resistance for this vehicle.
* @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;
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;
}
}
if (incl == 0) SetBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST);
return incl;
}
@ -154,6 +157,7 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
if (middle_z != this->z_pos) {
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);
}
}
}

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

@ -3706,6 +3706,7 @@ char *Vehicle::DumpVehicleFlags(char *b, const char *last) const
dump('a', HasBit(this->vehicle_flags, VF_AUTOMATE_TIMETABLE));
b += seprintf(b, last, ", vcf:");
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()) {
uint16 gv_flags = this->GetGroundVehicleFlags();
b += seprintf(b, last, ", gvf:");

@ -135,6 +135,7 @@ enum GroundVehicleSubtypeFlags {
*/
enum VehicleCacheFlags {
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. */

Loading…
Cancel
Save