// Created on: 2013-12-20 // Created by: Denis BOGOLEPOV // Copyright (c) 2013-2014 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 License 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. #ifndef _BVH_Properties_Header #define _BVH_Properties_Header #include #include //! Abstract properties of geometric object. class BVH_Properties : public Standard_Transient { DEFINE_STANDARD_RTTIEXT(BVH_Properties, Standard_Transient) public: //! Releases resources of object properties. Standard_EXPORT virtual ~BVH_Properties() = 0; }; //! Stores transform properties of geometric object. template class BVH_Transform : public BVH_Properties { public: //! Type of transformation matrix. typedef typename BVH::MatrixType::Type BVH_MatNt; public: //! Creates new identity transformation. BVH_Transform() {} //! Creates new transformation with specified matrix. BVH_Transform (const BVH_MatNt& theTransform) : myTransform (theTransform) {} //! Releases resources of transformation properties. virtual ~BVH_Transform() {} //! Returns transformation matrix. const BVH_MatNt& Transform() const { return myTransform; } //! Sets new transformation matrix. void SetTransform (const BVH_MatNt& theTransform); //! Returns inversed transformation matrix. const BVH_MatNt& Inversed() const { return myTransformInversed; } //! Applies transformation matrix to bounding box. BVH_Box Apply (const BVH_Box& theBox) const; protected: BVH_MatNt myTransform; //!< Transformation matrix BVH_MatNt myTransformInversed; //!< Inversed transformation matrix }; namespace BVH { template struct MatrixOp { // Not implemented }; template struct MatrixOp { typedef typename BVH::MatrixType::Type BVH_Mat4t; static void Inverse (const BVH_Mat4t& theIn, BVH_Mat4t& theOut) { theIn.Inverted (theOut); } typedef typename BVH::VectorType::Type BVH_Vec4t; static BVH_Vec4t Multiply (const BVH_Mat4t& theMat, const BVH_Vec4t& theVec) { BVH_Vec4t aOut = theMat * theVec; return aOut * static_cast (1.0 / aOut.w()); } }; template struct UnitVector { // Not implemented }; template struct UnitVector { typedef typename BVH::VectorType::Type BVH_Vec2t; static BVH_Vec2t DX() { return BVH_Vec2t (static_cast (1.0), static_cast (0.0)); } static BVH_Vec2t DY() { return BVH_Vec2t (static_cast (0.0), static_cast (1.0)); } static BVH_Vec2t DZ() { return BVH_Vec2t (static_cast (0.0), static_cast (0.0)); } }; template struct UnitVector { typedef typename BVH::VectorType::Type BVH_Vec3t; static BVH_Vec3t DX() { return BVH_Vec3t (static_cast (1.0), static_cast (0.0), static_cast (0.0)); } static BVH_Vec3t DY() { return BVH_Vec3t (static_cast (0.0), static_cast (1.0), static_cast (0.0)); } static BVH_Vec3t DZ() { return BVH_Vec3t (static_cast (0.0), static_cast (0.0), static_cast (1.0)); } }; template struct UnitVector { typedef typename BVH::VectorType::Type BVH_Vec4t; static BVH_Vec4t DX() { return BVH_Vec4t (static_cast (1.0), static_cast (0.0), static_cast (0.0), static_cast (0.0)); } static BVH_Vec4t DY() { return BVH_Vec4t (static_cast (0.0), static_cast (1.0), static_cast (0.0), static_cast (0.0)); } static BVH_Vec4t DZ() { return BVH_Vec4t (static_cast (0.0), static_cast (0.0), static_cast (1.0), static_cast (0.0)); } }; } // ======================================================================= // function : SetTransform // purpose : // ======================================================================= template void BVH_Transform::SetTransform (const BVH_MatNt& theTransform) { myTransform = theTransform; BVH::MatrixOp::Inverse (myTransform, myTransformInversed); } // ======================================================================= // function : Apply // purpose : // ======================================================================= template BVH_Box BVH_Transform::Apply (const BVH_Box& theBox) const { typename BVH_Box::BVH_VecNt aSize = theBox.Size(); BVH_Box 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::BVH_VecNt aCorner = theBox.CornerMin() + BVH::UnitVector::DX() * aSize * static_cast (aX) + BVH::UnitVector::DY() * aSize * static_cast (aY) + BVH::UnitVector::DZ() * aSize * static_cast (aZ); aBox.Add (BVH::MatrixOp::Multiply (myTransform, aCorner)); } } } return aBox; } #endif // _BVH_Properties_Header