Cache whether vehicle is currently drawn: Vehicle::IsDrawn()

pull/132/head
Jonathan G Rennison 4 years ago
parent 81a67b5b24
commit 76f68c48f5

@ -577,9 +577,11 @@ void HandleAircraftEnterHangar(Aircraft *v)
Aircraft *u = v->Next();
u->vehstatus |= VS_HIDDEN;
u->UpdateIsDrawn();
u = u->Next();
if (u != nullptr) {
u->vehstatus |= VS_HIDDEN;
u->UpdateIsDrawn();
u->cur_speed = 0;
}
@ -1493,14 +1495,17 @@ void AircraftLeaveHangar(Aircraft *v, Direction exit_dir)
v->progress = 0;
v->direction = exit_dir;
v->vehstatus &= ~VS_HIDDEN;
v->UpdateIsDrawn();
{
Vehicle *u = v->Next();
u->vehstatus &= ~VS_HIDDEN;
u->UpdateIsDrawn();
/* Rotor blades */
u = u->Next();
if (u != nullptr) {
u->vehstatus &= ~VS_HIDDEN;
u->UpdateIsDrawn();
u->cur_speed = 80;
}
}

@ -180,6 +180,7 @@ DisasterVehicle::DisasterVehicle(int x, int y, Direction direction, DisasterSubT
this->owner = OWNER_NONE;
this->image_override = 0;
this->current_order.Free();
this->UpdateIsDrawn();
this->UpdateImage();
this->UpdatePositionAndViewport();

@ -632,6 +632,8 @@ EffectVehicle *CreateEffectVehicle(int x, int y, int z, EffectVehicleType type)
_effect_init_procs[type](v);
v->UpdateIsDrawn();
v->UpdatePositionAndViewport();
v->AddEffectVehicleToTickCache();

@ -3671,6 +3671,7 @@ static VehicleEnterTileStatus VehicleEnter_Track(Vehicle *u, TileIndex tile, int
v->track = TRACK_BIT_DEPOT,
v->vehstatus |= VS_HIDDEN; // hide it
v->UpdateIsDrawn();
v->direction = ReverseDir(v->direction);
if (v->Next() == nullptr) VehicleEnterDepot(v->First());
v->tile = tile;
@ -3684,6 +3685,7 @@ static VehicleEnterTileStatus VehicleEnter_Track(Vehicle *u, TileIndex tile, int
if ((v = v->Next()) != nullptr) {
v->vehstatus &= ~VS_HIDDEN;
v->track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
v->UpdateIsDrawn();
}
}
}

@ -2362,6 +2362,7 @@ static VehicleEnterTileStatus VehicleEnter_Road(Vehicle *v, TileIndex tile, int
rv->direction = ReverseDir(rv->direction);
if (rv->Next() == nullptr) VehicleEnterDepot(rv->First());
rv->tile = tile;
rv->UpdateIsDrawn();
InvalidateWindowData(WC_VEHICLE_DEPOT, rv->tile);
return VETSB_ENTERED_WORMHOLE;

@ -1119,6 +1119,7 @@ static bool RoadVehLeaveDepot(RoadVehicle *v, bool first)
v->cur_image_valid_dir = INVALID_DIR;
v->state = tdir;
v->frame = RVC_DEPOT_START_FRAME;
v->UpdateIsDrawn();
v->x_pos = x;
v->y_pos = y;

@ -3795,6 +3795,8 @@ bool AfterLoadGame()
InvalidateVehicleTickCaches();
ClearVehicleTickCaches();
UpdateAllVehiclesIsDrawn();
extern void YapfCheckRailSignalPenalties();
YapfCheckRailSignalPenalties();

@ -405,6 +405,7 @@ static bool CheckShipLeaveDepot(Ship *v)
v->state = AxisToTrackBits(axis);
v->vehstatus &= ~VS_HIDDEN;
v->UpdateIsDrawn();
v->cur_speed = 0;
v->UpdateViewport(true, true);

@ -1835,6 +1835,8 @@ static void UpdateStatusAfterSwap(Train *v)
/* Reverse the direction. */
if (v->track != TRACK_BIT_DEPOT) v->direction = ReverseDir(v->direction);
v->UpdateIsDrawn();
/* Call the proper EnterTile function unless we are in a wormhole. */
if (!(v->track & TRACK_BIT_WORMHOLE)) {
VehicleEnterTile(v, v->tile, v->x_pos, v->y_pos);
@ -2642,6 +2644,7 @@ static bool CheckTrainStayInDepot(Train *v)
if (v->direction & 2) v->track = TRACK_BIT_Y;
v->vehstatus &= ~VS_HIDDEN;
v->UpdateIsDrawn();
v->cur_speed = 0;
v->UpdateViewport(true, true);

@ -70,6 +70,9 @@ static inline bool IsInvisibilitySet(TransparencyOption to)
static inline void ToggleTransparency(TransparencyOption to)
{
ToggleBit(_transparency_opt, to);
extern void UpdateAllVehiclesIsDrawn();
if (to == TO_TUNNELS) UpdateAllVehiclesIsDrawn();
}
/**

@ -2566,6 +2566,7 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
t->track = TRACK_BIT_WORMHOLE;
if (Tunnel::GetByTile(tile)->is_chunnel) SetBit(t->gv_flags, GVF_CHUNNEL_BIT);
t->vehstatus |= VS_HIDDEN;
t->UpdateIsDrawn();
return VETSB_ENTERED_WORMHOLE;
}
}
@ -2577,6 +2578,7 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
t->track = DiagDirToDiagTrackBits(vdir);
assert(t->track);
t->vehstatus &= ~VS_HIDDEN;
t->UpdateIsDrawn();
return VETSB_ENTERED_WORMHOLE;
}
} else if (v->type == VEH_ROAD) {
@ -2593,6 +2595,7 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
rv->state = RVSB_WORMHOLE;
if (Tunnel::GetByTile(tile)->is_chunnel) SetBit(rv->gv_flags, GVF_CHUNNEL_BIT);
rv->vehstatus |= VS_HIDDEN;
rv->UpdateIsDrawn();
return VETSB_ENTERED_WORMHOLE;
} else {
return VETSB_CONTINUE;
@ -2607,6 +2610,7 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
rv->state = DiagDirToDiagTrackdir(vdir);
rv->frame = TILE_SIZE - (frame + 1);
rv->vehstatus &= ~VS_HIDDEN;
rv->UpdateIsDrawn();
return VETSB_ENTERED_WORMHOLE;
}
}

@ -358,15 +358,22 @@ uint Vehicle::Crash(bool flooded)
}
/**
* Get whether a the vehicle should be drawn (i.e. if it isn't hidden, or it is in a tunnel but being shown transparently)
* Update cache of whether the vehicle should be drawn (i.e. if it isn't hidden, or it is in a tunnel but being shown transparently)
* @return whether to show vehicle
*/
bool Vehicle::IsDrawn() const
void Vehicle::UpdateIsDrawn()
{
return !(HasBit(this->subtype, GVSF_VIRTUAL)) && (!(this->vehstatus & VS_HIDDEN) ||
bool drawn = !(HasBit(this->subtype, GVSF_VIRTUAL)) && (!(this->vehstatus & VS_HIDDEN) ||
(IsTransparencySet(TO_TUNNELS) &&
((this->type == VEH_TRAIN && Train::From(this)->track == TRACK_BIT_WORMHOLE) ||
(this->type == VEH_ROAD && RoadVehicle::From(this)->state == RVSB_WORMHOLE))));
SB(this->vcache.cached_veh_flags, VCF_IS_DRAWN, 1, drawn ? 1 : 0);
}
void UpdateAllVehiclesIsDrawn()
{
for (Vehicle *v : Vehicle::Iterate()) { v->UpdateIsDrawn(); }
}
/**
@ -2240,6 +2247,7 @@ void VehicleEnterDepot(Vehicle *v)
SetWindowDirty(WC_VEHICLE_DEPOT, v->tile);
v->vehstatus |= VS_HIDDEN;
v->UpdateIsDrawn();
v->cur_speed = 0;
VehicleServiceInDepot(v);
@ -3847,6 +3855,7 @@ char *Vehicle::DumpVehicleFlags(char *b, const char *last) const
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));
dump('d', HasBit(this->vcache.cached_veh_flags, VCF_IS_DRAWN));
if (this->IsGroundVehicle()) {
uint16 gv_flags = this->GetGroundVehicleFlags();
b += seprintf(b, last, ", gvf:");

@ -134,7 +134,8 @@ 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.
VCF_GV_ZERO_SLOPE_RESIST = 1, ///< GroundVehicle: Consist has zero slope resistance (valid only for the first engine), may be false negative.
VCF_IS_DRAWN = 2, ///< Vehicle is currently drawn
};
/** Cached often queried values common to all vehicles. */
@ -1093,7 +1094,12 @@ public:
return v;
}
bool IsDrawn() const;
bool IsDrawn() const
{
return HasBit(this->vcache.cached_veh_flags, VCF_IS_DRAWN);
}
void UpdateIsDrawn();
inline void UpdateSpriteSeqBound()
{
@ -1311,5 +1317,6 @@ inline void InvalidateVehicleTickCaches()
void ClearVehicleTickCaches();
void RemoveFromOtherVehicleTickCache(const Vehicle *v);
void UpdateAllVehiclesIsDrawn();
#endif /* VEHICLE_BASE_H */

Loading…
Cancel
Save