Add a skeleton of C API for Eigen3.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 13 Jul 2015 15:40:06 +0000 (17:40 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 13 Jul 2015 16:05:38 +0000 (18:05 +0200)
Title says pretty much everything. For now, only thing available is a solver of eigen
values/vectors for self-adjoint matrices.

We can easily add more when needed.

Thanks to Sergey and Campbell for quick review.

build_files/cmake/macros.cmake
extern/CMakeLists.txt
extern/Eigen3/CMakeLists.txt [new file with mode: 0644]
extern/Eigen3/SConscript [new file with mode: 0644]
extern/Eigen3/eigen3_capi.h [new file with mode: 0644]
extern/Eigen3/intern/eigenvalues.cc [new file with mode: 0644]
extern/Eigen3/intern/eigenvalues.h [new file with mode: 0644]
extern/SConscript
source/blenderplayer/CMakeLists.txt

index 479dd31..56985e5 100644 (file)
@@ -595,6 +595,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
                extern_libmv
                extern_glog
                extern_sdlew
+               extern_eigen3
 
                bf_intern_glew_mx
        )
index 3dc790f..36cc053 100644 (file)
@@ -29,6 +29,7 @@ remove_strict_flags()
 add_subdirectory(rangetree)
 add_subdirectory(wcwidth)
 add_subdirectory(libmv)
+add_subdirectory(Eigen3)
 
 if(WITH_OPENNL)
        add_subdirectory(colamd)
diff --git a/extern/Eigen3/CMakeLists.txt b/extern/Eigen3/CMakeLists.txt
new file mode 100644 (file)
index 0000000..9bbfc9a
--- /dev/null
@@ -0,0 +1,41 @@
+# ***** 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.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Bastien Montagne.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+       .
+)
+
+set(INC_SYS
+)
+
+set(SRC
+       eigen3_capi.h
+
+       intern/eigenvalues.cc
+
+       intern/eigenvalues.h
+)
+
+blender_add_lib(extern_eigen3 "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/extern/Eigen3/SConscript b/extern/Eigen3/SConscript
new file mode 100644 (file)
index 0000000..2dc2d62
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+#
+# ***** 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.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Bastien Montagne.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+Import('env')
+
+sources = env.Glob('intern/*.cc')
+
+incs = '.'
+defs = []
+
+env.BlenderLib('extern_eigen3', sources, Split(incs), defs, libtype=['extern','player'], priority=[10, 185])
diff --git a/extern/Eigen3/eigen3_capi.h b/extern/Eigen3/eigen3_capi.h
new file mode 100644 (file)
index 0000000..16f2237
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * ***** 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_C_API_H__
+#define __EIGEN3_C_API_H__
+
+#include "intern/eigenvalues.h"
+
+#endif  /* __EIGEN3_C_API_H__ */
diff --git a/extern/Eigen3/intern/eigenvalues.cc b/extern/Eigen3/intern/eigenvalues.cc
new file mode 100644 (file)
index 0000000..dcaaee8
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * ***** 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_EIGENVALUES_C_API_CC__
+#define __EIGEN3_EIGENVALUES_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/Eigenvalues>
+
+#include "eigenvalues.h"
+
+using Eigen::SelfAdjointEigenSolver;
+
+using Eigen::MatrixXf;
+using Eigen::VectorXf;
+using Eigen::Map;
+
+using Eigen::Success;
+
+bool EG3_self_adjoint_eigen_solve(const int size, const float *matrix, float *r_eigen_values, float *r_eigen_vectors)
+{
+       SelfAdjointEigenSolver<MatrixXf> eigen_solver;
+
+       /* Blender and Eigen matrices are both column-major. */
+       eigen_solver.compute(Map<MatrixXf>((float *)matrix, size, size));
+
+       if (eigen_solver.info() != Success) {
+               return false;
+       }
+
+       if (r_eigen_values) {
+               Map<VectorXf>(r_eigen_values, size) = eigen_solver.eigenvalues().transpose();
+       }
+
+       if (r_eigen_vectors) {
+               Map<MatrixXf>(r_eigen_vectors, size, size) = eigen_solver.eigenvectors();
+       }
+
+       return true;
+}
+
+#endif  /* __EIGEN3_EIGENVALUES_C_API_CC__ */
diff --git a/extern/Eigen3/intern/eigenvalues.h b/extern/Eigen3/intern/eigenvalues.h
new file mode 100644 (file)
index 0000000..93fc06c
--- /dev/null
@@ -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_EIGENVALUES_C_API_H__
+#define __EIGEN3_EIGENVALUES_C_API_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool EG3_self_adjoint_eigen_solve(const int size, const float *matrix, float *r_eigen_values, float *r_eigen_vectors);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __EIGEN3_EIGENVALUES_C_API_H__ */
index 1f94f50..1386f12 100644 (file)
@@ -11,6 +11,7 @@ SConscript(['colamd/SConscript'])
 SConscript(['rangetree/SConscript'])
 SConscript(['wcwidth/SConscript'])
 SConscript(['libmv/SConscript'])
+SConscript(['Eigen3/SConscript'])
 
 if env['WITH_BF_GAMEENGINE']:
     SConscript(['recastnavigation/SConscript'])
index 1136524..a3210d2 100644 (file)
@@ -170,6 +170,7 @@ endif()
                extern_libmv
                extern_glog
                extern_sdlew
+               extern_eigen3
        )
 
        if(WITH_MOD_CLOTH_ELTOPO)