[Bf-blender-cvs] [582e7a6] master: Add a skeleton of C API for Eigen3.

Bastien Montagne noreply at git.blender.org
Mon Jul 13 18:10:57 CEST 2015


Commit: 582e7a6347694aac616beff150b9c7727fd84f15
Author: Bastien Montagne
Date:   Mon Jul 13 17:40:06 2015 +0200
Branches: master
https://developer.blender.org/rB582e7a6347694aac616beff150b9c7727fd84f15

Add a skeleton of C API for Eigen3.

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.

===================================================================

M	build_files/cmake/macros.cmake
M	extern/CMakeLists.txt
A	extern/Eigen3/CMakeLists.txt
A	extern/Eigen3/SConscript
A	extern/Eigen3/eigen3_capi.h
A	extern/Eigen3/intern/eigenvalues.cc
A	extern/Eigen3/intern/eigenvalues.h
M	extern/SConscript
M	source/blenderplayer/CMakeLists.txt

===================================================================

diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 479dd31..56985e5 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -595,6 +595,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
 		extern_libmv
 		extern_glog
 		extern_sdlew
+		extern_eigen3
 
 		bf_intern_glew_mx
 	)
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 3dc790f..36cc053 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -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
index 0000000..9bbfc9a
--- /dev/null
+++ b/extern/Eigen3/CMakeLists.txt
@@ -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
index 0000000..2dc2d62
--- /dev/null
+++ b/extern/Eigen3/SConscript
@@ -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
index 0000000..16f2237
--- /dev/null
+++ b/extern/Eigen3/eigen3_capi.h
@@ -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
index 0000000..dcaaee8
--- /dev/null
+++ b/extern/Eigen3/intern/eigenvalues.cc
@@ -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
index 0000000..93fc06c
--- /dev/null
+++ b/extern/Eigen3/intern/eigenvalues.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_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__ */
diff --git a/extern/SConscript b/extern/SConscript
index 1f94f50..1386f12 100644
--- a/extern/SConscript
+++ b/extern/SConscript
@@ -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'])
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index 1136524..a3210d2 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -170,6 +170,7 @@ endif()
 		extern_libmv
 		extern_glog
 		extern_sdlew
+		extern_eigen3
 	)
 
 	if(WITH_MOD_CLOTH_ELTOPO)




More information about the Bf-blender-cvs mailing list