Booleans: Boost is no longer a dependency for Carve
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 13 Nov 2014 12:36:33 +0000 (17:36 +0500)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 13 Nov 2014 13:26:21 +0000 (18:26 +0500)
SCons is currently broken on my laptop, so can't test if it works for sure,
so please do tests of that.

CMakeLists.txt
extern/carve/CMakeLists.txt
extern/carve/SConscript
extern/carve/bundle.sh
extern/carve/include/carve/random/random.h [new file with mode: 0644]
extern/carve/lib/polyhedron.cpp
extern/carve/patches/files/random.h [new file with mode: 0644]
extern/carve/patches/random.patch [new file with mode: 0644]
extern/carve/patches/series

index 7f69baa0d2fbd8abc702b22f4ea67cc776072197..7999f9a2a5ddc251185e7bbbc92a1942774cdd5f 100644 (file)
@@ -544,7 +544,7 @@ if(NOT WITH_PYTHON)
        set(WITH_CYCLES OFF)
 endif()
 
-# enable boost for cycles, booleans, audaspace or i18n
+# enable boost for cycles, audaspace or i18n
 # otherwise if the user disabled
 if(NOT WITH_BOOST)
        # Explicitly disabled. so disable all deps.
@@ -557,13 +557,12 @@ if(NOT WITH_BOOST)
        endmacro()
 
        set_and_warn(WITH_CYCLES         OFF)
-       set_and_warn(WITH_MOD_BOOLEAN    OFF)
        set_and_warn(WITH_AUDASPACE      OFF)
        set_and_warn(WITH_INTERNATIONAL  OFF)
 
        set_and_warn(WITH_OPENAL         OFF)  # depends on AUDASPACE
        set_and_warn(WITH_GAMEENGINE     OFF)  # depends on AUDASPACE
-elseif(WITH_CYCLES OR WITH_OPENIMAGEIO OR WITH_MOD_BOOLEAN OR WITH_AUDASPACE OR WITH_INTERNATIONAL)
+elseif(WITH_CYCLES OR WITH_OPENIMAGEIO OR WITH_AUDASPACE OR WITH_INTERNATIONAL)
        # Keep enabled
 else()
        # Enabled but we don't need it
index 5754290d710c7f5f1964cc2165d20de7d510b8d2..643bd42354680eb820010193f837ed1879ab15c8 100644 (file)
@@ -161,6 +161,7 @@ if(WITH_BOOST)
 
        add_definitions(
                -DCARVE_SYSTEM_BOOST
+               -DHAVE_BOOST_LIBRARY
        )
 
        list(APPEND INC_SYS
index f975e253d60887ea1a0307d7352ee5e282c72b92..e08e75e66407040ce63b14ba96902655d0ac3621 100644 (file)
@@ -19,6 +19,7 @@ if env['WITH_BF_BOOST']:
             defs.append('HAVE_BOOST_UNORDERED_COLLECTIONS')
 
     defs.append('CARVE_SYSTEM_BOOST')
+    defs.append('HAVE_BOOST_LIBRARY')
     incs.append(env['BF_BOOST_INC'])
 
 env.BlenderLib ('extern_carve', Split(sources), incs, defs, libtype=['extern'], priority=[40] )
index 2a3e621fab0c623b12d848366302d09739cfedef..236720f740d41854bc5b11593f4abae502d8a0dc 100755 (executable)
@@ -31,6 +31,8 @@ headers=`find ./lib -type f -iname '*.h' -or -iname '*.hpp' | sed -r 's/^\.\//\t
 includes=`find ./include -type f -iname '*.h' -or -iname '*.hpp' | sed -r 's/^\.\//\t/' | sort -d`
 
 cp patches/files/config.h include/carve/config.h
+mkdir -p include/carve/random
+cp patches/files/random.h include/carve/random/random.h
 
 cat > CMakeLists.txt << EOF
 # ***** BEGIN GPL LICENSE BLOCK *****
@@ -91,6 +93,7 @@ if(WITH_BOOST)
 
        add_definitions(
                -DCARVE_SYSTEM_BOOST
+               -DHAVE_BOOST_LIBRARY
        )
 
        list(APPEND INC_SYS
@@ -123,6 +126,7 @@ if env['WITH_BF_BOOST']:
             defs.append('HAVE_BOOST_UNORDERED_COLLECTIONS')
 
     defs.append('CARVE_SYSTEM_BOOST')
+    defs.append('HAVE_BOOST_LIBRARY')
     incs.append(env['BF_BOOST_INC'])
 
 env.BlenderLib ('extern_carve', Split(sources), incs, defs, libtype=['extern'], priority=[40] )
diff --git a/extern/carve/include/carve/random/random.h b/extern/carve/include/carve/random/random.h
new file mode 100644 (file)
index 0000000..634063c
--- /dev/null
@@ -0,0 +1,61 @@
+#include <cassert>
+#include <cmath>
+#include <vector>
+
+namespace boost {
+#if __cplusplus > 199711L
+#  include <random>
+typedef std::mt19937 mt19937;
+#else
+#  include <stdlib.h>
+struct mt19937 {
+  int operator()() {
+    return rand();
+  }
+
+  int max() {
+    return RAND_MAX;
+  }
+};
+#endif
+
+template<typename T>
+struct uniform_on_sphere {
+  typedef std::vector<T> result_type;
+
+  uniform_on_sphere(int dimension) {
+    assert(dimension == 3);
+  }
+
+  std::vector<T>
+  operator()(float u1, float u2) {
+    T z = 1.0 - 2.0*u1;
+    T r = std::sqrt(std::max(0.0, 1.0 - z*z));
+    T phi = 2.0*M_PI*u2;
+    T x = r*std::cos(phi);
+    T y = r*std::sin(phi);
+    std::vector<T> result;
+    result.push_back(x);
+    result.push_back(y);
+    result.push_back(z);
+    return result;
+  }
+};
+
+template<typename RNG, typename DISTR>
+struct variate_generator {
+
+  variate_generator(RNG rng, DISTR distr)
+    : rng_(rng), distr_(distr) {}
+
+  typename DISTR::result_type
+  operator()() {
+    float rng_max_inv = 1.0 / rng_.max();
+    return distr_(rng_() * rng_max_inv, rng_() * rng_max_inv);
+  }
+
+  RNG rng_;
+  DISTR distr_;
+};
+
+}
index 7f65da8c125bd4015cca53467d2e1aa6e09ac0f0..d402fce36df6c7600f18e7d9697e75d4896d1356 100644 (file)
 
 #include <carve/mesh.hpp>
 
-#include BOOST_INCLUDE(random.hpp)
+#ifdef HAVE_BOOST_LIBRARY
+#  include BOOST_INCLUDE(random.hpp)
+#else
+#  include <carve/random/random.h>
+#endif
 
 namespace {
   bool emb_test(carve::poly::Polyhedron *poly,
diff --git a/extern/carve/patches/files/random.h b/extern/carve/patches/files/random.h
new file mode 100644 (file)
index 0000000..634063c
--- /dev/null
@@ -0,0 +1,61 @@
+#include <cassert>
+#include <cmath>
+#include <vector>
+
+namespace boost {
+#if __cplusplus > 199711L
+#  include <random>
+typedef std::mt19937 mt19937;
+#else
+#  include <stdlib.h>
+struct mt19937 {
+  int operator()() {
+    return rand();
+  }
+
+  int max() {
+    return RAND_MAX;
+  }
+};
+#endif
+
+template<typename T>
+struct uniform_on_sphere {
+  typedef std::vector<T> result_type;
+
+  uniform_on_sphere(int dimension) {
+    assert(dimension == 3);
+  }
+
+  std::vector<T>
+  operator()(float u1, float u2) {
+    T z = 1.0 - 2.0*u1;
+    T r = std::sqrt(std::max(0.0, 1.0 - z*z));
+    T phi = 2.0*M_PI*u2;
+    T x = r*std::cos(phi);
+    T y = r*std::sin(phi);
+    std::vector<T> result;
+    result.push_back(x);
+    result.push_back(y);
+    result.push_back(z);
+    return result;
+  }
+};
+
+template<typename RNG, typename DISTR>
+struct variate_generator {
+
+  variate_generator(RNG rng, DISTR distr)
+    : rng_(rng), distr_(distr) {}
+
+  typename DISTR::result_type
+  operator()() {
+    float rng_max_inv = 1.0 / rng_.max();
+    return distr_(rng_() * rng_max_inv, rng_() * rng_max_inv);
+  }
+
+  RNG rng_;
+  DISTR distr_;
+};
+
+}
diff --git a/extern/carve/patches/random.patch b/extern/carve/patches/random.patch
new file mode 100644 (file)
index 0000000..36cc8d1
--- /dev/null
@@ -0,0 +1,16 @@
+diff -r 9a85d733a43d lib/polyhedron.cpp
+--- a/lib/polyhedron.cpp       Tue Jun 24 11:15:23 2014 +1000
++++ b/lib/polyhedron.cpp       Thu Nov 13 17:36:06 2014 +0500
+@@ -36,7 +36,11 @@
+ #include <carve/mesh.hpp>
+-#include BOOST_INCLUDE(random.hpp)
++#ifdef HAVE_BOOST_LIBRARY
++#  include BOOST_INCLUDE(random.hpp)
++#else
++#  include <carve/random/random.h>
++#endif
+ namespace {
+   bool emb_test(carve::poly::Polyhedron *poly,
index 4691339b419cd052e8dcf63dd563df8970900438..b7e97d68c4c340092b775c088da428f321f2f799 100644 (file)
@@ -11,3 +11,4 @@ mesh_simplify_uninitialized_var.patch
 memory_leak_fix.patch
 msvc_fix.patch
 face_hole_merge_workaround.patch
+random.patch