changeset 9549:cd35cea9d51b draft

(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
author smatz <smatz@openttd.org>
date Wed, 18 Jun 2008 16:48:58 +0000
parents 13d2b29b23ed
children 5f0643473eb1
files src/newgrf_house.cpp src/newgrf_industrytiles.cpp src/rail_cmd.cpp src/station_cmd.cpp
diffstat 4 files changed, 13 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_house.cpp
+++ b/src/newgrf_house.cpp
@@ -330,15 +330,15 @@
 
 	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)) {
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -187,15 +187,15 @@
 
 	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)) {
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -1847,13 +1847,13 @@
 
 		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 */
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -2221,12 +2221,13 @@
 		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 {