0024473: TKMath, BVH - introduce template-based package for Bounding volume hierarchy...
[occt.git] / src / BVH / BVH_Properties.lxx
diff --git a/src/BVH/BVH_Properties.lxx b/src/BVH/BVH_Properties.lxx
new file mode 100644 (file)
index 0000000..abe767a
--- /dev/null
@@ -0,0 +1,223 @@
+// Created on: 2013-12-20
+// Created by: Denis BOGOLEPOV
+// Copyright (c) 2013 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+// =======================================================================
+// function : BVH_Transform
+// purpose  :
+// =======================================================================
+template<class T, int N>
+BVH_Transform<T, N>::BVH_Transform()
+{
+  //
+}
+
+// =======================================================================
+// function : BVH_Transform
+// purpose  :
+// =======================================================================
+template<class T, int N>
+BVH_Transform<T, N>::BVH_Transform (const BVH_MatNt& theTransform)
+: myTransform (theTransform)
+{
+  //
+}
+
+// =======================================================================
+// function : ~BVH_Transform
+// purpose  :
+// =======================================================================
+template<class T, int N>
+BVH_Transform<T, N>::~BVH_Transform()
+{
+  //
+}
+
+// =======================================================================
+// function : Transform
+// purpose  :
+// =======================================================================
+template<class T, int N>
+const typename BVH_Transform<T, N>::BVH_MatNt& BVH_Transform<T, N>::Transform() const
+{
+  return myTransform;
+}
+
+namespace BVHTools
+{
+  template<class T, int N> struct MatrixOp
+  {
+    // Not implemented
+  };
+
+  template<class T> struct MatrixOp<T, 4>
+  {
+    typedef typename BVHTools::MatrixType<T, 4>::Type BVH_Mat4t;
+
+    static void Inverse (const BVH_Mat4t& theIn,
+                         BVH_Mat4t&       theOut)
+    {
+      theIn.Inverted (theOut);
+    }
+
+    typedef typename BVHTools::VectorType<T, 4>::Type BVH_Vec4t;
+
+    static BVH_Vec4t Multiply (const BVH_Mat4t& theMat,
+                               const BVH_Vec4t& theVec)
+    {
+      BVH_Vec4t aOut = theMat * theVec;
+      return aOut * static_cast<T> (1.0 / aOut.w());
+    }
+  };
+}
+
+// =======================================================================
+// function : SetTransform
+// purpose  :
+// =======================================================================
+template<class T, int N>
+void BVH_Transform<T, N>::SetTransform (const BVH_MatNt& theTransform)
+{
+  myTransform = theTransform;
+  BVHTools::MatrixOp<T, N>::Inverse (myTransform, myTransformInversed);
+}
+
+// =======================================================================
+// function : Inversed
+// purpose  :
+// =======================================================================
+template<class T, int N>
+const typename BVH_Transform<T, N>::BVH_MatNt& BVH_Transform<T, N>::Inversed() const
+{
+  return myTransformInversed;
+}
+
+namespace BVHTools
+{
+  template<class T, int N>
+  struct UnitVector
+  {
+    // Not implemented
+  };
+
+  template<class T>
+  struct UnitVector<T, 2>
+  {
+    typedef typename BVHTools::VectorType<T, 2>::Type BVH_Vec2t;
+
+    static BVH_Vec2t DX()
+    {
+      return BVH_Vec2t (static_cast<T> (1.0),
+                        static_cast<T> (0.0));
+    }
+
+    static BVH_Vec2t DY()
+    {
+      return BVH_Vec2t (static_cast<T> (0.0),
+                        static_cast<T> (1.0));
+    }
+
+    static BVH_Vec2t DZ()
+    {
+      return BVH_Vec2t (static_cast<T> (0.0),
+                        static_cast<T> (0.0));
+    }
+  };
+
+  template<class T>
+  struct UnitVector<T, 3>
+  {
+    typedef typename BVHTools::VectorType<T, 3>::Type BVH_Vec3t;
+
+    static BVH_Vec3t DX()
+    {
+      return BVH_Vec3t (static_cast<T> (1.0),
+                        static_cast<T> (0.0),
+                        static_cast<T> (0.0));
+    }
+
+    static BVH_Vec3t DY()
+    {
+      return BVH_Vec3t (static_cast<T> (0.0),
+                        static_cast<T> (1.0),
+                        static_cast<T> (0.0));
+    }
+
+    static BVH_Vec3t DZ()
+    {
+      return BVH_Vec3t (static_cast<T> (0.0),
+                        static_cast<T> (0.0),
+                        static_cast<T> (1.0));
+    }
+  };
+
+  template<class T>
+  struct UnitVector<T, 4>
+  {
+    typedef typename BVHTools::VectorType<T, 4>::Type BVH_Vec4t;
+
+    static BVH_Vec4t DX()
+    {
+      return BVH_Vec4t (static_cast<T> (1.0),
+                        static_cast<T> (0.0),
+                        static_cast<T> (0.0),
+                        static_cast<T> (0.0));
+    }
+
+    static BVH_Vec4t DY()
+    {
+      return BVH_Vec4t (static_cast<T> (0.0),
+                        static_cast<T> (1.0),
+                        static_cast<T> (0.0),
+                        static_cast<T> (0.0));
+    }
+
+    static BVH_Vec4t DZ()
+    {
+      return BVH_Vec4t (static_cast<T> (0.0),
+                        static_cast<T> (0.0),
+                        static_cast<T> (1.0),
+                        static_cast<T> (0.0));
+    }
+  };
+}
+
+// =======================================================================
+// function : Apply
+// purpose  :
+// =======================================================================
+template<class T, int N>
+BVH_Box<T, N> BVH_Transform<T, N>::Apply (const BVH_Box<T, N>& theBox) const
+{
+  typename BVH_Box<T, N>::BVH_VecNt aSize = theBox.Size();
+
+  BVH_Box<T, N> aBox;
+  for (Standard_Integer aX = 0; aX <= 1; ++aX)
+  {
+    for (Standard_Integer aY = 0; aY <= 1; ++aY)
+    {
+      for (Standard_Integer aZ = 0; aZ <= 1; ++aZ)
+      {
+        typename BVH_Box<T, N>::BVH_VecNt aCorner = theBox.CornerMin() +
+          BVHTools::UnitVector<T, N>::DX() * aSize * static_cast<T> (aX) +
+          BVHTools::UnitVector<T, N>::DY() * aSize * static_cast<T> (aY) +
+          BVHTools::UnitVector<T, N>::DZ() * aSize * static_cast<T> (aZ);
+
+        aBox.Add (BVHTools::MatrixOp<T, N>::Multiply (myTransform, aCorner));
+      }
+    }
+  }
+
+  return aBox;
+}