Beispiel #1
0
void cEdiPaint::DrawBrushAt( Brush* brush, int x, int y, float zoom, BOOL anim )
{
	if(brush==NULL) return;
	int idx = TileFind(brush->tile);
	// if(idx==-1) return;

	iRect map = brush->map;
	int mw = static_cast<int>(brush->mapWith());
	int mh = static_cast<int>(brush->mapHeight());
	float ms = brush->mapScale();
	if( mw==0 || mh==0 ) return;

	fRect oldclip = R9_GetClipping();
	fRect newclip( (float)x, (float)y, (float)x+zoom*brush->size.x, (float)y+zoom*brush->size.y );
	R9_AddClipping(newclip);
	if(!R9_IsClipping()) { R9_SetClipping(oldclip); return; } // fully clipped

	if(idx==-1) // no tile
	{
		dword color = brush->color & 0xffff40ff;
		R9_DrawLine( fV2(newclip.p1.x,newclip.p1.y),		fV2(newclip.p2.x-1,newclip.p1.y),	color );
		R9_DrawLine( fV2(newclip.p2.x-1,newclip.p1.y),		fV2(newclip.p2.x-1,newclip.p2.y-1),	color );
		R9_DrawLine( fV2(newclip.p2.x-1,newclip.p2.y-1),	fV2(newclip.p1.x,newclip.p2.y-1),	color );
		R9_DrawLine( fV2(newclip.p1.x,newclip.p2.y-1),		fV2(newclip.p1.x,newclip.p1.y),		color );
		R9_DrawLine( fV2(newclip.p1.x,newclip.p1.y),		fV2(newclip.p2.x-1,newclip.p2.y-1),	color );
		R9_DrawLine( fV2(newclip.p2.x-1,newclip.p1.y),		fV2(newclip.p1.x,newclip.p2.y-1),	color );
		R9_SetClipping(oldclip);
		return;
	}

	int cx = (brush->size.x+mw-1) / mw;
	int cy = (brush->size.y+mh-1) / mh;


	int xt=x;
	for(int i=0;i<cy;i++)
	{
		x = xt;
		for(int j=0;j<cx;j++)
		{
			DrawTile( idx, x, y, map, brush->color, brush->flip, brush->frame, brush->shader, zoom*ms );
			x+=(int)(zoom*mw);
		}
		y+=(int)(zoom*mh);
	}

	if(m_brushrect)
	{
		dword color = 0xa04040ff;
		R9_DrawLine( fV2(newclip.p1.x,newclip.p1.y),		fV2(newclip.p2.x-1,newclip.p1.y),	color );
		R9_DrawLine( fV2(newclip.p2.x-1,newclip.p1.y),		fV2(newclip.p2.x-1,newclip.p2.y-1),	color );
		R9_DrawLine( fV2(newclip.p2.x-1,newclip.p2.y-1),	fV2(newclip.p1.x,newclip.p2.y-1),	color );
		R9_DrawLine( fV2(newclip.p1.x,newclip.p2.y-1),		fV2(newclip.p1.x,newclip.p1.y),		color );
	}

	R9_SetClipping(oldclip);
}
Beispiel #2
0
	void Render::EnableClipping(int x, int y, int w, int h) {
		AABB newclip((float)x, (float)y, (float)w, (float)h);

		if (this->ClippingEnabled) {
			if (newclip.X + newclip.W < this->_ClippingPos.X) newclip = AABB(this->_ClippingPos.X, this->_ClippingPos.Y, 0.0f, 0.0f);
			if (newclip.Y + newclip.H < this->_ClippingPos.Y) newclip = AABB(this->_ClippingPos.X, this->_ClippingPos.Y, 0.0f, 0.0f);
			if (newclip.X > this->_ClippingPos.X + this->_ClippingSize.X) newclip = AABB(this->_ClippingPos.X, this->_ClippingPos.Y, 0.0f, 0.0f);
			if (newclip.Y > this->_ClippingPos.Y + this->_ClippingSize.Y) newclip = AABB(this->_ClippingPos.X, this->_ClippingPos.Y, 0.0f, 0.0f);

			if (newclip.X < this->_ClippingPos.X) { newclip.W -= this->_ClippingPos.X - (float)fabs(newclip.X); newclip.X = this->_ClippingPos.X; }
			if (newclip.Y < this->_ClippingPos.Y) { newclip.H -= this->_ClippingPos.Y - (float)fabs(newclip.Y); newclip.Y = this->_ClippingPos.Y; }

			if (newclip.X + newclip.W > this->_ClippingPos.X + this->_ClippingSize.X) newclip.W = this->_ClippingPos.X + this->_ClippingSize.X - newclip.X;
			if (newclip.Y + newclip.H > this->_ClippingPos.Y + this->_ClippingSize.Y) newclip.H = this->_ClippingPos.Y + this->_ClippingSize.Y - newclip.Y;
		}

		this->_ClippingPos = Vector2(newclip.X, newclip.Y);
		this->_ClippingSize = Vector2(newclip.W, newclip.H);
		this->_ClippingList.Add(newclip);
		this->ClippingEnabled = true;
	}