]> git.pld-linux.org Git - packages/avogadro.git/blob - avogadro_eigen3.patch
- add eigen3 patch from fedora
[packages/avogadro.git] / avogadro_eigen3.patch
1 diff -rupN avogadro-1.2.0/avogadro/src/CMakeLists.txt avogadro-1.2.0-new/avogadro/src/CMakeLists.txt
2 --- avogadro-1.2.0/avogadro/src/CMakeLists.txt  2016-06-08 16:19:45.000000000 +0200
3 +++ avogadro-1.2.0-new/avogadro/src/CMakeLists.txt      2018-01-03 14:47:08.649568522 +0100
4 @@ -22,15 +22,9 @@ include_directories(
5    ${CMAKE_CURRENT_BINARY_DIR}
6  )
7  
8 -if(EIGEN3_FOUND)
9 -       include_directories(
10 -               ${EIGEN3_INCLUDE_DIR}
11 -       )
12 -elseif(EIGEN2_FOUND)
13 -       include_directories(
14 -               ${EIGEN2_INCLUDE_DIR}
15 -       )
16 -endif(EIGEN3_FOUND)
17 +include_directories(
18 +    ${EIGEN3_INCLUDE_DIR}
19 +)
20  
21  if(GLEW_FOUND)
22    include_directories(${GLEW_INCLUDE_DIR})
23 diff -rupN avogadro-1.2.0/avogadro/src/mainwindow.cpp avogadro-1.2.0-new/avogadro/src/mainwindow.cpp
24 --- avogadro-1.2.0/avogadro/src/mainwindow.cpp  2016-06-08 16:19:45.000000000 +0200
25 +++ avogadro-1.2.0-new/avogadro/src/mainwindow.cpp      2018-01-03 14:45:25.170574246 +0100
26 @@ -115,7 +115,6 @@
27  #include <QDebug>
28  
29  #include <Eigen/Geometry>
30 -#include <Eigen/Array>
31  #define USEQUAT
32  // This is a "hidden" exported Qt function on the Mac for Qt-4.x.
33  #ifdef Q_WS_MAC
34 @@ -2775,7 +2774,7 @@ protected:
35      linearGoal.row(1) = linearGoal.row(2).cross(linearGoal.row(0));
36  
37      // calculate the translation matrix
38 -    Transform3d goal(linearGoal);
39 +    Projective3d goal(linearGoal);
40  
41      goal.pretranslate(- 3.0 * (d->glWidget->radius() + CAMERA_NEAR_DISTANCE) * Vector3d::UnitZ());
42  
43 @@ -2840,7 +2839,7 @@ protected:
44      Matrix3d linearGoal = Matrix3d::Identity();
45  
46      // calculate the translation matrix
47 -    Transform3d goal(linearGoal);
48 +    Projective3d goal(linearGoal);
49  
50      goal.pretranslate(- 3.0 * (d->glWidget->radius() + CAMERA_NEAR_DISTANCE) * Vector3d::UnitZ());
51  
52 diff -rupN avogadro-1.2.0/CMakeLists.txt avogadro-1.2.0-new/CMakeLists.txt
53 --- avogadro-1.2.0/CMakeLists.txt       2016-06-08 16:19:45.000000000 +0200
54 +++ avogadro-1.2.0-new/CMakeLists.txt   2018-01-03 14:48:31.478563940 +0100
55 @@ -231,14 +231,7 @@ if(NOT Linguist_FOUND)
56    message(WARNING " Qt4 Linguist not found, please install it if you want Avogadro translations")
57  endif()
58  
59 -find_package(Eigen3) # find and setup Eigen3 if available
60 -if(NOT EIGEN3_FOUND)
61 -   message(STATUS "Cannot find Eigen3, trying Eigen2")
62 -   find_package(Eigen2 REQUIRED) # Some version is required
63 -else()
64 -# Use Stage10 Eigen3 support
65 -   set (EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API TRUE)
66 -endif()
67 +find_package(Eigen3 REQUIRED) # find and setup Eigen3
68  
69  find_package(ZLIB REQUIRED)
70  find_package(OpenBabel2 REQUIRED) # find and setup OpenBabel
71 @@ -473,7 +466,6 @@ install(FILES
72  
73  # Install the find modules we require to be present
74  install(FILES
75 -  "${CMAKE_MODULE_PATH}/FindEigen2.cmake"
76    "${CMAKE_MODULE_PATH}/FindEigen3.cmake"
77    "${CMAKE_MODULE_PATH}/FindGLEW.cmake"
78    DESTINATION "${Avogadro_PLUGIN_INSTALL_DIR}/cmake")
79 diff -rupN avogadro-1.2.0/libavogadro/src/camera.cpp avogadro-1.2.0-new/libavogadro/src/camera.cpp
80 --- avogadro-1.2.0/libavogadro/src/camera.cpp   2016-06-08 16:19:45.000000000 +0200
81 +++ avogadro-1.2.0-new/libavogadro/src/camera.cpp       2018-01-03 14:45:25.171574246 +0100
82 @@ -47,7 +47,7 @@ namespace Avogadro
83  
84        CameraPrivate() {};
85  
86 -      Eigen::Transform3d modelview, projection;
87 +      Eigen::Projective3d modelview, projection;
88        const GLWidget *parent;
89        double angleOfViewY;
90        double orthoScale;
91 @@ -169,20 +169,20 @@ namespace Avogadro
92  
93    double Camera::distance(const Eigen::Vector3d & point) const
94    {
95 -    return ( d->modelview * point ).norm();
96 +    return ( d->modelview * point.homogeneous() ).head<3>().norm();
97    }
98  
99 -  void Camera::setModelview(const Eigen::Transform3d &matrix)
100 +  void Camera::setModelview(const Eigen::Projective3d &matrix)
101    {
102      d->modelview = matrix;
103    }
104  
105 -  const Eigen::Transform3d & Camera::modelview() const
106 +  const Eigen::Projective3d & Camera::modelview() const
107    {
108      return d->modelview;
109    }
110  
111 -  Eigen::Transform3d & Camera::modelview()
112 +  Eigen::Projective3d & Camera::modelview()
113    {
114      return d->modelview;
115    }
116 diff -rupN avogadro-1.2.0/libavogadro/src/camera.h avogadro-1.2.0-new/libavogadro/src/camera.h
117 --- avogadro-1.2.0/libavogadro/src/camera.h     2016-06-08 16:19:45.000000000 +0200
118 +++ avogadro-1.2.0-new/libavogadro/src/camera.h 2018-01-03 14:45:25.171574246 +0100
119 @@ -101,16 +101,16 @@ namespace Avogadro {
120        double angleOfViewY() const;
121        /** Sets 4x4 "modelview" matrix representing the camera orientation and position.
122          * @param matrix the matrix to copy from
123 -        * @sa Eigen::Transform3d & modelview(), applyModelview() */
124 -      void setModelview(const Eigen::Transform3d &matrix);
125 +        * @sa Eigen::Projective3d & modelview(), applyModelview() */
126 +      void setModelview(const Eigen::Projective3d &matrix);
127        /** @return a constant reference to the 4x4 "modelview" matrix representing
128          *         the camera orientation and position
129 -        * @sa setModelview(), Eigen::Transform3d & modelview() */
130 -      const Eigen::Transform3d & modelview() const;
131 +        * @sa setModelview(), Eigen::Projective3d & modelview() */
132 +      const Eigen::Projective3d & modelview() const;
133        /** @return a non-constant reference to the 4x4 "modelview" matrix representing
134          *         the camera orientation and position
135 -        * @sa setModelview(), const Eigen::Transform3d & modelview() const */
136 -      Eigen::Transform3d & modelview();
137 +        * @sa setModelview(), const Eigen::Projective3d & modelview() const */
138 +      Eigen::Projective3d & modelview();
139        /** Calls gluPerspective() or glOrtho() with parameters automatically chosen
140          * for rendering the GLWidget's molecule with this camera. Should be called
141          * only in GL_PROJECTION matrix mode. Example code is given
142 @@ -342,7 +342,7 @@ namespace Avogadro {
143         * @return {x/w, y/w, z/w} vector
144         */
145        Eigen::Vector3d V4toV3DivW(const Eigen::Vector4d & v4) {
146 -        return v4.start<3>()/v4.w();
147 +        return v4.head<3>()/v4.w();
148        }
149    };
150  
151 diff -rupN avogadro-1.2.0/libavogadro/src/CMakeLists.txt avogadro-1.2.0-new/libavogadro/src/CMakeLists.txt
152 --- avogadro-1.2.0/libavogadro/src/CMakeLists.txt       2016-06-08 16:19:45.000000000 +0200
153 +++ avogadro-1.2.0-new/libavogadro/src/CMakeLists.txt   2018-01-03 14:48:09.786565140 +0100
154 @@ -14,15 +14,9 @@ include_directories(
155    ${OPENBABEL2_INCLUDE_DIR}
156  )
157  
158 -if(EIGEN3_FOUND)
159 -       include_directories(
160 -               ${EIGEN3_INCLUDE_DIR}
161 -       )
162 -elseif(EIGEN2_FOUND)
163 -       include_directories(
164 -               ${EIGEN2_INCLUDE_DIR}
165 -       )
166 -endif(EIGEN3_FOUND)
167 +include_directories(
168 +    ${EIGEN3_INCLUDE_DIR}
169 +)
170  
171  # I think this is necessary now in order to tell the linker where openbabel is
172  link_directories(${OPENBABEL2_LIBRARY_DIRS})
173 diff -rupN avogadro-1.2.0/libavogadro/src/engines/wireengine.cpp avogadro-1.2.0-new/libavogadro/src/engines/wireengine.cpp
174 --- avogadro-1.2.0/libavogadro/src/engines/wireengine.cpp       2016-06-08 16:19:45.000000000 +0200
175 +++ avogadro-1.2.0-new/libavogadro/src/engines/wireengine.cpp   2018-01-03 14:45:25.171574246 +0100
176 @@ -109,7 +109,7 @@ namespace Avogadro {
177      const Camera *camera = pd->camera();
178  
179      // perform a rough form of frustum culling
180 -    Eigen::Vector3d transformedPos = pd->camera()->modelview() * v;
181 +    Eigen::Vector3d transformedPos = (pd->camera()->modelview() * v.homogeneous()).head<3>();
182      double dot = transformedPos.z() / transformedPos.norm();
183      if(dot > -0.8)
184        return true;
185 @@ -167,7 +167,7 @@ namespace Avogadro {
186        map = pd->colorMap(); // fall back to global color map
187  
188      // perform a rough form of frustum culling
189 -    Eigen::Vector3d transformedEnd1 = pd->camera()->modelview() * v1;
190 +    Eigen::Vector3d transformedEnd1 = (pd->camera()->modelview() * v1.homogeneous()).head<3>();
191      double dot = transformedEnd1.z() / transformedEnd1.norm();
192      if(dot > -0.8)
193        return true; // i.e., don't bother rendering
194 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/crystallography/crystallographyextension.cpp avogadro-1.2.0-new/libavogadro/src/extensions/crystallography/crystallographyextension.cpp
195 --- avogadro-1.2.0/libavogadro/src/extensions/crystallography/crystallographyextension.cpp      2016-06-08 16:19:45.000000000 +0200
196 +++ avogadro-1.2.0-new/libavogadro/src/extensions/crystallography/crystallographyextension.cpp  2018-01-03 14:45:25.172574245 +0100
197 @@ -1989,7 +1989,7 @@ namespace Avogadro
198      // fix coordinates
199      // Apply COB matrix:
200      Eigen::Matrix3d invCob;
201 -    cob.computeInverse(&invCob);
202 +    invCob = cob.inverse();
203      for (QList<Eigen::Vector3d>::iterator
204             it = fcoords.begin(),
205             it_end = fcoords.end();
206 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/crystallography/ui/ceviewoptionswidget.cpp avogadro-1.2.0-new/libavogadro/src/extensions/crystallography/ui/ceviewoptionswidget.cpp
207 --- avogadro-1.2.0/libavogadro/src/extensions/crystallography/ui/ceviewoptionswidget.cpp        2016-06-08 16:19:45.000000000 +0200
208 +++ avogadro-1.2.0-new/libavogadro/src/extensions/crystallography/ui/ceviewoptionswidget.cpp    2018-01-03 14:45:25.173574245 +0100
209 @@ -139,7 +139,7 @@ namespace Avogadro
210    {
211      // View into a Miller plane
212      Camera *camera = m_glWidget->camera();
213 -    Eigen::Transform3d modelView;
214 +    Eigen::Projective3d modelView;
215      modelView.setIdentity();
216  
217      // OK, so we want to rotate to look along the normal at the plane
218 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/orca/orcaanalysedialog.cpp avogadro-1.2.0-new/libavogadro/src/extensions/orca/orcaanalysedialog.cpp
219 --- avogadro-1.2.0/libavogadro/src/extensions/orca/orcaanalysedialog.cpp        2016-06-08 16:19:45.000000000 +0200
220 +++ avogadro-1.2.0-new/libavogadro/src/extensions/orca/orcaanalysedialog.cpp    2018-01-03 14:45:25.173574245 +0100
221 @@ -41,7 +41,6 @@
222  #include <openbabel/mol.h>
223  
224  #include <Eigen/Geometry>
225 -#include <Eigen/LeastSquares>
226  
227  #include <vector>
228  
229 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/orca/orcainputdialog.cpp avogadro-1.2.0-new/libavogadro/src/extensions/orca/orcainputdialog.cpp
230 --- avogadro-1.2.0/libavogadro/src/extensions/orca/orcainputdialog.cpp  2016-06-08 16:19:45.000000000 +0200
231 +++ avogadro-1.2.0-new/libavogadro/src/extensions/orca/orcainputdialog.cpp      2018-01-03 14:45:25.174574245 +0100
232 @@ -33,7 +33,6 @@
233  #include <openbabel/mol.h>
234  
235  #include <Eigen/Geometry>
236 -#include <Eigen/LeastSquares>
237  
238  #include <vector>
239  
240 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/qtaim/qtaimmathutilities.cpp avogadro-1.2.0-new/libavogadro/src/extensions/qtaim/qtaimmathutilities.cpp
241 --- avogadro-1.2.0/libavogadro/src/extensions/qtaim/qtaimmathutilities.cpp      2016-06-08 16:19:45.000000000 +0200
242 +++ avogadro-1.2.0-new/libavogadro/src/extensions/qtaim/qtaimmathutilities.cpp  2018-01-03 14:45:25.174574245 +0100
243 @@ -28,6 +28,7 @@
244  
245  #include <cmath>
246  #include <Eigen/QR>
247 +#include <Eigen/Eigenvalues>
248  
249  namespace Avogadro {
250    namespace QTAIMMathUtilities {
251 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/qtaim/qtaimwavefunctionevaluator.cpp avogadro-1.2.0-new/libavogadro/src/extensions/qtaim/qtaimwavefunctionevaluator.cpp
252 --- avogadro-1.2.0/libavogadro/src/extensions/qtaim/qtaimwavefunctionevaluator.cpp      2016-06-08 16:19:45.000000000 +0200
253 +++ avogadro-1.2.0-new/libavogadro/src/extensions/qtaim/qtaimwavefunctionevaluator.cpp  2018-01-03 14:45:25.186574245 +0100
254 @@ -35,21 +35,21 @@ namespace Avogadro
255      m_nprim=wfn.numberOfGaussianPrimitives();
256      m_nnuc=wfn.numberOfNuclei();
257  
258 -    m_nucxcoord=Map<Matrix<qreal,Dynamic,1> >(wfn.xNuclearCoordinates(),m_nnuc);
259 -    m_nucycoord=Map<Matrix<qreal,Dynamic,1> >(wfn.yNuclearCoordinates(),m_nnuc);
260 -    m_nuczcoord=Map<Matrix<qreal,Dynamic,1> >(wfn.zNuclearCoordinates(),m_nnuc);
261 -    m_nucz=Map<Matrix<qint64,Dynamic,1> >(wfn.nuclearCharges(),m_nnuc);
262 -    m_X0=Map<Matrix<qreal,Dynamic,1> >(wfn.xGaussianPrimitiveCenterCoordinates(),m_nprim,1);
263 -    m_Y0=Map<Matrix<qreal,Dynamic,1> >(wfn.yGaussianPrimitiveCenterCoordinates(),m_nprim,1);
264 -    m_Z0=Map<Matrix<qreal,Dynamic,1> >(wfn.zGaussianPrimitiveCenterCoordinates(),m_nprim,1);
265 -    m_xamom=Map<Matrix<qint64,Dynamic,1> >(wfn.xGaussianPrimitiveAngularMomenta(),m_nprim,1);
266 -    m_yamom=Map<Matrix<qint64,Dynamic,1> >(wfn.yGaussianPrimitiveAngularMomenta(),m_nprim,1);
267 -    m_zamom=Map<Matrix<qint64,Dynamic,1> >(wfn.zGaussianPrimitiveAngularMomenta(),m_nprim,1);
268 -    m_alpha=Map<Matrix<qreal,Dynamic,1> >(wfn.gaussianPrimitiveExponentCoefficients(),m_nprim,1);
269 +    m_nucxcoord=Map<const Matrix<qreal,Dynamic,1> >(wfn.xNuclearCoordinates(),m_nnuc);
270 +    m_nucycoord=Map<const Matrix<qreal,Dynamic,1> >(wfn.yNuclearCoordinates(),m_nnuc);
271 +    m_nuczcoord=Map<const Matrix<qreal,Dynamic,1> >(wfn.zNuclearCoordinates(),m_nnuc);
272 +    m_nucz=Map<const Matrix<qint64,Dynamic,1> >(wfn.nuclearCharges(),m_nnuc);
273 +    m_X0=Map<const Matrix<qreal,Dynamic,1> >(wfn.xGaussianPrimitiveCenterCoordinates(),m_nprim,1);
274 +    m_Y0=Map<const Matrix<qreal,Dynamic,1> >(wfn.yGaussianPrimitiveCenterCoordinates(),m_nprim,1);
275 +    m_Z0=Map<const Matrix<qreal,Dynamic,1> >(wfn.zGaussianPrimitiveCenterCoordinates(),m_nprim,1);
276 +    m_xamom=Map<const Matrix<qint64,Dynamic,1> >(wfn.xGaussianPrimitiveAngularMomenta(),m_nprim,1);
277 +    m_yamom=Map<const Matrix<qint64,Dynamic,1> >(wfn.yGaussianPrimitiveAngularMomenta(),m_nprim,1);
278 +    m_zamom=Map<const Matrix<qint64,Dynamic,1> >(wfn.zGaussianPrimitiveAngularMomenta(),m_nprim,1);
279 +    m_alpha=Map<const Matrix<qreal,Dynamic,1> >(wfn.gaussianPrimitiveExponentCoefficients(),m_nprim,1);
280      // TODO Implement screening for unoccupied molecular orbitals.
281 -    m_occno=Map<Matrix<qreal,Dynamic,1> >(wfn.molecularOrbitalOccupationNumbers(),m_nmo,1);
282 -    m_orbe=Map<Matrix<qreal,Dynamic,1> >(wfn.molecularOrbitalEigenvalues(),m_nmo,1);
283 -    m_coef=Map<Matrix<qreal,Dynamic,Dynamic,RowMajor> >(wfn.molecularOrbitalCoefficients(),m_nmo,m_nprim);
284 +    m_occno=Map<const Matrix<qreal,Dynamic,1> >(wfn.molecularOrbitalOccupationNumbers(),m_nmo,1);
285 +    m_orbe=Map<const Matrix<qreal,Dynamic,1> >(wfn.molecularOrbitalEigenvalues(),m_nmo,1);
286 +    m_coef=Map<const Matrix<qreal,Dynamic,Dynamic,RowMajor> >(wfn.molecularOrbitalCoefficients(),m_nmo,m_nprim);
287      m_totalEnergy=wfn.totalEnergy();
288      m_virialRatio=wfn.virialRatio();
289  
290 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/surfaces/openqube/CMakeLists.txt avogadro-1.2.0-new/libavogadro/src/extensions/surfaces/openqube/CMakeLists.txt
291 --- avogadro-1.2.0/libavogadro/src/extensions/surfaces/openqube/CMakeLists.txt  2016-06-08 16:19:45.000000000 +0200
292 +++ avogadro-1.2.0-new/libavogadro/src/extensions/surfaces/openqube/CMakeLists.txt      2018-01-03 14:47:58.215565780 +0100
293 @@ -1,13 +1,6 @@
294  find_package(Qt4 4.6 REQUIRED)
295 -find_package(Eigen3)
296 -if(NOT EIGEN3_FOUND)
297 -  message(STATUS "Cannot find Eigen3, trying Eigen2")
298 -  find_package(Eigen2 REQUIRED)
299 -else()
300 -  set (EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API TRUE)
301 -endif()
302  
303 -include_directories(${QT_INCLUDE_DIR} ${EIGEN2_INCLUDE_DIR})
304 +include_directories(${QT_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR})
305  
306  # Headers for our public API
307  set(openqube_HDRS
308 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/surfaces/openqube/gamessukout.cpp avogadro-1.2.0-new/libavogadro/src/extensions/surfaces/openqube/gamessukout.cpp
309 --- avogadro-1.2.0/libavogadro/src/extensions/surfaces/openqube/gamessukout.cpp 2016-06-08 16:19:45.000000000 +0200
310 +++ avogadro-1.2.0-new/libavogadro/src/extensions/surfaces/openqube/gamessukout.cpp     2018-01-03 14:45:25.176574245 +0100
311 @@ -19,6 +19,7 @@
312  using Eigen::Vector3d;
313  using std::vector;
314  
315 +#include <iostream>
316  #include <fstream>
317  
318  namespace OpenQube
319 diff -rupN avogadro-1.2.0/libavogadro/src/extensions/surfaces/openqube/slaterset.cpp avogadro-1.2.0-new/libavogadro/src/extensions/surfaces/openqube/slaterset.cpp
320 --- avogadro-1.2.0/libavogadro/src/extensions/surfaces/openqube/slaterset.cpp   2016-06-08 16:19:45.000000000 +0200
321 +++ avogadro-1.2.0-new/libavogadro/src/extensions/surfaces/openqube/slaterset.cpp       2018-01-03 14:45:25.187574245 +0100
322 @@ -25,9 +25,9 @@
323  
324  #include "cube.h"
325  
326 -#include <Eigen/Array>
327  #include <Eigen/LU>
328  #include <Eigen/QR>
329 +#include <Eigen/Eigenvalues>
330  
331  #include <cmath>
332  
333 @@ -250,7 +250,9 @@ bool SlaterSet::initialize()
334  
335    SelfAdjointEigenSolver<MatrixXd> s(m_overlap);
336    MatrixXd p = s.eigenvectors();
337 -  MatrixXd m = p * s.eigenvalues().cwise().inverse().cwise().sqrt().asDiagonal() * p.inverse();
338 +
339 +  MatrixXd m = p * s.eigenvalues().array().inverse().sqrt().matrix().asDiagonal() * p.inverse();
340 +
341    m_normalized = m * m_eigenVectors;
342  
343    if (!(m_overlap*m*m).isIdentity())
344 diff -rupN avogadro-1.2.0/libavogadro/src/glpainter_p.cpp avogadro-1.2.0-new/libavogadro/src/glpainter_p.cpp
345 --- avogadro-1.2.0/libavogadro/src/glpainter_p.cpp      2016-06-08 16:19:45.000000000 +0200
346 +++ avogadro-1.2.0-new/libavogadro/src/glpainter_p.cpp  2018-01-03 14:45:25.177574245 +0100
347 @@ -789,13 +789,13 @@ namespace Avogadro
348          } else {
349            points[theta-1] = Eigen::AngleAxisd(theta * (M_PI / 180.0) / 2, n) * u;
350          }
351 -        points[theta-1] = d->widget->camera()->modelview() * (origin + points[theta-1]);
352 +        points[theta-1] = (d->widget->camera()->modelview() * (origin + points[theta-1]).homogeneous()).head<3>();
353        }
354  
355      // Get vectors representing the points' positions in terms of the model view.
356 -    Eigen::Vector3d _origin = d->widget->camera()->modelview() * origin;
357 -    Eigen::Vector3d _direction1 = d->widget->camera()->modelview() * (origin+u);
358 -    Eigen::Vector3d _direction2 = d->widget->camera()->modelview() * (origin+v);
359 +    Eigen::Vector3d _origin = (d->widget->camera()->modelview() * origin.homogeneous()).head<3>();
360 +    Eigen::Vector3d _direction1 = (d->widget->camera()->modelview() * (origin+u).homogeneous()).head<3>();
361 +    Eigen::Vector3d _direction2 = (d->widget->camera()->modelview() * (origin+v).homogeneous()).head<3>();
362  
363      glPushAttrib(GL_ALL_ATTRIB_BITS);
364      glPushMatrix();
365 @@ -880,12 +880,12 @@ namespace Avogadro
366          } else {
367            points[theta-1] = Eigen::AngleAxisd(theta * (M_PI / 180.0) / 2, n) * u;
368          }
369 -        points[theta-1] = d->widget->camera()->modelview() * (origin + points[theta-1]);
370 +        points[theta-1] = (d->widget->camera()->modelview() * (origin + points[theta-1]).homogeneous()).head<3>();
371        }
372  
373      // Get vectors representing the points' positions in terms of the model view.
374 -    Eigen::Vector3d _direction1 = d->widget->camera()->modelview() * (origin + u);
375 -    Eigen::Vector3d _direction2 = d->widget->camera()->modelview() * (origin + v);
376 +    Eigen::Vector3d _direction1 = (d->widget->camera()->modelview() * (origin + u).homogeneous()).head<3>();
377 +    Eigen::Vector3d _direction2 = (d->widget->camera()->modelview() * (origin + v).homogeneous()).head<3>();
378  
379      glPushAttrib(GL_ALL_ATTRIB_BITS);
380      glPushMatrix();
381 diff -rupN avogadro-1.2.0/libavogadro/src/glwidget.cpp avogadro-1.2.0-new/libavogadro/src/glwidget.cpp
382 --- avogadro-1.2.0/libavogadro/src/glwidget.cpp 2016-06-08 16:19:45.000000000 +0200
383 +++ avogadro-1.2.0-new/libavogadro/src/glwidget.cpp     2018-01-03 14:45:25.178574245 +0100
384 @@ -765,7 +765,7 @@ namespace Avogadro {
385        GLfloat fogColor[4]= {static_cast<GLfloat>(d->background.redF()), static_cast<GLfloat>(d->background.greenF()),
386                              static_cast<GLfloat>(d->background.blueF()), static_cast<GLfloat>(d->background.alphaF())};
387        glFogfv(GL_FOG_COLOR, fogColor);
388 -      Vector3d distance = camera()->modelview() * d->center;
389 +      Vector3d distance = (camera()->modelview() * d->center.homogeneous()).head<3>();
390        double distanceToCenter = distance.norm();
391        glFogf(GL_FOG_DENSITY, 1.0);
392        glHint(GL_FOG_HINT, GL_NICEST);
393 @@ -1711,7 +1711,7 @@ namespace Avogadro {
394  
395        if (d->renderModelViewDebug) {
396          // Model view matrix:
397 -        const Eigen::Transform3d &modelview = d->camera->modelview();
398 +        const Eigen::Projective3d &modelview = d->camera->modelview();
399          y += d->pd->painter()->drawText
400              (x, y, tr("ModelView row 1: %L1 %L2 %L3 %L4")
401               .arg(modelview(0, 0), 6, 'f', 2, ' ')
402 diff -rupN avogadro-1.2.0/libavogadro/src/leastsquares.h avogadro-1.2.0-new/libavogadro/src/leastsquares.h
403 --- avogadro-1.2.0/libavogadro/src/leastsquares.h       1970-01-01 01:00:00.000000000 +0100
404 +++ avogadro-1.2.0-new/libavogadro/src/leastsquares.h   2018-01-03 14:45:25.187574245 +0100
405 @@ -0,0 +1,74 @@
406 +/**********************************************************************
407 +  LeastSquares - Least squares functions removed from Eigen2 codebase
408 +
409 +  Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
410 +
411 +  This file is part of the Avogadro molecular editor project.
412 +  For more information, see <http://avogadro.cc/>
413 +
414 +  Avogadro is free software; you can redistribute it and/or modify
415 +  it under the terms of the GNU General Public License as published by
416 +  the Free Software Foundation; either version 2 of the License, or
417 +  (at your option) any later version.
418 +
419 +  Avogadro is distributed in the hope that it will be useful,
420 +  but WITHOUT ANY WARRANTY; without even the implied warranty of
421 +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
422 +  GNU General Public License for more details.
423 +
424 +  You should have received a copy of the GNU General Public License
425 +  along with this program; if not, write to the Free Software
426 +  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
427 +  02110-1301, USA.
428 + **********************************************************************/
429 +
430 +#ifndef LEASTSQUARES_H
431 +#define LEASTSQUARES_H
432 +
433 +#include <Eigen/Eigenvalues>
434 +
435 +namespace Avogadro
436 +{
437 +
438 +template<typename VectorType, typename HyperplaneType>
439 +void fitHyperplane(int numPoints,
440 +                   VectorType **points,
441 +                   HyperplaneType *result,
442 +                   typename Eigen::NumTraits<typename VectorType::Scalar>::Real* soundness = 0)
443 +{
444 +  typedef typename VectorType::Scalar Scalar;
445 +  typedef Eigen::Matrix<Scalar,VectorType::SizeAtCompileTime,VectorType::SizeAtCompileTime> CovMatrixType;
446 +  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType)
447 +  assert(numPoints >= 1);
448 +  int size = points[0]->size();
449 +  assert(size+1 == result->coeffs().size());
450 +
451 +  // compute the mean of the data
452 +  VectorType mean = VectorType::Zero(size);
453 +  for(int i = 0; i < numPoints; ++i)
454 +    mean += *(points[i]);
455 +  mean /= numPoints;
456 +
457 +  // compute the covariance matrix
458 +  CovMatrixType covMat = CovMatrixType::Zero(size, size);
459 +  VectorType remean = VectorType::Zero(size);
460 +  for(int i = 0; i < numPoints; ++i)
461 +  {
462 +    VectorType diff = (*(points[i]) - mean).conjugate();
463 +    covMat += diff * diff.adjoint();
464 +  }
465 +
466 +  // now we just have to pick the eigen vector with smallest eigen value
467 +  Eigen::SelfAdjointEigenSolver<CovMatrixType> eig(covMat);
468 +  result->normal() = eig.eigenvectors().col(0);
469 +  if (soundness)
470 +    *soundness = eig.eigenvalues().coeff(0)/eig.eigenvalues().coeff(1);
471 +
472 +  // let's compute the constant coefficient such that the
473 +  // plane pass trough the mean point:
474 +  result->offset() = - (result->normal().array() * mean.array()).sum();
475 +}
476 +
477 +} // end namespace Avogadro
478 +
479 +#endif
480 diff -rupN avogadro-1.2.0/libavogadro/src/molecule.cpp avogadro-1.2.0-new/libavogadro/src/molecule.cpp
481 --- avogadro-1.2.0/libavogadro/src/molecule.cpp 2016-06-08 16:19:45.000000000 +0200
482 +++ avogadro-1.2.0-new/libavogadro/src/molecule.cpp     2018-01-03 14:45:25.188574245 +0100
483 @@ -36,9 +36,9 @@
484  #include "primitivelist.h"
485  #include "residue.h"
486  #include "zmatrix.h"
487 +#include "leastsquares.h"
488  
489  #include <Eigen/Geometry>
490 -#include <Eigen/LeastSquares>
491  
492  #include <vector>
493  
494 @@ -1908,7 +1908,8 @@ namespace Avogadro{
495          }
496          d->center /= static_cast<double>(nAtoms);
497          Eigen::Hyperplane<double, 3> planeCoeffs;
498 -        Eigen::fitHyperplane(numAtoms(), atomPositions, &planeCoeffs);
499 +        fitHyperplane(numAtoms(), atomPositions, &planeCoeffs);
500 +
501          delete[] atomPositions;
502          d->normalVector = planeCoeffs.normal();
503        }
504 diff -rupN avogadro-1.2.0/libavogadro/src/navigate.cpp avogadro-1.2.0-new/libavogadro/src/navigate.cpp
505 --- avogadro-1.2.0/libavogadro/src/navigate.cpp 2016-06-08 16:19:45.000000000 +0200
506 +++ avogadro-1.2.0-new/libavogadro/src/navigate.cpp     2018-01-03 14:45:25.179574245 +0100
507 @@ -40,7 +40,7 @@ namespace Avogadro {
508    void Navigate::zoom(GLWidget *widget, const Eigen::Vector3d &goal,
509                        double delta)
510    {
511 -    Vector3d transformedGoal = widget->camera()->modelview() * goal;
512 +    Vector3d transformedGoal = (widget->camera()->modelview() * goal.homogeneous()).head<3>();
513      double distanceToGoal = transformedGoal.norm();
514  
515      double t = ZOOM_SPEED * delta;
516 diff -rupN avogadro-1.2.0/libavogadro/src/python/camera.cpp avogadro-1.2.0-new/libavogadro/src/python/camera.cpp
517 --- avogadro-1.2.0/libavogadro/src/python/camera.cpp    2016-06-08 16:19:45.000000000 +0200
518 +++ avogadro-1.2.0-new/libavogadro/src/python/camera.cpp        2018-01-03 14:45:25.181574245 +0100
519 @@ -10,7 +10,7 @@ using namespace Avogadro;
520  void export_Camera()
521  {
522  
523 -  const Eigen::Transform3d& (Camera::*modelview_ptr)() const = &Camera::modelview;
524 +  const Eigen::Projective3d& (Camera::*modelview_ptr)() const = &Camera::modelview;
525    Eigen::Vector3d (Camera::*unProject_ptr1)(const Eigen::Vector3d&) const = &Camera::unProject;
526    Eigen::Vector3d (Camera::*unProject_ptr2)(const QPoint&, const Eigen::Vector3d&) const = &Camera::unProject;
527    Eigen::Vector3d (Camera::*unProject_ptr3)(const QPoint&) const = &Camera::unProject;
528 diff -rupN avogadro-1.2.0/libavogadro/src/python/eigen.cpp avogadro-1.2.0-new/libavogadro/src/python/eigen.cpp
529 --- avogadro-1.2.0/libavogadro/src/python/eigen.cpp     2016-06-08 16:19:45.000000000 +0200
530 +++ avogadro-1.2.0-new/libavogadro/src/python/eigen.cpp 2018-01-03 14:45:25.182574245 +0100
531 @@ -305,9 +305,9 @@ template <> struct ScalarTraits<double>
532      struct innerclass
533      {
534        //
535 -      //  Eigen::Transform3d --> python array (4x4)
536 +      //  Eigen::Projective3d --> python array (4x4)
537        //
538 -      static PyObject* convert(Eigen::Transform3d const &trans)
539 +      static PyObject* convert(Eigen::Projective3d const &trans)
540        {
541          npy_intp dims[2] = { 4, 4 };
542          PyObject *result = PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
543 @@ -321,9 +321,9 @@ template <> struct ScalarTraits<double>
544          return incref(result);
545        }
546        //
547 -      //  Eigen::Transform3d* --> python array (4x4)
548 +      //  Eigen::Projective3d* --> python array (4x4)
549        //
550 -      static PyObject* convert(Eigen::Transform3d *trans)
551 +      static PyObject* convert(Eigen::Projective3d *trans)
552        {
553          npy_intp dims[2] = { 4, 4 };
554          PyObject *result = PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
555 @@ -337,9 +337,9 @@ template <> struct ScalarTraits<double>
556          return incref(result);
557        }
558        //
559 -      //  const Eigen::Transform3d* --> python array (4x4)
560 +      //  const Eigen::Projective3d* --> python array (4x4)
561        //
562 -      static PyObject* convert(const Eigen::Transform3d *trans)
563 +      static PyObject* convert(const Eigen::Projective3d *trans)
564        {
565          npy_intp dims[2] = { 4, 4 };
566          PyObject *result = PyArray_SimpleNew(2, dims, PyArray_DOUBLE);
567 @@ -358,10 +358,10 @@ template <> struct ScalarTraits<double>
568      Transform3d_to_python_array()
569      {
570        #ifndef WIN32
571 -      to_python_converter<Eigen::Transform3d, innerclass>();
572 +      to_python_converter<Eigen::Projective3d, innerclass>();
573        #endif
574 -      to_python_converter<Eigen::Transform3d*, innerclass>();
575 -      to_python_converter<const Eigen::Transform3d*, innerclass>();
576 +      to_python_converter<Eigen::Projective3d*, innerclass>();
577 +      to_python_converter<const Eigen::Projective3d*, innerclass>();
578      }
579  
580    };
581 @@ -373,17 +373,17 @@ template <> struct ScalarTraits<double>
582        // Insert an rvalue from_python converter at the tail of the
583        // chain. Used for implicit conversions
584        //
585 -      //  python array --> Eigen::Transform3d
586 +      //  python array --> Eigen::Projective3d
587        //
588        // used for:
589        //
590 -      //  void function(Eigen::Transform3d vec)
591 -      //  void function(Eigen::Transform3d & vec)
592 -      //  void function(const Eigen::Transform3d & vec)
593 +      //  void function(Eigen::Projective3d vec)
594 +      //  void function(Eigen::Projective3d & vec)
595 +      //  void function(const Eigen::Projective3d & vec)
596        //
597 -      converter::registry::push_back( &convertible, &construct, type_id<Eigen::Transform3d>() );
598 +      converter::registry::push_back( &convertible, &construct, type_id<Eigen::Projective3d>() );
599        
600 -      converter::registry::insert( &convert, type_id<Eigen::Transform3d>() );
601 +      converter::registry::insert( &convert, type_id<Eigen::Projective3d>() );
602      }
603  
604      static void* convert(PyObject *obj_ptr)
605 @@ -401,7 +401,7 @@ template <> struct ScalarTraits<double>
606          throw_error_already_set(); // the 1D array does not have exactly 3 elements
607  
608        double *values = reinterpret_cast<double*>(array->data);
609 -      Eigen::Transform3d *c_obj = new Eigen::Transform3d();
610 +      Eigen::Projective3d *c_obj = new Eigen::Projective3d();
611        double *dataPtr = c_obj->data();
612  
613        for (int i = 0; i < 16; ++i)
614 @@ -432,7 +432,7 @@ template <> struct ScalarTraits<double>
615        // I think this is a better way to get at the double array, where is this
616        // deleted though? Does Boost::Python do it?
617        double *values = reinterpret_cast<double*>(array->data);
618 -      Eigen::Transform3d *storage = new Eigen::Transform3d();
619 +      Eigen::Projective3d *storage = new Eigen::Projective3d();
620        double *dataPtr = storage->data();
621  
622        for (int i = 0; i < 16; ++i)
623 @@ -467,21 +467,21 @@ class EigenUnitTestHelper
624      void set_vector3d_ptr(Eigen::Vector3d* vec)                 { m_vector3d = *vec; }
625      void set_const_vector3d_ptr(const Eigen::Vector3d* const vec) { m_vector3d = *vec; }
626  
627 -    //Eigen::Transform3d             transform3d()              { return m_transform3d; }
628 -    //Eigen::Transform3d&            transform3d_ref()          { return m_transform3d; }
629 -    const Eigen::Transform3d&      const_transform3d_ref()    { return m_transform3d; }
630 -    Eigen::Transform3d*            transform3d_ptr()          { return &m_transform3d; }
631 -    const Eigen::Transform3d*      const_transform3d_ptr()    { return &m_transform3d; }
632 -
633 -    //void set_transform3d(Eigen::Transform3d vec)                      { m_transform3d = vec; }
634 -    //void set_transform3d_ref(Eigen::Transform3d& vec)                 { m_transform3d = vec; }
635 -    void set_const_transform3d_ref(const Eigen::Transform3d& vec)     { m_transform3d = vec; }
636 -    void set_transform3d_ptr(Eigen::Transform3d* vec)                 { m_transform3d = *vec; }
637 -    void set_const_transform3d_ptr(const Eigen::Transform3d* const vec) { m_transform3d = *vec; }
638 +    //Eigen::Projective3d             transform3d()              { return m_transform3d; }
639 +    //Eigen::Projective3d&            transform3d_ref()          { return m_transform3d; }
640 +    const Eigen::Projective3d&      const_transform3d_ref()    { return m_transform3d; }
641 +    Eigen::Projective3d*            transform3d_ptr()          { return &m_transform3d; }
642 +    const Eigen::Projective3d*      const_transform3d_ptr()    { return &m_transform3d; }
643 +
644 +    //void set_transform3d(Eigen::Projective3d vec)                      { m_transform3d = vec; }
645 +    //void set_transform3d_ref(Eigen::Projective3d& vec)                 { m_transform3d = vec; }
646 +    void set_const_transform3d_ref(const Eigen::Projective3d& vec)     { m_transform3d = vec; }
647 +    void set_transform3d_ptr(Eigen::Projective3d* vec)                 { m_transform3d = *vec; }
648 +    void set_const_transform3d_ptr(const Eigen::Projective3d* const vec) { m_transform3d = *vec; }
649   
650    private:
651      Eigen::Vector3d m_vector3d;
652 -    Eigen::Transform3d m_transform3d;
653 +    Eigen::Projective3d m_transform3d;
654  
655  };
656  #endif
657 @@ -529,7 +529,7 @@ void export_Eigen()
658    Vector3x_to_python_array<Eigen::Vector3i>();
659    Vector3x_from_python_array<Eigen::Vector3i>();
660  
661 -  // Eigen::Transform3d
662 +  // Eigen::Projective3d
663    Transform3d_to_python_array();
664    Transform3d_from_python_array();
665  
666 diff -rupN avogadro-1.2.0/libavogadro/src/tools/bondcentrictool.cpp avogadro-1.2.0-new/libavogadro/src/tools/bondcentrictool.cpp
667 --- avogadro-1.2.0/libavogadro/src/tools/bondcentrictool.cpp    2016-06-08 16:19:45.000000000 +0200
668 +++ avogadro-1.2.0-new/libavogadro/src/tools/bondcentrictool.cpp        2018-01-03 14:45:25.188574245 +0100
669 @@ -578,8 +578,13 @@ namespace Avogadro {
670  
671            Vector3d clicked = *m_clickedAtom->pos();
672  
673 -          Vector3d axis = Vector3d(0, 0, ((widget->camera()->modelview() * other).z() >=
674 -                (widget->camera()->modelview() * center).z() ? -1 : 1));
675 +          Eigen::Vector4d otherTransformedHomog = widget->camera()->modelview() * other.homogeneous();
676 +          Vector3d otherTransformed = otherTransformedHomog.hnormalized();
677 +          Eigen::Vector4d centerTransformedHomog = (widget->camera()->modelview() * center.homogeneous());
678 +          Vector3d centerTransformed = centerTransformedHomog.hnormalized();
679 +
680 +          Vector3d axis = Vector3d(0, 0, (otherTransformed.z() >=
681 +                                          centerTransformed.z() ? -1 : 1));
682  
683            Vector3d centerProj = widget->camera()->project(center);
684            centerProj -= Vector3d(0,0,centerProj.z());
685 @@ -673,8 +678,13 @@ namespace Avogadro {
686  
687            Vector3d clicked = *m_clickedAtom->pos();
688  
689 -          Vector3d axis = Vector3d(0, 0, ((widget->camera()->modelview() * other).z() >=
690 -                (widget->camera()->modelview() * center).z() ? -1 : 1));
691 +          Eigen::Vector4d otherTransformedHomog = (widget->camera()->modelview() * other.homogeneous());
692 +          Vector3d otherTransformed = otherTransformedHomog.hnormalized();
693 +          Eigen::Vector4d centerTransformedHomog = (widget->camera()->modelview() * center.homogeneous());
694 +          Vector3d centerTransformed = centerTransformedHomog.hnormalized();
695 +
696 +          Vector3d axis = Vector3d(0, 0, (otherTransformed.z() >=
697 +                                          centerTransformed.z() ? -1 : 1));
698  
699            Vector3d centerProj = widget->camera()->project(center);
700            centerProj -= Vector3d(0,0,centerProj.z());
701 @@ -1362,10 +1372,10 @@ namespace Avogadro {
702  
703      planeVec = length * (planeVec / planeVec.norm());
704  
705 -    Vector3d topLeft = widget->camera()->modelview() * (left + planeVec);
706 -    Vector3d topRight = widget->camera()->modelview() * (right + planeVec);
707 -    Vector3d botRight = widget->camera()->modelview() * (right - planeVec);
708 -    Vector3d botLeft = widget->camera()->modelview() * (left - planeVec);
709 +    Vector3d topLeft = (widget->camera()->modelview() * (left + planeVec).homogeneous()).head<3>();
710 +    Vector3d topRight = (widget->camera()->modelview() * (right + planeVec).homogeneous()).head<3>();
711 +    Vector3d botRight = (widget->camera()->modelview() * (right - planeVec).homogeneous()).head<3>();
712 +    Vector3d botLeft = (widget->camera()->modelview() * (left - planeVec).homogeneous()).head<3>();
713  
714      float alpha = 0.4;
715      double lineWidth = 1.5;
716 @@ -1444,10 +1454,10 @@ namespace Avogadro {
717        C = D + ((C-D).normalized() * minWidth);
718      }
719  
720 -    Vector3d topLeft = widget->camera()->modelview() * D;
721 -    Vector3d topRight = widget->camera()->modelview() * C;
722 -    Vector3d botRight = widget->camera()->modelview() * B;
723 -    Vector3d botLeft = widget->camera()->modelview() * A;
724 +    Vector3d topLeft = (widget->camera()->modelview() * D.homogeneous()).head<3>();
725 +    Vector3d topRight = (widget->camera()->modelview() * C.homogeneous()).head<3>();
726 +    Vector3d botRight = (widget->camera()->modelview() * B.homogeneous()).head<3>();
727 +    Vector3d botLeft = (widget->camera()->modelview() * A.homogeneous()).head<3>();
728  
729      float alpha = 0.4;
730      double lineWidth = 1.5;
731 @@ -1506,12 +1516,12 @@ namespace Avogadro {
732        Vector3d positionVector)
733    {
734      //Rotate skeleton around a particular axis and center point
735 -    Eigen::Transform3d rotation;
736 +    Eigen::Projective3d rotation;
737      rotation = Eigen::AngleAxisd(angle, rotationVector);
738      rotation.pretranslate(centerVector);
739      rotation.translate(-centerVector);
740  
741 -    return rotation*positionVector;
742 +    return (rotation*positionVector.homogeneous()).head<3>();
743    }
744  
745    // ##########  showAnglesChanged  ##########
746 diff -rupN avogadro-1.2.0/libavogadro/src/tools/manipulatetool.cpp avogadro-1.2.0-new/libavogadro/src/tools/manipulatetool.cpp
747 --- avogadro-1.2.0/libavogadro/src/tools/manipulatetool.cpp     2016-06-08 16:19:45.000000000 +0200
748 +++ avogadro-1.2.0-new/libavogadro/src/tools/manipulatetool.cpp 2018-01-03 14:45:25.180574245 +0100
749 @@ -40,7 +40,6 @@
750  #include <QAbstractButton>
751  
752  using Eigen::Vector3d;
753 -using Eigen::Transform3d;
754  using Eigen::AngleAxisd;
755  
756  namespace Avogadro {
757 @@ -138,7 +137,7 @@ namespace Avogadro {
758      double yRotate = m_settingsWidget->yRotateSpinBox->value() * DEG_TO_RAD;
759      double zRotate = m_settingsWidget->zRotateSpinBox->value() * DEG_TO_RAD;
760  
761 -    Eigen::Transform3d rotation;
762 +    Eigen::Projective3d rotation;
763      rotation.matrix().setIdentity();
764      rotation.translation() = center;
765      rotation.rotate(AngleAxisd(xRotate, Vector3d::UnitX())
766 @@ -152,12 +151,12 @@ namespace Avogadro {
767          if (p->type() == Primitive::AtomType) {
768            Atom *atom = static_cast<Atom*>(p);
769            tempPos = translate + *(atom->pos());
770 -          atom->setPos(rotation * tempPos);
771 +          atom->setPos((rotation * tempPos.homogeneous()).head<3>());
772          }
773      } else {
774        foreach(Atom *atom, widget->molecule()->atoms()) {
775          tempPos = translate + *(atom->pos());
776 -        atom->setPos(rotation * tempPos);
777 +        atom->setPos((rotation * tempPos.homogeneous()).head<3>());
778        }
779      }
780  
781 @@ -199,7 +198,7 @@ namespace Avogadro {
782      widget->setCursor(Qt::SizeVerCursor);
783  
784      // Move the selected atom(s) in to or out of the screen
785 -    Vector3d transformedGoal = widget->camera()->modelview() * *goal;
786 +    Vector3d transformedGoal = (widget->camera()->modelview() * goal->homogeneous()).head<3>();
787      double distanceToGoal = transformedGoal.norm();
788  
789      double t = ZOOM_SPEED * delta;
790 @@ -255,7 +254,7 @@ namespace Avogadro {
791  
792      // Rotate the selected atoms about the center
793      // rotate only selected primitives
794 -    Transform3d fragmentRotation;
795 +    Eigen::Projective3d fragmentRotation;
796      fragmentRotation.matrix().setIdentity();
797      fragmentRotation.translation() = *center;
798      fragmentRotation.rotate(
799 @@ -266,7 +265,7 @@ namespace Avogadro {
800  
801      foreach(Primitive *p, widget->selectedPrimitives())
802        if (p->type() == Primitive::AtomType)
803 -        static_cast<Atom *>(p)->setPos(fragmentRotation * *static_cast<Atom *>(p)->pos());
804 +        static_cast<Atom *>(p)->setPos((fragmentRotation * static_cast<Atom *>(p)->pos()->homogeneous()).head<3>());
805      widget->molecule()->update();
806    }
807  
808 @@ -274,7 +273,7 @@ namespace Avogadro {
809                              double delta) const
810    {
811      // Tilt the selected atoms about the center
812 -    Transform3d fragmentRotation;
813 +    Eigen::Projective3d fragmentRotation;
814      fragmentRotation.matrix().setIdentity();
815      fragmentRotation.translation() = *center;
816      fragmentRotation.rotate(AngleAxisd(delta * ROTATION_SPEED, widget->camera()->backTransformedZAxis()));
817 @@ -282,7 +281,7 @@ namespace Avogadro {
818  
819      foreach(Primitive *p, widget->selectedPrimitives())
820        if (p->type() == Primitive::AtomType)
821 -        static_cast<Atom *>(p)->setPos(fragmentRotation * *static_cast<Atom *>(p)->pos());
822 +        static_cast<Atom *>(p)->setPos((fragmentRotation * static_cast<Atom *>(p)->pos()->homogeneous()).head<3>());
823      widget->molecule()->update();
824    }
825  
826 diff -rupN avogadro-1.2.0/libavogadro/src/tools/navigatetool.cpp avogadro-1.2.0-new/libavogadro/src/tools/navigatetool.cpp
827 --- avogadro-1.2.0/libavogadro/src/tools/navigatetool.cpp       2016-06-08 16:19:45.000000000 +0200
828 +++ avogadro-1.2.0-new/libavogadro/src/tools/navigatetool.cpp   2018-01-03 14:45:25.180574245 +0100
829 @@ -92,7 +92,8 @@ namespace Avogadro {
830        double sumOfWeights = 0.;
831        QList<Atom*> atoms = widget->molecule()->atoms();
832        foreach (Atom *atom, atoms) {
833 -        Vector3d transformedAtomPos = widget->camera()->modelview() * *atom->pos();
834 +        Vector3d transformedAtomPos = (widget->camera()->modelview() *
835 +                                       atom->pos()->homogeneous()).head<3>();
836          double atomDistance = transformedAtomPos.norm();
837          double dot = transformedAtomPos.z() / atomDistance;
838          double weight = exp(-30. * (1. + dot));
839 diff -rupN avogadro-1.2.0/libavogadro/src/tools/skeletontree.cpp avogadro-1.2.0-new/libavogadro/src/tools/skeletontree.cpp
840 --- avogadro-1.2.0/libavogadro/src/tools/skeletontree.cpp       2016-06-08 16:19:45.000000000 +0200
841 +++ avogadro-1.2.0-new/libavogadro/src/tools/skeletontree.cpp   2018-01-03 14:45:25.181574245 +0100
842 @@ -29,6 +29,7 @@
843  #include <avogadro/atom.h>
844  #include <avogadro/bond.h>
845  #include <avogadro/molecule.h>
846 +#include <iostream>
847  
848  using namespace Eigen;
849  using namespace std;
850 @@ -221,7 +222,7 @@ namespace Avogadro {
851    {
852      if (m_rootNode) {
853        //Rotate skeleton around a particular axis and center point
854 -      Eigen::Transform3d rotation;
855 +      Eigen::Projective3d rotation;
856        rotation = Eigen::AngleAxisd(angle, rotationAxis);
857        rotation.pretranslate(centerVector);
858        rotation.translate(-centerVector);
859 @@ -248,11 +249,11 @@ namespace Avogadro {
860    // ##########  recursiveRotate  ##########
861  
862    void SkeletonTree::recursiveRotate(Node* n,
863 -                                     const Eigen::Transform3d &rotationMatrix)
864 +                                     const Eigen::Projective3d &rotationMatrix)
865    {
866      // Update the root node with the new position
867      Atom* a = n->atom();
868 -    a->setPos(rotationMatrix * (*a->pos()));
869 +    a->setPos((rotationMatrix * (*a->pos()).homogeneous()).head<3>());
870      a->update();
871  
872      // Now update the children
873 diff -rupN avogadro-1.2.0/libavogadro/src/tools/skeletontree.h avogadro-1.2.0-new/libavogadro/src/tools/skeletontree.h
874 --- avogadro-1.2.0/libavogadro/src/tools/skeletontree.h 2016-06-08 16:19:45.000000000 +0200
875 +++ avogadro-1.2.0-new/libavogadro/src/tools/skeletontree.h     2018-01-03 14:45:25.181574245 +0100
876 @@ -230,7 +230,7 @@ namespace Avogadro {
877         * @param centerVector Center location to rotate around.
878         */
879        void recursiveRotate(Node* n,
880 -                           const Eigen::Transform3d &rotationMatrix);
881 +                           const Eigen::Projective3d &rotationMatrix);
882  
883    };
884  } // End namespace Avogadro
885 diff -rupN avogadro-1.2.0/libavogadro/tests/CMakeLists.txt avogadro-1.2.0-new/libavogadro/tests/CMakeLists.txt
886 --- avogadro-1.2.0/libavogadro/tests/CMakeLists.txt     2016-06-08 16:19:45.000000000 +0200
887 +++ avogadro-1.2.0-new/libavogadro/tests/CMakeLists.txt 2018-01-03 14:46:31.890570555 +0100
888 @@ -13,7 +13,7 @@ set_directory_properties(PROPERTIES INCL
889  include_directories(
890    ${CMAKE_SOURCE_DIR}
891    ${CMAKE_CURRENT_BINARY_DIR}
892 -  ${EIGEN2_INCLUDE_DIR}
893 +  ${EIGEN3_INCLUDE_DIR}
894    ${OPENBABEL2_INCLUDE_DIR}
895    ${BOOST_PYTHON_INCLUDES}
896    ${PYTHON_INCLUDE_PATH}
This page took 1.701934 seconds and 3 git commands to generate.