Cache whether ground vehicles currently have 0 slope resistance
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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:");
|
||||||
|
@@ -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. */
|
||||||
|
Reference in New Issue
Block a user