Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2015-10-09 21:55:15 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2015-10-09 22:26:33 +0300
commit8159718fafc57cfbc9da7f706e599a91caccfa42 (patch)
tree4ddfa59687a8b4d048aafc0cdf66deb27acf5e0b /extern/Eigen3
parentad5f6a95dd8c76773306b4e7f891b6e97fbbcd20 (diff)
BLI: add SVD solver for mat3 (using eigen3).
Diffstat (limited to 'extern/Eigen3')
-rw-r--r--extern/Eigen3/CMakeLists.txt2
-rw-r--r--extern/Eigen3/eigen3_capi.h1
-rw-r--r--extern/Eigen3/intern/svd.cc72
-rw-r--r--extern/Eigen3/intern/svd.h40
4 files changed, 115 insertions, 0 deletions
diff --git a/extern/Eigen3/CMakeLists.txt b/extern/Eigen3/CMakeLists.txt
index 9bbfc9a3670..e3b63881aca 100644
--- a/extern/Eigen3/CMakeLists.txt
+++ b/extern/Eigen3/CMakeLists.txt
@@ -34,8 +34,10 @@ set(SRC
eigen3_capi.h
intern/eigenvalues.cc
+ intern/svd.cc
intern/eigenvalues.h
+ intern/svd.h
)
blender_add_lib(extern_eigen3 "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/extern/Eigen3/eigen3_capi.h b/extern/Eigen3/eigen3_capi.h
index 16f223793a9..f8a7b3cbb77 100644
--- a/extern/Eigen3/eigen3_capi.h
+++ b/extern/Eigen3/eigen3_capi.h
@@ -28,5 +28,6 @@
#define __EIGEN3_C_API_H__
#include "intern/eigenvalues.h"
+#include "intern/svd.h"
#endif /* __EIGEN3_C_API_H__ */
diff --git a/extern/Eigen3/intern/svd.cc b/extern/Eigen3/intern/svd.cc
new file mode 100644
index 00000000000..e39a8261edb
--- /dev/null
+++ b/extern/Eigen3/intern/svd.cc
@@ -0,0 +1,72 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2015 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation,
+ * Bastien Montagne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __EIGEN3_SVD_C_API_CC__
+#define __EIGEN3_SVD_C_API_CC__
+
+/* Eigen gives annoying huge amount of warnings here, silence them! */
+#ifdef __GNUC__
+# pragma GCC diagnostic ignored "-Wlogical-op"
+#endif
+
+#include <Eigen/Core>
+#include <Eigen/SVD>
+
+#include "svd.h"
+
+using Eigen::JacobiSVD;
+
+using Eigen::NoQRPreconditioner;
+
+using Eigen::ComputeThinU;
+using Eigen::ComputeThinV;
+
+using Eigen::MatrixXf;
+using Eigen::VectorXf;
+using Eigen::Map;
+
+void EG3_svd_square_matrix(const int size, const float *matrix, float *r_U, float *r_S, float *r_V)
+{
+ /* Since our matrix is squared, we can use thinU/V. */
+ unsigned int flags = (r_U ? ComputeThinU : 0) | (r_V ? ComputeThinV : 0);
+
+ /* Blender and Eigen matrices are both column-major. */
+ JacobiSVD<MatrixXf, NoQRPreconditioner> svd(Map<MatrixXf>((float *)matrix, size, size), flags);
+
+ if (r_U) {
+ Map<MatrixXf>(r_U, size, size) = svd.matrixU();
+ }
+
+ if (r_S) {
+ Map<VectorXf>(r_S, size) = svd.singularValues();
+ }
+
+ if (r_V) {
+ Map<MatrixXf>(r_V, size, size) = svd.matrixV();
+ }
+}
+
+#endif /* __EIGEN3_SVD_C_API_CC__ */
diff --git a/extern/Eigen3/intern/svd.h b/extern/Eigen3/intern/svd.h
new file mode 100644
index 00000000000..0ac51108977
--- /dev/null
+++ b/extern/Eigen3/intern/svd.h
@@ -0,0 +1,40 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2015 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation,
+ * Bastien Montagne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __EIGEN3_SVD_C_API_H__
+#define __EIGEN3_SVD_C_API_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void EG3_svd_square_matrix(const int size, const float *matrix, float *r_U, float *r_S, float *r_V);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EIGEN3_SVD_C_API_H__ */