RectPlacement.h
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. // --------------------------------------------------------------------------------
  2. // Name        : RectPlacement.h
  3. // Description : A class that allocates subrectangles into power-of-2 rectangles
  4. //               (C) Copyright 2000-2002 by Javier Arevalo
  5. //               This code is free to use and modify for all purposes
  6. // --------------------------------------------------------------------------------
  7. // modified to support sprite margins and VC8
  8. // (C) Copyright 2008 by Haaf
  9. // --------------------------------------------------------------------------------
  10. #ifndef RECT_PLACEMENT_HEADER
  11. #define RECT_PLACEMENT_HEADER
  12. #include <vector>
  13. // --------------------------------------------------------------------------------
  14. // --------------------------------------------------------------------------------
  15. class CRectPlacement
  16. {
  17.   public:
  18.     // Helper classes
  19.     struct TPos
  20.     {
  21.       int x, y;
  22.       TPos() { }
  23.       TPos(int _x, int _y): x(_x), y(_y) { }
  24.       bool operator ==(const TPos &p) const { return x == p.x && y == p.y; }
  25.     };
  26.     struct TRect: public TPos
  27.     {
  28.       int w, h;
  29.       TRect() { }
  30.       TRect(int _x, int _y, int _w, int _h): TPos(_x, _y), w(_w > 0? _w : 0), h(_h > 0? _h : 0) { }
  31.       bool Contains   (const TPos &p)  const { return (p.x >= x && p.y >= y &&
  32.                                                        p.x < (x+w) && p.y < (y+h)); }
  33.       bool Contains   (const TRect &r) const { return (r.x-m_margin >= x && r.y-m_margin >= y &&
  34.                                                        (r.x+r.w+m_margin) <= (x+w) && (r.y+r.h+m_margin) <= (y+h)); }
  35.       bool Intersects (const TRect &r) const { return w > 0 && h > 0 && r.w > 0 && r.h > 0 &&
  36.                                                       ((r.x+r.w+m_margin) > x && (r.x-m_margin) < (x+w) &&
  37.                                                        (r.y+r.h+m_margin) > y && (r.y-m_margin) < (y+h)); }
  38.     //  Greater rect area. Not as good as the next heuristic
  39.     //  static bool Greater(const TRect &a, const TRect &b) { return a.w*a.h > b.w*b.h; }
  40.       // Greater size in at least one dim.
  41.       static bool Greater(const TRect &a, const TRect &b) { return (a.w > b.w && a.w > b.h) ||
  42.                                                                    (a.h > b.w && a.h > b.h); }
  43.     };
  44.     // ---------------------
  45.     typedef std::vector<TPos>  CPosArray;
  46.     typedef std::vector<TRect> CRectArray;
  47.     // ---------------------
  48.     CRectPlacement()                    { m_margin=1; Init(); }
  49.     ~CRectPlacement()                   { End(); }
  50. void   SetMargin(int margin) { m_margin = margin; }
  51.     void      Init    (int w = 1, int h = 1);
  52.     void      End     ();
  53.     bool      IsOk    ()                      const { return m_size.w > 0; }
  54.     int       GetW    ()                      const { return m_size.w; }
  55.     int       GetH    ()                      const { return m_size.h; }
  56.     long      GetArea ()                      const { return m_area; }
  57.     long      GetTotalArea ()                 const { return m_size.w*m_size.h; }
  58.     bool AddAtEmptySpotAutoGrow (TRect *pRect, int maxW, int maxH);
  59. static int m_margin;
  60. private:
  61.     TRect       m_size;
  62.     CRectArray  m_vRects;
  63.     CPosArray   m_vPositions;
  64.     long        m_area;
  65.     // ---------------------
  66.     bool IsFree                 (const TRect &r) const;
  67.     void AddPosition            (const TPos &p);
  68.     void AddRect                (const TRect &r);
  69.     bool AddAtEmptySpot         (TRect &r);
  70. };
  71. // --------------------------------------------------------------------------------
  72. #endif // RECT_PLACEMENT_HEADER