]> git.mxchange.org Git - simgear.git/commitdiff
math/nasal: Add more SGRect members and nasal helper.
authorThomas Geymayer <tomgey@gmail.com>
Tue, 15 Apr 2014 08:04:37 +0000 (10:04 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Tue, 15 Apr 2014 08:07:01 +0000 (10:07 +0200)
simgear/math/SGMathTest.cxx
simgear/math/SGRect.hxx
simgear/nasal/cppbind/detail/to_nasal_helper.hxx

index ef1f50747953e244c3454a5e0731c3422a7887ce..3308a009b218962630c1d8d6e5b79ab9019848bc 100644 (file)
 #  include <simgear_config.h>
 #endif
 
+#include <simgear/misc/test_macros.hxx>
+
 #include <cstdlib>
 #include <iostream>
 
 #include "SGMath.hxx"
+#include "SGRect.hxx"
 #include "sg_random.h"
 
 template<typename T>
@@ -268,6 +271,33 @@ MatrixTest(void)
   return true;
 }
 
+template<typename T>
+void doRectTest()
+{
+  SGRect<T> rect(10, 15, 20, 25);
+
+  COMPARE(rect.x(), 10)
+  COMPARE(rect.y(), 15)
+  COMPARE(rect.width(), 20)
+  COMPARE(rect.height(), 25)
+
+  COMPARE(rect.pos(), SGVec2<T>(10, 15))
+  COMPARE(rect.size(), SGVec2<T>(20, 25))
+
+  COMPARE(rect.l(), 10)
+  COMPARE(rect.t(), 15)
+  COMPARE(rect.r(), 30)
+  COMPARE(rect.b(), 40)
+
+  VERIFY(rect == rect)
+  VERIFY(rect == SGRect<T>(10, 15, 20, 25))
+  VERIFY(rect != SGRect<T>(11, 15, 20, 25))
+
+  VERIFY(rect.contains(10, 15))
+  VERIFY(!rect.contains(9, 15))
+  VERIFY(rect.contains(9, 15, 1))
+}
+
 bool
 GeodesyTest(void)
 {
@@ -351,6 +381,10 @@ main(void)
   if (!MatrixTest<double>())
     return EXIT_FAILURE;
 
+  // Do rect tests
+  doRectTest<int>();
+  doRectTest<double>();
+
   // Check geodetic/geocentric/cartesian conversions
   if (!GeodesyTest())
     return EXIT_FAILURE;
index ad5771e9c803c37c6bdabc24f24c72c51b9c0b96..9c51f091def6d591d6099f920e19812dc3522a91 100644 (file)
@@ -88,11 +88,15 @@ class SGRect
     T y() const { return _min.y(); }
     T width() const { return _max.x() - _min.x(); }
     T height() const { return _max.y() - _min.y(); }
+    SGVec2<T> const& pos() const { return _min; }
+    SGVec2<T> size() const { return SGVec2<T>(width(), height()); }
 
     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; }
+    void setPos(const SGVec2<T>& p) { setX(p.x()); setY(p.y()); }
+    void setSize(const SGVec2<T>& s) { setWidth(s.x()); setHeight(s.y()); }
 
     T l() const { return _min.x(); }
     T r() const { return _max.x(); }
@@ -129,6 +133,17 @@ class SGRect
       return *this;
     }
 
+    bool operator==(const SGRect<T>& rhs) const
+    {
+      return _min == rhs._min
+          && _max == rhs._max;
+    }
+
+    bool operator!=(const SGRect<T>& rhs) const
+    {
+      return !(*this == rhs);
+    }
+
     bool contains(T x, T y) const
     {
       return _min.x() <= x && x <= _max.x()
@@ -176,4 +191,8 @@ 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(); }
 
+typedef SGRect<int> SGRecti;
+typedef SGRect<float> SGRectf;
+typedef SGRect<double> SGRectd;
+
 #endif /* SG_RECT_HXX_ */
index e6c8a6e472c0e95fafa818b247feeb6ef3637e6e..a0173ff6a30c2227d3f351bfb560638acefdfa31 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "nasal_traits.hxx"
 
+#include <simgear/math/SGMath.hxx>
+#include <simgear/math/SGRect.hxx>
 #include <simgear/nasal/nasal.h>
 
 #include <boost/function/function_fwd.hpp>
@@ -146,6 +148,19 @@ namespace nasal
     return to_nasal_helper(c, nasal_vec);
   }
 
+  //----------------------------------------------------------------------------
+  template<class T>
+  naRef to_nasal_helper(naContext c, const SGRect<T>& rect)
+  {
+    std::vector<float> vec(4);
+    vec[0] = rect.l();
+    vec[1] = rect.t();
+    vec[2] = rect.r();
+    vec[3] = rect.b();
+
+    return to_nasal_helper(c, vec);
+  }
+
   //----------------------------------------------------------------------------
   template<class Value>
   naRef to_nasal_helper(naContext c, const std::map<std::string, Value>& map)