xna - How can I perform clipping on rotated rectangles? -


so have panel class. it's little window can resize, close, add buttons, sliders, etc. status screen in morrowind if of remember. behavior want when sprite outside of panel's bounds doesn't drawn , if it's partially outside part inside gets drawn. right first rectangle represents bounds of panel, , rectangle sprite, finds rectangle of intersection between 2 translates intersection local coordinates of sprite rectangle , uses that source rectangle. works , clever feel code can't shake feeling there's better way this. also, set cannot utilize global transformation matrix 2d camera, in "world" must passed camera argument draw. anyway, here's code have:
intersection:

     public static rectangle? intersection(rectangle rectangle1, rectangle rectangle2)      {         if (rectangle1.intersects(rectangle2))         {             if (rectangle1.contains(rectangle2))             {                 return rectangle2;             }             else if (rectangle2.contains(rectangle1))             {                 return rectangle1;             }             else             {                 int x = math.max(rectangle1.left, rectangle2.left);                 int y = math.max(rectangle1.top, rectangle2.top);                 int height = math.min(rectangle1.bottom, rectangle2.bottom) - math.max(rectangle1.top, rectangle2.top);                 int width = math.min(rectangle1.right, rectangle2.right) - math.max(rectangle1.left, rectangle2.left);                 return new rectangle(x, y, width, height);             }         }         else         {             return null;         }      } 

and drawing on panel:

    public void drawonpanel(idraw sprite, spritebatch spritebatch)     {         rectangle panelrectangle = new rectangle(            (int)_position.x,            (int)_position.y,            _width,            _height);         rectangle drawrectangle = new rectangle();          drawrectangle.x = (int)sprite.position.x;         drawrectangle.y = (int)sprite.position.y;         drawrectangle.width = sprite.width;         drawrectangle.height = sprite.height;          if (panelrectangle.contains(drawrectangle))         {             sprite.draw(                 spritebatch,                 drawrectangle,                 null);         }         else if (intersection(panelrectangle, drawrectangle) == null)         {             return;         }         else if (intersection(panelrectangle, drawrectangle).hasvalue)         {             rectangle intersection = intersection(panelrectangle, drawrectangle).value;              if (intersection(panelrectangle, drawrectangle) == drawrectangle)             {                 sprite.draw(spritebatch, intersection, intersection);             }             else             {                 sprite.draw(                     spritebatch,                     intersection,                     new rectangle(                         intersection.x - drawrectangle.x,                         intersection.y - drawrectangle.y,                         intersection.width,                         intersection.height));             }         }     } 

so guess question is, there better way this?

update: found out scissorrectangle property. seems decent way this; requires rasterizerstate object made , passed spritebatch.begin overload accepts it. seems might best bet though. there's viewport can apparently change around. thoughts? :)

there several ways limit drawing portion of screen. if area rectangular (which seems case here), set viewport (see graphicsdevice) panel's surface.

for non-rectangular areas, can use stencil buffer or use tricks depth buffer. draw shape of surface in stencil buffer or depth buffer, set render state draw pixels located in shape rendered in stencil/depth buffer, render sprites.


Comments

Popular posts from this blog

python - Scipy curvefit RuntimeError:Optimal parameters not found: Number of calls to function has reached maxfev = 1000 -

c# - How to add a new treeview at the selected node? -

java - netbeans "Please wait - classpath scanning in progress..." -