mirror of https://github.com/OpenTTD/OpenTTD
Codechange: consider vehicle co-ordinates when identifying viewport candidate as using only the hash generates false positives
parent
9b28b15e67
commit
5728f9c7d0
|
@ -1124,11 +1124,15 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
|
||||||
const int t = dpi->top;
|
const int t = dpi->top;
|
||||||
const int b = dpi->top + dpi->height;
|
const int b = dpi->top + dpi->height;
|
||||||
|
|
||||||
|
/* Border size of MAX_VEHICLE_PIXEL_xy */
|
||||||
|
const int xb = MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE;
|
||||||
|
const int yb = MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE;
|
||||||
|
|
||||||
/* The hash area to scan */
|
/* The hash area to scan */
|
||||||
int xl, xu, yl, yu;
|
int xl, xu, yl, yu;
|
||||||
|
|
||||||
if (dpi->width + (MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE) < GEN_HASHX_SIZE) {
|
if (dpi->width + xb < GEN_HASHX_SIZE) {
|
||||||
xl = GEN_HASHX(l - MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE);
|
xl = GEN_HASHX(l - xb);
|
||||||
xu = GEN_HASHX(r);
|
xu = GEN_HASHX(r);
|
||||||
} else {
|
} else {
|
||||||
/* scan whole hash row */
|
/* scan whole hash row */
|
||||||
|
@ -1136,8 +1140,8 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
|
||||||
xu = GEN_HASHX_MASK;
|
xu = GEN_HASHX_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dpi->height + (MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE) < GEN_HASHY_SIZE) {
|
if (dpi->height + yb < GEN_HASHY_SIZE) {
|
||||||
yl = GEN_HASHY(t - MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE);
|
yl = GEN_HASHY(t - yb);
|
||||||
yu = GEN_HASHY(b);
|
yu = GEN_HASHY(b);
|
||||||
} else {
|
} else {
|
||||||
/* scan whole column */
|
/* scan whole column */
|
||||||
|
@ -1158,9 +1162,14 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
|
||||||
b >= v->coord.top) {
|
b >= v->coord.top) {
|
||||||
DoDrawVehicle(v);
|
DoDrawVehicle(v);
|
||||||
}
|
}
|
||||||
else {
|
else if (l <= v->coord.right + xb &&
|
||||||
|
t <= v->coord.bottom + yb &&
|
||||||
|
r >= v->coord.left - xb &&
|
||||||
|
b >= v->coord.top - yb)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Indicate that this vehicle was considered for rendering in a viewport,
|
* Indicate that this vehicle was considered for rendering in a viewport,
|
||||||
|
* is within the bounds where a sprite could be valid for rendering
|
||||||
* and we therefore need to update sprites more frequently in case a callback
|
* and we therefore need to update sprites more frequently in case a callback
|
||||||
* will change the bounding box to one which will cause the sprite to be
|
* will change the bounding box to one which will cause the sprite to be
|
||||||
* displayed.
|
* displayed.
|
||||||
|
@ -1168,9 +1177,6 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
|
||||||
* This reduces the chances of flicker when sprites enter the screen, if they
|
* This reduces the chances of flicker when sprites enter the screen, if they
|
||||||
* are part of a newgrf vehicle set which changes bounding boxes within a
|
* are part of a newgrf vehicle set which changes bounding boxes within a
|
||||||
* single vehicle direction.
|
* single vehicle direction.
|
||||||
*
|
|
||||||
* TODO: this will consider too many false positives, use the bounding box
|
|
||||||
* information or something which better narrows down the candidates.
|
|
||||||
*/
|
*/
|
||||||
v->sprite_cache.is_viewport_candidate = true;
|
v->sprite_cache.is_viewport_candidate = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -186,10 +186,10 @@ struct VehicleSpriteSeq {
|
||||||
* or calculating the viewport.
|
* or calculating the viewport.
|
||||||
*/
|
*/
|
||||||
struct MutableSpriteCache {
|
struct MutableSpriteCache {
|
||||||
Direction last_direction; ///< Last direction we obtained sprites for
|
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
|
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
|
bool sprite_has_viewport_changes; ///< There have been viewport changes since the sprite was last updated
|
||||||
mutable VehicleSpriteSeq sprite_seq; ///< Vehicle appearance.
|
VehicleSpriteSeq sprite_seq; ///< Vehicle appearance.
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A vehicle pool for a little over 1 million vehicles. */
|
/** A vehicle pool for a little over 1 million vehicles. */
|
||||||
|
@ -337,7 +337,7 @@ public:
|
||||||
NewGRFCache grf_cache; ///< Cache of often used calculated NewGRF values
|
NewGRFCache grf_cache; ///< Cache of often used calculated NewGRF values
|
||||||
VehicleCache vcache; ///< Cache of often used vehicle values.
|
VehicleCache vcache; ///< Cache of often used vehicle values.
|
||||||
|
|
||||||
MutableSpriteCache sprite_cache; ///< Cache of sprites and values related to recalculating them, see #MutableSpriteCache
|
mutable MutableSpriteCache sprite_cache; ///< Cache of sprites and values related to recalculating them, see #MutableSpriteCache
|
||||||
|
|
||||||
Vehicle(VehicleType type = VEH_INVALID);
|
Vehicle(VehicleType type = VEH_INVALID);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue