diff options
author | glx <glx@openttd.org> | 2007-10-28 15:40:18 +0000 |
---|---|---|
committer | glx <glx@openttd.org> | 2007-10-28 15:40:18 +0000 |
commit | 6120d0275120b0830811f5eb983ffe05e9545bce (patch) | |
tree | 09da5f37172fa5f54c8410e10e03bff557736bb8 /src | |
parent | e6116d11b8cfd58d1880e79143de93900404e33c (diff) | |
download | openttd-6120d0275120b0830811f5eb983ffe05e9545bce.tar.xz |
(svn r11352) -Codechange: cache callback 2D result (vehicle color mapping) instead calling it every time the vehicle is drawn
Diffstat (limited to 'src')
-rw-r--r-- | src/misc_cmd.cpp | 1 | ||||
-rw-r--r-- | src/train_cmd.cpp | 4 | ||||
-rw-r--r-- | src/vehicle.cpp | 20 | ||||
-rw-r--r-- | src/vehicle.h | 3 |
4 files changed, 26 insertions, 2 deletions
diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index 7102135e9..dd7570d72 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -113,6 +113,7 @@ CommandCost CmdSetPlayerColor(TileIndex tile, uint32 flags, uint32 p1, uint32 p2 default: break; } + ResetVehicleColorMap(); MarkWholeScreenDirty(); } return CommandCost(); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 715472f2f..71dbebb0c 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -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 @@ void TrainConsistChanged(Vehicle* v) /* 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 { diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 28fb0e64c..86151e48a 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -274,6 +274,7 @@ Vehicle::Vehicle() this->group_id = DEFAULT_GROUP; this->fill_percent_te_id = INVALID_TE_ID; this->first = this; + this->colormap = PAL_NONE; } /** @@ -457,6 +458,12 @@ void ResetVehiclePosHash() 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 @@ const Livery *GetEngineLivery(EngineID engine_type, PlayerID player, EngineID pa 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 @@ static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, Engine 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 @@ static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, Engine map += livery->colour1; if (twocc) map += livery->colour2 * 16; + /* Update cache */ + if (v != NULL) ((Vehicle*)v)->colormap = map; return map; } diff --git a/src/vehicle.h b/src/vehicle.h index 7b2b230fc..dd946900c 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -340,6 +340,8 @@ public: 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 @@ uint8 CalcPercentVehicleFilled(Vehicle *v, StringID *color); void InitializeTrains(); byte VehicleRandomBits(); void ResetVehiclePosHash(); +void ResetVehicleColorMap(); bool CanRefitTo(EngineID engine_type, CargoID cid_to); CargoID FindFirstRefittableCargo(EngineID engine_type); |