mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-02 09:40:35 +00:00
(svn r14606) -Codechange: Unify usage of PALETTE_MODIFIER_TRANSPARENT and PALETTE_MODIFIER_COLOR in spritelayout drawing.
-Fix [FS#2419]: The modifiers were not applied in all cases.
This commit is contained in:
parent
f0286cb1e5
commit
259a073f0c
@ -7,6 +7,10 @@
|
||||
#ifndef NEWGRF_COMMONS_H
|
||||
#define NEWGRF_COMMONS_H
|
||||
|
||||
#include "core/bitmath_func.hpp"
|
||||
|
||||
#include "table/sprites.h"
|
||||
|
||||
/**
|
||||
* Maps an entity id stored on the map to a GRF file.
|
||||
* Entities are objects used ingame (houses, industries, industry tiles) for
|
||||
@ -96,4 +100,43 @@ uint32 GetTerrainType(TileIndex tile);
|
||||
TileIndex GetNearbyTile(byte parameter, TileIndex tile);
|
||||
uint32 GetNearbyTileInformation(TileIndex tile);
|
||||
|
||||
/**
|
||||
* Applies PALETTE_MODIFIER_TRANSPARENT and PALETTE_MODIFIER_COLOR to a palette entry of a sprite layout entry
|
||||
* @Note for ground sprites use #GroundSpritePaletteTransform
|
||||
* @Note Not useable for OTTD internal spritelayouts from table/xxx_land.h as PALETTE_MODIFIER_TRANSPARENT is only set
|
||||
* when to use the default palette.
|
||||
*
|
||||
* @param image The sprite to draw
|
||||
* @param pal The palette from the sprite layout
|
||||
* @param default_pal The default recolour sprite to use (typically company color resp. random industry/house color)
|
||||
* @return The palette to use
|
||||
*/
|
||||
static inline SpriteID SpriteLayoutPaletteTransform(SpriteID image, SpriteID pal, SpriteID default_pal)
|
||||
{
|
||||
if (HasBit(image, PALETTE_MODIFIER_TRANSPARENT) || HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
return (pal != 0 ? pal : default_pal);
|
||||
} else {
|
||||
return PAL_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies PALETTE_MODIFIER_COLOR to a palette entry of a ground sprite
|
||||
* @Note Not useable for OTTD internal spritelayouts from table/xxx_land.h as PALETTE_MODIFIER_TRANSPARENT is only set
|
||||
* when to use the default palette.
|
||||
*
|
||||
* @param image The sprite to draw
|
||||
* @param pal The palette from the sprite layout
|
||||
* @param default_pal The default recolour sprite to use (typically company color resp. random industry/house color)
|
||||
* @return The palette to use
|
||||
*/
|
||||
static inline SpriteID GroundSpritePaletteTransform(SpriteID image, SpriteID pal, SpriteID default_pal)
|
||||
{
|
||||
if (HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
return (pal != 0 ? pal : default_pal);
|
||||
} else {
|
||||
return PAL_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* NEWGRF_COMMONS_H */
|
||||
|
@ -426,12 +426,24 @@ static void DrawTileLayout(const TileInfo *ti, const SpriteGroup *group, byte st
|
||||
const DrawTileSprites *dts = group->g.layout.dts;
|
||||
const DrawTileSeqStruct *dtss;
|
||||
|
||||
const HouseSpec *hs = GetHouseSpecs(house_id);
|
||||
SpriteID palette = hs->random_colour[TileHash2Bit(ti->x, ti->y)] + PALETTE_RECOLOR_START;
|
||||
if (HasBit(hs->callback_mask, CBM_HOUSE_COLOUR)) {
|
||||
uint16 callback = GetHouseCallback(CBID_HOUSE_COLOUR, 0, 0, house_id, GetTownByTile(ti->tile), ti->tile);
|
||||
if (callback != CALLBACK_FAILED) {
|
||||
/* If bit 14 is set, we should use a 2cc colour map, else use the callback value. */
|
||||
palette = HasBit(callback, 14) ? GB(callback, 0, 8) + SPR_2CCMAP_BASE : callback;
|
||||
}
|
||||
}
|
||||
|
||||
SpriteID image = dts->ground.sprite;
|
||||
SpriteID pal = dts->ground.pal;
|
||||
|
||||
if (IS_CUSTOM_SPRITE(image)) image += stage;
|
||||
|
||||
if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
|
||||
if (GB(image, 0, SPRITE_WIDTH) != 0) {
|
||||
DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, palette));
|
||||
}
|
||||
|
||||
foreach_draw_tile_seq(dtss, dts->seq) {
|
||||
if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
|
||||
@ -444,21 +456,7 @@ static void DrawTileLayout(const TileInfo *ti, const SpriteGroup *group, byte st
|
||||
|
||||
if (IS_CUSTOM_SPRITE(image)) image += stage;
|
||||
|
||||
if (HasBit(image, PALETTE_MODIFIER_TRANSPARENT) || HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
if (pal == 0) {
|
||||
const HouseSpec *hs = GetHouseSpecs(house_id);
|
||||
pal = hs->random_colour[TileHash2Bit(ti->x, ti->y)] + PALETTE_RECOLOR_START;
|
||||
if (HasBit(hs->callback_mask, CBM_HOUSE_COLOUR)) {
|
||||
uint16 callback = GetHouseCallback(CBID_HOUSE_COLOUR, 0, 0, house_id, GetTownByTile(ti->tile), ti->tile);
|
||||
if (callback != CALLBACK_FAILED) {
|
||||
/* If bit 14 is set, we should use a 2cc colour map, else use the callback value. */
|
||||
pal = HasBit(callback, 14) ? GB(callback, 0, 8) + SPR_2CCMAP_BASE : callback;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pal = PAL_NONE;
|
||||
}
|
||||
pal = SpriteLayoutPaletteTransform(image, pal, palette);
|
||||
|
||||
if ((byte)dtss->delta_z != 0x80) {
|
||||
AddSortableSpriteToDraw(
|
||||
|
@ -183,7 +183,7 @@ static void IndustryDrawTileLayout(const TileInfo *ti, const SpriteGroup *group,
|
||||
if (image == SPR_FLAT_WATER_TILE && IsIndustryTileOnWater(ti->tile)) {
|
||||
DrawWaterClassGround(ti);
|
||||
} else {
|
||||
DrawGroundSprite(image, pal);
|
||||
DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, GENERAL_SPRITE_COLOR(rnd_color)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -198,13 +198,7 @@ static void IndustryDrawTileLayout(const TileInfo *ti, const SpriteGroup *group,
|
||||
|
||||
if (IS_CUSTOM_SPRITE(image)) image += stage;
|
||||
|
||||
if (HasBit(image, PALETTE_MODIFIER_TRANSPARENT) || HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
if (pal == 0) {
|
||||
pal = GENERAL_SPRITE_COLOR(rnd_color);
|
||||
}
|
||||
} else {
|
||||
pal = PAL_NONE;
|
||||
}
|
||||
pal = SpriteLayoutPaletteTransform(image, pal, GENERAL_SPRITE_COLOR(rnd_color));
|
||||
|
||||
if ((byte)dtss->delta_z != 0x80) {
|
||||
AddSortableSpriteToDraw(
|
||||
|
@ -803,6 +803,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
|
||||
}
|
||||
|
||||
image = sprites->ground.sprite;
|
||||
SpriteID pal = sprites->ground.pal;
|
||||
if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
|
||||
image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE);
|
||||
image += rti->custom_ground_offset;
|
||||
@ -810,7 +811,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
|
||||
image += rti->total_offset;
|
||||
}
|
||||
|
||||
DrawSprite(image, PAL_NONE, x, y);
|
||||
DrawSprite(image, GroundSpritePaletteTransform(image, pal, palette), x, y);
|
||||
|
||||
Point child_offset = {0, 0};
|
||||
|
||||
@ -822,16 +823,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
|
||||
image += relocation;
|
||||
}
|
||||
|
||||
SpriteID pal;
|
||||
if (HasBit(image, PALETTE_MODIFIER_TRANSPARENT) || HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
if (seq->image.pal > 0) {
|
||||
pal = seq->image.pal;
|
||||
} else {
|
||||
pal = palette;
|
||||
}
|
||||
} else {
|
||||
pal = PAL_NONE;
|
||||
}
|
||||
pal = SpriteLayoutPaletteTransform(image, seq->image.pal, palette);
|
||||
|
||||
if ((byte)seq->delta_z != 0x80) {
|
||||
Point pt = RemapCoords(seq->delta_x, seq->delta_y, seq->delta_z);
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "newgrf_engine.h"
|
||||
#include "newgrf_callbacks.h"
|
||||
#include "newgrf_station.h"
|
||||
#include "newgrf_commons.h"
|
||||
#include "train.h"
|
||||
#include "variables.h"
|
||||
#include "autoslope.h"
|
||||
@ -1920,6 +1921,7 @@ static void DrawTile_Track(TileInfo *ti)
|
||||
const DrawTileSprites* dts;
|
||||
const DrawTileSeqStruct* dtss;
|
||||
uint32 relocation;
|
||||
SpriteID pal = PAL_NONE;
|
||||
|
||||
if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
|
||||
|
||||
@ -1976,6 +1978,8 @@ static void DrawTile_Track(TileInfo *ti)
|
||||
} else {
|
||||
image += rti->total_offset;
|
||||
}
|
||||
|
||||
pal = dts->ground.pal;
|
||||
} else {
|
||||
goto default_waypoint;
|
||||
}
|
||||
@ -1989,7 +1993,7 @@ default_waypoint:
|
||||
}
|
||||
}
|
||||
|
||||
DrawGroundSprite(image, PAL_NONE);
|
||||
DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, _drawtile_track_palette));
|
||||
|
||||
/* PBS debugging, draw reserved tracks darker */
|
||||
if (_game_mode != GM_MENU && _settings_client.gui.show_track_reservation && GetDepotWaypointReservation(ti->tile) &&
|
||||
@ -2001,7 +2005,7 @@ default_waypoint:
|
||||
|
||||
foreach_draw_tile_seq(dtss, dts->seq) {
|
||||
SpriteID image = dtss->image.sprite;
|
||||
SpriteID pal;
|
||||
SpriteID pal = dtss->image.pal;
|
||||
|
||||
/* Stop drawing sprite sequence once we meet a sprite that doesn't have to be opaque */
|
||||
if (IsInvisibilitySet(TO_BUILDINGS) && !HasBit(image, SPRITE_MODIFIER_OPAQUE)) return;
|
||||
@ -2015,15 +2019,7 @@ default_waypoint:
|
||||
image += relocation;
|
||||
}
|
||||
|
||||
if (HasBit(image, PALETTE_MODIFIER_TRANSPARENT) || HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
if (dtss->image.pal != 0) {
|
||||
pal = dtss->image.pal;
|
||||
} else {
|
||||
pal = _drawtile_track_palette;
|
||||
}
|
||||
} else {
|
||||
pal = PAL_NONE;
|
||||
}
|
||||
pal = SpriteLayoutPaletteTransform(image, pal, _drawtile_track_palette);
|
||||
|
||||
if ((byte)dtss->delta_z != 0x80) {
|
||||
AddSortableSpriteToDraw(
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "industry_map.h"
|
||||
#include "newgrf_callbacks.h"
|
||||
#include "newgrf_station.h"
|
||||
#include "newgrf_commons.h"
|
||||
#include "yapf/yapf.h"
|
||||
#include "road_type.h"
|
||||
#include "road_internal.h" /* For drawing catenary/checking road removal */
|
||||
@ -2325,13 +2326,14 @@ static void DrawTile_Station(TileInfo *ti)
|
||||
}
|
||||
} else {
|
||||
SpriteID image = t->ground.sprite;
|
||||
SpriteID pal = t->ground.pal;
|
||||
if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
|
||||
image += GetCustomStationGroundRelocation(statspec, st, ti->tile);
|
||||
image += custom_ground_offset;
|
||||
} else {
|
||||
image += total_offset;
|
||||
}
|
||||
DrawGroundSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE);
|
||||
DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, palette));
|
||||
|
||||
/* PBS debugging, draw reserved tracks darker */
|
||||
if (_game_mode != GM_MENU && _settings_client.gui.show_track_reservation && IsRailwayStation(ti->tile) && GetRailwayStationReservation(ti->tile)) {
|
||||
@ -2361,16 +2363,7 @@ static void DrawTile_Station(TileInfo *ti)
|
||||
image += relocation;
|
||||
}
|
||||
|
||||
SpriteID pal;
|
||||
if (HasBit(image, PALETTE_MODIFIER_TRANSPARENT) || HasBit(image, PALETTE_MODIFIER_COLOR)) {
|
||||
if (dtss->image.pal > 0) {
|
||||
pal = dtss->image.pal;
|
||||
} else {
|
||||
pal = palette;
|
||||
}
|
||||
} else {
|
||||
pal = PAL_NONE;
|
||||
}
|
||||
SpriteID pal = SpriteLayoutPaletteTransform(image, dtss->image.pal, palette);
|
||||
|
||||
if ((byte)dtss->delta_z != 0x80) {
|
||||
AddSortableSpriteToDraw(
|
||||
|
Loading…
Reference in New Issue
Block a user