]> git.mxchange.org Git - simgear.git/commitdiff
Rename simgear::Rect to SGRect and make interface more similar to SGBox
authorThomas Geymayer <tomgey@gmail.com>
Thu, 13 Dec 2012 22:37:21 +0000 (23:37 +0100)
committerThomas Geymayer <tomgey@gmail.com>
Thu, 13 Dec 2012 22:37:21 +0000 (23:37 +0100)
simgear/canvas/elements/CanvasImage.cxx
simgear/canvas/elements/CanvasImage.hxx
simgear/math/CMakeLists.txt
simgear/math/Rect.hxx [deleted file]
simgear/math/SGRect.hxx [new file with mode: 0644]
simgear/props/propertyObject.hxx

index ad538dd40f56f426366ae7e827759eb5dbd19549..cf9f12f2e41029e5c31ebe1e177bb72b14004c4d 100644 (file)
@@ -78,7 +78,9 @@ namespace canvas
                 Element* parent ):
     Element(canvas, node, parent_style, parent),
     _texture(new osg::Texture2D),
-    _node_src_rect( node->getNode("source", 0, true) )
+    _node_src_rect( node->getNode("source", 0, true) ),
+    _src_rect(0,0),
+    _region(0,0)
   {
     _geom = new osg::Geometry;
     _geom->setUseDisplayList(false);
@@ -147,7 +149,7 @@ namespace canvas
 
       if( !_node_src_rect->getBoolValue("normalized", true) )
       {
-        const Rect<int>& tex_dim = getTextureDimensions();
+        const SGRect<int>& tex_dim = getTextureDimensions();
 
         u0 /= tex_dim.width();
         u1 /= tex_dim.width();
@@ -216,7 +218,7 @@ namespace canvas
   }
 
   //----------------------------------------------------------------------------
-  const Rect<float>& Image::getRegion() const
+  const SGRect<float>& Image::getRegion() const
   {
     return _region;
   }
@@ -317,7 +319,7 @@ namespace canvas
   {
     if( !_src_rect.width() || !_src_rect.height() )
     {
-      const Rect<int>& tex_dim = getTextureDimensions();
+      const SGRect<int>& tex_dim = getTextureDimensions();
 
       _node_src_rect->setBoolValue("normalized", false);
       _node_src_rect->setFloatValue("right", tex_dim.width());
@@ -332,16 +334,16 @@ namespace canvas
   }
 
   //----------------------------------------------------------------------------
-  Rect<int> Image::getTextureDimensions() const
+  SGRect<int> Image::getTextureDimensions() const
   {
     osg::Texture2D *texture = !_src_canvas.expired()
                             ? _src_canvas.lock()->getTexture()
                             : _texture.get();
 
     if( !texture )
-      return Rect<int>();
+      return SGRect<int>();
 
-    return Rect<int>
+    return SGRect<int>
     (
       0,0,
       texture->getTextureWidth(),
index f72ed6f1794458f5240c34f420db834fe10c5f4f..8d66fca17168f3ba41a18436145b3b0d36d6f0d6 100644 (file)
@@ -22,7 +22,7 @@
 #include "CanvasElement.hxx"
 
 #include <simgear/canvas/canvas_fwd.hxx>
-#include <simgear/math/Rect.hxx>
+#include <simgear/math/SGRect.hxx>
 #include <osg/Texture2D>
 
 namespace simgear
@@ -55,7 +55,7 @@ namespace canvas
       void setImage(osg::Image *img);
       void setFill(const std::string& fill);
 
-      const Rect<float>& getRegion() const;
+      const SGRect<float>& getRegion() const;
 
     protected:
 
@@ -68,7 +68,7 @@ namespace canvas
       virtual void childChanged(SGPropertyNode * child);
 
       void setupDefaultDimensions();
-      Rect<int> getTextureDimensions() const;
+      SGRect<int> getTextureDimensions() const;
 
       osg::ref_ptr<osg::Texture2D> _texture;
       // TODO optionally forward events to canvas
@@ -80,7 +80,7 @@ namespace canvas
       osg::ref_ptr<osg::Vec4Array> _colors;
 
       SGPropertyNode *_node_src_rect;
-      Rect<float>     _src_rect,
+      SGRect<float>   _src_rect,
                       _region;
   };
 
index 1308f1f4cc8e28a836b25c50c230d5958cb03829..0ebe7fd0dcc60cf4974d65b679e43900428a6e61 100644 (file)
@@ -2,7 +2,6 @@ include (SimGearComponent)
 
 
 set(HEADERS
-    Rect.hxx
     SGBox.hxx
     SGCMath.hxx
     SGGeoc.hxx
@@ -21,6 +20,7 @@ set(HEADERS
     SGPlane.hxx
     SGQuat.hxx
     SGRay.hxx
+    SGRect.hxx
     SGSphere.hxx
     SGTriangle.hxx
     SGVec2.hxx
diff --git a/simgear/math/Rect.hxx b/simgear/math/Rect.hxx
deleted file mode 100644 (file)
index d45d4a0..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-// Class representing a rectangular region
-//
-// Copyright (C) 2012  Thomas Geymayer <tomgey@gmail.com>
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Library General Public
-// License as published by the Free Software Foundation; either
-// version 2 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Library General Public License for more details.
-//
-// You should have received a copy of the GNU Library General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
-
-#ifndef SG_RECT_HXX_
-#define SG_RECT_HXX_
-
-namespace simgear
-{
-
-  template<typename T>
-  class Rect
-  {
-    public:
-      Rect():
-        _x1(0),
-        _x2(0),
-        _y1(0),
-        _y2(0)
-      {}
-
-      Rect(T x, T y, T w, T h):
-        _x1(x),
-        _x2(x + w),
-        _y1(y),
-        _y2(y + h)
-      {}
-
-      void set(T x, T y, T w, T h)
-      {
-        _x1 = x;
-        _x2 = x + w;
-        _y1 = y;
-        _y2 = y + h;
-      }
-
-      T x() const { return _x1; }
-      T y() const { return _y1; }
-      T width() const { return _x2 - _x1; }
-      T height() const { return _y2 - _y1; }
-
-      void setX(T x) { T w = width(); _x1 = x; _x2 = x + w; }
-      void setY(T y) { T h = height(); _y1 = y; _y2 = y + h; }
-      void setWidth(T w) { _x2 = _x1 + w; }
-      void setHeight(T h) { _y2 = _y1 + h; }
-
-      T l() const { return _x1; }
-      T r() const { return _x2; }
-      T t() const { return _y1; }
-      T b() const { return _y2; }
-
-      void setLeft(T l) { _x1 = l; }
-      void setRight(T r) { _x2 = r; }
-      void setTop(T t) { _y1 = t; }
-      void setBottom(T b) { _y2 = b; }
-
-      bool contains(T x, T y) const
-      {
-        return _x1 <= x && x <= _x2
-            && _y1 <= y && y <= _y2;
-      }
-
-      bool contains(T x, T y, T margin) const
-      {
-        return (_x1 - margin) <= x && x <= (_x2 + margin)
-            && (_y1 - margin) <= y && y <= (_y2 + margin);
-      }
-
-    private:
-      T _x1, _x2, _y1, _y2;
-  };
-
-} // namespace simgear
-
-#endif /* SG_RECT_HXX_ */
diff --git a/simgear/math/SGRect.hxx b/simgear/math/SGRect.hxx
new file mode 100644 (file)
index 0000000..20976a0
--- /dev/null
@@ -0,0 +1,130 @@
+// Class representing a rectangular region
+//
+// Copyright (C) 2012  Thomas Geymayer <tomgey@gmail.com>
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
+
+#ifndef SG_RECT_HXX_
+#define SG_RECT_HXX_
+
+#include "SGLimits.hxx"
+#include "SGVec2.hxx"
+
+template<typename T>
+class SGRect
+{
+  public:
+
+    SGRect():
+      _min(SGLimits<T>::max(), SGLimits<T>::max()),
+      _max(-SGLimits<T>::max(), -SGLimits<T>::max())
+    {
+
+    }
+
+    SGRect(const SGVec2<T>& pt):
+      _min(pt),
+      _max(pt)
+    {
+
+    }
+
+    SGRect(T x, T y):
+      _min(x, y),
+      _max(x, y)
+    {
+
+    }
+
+    SGRect(const SGVec2<T>& min, const SGVec2<T>& max):
+      _min(min),
+      _max(max)
+    {
+
+    }
+
+    SGRect(T x, T y, T w, T h):
+      _min(x, y),
+      _max(x + w, y + h)
+    {
+
+    }
+
+    template<typename S>
+    explicit SGRect(const SGRect<S>& rect):
+      _min(rect.getMin()),
+      _max(rect.getMax())
+    {
+
+    }
+
+    void setMin(const SGVec2<T>& min) { _min = min; }
+    const SGVec2<T>& getMin() const { return _min; }
+
+    void setMax(const SGVec2<T>& max) { _max = max; }
+    const SGVec2<T>& getMax() const { return _max; }
+
+    void set(T x, T y, T w, T h)
+    {
+      _min.x() = x;
+      _min.y() = y;
+      _max.x() = x + w;
+      _max.y() = y + h;
+    }
+
+    T x() const { return _min.x(); }
+    T y() const { return _min.y(); }
+    T width() const { return _max.x() - _min.x(); }
+    T height() const { return _max.y() - _min.y(); }
+
+    void setX(T x) { T w = width(); _min.x() = x; _max.x() = x + w; }
+    void setY(T y) { T h = height(); _min.y() = y; _max.y() = y + h; }
+    void setWidth(T w) { _max.x() = _min.x() + w; }
+    void setHeight(T h) { _max.y() = _min.y() + h; }
+
+    T l() const { return _min.x(); }
+    T r() const { return _max.x(); }
+    T t() const { return _min.y(); }
+    T b() const { return _max.y(); }
+
+    void setLeft(T l) { _min.x() = l; }
+    void setRight(T r) { _max.x() = r; }
+    void setTop(T t) { _min.y() = t; }
+    void setBottom(T b) { _max.y() = b; }
+
+    bool contains(T x, T y) const
+    {
+      return _min.x() <= x && x <= _max.x()
+          && _min.y() <= y && y <= _max.y();
+    }
+
+    bool contains(T x, T y, T margin) const
+    {
+      return (_min.x() - margin) <= x && x <= (_max.x() + margin)
+          && (_min.y() - margin) <= y && y <= (_max.y() + margin);
+    }
+
+  private:
+    SGVec2<T> _min,
+              _max;
+};
+
+template<typename char_type, typename traits_type, typename T>
+inline
+std::basic_ostream<char_type, traits_type>&
+operator<<(std::basic_ostream<char_type, traits_type>& s, const SGRect<T>& rect)
+{ return s << "min = " << rect.getMin() << ", max = " << rect.getMax(); }
+
+#endif /* SG_RECT_HXX_ */
index 6a5e1ae7345d1a91fceff2f2bb02bb378d17c846..753be9f4cd1c4aada173dd2ca2d0e3115fd5182b 100644 (file)
@@ -126,8 +126,9 @@ public:
   T operator op##=(const T rhs)\
   {\
     SGPropertyNode* n = getOrThrow();\
-    n->setValue<T>(n->getValue<T>() op rhs);\
-    return *this;\
+    T new_val = n->getValue<T>() op rhs;\
+    n->setValue<T>(new_val);\
+    return new_val;\
   }
 
   SG_DEF_ASSIGN_OP(+)