Merging r46414 through r46455 from trunk into soc-2011-tomato
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 9 May 2012 09:41:27 +0000 (09:41 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 9 May 2012 09:41:27 +0000 (09:41 +0000)
208 files changed:
extern/Eigen3/Eigen/Core
extern/Eigen3/Eigen/SVD
extern/Eigen3/Eigen/src/Cholesky/LDLT.h
extern/Eigen3/Eigen/src/Cholesky/LLT.h
extern/Eigen3/Eigen/src/Core/Array.h
extern/Eigen3/Eigen/src/Core/Block.h
extern/Eigen3/Eigen/src/Core/DenseBase.h
extern/Eigen3/Eigen/src/Core/Map.h
extern/Eigen3/Eigen/src/Core/MapBase.h
extern/Eigen3/Eigen/src/Core/Matrix.h
extern/Eigen3/Eigen/src/Core/MatrixBase.h
extern/Eigen3/Eigen/src/Core/PlainObjectBase.h
extern/Eigen3/Eigen/src/Core/ProductBase.h
extern/Eigen3/Eigen/src/Core/Replicate.h
extern/Eigen3/Eigen/src/Core/SolveTriangular.h
extern/Eigen3/Eigen/src/Core/arch/NEON/Complex.h
extern/Eigen3/Eigen/src/Core/arch/NEON/PacketMath.h
extern/Eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h
extern/Eigen3/Eigen/src/Core/util/Macros.h
extern/Eigen3/Eigen/src/Core/util/Memory.h
extern/Eigen3/Eigen/src/Core/util/XprHelper.h
extern/Eigen3/Eigen/src/Eigenvalues/EigenSolver.h
extern/Eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
extern/Eigen3/Eigen/src/Geometry/Hyperplane.h
extern/Eigen3/Eigen/src/Geometry/Quaternion.h
extern/Eigen3/Eigen/src/Geometry/Rotation2D.h
extern/Eigen3/Eigen/src/Geometry/Transform.h
extern/Eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h
extern/Eigen3/Eigen/src/LU/FullPivLU.h
extern/Eigen3/Eigen/src/LU/arch/Inverse_SSE.h
extern/Eigen3/Eigen/src/SVD/JacobiSVD.h
extern/Eigen3/Eigen/src/Sparse/TriangularSolver.h
extern/libmv/libmv/image/correlation.h
extern/libmv/libmv/image/sample.h
extern/libmv/libmv/tracking/brute_region_tracker.cc
extern/libmv/libmv/tracking/esm_region_tracker.cc
intern/cycles/kernel/kernel_light.h
intern/cycles/kernel/kernel_object.h
intern/cycles/kernel/svm/svm_tex_coord.h
intern/cycles/render/nodes.cpp
intern/cycles/util/util_progress.h
intern/dualcon/dualcon.h
intern/dualcon/intern/GeoCommon.h
intern/dualcon/intern/MemoryAllocator.h
intern/dualcon/intern/ModelReader.h
intern/dualcon/intern/Projections.cpp
intern/dualcon/intern/Projections.h
intern/dualcon/intern/Queue.h
intern/dualcon/intern/cubes.h
intern/dualcon/intern/dualcon_c_api.cpp
intern/dualcon/intern/marching_cubes_table.cpp
intern/dualcon/intern/octree.cpp
intern/dualcon/intern/octree.h
source/blender/avi/intern/avi.c
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/movieclip.c
source/blender/blenkernel/intern/multires.c
source/blender/blenkernel/intern/node.c
source/blender/blenkernel/intern/particle_system.c
source/blender/blenkernel/intern/seqeffects.c
source/blender/blenkernel/intern/sequencer.c
source/blender/blenkernel/intern/smoke.c
source/blender/blenkernel/intern/softbody.c
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/blenkernel/intern/text.c
source/blender/blenkernel/intern/tracking.c
source/blender/blenkernel/intern/writeffmpeg.c
source/blender/blenlib/intern/BLI_ghash.c
source/blender/blenlib/intern/path_util.c
source/blender/blenloader/intern/readfile.c
source/blender/collada/AnimationExporter.cpp
source/blender/collada/GeometryExporter.cpp
source/blender/collada/InstanceWriter.cpp
source/blender/editors/animation/anim_channels_defines.c
source/blender/editors/animation/anim_channels_edit.c
source/blender/editors/animation/anim_deps.c
source/blender/editors/animation/anim_draw.c
source/blender/editors/animation/anim_filter.c
source/blender/editors/animation/anim_intern.h
source/blender/editors/animation/anim_ipo_utils.c
source/blender/editors/animation/anim_markers.c
source/blender/editors/animation/anim_ops.c
source/blender/editors/animation/drivers.c
source/blender/editors/animation/fmodifier_ui.c
source/blender/editors/animation/keyframes_draw.c
source/blender/editors/animation/keyframes_edit.c
source/blender/editors/animation/keyframes_general.c
source/blender/editors/animation/keyframing.c
source/blender/editors/animation/keyingsets.c
source/blender/editors/armature/BIF_generate.h
source/blender/editors/armature/BIF_retarget.h
source/blender/editors/armature/armature_intern.h
source/blender/editors/armature/armature_ops.c
source/blender/editors/armature/editarmature.c
source/blender/editors/armature/editarmature_generate.c
source/blender/editors/armature/editarmature_retarget.c
source/blender/editors/armature/editarmature_sketch.c
source/blender/editors/armature/meshlaplacian.c
source/blender/editors/armature/meshlaplacian.h
source/blender/editors/armature/poseSlide.c
source/blender/editors/armature/poseUtils.c
source/blender/editors/armature/poselib.c
source/blender/editors/armature/poseobject.c
source/blender/editors/armature/reeb.c
source/blender/editors/armature/reeb.h
source/blender/editors/curve/editcurve.c
source/blender/editors/curve/editfont.c
source/blender/editors/gpencil/drawgpencil.c
source/blender/editors/gpencil/editaction_gpencil.c
source/blender/editors/gpencil/gpencil_buttons.c
source/blender/editors/gpencil/gpencil_edit.c
source/blender/editors/gpencil/gpencil_intern.h
source/blender/editors/gpencil/gpencil_ops.c
source/blender/editors/gpencil/gpencil_paint.c
source/blender/editors/gpencil/gpencil_undo.c
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/interface_layout.c
source/blender/editors/metaball/mball_edit.c
source/blender/editors/metaball/mball_ops.c
source/blender/editors/object/object_constraint.c
source/blender/editors/object/object_edit.c
source/blender/editors/screen/area.c
source/blender/editors/screen/glutil.c
source/blender/editors/screen/screen_context.c
source/blender/editors/screen/screen_edit.c
source/blender/editors/screen/screen_intern.h
source/blender/editors/screen/screen_ops.c
source/blender/editors/screen/screendump.c
source/blender/editors/space_action/action_draw.c
source/blender/editors/space_action/action_edit.c
source/blender/editors/space_action/action_intern.h
source/blender/editors/space_action/action_ops.c
source/blender/editors/space_action/action_select.c
source/blender/editors/space_action/space_action.c
source/blender/editors/space_buttons/buttons_context.c
source/blender/editors/space_buttons/buttons_header.c
source/blender/editors/space_buttons/buttons_intern.h
source/blender/editors/space_buttons/buttons_ops.c
source/blender/editors/space_buttons/buttons_texture.c
source/blender/editors/space_buttons/space_buttons.c
source/blender/editors/space_file/fsmenu.c
source/blender/editors/space_graph/graph_buttons.c
source/blender/editors/space_graph/graph_draw.c
source/blender/editors/space_graph/graph_edit.c
source/blender/editors/space_graph/graph_intern.h
source/blender/editors/space_graph/graph_ops.c
source/blender/editors/space_graph/graph_select.c
source/blender/editors/space_graph/graph_utils.c
source/blender/editors/space_graph/space_graph.c
source/blender/editors/space_nla/nla_buttons.c
source/blender/editors/space_nla/nla_channels.c
source/blender/editors/space_nla/nla_draw.c
source/blender/editors/space_nla/nla_edit.c
source/blender/editors/space_nla/nla_intern.h
source/blender/editors/space_nla/nla_ops.c
source/blender/editors/space_nla/nla_select.c
source/blender/editors/space_nla/space_nla.c
source/blender/editors/space_script/script_edit.c
source/blender/editors/space_script/script_ops.c
source/blender/editors/space_script/space_script.c
source/blender/editors/space_sequencer/sequencer_intern.h
source/blender/editors/space_sequencer/sequencer_scopes.c
source/blender/editors/space_sequencer/sequencer_select.c
source/blender/editors/space_text/text_ops.c
source/blender/editors/space_time/space_time.c
source/blender/editors/space_time/time_ops.c
source/blender/editors/space_view3d/drawmesh.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_buttons.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_fly.c
source/blender/editors/space_view3d/view3d_header.c
source/blender/editors/space_view3d/view3d_intern.h
source/blender/editors/space_view3d/view3d_select.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/editors/transform/transform_input.c
source/blender/gpu/intern/gpu_buffers.c
source/blender/imbuf/intern/anim_movie.c
source/blender/imbuf/intern/indexer.c
source/blender/imbuf/intern/rectop.c
source/blender/imbuf/intern/scaling.c
source/blender/makesdna/DNA_smoke_types.h
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_sequencer.c
source/blender/modifiers/intern/MOD_array.c
source/blender/modifiers/intern/MOD_cloth.c
source/blender/modifiers/intern/MOD_curve.c
source/blender/modifiers/intern/MOD_lattice.c
source/blender/modifiers/intern/MOD_solidify.c
source/blender/python/BPY_extern.h
source/blender/python/generic/bgl.c
source/blender/python/generic/bgl.h
source/blender/python/intern/bpy_interface.c
source/blender/python/intern/bpy_rna.c
source/blender/python/intern/bpy_util.h
source/blender/render/intern/source/gammaCorrectionTables.c
source/blender/render/intern/source/pipeline.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index 6e855427c33c5badf73fae1d051392299491296a..a5025e37ead42ac59e8c9444b8cbac0e21889a9f 100644 (file)
   #include <intrin.h>
 #endif
 
-#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(EIGEN_NO_EXCEPTIONS)
+#if defined(_CPPUNWIND) || defined(__EXCEPTIONS)
   #define EIGEN_EXCEPTIONS
 #endif
 
index d24471fd724bbd2748cdf62c73fc776984ddb58c..7c987a9dd366e8a6cdd5da055568c0ff863682cd 100644 (file)
@@ -13,9 +13,9 @@ namespace Eigen {
   *
   *
   *
-  * This module provides SVD decomposition for (currently) real matrices.
+  * This module provides SVD decomposition for matrices (both real and complex).
   * This decomposition is accessible via the following MatrixBase method:
-  *  - MatrixBase::svd()
+  *  - MatrixBase::jacobiSvd()
   *
   * \code
   * #include <Eigen/SVD>
index f47b2ea5669db9092edc31fe4cfdd01e299a176d..a19e947a4c684a807f62450fec9c87b6e8c91ca4 100644 (file)
@@ -331,16 +331,16 @@ template<> struct ldlt_inplace<Upper>
 
 template<typename MatrixType> struct LDLT_Traits<MatrixType,Lower>
 {
-  typedef TriangularView<MatrixType, UnitLower> MatrixL;
-  typedef TriangularView<typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;
+  typedef const TriangularView<const MatrixType, UnitLower> MatrixL;
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;
   inline static MatrixL getL(const MatrixType& m) { return m; }
   inline static MatrixU getU(const MatrixType& m) { return m.adjoint(); }
 };
 
 template<typename MatrixType> struct LDLT_Traits<MatrixType,Upper>
 {
-  typedef TriangularView<typename MatrixType::AdjointReturnType, UnitLower> MatrixL;
-  typedef TriangularView<MatrixType, UnitUpper> MatrixU;
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitLower> MatrixL;
+  typedef const TriangularView<const MatrixType, UnitUpper> MatrixU;
   inline static MatrixL getL(const MatrixType& m) { return m.adjoint(); }
   inline static MatrixU getU(const MatrixType& m) { return m; }
 };
index a4ee5b11cb983c0f48351250b25e449713104736..3bb76b5787f7ce83d7e00228da2c5affb04a0ad1 100644 (file)
@@ -274,8 +274,8 @@ template<> struct llt_inplace<Upper>
 
 template<typename MatrixType> struct LLT_Traits<MatrixType,Lower>
 {
-  typedef TriangularView<MatrixType, Lower> MatrixL;
-  typedef TriangularView<typename MatrixType::AdjointReturnType, Upper> MatrixU;
+  typedef const TriangularView<const MatrixType, Lower> MatrixL;
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, Upper> MatrixU;
   inline static MatrixL getL(const MatrixType& m) { return m; }
   inline static MatrixU getU(const MatrixType& m) { return m.adjoint(); }
   static bool inplace_decomposition(MatrixType& m)
@@ -284,8 +284,8 @@ template<typename MatrixType> struct LLT_Traits<MatrixType,Lower>
 
 template<typename MatrixType> struct LLT_Traits<MatrixType,Upper>
 {
-  typedef TriangularView<typename MatrixType::AdjointReturnType, Lower> MatrixL;
-  typedef TriangularView<MatrixType, Upper> MatrixU;
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, Lower> MatrixL;
+  typedef const TriangularView<const MatrixType, Upper> MatrixU;
   inline static MatrixL getL(const MatrixType& m) { return m.adjoint(); }
   inline static MatrixU getU(const MatrixType& m) { return m; }
   static bool inplace_decomposition(MatrixType& m)
index a3a2167ad3eaa7260c6c169fd1a49e102ebcc6cf..a11fb1b53d5e5451a45fdcc4dc907ab020afc73d 100644 (file)
@@ -68,10 +68,8 @@ class Array
     friend struct internal::conservative_resize_like_impl;
 
     using Base::m_storage;
+
   public:
-    enum { NeedsToAlign = (!(Options&DontAlign))
-                          && SizeAtCompileTime!=Dynamic && ((static_cast<int>(sizeof(Scalar))*SizeAtCompileTime)%16)==0 };
-    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
 
     using Base::base;
     using Base::coeff;
index 2b251bc2ca95597113e776926fd644be0a4d8d21..d470bc13400e53caee0d9b6b13309970a1aa8f1d 100644 (file)
@@ -94,7 +94,7 @@ struct traits<Block<XprType, BlockRows, BlockCols, InnerPanel, HasDirectAccess>
     MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0)
                        && (InnerStrideAtCompileTime == 1)
                         ? PacketAccessBit : 0,
-    MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && ((OuterStrideAtCompileTime % packet_traits<Scalar>::size) == 0)) ? AlignedBit : 0,
+    MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16) == 0)) ? AlignedBit : 0,
     FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
     FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
     FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
@@ -342,7 +342,7 @@ class Block<XprType,BlockRows,BlockCols, InnerPanel,true>
     }
 
     const typename XprType::Nested m_xpr;
-    int m_outerStride;
+    Index m_outerStride;
 };
 
 
index 838fa40307aa6f92d767d8507d2b82e445f957d3..920904f243a7d4783dc23075653d10773d56ef97 100644 (file)
@@ -169,8 +169,8 @@ template<typename Derived> class DenseBase
 
       IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
 
-      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? SizeAtCompileTime
-                             : int(IsRowMajor) ? ColsAtCompileTime : RowsAtCompileTime,
+      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
+                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
 
       CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
         /**< This is a rough measure of how expensive it is to read one coefficient from
index dd0673609c5f25af83f89c8018973474ecedd8d2..2bf80b3af3d40ff2c4ccf4b70ac5a38232cf7e98 100644 (file)
@@ -102,7 +102,7 @@ struct traits<Map<PlainObjectType, MapOptions, StrideType> >
                            || HasNoOuterStride
                            || ( OuterStrideAtCompileTime!=Dynamic
                            && ((static_cast<int>(sizeof(Scalar))*OuterStrideAtCompileTime)%16)==0 ) ),
-    Flags0 = TraitsBase::Flags,
+    Flags0 = TraitsBase::Flags & (~NestByRefBit),
     Flags1 = IsAligned ? (int(Flags0) | AlignedBit) : (int(Flags0) & ~AlignedBit),
     Flags2 = (bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime))
            ? int(Flags1) : int(Flags1 & ~LinearAccessBit),
@@ -120,7 +120,6 @@ template<typename PlainObjectType, int MapOptions, typename StrideType> class Ma
   public:
 
     typedef MapBase<Map> Base;
-
     EIGEN_DENSE_PUBLIC_INTERFACE(Map)
 
     typedef typename Base::PointerType PointerType;
@@ -181,7 +180,6 @@ template<typename PlainObjectType, int MapOptions, typename StrideType> class Ma
       PlainObjectType::Base::_check_template_params();
     }
 
-
     EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
 
   protected:
index c23bcbfdccae9f7dc2889bfd174dbbf011cac704..9426e2d24dda9804c9df6c00d0027d4f8772ab7c 100644 (file)
@@ -170,8 +170,8 @@ template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
       EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(internal::traits<Derived>::Flags&PacketAccessBit,
                                         internal::inner_stride_at_compile_time<Derived>::ret==1),
                           PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);
-      eigen_assert(EIGEN_IMPLIES(internal::traits<Derived>::Flags&AlignedBit, (size_t(m_data) % (sizeof(Scalar)*internal::packet_traits<Scalar>::size)) == 0)
-        && "data is not aligned");
+      eigen_assert(EIGEN_IMPLIES(internal::traits<Derived>::Flags&AlignedBit, (size_t(m_data) % 16) == 0)
+                   && "data is not aligned");
     }
 
     PointerType m_data;
index 44de22cb4d54e6b4858f0d93df2f63e732b09be7..982c9256af007874ceb292c2d8bbc4122129c0a2 100644 (file)
@@ -153,10 +153,6 @@ class Matrix
 
     typedef typename Base::PlainObject PlainObject;
 
-    enum { NeedsToAlign = (!(Options&DontAlign))
-                          && SizeAtCompileTime!=Dynamic && ((static_cast<int>(sizeof(Scalar))*SizeAtCompileTime)%16)==0 };
-    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
-
     using Base::base;
     using Base::coeffRef;
 
index db156f6e9d05283691ed2b26bfa51648a2d14a34..62877bce09ef2990f1589a87e196e423b83e7c8b 100644 (file)
@@ -250,7 +250,8 @@ template<typename Derived> class MatrixBase
     
     // huuuge hack. make Eigen2's matrix.part<Diagonal>() work in eigen3. Problem: Diagonal is now a class template instead
     // of an integer constant. Solution: overload the part() method template wrt template parameters list.
-    template<template<typename T, int n> class U>
+    // Note: replacing next line by "template<template<typename T, int n> class U>" produces a mysterious error C2082 in MSVC.
+    template<template<typename, int> class U>
     const DiagonalWrapper<ConstDiagonalReturnType> part() const
     { return diagonal().asDiagonal(); }
     #endif // EIGEN2_SUPPORT
index c70db92479aad7b9acfb0968d0877e636977cebd..612254e9da92a239bbd8a78aeb5caa43a02abd3c 100644 (file)
 
 namespace internal {
 
+template<typename Index>
+EIGEN_ALWAYS_INLINE void check_rows_cols_for_overflow(Index rows, Index cols)
+{
+  // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242
+  // we assume Index is signed
+  Index max_index = (size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed
+  bool error = (rows < 0  || cols < 0)  ? true
+             : (rows == 0 || cols == 0) ? false
+                                        : (rows > max_index / cols);
+  if (error)
+    throw_std_bad_alloc();
+}
+
 template <typename Derived, typename OtherDerived = Derived, bool IsVector = static_cast<bool>(Derived::IsVectorAtCompileTime)> struct conservative_resize_like_impl;
 
 template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;
@@ -84,14 +97,12 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
     template<typename StrideType> struct StridedConstMapType { typedef Eigen::Map<const Derived, Unaligned, StrideType> type; };
     template<typename StrideType> struct StridedAlignedMapType { typedef Eigen::Map<Derived, Aligned, StrideType> type; };
     template<typename StrideType> struct StridedConstAlignedMapType { typedef Eigen::Map<const Derived, Aligned, StrideType> type; };
-    
 
   protected:
     DenseStorage<Scalar, Base::MaxSizeAtCompileTime, Base::RowsAtCompileTime, Base::ColsAtCompileTime, Options> m_storage;
 
   public:
-    enum { NeedsToAlign = (!(Options&DontAlign))
-                          && SizeAtCompileTime!=Dynamic && ((static_cast<int>(sizeof(Scalar))*SizeAtCompileTime)%16)==0 };
+    enum { NeedsToAlign = SizeAtCompileTime != Dynamic && (internal::traits<Derived>::Flags & AlignedBit) != 0 };
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
 
     Base& base() { return *static_cast<Base*>(this); }
@@ -200,11 +211,13 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
     EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
     {
       #ifdef EIGEN_INITIALIZE_MATRICES_BY_ZERO
+        internal::check_rows_cols_for_overflow(rows, cols);
         Index size = rows*cols;
         bool size_changed = size != this->size();
         m_storage.resize(size, rows, cols);
         if(size_changed) EIGEN_INITIALIZE_BY_ZERO_IF_THAT_OPTION_IS_ENABLED
       #else
+        internal::check_rows_cols_for_overflow(rows, cols);
         m_storage.resize(rows*cols, rows, cols);
       #endif
     }
@@ -273,6 +286,7 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
     EIGEN_STRONG_INLINE void resizeLike(const EigenBase<OtherDerived>& _other)
     {
       const OtherDerived& other = _other.derived();
+      internal::check_rows_cols_for_overflow(other.rows(), other.cols());
       const Index othersize = other.rows()*other.cols();
       if(RowsAtCompileTime == 1)
       {
@@ -417,6 +431,7 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
       : m_storage(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())
     {
       _check_template_params();
+      internal::check_rows_cols_for_overflow(other.derived().rows(), other.derived().cols());
       Base::operator=(other.derived());
     }
 
@@ -581,6 +596,7 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
     {
       eigen_assert(rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
              && cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols));
+      internal::check_rows_cols_for_overflow(rows, cols);      
       m_storage.resize(rows*cols,rows,cols);
       EIGEN_INITIALIZE_BY_ZERO_IF_THAT_OPTION_IS_ENABLED
     }
@@ -638,6 +654,7 @@ struct internal::conservative_resize_like_impl
     if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows
          (!Derived::IsRowMajor && _this.rows() == rows) )  // column-major and we change only the number of columns
     {
+      internal::check_rows_cols_for_overflow(rows, cols);
       _this.derived().m_storage.conservativeResize(rows*cols,rows,cols);
     }
     else
index 3bd3487d6a2c81ace2a7f795adb77d7cb521eebe..91975880fdcd09abe7ab94536d8e645a7e4c6687 100644 (file)
@@ -152,7 +152,8 @@ class ProductBase : public MatrixBase<Derived>
 #else
       EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
       eigen_assert(this->rows() == 1 && this->cols() == 1);
-      return derived().coeff(row,col);
+      Matrix<Scalar,1,1> result = *this;
+      return result.coeff(row,col);
 #endif
     }
 
@@ -160,7 +161,8 @@ class ProductBase : public MatrixBase<Derived>
     {
       EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
       eigen_assert(this->rows() == 1 && this->cols() == 1);
-      return derived().coeff(i);
+      Matrix<Scalar,1,1> result = *this;
+      return result.coeff(i);
     }
 
     const Scalar& coeffRef(Index row, Index col) const
@@ -256,16 +258,16 @@ class ScaledProduct
     : Base(prod.lhs(),prod.rhs()), m_prod(prod), m_alpha(x) {}
 
     template<typename Dest>
-    inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst,m_alpha); }
+    inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst, Scalar(1)); }
 
     template<typename Dest>
-    inline void addTo(Dest& dst) const { scaleAndAddTo(dst,m_alpha); }
+    inline void addTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(1)); }
 
     template<typename Dest>
-    inline void subTo(Dest& dst) const { scaleAndAddTo(dst,-m_alpha); }
+    inline void subTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(-1)); }
 
     template<typename Dest>
-    inline void scaleAndAddTo(Dest& dst,Scalar alpha) const { m_prod.derived().scaleAndAddTo(dst,alpha); }
+    inline void scaleAndAddTo(Dest& dst,Scalar alpha) const { m_prod.derived().scaleAndAddTo(dst,alpha * m_alpha); }
 
     const Scalar& alpha() const { return m_alpha; }
     
index d2f9712db0f49ab196050b934be8c23932ae529d..4c171f8d580a88b94876e56d83121798d282a220 100644 (file)
@@ -48,7 +48,10 @@ struct traits<Replicate<MatrixType,RowFactor,ColFactor> >
   typedef typename MatrixType::Scalar Scalar;
   typedef typename traits<MatrixType>::StorageKind StorageKind;
   typedef typename traits<MatrixType>::XprKind XprKind;
-  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  enum {
+    Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor
+  };
+  typedef typename nested<MatrixType,Factor>::type MatrixTypeNested;
   typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
   enum {
     RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic
@@ -72,6 +75,8 @@ struct traits<Replicate<MatrixType,RowFactor,ColFactor> >
 template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
   : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type
 {
+    typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;
+    typedef typename internal::traits<Replicate>::_MatrixTypeNested _MatrixTypeNested;
   public:
 
     typedef typename internal::dense_xpr_base<Replicate>::type Base;
@@ -124,7 +129,7 @@ template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
 
 
   protected:
-    const typename MatrixType::Nested m_matrix;
+    const MatrixTypeNested m_matrix;
     const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;
     const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;
 };
index 71e129c7f12d27a219041a558228cf4ea5f81aab..a23014a343f1d036e29e7b37b677879c28e0327e 100644 (file)
@@ -180,7 +180,7 @@ void TriangularView<MatrixType,Mode>::solveInPlace(const MatrixBase<OtherDerived
   eigen_assert(cols() == rows());
   eigen_assert( (Side==OnTheLeft && cols() == other.rows()) || (Side==OnTheRight && cols() == other.cols()) );
   eigen_assert(!(Mode & ZeroDiag));
-  eigen_assert(Mode & (Upper|Lower));
+  eigen_assert((Mode & (Upper|Lower)) != 0);
 
   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit  && OtherDerived::IsVectorAtCompileTime };
   typedef typename internal::conditional<copy,
index 8e55548c9469f5c7dde0cd0a08a3fac45947580d..212887184c25b4524eb298030ebed7c392b70240 100644 (file)
@@ -27,8 +27,8 @@
 
 namespace internal {
 
-static uint32x4_t p4ui_CONJ_XOR = { 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
-static uint32x2_t p2ui_CONJ_XOR = { 0x00000000, 0x80000000 };
+static uint32x4_t p4ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET4(0x00000000, 0x80000000, 0x00000000, 0x80000000);
+static uint32x2_t p2ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET2(0x00000000, 0x80000000);
 
 //---------- float ----------
 struct Packet2cf
index 478ef8038c0964a5916cbae6ef61808ff9d33b57..6c7cd1590976172a1cd3e3cd07968814ae205fd8 100644 (file)
@@ -52,6 +52,16 @@ typedef uint32x4_t  Packet4ui;
 #define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
   const Packet4i p4i_##NAME = pset1<Packet4i>(X)
 
+#if defined(__llvm__) && !defined(__clang__)
+  //Special treatment for Apple's llvm-gcc, its NEON packet types are unions
+  #define EIGEN_INIT_NEON_PACKET2(X, Y)       {{X, Y}}
+  #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {{X, Y, Z, W}}
+#else
+  //Default initializer for packets
+  #define EIGEN_INIT_NEON_PACKET2(X, Y)       {X, Y}
+  #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {X, Y, Z, W}
+#endif
+    
 #ifndef __pld
 #define __pld(x) asm volatile ( "   pld [%[addr]]\n" :: [addr] "r" (x) : "cc" );
 #endif
@@ -84,7 +94,7 @@ template<> struct packet_traits<int>    : default_packet_traits
   };
 };
 
-#if EIGEN_GNUC_AT_MOST(4,4)
+#if EIGEN_GNUC_AT_MOST(4,4) && !defined(__llvm__)
 // workaround gcc 4.2, 4.3 and 4.4 compilatin issue
 EIGEN_STRONG_INLINE float32x4_t vld1q_f32(const float* x) { return ::vld1q_f32((const float32_t*)x); }
 EIGEN_STRONG_INLINE float32x2_t vld1_f32 (const float* x) { return ::vld1_f32 ((const float32_t*)x); }
@@ -100,12 +110,12 @@ template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)   {
 
 template<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a)
 {
-  Packet4f countdown = { 0, 1, 2, 3 };
+  Packet4f countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);
   return vaddq_f32(pset1<Packet4f>(a), countdown);
 }
 template<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a)
 {
-  Packet4i countdown = { 0, 1, 2, 3 };
+  Packet4i countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);
   return vaddq_s32(pset1<Packet4i>(a), countdown);
 }
 
@@ -395,25 +405,29 @@ template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
   return s[0];
 }
 
-template<int Offset>
-struct palign_impl<Offset,Packet4f>
-{
-  EIGEN_STRONG_INLINE static void run(Packet4f& first, const Packet4f& second)
-  {
-    if (Offset!=0)
-      first = vextq_f32(first, second, Offset);
-  }
-};
-
-template<int Offset>
-struct palign_impl<Offset,Packet4i>
-{
-  EIGEN_STRONG_INLINE static void run(Packet4i& first, const Packet4i& second)
-  {
-    if (Offset!=0)
-      first = vextq_s32(first, second, Offset);
-  }
-};
+// this PALIGN_NEON business is to work around a bug in LLVM Clang 3.0 causing incorrect compilation errors,
+// see bug 347 and this LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=11074
+#define PALIGN_NEON(Offset,Type,Command) \
+template<>\
+struct palign_impl<Offset,Type>\
+{\
+    EIGEN_STRONG_INLINE static void run(Type& first, const Type& second)\
+    {\
+        if (Offset!=0)\
+            first = Command(first, second, Offset);\
+    }\
+};\
+
+PALIGN_NEON(0,Packet4f,vextq_f32)
+PALIGN_NEON(1,Packet4f,vextq_f32)
+PALIGN_NEON(2,Packet4f,vextq_f32)
+PALIGN_NEON(3,Packet4f,vextq_f32)
+PALIGN_NEON(0,Packet4i,vextq_s32)
+PALIGN_NEON(1,Packet4i,vextq_s32)
+PALIGN_NEON(2,Packet4i,vextq_s32)
+PALIGN_NEON(3,Packet4i,vextq_s32)
+    
+#undef PALIGN_NEON
 
 } // end namespace internal
 
index 6f3f271700749959694221f0b3fb8a136b8bfd31..cd1c37c780e72f05ef5a785a52b4a7df00b4f842 100644 (file)
@@ -30,19 +30,16 @@ namespace internal {
 template<typename _LhsScalar, typename _RhsScalar, bool _ConjLhs=false, bool _ConjRhs=false>
 class gebp_traits;
 
+inline std::ptrdiff_t manage_caching_sizes_second_if_negative(std::ptrdiff_t a, std::ptrdiff_t b)
+{
+  return a<=0 ? b : a;
+}
+
 /** \internal */
 inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1=0, std::ptrdiff_t* l2=0)
 {
-  static std::ptrdiff_t m_l1CacheSize = 0;
-  static std::ptrdiff_t m_l2CacheSize = 0;
-  if(m_l1CacheSize==0)
-  {
-    m_l1CacheSize = queryL1CacheSize();
-    m_l2CacheSize = queryTopLevelCacheSize();
-
-    if(m_l1CacheSize<=0) m_l1CacheSize = 8 * 1024;
-    if(m_l2CacheSize<=0) m_l2CacheSize = 1 * 1024 * 1024;
-  }
+  static std::ptrdiff_t m_l1CacheSize = manage_caching_sizes_second_if_negative(queryL1CacheSize(),8 * 1024);
+  static std::ptrdiff_t m_l2CacheSize = manage_caching_sizes_second_if_negative(queryTopLevelCacheSize(),1*1024*1024);
 
   if(action==SetAction)
   {
@@ -118,14 +115,14 @@ inline void computeProductBlockingSizes(std::ptrdiff_t& k, std::ptrdiff_t& m, st
   // FIXME (a bit overkill maybe ?)
 
   template<typename CJ, typename A, typename B, typename C, typename T> struct gebp_madd_selector {
-    EIGEN_STRONG_INLINE EIGEN_ALWAYS_INLINE_ATTRIB static void run(const CJ& cj, A& a, B& b, C& c, T& /*t*/)
+    EIGEN_ALWAYS_INLINE static void run(const CJ& cj, A& a, B& b, C& c, T& /*t*/)
     {
       c = cj.pmadd(a,b,c);
     }
   };
 
   template<typename CJ, typename T> struct gebp_madd_selector<CJ,T,T,T,T> {
-    EIGEN_STRONG_INLINE EIGEN_ALWAYS_INLINE_ATTRIB static void run(const CJ& cj, T& a, T& b, T& c, T& t)
+    EIGEN_ALWAYS_INLINE static void run(const CJ& cj, T& a, T& b, T& c, T& t)
     {
       t = b; t = cj.pmul(a,t); c = padd(c,t);
     }
index 6c3f1e421f0f8a6de1e5cd387ad0464475c4ada3..b7c2b79af921dd44ec9f4e8ae2986518d4f3aa2e 100644 (file)
@@ -1,3 +1,4 @@
+
 // This file is part of Eigen, a lightweight C++ template library
 // for linear algebra.
 //
@@ -28,7 +29,7 @@
 
 #define EIGEN_WORLD_VERSION 3
 #define EIGEN_MAJOR_VERSION 0
-#define EIGEN_MINOR_VERSION 2
+#define EIGEN_MINOR_VERSION 5
 
 #define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \
                                       (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \
@@ -45,7 +46,7 @@
   #define EIGEN_GNUC_AT_MOST(x,y) 0
 #endif
 
-#if EIGEN_GNUC_AT_MOST(4,3)
+#if EIGEN_GNUC_AT_MOST(4,3) && !defined(__clang__)
   // see bug 89
   #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 0
 #else
 #define EIGEN_MAKESTRING2(a) #a
 #define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a)
 
-// EIGEN_ALWAYS_INLINE_ATTRIB should be use in the declaration of function
-// which should be inlined even in debug mode.
-// FIXME with the always_inline attribute,
-// gcc 3.4.x reports the following compilation error:
-//   Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval<Derived> Eigen::MatrixBase<Scalar, Derived>::eval() const'
-//    : function body not available
-#if EIGEN_GNUC_AT_LEAST(4,0)
-#define EIGEN_ALWAYS_INLINE_ATTRIB __attribute__((always_inline))
-#else
-#define EIGEN_ALWAYS_INLINE_ATTRIB
-#endif
-
 #if EIGEN_GNUC_AT_LEAST(4,1) && !defined(__clang__) && !defined(__INTEL_COMPILER)
 #define EIGEN_FLATTEN_ATTRIB __attribute__((flatten))
 #else
 #define EIGEN_FLATTEN_ATTRIB
 #endif
 
-// EIGEN_FORCE_INLINE means "inline as much as possible"
+// EIGEN_STRONG_INLINE is a stronger version of the inline, using __forceinline on MSVC,
+// but it still doesn't use GCC's always_inline. This is useful in (common) situations where MSVC needs forceinline
+// but GCC is still doing fine with just inline.
 #if (defined _MSC_VER) || (defined __INTEL_COMPILER)
 #define EIGEN_STRONG_INLINE __forceinline
 #else
 #define EIGEN_STRONG_INLINE inline
 #endif
 
+// EIGEN_ALWAYS_INLINE is the stronget, it has the effect of making the function inline and adding every possible
+// attribute to maximize inlining. This should only be used when really necessary: in particular,
+// it uses __attribute__((always_inline)) on GCC, which most of the time is useless and can severely harm compile times.
+// FIXME with the always_inline attribute,
+// gcc 3.4.x reports the following compilation error:
+//   Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval<Derived> Eigen::MatrixBase<Scalar, Derived>::eval() const'
+//    : function body not available
+#if EIGEN_GNUC_AT_LEAST(4,0)
+#define EIGEN_ALWAYS_INLINE __attribute__((always_inline)) inline
+#else
+#define EIGEN_ALWAYS_INLINE EIGEN_STRONG_INLINE
+#endif
+
 #if (defined __GNUC__)
 #define EIGEN_DONT_INLINE __attribute__((noinline))
 #elif (defined _MSC_VER)
 #define EIGEN_UNUSED_VARIABLE(var) (void)var;
 
 #if (defined __GNUC__)
-#define EIGEN_ASM_COMMENT(X)  asm("#"X)
+#define EIGEN_ASM_COMMENT(X)  asm("#" X)
 #else
 #define EIGEN_ASM_COMMENT(X)
 #endif
index a580b95ad0dc0161ac002319e6864f9562e9d588..023716dc9e09cabd228a5be292200fec7931302d 100644 (file)
 
 namespace internal {
 
+inline void throw_std_bad_alloc()
+{
+  #ifdef EIGEN_EXCEPTIONS
+    throw std::bad_alloc();
+  #else
+    std::size_t huge = -1;
+    new int[huge];
+  #endif
+}
+
 /*****************************************************************************
 *** Implementation of handmade aligned functions                           ***
 *****************************************************************************/
@@ -192,7 +202,7 @@ inline void check_that_malloc_is_allowed()
 #endif
 
 /** \internal Allocates \a size bytes. The returned pointer is guaranteed to have 16 bytes alignment.
-  * On allocation error, the returned pointer is null, and if exceptions are enabled then a std::bad_alloc is thrown.
+  * On allocation error, the returned pointer is null, and std::bad_alloc is thrown.
   */
 inline void* aligned_malloc(size_t size)
 {
@@ -213,10 +223,9 @@ inline void* aligned_malloc(size_t size)
     result = handmade_aligned_malloc(size);
   #endif
 
-  #ifdef EIGEN_EXCEPTIONS
-    if(result == 0)
-      throw std::bad_alloc();
-  #endif
+  if(!result && size)
+    throw_std_bad_alloc();
+
   return result;
 }
 
@@ -241,7 +250,7 @@ inline void aligned_free(void *ptr)
 /**
 * \internal
 * \brief Reallocates an aligned block of memory.
-* \throws std::bad_alloc if EIGEN_EXCEPTIONS are defined.
+* \throws std::bad_alloc on allocation failure
 **/
 inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
 {
@@ -269,10 +278,9 @@ inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
   result = handmade_aligned_realloc(ptr,new_size,old_size);
 #endif
 
-#ifdef EIGEN_EXCEPTIONS
-  if (result==0 && new_size!=0)
-    throw std::bad_alloc();
-#endif
+  if (!result && new_size)
+    throw_std_bad_alloc();
+
   return result;
 }
 
@@ -281,7 +289,7 @@ inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
 *****************************************************************************/
 
 /** \internal Allocates \a size bytes. If Align is true, then the returned ptr is 16-byte-aligned.
-  * On allocation error, the returned pointer is null, and if exceptions are enabled then a std::bad_alloc is thrown.
+  * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.
   */
 template<bool Align> inline void* conditional_aligned_malloc(size_t size)
 {
@@ -293,9 +301,8 @@ template<> inline void* conditional_aligned_malloc<false>(size_t size)
   check_that_malloc_is_allowed();
 
   void *result = std::malloc(size);
-  #ifdef EIGEN_EXCEPTIONS
-    if(!result) throw std::bad_alloc();
-  #endif
+  if(!result && size)
+    throw_std_bad_alloc();
   return result;
 }
 
@@ -347,18 +354,27 @@ template<typename T> inline void destruct_elements_of_array(T *ptr, size_t size)
 *** Implementation of aligned new/delete-like functions                    ***
 *****************************************************************************/
 
+template<typename T>
+EIGEN_ALWAYS_INLINE void check_size_for_overflow(size_t size)
+{
+  if(size > size_t(-1) / sizeof(T))
+    throw_std_bad_alloc();
+}
+
 /** \internal Allocates \a size objects of type T. The returned pointer is guaranteed to have 16 bytes alignment.
-  * On allocation error, the returned pointer is undefined, but if exceptions are enabled then a std::bad_alloc is thrown.
+  * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.
   * The default constructor of T is called.
   */
 template<typename T> inline T* aligned_new(size_t size)
 {
+  check_size_for_overflow<T>(size);
   T *result = reinterpret_cast<T*>(aligned_malloc(sizeof(T)*size));
   return construct_elements_of_array(result, size);
 }
 
 template<typename T, bool Align> inline T* conditional_aligned_new(size_t size)
 {
+  check_size_for_overflow<T>(size);
   T *result = reinterpret_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));
   return construct_elements_of_array(result, size);
 }
@@ -383,6 +399,8 @@ template<typename T, bool Align> inline void conditional_aligned_delete(T *ptr,
 
 template<typename T, bool Align> inline T* conditional_aligned_realloc_new(T* pts, size_t new_size, size_t old_size)
 {
+  check_size_for_overflow<T>(new_size);
+  check_size_for_overflow<T>(old_size);
   if(new_size < old_size)
     destruct_elements_of_array(pts+new_size, old_size-new_size);
   T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));
@@ -394,6 +412,7 @@ template<typename T, bool Align> inline T* conditional_aligned_realloc_new(T* pt
 
 template<typename T, bool Align> inline T* conditional_aligned_new_auto(size_t size)
 {
+  check_size_for_overflow<T>(size);
   T *result = reinterpret_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));
   if(NumTraits<T>::RequireInitialization)
     construct_elements_of_array(result, size);
@@ -402,6 +421,8 @@ template<typename T, bool Align> inline T* conditional_aligned_new_auto(size_t s
 
 template<typename T, bool Align> inline T* conditional_aligned_realloc_new_auto(T* pts, size_t new_size, size_t old_size)
 {
+  check_size_for_overflow<T>(new_size);
+  check_size_for_overflow<T>(old_size);
   if(NumTraits<T>::RequireInitialization && (new_size < old_size))
     destruct_elements_of_array(pts+new_size, old_size-new_size);
   T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));
@@ -536,6 +557,7 @@ template<typename T> class aligned_stack_memory_handler
   #endif
 
   #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
+    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
     TYPE* NAME = (BUFFER)!=0 ? (BUFFER) \
                : reinterpret_cast<TYPE*>( \
                       (sizeof(TYPE)*SIZE<=EIGEN_STACK_ALLOCATION_LIMIT) ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE)*SIZE) \
@@ -545,6 +567,7 @@ template<typename T> class aligned_stack_memory_handler
 #else
 
   #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
+    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
     TYPE* NAME = (BUFFER)!=0 ? BUFFER : reinterpret_cast<TYPE*>(Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE));    \
     Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,true)
     
@@ -669,6 +692,7 @@ public:
     pointer allocate( size_type num, const void* hint = 0 )
     {
         EIGEN_UNUSED_VARIABLE(hint);
+        internal::check_size_for_overflow<T>(num);
         return static_cast<pointer>( internal::aligned_malloc( num * sizeof(T) ) );
     }
 
index 9047c5f835054c9237977051a0979bbbde9bebc3..c2078f137860216fb5b8a7fce33a5c0d0c8050cf 100644 (file)
@@ -125,10 +125,9 @@ class compute_matrix_flags
       aligned_bit =
       (
             ((Options&DontAlign)==0)
-        &&  packet_traits<Scalar>::Vectorizable
         && (
 #if EIGEN_ALIGN_STATICALLY
-             ((!is_dynamic_size_storage) && (((MaxCols*MaxRows) % packet_traits<Scalar>::size) == 0))
+             ((!is_dynamic_size_storage) && (((MaxCols*MaxRows*int(sizeof(Scalar))) % 16) == 0))
 #else
              0
 #endif
index ac4c4242dd409b50df3e9b54bbea0c447a45000c..f57353c065fdca512bbb9ed8b3bf200466baf743 100644 (file)
@@ -291,7 +291,7 @@ template<typename _MatrixType> class EigenSolver
 
     ComputationInfo info() const
     {
-      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
       return m_realSchur.info();
     }
 
@@ -339,7 +339,7 @@ typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eige
   EigenvectorsType matV(n,n);
   for (Index j=0; j<n; ++j)
   {
-    if (internal::isMuchSmallerThan(internal::imag(m_eivalues.coeff(j)), internal::real(m_eivalues.coeff(j))))
+    if (internal::isMuchSmallerThan(internal::imag(m_eivalues.coeff(j)), internal::real(m_eivalues.coeff(j))) || j+1==n)
     {
       // we have a real eigen value
       matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();
@@ -570,10 +570,13 @@ void EigenSolver<MatrixType>::doComputeEigenvectors()
 
         }
       }
+      
+      // We handled a pair of complex conjugate eigenvalues, so need to skip them both
+      n--;
     }
     else
     {
-      eigen_assert("Internal bug in EigenSolver"); // this should not happen
+      eigen_assert(0 && "Internal bug in EigenSolver"); // this should not happen
     }
   }
 
index 965dda88bda88ec6685523e9b4eec3a04e8974a2..ad107c632826c188370ae3479ef7181faa16c925 100644 (file)
@@ -307,7 +307,8 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
 
     /** \brief Maximum number of iterations.
       *
-      * Maximum number of iterations allowed for an eigenvalue to converge.
+      * The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n
+      * denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).
       */
     static const int m_maxIterations = 30;
 
@@ -407,7 +408,7 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
   
   Index end = n-1;
   Index start = 0;
-  Index iter = 0; // number of iterations we are working on one element
+  Index iter = 0; // total number of iterations
 
   while (end>0)
   {
@@ -418,15 +419,14 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
     // find the largest unreduced block
     while (end>0 && m_subdiag[end-1]==0)
     {
-      iter = 0;
       end--;
     }
     if (end<=0)
       break;
 
-    // if we spent too many iterations on the current element, we give up
+    // if we spent too many iterations, we give up
     iter++;
-    if(iter > m_maxIterations) break;
+    if(iter > m_maxIterations * n) break;
 
     start = end - 1;
     while (start>0 && m_subdiag[start-1]!=0)
@@ -435,7 +435,7 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
     internal::tridiagonal_qr_step<MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor>(diag.data(), m_subdiag.data(), start, end, computeEigenvectors ? m_eivec.data() : (Scalar*)0, n);
   }
 
-  if (iter <= m_maxIterations)
+  if (iter <= m_maxIterations * n)
     m_info = Success;
   else
     m_info = NoConvergence;
index eb0a5877168fa80b57a19c85fb3def2a7834d913..d85d3e553f8c0af7d6d78a7e2306d6f1bc2d6aa4 100644 (file)
@@ -225,7 +225,7 @@ public:
       normal() = mat * normal();
     else
     {
-      eigen_assert("invalid traits value in Hyperplane::transform()");
+      eigen_assert(0 && "invalid traits value in Hyperplane::transform()");
     }
     return *this;
   }
index 2662d60fed1728bb4d4f583312e8e875abab88cd..9180db67d84252a81f1030cc58ab06c19c800e99 100644 (file)
@@ -182,10 +182,9 @@ public:
   template<typename NewScalarType>
   inline typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type cast() const
   {
-    return typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type(
-      coeffs().template cast<NewScalarType>());
+    return typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type(derived());
   }
-  
+
 #ifdef EIGEN_QUATERNIONBASE_PLUGIN
 # include EIGEN_QUATERNIONBASE_PLUGIN
 #endif
@@ -225,22 +224,25 @@ struct traits<Quaternion<_Scalar,_Options> >
   typedef _Scalar Scalar;
   typedef Matrix<_Scalar,4,1,_Options> Coefficients;
   enum{
-    IsAligned = bool(EIGEN_ALIGN) && ((int(_Options)&Aligned)==Aligned),
+    IsAligned = internal::traits<Coefficients>::Flags & AlignedBit,
     Flags = IsAligned ? (AlignedBit | LvalueBit) : LvalueBit
   };
 };
 }
 
 template<typename _Scalar, int _Options>
-class Quaternion : public QuaternionBase<Quaternion<_Scalar,_Options> >{
+class Quaternion : public QuaternionBase<Quaternion<_Scalar,_Options> >
+{
   typedef QuaternionBase<Quaternion<_Scalar,_Options> > Base;
+  enum { IsAligned = internal::traits<Quaternion>::IsAligned };
+
 public:
   typedef _Scalar Scalar;
 
   EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Quaternion)
   using Base::operator*=;
 
-  typedef typename internal::traits<Quaternion<Scalar,_Options> >::Coefficients Coefficients;
+  typedef typename internal::traits<Quaternion>::Coefficients Coefficients;
   typedef typename Base::AngleAxisType AngleAxisType;
 
   /** Default constructor leaving the quaternion uninitialized. */
@@ -271,9 +273,16 @@ public:
   template<typename Derived>
   explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
 
+  /** Explicit copy constructor with scalar conversion */
+  template<typename OtherScalar, int OtherOptions>
+  explicit inline Quaternion(const Quaternion<OtherScalar, OtherOptions>& other)
+  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+
   inline Coefficients& coeffs() { return m_coeffs;}
   inline const Coefficients& coeffs() const { return m_coeffs;}
 
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(IsAligned)
+
 protected:
   Coefficients m_coeffs;
   
@@ -673,7 +682,7 @@ QuaternionBase<Derived>::slerp(Scalar t, const QuaternionBase<OtherDerived>& oth
   Scalar scale0;
   Scalar scale1;
 
-  if (absD>=one)
+  if(absD>=one)
   {
     scale0 = Scalar(1) - t;
     scale1 = t;
@@ -686,9 +695,8 @@ QuaternionBase<Derived>::slerp(Scalar t, const QuaternionBase<OtherDerived>& oth
 
     scale0 = internal::sin( ( Scalar(1) - t ) * theta) / sinTheta;
     scale1 = internal::sin( ( t * theta) ) / sinTheta;
-    if (d<0)
-      scale1 = -scale1;
   }
+  if(d<0) scale1 = -scale1;
 
   return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
 }
index e1214bd3ebbde2ca87b6347c2c6fd967fea5148e..cf36da1c50cbffc35ad9fe1bfc532578788b0330 100644 (file)
@@ -89,7 +89,7 @@ public:
 
   /** Concatenates two rotations */
   inline Rotation2D& operator*=(const Rotation2D& other)
-  { return m_angle += other.m_angle; return *this; }
+  { m_angle += other.m_angle; return *this; }
 
   /** Applies the rotation to a 2D vector */
   Vector2 operator* (const Vector2& vec) const
index 19d012572d48c8ca835988152789347c29fa740b..a694673ebedacbbec9028868ca2ef491afb672d2 100644 (file)
@@ -61,7 +61,7 @@ template< typename Lhs,
           typename Rhs,
           bool AnyProjective = 
             transform_traits<Lhs>::IsProjective ||
-            transform_traits<Lhs>::IsProjective>
+            transform_traits<Rhs>::IsProjective>
 struct transform_transform_product_impl;
 
 template< typename Other,
@@ -1391,6 +1391,35 @@ struct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>
   }
 };
 
+template<typename Scalar, int Dim, int LhsOptions, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar,Dim,AffineCompact,LhsOptions>,Transform<Scalar,Dim,Projective,RhsOptions>,true >
+{
+  typedef Transform<Scalar,Dim,AffineCompact,LhsOptions> Lhs;
+  typedef Transform<Scalar,Dim,Projective,RhsOptions> Rhs;
+  typedef Transform<Scalar,Dim,Projective> ResultType;
+  static ResultType run(const Lhs& lhs, const Rhs& rhs)
+  {
+    ResultType res;
+    res.matrix().template topRows<Dim>() = lhs.matrix() * rhs.matrix();
+    res.matrix().row(Dim) = rhs.matrix().row(Dim);
+    return res;
+  }
+};
+
+template<typename Scalar, int Dim, int LhsOptions, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar,Dim,Projective,LhsOptions>,Transform<Scalar,Dim,AffineCompact,RhsOptions>,true >
+{
+  typedef Transform<Scalar,Dim,Projective,LhsOptions> Lhs;
+  typedef Transform<Scalar,Dim,AffineCompact,RhsOptions> Rhs;
+  typedef Transform<Scalar,Dim,Projective> ResultType;
+  static ResultType run(const Lhs& lhs, const Rhs& rhs)
+  {
+    ResultType res(lhs.matrix().template leftCols<Dim>() * rhs.matrix());
+    res.matrix().col(Dim) += lhs.matrix().col(Dim);
+    return res;
+  }
+};
+
 } // end namespace internal
 
 #endif // EIGEN_TRANSFORM_H
index cbe695c7259dc31d288fa8370a8dfbee584314bd..2af32678d1cea93346f19591860b3a9ff3c8577e 100644 (file)
@@ -96,7 +96,7 @@ struct quat_product<Architecture::SSE, Derived, OtherDerived, double, Aligned>
    */
   t1 = padd(pmul(a_ww, b_xy), pmul(a_yy, b_zw));
   t2 = psub(pmul(a_zz, b_xy), pmul(a_xx, b_zw));
-#ifdef __SSE3__
+#ifdef EIGEN_VECTORIZE_SSE3
   EIGEN_UNUSED_VARIABLE(mask)
   pstore(&res.x(), _mm_addsub_pd(t1, preverse(t2)));
 #else
@@ -110,7 +110,7 @@ struct quat_product<Architecture::SSE, Derived, OtherDerived, double, Aligned>
    */
   t1 = psub(pmul(a_ww, b_zw), pmul(a_yy, b_xy));
   t2 = padd(pmul(a_zz, b_zw), pmul(a_xx, b_xy));
-#ifdef __SSE3__
+#ifdef EIGEN_VECTORIZE_SSE3
   EIGEN_UNUSED_VARIABLE(mask)
   pstore(&res.z(), preverse(_mm_addsub_pd(preverse(t1), t2)));
 #else
index 633fb23fdbe65251b04865ae43e1089519316fd2..46ae7d651c86fcd0a30c75c066f2767efab0076c 100644 (file)
@@ -443,7 +443,6 @@ FullPivLU<MatrixType>& FullPivLU<MatrixType>::compute(const MatrixType& matrix)
 
   m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
   m_maxpivot = RealScalar(0);
-  RealScalar cutoff(0);
 
   for(Index k = 0; k < size; ++k)
   {
@@ -458,14 +457,7 @@ FullPivLU<MatrixType>& FullPivLU<MatrixType>::compute(const MatrixType& matrix)
     row_of_biggest_in_corner += k; // correct the values! since they were computed in the corner,
     col_of_biggest_in_corner += k; // need to add k to them.
 
-    // when k==0, biggest_in_corner is the biggest coeff absolute value in the original matrix
-    if(k == 0) cutoff = biggest_in_corner * NumTraits<Scalar>::epsilon();
-
-    // if the pivot (hence the corner) is "zero", terminate to avoid generating nan/inf values.
-    // Notice that using an exact comparison (biggest_in_corner==0) here, as Golub-van Loan do in
-    // their pseudo-code, results in numerical instability! The cutoff here has been validated
-    // by running the unit test 'lu' with many repetitions.
-    if(biggest_in_corner < cutoff)
+    if(biggest_in_corner==RealScalar(0))
     {
       // before exiting, make sure to initialize the still uninitialized transpositions
       // in a sane state without destroying what we already have.
index 176c349ce441c3b42bb864205d68abed8b1b44fa..4c6153f0aff30c64a3fb6043f186e8cc75c4f02c 100644 (file)
@@ -55,7 +55,7 @@ struct compute_inverse_size4<Architecture::SSE, float, MatrixType, ResultType>
   
   static void run(const MatrixType& matrix, ResultType& result)
   {
-    EIGEN_ALIGN16 const  int _Sign_PNNP[4] = { 0x00000000, 0x80000000, 0x80000000, 0x00000000 };
+    EIGEN_ALIGN16 const unsigned int _Sign_PNNP[4] = { 0x00000000, 0x80000000, 0x80000000, 0x00000000 };
 
     // Load the full matrix into registers
     __m128 _L1 = matrix.template packet<MatrixAlignment>( 0);
index 5f61399988c611274a0ee08c00e51a7757758270..3c423095c31a3ea80f6b2e7f5039bf65f05333ac 100644 (file)
@@ -590,6 +590,9 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
   // only worsening the precision of U and V as we accumulate more rotations
   const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();
 
+  // limit for very small denormal numbers to be considered zero in order to avoid infinite loops (see bug 286)
+  const RealScalar considerAsZero = RealScalar(2) * std::numeric_limits<RealScalar>::denorm_min();
+
   /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */
 
   if(!internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreColsThanRows>::run(*this, matrix)
@@ -617,10 +620,11 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
       {
         // if this 2x2 sub-matrix is not diagonal already...
         // notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't
-        // keep us iterating forever.
+        // keep us iterating forever. Similarly, small denormal numbers are considered zero.
         using std::max;
-        if((max)(internal::abs(m_workMatrix.coeff(p,q)),internal::abs(m_workMatrix.coeff(q,p)))
-            > (max)(internal::abs(m_workMatrix.coeff(p,p)),internal::abs(m_workMatrix.coeff(q,q)))*precision)
+        RealScalar threshold = (max)(considerAsZero, precision * (max)(internal::abs(m_workMatrix.coeff(p,p)),
+                                                                       internal::abs(m_workMatrix.coeff(q,q))));
+        if((max)(internal::abs(m_workMatrix.coeff(p,q)),internal::abs(m_workMatrix.coeff(q,p))) > threshold)
         {
           finished = false;
 
@@ -704,6 +708,13 @@ struct solve_retval<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>
 };
 } // end namespace internal
 
+/** \svd_module
+  *
+  * \return the singular value decomposition of \c *this computed by two-sided
+  * Jacobi transformations.
+  *
+  * \sa class JacobiSVD
+  */
 template<typename Derived>
 JacobiSVD<typename MatrixBase<Derived>::PlainObject>
 MatrixBase<Derived>::jacobiSvd(unsigned int computationOptions) const
index 73468e0446cf296d4b89d6c6c003ec5b321be661..62bb8bb44c991b9a2775f7d28629093063323e16 100644 (file)
@@ -171,7 +171,7 @@ void SparseTriangularView<ExpressionType,Mode>::solveInPlace(MatrixBase<OtherDer
   eigen_assert(m_matrix.cols() == m_matrix.rows());
   eigen_assert(m_matrix.cols() == other.rows());
   eigen_assert(!(Mode & ZeroDiag));
-  eigen_assert(Mode & (Upper|Lower));
+  eigen_assert((Mode & (Upper|Lower)) != 0);
 
   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
 
@@ -298,7 +298,7 @@ void SparseTriangularView<ExpressionType,Mode>::solveInPlace(SparseMatrixBase<Ot
   eigen_assert(m_matrix.cols() == m_matrix.rows());
   eigen_assert(m_matrix.cols() == other.rows());
   eigen_assert(!(Mode & ZeroDiag));
-  eigen_assert(Mode & (Upper|Lower));
+  eigen_assert((Mode & (Upper|Lower)) != 0);
 
 //   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
 
index 9d6aceecceb69dbd571dbebbbd2aa4894b86d0fb..ba64951a1670a01c37aa2475a421e35e022c6c37 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef LIBMV_IMAGE_CORRELATION_H
 #define LIBMV_IMAGE_CORRELATION_H
 
+#include "libmv/logging/logging.h"
 #include "libmv/image/image.h"
 
 namespace libmv {
@@ -28,7 +29,8 @@ namespace libmv {
 inline double PearsonProductMomentCorrelation(Array3Df image_and_gradient1_sampled,
                                               Array3Df image_and_gradient2_sampled,
                                               int width) {
-  double sX=0,sY=0,sXX=0,sYY=0,sXY=0;
+  double sX = 0, sY = 0, sXX = 0, sYY = 0, sXY = 0;
+
   for (int r = 0; r < width; ++r) {
     for (int c = 0; c < width; ++c) {
       double x = image_and_gradient1_sampled(r, c, 0);
@@ -40,9 +42,23 @@ inline double PearsonProductMomentCorrelation(Array3Df image_and_gradient1_sampl
       sXY += x*y;
     }
   }
-  double N = width*width;
-  sX /= N, sY /= N, sXX /= N, sYY /= N, sXY /= N;
-  double correlation = (sXY-sX*sY)/sqrt(double((sXX-sX*sX)*(sYY-sY*sY)));
+
+  // Normalize.
+  double N = width * width;
+  sX /= N;
+  sY /= N;
+  sXX /= N;
+  sYY /= N;
+  sXY /= N;
+
+  double var_x = sXX - sX*sX;
+  double var_y = sYY - sY*sY;
+  double covariance_xy = sXY - sX*sY;
+
+  double correlation = covariance_xy / sqrt(var_x * var_y);
+  LG << "Covariance xy: " << covariance_xy
+     << ", var 1: " << var_x << ", var 2: " << var_y
+     << ", correlation: " << correlation;
   return correlation;
 }
 
index ea86edf117d3229481c9196615d8ecd899fb3d79..e842747e6d4ba04a6209d8e6fab4f9239296a60d 100644 (file)
@@ -95,7 +95,6 @@ inline void DownsampleChannelsBy2(const Array3Df &in, Array3Df *out) {
       }
     }
   }
-
 }
 
 // Sample a region centered at x,y in image with size extending by half_width
index af7f673472e1c32fe4ff44641aeec032d780d24c..ef36dffb56dfc589200606153c067c0861fb11ae 100644 (file)
@@ -310,7 +310,7 @@ bool BruteRegionTracker::Track(const FloatImage &image1,
   FloatArrayToByteArrayWithPadding(image_and_gradient2, &search_area, &search_area_stride);
 
   // Try all possible locations inside the search area. Yes, everywhere.
-  int best_i, best_j, best_sad = INT_MAX;
+  int best_i = -1, best_j = -1, best_sad = INT_MAX;
   for (int i = 0; i < image2.Height() - pattern_width; ++i) {
     for (int j = 0; j < image2.Width() - pattern_width; ++j) {
       int sad = SumOfAbsoluteDifferencesContiguousImage(pattern,
@@ -327,38 +327,51 @@ bool BruteRegionTracker::Track(const FloatImage &image1,
     }
   }
 
+  CHECK_NE(best_i, -1);
+  CHECK_NE(best_j, -1);
+
   aligned_free(pattern);
   aligned_free(search_area);
 
-  if (best_sad != INT_MAX) {
-    *x2 = best_j + half_window_size;
-    *y2 = best_i + half_window_size;
-
-    if (minimum_correlation > 0) {
-      Array3Df image_and_gradient1_sampled, image_and_gradient2_sampled;
-
-      SamplePattern(image_and_gradient1, x1, y1, half_window_size, 3,
-                    &image_and_gradient1_sampled);
-      SamplePattern(image_and_gradient2, *x2, *y2, half_window_size, 3,
-                    &image_and_gradient2_sampled);
-
-      // Compute the Pearson product-moment correlation coefficient to check
-      // for sanity.
-      double correlation = PearsonProductMomentCorrelation(image_and_gradient1_sampled,
-                                                           image_and_gradient2_sampled,
-                                                           pattern_width);
-      LG << "Final correlation: " << correlation;
-
-      if (correlation < minimum_correlation) {
-        LG << "Correlation " << correlation << " greater than "
-           << minimum_correlation << "; bailing.";
-        return false;
-      }
-    }
+  if (best_sad == INT_MAX) {
+    LG << "Hit INT_MAX in SAD; failing.";
+    return false;
+  }
+
+  *x2 = best_j + half_window_size;
+  *y2 = best_i + half_window_size;
 
+  // Calculate the shift done by the fine tracker.
+  double dx2 = *x2 - x1;
+  double dy2 = *y2 - y1;
+  double fine_shift = sqrt(dx2 * dx2 + dy2 * dy2);
+  LG << "Brute shift: dx=" << dx2 << " dy=" << dy2 << ", d=" << fine_shift;
+
+  if (minimum_correlation <= 0) {
+    // No correlation checking requested; nothing else to do.
+    LG << "No correlation checking; returning success. best_sad: " << best_sad;
     return true;
   }
-  return false;
+
+  Array3Df image_and_gradient1_sampled, image_and_gradient2_sampled;
+  SamplePattern(image_and_gradient1, x1, y1, half_window_size, 3,
+                &image_and_gradient1_sampled);
+  SamplePattern(image_and_gradient2, *x2, *y2, half_window_size, 3,
+                &image_and_gradient2_sampled);
+
+  // Compute the Pearson product-moment correlation coefficient to check
+  // for sanity.
+  double correlation = PearsonProductMomentCorrelation(image_and_gradient1_sampled,
+                                                       image_and_gradient2_sampled,
+                                                       pattern_width);
+  LG << "Final correlation: " << correlation;
+
+  if (correlation < minimum_correlation) {
+    LG << "Correlation " << correlation << " greater than "
+       << minimum_correlation << "; bailing.";
+    return false;
+  }
+  return true;
 }
 
 }  // namespace libmv
index e0b85f19943a583e082c832c3113b1729c9020f5..221fa4d081b2b914c0e39d7d905afa82afeda91f 100644 (file)
@@ -41,6 +41,7 @@ static bool RegionIsInBounds(const FloatImage &image1,
   int min_y = floor(y) - half_window_size - 1;
   if (min_x < 0.0 ||
       min_y < 0.0) {
+    LG << "Out of bounds; min_x: " << min_x << ", min_y: " << min_y;
     return false;
   }
 
@@ -49,6 +50,9 @@ static bool RegionIsInBounds(const FloatImage &image1,
   int max_y = ceil(y) + half_window_size + 1;
   if (max_x > image1.cols() ||
       max_y > image1.rows()) {
+    LG << "Out of bounds; max_x: " << max_x << ", max_y: " << max_y
+       << ", image1.cols(): " << image1.cols()
+       << ", image1.rows(): " << image1.rows();
     return false;
   }
 
@@ -56,24 +60,6 @@ static bool RegionIsInBounds(const FloatImage &image1,
   return true;
 }
 
-// Estimate "reasonable" error by computing autocorrelation for a small shift.
-// TODO(keir): Add a facility for 
-static double EstimateReasonableError(const FloatImage &image,
-                               double x, double y,
-                               int half_width) {
-  double error = 0.0;
-  for (int r = -half_width; r <= half_width; ++r) {
-    for (int c = -half_width; c <= half_width; ++c) {
-      double s = SampleLinear(image, y + r, x + c, 0);
-      double e1 = SampleLinear(image, y + r + 0.5, x + c, 0) - s;
-      double e2 = SampleLinear(image, y + r, x + c + 0.5, 0) - s;
-      error += e1*e1 + e2*e2;
-    }
-  }
-  // XXX hack
-  return error / 2.0 * 16.0;
-}
-
 // This is implemented from "Lukas and Kanade 20 years on: Part 1. Page 42,
 // figure 14: the Levenberg-Marquardt-Inverse Compositional Algorithm".
 bool EsmRegionTracker::Track(const FloatImage &image1,
@@ -107,9 +93,6 @@ bool EsmRegionTracker::Track(const FloatImage &image1,
   // 
   // Ignored for my "normal" LM loop.
 
-  double reasonable_error =
-      EstimateReasonableError(image1, x1, y1, half_window_size);
-
   // Step 1: Warp I with W(x, p) to compute I(W(x; p).
   //
   // Use two images for accepting / rejecting updates.
@@ -228,7 +211,7 @@ bool EsmRegionTracker::Track(const FloatImage &image1,
         new_error += e*e;
       }
     }
-    //LG << "Old error: " << error << ", new error: " << new_error;
+    LG << "Old error: " << error << ", new error: " << new_error;
 
     double rho = (error - new_error) / (d.transpose() * (mu * d + z));
 
@@ -253,6 +236,7 @@ bool EsmRegionTracker::Track(const FloatImage &image1,
 
       mu *= std::max(1/3., 1 - pow(2*rho - 1, 3));
       nu = M_E;  // See above for why to use e.
+      LG << "Error decreased, so accept update.";
     }
 
     // If the step was accepted, then check for termination.
@@ -264,13 +248,15 @@ bool EsmRegionTracker::Track(const FloatImage &image1,
                                                            width);
       LG << "Final correlation: " << correlation;
 
-      if (correlation < minimum_correlation) {
-        LG << "Correlation " << correlation << " greater than "
-           << minimum_correlation << "; bailing.";
-        return false;
+      // Note: Do the comparison here to handle nan's correctly (since all
+      // comparisons with nan are false).
+      if (minimum_correlation < correlation) {
+        LG << "Successful track in " << (i + 1) << " iterations.";
+        return true;
       }
-      LG << "Successful track in " << (i + 1) << " iterations.";
-      return true;
+      LG << "Correlation " << correlation << " greater than "
+         << minimum_correlation << " or is nan; bailing.";
+      return false;
     }
   }
   // Getting here means we hit max iterations, so tracking failed.
index c2cf293cab32d4dad92b7362772fe591533e173b..cd9557bd0bf0f089db695bafda5577c5bac0783e 100644 (file)
@@ -268,7 +268,7 @@ __device void triangle_light_sample(KernelGlobals *kg, int prim, int object,
                Transform itfm = object_fetch_transform(kg, ls->object, time, OBJECT_INVERSE_TRANSFORM);
 
                ls->P = transform_point(&tfm, ls->P);
-               ls->Ng = transform_direction_transposed(&itfm, ls->Ng);
+               ls->Ng = normalize(transform_direction_transposed(&itfm, ls->Ng));
        }
 #endif
 }
index 4a3ef55e8cb8b0b023ca1a2f05682d590fd528c4..abe427d8345d7cf232ae46f6f9918fa49d725e33 100644 (file)
@@ -77,6 +77,16 @@ __device_inline void object_position_transform(KernelGlobals *kg, ShaderData *sd
 #endif
 }
 
+__device_inline void object_inverse_position_transform(KernelGlobals *kg, ShaderData *sd, float3 *P)
+{
+#ifdef __MOTION__
+       *P = transform_point(&sd->ob_itfm, *P);
+#else
+       Transform tfm = object_fetch_transform(kg, sd->object, TIME_INVALID, OBJECT_INVERSE_TRANSFORM);
+       *P = transform_point(&tfm, *P);
+#endif
+}
+
 __device_inline void object_inverse_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N)
 {
 #ifdef __MOTION__
index 169307574a2da8341c254451fbf440f8410cd9a1..aa924bcc38b5d02324c3347a9989e6a11c1bb7cf 100644 (file)
@@ -57,7 +57,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
                case NODE_TEXCO_OBJECT: {
                        if(sd->object != ~0) {
                                data = sd->P;
-                               object_position_transform(kg, sd, &data);
+                               object_inverse_position_transform(kg, sd, &data);
                        }
                        else
                                data = sd->P;
@@ -106,7 +106,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
                case NODE_TEXCO_OBJECT: {
                        if(sd->object != ~0) {
                                data = sd->P + sd->dP.dx;
-                               object_position_transform(kg, sd, &data);
+                               object_inverse_position_transform(kg, sd, &data);
                        }
                        else
                                data = sd->P + sd->dP.dx;
@@ -158,7 +158,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
                case NODE_TEXCO_OBJECT: {
                        if(sd->object != ~0) {
                                data = sd->P + sd->dP.dy;
-                               object_position_transform(kg, sd, &data);
+                               object_inverse_position_transform(kg, sd, &data);
                        }
                        else
                                data = sd->P + sd->dP.dy;
index afc590984328978d22751bb4cb09d6cefd741df3..57fe2fb01b7e71e706a5cb13f49ea6a2a6cabc4d 100644 (file)
@@ -1731,7 +1731,6 @@ void LightFalloffNode::compile(SVMCompiler& compiler)
                compiler.stack_assign(out);
                compiler.add_node(NODE_LIGHT_FALLOFF, NODE_LIGHT_FALLOFF_LINEAR,
                        compiler.encode_uchar4(strength_in->stack_offset, smooth_in->stack_offset, out->stack_offset));
-               compiler.add_node(NODE_LIGHT_FALLOFF, NODE_LIGHT_FALLOFF_LINEAR, out->stack_offset);
        }
 
        out = output("Constant");
index 2cc2995bcfe0572322bdf77476e4ec41d6a4124b..c63aa841c5206567b118c37af050b696a9afcd30 100644 (file)
@@ -153,8 +153,10 @@ public:
 
        void set_update()
        {
-               if(update_cb)
+               if(update_cb) {
+                       thread_scoped_lock lock(update_mutex);
                        update_cb();
+               }
        }
 
        void set_update_callback(boost::function<void(void)> function)
@@ -164,6 +166,7 @@ public:
 
 protected:
        thread_mutex progress_mutex;
+       thread_mutex update_mutex;
        boost::function<void(void)> update_cb;
        boost::function<void(void)> cancel_cb;
 
index 53135a7dcc1f6410fc2eb7d1f4a7d11640c53176..1c3d31b6625684b66103d264c256b470af7bacd8 100644 (file)
@@ -24,7 +24,7 @@
 #define __DUALCON_H__
 
 #ifdef __cplusplus
-extern "C" { 
+extern "C" {
 #endif
 
 typedef float (*DualConCo)[3];
@@ -35,11 +35,11 @@ typedef struct DualConInput {
        DualConCo co;
        int co_stride;
        int totco;
-       
+
        DualConFaces faces;
        int face_stride;
        int totface;
-       
+
        float min[3], max[3];
 } DualConInput;
 
@@ -64,32 +64,32 @@ typedef enum {
 } DualConMode;
 
 /* Usage:
-   
  The three callback arguments are used for creating the output
  mesh. The alloc_output callback takes the total number of vertices
  and faces (quads) that will be in the output. It should allocate
  and return a structure to hold the output mesh. The add_vert and
  add_quad callbacks will then be called for each new vertex and
  quad, and the callback should add the new mesh elements to the
  structure.
-*/
+ *
* The three callback arguments are used for creating the output
* mesh. The alloc_output callback takes the total number of vertices
* and faces (quads) that will be in the output. It should allocate
* and return a structure to hold the output mesh. The add_vert and
* add_quad callbacks will then be called for each new vertex and
* quad, and the callback should add the new mesh elements to the
* structure.
+ */
 void *dualcon(const DualConInput *input_mesh,
-                         /* callbacks for output */
-                         DualConAllocOutput alloc_output,
-                         DualConAddVert add_vert,
-                         DualConAddQuad add_quad,
+              /* callbacks for output */
+              DualConAllocOutput alloc_output,
+              DualConAddVert add_vert,
+              DualConAddQuad add_quad,
 
-                         /* flags and settings to control the remeshing
-                                algorithm */
-                         DualConFlags flags,
-                         DualConMode mode,
-                         float threshold,
-                         float hermite_num,
-                         float scale,
-                         int depth);
+              /* flags and settings to control the remeshing
+               * algorithm */
+              DualConFlags flags,
+              DualConMode mode,
+              float threshold,
+              float hermite_num,
+              float scale,
+              int depth);
 
 #ifdef __cplusplus
-} 
+}
 #endif
 
 #endif /* __DUALCON_H__ */
index 3b2789bec87430f0f4b2ed3a06c69e1ad555fdba..9f5a99e9e20684e9dbde7ceeeba4df43e238a71d 100644 (file)
 
 
 // 3d point with integer coordinates
-typedef struct
-{
+typedef struct {
        int x, y, z;
 } Point3i;
 
-typedef struct
-{
+typedef struct {
        Point3i begin;
        Point3i end;
 } BoundingBox;
 
 // triangle that points to three vertices
-typedef struct 
-{
-       float vt[3][3] ;
+typedef struct {
+       float vt[3][3];
 } Triangle;
 
 // 3d point with float coordinates
-typedef struct
-{
+typedef struct {
        float x, y, z;
 } Point3f;
 
-typedef struct
-{
+typedef struct {
        Point3f begin;
        Point3f end;
 } BoundingBoxf;
index a1be0978409eb58b09922ed7b84f84fbc66a806d..b704542d27b368977a1124934ecc22000e79677d 100644 (file)
 class VirtualMemoryAllocator
 {
 public:
-       virtual void * allocate( ) = 0 ;
-       virtual void deallocate( void * obj ) = 0 ;
-       virtual void destroy( ) = 0 ;
-       virtual void printInfo( ) = 0 ;
-
-       virtual int getAllocated( ) = 0 ;
-       virtual int getAll( ) = 0 ;
-       virtual int getBytes( ) = 0 ;
+virtual void *allocate( ) = 0;
+virtual void deallocate(void *obj) = 0;
+virtual void destroy( ) = 0;
+virtual void printInfo( ) = 0;
+
+virtual int getAllocated( ) = 0;
+virtual int getAll( ) = 0;
+virtual int getBytes( ) = 0;
 };
 
 /**
  * Dynamic memory allocator - allows allocation/deallocation
- * 
+ *
  * Note: there are 4 bytes overhead for each allocated yet unused object.
  */
 template < int N >
@@ -63,157 +63,157 @@ class MemoryAllocator : public VirtualMemoryAllocator
 {
 private:
 
-       /// Constants
-       int HEAP_UNIT, HEAP_MASK ;
+/// Constants
+int HEAP_UNIT, HEAP_MASK;
 
-       /// Data array
-       UCHAR ** data ;
+/// Data array
+UCHAR **data;
 
-       /// Allocation stack
-       UCHAR *** stack ;
+/// Allocation stack
+UCHAR ***stack;
 
-       /// Number of data blocks
-       int datablocknum ;
+/// Number of data blocks
+int datablocknum;
 
-       /// Number of stack blocks
-       int stackblocknum ;
+/// Number of stack blocks
+int stackblocknum;
 
-       /// Size of stack
-       int stacksize ;
+/// Size of stack
+int stacksize;
 
-       /// Number of available objects on stack
-       int available ;
+/// Number of available objects on stack
+int available;
 
-       /**
-        * Allocate a memory block
-        */
-       void allocateDataBlock ( )
-       {
-               // Allocate a data block
-               datablocknum += 1 ;
-               data = ( UCHAR ** )realloc( data, sizeof ( UCHAR * ) * datablocknum ) ;
-               data[ datablocknum - 1 ] = ( UCHAR * )malloc( HEAP_UNIT * N ) ;
-
-               // Update allocation stack
-               for ( int i = 0 ; i < HEAP_UNIT ; i ++ )
-               {
-                       stack[ 0 ][ i ] = ( data[ datablocknum - 1 ] + i * N ) ;
-               }
-               available = HEAP_UNIT ;
-       }
+/**
+ * Allocate a memory block
+ */
+void allocateDataBlock( )
+{
+       // Allocate a data block
+       datablocknum += 1;
+       data = ( UCHAR ** )realloc(data, sizeof (UCHAR *) * datablocknum);
+       data[datablocknum - 1] = ( UCHAR * )malloc(HEAP_UNIT * N);
 
-       /**
-        * Allocate a stack block, to store more deallocated objects
-        */
-       void allocateStackBlock( )
+       // Update allocation stack
+       for (int i = 0; i < HEAP_UNIT; i++)
        {
-               // Allocate a stack block
-               stackblocknum += 1 ;
-               stacksize += HEAP_UNIT ;
-               stack = ( UCHAR *** )realloc( stack, sizeof ( UCHAR ** ) * stackblocknum ) ;
-               stack[ stackblocknum - 1 ] = ( UCHAR ** )malloc( HEAP_UNIT * sizeof ( UCHAR * ) ) ;
+               stack[0][i] = (data[datablocknum - 1] + i * N);
        }
+       available = HEAP_UNIT;
+}
+
+/**
+ * Allocate a stack block, to store more deallocated objects
+ */
+void allocateStackBlock( )
+{
+       // Allocate a stack block
+       stackblocknum += 1;
+       stacksize += HEAP_UNIT;
+       stack = ( UCHAR *** )realloc(stack, sizeof (UCHAR * *) * stackblocknum);
+       stack[stackblocknum - 1] = ( UCHAR ** )malloc(HEAP_UNIT * sizeof (UCHAR *) );
+}
 
 
 public:
-       /**
-        * Constructor
-        */
-       MemoryAllocator( )
+/**
+ * Constructor
+ */
+MemoryAllocator( )
+{
+       HEAP_UNIT = 1 << HEAP_BASE;
+       HEAP_MASK = (1 << HEAP_BASE) - 1;
+
+       data = ( UCHAR ** )malloc(sizeof(UCHAR *) );
+       data[0] = ( UCHAR * )malloc(HEAP_UNIT * N);
+       datablocknum = 1;
+
+       stack = ( UCHAR *** )malloc(sizeof (UCHAR * *) );
+       stack[0] = ( UCHAR ** )malloc(HEAP_UNIT * sizeof (UCHAR *) );
+       stackblocknum = 1;
+       stacksize = HEAP_UNIT;
+       available = HEAP_UNIT;
+
+       for (int i = 0; i < HEAP_UNIT; i++)
        {
-               HEAP_UNIT = 1 << HEAP_BASE ;
-               HEAP_MASK = ( 1 << HEAP_BASE ) - 1 ;
-
-               data = ( UCHAR ** )malloc( sizeof( UCHAR * ) ) ;
-               data[ 0 ] = ( UCHAR * )malloc( HEAP_UNIT * N ) ;
-               datablocknum = 1 ;
-
-               stack = ( UCHAR *** )malloc( sizeof ( UCHAR ** ) ) ;
-               stack[ 0 ] = ( UCHAR ** )malloc( HEAP_UNIT * sizeof ( UCHAR * ) ) ;
-               stackblocknum = 1 ;
-               stacksize = HEAP_UNIT ;
-               available = HEAP_UNIT ;
-
-               for ( int i = 0 ; i < HEAP_UNIT ; i ++ )
-               {
-                       stack[ 0 ][ i ] = ( data[ 0 ] + i * N ) ;
-               }
+               stack[0][i] = (data[0] + i * N);
        }
+}
 
-       /**
-        * Destructor
-        */
-       void destroy( )
+/**
+ * Destructor
+ */
+void destroy( )
+{
+       int i;
+       for (i = 0; i < datablocknum; i++)
        {
-               int i ;
-               for ( i = 0 ; i < datablocknum ; i ++ )
-               {
-                       free( data[ i ] ) ;
-               }
-               for ( i = 0 ; i < stackblocknum ; i ++ )
-               {
-                       free( stack[ i ] ) ;
-               }
-               free( data ) ;
-               free( stack ) ;
+               free(data[i]);
        }
-
-       /**
-        * Allocation method
-        */
-       void * allocate ( )
+       for (i = 0; i < stackblocknum; i++)
        {
-               if ( available == 0 )
-               {
-                       allocateDataBlock ( ) ;
-               }
-
-               // printf("Allocating %d\n", header[ allocated ]) ;
-               available -- ;
-               return (void*)stack[ available >> HEAP_BASE ][ available & HEAP_MASK ] ;
+               free(stack[i]);
        }
+       free(data);
+       free(stack);
+}
 
-       /**
-        * De-allocation method
-        */
-       void deallocate ( void * obj )
+/**
+ * Allocation method
+ */
+void *allocate( )
+{
+       if (available == 0)
        {
-               if ( available == stacksize )
-               {
-                       allocateStackBlock ( ) ;
-               }
-
-               // printf("De-allocating %d\n", ( obj - data ) / N ) ;
-               stack[ available >> HEAP_BASE ][ available & HEAP_MASK ] = (UCHAR*)obj ;
-               available ++ ;
-               // printf("%d %d\n", allocated, header[ allocated ]) ;
+               allocateDataBlock( );
        }
 
-       /**
-        * Print information
-        */
-       void printInfo ( )
+       // printf("Allocating %d\n", header[ allocated ]) ;
+       available--;
+       return (void *)stack[available >> HEAP_BASE][available & HEAP_MASK];
+}
+
+/**
+ * De-allocation method
+ */
+void deallocate(void *obj)
+{
+       if (available == stacksize)
        {
-               printf("Bytes: %d Used: %d Allocated: %d Maxfree: %d\n", getBytes(), getAllocated(), getAll(), stacksize ) ;
+               allocateStackBlock( );
        }
 
-       /**
-        * Query methods
-        */
-       int getAllocated( )
-       {
-               return HEAP_UNIT * datablocknum - available ;   
-       };
+       // printf("De-allocating %d\n", ( obj - data ) / N ) ;
+       stack[available >> HEAP_BASE][available & HEAP_MASK] = (UCHAR *)obj;
+       available++;
+       // printf("%d %d\n", allocated, header[ allocated ]) ;
+}
 
-       int getAll( )
-       {
-               return HEAP_UNIT * datablocknum ;
-       };
+/**
+ * Print information
+ */
+void printInfo( )
+{
+       printf("Bytes: %d Used: %d Allocated: %d Maxfree: %d\n", getBytes(), getAllocated(), getAll(), stacksize);
+}
 
-       int getBytes( )
-       {
-               return N ;      
-       };
+/**
+ * Query methods
+ */
+int getAllocated( )
+{
+       return HEAP_UNIT * datablocknum - available;
+};
+
+int getAll( )
+{
+       return HEAP_UNIT * datablocknum;
+};
+
+int getBytes( )
+{
+       return N;
+};
 };
 
 #endif
index e70a1586e034127360baafc57b4a947d3d6b8386..993c5756531b43bd655163a4746cb58b4ca2a4bb 100644 (file)
 class ModelReader
 {
 public:
-       /// Constructor
-       ModelReader(){} ;
+/// Constructor
+ModelReader(){
+};
 
-       /// Get next triangle
-       virtual Triangle* getNextTriangle( ) = 0 ;
-       virtual int getNextTriangle( int t[3] ) = 0 ;
+/// Get next triangle
+virtual Triangle *getNextTriangle( ) = 0;
+virtual int getNextTriangle(int t[3]) = 0;
 
-       /// Get bounding box
-       virtual float getBoundingBox ( float origin[3] ) = 0 ;
+/// Get bounding box
+virtual float getBoundingBox(float origin[3]) = 0;
 
-       /// Get number of triangles
-       virtual int getNumTriangles ( ) = 0 ;
+/// Get number of triangles
+virtual int getNumTriangles( ) = 0;
 
-       /// Get storage size
-       virtual int getMemory ( ) = 0 ;
+/// Get storage size
+virtual int getMemory( ) = 0;
 
-       /// Reset file reading location
-       virtual void reset( ) = 0 ;
+/// Reset file reading location
+virtual void reset( ) = 0;
 
-       /// For explicit vertex models
-       virtual int getNumVertices( ) = 0 ;
+/// For explicit vertex models
+virtual int getNumVertices( ) = 0;
 
-       virtual void getNextVertex( float v[3] ) = 0 ;
+virtual void getNextVertex(float v[3]) = 0;
 
-       virtual void printInfo ( ) = 0 ;
+virtual void printInfo( ) = 0;
 };
 
 
index 1f0831ce973dda69c5cf47f3eee5a8d61a7ba136..e50065c004d8cee40ad3af1f27753745737be7e7 100644 (file)
@@ -37,18 +37,15 @@ const int vertmap[8][3] = {
 const int centmap[3][3][3][2] = {
        {{{0, 0}, {0, 1}, {1, 1}},
         {{0, 2}, {0, 3}, {1, 3}},
-        {{2, 2}, {2, 3}, {3, 3}}
-       },
-       
+        {{2, 2}, {2, 3}, {3, 3}}},
+
        {{{0, 4}, {0, 5}, {1, 5}},
         {{0, 6}, {0, 7}, {1, 7}},
-        {{2, 6}, {2, 7}, {3, 7}}
-       },
-       
+        {{2, 6}, {2, 7}, {3, 7}}},
+
        {{{4, 4}, {4, 5}, {5, 5}},
         {{4, 6}, {4, 7}, {5, 7}},
-        {{6, 6}, {6, 7}, {7, 7}}
-       }
+        {{6, 6}, {6, 7}, {7, 7}}}
 };
 
 const int edgemap[12][2] = {
index 18533b218ffebf487f63db388667feac4703bb13..7740b0d16348097e333bfa6289ee1dd0ff536e16 100644 (file)
@@ -54,20 +54,19 @@ extern const int facemap[6][4];
 /**
  * Structure for the projections inheritable from parent
  */
-struct InheritableProjections
-{
+struct InheritableProjections {
        /// Projections of triangle
-       LONG trigProj[13][2] ;
+       LONG trigProj[13][2];
 
        /// Projections of triangle vertices on primary axes
-       LONG trigVertProj[13][3] ;
+       LONG trigVertProj[13][3];
 
        /// Projections of triangle edges
-       LONG trigEdgeProj[13][3][2] ;
+       LONG trigEdgeProj[13][3][2];
 
        /// Normal of the triangle
-       double norm[3] ;
-       double normA, normB ;
+       double norm[3];
+       double normA, normB;
 
        /// End points along each axis
        //int cubeEnds[13][2] ;
@@ -77,7 +76,7 @@ struct InheritableProjections
 
 #ifdef CONTAINS_INDEX
        /// Index of polygon
-       int index ;
+       int index;
 #endif
 };
 
@@ -88,758 +87,752 @@ struct InheritableProjections
 class Projections
 {
 public:
-       /// Inheritable portion
-       InheritableProjections* inherit ;
+/// Inheritable portion
+InheritableProjections *inherit;
 
-       /// Projections of the cube vertices
-       LONG cubeProj[13][6] ;
+/// Projections of the cube vertices
+LONG cubeProj[13][6];
 
 public:
 
-       Projections( )
-       {
-       }
+Projections( )
+{
+}
 
-       /** 
       * Construction
       * from a cube (axes aligned) and triangle
       */
-       Projections( LONG cube[2][3], LONG trig[3][3], LONG error, int triind )
-       {
-               int i, j ;
-               inherit = new InheritableProjections ;
+/**
+ * Construction
+ * from a cube (axes aligned) and triangle
+ */
+Projections(LONG cube[2][3], LONG trig[3][3], LONG error, int triind)
+{
+       int i, j;
+       inherit = new InheritableProjections;
 #ifdef CONTAINS_INDEX
-               inherit->index = triind ;
+       inherit->index = triind;
 #endif
-               /// Create axes
-               LONG axes[13][3] ;
+       /// Create axes
+       LONG axes[13][3];
 
-               // Cube faces
-               axes[0][0] = 1 ;
-               axes[0][1] = 0 ;
-               axes[0][2] = 0 ;
+       // Cube faces
+       axes[0][0] = 1;
+       axes[0][1] = 0;
+       axes[0][2] = 0;
 
-               axes[1][0] = 0 ;
-               axes[1][1] = 1 ;
-               axes[1][2] = 0 ;
+       axes[1][0] = 0;
+       axes[1][1] = 1;
+       axes[1][2] = 0;
 
-               axes[2][0] = 0 ;
-               axes[2][1] = 0 ;
-               axes[2][2] = 1 ;
+       axes[2][0] = 0;
+       axes[2][1] = 0;
+       axes[2][2] = 1;
 
-               // Triangle face
-               LONG trigedge[3][3] ;
-               for ( i = 0 ; i < 3 ; i ++ )
+       // Triangle face
+       LONG trigedge[3][3];
+       for (i = 0; i < 3; i++)
+       {
+               for (j = 0; j < 3; j++)
                {
-                       for ( j = 0 ; j < 3 ; j ++ )
-                       {
-                               trigedge[i][j] = trig[(i+1)%3][j] - trig[i][j] ;
-                       }
+                       trigedge[i][j] = trig[(i + 1) % 3][j] - trig[i][j];
                }
-               crossProduct( trigedge[0], trigedge[1], axes[3] ) ;
-
-               /// Normalize face normal and store
-               double dedge1[] = { (double) trig[1][0] - (double) trig[0][0],
-                                                       (double) trig[1][1] - (double) trig[0][1],
-                                                       (double) trig[1][2] - (double) trig[0][2] } ;
-               double dedge2[] = { (double) trig[2][0] - (double) trig[1][0],
-                                                       (double) trig[2][1] - (double) trig[1][1],
-                                                       (double) trig[2][2] - (double) trig[1][2] } ;
-               crossProduct( dedge1, dedge2, inherit->norm ) ;
-               normalize( inherit->norm ) ;
+       }
+       crossProduct(trigedge[0], trigedge[1], axes[3]);
+
+       /// Normalize face normal and store
+       double dedge1[] = { (double) trig[1][0] - (double) trig[0][0],
+                               (double) trig[1][1] - (double) trig[0][1],
+                               (double) trig[1][2] - (double) trig[0][2] };
+       double dedge2[] = { (double) trig[2][0] - (double) trig[1][0],
+                               (double) trig[2][1] - (double) trig[1][1],
+                               (double) trig[2][2] - (double) trig[1][2] };
+       crossProduct(dedge1, dedge2, inherit->norm);
+       normalize(inherit->norm);
 //             inherit->normA = norm[ 0 ] ;
 //             inherit->normB = norm[ 2 ] > 0 ? norm[ 1 ] : 2 + norm[ 1 ] ;
 
-               // Face edges and triangle edges
-               int ct = 4 ;
-               for ( i = 0 ; i < 3 ; i ++ )
-                       for ( j = 0 ; j < 3 ; j ++ )
-                       {
-                               crossProduct( axes[j], trigedge[i], axes[ct] ) ;
-                               ct ++ ;
-                       }               
-
-               /// Generate projections
-               LONG cubeedge[3][3] ;
-               for ( i = 0 ; i < 3 ; i ++ )
+       // Face edges and triangle edges
+       int ct = 4;
+       for (i = 0; i < 3; i++)
+               for (j = 0; j < 3; j++)
                {
-                       for ( j = 0 ; j < 3 ; j ++ )
-                       {
-                               cubeedge[i][j] = 0 ;
-                       }
-                       cubeedge[i][i] = cube[1][i] - cube[0][i] ;
+                       crossProduct(axes[j], trigedge[i], axes[ct]);
+                       ct++;
                }
 
-               for ( j = 0 ; j < 13 ; j ++ )
+       /// Generate projections
+       LONG cubeedge[3][3];
+       for (i = 0; i < 3; i++)
+       {
+               for (j = 0; j < 3; j++)
                {
-                       // Origin
-                       cubeProj[j][0] = dotProduct( axes[j], cube[0] ) ;
-
-                       // 3 direction vectors
-                       for ( i = 1 ; i < 4 ; i ++ )
-                       {
-                               cubeProj[j][i] = dotProduct( axes[j], cubeedge[i-1] ) ;
-                       }
+                       cubeedge[i][j] = 0;
+               }
+               cubeedge[i][i] = cube[1][i] - cube[0][i];
+       }
 
-                       // Offsets of 2 ends of cube projection
-                       LONG max = 0 ;
-                       LONG min = 0 ;
-                       for ( i = 1 ; i < 8 ; i ++ )
-                       {
-                               LONG proj = vertmap[i][0] * cubeProj[j][1] + vertmap[i][1] * cubeProj[j][2] + vertmap[i][2] * cubeProj[j][3] ;
-                               if ( proj > max )
-                               {
-                                       max = proj ;
-                               }
-                               if ( proj < min )
-                               {
-                                       min = proj ;
-                               }
-                       }
-                       cubeProj[j][4] = min ;
-                       cubeProj[j][5] = max ;
+       for (j = 0; j < 13; j++)
+       {
+               // Origin
+               cubeProj[j][0] = dotProduct(axes[j], cube[0]);
 
+               // 3 direction vectors
+               for (i = 1; i < 4; i++)
+               {
+                       cubeProj[j][i] = dotProduct(axes[j], cubeedge[i - 1]);
                }
 
-               for ( j = 0 ; j < 13 ; j ++ )
+               // Offsets of 2 ends of cube projection
+               LONG max = 0;
+               LONG min = 0;
+               for (i = 1; i < 8; i++)
                {
-                       LONG vts[3] = { dotProduct( axes[j], trig[0] ),
-                                                       dotProduct( axes[j], trig[1] ),
-                                                       dotProduct( axes[j], trig[2] )  } ;
-
-                       // Vertex
-                       inherit->trigVertProj[j][0] = vts[0] ;
-                       inherit->trigVertProj[j][1] = vts[1] ;
-                       inherit->trigVertProj[j][2] = vts[2] ;
-
-                       // Edge
-                       for ( i = 0 ; i < 3 ; i ++ )
+                       LONG proj = vertmap[i][0] * cubeProj[j][1] + vertmap[i][1] * cubeProj[j][2] + vertmap[i][2] * cubeProj[j][3];
+                       if (proj > max)
                        {
-                               if ( vts[i] < vts[(i+1) % 3] )
-                               {
-                                       inherit->trigEdgeProj[j][i][0] = vts[i] ; 
-                                       inherit->trigEdgeProj[j][i][1] = vts[(i+1) % 3] ; 
-                               }
-                               else
-                               {
-                                       inherit->trigEdgeProj[j][i][1] = vts[i] ; 
-                                       inherit->trigEdgeProj[j][i][0] = vts[(i+1) % 3] ; 
-                               }
+                               max = proj;
                        }
-
-                       // Triangle
-                       inherit->trigProj[j][0] = vts[0] ;
-                       inherit->trigProj[j][1] = vts[0] ;
-                       for ( i = 1 ; i < 3 ; i ++ )
+                       if (proj < min)
                        {
-                               if ( vts[i] < inherit->trigProj[j][0] )
-                               {
-                                       inherit->trigProj[j][0] = vts[i] ;
-                               }
-                               if ( vts[i] > inherit->trigProj[j][1] )
-                               {
-                                       inherit->trigProj[j][1] = vts[i] ;
-                               }
+                               min = proj;
                        }
                }
+               cubeProj[j][4] = min;
+               cubeProj[j][5] = max;
 
        }
 
-       /**
-        * Construction
-        * from a parent Projections object and the index of the children
-        */
-       Projections ( Projections* parent ) 
+       for (j = 0; j < 13; j++)
        {
-               // Copy inheritable projections
-               this->inherit = parent->inherit ;
+               LONG vts[3] = { dotProduct(axes[j], trig[0]),
+                                   dotProduct(axes[j], trig[1]),
+                                   dotProduct(axes[j], trig[2])  };
 
-               // Shrink cube projections
-               for ( int i = 0 ; i < 13 ; i ++ )
+               // Vertex
+               inherit->trigVertProj[j][0] = vts[0];
+               inherit->trigVertProj[j][1] = vts[1];
+               inherit->trigVertProj[j][2] = vts[2];
+
+               // Edge
+               for (i = 0; i < 3; i++)
                {
-                       cubeProj[i][0] = parent->cubeProj[i][0] ;
-                       for ( int j = 1 ; j < 6 ; j ++ )
+                       if (vts[i] < vts[(i + 1) % 3])
                        {
-                               cubeProj[i][j] = parent->cubeProj[i][j] >> 1 ;
+                               inherit->trigEdgeProj[j][i][0] = vts[i];
+                               inherit->trigEdgeProj[j][i][1] = vts[(i + 1) % 3];
+                       }
+                       else {
+                               inherit->trigEdgeProj[j][i][1] = vts[i];
+                               inherit->trigEdgeProj[j][i][0] = vts[(i + 1) % 3];
                        }
                }
-       };
-
-       Projections ( Projections* parent, int box[3], int depth ) 
-       {
-               int mask =  ( 1 << depth ) - 1 ;
-               int nbox[3] = { box[0] & mask, box[1] & mask, box[2] & mask } ;
 
-               // Copy inheritable projections
-               this->inherit = parent->inherit ;
-
-               // Shrink cube projections
-               for ( int i = 0 ; i < 13 ; i ++ )
+               // Triangle
+               inherit->trigProj[j][0] = vts[0];
+               inherit->trigProj[j][1] = vts[0];
+               for (i = 1; i < 3; i++)
                {
-                       for ( int j = 1 ; j < 6 ; j ++ )
+                       if (vts[i] < inherit->trigProj[j][0])
                        {
-                               cubeProj[i][j] = parent->cubeProj[i][j] >> depth ;
+                               inherit->trigProj[j][0] = vts[i];
+                       }
+                       if (vts[i] > inherit->trigProj[j][1])
+                       {
+                               inherit->trigProj[j][1] = vts[i];
                        }
-
-                       cubeProj[i][0] = parent->cubeProj[i][0] + nbox[0] * cubeProj[i][1] + nbox[1] * cubeProj[i][2] + nbox[2] * cubeProj[i][3] ;
                }
-       };
+       }
 
-       /**
-        * Testing intersection based on vertex/edge masks
-        */
-       int getIntersectionMasks( UCHAR cedgemask, UCHAR& edgemask )
-       {
-               int i, j ;
-               edgemask = cedgemask ;
+}
 
-               // Pre-processing
-               /*
-               if ( cvertmask & 1 )
-               {
-                       edgemask |= 5 ;
-               }
-               if ( cvertmask & 2 )
+/**
+ * Construction
+ * from a parent Projections object and the index of the children
+ */
+Projections (Projections *parent)
+{
+       // Copy inheritable projections
+       this->inherit = parent->inherit;
+
+       // Shrink cube projections
+       for (int i = 0; i < 13; i++)
+       {
+               cubeProj[i][0] = parent->cubeProj[i][0];
+               for (int j = 1; j < 6; j++)
                {
-                       edgemask |= 3 ;
+                       cubeProj[i][j] = parent->cubeProj[i][j] >> 1;
                }
-               if ( cvertmask & 4 )
+       }
+};
+
+Projections (Projections *parent, int box[3], int depth)
+{
+       int mask =  (1 << depth) - 1;
+       int nbox[3] = { box[0] & mask, box[1] & mask, box[2] & mask };
+
+       // Copy inheritable projections
+       this->inherit = parent->inherit;
+
+       // Shrink cube projections
+       for (int i = 0; i < 13; i++)
+       {
+               for (int j = 1; j < 6; j++)
                {
-                       edgemask |= 6 ;
+                       cubeProj[i][j] = parent->cubeProj[i][j] >> depth;
                }
 
-               */
+               cubeProj[i][0] = parent->cubeProj[i][0] + nbox[0] * cubeProj[i][1] + nbox[1] * cubeProj[i][2] + nbox[2] * cubeProj[i][3];
+       }
+};
 
-               // Test axes for edge intersection
-               UCHAR bit = 1 ;
-               for ( j = 0 ; j < 3 ; j ++ )
+/**
+ * Testing intersection based on vertex/edge masks
+ */
+int getIntersectionMasks(UCHAR cedgemask, UCHAR& edgemask)
+{
+       int i, j;
+       edgemask = cedgemask;
+
+       // Pre-processing
+       /*
+          if ( cvertmask & 1 )
+          {
+           edgemask |= 5 ;
+          }
+          if ( cvertmask & 2 )
+          {
+           edgemask |= 3 ;
+          }
+          if ( cvertmask & 4 )
+          {
+           edgemask |= 6 ;
+          }
+
+        */
+
+       // Test axes for edge intersection
+       UCHAR bit = 1;
+       for (j = 0; j < 3; j++)
+       {
+               if (edgemask & bit)
                {
-                       if ( edgemask & bit )
+                       for (i = 0; i < 13; i++)
                        {
-                               for ( i = 0 ; i < 13 ; i ++ )
-                               {
-                                       LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
-                                       LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
+                               LONG proj0 = cubeProj[i][0] + cubeProj[i][4];
+                               LONG proj1 = cubeProj[i][0] + cubeProj[i][5];
 
-                                       if ( proj0 > inherit->trigEdgeProj[i][j][1] ||
-                                                proj1 < inherit->trigEdgeProj[i][j][0] )
-                                       {
-                                               edgemask &= ( ~ bit ) ;
-                                               break ;
-                                       }
+                               if (proj0 > inherit->trigEdgeProj[i][j][1] ||
+                                   proj1 < inherit->trigEdgeProj[i][j][0])
+                               {
+                                       edgemask &= (~bit);
+                                       break;
                                }
                        }
-                       bit <<= 1 ;
-               }
-               
-               /*
-               if ( edgemask != 0 )
-               {
-                       printf("%d %d\n", cedgemask, edgemask) ;
                }
-               */
+               bit <<= 1;
+       }
 
-               // Test axes for triangle intersection
-               if ( edgemask )
-               {
-                       return 1 ;
-               }
+       /*
+          if ( edgemask != 0 )
+          {
+           printf("%d %d\n", cedgemask, edgemask) ;
+          }
+        */
 
-               for ( i = 3 ; i < 13 ; i ++ )
-               {
-                       LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
-                       LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
+       // Test axes for triangle intersection
+       if (edgemask)
+       {
+               return 1;
+       }
 
-                       if ( proj0 > inherit->trigProj[i][1] ||
-                                proj1 < inherit->trigProj[i][0] )
-                       {
-                               return 0 ;
-                       }
+       for (i = 3; i < 13; i++)
+       {
+               LONG proj0 = cubeProj[i][0] + cubeProj[i][4];
+               LONG proj1 = cubeProj[i][0] + cubeProj[i][5];
+
+               if (proj0 > inherit->trigProj[i][1] ||
+                   proj1 < inherit->trigProj[i][0])
+               {
+                       return 0;
                }
-               
-               return 1 ;
        }
 
-       /**
-        * Retrieving children masks using PRIMARY AXES
-        */
-       UCHAR getChildrenMasks( UCHAR cvertmask, UCHAR vertmask[8] )
+       return 1;
+}
+
+/**
+ * Retrieving children masks using PRIMARY AXES
+ */
+UCHAR getChildrenMasks(UCHAR cvertmask, UCHAR vertmask[8])
+{
+       int i, j, k;
+       int bmask[3][2] = {{0, 0}, {0, 0}, {0, 0}};
+       int vmask[3][3][2] = {{{0, 0}, {0, 0}, {0, 0}}, {{0, 0}, {0, 0}, {0, 0}}, {{0, 0}, {0, 0}, {0, 0}}};
+       UCHAR boxmask = 0;
+       LONG len = cubeProj[0][1] >> 1;
+
+       for (i = 0; i < 3; i++)
        {
-               int i, j, k ;
-               int bmask[3][2] = {{0,0},{0,0},{0,0}} ;
-               int vmask[3][3][2] = {{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}}} ;
-               UCHAR boxmask = 0 ;
-               LONG len = cubeProj[0][1] >> 1 ;
-               
-               for ( i = 0 ; i < 3 ; i ++ )
-               {
-                       LONG mid = cubeProj[i][0] + len ;
+               LONG mid = cubeProj[i][0] + len;
 
-                       // Check bounding box
-                       if ( mid >= inherit->trigProj[i][0] ) 
-                       {
-                               bmask[i][0] = 1 ;
-                       }
-                       if ( mid <= inherit->trigProj[i][1] ) 
-                       {
-                               bmask[i][1] = 1 ;
-                       }
+               // Check bounding box
+               if (mid >= inherit->trigProj[i][0])
+               {
+                       bmask[i][0] = 1;
+               }
+               if (mid <= inherit->trigProj[i][1])
+               {
+                       bmask[i][1] = 1;
+               }
 
-                       // Check vertex mask
-                       if ( cvertmask )
+               // Check vertex mask
+               if (cvertmask)
+               {
+                       for (j = 0; j < 3; j++)
                        {
-                               for ( j = 0 ; j < 3 ; j ++ )
+                               if (cvertmask & (1 << j) )
                                {
-                                       if ( cvertmask & ( 1 << j ) )
+                                       // Only check if it's contained this node
+                                       if (mid >= inherit->trigVertProj[i][j])
                                        {
-                                               // Only check if it's contained this node
-                                               if ( mid >= inherit->trigVertProj[i][j] ) 
-                                               {
-                                                       vmask[i][j][0] = 1 ;
-                                               }
-                                               if ( mid <= inherit->trigVertProj[i][j] ) 
-                                               {
-                                                       vmask[i][j][1] = 1 ;
-                                               }
+                                               vmask[i][j][0] = 1;
                                        }
-                               }
-                       }
-
-                       /*
-                       // Check edge mask
-                       if ( cedgemask )
-                       {
-                               for ( j = 0 ; j < 3 ; j ++ )
-                               {
-                                       if ( cedgemask & ( 1 << j ) )
+                                       if (mid <= inherit->trigVertProj[i][j])
                                        {
-                                               // Only check if it's contained this node
-                                               if ( mid >= inherit->trigEdgeProj[i][j][0] ) 
-                                               {
-                                                       emask[i][j][0] = 1 ;
-                                               }
-                                               if ( mid <= inherit->trigEdgeProj[i][j][1] ) 
-                                               {
-                                                       emask[i][j][1] = 1 ;
-                                               }
+                                               vmask[i][j][1] = 1;
                                        }
                                }
                        }
-                       */
-
                }
 
-               // Fill in masks
-               int ct = 0 ;
-               for ( i = 0 ; i < 2 ; i ++ )
-                       for ( j = 0 ; j < 2 ; j ++ )
-                               for ( k = 0 ; k < 2 ; k ++ )
-                               {
-                                       boxmask |= ( ( bmask[0][i] & bmask[1][j] & bmask[2][k] ) << ct ) ;
-                                       vertmask[ct] = (( vmask[0][0][i] & vmask[1][0][j] & vmask[2][0][k] ) |
-                                                                  (( vmask[0][1][i] & vmask[1][1][j] & vmask[2][1][k] ) << 1 ) |
-                                                                  (( vmask[0][2][i] & vmask[1][2][j] & vmask[2][2][k] ) << 2 ) ) ;
-                                       /*
-                                       edgemask[ct] = (( emask[0][0][i] & emask[1][0][j] & emask[2][0][k] ) |
-                                                                  (( emask[0][1][i] & emask[1][1][j] & emask[2][1][k] ) << 1 ) |
-                                                                  (( emask[0][2][i] & emask[1][2][j] & emask[2][2][k] ) << 2 ) ) ;
-                                       edgemask[ct] = cedgemask ;
-                                       */
-                                       ct ++ ;
-                               }
+               /*
+                  // Check edge mask
+                  if ( cedgemask )
+                  {
+                   for ( j = 0 ; j < 3 ; j ++ )
+                   {
+                       if ( cedgemask & ( 1 << j ) )
+                       {
+                           // Only check if it's contained this node
+                           if ( mid >= inherit->trigEdgeProj[i][j][0] )
+                           {
+                               emask[i][j][0] = 1 ;
+                           }
+                           if ( mid <= inherit->trigEdgeProj[i][j][1] )
+                           {
+                               emask[i][j][1] = 1 ;
+                           }
+                       }
+                   }
+                  }
+                */
 
-               // Return bounding box masks
-               return boxmask ;
        }
 
-       UCHAR getBoxMask( )
+       // Fill in masks
+       int ct = 0;
+       for (i = 0; i < 2; i++)
+               for (j = 0; j < 2; j++)
+                       for (k = 0; k < 2; k++)
+                       {
+                               boxmask |= ( (bmask[0][i] & bmask[1][j] & bmask[2][k]) << ct);
+                               vertmask[ct] = ((vmask[0][0][i] & vmask[1][0][j] & vmask[2][0][k]) |
+                                               ((vmask[0][1][i] & vmask[1][1][j] & vmask[2][1][k]) << 1) |
+                                               ((vmask[0][2][i] & vmask[1][2][j] & vmask[2][2][k]) << 2) );
+                               /*
+                                  edgemask[ct] = (( emask[0][0][i] & emask[1][0][j] & emask[2][0][k] ) |
+                                              (( emask[0][1][i] & emask[1][1][j] & emask[2][1][k] ) << 1 ) |
+                                              (( emask[0][2][i] & emask[1][2][j] & emask[2][2][k] ) << 2 ) ) ;
+                                  edgemask[ct] = cedgemask ;
+                                */
+                               ct++;
+                       }
+
+       // Return bounding box masks
+       return boxmask;
+}
+
+UCHAR getBoxMask( )
+{
+       int i, j, k;
+       int bmask[3][2] = {{0, 0}, {0, 0}, {0, 0}};
+       UCHAR boxmask = 0;
+       LONG len = cubeProj[0][1] >> 1;
+
+       for (i = 0; i < 3; i++)
        {
-               int i, j, k ;
-               int bmask[3][2] = {{0,0},{0,0},{0,0}} ;
-               UCHAR boxmask = 0 ;
-               LONG len = cubeProj[0][1] >> 1 ;
-               
-               for ( i = 0 ; i < 3 ; i ++ )
+               LONG mid = cubeProj[i][0] + len;
+
+               // Check bounding box
+               if (mid >= inherit->trigProj[i][0])
+               {
+                       bmask[i][0] = 1;
+               }
+               if (mid <= inherit->trigProj[i][1])
                {
-                       LONG mid = cubeProj[i][0] + len ;
+                       bmask[i][1] = 1;
+               }
 
-                       // Check bounding box
-                       if ( mid >= inherit->trigProj[i][0] ) 
-                       {
-                               bmask[i][0] = 1 ;
-                       }
-                       if ( mid <= inherit->trigProj[i][1] ) 
+       }
+
+       // Fill in masks
+       int ct = 0;
+       for (i = 0; i < 2; i++)
+               for (j = 0; j < 2; j++)
+                       for (k = 0; k < 2; k++)
                        {
-                               bmask[i][1] = 1 ;
+                               boxmask |= ( (bmask[0][i] & bmask[1][j] & bmask[2][k]) << ct);
+                               ct++;
                        }
 
-               }
+       // Return bounding box masks
+       return boxmask;
+}
 
-               // Fill in masks
-               int ct = 0 ;
-               for ( i = 0 ; i < 2 ; i ++ )
-                       for ( j = 0 ; j < 2 ; j ++ )
-                               for ( k = 0 ; k < 2 ; k ++ )
-                               {
-                                       boxmask |= ( ( bmask[0][i] & bmask[1][j] & bmask[2][k] ) << ct ) ;
-                                       ct ++ ;
-                               }
 
-               // Return bounding box masks
-               return boxmask ;
-       }
+/**
+ * Get projections for sub-cubes (simple axes)
+ */
+void getSubProjectionsSimple(Projections *p[8])
+{
+       // Process the axes cooresponding to the triangle's normal
+       int ind = 3;
+       LONG len = cubeProj[0][1] >> 1;
+       LONG trigproj[3] = { cubeProj[ind][1] >> 1, cubeProj[ind][2] >> 1, cubeProj[ind][3] >> 1 };
+
+       int ct = 0;
+       for (int i = 0; i < 2; i++)
+               for (int j = 0; j < 2; j++)
+                       for (int k = 0; k < 2; k++)
+                       {
+                               p[ct] = new Projections( );
+                               p[ct]->inherit = inherit;
 
+                               p[ct]->cubeProj[0][0] = cubeProj[0][0] + i * len;
+                               p[ct]->cubeProj[1][0] = cubeProj[1][0] + j * len;
+                               p[ct]->cubeProj[2][0] = cubeProj[2][0] + k * len;
+                               p[ct]->cubeProj[0][1] = len;
 
-       /**
-        * Get projections for sub-cubes (simple axes)
-        */
-       void getSubProjectionsSimple( Projections* p[8] )
-       {
-               // Process the axes cooresponding to the triangle's normal
-               int ind = 3 ;
-               LONG len = cubeProj[ 0 ][ 1 ] >> 1 ;
-               LONG trigproj[3] = { cubeProj[ ind ][ 1 ] >> 1, cubeProj[ ind ][ 2 ] >> 1, cubeProj[ ind ][ 3 ] >> 1 } ;
-
-               int ct = 0 ; 
-               for ( int i = 0 ; i < 2 ; i ++ )
-                       for ( int j = 0 ; j < 2 ; j ++ )
-                               for ( int k = 0 ; k < 2 ; k ++ )
+                               for (int m = 1; m < 4; m++)
                                {
-                                       p[ct] = new Projections( ) ;
-                                       p[ct]->inherit = inherit ;
+                                       p[ct]->cubeProj[ind][m] = trigproj[m - 1];
+                               }
+                               p[ct]->cubeProj[ind][0] = cubeProj[ind][0] + i * trigproj[0] + j * trigproj[1] + k * trigproj[2];
 
-                                       p[ct]->cubeProj[ 0 ][ 0 ] = cubeProj[ 0 ][ 0 ] + i * len ;
-                                       p[ct]->cubeProj[ 1 ][ 0 ] = cubeProj[ 1 ][ 0 ] + j * len ;
-                                       p[ct]->cubeProj[ 2 ][ 0 ] = cubeProj[ 2 ][ 0 ] + k * len ;
-                                       p[ct]->cubeProj[ 0 ][ 1 ] = len ;
+                               ct++;
+                       }
+}
 
-                                       for ( int m = 1 ; m < 4 ; m ++ )
-                                       {
-                                               p[ct]->cubeProj[ ind ][ m ] = trigproj[ m - 1 ] ;
-                                       }
-                                       p[ct]->cubeProj[ ind ][ 0 ] = cubeProj[ ind ][0] + i * trigproj[0] + j * trigproj[1] + k * trigproj[2] ;
+/**
+ * Shifting a cube to a new origin
+ */
+void shift(int off[3])
+{
+       for (int i = 0; i < 13; i++)
+       {
+               cubeProj[i][0] += off[0] * cubeProj[i][1] + off[1] * cubeProj[i][2] + off[2] * cubeProj[i][3];
+       }
+}
 
-                                       ct ++ ;
-                               }
+void shiftNoPrimary(int off[3])
+{
+       for (int i = 3; i < 13; i++)
+       {
+               cubeProj[i][0] += off[0] * cubeProj[i][1] + off[1] * cubeProj[i][2] + off[2] * cubeProj[i][3];
        }
+}
 
-       /**
-        * Shifting a cube to a new origin
-        */
-       void shift ( int off[3] ) 
+/**
+ * Method to test intersection of the triangle and the cube
+ */
+int isIntersecting( )
+{
+       for (int i = 0; i < 13; i++)
        {
-               for ( int i = 0 ; i < 13 ; i ++ )
+               /*
+                  LONG proj0 = cubeProj[i][0] +
+                   vertmap[inherit->cubeEnds[i][0]][0] * cubeProj[i][1] +
+                   vertmap[inherit->cubeEnds[i][0]][1] * cubeProj[i][2] +
+                   vertmap[inherit->cubeEnds[i][0]][2] * cubeProj[i][3] ;
+                  LONG proj1 = cubeProj[i][0] +
+                   vertmap[inherit->cubeEnds[i][1]][0] * cubeProj[i][1] +
+                   vertmap[inherit->cubeEnds[i][1]][1] * cubeProj[i][2] +
+                   vertmap[inherit->cubeEnds[i][1]][2] * cubeProj[i][3] ;
+                */
+
+               LONG proj0 = cubeProj[i][0] + cubeProj[i][4];
+               LONG proj1 = cubeProj[i][0] + cubeProj[i][5];
+
+               if (proj0 > inherit->trigProj[i][1] ||
+                   proj1 < inherit->trigProj[i][0])
                {
-                       cubeProj[i][0] += off[0] * cubeProj[i][1] + off[1] * cubeProj[i][2] + off[2] * cubeProj[i][3] ;
+                       return 0;
                }
        }
 
-       void shiftNoPrimary ( int off[3] ) 
+       return 1;
+};
+
+int isIntersectingNoPrimary( )
+{
+       for (int i = 3; i < 13; i++)
        {
-               for ( int i = 3 ; i < 13 ; i ++ )
+               /*
+                  LONG proj0 = cubeProj[i][0] +
+                   vertmap[inherit->cubeEnds[i][0]][0] * cubeProj[i][1] +
+                   vertmap[inherit->cubeEnds[i][0]][1] * cubeProj[i][2] +
+                   vertmap[inherit->cubeEnds[i][0]][2] * cubeProj[i][3] ;
+                  LONG proj1 = cubeProj[i][0] +
+                   vertmap[inherit->cubeEnds[i][1]][0] * cubeProj[i][1] +
+                   vertmap[inherit->cubeEnds[i][1]][1] * cubeProj[i][2] +
+                   vertmap[inherit->cubeEnds[i][1]][2] * cubeProj[i][3] ;
+                */
+
+               LONG proj0 = cubeProj[i][0] + cubeProj[i][4];
+               LONG proj1 = cubeProj[i][0] + cubeProj[i][5];
+
+               if (proj0 > inherit->trigProj[i][1] ||
+                   proj1 < inherit->trigProj[i][0])
                {
-                       cubeProj[i][0] += off[0] * cubeProj[i][1] + off[1] * cubeProj[i][2] + off[2] * cubeProj[i][3] ;
+                       return 0;
                }
        }
 
-       /**
-        * Method to test intersection of the triangle and the cube
-        */
-       int isIntersecting ( ) 
+       return 1;
+};
+
+/**
+ * Method to test intersection of the triangle and one edge
+ */
+int isIntersecting(int edgeInd)
+{
+       for (int i = 0; i < 13; i++)
        {
-               for ( int i = 0 ; i < 13 ; i ++ )
+
+               LONG proj0 = cubeProj[i][0] +
+                            vertmap[edgemap[edgeInd][0]][0] * cubeProj[i][1] +
+                            vertmap[edgemap[edgeInd][0]][1] * cubeProj[i][2] +
+                            vertmap[edgemap[edgeInd][0]][2] * cubeProj[i][3];
+               LONG proj1 = cubeProj[i][0] +
+                            vertmap[edgemap[edgeInd][1]][0] * cubeProj[i][1] +
+                            vertmap[edgemap[edgeInd][1]][1] * cubeProj[i][2] +
+                            vertmap[edgemap[edgeInd][1]][2] * cubeProj[i][3];
+
+
+               if (proj0 < proj1)
                {
-                       /*
-                       LONG proj0 = cubeProj[i][0] + 
-                               vertmap[inherit->cubeEnds[i][0]][0] * cubeProj[i][1] + 
-                               vertmap[inherit->cubeEnds[i][0]][1] * cubeProj[i][2] + 
-                               vertmap[inherit->cubeEnds[i][0]][2] * cubeProj[i][3] ;
-                       LONG proj1 = cubeProj[i][0] + 
-                               vertmap[inherit->cubeEnds[i][1]][0] * cubeProj[i][1] + 
-                               vertmap[inherit->cubeEnds[i][1]][1] * cubeProj[i][2] + 
-                               vertmap[inherit->cubeEnds[i][1]][2] * cubeProj[i][3] ;
-                       */
-
-                       LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
-                       LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
-
-                       if ( proj0 > inherit->trigProj[i][1] ||
-                                proj1 < inherit->trigProj[i][0] )
+                       if (proj0 > inherit->trigProj[i][1] ||
+                           proj1 < inherit->trigProj[i][0])
                        {
-                               return 0 ;
+                               return 0;
                        }
                }
-               
-               return 1 ;
-       };
-
-       int isIntersectingNoPrimary ( ) 
-       {
-               for ( int i = 3 ; i < 13 ; i ++ )
-               {
-                       /*
-                       LONG proj0 = cubeProj[i][0] + 
-                               vertmap[inherit->cubeEnds[i][0]][0] * cubeProj[i][1] + 
-                               vertmap[inherit->cubeEnds[i][0]][1] * cubeProj[i][2] + 
-                               vertmap[inherit->cubeEnds[i][0]][2] * cubeProj[i][3] ;
-                       LONG proj1 = cubeProj[i][0] + 
-                               vertmap[inherit->cubeEnds[i][1]][0] * cubeProj[i][1] + 
-                               vertmap[inherit->cubeEnds[i][1]][1] * cubeProj[i][2] + 
-                               vertmap[inherit->cubeEnds[i][1]][2] * cubeProj[i][3] ;
-                       */
-
-                       LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
-                       LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
-
-                       if ( proj0 > inherit->trigProj[i][1] ||
-                                proj1 < inherit->trigProj[i][0] )
+               else {
+                       if (proj1 > inherit->trigProj[i][1] ||
+                           proj0 < inherit->trigProj[i][0])
                        {
-                               return 0 ;
+                               return 0;
                        }
                }
-               
-               return 1 ;
-       };      
-       
-       /**
-        * Method to test intersection of the triangle and one edge
-        */
-       int isIntersecting ( int edgeInd ) 
+       }
+
+       // printf( "Intersecting: %d %d\n", edgemap[edgeInd][0], edgemap[edgeInd][1] )  ;
+       return 1;
+};
+
+/**
+ * Method to test intersection of one triangle edge and one cube face
+ */
+int isIntersecting(int edgeInd, int faceInd)
+{
+       for (int i = 0; i < 13; i++)
        {
-               for ( int i = 0 ; i < 13 ; i ++ )
+               LONG trigproj0 = inherit->trigVertProj[i][edgeInd];
+               LONG trigproj1 = inherit->trigVertProj[i][(edgeInd + 1) % 3];
+
+               if (trigproj0 < trigproj1)
                {
-                       
-                       LONG proj0 = cubeProj[i][0] + 
-                               vertmap[edgemap[edgeInd][0]][0] * cubeProj[i][1] + 
-                               vertmap[edgemap[edgeInd][0]][1] * cubeProj[i][2] + 
-                               vertmap[edgemap[edgeInd][0]][2] * cubeProj[i][3] ;
-                       LONG proj1 = cubeProj[i][0] + 
-                               vertmap[edgemap[edgeInd][1]][0] * cubeProj[i][1] + 
-                               vertmap[edgemap[edgeInd][1]][1] * cubeProj[i][2] + 
-                               vertmap[edgemap[edgeInd][1]][2] * cubeProj[i][3] ;
-
-
-                       if ( proj0 < proj1 )
+                       int t1 = 1, t2 = 1;
+                       for (int j = 0; j < 4; j++)
                        {
-                               if ( proj0 > inherit->trigProj[i][1] ||
-                                        proj1 < inherit->trigProj[i][0] )
+                               LONG proj = cubeProj[i][0] +
+                                           vertmap[facemap[faceInd][j]][0] * cubeProj[i][1] +
+                                           vertmap[facemap[faceInd][j]][1] * cubeProj[i][2] +
+                                           vertmap[facemap[faceInd][j]][2] * cubeProj[i][3];
+                               if (proj >= trigproj0)
                                {
-                                       return 0 ;
+                                       t1 = 0;
                                }
-                       }
-                       else
-                       {
-                               if ( proj1 > inherit->trigProj[i][1] ||
-                                        proj0 < inherit->trigProj[i][0] )
+                               if (proj <= trigproj1)
                                {
-                                       return 0 ;
+                                       t2 = 0;
                                }
                        }
+                       if (t1 || t2)
+                       {
+                               return 0;
+                       }
                }
-               
-               // printf( "Intersecting: %d %d\n", edgemap[edgeInd][0], edgemap[edgeInd][1] )  ;
-               return 1 ;
-       };
-
-       /**
-        * Method to test intersection of one triangle edge and one cube face
-        */
-       int isIntersecting ( int edgeInd, int faceInd ) 
-       {
-               for ( int i = 0 ; i < 13 ; i ++ )
-               {
-                       LONG trigproj0 = inherit->trigVertProj[i][edgeInd] ;
-                       LONG trigproj1 = inherit->trigVertProj[i][(edgeInd+1)%3] ;
-
-                       if ( trigproj0 < trigproj1 )
+               else {
+                       int t1 = 1, t2 = 1;
+                       for (int j = 0; j < 4; j++)
                        {
-                               int t1 = 1 , t2 = 1 ;
-                               for ( int j = 0 ; j < 4 ; j ++ )
+                               LONG proj = cubeProj[i][0] +
+                                           vertmap[facemap[faceInd][j]][0] * cubeProj[i][1] +
+                                           vertmap[facemap[faceInd][j]][1] * cubeProj[i][2] +
+                                           vertmap[facemap[faceInd][j]][2] * cubeProj[i][3];
+                               if (proj >= trigproj1)
                                {
-                                       LONG proj = cubeProj[i][0] + 
-                                               vertmap[facemap[faceInd][j]][0] * cubeProj[i][1] + 
-                                               vertmap[facemap[faceInd][j]][1] * cubeProj[i][2] + 
-                                               vertmap[facemap[faceInd][j]][2] * cubeProj[i][3] ;
-                                       if ( proj >= trigproj0 )
-                                       {
-                                               t1 = 0 ;
-                                       }
-                                       if ( proj <= trigproj1 )
-                                       {
-                                               t2 = 0 ;
-                                       }
+                                       t1 = 0;
                                }
-                               if ( t1 || t2 )
+                               if (proj <= trigproj0)
                                {
-                                       return 0 ;
+                                       t2 = 0;
                                }
                        }
-                       else
+                       if (t1 || t2)
                        {
-                               int t1 = 1 , t2 = 1  ;
-                               for ( int j = 0 ; j < 4 ; j ++ )
-                               {
-                                       LONG proj = cubeProj[i][0] + 
-                                               vertmap[facemap[faceInd][j]][0] * cubeProj[i][1] + 
-                                               vertmap[facemap[faceInd][j]][1] * cubeProj[i][2] + 
-                                               vertmap[facemap[faceInd][j]][2] * cubeProj[i][3] ;
-                                       if ( proj >= trigproj1 ) 
-                                       {
-                                               t1 = 0 ;
-                                       }
-                                       if ( proj <= trigproj0 )
-                                       {
-                                               t2 = 0 ;
-                                       }
-                               }
-                               if ( t1 || t2 )
-                               {
-                                       return 0 ;
-                               }
+                               return 0;
                        }
                }
+       }
 
-               return 1 ;
-       };
+       return 1;
+};
 
 
-       int isIntersectingPrimary ( int edgeInd ) 
+int isIntersectingPrimary(int edgeInd)
+{
+       for (int i = 0; i < 13; i++)
        {
-               for ( int i = 0 ; i < 13 ; i ++ )
-               {
-                       
-                       LONG proj0 = cubeProj[i][0] ;
-                       LONG proj1 = cubeProj[i][0] + cubeProj[i][edgeInd + 1] ;
 
-                       if ( proj0 < proj1 )
-                       {
-                               if ( proj0 > inherit->trigProj[i][1] ||
-                                        proj1 < inherit->trigProj[i][0] )
-                               {
-                                       return 0 ;
-                               }
-                       }
-                       else
-                       {
-                               if ( proj1 > inherit->trigProj[i][1] ||
-                                        proj0 < inherit->trigProj[i][0] )
-                               {
-                                       return 0 ;
-                               }
-                       }
-
-               }
-               
-               // printf( "Intersecting: %d %d\n", edgemap[edgeInd][0], edgemap[edgeInd][1] )  ;
-               return 1 ;
-       };
-
-       double getIntersection ( int edgeInd ) 
-       {
-               int i = 3 ;
-
-               LONG proj0 = cubeProj[i][0] + 
-                       vertmap[edgemap[edgeInd][0]][0] * cubeProj[i][1] + 
-                       vertmap[edgemap[edgeInd][0]][1] * cubeProj[i][2] + 
-                       vertmap[edgemap[edgeInd][0]][2] * cubeProj[i][3] ;
-               LONG proj1 = cubeProj[i][0] + 
-                       vertmap[edgemap[edgeInd][1]][0] * cubeProj[i][1] + 
-                       vertmap[edgemap[edgeInd][1]][1] * cubeProj[i][2] + 
-                       vertmap[edgemap[edgeInd][1]][2] * cubeProj[i][3] ;
-               LONG proj2 = inherit->trigProj[i][1] ;
+               LONG proj0 = cubeProj[i][0];
+               LONG proj1 = cubeProj[i][0] + cubeProj[i][edgeInd + 1];
 
-               /*
-               if ( proj0 < proj1 )
+               if (proj0 < proj1)
                {
-                       if ( proj2 < proj0 || proj2 > proj1 )
+                       if (proj0 > inherit->trigProj[i][1] ||
+                           proj1 < inherit->trigProj[i][0])
                        {
-                               return -1 ;
+                               return 0;
                        }
                }
-               else
-               {
-                       if ( proj2 < proj1 || proj2 > proj0 )
+               else {
+                       if (proj1 > inherit->trigProj[i][1] ||
+                           proj0 < inherit->trigProj[i][0])
                        {
-                               return -1 ;
+                               return 0;
                        }
                }
-               */
 
-               double alpha = (double)( proj2 - proj0 ) / (double)( proj1 - proj0 ) ;
-               /*
-               if ( alpha < 0 )
-               {
-                       alpha = 0.5 ;
-               }
-               else if ( alpha > 1 )
-               {
-                       alpha = 0.5 ;
-               }
-               */
+       }
+
+       // printf( "Intersecting: %d %d\n", edgemap[edgeInd][0], edgemap[edgeInd][1] )  ;
+       return 1;
+};
 
-               return alpha ;
-       };
+double getIntersection(int edgeInd)
+{
+       int i = 3;
+
+       LONG proj0 = cubeProj[i][0] +
+                    vertmap[edgemap[edgeInd][0]][0] * cubeProj[i][1] +
+                    vertmap[edgemap[edgeInd][0]][1] * cubeProj[i][2] +
+                    vertmap[edgemap[edgeInd][0]][2] * cubeProj[i][3];
+       LONG proj1 = cubeProj[i][0] +
+                    vertmap[edgemap[edgeInd][1]][0] * cubeProj[i][1] +
+                    vertmap[edgemap[edgeInd][1]][1] * cubeProj[i][2] +
+                    vertmap[edgemap[edgeInd][1]][2] * cubeProj[i][3];
+       LONG proj2 = inherit->trigProj[i][1];
+
+       /*
+          if ( proj0 < proj1 )
+          {
+           if ( proj2 < proj0 || proj2 > proj1 )
+           {
+               return -1 ;
+           }
+          }
+          else
+          {
+           if ( proj2 < proj1 || proj2 > proj0 )
+           {
+               return -1 ;
+           }
+          }
+        */
 
-       float getIntersectionPrimary ( int edgeInd ) 
-       {
-               int i = 3 ;
+       double alpha = (double)(proj2 - proj0) / (double)(proj1 - proj0);
+       /*
+          if ( alpha < 0 )
+          {
+           alpha = 0.5 ;
+          }
+          else if ( alpha > 1 )
+          {
+           alpha = 0.5 ;
+          }
+        */
 
-               
-               LONG proj0 = cubeProj[i][0] ;
-               LONG proj1 = cubeProj[i][0] + cubeProj[i][edgeInd + 1] ;
-               LONG proj2 = inherit->trigProj[i][1] ;
+       return alpha;
+};
 
-               // double alpha = (double)( ( proj2 - proj0 ) * cubeProj[edgeInd][edgeInd + 1] ) / (double)( proj1 - proj0 ) ;
-               double alpha = (double)( ( proj2 - proj0 ) ) / (double)( proj1 - proj0 ) ;
-               
-               if ( alpha < 0 )
-               {
-                       alpha = 0.5 ;
-               }
-               else if ( alpha > 1 )
-               {
-                       alpha = 0.5 ;
-               }
-               
+float getIntersectionPrimary(int edgeInd)
+{
+       int i = 3;
 
-               return (float)alpha ;
-       };
 
-       /**
-        * Method to perform cross-product
-        */
-       void crossProduct ( LONG a[3], LONG b[3], LONG res[3] )
-       {
-               res[0] = a[1] * b[2] - a[2] * b[1] ;
-               res[1] = a[2] * b[0] - a[0] * b[2] ;
-               res[2] = a[0] * b[1] - a[1] * b[0] ;
-       }
-       void crossProduct ( double a[3], double b[3], double res[3] )
-       {
-               res[0] = a[1] * b[2] - a[2] * b[1] ;
-               res[1] = a[2] * b[0] - a[0] * b[2] ;
-               res[2] = a[0] * b[1] - a[1] * b[0] ;
-       }
+       LONG proj0 = cubeProj[i][0];
+       LONG proj1 = cubeProj[i][0] + cubeProj[i][edgeInd + 1];
+       LONG proj2 = inherit->trigProj[i][1];
+       LONG d = proj1 - proj0;
+       double alpha;
 
-       /**
-        * Method to perform dot product
-        */
-       LONG dotProduct ( LONG a[3], LONG b[3] )
-       {
-               return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] ;
+       if (d == 0)
+               alpha = 0.5;
+       else {
+               alpha = (double)((proj2 - proj0)) / (double)d;
+
+               if (alpha < 0 || alpha > 1)
+                       alpha = 0.5;
        }
 
-       void normalize( double a[3] )
+       return (float)alpha;
+};
+
+/**
+ * Method to perform cross-product
+ */
+void crossProduct(LONG a[3], LONG b[3], LONG res[3])
+{
+       res[0] = a[1] * b[2] - a[2] * b[1];
+       res[1] = a[2] * b[0] - a[0] * b[2];
+       res[2] = a[0] * b[1] - a[1] * b[0];
+}
+void crossProduct(double a[3], double b[3], double res[3])
+{
+       res[0] = a[1] * b[2] - a[2] * b[1];
+       res[1] = a[2] * b[0] - a[0] * b[2];
+       res[2] = a[0] * b[1] - a[1] * b[0];
+}
+
+/**
+ * Method to perform dot product
+ */
+LONG dotProduct(LONG a[3], LONG b[3])
+{
+       return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+void normalize(double a[3])
+{
+       double mag = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
+       if (mag > 0)
        {
-               double mag = a[0] * a[0] + a[1] * a[1] + a[2] * a[2] ;
-               if ( mag > 0 )
-               {
-                       mag = sqrt( mag ) ;
-                       a[0] /= mag ;
-                       a[1] /= mag ;
-                       a[2] /= mag ;
-               }
+               mag = sqrt(mag);
+               a[0] /= mag;
+               a[1] /= mag;
+               a[2] /= mag;
        }
+}
 
 };
 
index 61d7e2af2e85dfccc2cf50c140f731daecec9dcc..a2b5b46c72c783029efb25207e7700705532363b 100644 (file)
 #ifndef QUEUE_H
 #define QUEUE_H
 
-struct gridQueueEle
-{
+struct gridQueueEle {
        int x, y, z;
-       UCHAR dir ;
-       gridQueueEle* next ;
+       UCHAR dir;
+       gridQueueEle *next;
 };
 
 class GridQueue
 {
-       gridQueueEle* head ;
-       gridQueueEle* tail ;
-       int numEles ;
+gridQueueEle *head;
+gridQueueEle *tail;
+int numEles;
 
 public:
 
-       GridQueue( )
-       {
-               head = NULL ;
-               tail = NULL ;
-               numEles = 0 ;
-       }
+GridQueue( )
+{
+       head = NULL;
+       tail = NULL;
+       numEles = 0;
+}
+
+gridQueueEle *getHead( )
+{
+       return head;
+}
+
+int getNumElements( )
+{
+       return numEles;
+}
 
-       gridQueueEle* getHead( )
+
+void pushQueue(int st[3], int dir)
+{
+       gridQueueEle *ele = new gridQueueEle;
+       ele->x = st[0];
+       ele->y = st[1];
+       ele->z = st[2];
+       ele->dir = (UCHAR) dir;
+       ele->next = NULL;
+       if (head == NULL)
        {
-               return head ;
+               head = ele;
        }
+       else {
+               tail->next = ele;
+       }
+       tail = ele;
+       numEles++;
+}
 
-       int getNumElements( )
+int popQueue(int st[3], int& dir)
+{
+       if (head == NULL)
        {
-               return numEles ;
+               return 0;
        }
 
+       st[0] = head->x;
+       st[1] = head->y;
+       st[2] = head->z;
+       dir = (int) (head->dir);
 
-       void pushQueue( int st[3], int dir )
-       {
-               gridQueueEle* ele = new gridQueueEle ;
-               ele->x = st[0] ;
-               ele->y = st[1] ;
-               ele->z = st[2] ;
-               ele->dir = (UCHAR) dir ;
-               ele->next = NULL ;
-               if ( head == NULL )
-               {
-                       head = ele ;
-               }
-               else
-               {
-                       tail->next = ele ;
-               }
-               tail = ele ;
-               numEles ++ ;
-       }
+       gridQueueEle *temp = head;
+       head = head->next;
+       delete temp;
 
-       int popQueue( int st[3], int& dir )
+       if (head == NULL)
        {
-               if ( head == NULL )
-               {
-                       return 0 ;
-               }
-
-               st[0] = head->x ;
-               st[1] = head->y ;
-               st[2] = head->z ;
-               dir = (int) (head->dir) ;
-
-               gridQueueEle* temp = head ;
-               head = head->next ;
-               delete temp ;
-
-               if ( head == NULL )
-               {
-                       tail = NULL ;
-               }
-               numEles -- ;
-
-               return 1 ;
+               tail = NULL;
        }
+       numEles--;
+
+       return 1;
+}
 
 };
 
index 0cdd791a64916fd9ddc556ddbf0f40cff8d5ce94..8b5125e261a0ddd2e8526b6400599e0a50bd1126 100644 (file)
 class Cubes
 {
 public:
-       /// Get number of triangles
-       int getNumTriangle(int mask)
-       {
-               return marching_cubes_numtri[mask];
-       }
+/// Get number of triangles
+int getNumTriangle(int mask)
+{
+       return marching_cubes_numtri[mask];
+}
 
-       /// Get a triangle
-       void getTriangle(int mask, int index, int indices[3] )
-       {
-               for(int i = 0; i < 3; i++)
-                       indices[i] = marching_cubes_tris[mask][index][i];
-       }
+/// Get a triangle
+void getTriangle(int mask, int index, int indices[3])
+{
+       for (int i = 0; i < 3; i++)
+               indices[i] = marching_cubes_tris[mask][index][i];
+}
 };
 
 #endif
index af5ada71146f633b08be337dd96b6a3517a0c5e9..894ab6b087392e23d9d85189e11506251a3390e2 100644 (file)
@@ -40,166 +40,169 @@ void veccopy(float dst[3], const float src[3])
 }
 
 #define GET_FACE(_mesh, _n) \
-       (*(DualConFaces)(((char*)(_mesh)->faces) + ((_n) * (_mesh)->face_stride)))
+       (*(DualConFaces)(((char *)(_mesh)->faces) + ((_n) * (_mesh)->face_stride)))
 
 #define GET_CO(_mesh, _n) \
-       (*(DualConCo)(((char*)(_mesh)->co) + ((_n) * (_mesh)->co_stride)))
+       (*(DualConCo)(((char *)(_mesh)->co) + ((_n) * (_mesh)->co_stride)))
 
 class DualConInputReader : public ModelReader
 {
 private:
-       const DualConInput *input_mesh;
-       int tottri, curface, offset;
-       float min[3], max[3], maxsize;
-       float scale;
+const DualConInput *input_mesh;
+int tottri, curface, offset;
+float min[3], max[3], maxsize;
+float scale;
 public:
-       DualConInputReader(const DualConInput *mesh, float _scale)
+DualConInputReader(const DualConInput *mesh, float _scale)
        : input_mesh(mesh), scale(_scale)
-       {
-               reset();
+{
+       reset();
+}
+
+void reset()
+{
+       tottri = 0;
+       curface = 0;
+       offset = 0;
+       maxsize = 0;
+
+       /* initialize tottri */
+       for (int i = 0; i < input_mesh->totface; i++)
+               tottri += GET_FACE(input_mesh, i)[3] ? 2 : 1;
+
+       veccopy(min, input_mesh->min);
+       veccopy(max, input_mesh->max);
+
+       /* initialize maxsize */
+       for (int i = 0; i < 3; i++) {
+               float d = max[i] - min[i];
+               if (d > maxsize)
+                       maxsize = d;
        }
 
-       void reset()
+       /* redo the bounds */
+       for (int i = 0; i < 3; i++)
        {
-               tottri = 0;
-               curface = 0;
-               offset = 0;
-               maxsize = 0;
-
-               /* initialize tottri */
-               for(int i = 0; i < input_mesh->totface; i++)
-                       tottri += GET_FACE(input_mesh, i)[3] ? 2 : 1;
+               min[i] = (max[i] + min[i]) / 2 - maxsize / 2;
+               max[i] = (max[i] + min[i]) / 2 + maxsize / 2;
+       }
 
-               veccopy(min, input_mesh->min);
-               veccopy(max, input_mesh->max);
+       for (int i = 0; i < 3; i++)
+               min[i] -= maxsize * (1 / scale - 1) / 2;
+       maxsize *= 1 / scale;
+}
 
-               /* initialize maxsize */
-               for(int i = 0; i < 3; i++) {
-                       float d = max[i] - min[i];
-                       if(d > maxsize)
-                               maxsize = d;
-               }
+Triangle *getNextTriangle()
+{
+       if (curface == input_mesh->totface)
+               return 0;
 
-               /* redo the bounds */
-               for(int i = 0; i < 3; i++)
-               {
-                       min[i] = (max[i] + min[i]) / 2 - maxsize / 2;
-                       max[i] = (max[i] + min[i]) / 2 + maxsize / 2;
-               }
+       Triangle *t = new Triangle();
 
-               for(int i = 0; i < 3; i++)
-                       min[i] -= maxsize * (1 / scale - 1) / 2;
-               maxsize *= 1 / scale;
+       unsigned int *f = GET_FACE(input_mesh, curface);
+       if (offset == 0) {
+               veccopy(t->vt[0], GET_CO(input_mesh, f[0]));
+               veccopy(t->vt[1], GET_CO(input_mesh, f[1]));
+               veccopy(t->vt[2], GET_CO(input_mesh, f[2]));
+       }
+       else {
+               veccopy(t->vt[0], GET_CO(input_mesh, f[2]));
+               veccopy(t->vt[1], GET_CO(input_mesh, f[3]));
+               veccopy(t->vt[2], GET_CO(input_mesh, f[0]));
        }
 
-       Triangle* getNextTriangle()
-       {
-               if(curface == input_mesh->totface)
-                       return 0;
-
-               Triangle* t = new Triangle();
-               
-               unsigned int *f = GET_FACE(input_mesh, curface);
-               if(offset == 0) {
-                       veccopy(t->vt[0], GET_CO(input_mesh, f[0]));
-                       veccopy(t->vt[1], GET_CO(input_mesh, f[1]));
-                       veccopy(t->vt[2], GET_CO(input_mesh, f[2]));
-               }
-               else {
-                       veccopy(t->vt[0], GET_CO(input_mesh, f[2]));
-                       veccopy(t->vt[1], GET_CO(input_mesh, f[3]));
-                       veccopy(t->vt[2], GET_CO(input_mesh, f[0]));
-               }
-
-               if(offset == 0 && f[3])
-                       offset++;
-               else {
-                       offset = 0;
-                       curface++;
-               }
-
-               /* remove triangle if it contains invalid coords */
-               for(int i = 0; i < 3; i++) {
-                       const float *co = t->vt[i];
-                       if(isnan(co[0]) || isnan(co[1]) || isnan(co[2])) {
-                               delete t;
-                               return getNextTriangle();
-                       }
-               }
-
-               return t;
+       if (offset == 0 && f[3])
+               offset++;
+       else {
+               offset = 0;
+               curface++;
        }
 
-       int getNextTriangle(int t[3])
-       {
-               if(curface == input_mesh->totface)
-                       return 0;
-               
-               unsigned int *f = GET_FACE(input_mesh, curface);
-               if(offset == 0) {
-                       t[0] = f[0];
-                       t[1] = f[1];
-                       t[2] = f[2];
-               }
-               else {
-                       t[0] = f[2];
-                       t[1] = f[3];
-                       t[2] = f[0];
+       /* remove triangle if it contains invalid coords */
+       for (int i = 0; i < 3; i++) {
+               const float *co = t->vt[i];
+               if (isnan(co[0]) || isnan(co[1]) || isnan(co[2])) {
+                       delete t;
+                       return getNextTriangle();
                }
+       }
 
-               if(offset == 0 && f[3])
-                       offset++;
-               else {
-                       offset = 0;
-                       curface++;
-               }
+       return t;
+}
 
-               return 1;
+int getNextTriangle(int t[3])
+{
+       if (curface == input_mesh->totface)
+               return 0;
+
+       unsigned int *f = GET_FACE(input_mesh, curface);
+       if (offset == 0) {
+               t[0] = f[0];
+               t[1] = f[1];
+               t[2] = f[2];
        }
-
-       int getNumTriangles()
-       {
-               return tottri;
+       else {
+               t[0] = f[2];
+               t[1] = f[3];
+               t[2] = f[0];
        }
 
-       int getNumVertices()
-       {
-               return input_mesh->totco;
+       if (offset == 0 && f[3])
+               offset++;
+       else {
+               offset = 0;
+               curface++;
        }
 
-       float getBoundingBox(float origin[3])
-       {
-               veccopy(origin, min);
-               return maxsize ;
-       }
+       return 1;
+}
 
-       /* output */
-       void getNextVertex(float v[3])
-       {
-               /* not used */
-       }
+int getNumTriangles()
+{
+       return tottri;
+}
+
+int getNumVertices()
+{
+       return input_mesh->totco;
+}
+
+float getBoundingBox(float origin[3])
+{
+       veccopy(origin, min);
+       return maxsize;
+}
+
+/* output */
+void getNextVertex(float v[3])
+{
+       /* not used */
+}
 
-       /* stubs */
-       void printInfo() {}
-       int getMemory() { return sizeof(DualConInputReader); }
+/* stubs */
+void printInfo() {
+}
+int getMemory() {
+       return sizeof(DualConInputReader);
+}
 };
 
 void *dualcon(const DualConInput *input_mesh,
-                         /* callbacks for output */
-                         DualConAllocOutput alloc_output,
-                         DualConAddVert add_vert,
-                         DualConAddQuad add_quad,
-                                        
-                         DualConFlags flags,
-                         DualConMode mode,
-                         float threshold,
-                         float hermite_num,
-                         float scale,
-                         int depth)
+              /* callbacks for output */
+              DualConAllocOutput alloc_output,
+              DualConAddVert add_vert,
+              DualConAddQuad add_quad,
+
+              DualConFlags flags,
+              DualConMode mode,
+              float threshold,
+              float hermite_num,
+              float scale,
+              int depth)
 {
        DualConInputReader r(input_mesh, scale);
        Octree o(&r, alloc_output, add_vert, add_quad,
-                        flags, mode, depth, threshold, hermite_num);
+                flags, mode, depth, threshold, hermite_num);
        o.scanConvert();
        return o.getOutputMesh();
 }
index 4c78108deb5abfb3fbb732615de27ec171b5c93f..012757e8a25b04709efc65bb5d209fa63a6cf39e 100644 (file)
@@ -39,516 +39,516 @@ const int marching_cubes_numtri[TOTCONF] = {
 
 /* table of triangles in each configuration */
 const int marching_cubes_tris[TOTCONF][MAX_TRIS][3] = {
-       {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,8}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,1,5}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,1}, {4,1,5}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,9,2}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,8,9}, {0,9,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,5,9}, {1,9,2}, {1,2,4}, {1,4,8}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,1,5}, {0,5,9}, {0,9,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,3,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,8,5}, {0,5,3}, {0,3,9}, {0,9,4}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,1,3}, {8,3,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,1}, {4,1,3}, {4,3,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,5,3}, {4,3,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,8,5}, {0,5,3}, {0,3,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,1}, {4,1,3}, {4,3,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,1,3}, {0,3,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,6,10}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,4,6}, {8,6,10}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,10,1}, {6,1,5}, {6,5,8}, {6,8,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,6,10}, {4,10,1}, {4,1,5}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,4}, {10,4,9}, {10,9,2}, {10,2,6}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,10,8}, {6,8,9}, {6,9,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {6,10,1}, {6,1,5}, {6,5,9}, {6,9,2},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,10,1}, {6,1,5}, {6,5,9}, {6,9,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,5}, {0,6,9}, {9,5,0}, {6,10,3}, {5,3,10},
-        {3,9,6}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,5}, {10,5,3}, {9,4,6}, {6,10,3}, {6,3,9},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,3}, {9,8,0}, {9,0,6}, {6,10,3}, {6,3,9},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,6,10}, {4,10,1}, {4,1,3}, {4,3,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,4,5}, {3,2,6}, {3,6,10}, {10,0,5}, {10,5,3},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,10,8}, {6,8,5}, {6,5,3}, {6,3,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {6,10,1}, {6,1,3}, {6,3,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,10,1}, {6,1,3}, {6,3,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,7,1}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,10}, {4,10,7}, {4,7,1}, {4,1,8}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,10,7}, {8,7,5}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,10}, {4,10,7}, {4,7,5}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,2,4}, {10,4,1}, {7,2,10}, {1,9,7}, {1,4,9},
-        {9,2,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,8,9}, {2,0,10}, {2,10,7}, {7,1,9}, {7,9,2},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {7,5,9}, {7,9,2}, {2,4,10}, {2,10,7},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,7}, {0,7,5}, {0,5,9}, {0,9,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,7,3}, {10,3,9}, {10,9,5}, {10,5,1}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {4,0,10}, {4,10,7}, {4,7,3}, {4,3,9},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,10,7}, {8,7,3}, {8,3,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,10}, {4,10,7}, {4,7,3}, {4,3,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,5,1}, {4,1,10}, {7,3,2}, {2,4,10}, {2,10,7},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {0,10,7}, {0,7,3}, {0,3,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {4,10,7}, {4,7,3}, {4,3,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,7}, {0,7,3}, {0,3,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,6,7}, {0,7,1}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,4,6}, {8,6,7}, {8,7,1}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,6}, {8,6,7}, {8,7,5}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,6,7}, {4,7,5}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,0,4}, {1,4,9}, {2,6,7}, {7,1,9}, {7,9,2},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,7,1}, {6,1,8}, {6,8,9}, {6,9,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {6,7,5}, {6,5,9}, {6,9,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,7,5}, {6,5,9}, {6,9,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,0}, {6,7,3}, {6,3,9}, {9,5,0}, {9,0,6},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {4,6,7}, {4,7,3}, {4,3,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,6}, {8,6,7}, {8,7,3}, {8,3,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,6,7}, {4,7,3}, {4,3,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,4,5}, {0,5,1}, {6,7,3}, {6,3,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {6,7,3}, {6,3,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {6,7,3}, {6,3,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,7,3}, {6,3,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,2,11}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,4,2}, {8,2,11}, {8,11,6}, {8,6,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,1,6}, {6,1,11}, {11,1,5}, {2,11,5}, {2,5,8},
-        {6,2,8}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {5,4,2}, {5,2,11}, {11,6,1}, {11,1,5},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,9}, {6,9,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,8}, {6,8,9}, {6,9,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,8}, {6,8,1}, {5,9,11}, {11,6,1}, {11,1,5},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {6,1,5}, {6,5,9}, {6,9,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,2,9}, {6,9,5}, {6,5,3}, {6,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,2,9}, {6,0,8}, {6,8,5}, {6,5,3}, {6,3,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{2,9,8}, {1,3,11}, {1,11,6}, {6,2,8}, {6,8,1},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,2,9}, {6,0,1}, {6,1,3}, {6,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,5}, {6,5,3}, {6,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,8}, {6,8,5}, {6,5,3}, {6,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,8}, {6,8,1}, {6,1,3}, {6,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {6,1,3}, {6,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,2}, {10,2,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,4}, {10,4,2}, {10,2,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,2}, {11,10,1}, {11,1,5}, {5,8,2}, {5,2,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,5}, {10,5,4}, {10,4,2}, {10,2,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,4}, {10,4,9}, {10,9,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,9}, {10,9,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {10,1,5}, {10,5,9}, {10,9,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,5}, {10,5,9}, {10,9,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,2,9}, {0,9,5}, {3,11,10}, {10,0,5}, {10,5,3},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,2,9}, {10,8,5}, {10,5,3}, {10,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,2}, {8,2,9}, {10,1,3}, {10,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,2,9}, {10,1,3}, {10,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,4}, {10,4,5}, {10,5,3}, {10,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,5}, {10,5,3}, {10,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {10,1,3}, {10,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,3}, {10,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,10,6}, {1,6,2}, {1,2,11}, {1,11,7}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {7,1,8}, {7,8,4}, {7,4,2}, {7,2,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,10,6}, {8,6,2}, {11,7,5}, {5,8,2}, {5,2,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {7,5,4}, {7,4,2}, {7,2,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,6,4}, {9,11,7}, {9,7,1}, {1,10,4}, {1,4,9},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {7,1,8}, {7,8,9}, {7,9,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {4,10,6}, {7,5,9}, {7,9,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {7,5,9}, {7,9,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,10}, {5,10,6}, {5,6,2}, {5,2,9}, {7,3,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {8,5,1}, {4,2,9}, {7,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,10,6}, {8,6,2}, {8,2,9}, {7,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {4,2,9}, {7,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,6,4}, {10,4,5}, {10,5,1}, {7,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {8,5,1}, {7,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {4,10,6}, {7,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,1,0}, {7,0,2}, {7,2,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,1,8}, {7,8,4}, {7,4,2}, {7,2,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,5,8}, {7,8,0}, {7,0,2}, {7,2,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,5,4}, {7,4,2}, {7,2,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,1,0}, {7,0,4}, {7,4,9}, {7,9,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,1,8}, {7,8,9}, {7,9,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {7,5,9}, {7,9,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,5,9}, {7,9,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,0}, {5,0,2}, {5,2,9}, {7,3,11}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {4,2,9}, {7,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,2}, {8,2,9}, {7,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,2,9}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,4,5}, {0,5,1}, {7,3,11}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,3,11}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,11,3}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,11,0}, {7,0,8}, {0,11,4}, {8,3,7}, {11,3,4},
-        {3,8,4}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,1,7}, {8,7,11}, {8,11,3}, {8,3,5}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,1,7}, {0,7,11}, {3,5,4}, {4,0,11}, {4,11,3},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,9,3}, {4,3,7}, {4,7,11}, {4,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,9,3}, {8,3,7}, {11,2,0}, {0,8,7}, {0,7,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,9,3}, {4,8,1}, {4,1,7}, {4,7,11}, {4,11,2},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,9,3}, {0,1,7}, {0,7,11}, {0,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,7,11}, {5,11,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,7}, {11,9,4}, {11,4,0}, {0,8,7}, {0,7,11},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,1,7}, {8,7,11}, {8,11,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,1}, {4,1,7}, {4,7,11}, {4,11,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,5,7}, {4,7,11}, {4,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,8,5}, {0,5,7}, {0,7,11}, {0,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,1}, {4,1,7}, {4,7,11}, {4,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,1,7}, {0,7,11}, {0,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,6,11}, {0,11,3}, {0,3,7}, {0,7,10}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,8}, {4,6,11}, {4,11,3}, {3,7,8}, {3,8,4},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {5,8,0}, {5,0,6}, {5,6,11}, {5,11,3},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {5,4,6}, {5,6,11}, {5,11,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,0}, {7,0,4}, {7,4,9}, {7,9,3}, {6,11,2},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,8}, {7,8,9}, {7,9,3}, {6,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {10,1,7}, {5,9,3}, {6,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {5,9,3}, {6,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,7,10}, {5,10,0}, {6,11,9}, {9,5,0}, {9,0,6},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,5}, {10,5,7}, {4,6,11}, {4,11,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {8,0,6}, {8,6,11}, {8,11,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {4,6,11}, {4,11,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,4}, {10,4,5}, {10,5,7}, {6,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,5}, {10,5,7}, {6,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {10,1,7}, {6,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,10,11}, {1,11,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,11}, {3,1,8}, {3,8,4}, {4,0,11}, {4,11,3},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,8,10}, {5,10,11}, {5,11,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,4,0}, {5,0,10}, {5,10,11}, {5,11,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{9,3,1}, {10,11,2}, {10,2,4}, {4,9,1}, {4,1,10},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,8,9}, {1,9,3}, {0,10,11}, {0,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,9,3}, {4,8,10}, {4,10,11}, {4,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,9,3}, {0,10,11}, {0,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,10}, {5,10,11}, {5,11,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {4,0,10}, {4,10,11}, {4,11,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,10,11}, {8,11,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,0,10}, {4,10,11}, {4,11,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,5,1}, {4,1,10}, {4,10,11}, {4,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {0,10,11}, {0,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {4,10,11}, {4,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,11}, {0,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,0,6}, {1,6,11}, {1,11,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,8,4}, {1,4,6}, {1,6,11}, {1,11,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,8,0}, {5,0,6}, {5,6,11}, {5,11,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,4,6}, {5,6,11}, {5,11,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,0,4}, {1,4,9}, {1,9,3}, {6,11,2}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,8,9}, {1,9,3}, {6,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {5,9,3}, {6,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,9,3}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,0}, {5,0,6}, {5,6,11}, {5,11,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {4,6,11}, {4,11,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,6}, {8,6,11}, {8,11,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,6,11}, {4,11,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,4,5}, {0,5,1}, {6,11,2}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,11,2}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,6,2}, {7,2,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,6,0}, {7,0,8}, {4,2,3}, {3,7,8}, {3,8,4},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,7,6}, {2,3,5}, {2,5,8}, {8,1,6}, {8,6,2},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {6,1,7}, {5,4,2}, {5,2,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,6,4}, {7,4,9}, {7,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,6,0}, {7,0,8}, {7,8,9}, {7,9,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,8}, {6,8,1}, {6,1,7}, {5,9,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {6,1,7}, {5,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,7,6}, {5,6,2}, {5,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,8}, {6,8,5}, {6,5,7}, {4,2,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,1,7}, {8,7,6}, {8,6,2}, {8,2,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {6,1,7}, {4,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,5}, {6,5,7}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,8}, {6,8,5}, {6,5,7}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,4,8}, {6,8,1}, {6,1,7}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{6,0,1}, {6,1,7}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,0}, {7,0,2}, {7,2,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,8}, {7,8,4}, {7,4,2}, {7,2,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {5,8,0}, {5,0,2}, {5,2,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {5,4,2}, {5,2,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,0}, {7,0,4}, {7,4,9}, {7,9,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{7,10,8}, {7,8,9}, {7,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {10,1,7}, {5,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {5,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,7,10}, {5,10,0}, {5,0,2}, {5,2,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,5}, {10,5,7}, {4,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {8,0,2}, {8,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {4,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,0,4}, {10,4,5}, {10,5,7}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,8,5}, {10,5,7}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {10,1,7}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,1,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,10,6}, {1,6,2}, {1,2,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {1,8,4}, {1,4,2}, {1,2,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,8,10}, {5,10,6}, {5,6,2}, {5,2,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {5,4,2}, {5,2,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,10,6}, {1,6,4}, {1,4,9}, {1,9,3}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {1,8,9}, {1,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {4,10,6}, {5,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {5,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,10}, {5,10,6}, {5,6,2}, {5,2,9}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {8,5,1}, {4,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,10,6}, {8,6,2}, {8,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {4,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{10,6,4}, {10,4,5}, {10,5,1}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {8,5,1}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,10}, {4,10,6}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,10,6}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,0,2}, {1,2,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,8,4}, {1,4,2}, {1,2,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,8,0}, {5,0,2}, {5,2,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,4,2}, {5,2,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,0,4}, {1,4,9}, {1,9,3}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{1,8,9}, {1,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {5,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,9,3}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{5,1,0}, {5,0,2}, {5,2,9}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {4,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,0,2}, {8,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,2,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,4,5}, {0,5,1}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{8,5,1}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{4,8,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
-       {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
-        {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}}
+       {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 8}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 1, 5}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 1}, {4, 1, 5}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 9, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 8, 9}, {0, 9, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 5, 9}, {1, 9, 2}, {1, 2, 4}, {1, 4, 8}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 1, 5}, {0, 5, 9}, {0, 9, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 3, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 8, 5}, {0, 5, 3}, {0, 3, 9}, {0, 9, 4}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 1, 3}, {8, 3, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 1}, {4, 1, 3}, {4, 3, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 5, 3}, {4, 3, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 8, 5}, {0, 5, 3}, {0, 3, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 1}, {4, 1, 3}, {4, 3, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 1, 3}, {0, 3, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 6, 10}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 4, 6}, {8, 6, 10}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 10, 1}, {6, 1, 5}, {6, 5, 8}, {6, 8, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 6, 10}, {4, 10, 1}, {4, 1, 5}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 4}, {10, 4, 9}, {10, 9, 2}, {10, 2, 6}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 10, 8}, {6, 8, 9}, {6, 9, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {6, 10, 1}, {6, 1, 5}, {6, 5, 9}, {6, 9, 2},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 10, 1}, {6, 1, 5}, {6, 5, 9}, {6, 9, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 5}, {0, 6, 9}, {9, 5, 0}, {6, 10, 3}, {5, 3, 10},
+        {3, 9, 6}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 5}, {10, 5, 3}, {9, 4, 6}, {6, 10, 3}, {6, 3, 9},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 3}, {9, 8, 0}, {9, 0, 6}, {6, 10, 3}, {6, 3, 9},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 6, 10}, {4, 10, 1}, {4, 1, 3}, {4, 3, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 4, 5}, {3, 2, 6}, {3, 6, 10}, {10, 0, 5}, {10, 5, 3},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 10, 8}, {6, 8, 5}, {6, 5, 3}, {6, 3, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {6, 10, 1}, {6, 1, 3}, {6, 3, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 10, 1}, {6, 1, 3}, {6, 3, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 7, 1}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 10}, {4, 10, 7}, {4, 7, 1}, {4, 1, 8}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 10, 7}, {8, 7, 5}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 10}, {4, 10, 7}, {4, 7, 5}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 2, 4}, {10, 4, 1}, {7, 2, 10}, {1, 9, 7}, {1, 4, 9},
+        {9, 2, 7}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 8, 9}, {2, 0, 10}, {2, 10, 7}, {7, 1, 9}, {7, 9, 2},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {7, 5, 9}, {7, 9, 2}, {2, 4, 10}, {2, 10, 7},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 7}, {0, 7, 5}, {0, 5, 9}, {0, 9, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 7, 3}, {10, 3, 9}, {10, 9, 5}, {10, 5, 1}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {4, 0, 10}, {4, 10, 7}, {4, 7, 3}, {4, 3, 9},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 10, 7}, {8, 7, 3}, {8, 3, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 10}, {4, 10, 7}, {4, 7, 3}, {4, 3, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 5, 1}, {4, 1, 10}, {7, 3, 2}, {2, 4, 10}, {2, 10, 7},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {0, 10, 7}, {0, 7, 3}, {0, 3, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {4, 10, 7}, {4, 7, 3}, {4, 3, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 7}, {0, 7, 3}, {0, 3, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 6, 7}, {0, 7, 1}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 4, 6}, {8, 6, 7}, {8, 7, 1}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 6}, {8, 6, 7}, {8, 7, 5}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 6, 7}, {4, 7, 5}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 0, 4}, {1, 4, 9}, {2, 6, 7}, {7, 1, 9}, {7, 9, 2},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 7, 1}, {6, 1, 8}, {6, 8, 9}, {6, 9, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {6, 7, 5}, {6, 5, 9}, {6, 9, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 7, 5}, {6, 5, 9}, {6, 9, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 0}, {6, 7, 3}, {6, 3, 9}, {9, 5, 0}, {9, 0, 6},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {4, 6, 7}, {4, 7, 3}, {4, 3, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 6}, {8, 6, 7}, {8, 7, 3}, {8, 3, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 6, 7}, {4, 7, 3}, {4, 3, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 4, 5}, {0, 5, 1}, {6, 7, 3}, {6, 3, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {6, 7, 3}, {6, 3, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {6, 7, 3}, {6, 3, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 7, 3}, {6, 3, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 2, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 4, 2}, {8, 2, 11}, {8, 11, 6}, {8, 6, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 1, 6}, {6, 1, 11}, {11, 1, 5}, {2, 11, 5}, {2, 5, 8},
+        {6, 2, 8}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {5, 4, 2}, {5, 2, 11}, {11, 6, 1}, {11, 1, 5},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 9}, {6, 9, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 8}, {6, 8, 9}, {6, 9, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 8}, {6, 8, 1}, {5, 9, 11}, {11, 6, 1}, {11, 1, 5},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {6, 1, 5}, {6, 5, 9}, {6, 9, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 2, 9}, {6, 9, 5}, {6, 5, 3}, {6, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 2, 9}, {6, 0, 8}, {6, 8, 5}, {6, 5, 3}, {6, 3, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{2, 9, 8}, {1, 3, 11}, {1, 11, 6}, {6, 2, 8}, {6, 8, 1},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 2, 9}, {6, 0, 1}, {6, 1, 3}, {6, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 5}, {6, 5, 3}, {6, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 8}, {6, 8, 5}, {6, 5, 3}, {6, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 8}, {6, 8, 1}, {6, 1, 3}, {6, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {6, 1, 3}, {6, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 2}, {10, 2, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 4}, {10, 4, 2}, {10, 2, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 2}, {11, 10, 1}, {11, 1, 5}, {5, 8, 2}, {5, 2, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 5}, {10, 5, 4}, {10, 4, 2}, {10, 2, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 4}, {10, 4, 9}, {10, 9, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 9}, {10, 9, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {10, 1, 5}, {10, 5, 9}, {10, 9, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 5}, {10, 5, 9}, {10, 9, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 2, 9}, {0, 9, 5}, {3, 11, 10}, {10, 0, 5}, {10, 5, 3},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 2, 9}, {10, 8, 5}, {10, 5, 3}, {10, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 2}, {8, 2, 9}, {10, 1, 3}, {10, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 2, 9}, {10, 1, 3}, {10, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 4}, {10, 4, 5}, {10, 5, 3}, {10, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 5}, {10, 5, 3}, {10, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {10, 1, 3}, {10, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 3}, {10, 3, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 10, 6}, {1, 6, 2}, {1, 2, 11}, {1, 11, 7}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {7, 1, 8}, {7, 8, 4}, {7, 4, 2}, {7, 2, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 10, 6}, {8, 6, 2}, {11, 7, 5}, {5, 8, 2}, {5, 2, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {7, 5, 4}, {7, 4, 2}, {7, 2, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 6, 4}, {9, 11, 7}, {9, 7, 1}, {1, 10, 4}, {1, 4, 9},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {7, 1, 8}, {7, 8, 9}, {7, 9, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {4, 10, 6}, {7, 5, 9}, {7, 9, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {7, 5, 9}, {7, 9, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 10}, {5, 10, 6}, {5, 6, 2}, {5, 2, 9}, {7, 3, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {8, 5, 1}, {4, 2, 9}, {7, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 10, 6}, {8, 6, 2}, {8, 2, 9}, {7, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {4, 2, 9}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 6, 4}, {10, 4, 5}, {10, 5, 1}, {7, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {8, 5, 1}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {4, 10, 6}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 1, 0}, {7, 0, 2}, {7, 2, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 1, 8}, {7, 8, 4}, {7, 4, 2}, {7, 2, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 5, 8}, {7, 8, 0}, {7, 0, 2}, {7, 2, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 5, 4}, {7, 4, 2}, {7, 2, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 1, 0}, {7, 0, 4}, {7, 4, 9}, {7, 9, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 1, 8}, {7, 8, 9}, {7, 9, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {7, 5, 9}, {7, 9, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 5, 9}, {7, 9, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 0}, {5, 0, 2}, {5, 2, 9}, {7, 3, 11}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {4, 2, 9}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 2}, {8, 2, 9}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 2, 9}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 4, 5}, {0, 5, 1}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {7, 3, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 3, 11}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 11, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 11, 0}, {7, 0, 8}, {0, 11, 4}, {8, 3, 7}, {11, 3, 4},
+        {3, 8, 4}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 1, 7}, {8, 7, 11}, {8, 11, 3}, {8, 3, 5}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 1, 7}, {0, 7, 11}, {3, 5, 4}, {4, 0, 11}, {4, 11, 3},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 9, 3}, {4, 3, 7}, {4, 7, 11}, {4, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 9, 3}, {8, 3, 7}, {11, 2, 0}, {0, 8, 7}, {0, 7, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 9, 3}, {4, 8, 1}, {4, 1, 7}, {4, 7, 11}, {4, 11, 2},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 9, 3}, {0, 1, 7}, {0, 7, 11}, {0, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 7, 11}, {5, 11, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 7}, {11, 9, 4}, {11, 4, 0}, {0, 8, 7}, {0, 7, 11},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 1, 7}, {8, 7, 11}, {8, 11, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 1}, {4, 1, 7}, {4, 7, 11}, {4, 11, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 5, 7}, {4, 7, 11}, {4, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 8, 5}, {0, 5, 7}, {0, 7, 11}, {0, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 1}, {4, 1, 7}, {4, 7, 11}, {4, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 1, 7}, {0, 7, 11}, {0, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 6, 11}, {0, 11, 3}, {0, 3, 7}, {0, 7, 10}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 8}, {4, 6, 11}, {4, 11, 3}, {3, 7, 8}, {3, 8, 4},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {5, 8, 0}, {5, 0, 6}, {5, 6, 11}, {5, 11, 3},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {5, 4, 6}, {5, 6, 11}, {5, 11, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 0}, {7, 0, 4}, {7, 4, 9}, {7, 9, 3}, {6, 11, 2},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 8}, {7, 8, 9}, {7, 9, 3}, {6, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {10, 1, 7}, {5, 9, 3}, {6, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {5, 9, 3}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 7, 10}, {5, 10, 0}, {6, 11, 9}, {9, 5, 0}, {9, 0, 6},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 5}, {10, 5, 7}, {4, 6, 11}, {4, 11, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {8, 0, 6}, {8, 6, 11}, {8, 11, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {4, 6, 11}, {4, 11, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 4}, {10, 4, 5}, {10, 5, 7}, {6, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 5}, {10, 5, 7}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {10, 1, 7}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 10, 11}, {1, 11, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 11}, {3, 1, 8}, {3, 8, 4}, {4, 0, 11}, {4, 11, 3},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 8, 10}, {5, 10, 11}, {5, 11, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 4, 0}, {5, 0, 10}, {5, 10, 11}, {5, 11, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{9, 3, 1}, {10, 11, 2}, {10, 2, 4}, {4, 9, 1}, {4, 1, 10},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 8, 9}, {1, 9, 3}, {0, 10, 11}, {0, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 9, 3}, {4, 8, 10}, {4, 10, 11}, {4, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 9, 3}, {0, 10, 11}, {0, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 10}, {5, 10, 11}, {5, 11, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {4, 0, 10}, {4, 10, 11}, {4, 11, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 10, 11}, {8, 11, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 0, 10}, {4, 10, 11}, {4, 11, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 5, 1}, {4, 1, 10}, {4, 10, 11}, {4, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {0, 10, 11}, {0, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {4, 10, 11}, {4, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 11}, {0, 11, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 0, 6}, {1, 6, 11}, {1, 11, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 8, 4}, {1, 4, 6}, {1, 6, 11}, {1, 11, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 8, 0}, {5, 0, 6}, {5, 6, 11}, {5, 11, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 4, 6}, {5, 6, 11}, {5, 11, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 0, 4}, {1, 4, 9}, {1, 9, 3}, {6, 11, 2}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 8, 9}, {1, 9, 3}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {5, 9, 3}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 9, 3}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 0}, {5, 0, 6}, {5, 6, 11}, {5, 11, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {4, 6, 11}, {4, 11, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 6}, {8, 6, 11}, {8, 11, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 6, 11}, {4, 11, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 4, 5}, {0, 5, 1}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {6, 11, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 11, 2}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 6, 2}, {7, 2, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 6, 0}, {7, 0, 8}, {4, 2, 3}, {3, 7, 8}, {3, 8, 4},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 7, 6}, {2, 3, 5}, {2, 5, 8}, {8, 1, 6}, {8, 6, 2},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {6, 1, 7}, {5, 4, 2}, {5, 2, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 6, 4}, {7, 4, 9}, {7, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 6, 0}, {7, 0, 8}, {7, 8, 9}, {7, 9, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 8}, {6, 8, 1}, {6, 1, 7}, {5, 9, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {6, 1, 7}, {5, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 7, 6}, {5, 6, 2}, {5, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 8}, {6, 8, 5}, {6, 5, 7}, {4, 2, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 1, 7}, {8, 7, 6}, {8, 6, 2}, {8, 2, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {6, 1, 7}, {4, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 5}, {6, 5, 7}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 8}, {6, 8, 5}, {6, 5, 7}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 4, 8}, {6, 8, 1}, {6, 1, 7}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{6, 0, 1}, {6, 1, 7}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 0}, {7, 0, 2}, {7, 2, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 8}, {7, 8, 4}, {7, 4, 2}, {7, 2, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {5, 8, 0}, {5, 0, 2}, {5, 2, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {5, 4, 2}, {5, 2, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 0}, {7, 0, 4}, {7, 4, 9}, {7, 9, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{7, 10, 8}, {7, 8, 9}, {7, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {10, 1, 7}, {5, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {5, 9, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 7, 10}, {5, 10, 0}, {5, 0, 2}, {5, 2, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 5}, {10, 5, 7}, {4, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {8, 0, 2}, {8, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {4, 2, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 0, 4}, {10, 4, 5}, {10, 5, 7}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 8, 5}, {10, 5, 7}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {10, 1, 7}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 1, 7}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 10, 6}, {1, 6, 2}, {1, 2, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {1, 8, 4}, {1, 4, 2}, {1, 2, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 8, 10}, {5, 10, 6}, {5, 6, 2}, {5, 2, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {5, 4, 2}, {5, 2, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 10, 6}, {1, 6, 4}, {1, 4, 9}, {1, 9, 3}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {1, 8, 9}, {1, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {4, 10, 6}, {5, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {5, 9, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 10}, {5, 10, 6}, {5, 6, 2}, {5, 2, 9}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {8, 5, 1}, {4, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 10, 6}, {8, 6, 2}, {8, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {4, 2, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{10, 6, 4}, {10, 4, 5}, {10, 5, 1}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {8, 5, 1}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 10}, {4, 10, 6}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 10, 6}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 0, 2}, {1, 2, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 8, 4}, {1, 4, 2}, {1, 2, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 8, 0}, {5, 0, 2}, {5, 2, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 4, 2}, {5, 2, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 0, 4}, {1, 4, 9}, {1, 9, 3}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{1, 8, 9}, {1, 9, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {5, 9, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 9, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{5, 1, 0}, {5, 0, 2}, {5, 2, 9}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {4, 2, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 0, 2}, {8, 2, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 2, 9}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 4, 5}, {0, 5, 1}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{8, 5, 1}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{4, 8, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
+       {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
+        {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}
 };
index 38b130f979be1bad845c80932b0329bc0ba32d4c..c5f50d8af4e4c1fa893f763e9fd3c3d675fe5e97 100644 (file)
 #define dc_printf printf
 #else
 /* disable debug printfs */
-#define dc_printf(...) do {} while(0)
+#define dc_printf(...) do {} while (0)
 #endif
 
-Octree::Octree(ModelReadermr,
-                               DualConAllocOutput alloc_output_func,
-                               DualConAddVert add_vert_func,
-                               DualConAddQuad add_quad_func,
-                               DualConFlags flags, DualConMode dualcon_mode, int depth,
-                               float threshold, float sharpness)
+Octree::Octree(ModelReader *mr,
+               DualConAllocOutput alloc_output_func,
+               DualConAddVert add_vert_func,
+               DualConAddQuad add_quad_func,
+               DualConFlags flags, DualConMode dualcon_mode, int depth,
+               float threshold, float sharpness)
        : use_flood_fill(flags & DUALCON_FLOOD_FILL),
-         /* note on `use_manifold':
-                
-                After playing around with this option, the only case I could
-                find where this option gives different results is on
-                relatively thin corners. Sometimes along these corners two
-                vertices from seperate sides will be placed in the same
-                position, so hole gets filled with a 5-sided face, where two
-                of those vertices are in the same 3D location. If
-                `use_manifold' is disabled, then the modifier doesn't
-                generate two separate vertices so the results end up as all
-                quads.
-
-                Since the results are just as good with all quads, there
-                doesn't seem any reason to allow this to be toggled in
-                Blender. -nicholasbishop
-          */
-         use_manifold(false),
-         hermite_num(sharpness),
-         mode(dualcon_mode),
-         alloc_output(alloc_output_func),
-         add_vert(add_vert_func),
-         add_quad(add_quad_func)
+       /* note on `use_manifold':
+
+          After playing around with this option, the only case I could
+          find where this option gives different results is on
+          relatively thin corners. Sometimes along these corners two
+          vertices from seperate sides will be placed in the same
+          position, so hole gets filled with a 5-sided face, where two
+          of those vertices are in the same 3D location. If
+          `use_manifold' is disabled, then the modifier doesn't
+          generate two separate vertices so the results end up as all
+          quads.
+
+          Since the results are just as good with all quads, there
+          doesn't seem any reason to allow this to be toggled in
+          Blender. -nicholasbishop
+        */
+       use_manifold(false),
+       hermite_num(sharpness),
+       mode(dualcon_mode),
+       alloc_output(alloc_output_func),
+       add_vert(add_vert_func),
+       add_quad(add_quad_func)
 {
        thresh = threshold;
        reader = mr;
@@ -78,8 +78,8 @@ Octree::Octree(ModelReader* mr,
        range = reader->getBoundingBox(origin);
        nodeCount = nodeSpace = 0;
        maxDepth = depth;
-       mindimen =(dimen >> maxDepth);
-       minshift =(GRID_DIMENSION - maxDepth);
+       mindimen = (dimen >> maxDepth);
+       minshift = (GRID_DIMENSION - maxDepth);
        buildTable();
 
        maxTrianglePerCell = 0;
@@ -90,7 +90,7 @@ Octree::Octree(ModelReader* mr,
        dc_printf("Initialize memory...\n");
 #endif
        initMemory();
-       root = (Node*)createInternal(0);
+       root = (Node *)createInternal(0);
 
        // Read MC table
 #ifdef IN_VERBOSE_MODE
@@ -112,15 +112,15 @@ void Octree::scanConvert()
        clock_t start, finish;
        start = clock();
 #endif
-       
+
        addTrian();
        resetMinimalEdges();
        preparePrimalEdgesMask(&root->internal);
 
 #if DC_DEBUG
        finish = clock();
-       dc_printf("Time taken: %f seconds                   \n", 
-               (double)(finish - start) / CLOCKS_PER_SEC);
+       dc_printf("Time taken: %f seconds                   \n",
+                 (double)(finish - start) / CLOCKS_PER_SEC);
 #endif
 
        // Generate signs
@@ -132,18 +132,18 @@ void Octree::scanConvert()
        trace();
 #if DC_DEBUG
        finish = clock();
-       dc_printf("Time taken: %f seconds \n",  (double)(finish - start) / CLOCKS_PER_SEC);
+       dc_printf("Time taken: %f seconds \n",  (double)(finish - start) / CLOCKS_PER_SEC);
 #ifdef IN_VERBOSE_MODE
-       dc_printf("Holes: %d Average Length: %f Max Length: %d \n", numRings,(float)totRingLengths /(float) numRings, maxRingLength);
+       dc_printf("Holes: %d Average Length: %f Max Length: %d \n", numRings, (float)totRingLengths / (float) numRings, maxRingLength);
 #endif
 #endif
-       
+
        // Check again
        int tnumRings = numRings;
        trace();
 #ifdef IN_VERBOSE_MODE
        dc_printf("Holes after patching: %d \n", numRings);
-#endif 
+#endif
        numRings = tnumRings;
 
 #if DC_DEBUG
@@ -153,22 +153,22 @@ void Octree::scanConvert()
        buildSigns();
 #if DC_DEBUG
        finish = clock();
-       dc_printf("Time taken: %f seconds \n",  (double)(finish - start) / CLOCKS_PER_SEC);
+       dc_printf("Time taken: %f seconds \n",  (double)(finish - start) / CLOCKS_PER_SEC);
 #endif
 
-       if(use_flood_fill) {
+       if (use_flood_fill) {
                /*
-                 start = clock();
-                 floodFill();
-                 // Check again
-                 tnumRings = numRings;
-                 trace();
-                 dc_printf("Holes after filling: %d \n", numRings);
-                 numRings = tnumRings;
-                 buildSigns();
-                 finish = clock();
-                 dc_printf("Time taken: %f seconds \n",        (double)(finish - start) / CLOCKS_PER_SEC);
-               */
+                  start = clock();
+                  floodFill();
+                  // Check again
+                  tnumRings = numRings;
+                  trace();
+                  dc_printf("Holes after filling: %d \n", numRings);
+                  numRings = tnumRings;
+                  buildSigns();
+                  finish = clock();
+                  dc_printf("Time taken: %f seconds \n",       (double)(finish - start) / CLOCKS_PER_SEC);
+                */
 #if DC_DEBUG
                start = clock();
                dc_printf("Removing components...\n");
@@ -179,7 +179,7 @@ void Octree::scanConvert()
                //      floodFill();
 #if DC_DEBUG
                finish = clock();
-               dc_printf("Time taken: %f seconds \n",(double)(finish - start) / CLOCKS_PER_SEC);
+               dc_printf("Time taken: %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC);
 #endif
        }
 
@@ -202,31 +202,29 @@ void Octree::scanConvert()
 void Octree::initMemory()
 {
        leafalloc[0] = new MemoryAllocator<sizeof(LeafNode)>();
-       leafalloc[1] = new MemoryAllocator<sizeof(LeafNode) + sizeof(float) * EDGE_FLOATS>();
-       leafalloc[2] = new MemoryAllocator<sizeof(LeafNode) + sizeof(float) * EDGE_FLOATS * 2>();
-       leafalloc[3] = new MemoryAllocator<sizeof(LeafNode) + sizeof(float) * EDGE_FLOATS * 3>();
+       leafalloc[1] = new MemoryAllocator<sizeof(LeafNode) + sizeof(float) *EDGE_FLOATS>();
+       leafalloc[2] = new MemoryAllocator<sizeof(LeafNode) + sizeof(float) *EDGE_FLOATS * 2>();
+       leafalloc[3] = new MemoryAllocator<sizeof(LeafNode) + sizeof(float) *EDGE_FLOATS * 3>();
 
        alloc[0] = new MemoryAllocator<sizeof(InternalNode)>();
-       alloc[1] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*)>();
-       alloc[2] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 2>();
-       alloc[3] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 3>();
-       alloc[4] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 4>();
-       alloc[5] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 5>();
-       alloc[6] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 6>();
-       alloc[7] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 7>();
-       alloc[8] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node*) * 8>();
+       alloc[1] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *)>();
+       alloc[2] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 2>();
+       alloc[3] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 3>();
+       alloc[4] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 4>();
+       alloc[5] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 5>();
+       alloc[6] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 6>();
+       alloc[7] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 7>();
+       alloc[8] = new MemoryAllocator<sizeof(InternalNode) + sizeof(Node *) * 8>();
 }
 
 void Octree::freeMemory()
 {
-       for(int i = 0; i < 9; i ++)
-       {
+       for (int i = 0; i < 9; i++) {
                alloc[i]->destroy();
                delete alloc[i];
        }
 
-       for(int i = 0; i < 4; i ++)
-       {
+       for (int i = 0; i < 4; i++) {
                leafalloc[i]->destroy();
                delete leafalloc[i];
        }
@@ -236,22 +234,20 @@ void Octree::printMemUsage()
 {
        int totalbytes = 0;
        dc_printf("********* Internal nodes: \n");
-       for(int i = 0; i < 9; i ++)
-       {
+       for (int i = 0; i < 9; i++) {
                alloc[i]->printInfo();
 
                totalbytes += alloc[i]->getAll() * alloc[i]->getBytes();
        }
        dc_printf("********* Leaf nodes: \n");
        int totalLeafs = 0;
-       for(int i = 0; i < 4; i ++)
-       {
+       for (int i = 0; i < 4; i++) {
                leafalloc[i]->printInfo();
 
                totalbytes += leafalloc[i]->getAll() * leafalloc[i]->getBytes();
                totalLeafs += leafalloc[i]->getAllocated();
        }
-       
+
        dc_printf("Total allocated bytes on disk: %d \n", totalbytes);
        dc_printf("Total leaf nodes: %d\n", totalLeafs);
 }
@@ -263,9 +259,9 @@ void Octree::resetMinimalEdges()
 
 void Octree::addTrian()
 {
-       Triangletrian;
+       Triangle *trian;
        int count = 0;
-       
+
 #if DC_DEBUG
        int total = reader->getNumTriangles();
        int unitcount = 1000;
@@ -274,196 +270,175 @@ void Octree::addTrian()
 
        srand(0);
 
-       while((trian = reader->getNextTriangle()) != NULL)
-       {
+       while ((trian = reader->getNextTriangle()) != NULL) {
                // Drop triangles
                {
                        addTrian(trian, count);
                }
                delete trian;
 
-               count ++;
+               count++;
 
 #if DC_DEBUG
-               if(count % unitcount == 0)
-               {
+               if (count % unitcount == 0) {
                        putchar(13);
 
-                       switch((count / unitcount) % 4)
-                       {
-                       case 0 : dc_printf("-");
-                               break;
-                       case 1 : dc_printf("/");
-                               break;
-                       case 2 : dc_printf("|");
-                               break;
-                       case 3 : dc_printf("\\");
-                               break;
+                       switch ((count / unitcount) % 4) {
+                               case 0: dc_printf("-");
+                                       break;
+                               case 1: dc_printf("/");
+                                       break;
+                               case 2: dc_printf("|");
+                                       break;
+                               case 3: dc_printf("\\");
+                                       break;
                        }
 
-                       float percent =(float) count / total;
-                       
+                       float percent = (float) count / total;
+
                        /*
-                       int totbars = 50;
-                       int bars =(int)(percent * totbars);
-                       for(int i = 0; i < bars; i ++)
-                       {
-                               putchar(219);
-                       }
-                       for(i = bars; i < totbars; i ++)
-                       {
-                               putchar(176);
-                       }
-                       */
+                          int totbars = 50;
+                          int bars =(int)(percent * totbars);
+                          for(int i = 0; i < bars; i ++) {
+                           putchar(219);
+                          }
+                          for(i = bars; i < totbars; i ++) {
+                           putchar(176);
+                          }
+                        */
 
                        dc_printf(" %d triangles: ", count);
                        dc_printf(" %f%% complete.", 100 * percent);
                }
 #endif
-               
+
        }
        putchar(13);
 }
 
-void Octree::addTrian(Triangletrian, int triind)
+void Octree::addTrian(Triangle *trian, int triind)
 {
        int i, j;
 
        // Blowing up the triangle to the grid
        float mid[3] = {0, 0, 0};
-       for(i = 0; i < 3; i ++)
-               for(j = 0; j < 3; j ++)
-               {
-                       trian->vt[i][j] = dimen *(trian->vt[i][j] - origin[j]) / range;
+       for (i = 0; i < 3; i++)
+               for (j = 0; j < 3; j++) {
+                       trian->vt[i][j] = dimen * (trian->vt[i][j] - origin[j]) / range;
                        mid[j] += trian->vt[i][j] / 3;
                }
 
        // Generate projections
        LONG cube[2][3] = {{0, 0, 0}, {dimen, dimen, dimen}};
        LONG trig[3][3];
-       
-       for(i = 0; i < 3; i ++)
-               for( j = 0; j < 3; j ++)
-               {
-                       trig[i][j] =(LONG)(trian->vt[i][j]);
-       // Perturb end points, if set so
+
+       for (i = 0; i < 3; i++)
+               for (j = 0; j < 3; j++) {
+                       trig[i][j] = (LONG)(trian->vt[i][j]);
+                       // Perturb end points, if set so
                }
-               
+
        // Add to the octree
        // int start[3] = {0, 0, 0};
-       LONG errorvec =(LONG)(0);
-       Projectionsproj = new Projections(cube, trig, errorvec, triind);
-       root = (Node*)addTrian(&root->internal, proj, maxDepth);
-       
+       LONG errorvec = (LONG)(0);
+       Projections *proj = new Projections(cube, trig, errorvec, triind);
+       root = (Node *)addTrian(&root->internal, proj, maxDepth);
+
        delete proj->inherit;
        delete proj;
 }
 
 
-InternalNode* Octree::addTrian(InternalNode* node, Projections* p, int height)
+InternalNode *Octree::addTrian(InternalNode *node, Projections *p, int height)
 {
        int i;
-       int vertdiff[8][3] = {{0,0,0},{0,0,1},{0,1,-1},{0,0,1},{1,-1,-1},{0,0,1},{0,1,-1},{0,0,1}};
+       int vertdiff[8][3] = {{0, 0, 0}, {0, 0, 1}, {0, 1, -1}, {0, 0, 1}, {1, -1, -1}, {0, 0, 1}, {0, 1, -1}, {0, 0, 1}};
        UCHAR boxmask = p->getBoxMask();
-       Projectionssubp = new Projections(p);
-       
+       Projections *subp = new Projections(p);
+
        int count = 0;
-       int tempdiff[3] = {0,0,0};
-       for(i = 0; i < 8; i ++)
-       {
+       int tempdiff[3] = {0, 0, 0};
+       for (i = 0; i < 8; i++) {
                tempdiff[0] += vertdiff[i][0];
                tempdiff[1] += vertdiff[i][1];
                tempdiff[2] += vertdiff[i][2];
 
                /* Quick pruning using bounding box */
-               if(boxmask &(1 << i)) 
-               {
+               if (boxmask & (1 << i)) {
                        subp->shift(tempdiff);
                        tempdiff[0] = tempdiff[1] = tempdiff[2] = 0;
 
                        /* Pruning using intersection test */
-                       if(subp->isIntersecting())
+                       if (subp->isIntersecting()) {
                        // if(subp->getIntersectionMasks(cedgemask, edgemask))
-                       {
-                               if(! hasChild(node, i))
-                               {
-                                       if(height == 1)
-                                       {
+                               if (!hasChild(node, i)) {
+                                       if (height == 1) {
                                                node = addLeafChild(node, i, count, createLeaf(0));
                                        }
-                                       else
-                                       {
+                                       else {
                                                node = addInternalChild(node, i, count, createInternal(0));
                                        }
                                }
-       &nbs