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); }
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; }