summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2008-06-18 16:48:58 +0000
committersmatz <smatz@openttd.org>2008-06-18 16:48:58 +0000
commit29985b768c5c9f5a92dc67e9b70626f3e6b9ff06 (patch)
tree74ebc46ae805dadccfc1057266b9f5f85873da3f
parentcc2f9187cced720c32f5d0000407f912af042b0b (diff)
downloadopenttd-29985b768c5c9f5a92dc67e9b70626f3e6b9ff06.tar.xz
(svn r13565) -Change [FS#2077]: when invisibility is set, sprite sequences are now drawn until first non-opaque sprite is found (bit 14 not set)
This is to balance performance, code complexity and NewGRF requirements
-rw-r--r--src/newgrf_house.cpp6
-rw-r--r--src/newgrf_industrytiles.cpp6
-rw-r--r--src/rail_cmd.cpp6
-rw-r--r--src/station_cmd.cpp7
4 files changed, 13 insertions, 12 deletions
diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp
index c794f5233..78e9ffdde 100644
--- a/src/newgrf_house.cpp
+++ b/src/newgrf_house.cpp
@@ -330,15 +330,15 @@ void DrawTileLayout(const TileInfo *ti, const SpriteGroup *group, byte stage, Ho
if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
- /* End now, if houses are invisible */
- if (IsInvisibilitySet(TO_HOUSES)) return;
-
foreach_draw_tile_seq(dtss, dts->seq) {
if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
image = dtss->image.sprite;
pal = dtss->image.pal;
+ /* Stop drawing sprite sequence once we meet a sprite that doesn't have to be opaque */
+ if (IsInvisibilitySet(TO_HOUSES) && !HasBit(image, SPRITE_MODIFIER_OPAQUE)) return;
+
if (IS_CUSTOM_SPRITE(image)) image += stage;
if ((HasBit(image, SPRITE_MODIFIER_OPAQUE) || !IsTransparencySet(TO_HOUSES)) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp
index cf77736e6..7f0aa2b8b 100644
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -187,15 +187,15 @@ void IndustryDrawTileLayout(const TileInfo *ti, const SpriteGroup *group, byte r
if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
- /* End now if industries are invisible */
- if (IsInvisibilitySet(TO_INDUSTRIES)) return;
-
foreach_draw_tile_seq(dtss, dts->seq) {
if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
image = dtss->image.sprite;
pal = dtss->image.pal;
+ /* Stop drawing sprite sequence once we meet a sprite that doesn't have to be opaque */
+ if (IsInvisibilitySet(TO_INDUSTRIES) && !HasBit(image, SPRITE_MODIFIER_OPAQUE)) return;
+
if (IS_CUSTOM_SPRITE(image)) image += stage;
if (HasBit(image, PALETTE_MODIFIER_COLOR)) {
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 7325c8c96..af1fa1cc5 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -1847,13 +1847,13 @@ default_waypoint:
if (HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti);
- /* End now if buildings are invisible */
- if (IsInvisibilitySet(TO_BUILDINGS)) return;
-
foreach_draw_tile_seq(dtss, dts->seq) {
SpriteID image = dtss->image.sprite;
SpriteID 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;
+
/* Unlike stations, our default waypoint has no variation for
* different railtype, so don't use the railtype offset if
* no relocation is set */
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index be9b30f16..42ed6291f 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -2221,12 +2221,13 @@ static void DrawTile_Station(TileInfo *ti)
DrawTramCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y);
}
- /* End now if buildings are invisible */
- if (IsInvisibilitySet(TO_BUILDINGS)) return;
-
const DrawTileSeqStruct *dtss;
foreach_draw_tile_seq(dtss, t->seq) {
SpriteID image = dtss->image.sprite;
+
+ /* 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;
+
if (relocation == 0 || HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) {
image += total_offset;
} else {