(svn r11352) -Codechange: cache callback 2D result (vehicle color mapping) instead calling it every time the vehicle is drawn
--- a/src/misc_cmd.cpp Sat Oct 27 11:26:19 2007 +0000
+++ b/src/misc_cmd.cpp Sun Oct 28 15:40:18 2007 +0000
@@ -113,6 +113,7 @@
default:
break;
}
+ ResetVehicleColorMap();
MarkWholeScreenDirty();
}
return CommandCost();
--- a/src/train_cmd.cpp Sat Oct 27 11:26:19 2007 +0000
+++ b/src/train_cmd.cpp Sun Oct 28 15:40:18 2007 +0000
@@ -41,6 +41,7 @@
#include "date.h"
#include "cargotype.h"
#include "group.h"
+#include "table/sprites.h"
static bool TrainCheckIfLineEnds(Vehicle *v);
static void TrainController(Vehicle *v, bool update_image);
@@ -176,6 +177,9 @@
/* Cache wagon override sprite group. NULL is returned if there is none */
u->u.rail.cached_override = GetWagonOverrideSpriteSet(u->engine_type, u->cargo_type, u->u.rail.first_engine);
+ /* Reset color map */
+ u->colormap = PAL_NONE;
+
if (rvi_u->visual_effect != 0) {
u->u.rail.cached_vis_effect = rvi_u->visual_effect;
} else {
--- a/src/vehicle.cpp Sat Oct 27 11:26:19 2007 +0000
+++ b/src/vehicle.cpp Sun Oct 28 15:40:18 2007 +0000
@@ -274,6 +274,7 @@
this->group_id = DEFAULT_GROUP;
this->fill_percent_te_id = INVALID_TE_ID;
this->first = this;
+ this->colormap = PAL_NONE;
}
/**
@@ -457,6 +458,12 @@
memset(_new_vehicle_position_hash, 0, sizeof(_new_vehicle_position_hash));
}
+void ResetVehicleColorMap()
+{
+ Vehicle *v;
+ FOR_ALL_VEHICLES(v) { v->colormap = PAL_NONE; }
+}
+
void InitializeVehicles()
{
_Vehicle_pool.CleanPool();
@@ -2607,7 +2614,10 @@
static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v)
{
- SpriteID map = PAL_NONE;
+ SpriteID map = (v != NULL) ? v->colormap : PAL_NONE;
+
+ /* Return cached value if any */
+ if (map != PAL_NONE) return map;
/* Check if we should use the colour map callback */
if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_COLOUR_REMAP)) {
@@ -2618,7 +2628,11 @@
map = GB(callback, 0, 14);
/* If bit 14 is set, then the company colours are applied to the
* map else it's returned as-is. */
- if (!HASBIT(callback, 14)) return map;
+ if (!HASBIT(callback, 14)) {
+ /* Update cache */
+ if (v != NULL) ((Vehicle*)v)->colormap = map;
+ return map;
+ }
}
}
@@ -2631,6 +2645,8 @@
map += livery->colour1;
if (twocc) map += livery->colour2 * 16;
+ /* Update cache */
+ if (v != NULL) ((Vehicle*)v)->colormap = map;
return map;
}
--- a/src/vehicle.h Sat Oct 27 11:26:19 2007 +0000
+++ b/src/vehicle.h Sun Oct 28 15:40:18 2007 +0000
@@ -340,6 +340,8 @@
uint32 current_order_time; ///< How many ticks have passed since this order started.
int32 lateness_counter; ///< How many ticks late (or early if negative) this vehicle is.
+ SpriteID colormap; // NOSAVE: cached color mapping
+
union {
VehicleRail rail;
VehicleAir air;
@@ -588,6 +590,7 @@
void InitializeTrains();
byte VehicleRandomBits();
void ResetVehiclePosHash();
+void ResetVehicleColorMap();
bool CanRefitTo(EngineID engine_type, CargoID cid_to);
CargoID FindFirstRefittableCargo(EngineID engine_type);