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}
10 - ${EIGEN3_INCLUDE_DIR}
13 - include_directories(
14 - ${EIGEN2_INCLUDE_DIR}
18 + ${EIGEN3_INCLUDE_DIR}
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
29 #include <Eigen/Geometry>
30 -#include <Eigen/Array>
32 // This is a "hidden" exported Qt function on the Mac for Qt-4.x.
34 @@ -2775,7 +2774,7 @@ protected:
35 linearGoal.row(1) = linearGoal.row(2).cross(linearGoal.row(0));
37 // calculate the translation matrix
38 - Transform3d goal(linearGoal);
39 + Projective3d goal(linearGoal);
41 goal.pretranslate(- 3.0 * (d->glWidget->radius() + CAMERA_NEAR_DISTANCE) * Vector3d::UnitZ());
43 @@ -2840,7 +2839,7 @@ protected:
44 Matrix3d linearGoal = Matrix3d::Identity();
46 // calculate the translation matrix
47 - Transform3d goal(linearGoal);
48 + Projective3d goal(linearGoal);
50 goal.pretranslate(- 3.0 * (d->glWidget->radius() + CAMERA_NEAR_DISTANCE) * Vector3d::UnitZ());
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")
59 -find_package(Eigen3) # find and setup Eigen3 if available
61 - message(STATUS "Cannot find Eigen3, trying Eigen2")
62 - find_package(Eigen2 REQUIRED) # Some version is required
64 -# Use Stage10 Eigen3 support
65 - set (EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API TRUE)
67 +find_package(Eigen3 REQUIRED) # find and setup Eigen3
69 find_package(ZLIB REQUIRED)
70 find_package(OpenBabel2 REQUIRED) # find and setup OpenBabel
71 @@ -473,7 +466,6 @@ install(FILES
73 # Install the find modules we require to be present
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
86 - Eigen::Transform3d modelview, projection;
87 + Eigen::Projective3d modelview, projection;
88 const GLWidget *parent;
91 @@ -169,20 +169,20 @@ namespace Avogadro
93 double Camera::distance(const Eigen::Vector3d & point) const
95 - return ( d->modelview * point ).norm();
96 + return ( d->modelview * point.homogeneous() ).head<3>().norm();
99 - void Camera::setModelview(const Eigen::Transform3d &matrix)
100 + void Camera::setModelview(const Eigen::Projective3d &matrix)
102 d->modelview = matrix;
105 - const Eigen::Transform3d & Camera::modelview() const
106 + const Eigen::Projective3d & Camera::modelview() const
111 - Eigen::Transform3d & Camera::modelview()
112 + Eigen::Projective3d & Camera::modelview()
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
145 Eigen::Vector3d V4toV3DivW(const Eigen::Vector4d & v4) {
146 - return v4.start<3>()/v4.w();
147 + return v4.head<3>()/v4.w();
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}
159 - include_directories(
160 - ${EIGEN3_INCLUDE_DIR}
162 -elseif(EIGEN2_FOUND)
163 - include_directories(
164 - ${EIGEN2_INCLUDE_DIR}
167 +include_directories(
168 + ${EIGEN3_INCLUDE_DIR}
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();
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();
185 @@ -167,7 +167,7 @@ namespace Avogadro {
186 map = pd->colorMap(); // fall back to global color map
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();
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
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
211 // View into a Miller plane
212 Camera *camera = m_glWidget->camera();
213 - Eigen::Transform3d modelView;
214 + Eigen::Projective3d modelView;
215 modelView.setIdentity();
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
222 #include <openbabel/mol.h>
224 #include <Eigen/Geometry>
225 -#include <Eigen/LeastSquares>
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
233 #include <openbabel/mol.h>
235 #include <Eigen/Geometry>
236 -#include <Eigen/LeastSquares>
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
247 +#include <Eigen/Eigenvalues>
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();
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();
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
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)
300 - set (EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API TRUE)
303 -include_directories(${QT_INCLUDE_DIR} ${EIGEN2_INCLUDE_DIR})
304 +include_directories(${QT_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR})
306 # Headers for our public API
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
312 using Eigen::Vector3d;
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
326 -#include <Eigen/Array>
329 +#include <Eigen/Eigenvalues>
333 @@ -250,7 +250,9 @@ bool SlaterSet::initialize()
335 SelfAdjointEigenSolver<MatrixXd> s(m_overlap);
336 MatrixXd p = s.eigenvectors();
337 - MatrixXd m = p * s.eigenvalues().cwise().inverse().cwise().sqrt().asDiagonal() * p.inverse();
339 + MatrixXd m = p * s.eigenvalues().array().inverse().sqrt().matrix().asDiagonal() * p.inverse();
341 m_normalized = m * m_eigenVectors;
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
349 points[theta-1] = Eigen::AngleAxisd(theta * (M_PI / 180.0) / 2, n) * u;
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>();
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>();
363 glPushAttrib(GL_ALL_ATTRIB_BITS);
365 @@ -880,12 +880,12 @@ namespace Avogadro
367 points[theta-1] = Eigen::AngleAxisd(theta * (M_PI / 180.0) / 2, n) * u;
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>();
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>();
379 glPushAttrib(GL_ALL_ATTRIB_BITS);
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 {
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
406 +/**********************************************************************
407 + LeastSquares - Least squares functions removed from Eigen2 codebase
409 + Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
411 + This file is part of the Avogadro molecular editor project.
412 + For more information, see <http://avogadro.cc/>
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.
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.
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
428 + **********************************************************************/
430 +#ifndef LEASTSQUARES_H
431 +#define LEASTSQUARES_H
433 +#include <Eigen/Eigenvalues>
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)
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());
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]);
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)
462 + VectorType diff = (*(points[i]) - mean).conjugate();
463 + covMat += diff * diff.adjoint();
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);
470 + *soundness = eig.eigenvalues().coeff(0)/eig.eigenvalues().coeff(1);
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();
477 +} // end namespace Avogadro
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
484 #include "primitivelist.h"
487 +#include "leastsquares.h"
489 #include <Eigen/Geometry>
490 -#include <Eigen/LeastSquares>
494 @@ -1908,7 +1908,8 @@ namespace Avogadro{
496 d->center /= static_cast<double>(nAtoms);
497 Eigen::Hyperplane<double, 3> planeCoeffs;
498 - Eigen::fitHyperplane(numAtoms(), atomPositions, &planeCoeffs);
499 + fitHyperplane(numAtoms(), atomPositions, &planeCoeffs);
501 delete[] atomPositions;
502 d->normalVector = planeCoeffs.normal();
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,
511 - Vector3d transformedGoal = widget->camera()->modelview() * goal;
512 + Vector3d transformedGoal = (widget->camera()->modelview() * goal.homogeneous()).head<3>();
513 double distanceToGoal = transformedGoal.norm();
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;
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>
535 - // Eigen::Transform3d --> python array (4x4)
536 + // Eigen::Projective3d --> python array (4x4)
538 - static PyObject* convert(Eigen::Transform3d const &trans)
539 + static PyObject* convert(Eigen::Projective3d const &trans)
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);
547 - // Eigen::Transform3d* --> python array (4x4)
548 + // Eigen::Projective3d* --> python array (4x4)
550 - static PyObject* convert(Eigen::Transform3d *trans)
551 + static PyObject* convert(Eigen::Projective3d *trans)
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);
559 - // const Eigen::Transform3d* --> python array (4x4)
560 + // const Eigen::Projective3d* --> python array (4x4)
562 - static PyObject* convert(const Eigen::Transform3d *trans)
563 + static PyObject* convert(const Eigen::Projective3d *trans)
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()
571 - to_python_converter<Eigen::Transform3d, innerclass>();
572 + to_python_converter<Eigen::Projective3d, innerclass>();
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>();
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
585 - // python array --> Eigen::Transform3d
586 + // python array --> Eigen::Projective3d
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)
597 - converter::registry::push_back( &convertible, &construct, type_id<Eigen::Transform3d>() );
598 + converter::registry::push_back( &convertible, &construct, type_id<Eigen::Projective3d>() );
600 - converter::registry::insert( &convert, type_id<Eigen::Transform3d>() );
601 + converter::registry::insert( &convert, type_id<Eigen::Projective3d>() );
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
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();
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();
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; }
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; }
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; }
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; }
651 Eigen::Vector3d m_vector3d;
652 - Eigen::Transform3d m_transform3d;
653 + Eigen::Projective3d m_transform3d;
657 @@ -529,7 +529,7 @@ void export_Eigen()
658 Vector3x_to_python_array<Eigen::Vector3i>();
659 Vector3x_from_python_array<Eigen::Vector3i>();
661 - // Eigen::Transform3d
662 + // Eigen::Projective3d
663 Transform3d_to_python_array();
664 Transform3d_from_python_array();
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 {
671 Vector3d clicked = *m_clickedAtom->pos();
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();
680 + Vector3d axis = Vector3d(0, 0, (otherTransformed.z() >=
681 + centerTransformed.z() ? -1 : 1));
683 Vector3d centerProj = widget->camera()->project(center);
684 centerProj -= Vector3d(0,0,centerProj.z());
685 @@ -673,8 +678,13 @@ namespace Avogadro {
687 Vector3d clicked = *m_clickedAtom->pos();
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();
696 + Vector3d axis = Vector3d(0, 0, (otherTransformed.z() >=
697 + centerTransformed.z() ? -1 : 1));
699 Vector3d centerProj = widget->camera()->project(center);
700 centerProj -= Vector3d(0,0,centerProj.z());
701 @@ -1362,10 +1372,10 @@ namespace Avogadro {
703 planeVec = length * (planeVec / planeVec.norm());
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>();
715 double lineWidth = 1.5;
716 @@ -1444,10 +1454,10 @@ namespace Avogadro {
717 C = D + ((C-D).normalized() * minWidth);
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>();
730 double lineWidth = 1.5;
731 @@ -1506,12 +1516,12 @@ namespace Avogadro {
732 Vector3d positionVector)
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);
741 - return rotation*positionVector;
742 + return (rotation*positionVector.homogeneous()).head<3>();
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
750 #include <QAbstractButton>
752 using Eigen::Vector3d;
753 -using Eigen::Transform3d;
754 using Eigen::AngleAxisd;
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;
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>());
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>());
781 @@ -199,7 +198,7 @@ namespace Avogadro {
782 widget->setCursor(Qt::SizeVerCursor);
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();
789 double t = ZOOM_SPEED * delta;
790 @@ -255,7 +254,7 @@ namespace Avogadro {
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 {
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();
808 @@ -274,7 +273,7 @@ namespace Avogadro {
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 {
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();
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
843 #include <avogadro/atom.h>
844 #include <avogadro/bond.h>
845 #include <avogadro/molecule.h>
848 using namespace Eigen;
850 @@ -221,7 +222,7 @@ namespace Avogadro {
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 ##########
862 void SkeletonTree::recursiveRotate(Node* n,
863 - const Eigen::Transform3d &rotationMatrix)
864 + const Eigen::Projective3d &rotationMatrix)
866 // Update the root node with the new position
868 - a->setPos(rotationMatrix * (*a->pos()));
869 + a->setPos((rotationMatrix * (*a->pos()).homogeneous()).head<3>());
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.
879 void recursiveRotate(Node* n,
880 - const Eigen::Transform3d &rotationMatrix);
881 + const Eigen::Projective3d &rotationMatrix);
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
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}