TileAtlasVX: Followup fix
Use rectangle intersection to correctly clip source rectangles with origin != (0,0).
This commit is contained in:
		
							parent
							
								
									db78e55371
								
							
						
					
					
						commit
						55a2cf562e
					
				
					 2 changed files with 27 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -93,17 +93,20 @@ struct Vec2i
 | 
			
		|||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct IntRect
 | 
			
		||||
struct IntRect : SDL_Rect
 | 
			
		||||
{
 | 
			
		||||
	int x, y, w, h;
 | 
			
		||||
 | 
			
		||||
	IntRect()
 | 
			
		||||
	    : x(0), y(0), w(0), h(0)
 | 
			
		||||
	{}
 | 
			
		||||
	{
 | 
			
		||||
		x = y = w = h = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IntRect(int x, int y, int w, int h)
 | 
			
		||||
	    : x(x), y(y), w(w), h(h)
 | 
			
		||||
	{}
 | 
			
		||||
	{
 | 
			
		||||
		this->x = x;
 | 
			
		||||
		this->y = y;
 | 
			
		||||
		this->w = w;
 | 
			
		||||
		this->h = h;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool operator==(const IntRect &other) const
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -270,6 +270,20 @@ createShadowSet()
 | 
			
		|||
	return surf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void doBlit(Bitmap *bm, const IntRect &src, const Vec2i &dst)
 | 
			
		||||
{
 | 
			
		||||
	/* Translate tile to pixel units */
 | 
			
		||||
	IntRect _src(src.x*32, src.y*32, src.w*32, src.h*32);
 | 
			
		||||
	Vec2i _dst(dst.x*32, dst.y*32);
 | 
			
		||||
	IntRect bmr(0, 0, bm->width(), bm->height());
 | 
			
		||||
 | 
			
		||||
	/* Drop blit if source rect lies outside bitmap rect */
 | 
			
		||||
	if (!SDL_IntersectRect(&_src, &bmr, &_src))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	GLMeta::blitRectangle(_src, _dst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void build(TEXFBO &tf, Bitmap *bitmaps[BM_COUNT])
 | 
			
		||||
{
 | 
			
		||||
	assert(tf.width == ATLASVX_W && tf.height == ATLASVX_H);
 | 
			
		||||
| 
						 | 
				
			
			@ -296,13 +310,9 @@ void build(TEXFBO &tf, Bitmap *bitmaps[BM_COUNT])
 | 
			
		|||
		GLMeta::blitSource(bm->getGLTypes()); \
 | 
			
		||||
		for (size_t i = 0; i < blits##part##N; ++i) \
 | 
			
		||||
		{\
 | 
			
		||||
			IntRect src = blits##part[i].src; \
 | 
			
		||||
			int w = std::min(bm->width(), src.w*32); \
 | 
			
		||||
			int h = std::min(bm->height(), src.h*32); \
 | 
			
		||||
			src = IntRect(src.x*32, src.y*32, w, h); \
 | 
			
		||||
			Vec2i dst = blits##part[i].dst; \
 | 
			
		||||
			dst = Vec2i(dst.x*32, dst.y*32); \
 | 
			
		||||
			GLMeta::blitRectangle(src, dst); \
 | 
			
		||||
			const IntRect &src = blits##part[i].src; \
 | 
			
		||||
			const Vec2i &dst = blits##part[i].dst; \
 | 
			
		||||
			doBlit(bm, src, dst); \
 | 
			
		||||
		} \
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue