Hi Michael, in attachment there is an updated eigen3.patch for the avogadro_1.0.3-12. It would be good to upload it as soon as possible (If you want, I can even NMU it).
Eigen has no strict roadmap. But I plan to move this alpha-version (which seems to be stable already) from experimental to sid very soon. I have migrated all dependent packages and do not want to fix any newly uploaded ones, which can potentially use eigen2_support. Best regards Anton 2015-09-26 16:56 GMT+02:00 Michael Banck <mba...@debian.org>: > Hi, > > On Sat, Sep 26, 2015 at 01:36:16PM +0200, Michael Banck wrote: >> The version in experimental ist still a prerelease, so I don't think >> that is appropriate for Debian, but I'll check back with upstream now. > > According to upstream they might release 1.2 real soon now, so I'd say > let's wait a few days/weeks whether this happens. > > When is Eigen 3.3 due, or is it released already? > > > Michael
Description: migrate from eigen2 to eigen3 Applied-Upstream: https://github.com/cryos/avogadro/commit/3cc14da0f92e6ea0bd763e97b5711c4afe56a7cd Author: Anton Gladky <gl...@debian.org> Bug-Debian: http://bugs.debian.org/728610 Last-Update: 2013-11-03 Index: avogadro-1.0.3/avogadro.prf.in =================================================================== --- avogadro-1.0.3.orig/avogadro.prf.in +++ avogadro-1.0.3/avogadro.prf.in @@ -3,6 +3,6 @@ OPENBABEL_PREFIX = @OPENBABEL2_INCLUDE_D INCLUDEPATH += . \ $$AVOGADRO_PREFIX/include \ @OPENBABEL2_INCLUDE_DIR@ \ - @EIGEN2_INCLUDE_DIR@ + @EIGEN3_INCLUDE_DIR@ LIBS += -L$$AVOGADRO_PREFIX/lib -lavogadro \ -L$$OPENBABEL_PREFIX/lib -lopenbabel Index: avogadro-1.0.3/avogadro/src/CMakeLists.txt =================================================================== --- avogadro-1.0.3.orig/avogadro/src/CMakeLists.txt +++ avogadro-1.0.3/avogadro/src/CMakeLists.txt @@ -19,7 +19,7 @@ set_directory_properties(PROPERTIES INCL include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${OPENBABEL2_INCLUDE_DIR} - ${EIGEN2_INCLUDE_DIR} + ${EIGEN3_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) Index: avogadro-1.0.3/cmake/modules/AvogadroUse.cmake =================================================================== --- avogadro-1.0.3.orig/cmake/modules/AvogadroUse.cmake +++ avogadro-1.0.3/cmake/modules/AvogadroUse.cmake @@ -16,8 +16,8 @@ add_definitions(-DQT_SHARED) # Add the Avogadro modules directory to the CMake module path set(CMAKE_MODULE_PATH ${Avogadro_PLUGIN_DIR}/cmake ${CMAKE_MODULE_PATH}) -find_package(Eigen2 REQUIRED) -include_directories(${EIGEN2_INCLUDE_DIR}) +find_package(Eigen3 REQUIRED) +include_directories(${EIGEN3_INCLUDE_DIR}) if(Avogadro_ENABLE_GLSL) find_package(GLEW) if(GLEW_FOUND) Index: avogadro-1.0.3/cmake/modules/FindEigen3.cmake =================================================================== --- /dev/null +++ avogadro-1.0.3/cmake/modules/FindEigen3.cmake @@ -0,0 +1,81 @@ +# - Try to find Eigen3 lib +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(Eigen3 3.1.2) +# to require version 3.1.2 or newer of Eigen3. +# +# Once done this will define +# +# EIGEN3_FOUND - system has eigen lib with correct version +# EIGEN3_INCLUDE_DIR - the eigen include directory +# EIGEN3_VERSION - eigen version + +# Copyright (c) 2006, 2007 Montel Laurent, <mon...@kde.org> +# Copyright (c) 2008, 2009 Gael Guennebaud, <g.g...@free.fr> +# Copyright (c) 2009 Benoit Jacob <jacob.benoi...@gmail.com> +# Redistribution and use is allowed according to the terms of the 2-clause BSD license. + +if(NOT Eigen3_FIND_VERSION) + if(NOT Eigen3_FIND_VERSION_MAJOR) + set(Eigen3_FIND_VERSION_MAJOR 2) + endif(NOT Eigen3_FIND_VERSION_MAJOR) + if(NOT Eigen3_FIND_VERSION_MINOR) + set(Eigen3_FIND_VERSION_MINOR 91) + endif(NOT Eigen3_FIND_VERSION_MINOR) + if(NOT Eigen3_FIND_VERSION_PATCH) + set(Eigen3_FIND_VERSION_PATCH 0) + endif(NOT Eigen3_FIND_VERSION_PATCH) + + set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") +endif(NOT Eigen3_FIND_VERSION) + +macro(_eigen3_check_version) + file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) + + string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") + set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") + set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") + set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") + + set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) + if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN3_VERSION_OK FALSE) + else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN3_VERSION_OK TRUE) + endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + + if(NOT EIGEN3_VERSION_OK) + + message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " + "but at least version ${Eigen3_FIND_VERSION} is required") + endif(NOT EIGEN3_VERSION_OK) +endmacro(_eigen3_check_version) + +if (EIGEN3_INCLUDE_DIR) + + # in cache already + _eigen3_check_version() + set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) + +else (EIGEN3_INCLUDE_DIR) + + find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library + PATHS + ${CMAKE_INSTALL_PREFIX}/include + ${KDE4_INCLUDE_DIR} + PATH_SUFFIXES eigen3 eigen + ) + + if(EIGEN3_INCLUDE_DIR) + _eigen3_check_version() + endif(EIGEN3_INCLUDE_DIR) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) + + mark_as_advanced(EIGEN3_INCLUDE_DIR) + +endif(EIGEN3_INCLUDE_DIR) + Index: avogadro-1.0.3/libavogadro/src/CMakeLists.txt =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/CMakeLists.txt +++ avogadro-1.0.3/libavogadro/src/CMakeLists.txt @@ -14,7 +14,7 @@ set_directory_properties(PROPERTIES INCL "${libavogadro_BINARY_DIR}/include;${tmp_include_dirs}") include_directories( ${CMAKE_CURRENT_BINARY_DIR} - ${EIGEN2_INCLUDE_DIR} + ${EIGEN3_INCLUDE_DIR} ${OPENBABEL2_INCLUDE_DIR} ) Index: avogadro-1.0.3/libavogadro/tests/CMakeLists.txt =================================================================== --- avogadro-1.0.3.orig/libavogadro/tests/CMakeLists.txt +++ avogadro-1.0.3/libavogadro/tests/CMakeLists.txt @@ -14,7 +14,7 @@ set_directory_properties(PROPERTIES INCL include_directories( ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} - ${EIGEN2_INCLUDE_DIR} + ${EIGEN3_INCLUDE_DIR} ${OPENBABEL2_INCLUDE_DIR} ${BOOST_PYTHON_INCLUDES} ${PYTHON_INCLUDE_PATH} Index: avogadro-1.0.3/CMakeLists.txt =================================================================== --- avogadro-1.0.3.orig/CMakeLists.txt +++ avogadro-1.0.3/CMakeLists.txt @@ -192,7 +192,7 @@ set(QT_MIN_VERSION "4.5.1") # we need at find_package(Qt4 REQUIRED) # find and setup Qt4 for this project find_package(OpenGL REQUIRED) # find and setup OpenGL find_package(Linguist) # find and setup Linguist -find_package(Eigen2 REQUIRED) # find and setup Eigen2 +find_package(Eigen3 REQUIRED) # find and setup Eigen3 find_package(ZLIB REQUIRED) find_package(OpenBabel2 REQUIRED) # find and setup OpenBabel @@ -427,7 +427,7 @@ install(FILES # Install the find modules we require to be present install(FILES - "${CMAKE_MODULE_PATH}/FindEigen2.cmake" + "${CMAKE_MODULE_PATH}/FindEigen3.cmake" "${CMAKE_MODULE_PATH}/FindGLEW.cmake" DESTINATION "${Avogadro_PLUGIN_INSTALL_DIR}/cmake") Index: avogadro-1.0.3/avogadro/src/mainwindow.cpp =================================================================== --- avogadro-1.0.3.orig/avogadro/src/mainwindow.cpp +++ avogadro-1.0.3/avogadro/src/mainwindow.cpp @@ -114,7 +114,6 @@ #include <QDebug> #include <Eigen/Geometry> -#include <Eigen/Array> #define USEQUAT // This is a "hidden" exported Qt function on the Mac for Qt-4.x. #ifdef Q_WS_MAC @@ -2368,7 +2367,7 @@ namespace Avogadro linearGoal.row(1) = linearGoal.row(2).cross(linearGoal.row(0)); // calculate the translation matrix - Transform3d goal(linearGoal); + Projective3d goal(linearGoal); goal.pretranslate(- 3.0 * (d->glWidget->radius() + CAMERA_NEAR_DISTANCE) * Vector3d::UnitZ()); Index: avogadro-1.0.3/avogadro/src/mainwindow.h =================================================================== --- avogadro-1.0.3.orig/avogadro/src/mainwindow.h +++ avogadro-1.0.3/avogadro/src/mainwindow.h @@ -24,7 +24,6 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include <Eigen/Geometry> #include "ui_mainwindow.h" #include "flattabwidget.h" Index: avogadro-1.0.3/libavogadro/src/camera.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/camera.cpp +++ avogadro-1.0.3/libavogadro/src/camera.cpp @@ -37,7 +37,7 @@ namespace Avogadro CameraPrivate() {}; - Eigen::Transform3d modelview, projection; + Eigen::Projective3d modelview, projection; const GLWidget *parent; double angleOfViewY; }; @@ -123,20 +123,20 @@ namespace Avogadro double Camera::distance(const Eigen::Vector3d & point) const { - return ( d->modelview * point ).norm(); + return ( (d->modelview).linear() * point ).norm(); } - void Camera::setModelview(const Eigen::Transform3d &matrix) + void Camera::setModelview(const Eigen::Projective3d &matrix) { d->modelview = matrix; } - const Eigen::Transform3d & Camera::modelview() const + const Eigen::Projective3d & Camera::modelview() const { return d->modelview; } - Eigen::Transform3d & Camera::modelview() + Eigen::Projective3d & Camera::modelview() { return d->modelview; } Index: avogadro-1.0.3/libavogadro/src/camera.h =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/camera.h +++ avogadro-1.0.3/libavogadro/src/camera.h @@ -98,16 +98,16 @@ namespace Avogadro { double angleOfViewY() const; /** Sets 4x4 "modelview" matrix representing the camera orientation and position. * @param matrix the matrix to copy from - * @sa Eigen::Transform3d & modelview(), applyModelview() */ - void setModelview(const Eigen::Transform3d &matrix); + * @sa Eigen::Projective3d & modelview(), applyModelview() */ + void setModelview(const Eigen::Projective3d &matrix); /** @return a constant reference to the 4x4 "modelview" matrix representing * the camera orientation and position - * @sa setModelview(), Eigen::Transform3d & modelview() */ - const Eigen::Transform3d & modelview() const; + * @sa setModelview(), Eigen::Projective3d & modelview() */ + const Eigen::Projective3d & modelview() const; /** @return a non-constant reference to the 4x4 "modelview" matrix representing * the camera orientation and position - * @sa setModelview(), const Eigen::Transform3d & modelview() const */ - Eigen::Transform3d & modelview(); + * @sa setModelview(), const Eigen::Projective3d & modelview() const */ + Eigen::Projective3d & modelview(); /** Calls gluPerspective() with parameters automatically chosen * for rendering the GLWidget's molecule with this camera. Should be called * only in GL_PROJECTION matrix mode. Example code is given Index: avogadro-1.0.3/libavogadro/src/engines/wireengine.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/engines/wireengine.cpp +++ avogadro-1.0.3/libavogadro/src/engines/wireengine.cpp @@ -109,7 +109,7 @@ namespace Avogadro { const Camera *camera = pd->camera(); // perform a rough form of frustum culling - Eigen::Vector3d transformedPos = pd->camera()->modelview() * v; + Eigen::Vector3d transformedPos = (pd->camera()->modelview()).linear() * v; double dot = transformedPos.z() / transformedPos.norm(); if(dot > -0.8) return true; @@ -167,7 +167,7 @@ namespace Avogadro { map = pd->colorMap(); // fall back to global color map // perform a rough form of frustum culling - Eigen::Vector3d transformedEnd1 = pd->camera()->modelview() * v1; + Eigen::Vector3d transformedEnd1 = (pd->camera()->modelview()).linear() * v1; double dot = transformedEnd1.z() / transformedEnd1.norm(); if(dot > -0.8) return true; // i.e., don't bother rendering Index: avogadro-1.0.3/libavogadro/src/extensions/slaterset.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/extensions/slaterset.cpp +++ avogadro-1.0.3/libavogadro/src/extensions/slaterset.cpp @@ -33,7 +33,7 @@ #include <avogadro/atom.h> #include <avogadro/cube.h> -#include <Eigen/Array> +#include <Eigen/Eigenvalues> #include <Eigen/LU> #include <Eigen/QR> @@ -245,7 +245,9 @@ namespace Avogadro SelfAdjointEigenSolver<MatrixXd> s(m_overlap); MatrixXd p = s.eigenvectors(); - MatrixXd m = p * s.eigenvalues().cwise().inverse().cwise().sqrt().asDiagonal() * p.inverse(); + //MatrixXd m = p * s.eigenvalues().cwise().inverse().cwise().sqrt().asDiagonal() * p.inverse(); + MatrixXd m1 = (s.eigenvalues().array().inverse().sqrt()); + MatrixXd m = p.array()*(m1.diagonal().array())*p.inverse().array(); m_normalized = m * m_eigenVectors; if (!(m_overlap*m*m).isIdentity()) Index: avogadro-1.0.3/libavogadro/src/glpainter_p.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/glpainter_p.cpp +++ avogadro-1.0.3/libavogadro/src/glpainter_p.cpp @@ -770,13 +770,13 @@ namespace Avogadro } else { points[theta-1] = Eigen::AngleAxisd(theta * (M_PI / 180.0) / 2, n) * u; } - points[theta-1] = d->widget->camera()->modelview() * (origin + points[theta-1]); + points[theta-1] = (d->widget->camera()->modelview()).linear() * (origin + points[theta-1]); } // Get vectors representing the points' positions in terms of the model view. - Eigen::Vector3d _origin = d->widget->camera()->modelview() * origin; - Eigen::Vector3d _direction1 = d->widget->camera()->modelview() * (origin+u); - Eigen::Vector3d _direction2 = d->widget->camera()->modelview() * (origin+v); + Eigen::Vector3d _origin = (d->widget->camera()->modelview()).linear() * origin; + Eigen::Vector3d _direction1 = (d->widget->camera()->modelview()).linear() * (origin+u); + Eigen::Vector3d _direction2 = (d->widget->camera()->modelview()).linear() * (origin+v); glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); @@ -861,12 +861,12 @@ namespace Avogadro } else { points[theta-1] = Eigen::AngleAxisd(theta * (M_PI / 180.0) / 2, n) * u; } - points[theta-1] = d->widget->camera()->modelview() * (origin + points[theta-1]); + points[theta-1] = (d->widget->camera()->modelview()).linear() * (origin + points[theta-1]); } // Get vectors representing the points' positions in terms of the model view. - Eigen::Vector3d _direction1 = d->widget->camera()->modelview() * (origin + u); - Eigen::Vector3d _direction2 = d->widget->camera()->modelview() * (origin + v); + Eigen::Vector3d _direction1 = (d->widget->camera()->modelview()).linear() * (origin + u); + Eigen::Vector3d _direction2 = (d->widget->camera()->modelview()).linear() * (origin + v); glPushAttrib(GL_ALL_ATTRIB_BITS); glPushMatrix(); Index: avogadro-1.0.3/libavogadro/src/glwidget.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/glwidget.cpp +++ avogadro-1.0.3/libavogadro/src/glwidget.cpp @@ -721,7 +721,7 @@ namespace Avogadro { GLfloat fogColor[4]= {d->background.redF(), d->background.greenF(), d->background.blueF(), d->background.alphaF()}; glFogfv(GL_FOG_COLOR, fogColor); - Vector3d distance = camera()->modelview() * d->center; + Vector3d distance = (camera()->modelview()).linear() * d->center; double distanceToCenter = distance.norm(); glFogf(GL_FOG_DENSITY, 1.0); glHint(GL_FOG_HINT, GL_NICEST); Index: avogadro-1.0.3/libavogadro/src/molecule.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/molecule.cpp +++ avogadro-1.0.3/libavogadro/src/molecule.cpp @@ -34,7 +34,7 @@ #include "zmatrix.h" #include <Eigen/Geometry> -#include <Eigen/LeastSquares> +#include <Eigen/Eigenvalues> #include <vector> @@ -1557,7 +1557,30 @@ namespace Avogadro{ } d->center /= static_cast<double>(nAtoms); Eigen::Hyperplane<double, 3> planeCoeffs; - Eigen::fitHyperplane(numAtoms(), atomPositions, &planeCoeffs); + //Eigen::fitHyperplane(numAtoms(), atomPositions, &planeCoeffs); + + /************************/ + typedef Eigen::Matrix<double,3,3> CovMatrixType; + typedef Eigen::Vector3d VectorType; + + VectorType mean = d->center; + int size=3; + int numPoints=numAtoms(); + VectorType ** points=atomPositions; + CovMatrixType covMat = CovMatrixType::Zero(size, size); + VectorType remean = VectorType::Zero(size); + for(int i = 0; i < numPoints; ++i) + { + VectorType diff = (*(points[i]) - mean).conjugate(); + covMat += diff * diff.adjoint(); + } + Eigen::SelfAdjointEigenSolver<CovMatrixType> eig(covMat); + planeCoeffs.normal() = eig.eigenvectors().col(0); + /************************/ + + + + delete[] atomPositions; d->normalVector = planeCoeffs.normal(); Index: avogadro-1.0.3/libavogadro/src/navigate.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/navigate.cpp +++ avogadro-1.0.3/libavogadro/src/navigate.cpp @@ -40,7 +40,7 @@ namespace Avogadro { void Navigate::zoom(GLWidget *widget, const Eigen::Vector3d &goal, double delta) { - Vector3d transformedGoal = widget->camera()->modelview() * goal; + Vector3d transformedGoal = (widget->camera()->modelview()).linear() * goal; double distanceToGoal = transformedGoal.norm(); double t = ZOOM_SPEED * delta; Index: avogadro-1.0.3/libavogadro/src/primitive.h =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/primitive.h +++ avogadro-1.0.3/libavogadro/src/primitive.h @@ -27,6 +27,7 @@ #define PRIMITIVE_H #include "global.h" +#include "Eigen/Core" #include <QObject> #include <QMetaType> Index: avogadro-1.0.3/libavogadro/src/python/camera.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/python/camera.cpp +++ avogadro-1.0.3/libavogadro/src/python/camera.cpp @@ -10,7 +10,7 @@ using namespace Avogadro; void export_Camera() { - const Eigen::Transform3d& (Camera::*modelview_ptr)() const = &Camera::modelview; + const Eigen::Projective3d& (Camera::*modelview_ptr)() const = &Camera::modelview; Eigen::Vector3d (Camera::*unProject_ptr1)(const Eigen::Vector3d&) const = &Camera::unProject; Eigen::Vector3d (Camera::*unProject_ptr2)(const QPoint&, const Eigen::Vector3d&) const = &Camera::unProject; Eigen::Vector3d (Camera::*unProject_ptr3)(const QPoint&) const = &Camera::unProject; Index: avogadro-1.0.3/libavogadro/src/python/eigen.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/python/eigen.cpp +++ avogadro-1.0.3/libavogadro/src/python/eigen.cpp @@ -303,9 +303,9 @@ template <> struct ScalarTraits<double> struct innerclass { // - // Eigen::Transform3d --> python array (4x4) + // Eigen::Projective3d --> python array (4x4) // - static PyObject* convert(Eigen::Transform3d const &trans) + static PyObject* convert(Eigen::Projective3d const &trans) { npy_intp dims[2] = { 4, 4 }; PyObject *result = PyArray_SimpleNew(2, dims, PyArray_DOUBLE); @@ -319,9 +319,9 @@ template <> struct ScalarTraits<double> return incref(result); } // - // Eigen::Transform3d* --> python array (4x4) + // Eigen::Projective3d* --> python array (4x4) // - static PyObject* convert(Eigen::Transform3d *trans) + static PyObject* convert(Eigen::Projective3d *trans) { npy_intp dims[2] = { 4, 4 }; PyObject *result = PyArray_SimpleNew(2, dims, PyArray_DOUBLE); @@ -335,9 +335,9 @@ template <> struct ScalarTraits<double> return incref(result); } // - // const Eigen::Transform3d* --> python array (4x4) + // const Eigen::Projective3d* --> python array (4x4) // - static PyObject* convert(const Eigen::Transform3d *trans) + static PyObject* convert(const Eigen::Projective3d *trans) { npy_intp dims[2] = { 4, 4 }; PyObject *result = PyArray_SimpleNew(2, dims, PyArray_DOUBLE); @@ -356,10 +356,10 @@ template <> struct ScalarTraits<double> Transform3d_to_python_array() { #ifndef WIN32 - to_python_converter<Eigen::Transform3d, innerclass>(); + to_python_converter<Eigen::Projective3d, innerclass>(); #endif - to_python_converter<Eigen::Transform3d*, innerclass>(); - to_python_converter<const Eigen::Transform3d*, innerclass>(); + to_python_converter<Eigen::Projective3d*, innerclass>(); + to_python_converter<const Eigen::Projective3d*, innerclass>(); } }; @@ -375,13 +375,13 @@ template <> struct ScalarTraits<double> // // used for: // - // void function(Eigen::Transform3d vec) - // void function(Eigen::Transform3d & vec) - // void function(const Eigen::Transform3d & vec) + // void function(Eigen::Projective3d vec) + // void function(Eigen::Projective3d & vec) + // void function(const Eigen::Projective3d & vec) // - converter::registry::push_back( &convertible, &construct, type_id<Eigen::Transform3d>() ); + converter::registry::push_back( &convertible, &construct, type_id<Eigen::Projective3d>() ); - converter::registry::insert( &convert, type_id<Eigen::Transform3d>() ); + converter::registry::insert( &convert, type_id<Eigen::Projective3d>() ); } static void* convert(PyObject *obj_ptr) @@ -399,7 +399,7 @@ template <> struct ScalarTraits<double> throw_error_already_set(); // the 1D array does not have exactly 3 elements double *values = reinterpret_cast<double*>(array->data); - Eigen::Transform3d *c_obj = new Eigen::Transform3d(); + Eigen::Projective3d *c_obj = new Eigen::Projective3d(); double *dataPtr = c_obj->data(); for (int i = 0; i < 16; ++i) @@ -430,7 +430,7 @@ template <> struct ScalarTraits<double> // I think this is a better way to get at the double array, where is this // deleted though? Does Boost::Python do it? double *values = reinterpret_cast<double*>(array->data); - Eigen::Transform3d *storage = new Eigen::Transform3d(); + Eigen::Projective3d *storage = new Eigen::Projective3d(); double *dataPtr = storage->data(); for (int i = 0; i < 16; ++i) @@ -465,21 +465,21 @@ class EigenUnitTestHelper void set_vector3d_ptr(Eigen::Vector3d* vec) { m_vector3d = *vec; } void set_const_vector3d_ptr(const Eigen::Vector3d* const vec) { m_vector3d = *vec; } - //Eigen::Transform3d transform3d() { return m_transform3d; } - //Eigen::Transform3d& transform3d_ref() { return m_transform3d; } - const Eigen::Transform3d& const_transform3d_ref() { return m_transform3d; } - Eigen::Transform3d* transform3d_ptr() { return &m_transform3d; } - const Eigen::Transform3d* const_transform3d_ptr() { return &m_transform3d; } - - //void set_transform3d(Eigen::Transform3d vec) { m_transform3d = vec; } - //void set_transform3d_ref(Eigen::Transform3d& vec) { m_transform3d = vec; } - void set_const_transform3d_ref(const Eigen::Transform3d& vec) { m_transform3d = vec; } - void set_transform3d_ptr(Eigen::Transform3d* vec) { m_transform3d = *vec; } - void set_const_transform3d_ptr(const Eigen::Transform3d* const vec) { m_transform3d = *vec; } + //Eigen::Projective3d transform3d() { return m_transform3d; } + //Eigen::Projective3d& transform3d_ref() { return m_transform3d; } + const Eigen::Projective3d& const_transform3d_ref() { return m_transform3d; } + Eigen::Projective3d* transform3d_ptr() { return &m_transform3d; } + const Eigen::Projective3d* const_transform3d_ptr() { return &m_transform3d; } + + //void set_transform3d(Eigen::Projective3d vec) { m_transform3d = vec; } + //void set_transform3d_ref(Eigen::Projective3d& vec) { m_transform3d = vec; } + void set_const_transform3d_ref(const Eigen::Projective3d& vec) { m_transform3d = vec; } + void set_transform3d_ptr(Eigen::Projective3d* vec) { m_transform3d = *vec; } + void set_const_transform3d_ptr(const Eigen::Projective3d* const vec) { m_transform3d = *vec; } private: Eigen::Vector3d m_vector3d; - Eigen::Transform3d m_transform3d; + Eigen::Projective3d m_transform3d; }; #endif @@ -527,7 +527,7 @@ void export_Eigen() Vector3x_to_python_array<Eigen::Vector3i>(); Vector3x_from_python_array<Eigen::Vector3i>(); - // Eigen::Transform3d + // Eigen::Projective3d Transform3d_to_python_array(); Transform3d_from_python_array(); Index: avogadro-1.0.3/libavogadro/src/tools/bondcentrictool.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/tools/bondcentrictool.cpp +++ avogadro-1.0.3/libavogadro/src/tools/bondcentrictool.cpp @@ -577,8 +577,8 @@ namespace Avogadro { Vector3d clicked = *m_clickedAtom->pos(); - Vector3d axis = Vector3d(0, 0, ((widget->camera()->modelview() * other).z() >= - (widget->camera()->modelview() * center).z() ? -1 : 1)); + Vector3d axis = Vector3d(0, 0, (((widget->camera()->modelview()).linear() * other).z() >= + ((widget->camera()->modelview()).linear() * center).z() ? -1 : 1)); Vector3d centerProj = widget->camera()->project(center); centerProj -= Vector3d(0,0,centerProj.z()); @@ -672,8 +672,8 @@ namespace Avogadro { Vector3d clicked = *m_clickedAtom->pos(); - Vector3d axis = Vector3d(0, 0, ((widget->camera()->modelview() * other).z() >= - (widget->camera()->modelview() * center).z() ? -1 : 1)); + Vector3d axis = Vector3d(0, 0, ((widget->camera()->modelview().linear() * other).z() >= + (widget->camera()->modelview().linear() * center).z() ? -1 : 1)); Vector3d centerProj = widget->camera()->project(center); centerProj -= Vector3d(0,0,centerProj.z()); @@ -1361,10 +1361,10 @@ namespace Avogadro { planeVec = length * (planeVec / planeVec.norm()); - Vector3d topLeft = widget->camera()->modelview() * (left + planeVec); - Vector3d topRight = widget->camera()->modelview() * (right + planeVec); - Vector3d botRight = widget->camera()->modelview() * (right - planeVec); - Vector3d botLeft = widget->camera()->modelview() * (left - planeVec); + Vector3d topLeft = (widget->camera()->modelview()).linear() * (left + planeVec); + Vector3d topRight = (widget->camera()->modelview()).linear() * (right + planeVec); + Vector3d botRight = (widget->camera()->modelview()).linear() * (right - planeVec); + Vector3d botLeft = (widget->camera()->modelview()).linear() * (left - planeVec); float alpha = 0.4; double lineWidth = 1.5; @@ -1443,10 +1443,10 @@ namespace Avogadro { C = D + ((C-D).normalized() * minWidth); } - Vector3d topLeft = widget->camera()->modelview() * D; - Vector3d topRight = widget->camera()->modelview() * C; - Vector3d botRight = widget->camera()->modelview() * B; - Vector3d botLeft = widget->camera()->modelview() * A; + Vector3d topLeft = widget->camera()->modelview().linear() * D; + Vector3d topRight = widget->camera()->modelview().linear() * C; + Vector3d botRight = widget->camera()->modelview().linear() * B; + Vector3d botLeft = widget->camera()->modelview().linear() * A; float alpha = 0.4; double lineWidth = 1.5; @@ -1505,12 +1505,12 @@ namespace Avogadro { Vector3d positionVector) { //Rotate skeleton around a particular axis and center point - Eigen::Transform3d rotation; + Eigen::Projective3d rotation; rotation = Eigen::AngleAxisd(angle, rotationVector); rotation.pretranslate(centerVector); rotation.translate(-centerVector); - return rotation*positionVector; + return rotation.linear()*positionVector; } // ########## showAnglesChanged ########## Index: avogadro-1.0.3/libavogadro/src/tools/manipulatetool.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/tools/manipulatetool.cpp +++ avogadro-1.0.3/libavogadro/src/tools/manipulatetool.cpp @@ -36,7 +36,7 @@ #include <QtPlugin> using Eigen::Vector3d; -using Eigen::Transform3d; +using Eigen::Projective3d; using Eigen::AngleAxisd; namespace Avogadro { @@ -72,7 +72,7 @@ namespace Avogadro { widget->setCursor(Qt::SizeVerCursor); // Move the selected atom(s) in to or out of the screen - Vector3d transformedGoal = widget->camera()->modelview() * *goal; + Vector3d transformedGoal = widget->camera()->modelview().linear() * *goal; double distanceToGoal = transformedGoal.norm(); double t = ZOOM_SPEED * delta; @@ -128,7 +128,7 @@ namespace Avogadro { // Rotate the selected atoms about the center // rotate only selected primitives - Transform3d fragmentRotation; + Eigen::Projective3d fragmentRotation; fragmentRotation.matrix().setIdentity(); fragmentRotation.translation() = *center; fragmentRotation.rotate( @@ -139,7 +139,7 @@ namespace Avogadro { foreach(Primitive *p, widget->selectedPrimitives()) if (p->type() == Primitive::AtomType) - static_cast<Atom *>(p)->setPos(fragmentRotation * *static_cast<Atom *>(p)->pos()); + static_cast<Atom *>(p)->setPos(fragmentRotation.linear() * *static_cast<Atom *>(p)->pos()); widget->molecule()->update(); } @@ -147,7 +147,7 @@ namespace Avogadro { double delta) const { // Tilt the selected atoms about the center - Transform3d fragmentRotation; + Eigen::Projective3d fragmentRotation; fragmentRotation.matrix().setIdentity(); fragmentRotation.translation() = *center; fragmentRotation.rotate(AngleAxisd(delta * ROTATION_SPEED, widget->camera()->backTransformedZAxis())); @@ -155,7 +155,7 @@ namespace Avogadro { foreach(Primitive *p, widget->selectedPrimitives()) if (p->type() == Primitive::AtomType) - static_cast<Atom *>(p)->setPos(fragmentRotation * *static_cast<Atom *>(p)->pos()); + static_cast<Atom *>(p)->setPos(fragmentRotation.linear() * *static_cast<Atom *>(p)->pos()); widget->molecule()->update(); } Index: avogadro-1.0.3/libavogadro/src/tools/navigatetool.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/tools/navigatetool.cpp +++ avogadro-1.0.3/libavogadro/src/tools/navigatetool.cpp @@ -90,7 +90,7 @@ namespace Avogadro { double sumOfWeights = 0.; QList<Atom*> atoms = widget->molecule()->atoms(); foreach (Atom *atom, atoms) { - Vector3d transformedAtomPos = widget->camera()->modelview() * *atom->pos(); + Vector3d transformedAtomPos = (widget->camera()->modelview()).linear() * (*atom->pos()); double atomDistance = transformedAtomPos.norm(); double dot = transformedAtomPos.z() / atomDistance; double weight = exp(-30. * (1. + dot)); Index: avogadro-1.0.3/libavogadro/src/tools/skeletontree.cpp =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/tools/skeletontree.cpp +++ avogadro-1.0.3/libavogadro/src/tools/skeletontree.cpp @@ -25,6 +25,7 @@ **********************************************************************/ #include "skeletontree.h" +#include <iostream> #include <avogadro/atom.h> #include <avogadro/bond.h> @@ -219,7 +220,7 @@ namespace Avogadro { { if (m_rootNode) { //Rotate skeleton around a particular axis and center point - Eigen::Transform3d rotation; + Eigen::Projective3d rotation; rotation = Eigen::AngleAxisd(angle, rotationAxis); rotation.pretranslate(centerVector); rotation.translate(-centerVector); @@ -246,11 +247,11 @@ namespace Avogadro { // ########## recursiveRotate ########## void SkeletonTree::recursiveRotate(Node* n, - const Eigen::Transform3d &rotationMatrix) + const Eigen::Projective3d &rotationMatrix) { // Update the root node with the new position Atom* a = n->atom(); - a->setPos(rotationMatrix * (*a->pos())); + a->setPos(rotationMatrix.linear() * (*a->pos())); a->update(); // Now update the children @@ -268,10 +269,10 @@ namespace Avogadro { printSkeleton(node); Atom* a = n->atom(); - cout << a->pos()->x() << "," << a->pos()->y()<< ","<<a->pos()->z() << endl; + std::cout << a->pos()->x() << "," << a->pos()->y()<< ","<<a->pos()->z() << endl; if (!n->isLeaf()) { - cout << "-------------" << endl; + std::cout << "-------------" << endl; } } Index: avogadro-1.0.3/libavogadro/src/tools/skeletontree.h =================================================================== --- avogadro-1.0.3.orig/libavogadro/src/tools/skeletontree.h +++ avogadro-1.0.3/libavogadro/src/tools/skeletontree.h @@ -228,7 +228,7 @@ namespace Avogadro { * @param centerVector Center location to rotate around. */ void recursiveRotate(Node* n, - const Eigen::Transform3d &rotationMatrix); + const Eigen::Projective3d &rotationMatrix); }; } // End namespace Avogadro