From 01aaec33573a49705c9028966df2cbd15c9c4c61 Mon Sep 17 00:00:00 2001 From: don bright Date: Thu, 31 Jan 2013 18:37:08 -0800 Subject: copy qt4 building script from macosx-build-deps to linux diff --git a/scripts/setenv-unibuild.sh b/scripts/setenv-unibuild.sh index 881526e..66fb7a9 100644 --- a/scripts/setenv-unibuild.sh +++ b/scripts/setenv-unibuild.sh @@ -130,5 +130,12 @@ if [ "`echo $* | grep qt5`" ]; then setenv_qt5 fi +if [ -e $DEPLOYDIR/include/Qt ]; then + echo "Qt found under $DEPLOYDIR ... " + QTDIR=$DEPLOYDIR + export QTDIR + echo "QTDIR modified to $DEPLOYDIR" +fi + clean_note diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index 0c37605..6550dcc 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -24,7 +24,6 @@ # # Prerequisites: # - wget or curl -# - Qt4 # - gcc # # Enable Clang (experimental, only works on linux): @@ -42,6 +41,31 @@ printUsage() echo } +build_qt4() +{ + version=$1 + if [ -e $DEPLOYDIR/include/Qt ]; then + echo "qt already installed. not building" + return + fi + echo "Building Qt" $version "..." + cd $BASEDIR/src + rm -rf qt-everywhere-opensource-src-$version + if [ ! -f qt-everywhere-opensource-src-$version.tar.gz ]; then + curl -O http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-$version.tar.gz + fi + tar xzf qt-everywhere-opensource-src-$version.tar.gz + cd qt-everywhere-opensource-src-$version + ./configure -prefix $DEPLOYDIR -opensource -confirm-license -fast -no-qt3support -no-svg -no-phonon -no-audio-backend -no-multimedia -no-javascript-jit -no-script -no-scripttools -no-declarative -no-xmlpatterns -nomake demos -nomake examples -nomake docs -nomake translations -no-webkit + make -j $NUMCPU + make install + QTDIR=$DEPLOYDIR + export QTDIR + echo "----------" + echo " Please set QTDIR to $DEPLOYDIR ( or run '. scripts/setenv-unibuild.sh' ) + echo "----------" +} + build_bison() { version=$1 @@ -426,6 +450,11 @@ if [ $1 ]; then build_opencsg 1.3.2 exit fi + if [ $1 == "qt4" ]; then + # such a huge build, put here by itself + build_qt4 4.8.4 + exit + fi fi @@ -433,7 +462,6 @@ fi # Main build of libraries # edit version numbers here as needed. # - build_eigen 3.1.1 build_gmp 5.0.5 build_mpfr 3.1.1 -- cgit v0.10.1 From 684e023e849f5ab971d3901d1932ce21ddc3f8e2 Mon Sep 17 00:00:00 2001 From: don bright Date: Thu, 31 Jan 2013 18:47:02 -0800 Subject: detect if boost build fails, print msg and exit diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index 6550dcc..3b6a241 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -62,7 +62,7 @@ build_qt4() QTDIR=$DEPLOYDIR export QTDIR echo "----------" - echo " Please set QTDIR to $DEPLOYDIR ( or run '. scripts/setenv-unibuild.sh' ) + echo " Please set QTDIR to $DEPLOYDIR ( or run '. scripts/setenv-unibuild.sh' )" echo "----------" } @@ -208,7 +208,12 @@ build_boost() fi else ./b2 -j$NUMCPU - ./b2 install + if [ $? = 0 ]; then + ./b2 install + else + echo boost build failed + exit 1 + fi fi } @@ -465,7 +470,7 @@ fi build_eigen 3.1.1 build_gmp 5.0.5 build_mpfr 3.1.1 -build_boost 1.49.0 +build_boost 1.52.0 # NB! For CGAL, also update the actual download URL in the function build_cgal 4.0.2 build_glew 1.9.0 -- cgit v0.10.1 From 1f39090cc0f47893977f8abc33b5f1933a3c275e Mon Sep 17 00:00:00 2001 From: don bright Date: Thu, 31 Jan 2013 20:16:28 -0800 Subject: fix GLU issues caued by mesa split from glu. clarify test error msg diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index 3b6a241..6f84482 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -24,6 +24,7 @@ # # Prerequisites: # - wget or curl +# - OpenGL (gl.h) # - gcc # # Enable Clang (experimental, only works on linux): @@ -41,6 +42,26 @@ printUsage() echo } +build_glu() +{ + version=$1 + if [ -e $DEPLOYDIR/lib/libGLU.so ]; then + echo "GLU already installed. not building" + return + fi + echo "Building GLU" $version "..." + cd $BASEDIR/src + rm -rf glu-$version + if [ ! -f glu-$version.tar.gz ]; then + curl -O http://cgit.freedesktop.org/mesa/glu/snapshot/glu-$version.tar.gz + fi + tar xzf glu-$version.tar.gz + cd glu-$version + ./autogen.sh --prefix=$DEPLOYDIR + make -j$NUMCPU + make install +} + build_qt4() { version=$1 @@ -57,7 +78,7 @@ build_qt4() tar xzf qt-everywhere-opensource-src-$version.tar.gz cd qt-everywhere-opensource-src-$version ./configure -prefix $DEPLOYDIR -opensource -confirm-license -fast -no-qt3support -no-svg -no-phonon -no-audio-backend -no-multimedia -no-javascript-jit -no-script -no-scripttools -no-declarative -no-xmlpatterns -nomake demos -nomake examples -nomake docs -nomake translations -no-webkit - make -j $NUMCPU + make -j$NUMCPU make install QTDIR=$DEPLOYDIR export QTDIR @@ -228,14 +249,15 @@ build_cgal() cd $BASEDIR/src rm -rf CGAL-$version if [ ! -f CGAL-$version.tar.* ]; then - #4.0.2 - curl --insecure -O https://gforge.inria.fr/frs/download.php/31174/CGAL-$version.tar.bz2 - # 4.0 curl --insecure -O https://gforge.inria.fr/frs/download.php/30387/CGAL-$version.tar.gz - # 3.9 curl --insecure -O https://gforge.inria.fr/frs/download.php/29125/CGAL-$version.tar.gz + # 4.1 + curl --insecure -O https://gforge.inria.fr/frs/download.php/31640/CGAL-$version.tar.bz2 + # 4.0.2 curl --insecure -O https://gforge.inria.fr/frs/download.php/31174/CGAL-$version.tar.bz2 + # 4.0 curl --insecure -O https://gforge.inria.fr/frs/download.php/30387/CGAL-$version.tar.gz #4.0 + # 3.9 curl --insecure -O https://gforge.inria.fr/frs/download.php/29125/CGAL-$version.tar.gz #3.9 # 3.8 curl --insecure -O https://gforge.inria.fr/frs/download.php/28500/CGAL-$version.tar.gz # 3.7 curl --insecure -O https://gforge.inria.fr/frs/download.php/27641/CGAL-$version.tar.gz fi - tar jxf CGAL-$version.tar.bz2 + tar xf CGAL-$version.tar.bz2 cd CGAL-$version if [ "`echo $2 | grep use-sys-libs`" ]; then cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DCMAKE_BUILD_TYPE=Debug @@ -301,7 +323,7 @@ build_glew() build_opencsg() { - if [ -e $DEPLOYDIR/include/opencsg.h ]; then + if [ -e $DEPLOYDIR/lib/libopencsg.so ]; then echo "OpenCSG already installed. not building" return fi @@ -460,6 +482,11 @@ if [ $1 ]; then build_qt4 4.8.4 exit fi + if [ $1 == "glu" ]; then + # Mesa and GLU split in late 2012, so it's not on some systems + build_glu 9.0.0 + exit + fi fi @@ -472,7 +499,7 @@ build_gmp 5.0.5 build_mpfr 3.1.1 build_boost 1.52.0 # NB! For CGAL, also update the actual download URL in the function -build_cgal 4.0.2 +build_cgal 4.1 build_glew 1.9.0 build_opencsg 1.3.2 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d2daf43..fcf7d08 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -179,6 +179,11 @@ endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON) find_package(OpenGL REQUIRED) +if ( "${OPENGL_glu_LIBRARY}" MATCHES "NOTFOUND" ) + # GLU and Mesa split in late 2012 so some systems dont have GLU + find_library(OPENGL_glu_LIBRARY GLU HINTS "$ENV{OPENSCAD_LIBRARIES}/lib" REQUIRED) + set( OPENGL_LIBRARY ${OPENGL_glu_LIBRARY} ${OPENGL_LIBRARY} ) +endif() if (MINGW_CROSS_ENV_DIR) mingw_cross_env_find_qt() diff --git a/tests/test_cmdline_tool.py b/tests/test_cmdline_tool.py index f29acc0..889c429 100755 --- a/tests/test_cmdline_tool.py +++ b/tests/test_cmdline_tool.py @@ -101,7 +101,7 @@ def compare_png(resultfilename): msg += '\n expected image: ' + expectedfilename + '\n' print >> sys.stderr, msg if not resultfilename: - print >> sys.stderr, "Error: OpenSCAD did not generate an image to test" + print >> sys.stderr, "Error: OpenSCAD error during test image generation" return False print >> sys.stderr, ' actual image: ', resultfilename -- cgit v0.10.1 From 78bfda369b7ee2dfbb59fd64df7a034abc2e1285 Mon Sep 17 00:00:00 2001 From: don bright Date: Fri, 1 Feb 2013 15:36:16 -0800 Subject: prevent CGAL Floating Point Rounding Mode restortaion errors on PPC64 machines by altering the cmake build mode from Debug to Release diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index 6f84482..d1c8652 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -259,10 +259,18 @@ build_cgal() fi tar xf CGAL-$version.tar.bz2 cd CGAL-$version + mkdir bin + cd bin + rm -rf ./* + if [ "`uname -a| grep ppc64`" ]; then + CGAL_BUILDTYPE="Release" # avoid assertion violation + else + CGAL_BUILDTYPE="Debug" + fi if [ "`echo $2 | grep use-sys-libs`" ]; then - cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DCMAKE_BUILD_TYPE=Debug + cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DCMAKE_BUILD_TYPE=$CGAL_BUILDTYPE .. else - cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.so -DGMPXX_LIBRARIES=$DEPLOYDIR/lib/libgmpxx.so -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.so -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DBOOST_ROOT=$DEPLOYDIR -DCMAKE_BUILD_TYPE=Debug + cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.so -DGMPXX_LIBRARIES=$DEPLOYDIR/lib/libgmpxx.so -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.so -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DBOOST_ROOT=$DEPLOYDIR -DCMAKE_BUILD_TYPE=$CGAL_BUILD_TYPE .. fi make -j$NUMCPU make install -- cgit v0.10.1 From 757820fe1c67290328c77802ea7718505b77f437 Mon Sep 17 00:00:00 2001 From: Justin C Date: Sat, 2 Feb 2013 02:11:42 -0800 Subject: missing NULL check when normalization exceeds limit for elements diff --git a/src/csgtermnormalizer.cc b/src/csgtermnormalizer.cc index e2474e9..81fab80 100644 --- a/src/csgtermnormalizer.cc +++ b/src/csgtermnormalizer.cc @@ -20,7 +20,7 @@ shared_ptr CSGTermNormalizer::normalize(const shared_ptr &root PRINTB("WARNING: Normalized tree is growing past %d elements. Aborting normalization.\n", this->limit); // Clean up any partially evaluated terms shared_ptr newroot = root, tmproot; - while (newroot != tmproot) { + while (newroot && newroot != tmproot) { tmproot = newroot; newroot = collapse_null_terms(tmproot); } -- cgit v0.10.1 From 96903036fdf6612d94f0211171da76f3a5450e3d Mon Sep 17 00:00:00 2001 From: Justin C Date: Sat, 2 Feb 2013 02:12:56 -0800 Subject: add test sample for issue #267 diff --git a/testdata/scad/bugs/issue267-normalization-crash.scad b/testdata/scad/bugs/issue267-normalization-crash.scad new file mode 100644 index 0000000..e4e3d87 --- /dev/null +++ b/testdata/scad/bugs/issue267-normalization-crash.scad @@ -0,0 +1,86 @@ +/* + * Reported by Justin Charette + * Causes a crash in CSGTermNormalizer::normalize() when CSG element count + * exceeds limit setting in preferences (verified with default value of 2000). + */ + + +$fn=20; + +/* donut (r1, r2, t) {{{ + r1 = radius of torus + r2 = radius of torus cross section (circle) + t = thickness of shell (t == 0 is +*/ +module donut (r1, r2, t=0) { + difference() { + rotate_extrude( convexity=6 ) { + translate([r1, 0, 0]) { + circle( r = r2 ); + } + } + // (t == 0 ? solid : hollow ) + if (t > 0) { + rotate_extrude( convexity=6 ) { + translate([r1, 0, 0]) { + circle( r = r2-t ); + } + } + } + } +} //}}} + +/* half donut (r1, r2, t, round) {{{ + r1 = radius of torus + r2 = radius of torus cross section (circle) + t = thickness of shell + round = trim ends of semi-torus so they are round +*/ +module half_donut (r1, r2, t=1, round=false) { + difference() { + donut( r1, r2, t ); + difference() { + translate( [0, -((r1+r2)/2+0.5), 0] ) + scale( [2*(r1+r2)+1, r1+r2+1, 2*r2+1] ) + square( 1, center=true ); + if (round) { + rotate( 90, [0, 1, 0] ) + cylinder( 2*(r1+r2)+2, r2, r2, center=true ); + } + } + } +} //}}} + +/* donut flange (r1, r2, a1, a2, a_step, t, round) {{{ + r1 = radius of torus + r2 = radius of torus cross section (circle) + a1 = starting angle of flange rotation + a2 = stopping angle of flange rotation + a_step = increment size of flange rotation + t = thickness of shell (t == 0 is solid, t in (0, r2) is hollow) + round = (true/false) to trim ends of semi-torus so they are round +*/ +module donut_flange (r1, r2, a1, a2, a_step=1, t=0, round=false) { + difference() { + union() { + for (a = [a1:a_step:a2]) { + rotate( a, [1, 0, 0] ) + half_donut( r1, r2, round ); + } + } + // (t == 0 ? solid : hollow ) + if (t > 0) { + union() { + for (a = [a1:a_step:a2]) { + rotate( a, [1, 0, 0] ) + half_donut( r1, r2-t, round ); + } + } + } + } +} //}}} + +donut( 20, 5 ); +donut_flange( 20, 5, 0, 50, 10, t=1, round=false ); + +// vim: set et sw=2 ts=2 sts=2 ai sta sr fdm=marker: -- cgit v0.10.1 From e357399fd9906604a83dee497b17e074a6fe8876 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 07:56:07 -0800 Subject: enable import STL to work on big-endian computers diff --git a/src/import.cc b/src/import.cc index 6a6d925..c17d915 100644 --- a/src/import.cc +++ b/src/import.cc @@ -52,6 +52,9 @@ namespace fs = boost::filesystem; using namespace boost::assign; // bring 'operator+=()' into scope #include "boosty.h" +#include +#include + class ImportModule : public AbstractModule { public: @@ -112,6 +115,69 @@ AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiati return node; } +#ifdef _MSC_VER +#pragma pack(push,1) +#endif +struct stl_data { + float i, j, k; + float x1, y1, z1; + float x2, y2, z2; + float x3, y3, z3; + unsigned short acount; +} +#ifdef __GNUC__ + __attribute__ ((packed)) +#endif +#ifdef _MSC_VER +#pragma pack(pop) +#endif +; + +#define STL_FACET_SIZE 4*3*4+2 +union stl_facet { + uint8_t data8[ STL_FACET_SIZE ]; + uint32_t data32[4*3]; + struct facet_data { + // assume 'float' is 'binary32' aka 'single' IEEE 32-bit + // floating point type. + float i, j, k; + float x1, y1, z1; + float x2, y2, z2; + float x3, y3, z3; + uint16_t acount; + } data; +}; + +void uint32_byte_swap( uint32_t &x ) +{ +/*#if defined(__GNUC__) || defined(__clang__) + x = __builtin_bswap32( x ); +#elif defined(_MSVC) + x = _byteswap_ulong( x ); +#else*/ + uint32_t b1 = ( 0x000000FF & x ) << 24; + uint32_t b2 = ( 0x0000FF00 & x ) << 8; + uint32_t b3 = ( 0x00FF0000 & x ) >> 8; + uint32_t b4 = ( 0xFF000000 & x ) >> 24; + x = b1 | b2 | b3 | b4; +//#endif +} + +void stl_endian_repair( uint32_t &x ) +{ +#ifdef BOOST_BIG_ENDIAN + uint32_byte_swap( x ); +#endif +} + +void read_stl_facet( std::ifstream &f, stl_facet &facet ) +{ + f.read( (char*)facet.data8, STL_FACET_SIZE ); + for ( int i = 0; i < 12; i++ ) { + stl_endian_repair( facet.data32[ i ] ); + } +} + PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const { PolySet *p = NULL; @@ -137,9 +203,9 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const int file_size = f.tellg(); f.seekg(80); if (!f.eof()) { - int facenum = 0; - // FIXME: Assumes little endian - f.read((char *)&facenum, sizeof(int)); + uint32_t facenum = 0; + f.read((char *)&facenum, sizeof(uint32_t)); + stl_endian_repair( facenum ); if (file_size == 80 + 4 + 50*facenum) binary = true; } f.seekg(0); @@ -186,32 +252,24 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const else { f.ignore(80-5+4); - // FIXME: Assumes little endian while (1) { -#ifdef _MSC_VER -#pragma pack(push,1) -#endif - struct { - float i, j, k; - float x1, y1, z1; - float x2, y2, z2; - float x3, y3, z3; - unsigned short acount; - } -#ifdef __GNUC__ - __attribute__ ((packed)) -#endif - stldata; -#ifdef _MSC_VER -#pragma pack(pop) -#endif - - f.read((char*)&stldata, sizeof(stldata)); +#ifdef BOOST_BIG_ENDIAN + stl_facet facet; + read_stl_facet( f, facet ); + if (f.eof()) break; + p->append_poly(); + p->append_vertex(facet.data.x1, facet.data.y1, facet.data.z1); + p->append_vertex(facet.data.x2, facet.data.y2, facet.data.z2); + p->append_vertex(facet.data.x3, facet.data.y3, facet.data.z3); +#else + stl_data stldata; + f.read((char *)&stldata, sizeof(stldata)); if (f.eof()) break; p->append_poly(); p->append_vertex(stldata.x1, stldata.y1, stldata.z1); p->append_vertex(stldata.x2, stldata.y2, stldata.z2); p->append_vertex(stldata.x3, stldata.y3, stldata.z3); +#endif } } } @@ -244,6 +302,7 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const } if (p) p->convexity = this->convexity; + std::cout << p->dump() << "\n"; return p; } -- cgit v0.10.1 From e9e62272a6cda04c453dd2d27b1a7e91be05f242 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 08:53:13 -0800 Subject: replace packed struct with union. remove some extraneous/debug code diff --git a/src/import.cc b/src/import.cc index c17d915..8980448 100644 --- a/src/import.cc +++ b/src/import.cc @@ -115,67 +115,45 @@ AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiati return node; } -#ifdef _MSC_VER -#pragma pack(push,1) -#endif -struct stl_data { - float i, j, k; - float x1, y1, z1; - float x2, y2, z2; - float x3, y3, z3; - unsigned short acount; -} -#ifdef __GNUC__ - __attribute__ ((packed)) -#endif -#ifdef _MSC_VER -#pragma pack(pop) -#endif -; - -#define STL_FACET_SIZE 4*3*4+2 +#define STL_FACET_NUMBYTES 4*3*4+2 +// as there is no 'float32_t' standard, we assume the systems 'float' +// is a 'binary32' aka 'single' standard IEEE 32-bit floating point type union stl_facet { - uint8_t data8[ STL_FACET_SIZE ]; + uint8_t data8[ STL_FACET_NUMBYTES ]; uint32_t data32[4*3]; struct facet_data { - // assume 'float' is 'binary32' aka 'single' IEEE 32-bit - // floating point type. float i, j, k; float x1, y1, z1; float x2, y2, z2; float x3, y3, z3; - uint16_t acount; + uint16_t attribute_byte_count; } data; }; void uint32_byte_swap( uint32_t &x ) { -/*#if defined(__GNUC__) || defined(__clang__) +#if defined(__GNUC__) || defined(__clang__) x = __builtin_bswap32( x ); -#elif defined(_MSVC) +#elif defined(_MSC_VER) x = _byteswap_ulong( x ); -#else*/ +#else uint32_t b1 = ( 0x000000FF & x ) << 24; uint32_t b2 = ( 0x0000FF00 & x ) << 8; uint32_t b3 = ( 0x00FF0000 & x ) >> 8; uint32_t b4 = ( 0xFF000000 & x ) >> 24; x = b1 | b2 | b3 | b4; -//#endif -} - -void stl_endian_repair( uint32_t &x ) -{ -#ifdef BOOST_BIG_ENDIAN - uint32_byte_swap( x ); #endif } void read_stl_facet( std::ifstream &f, stl_facet &facet ) { - f.read( (char*)facet.data8, STL_FACET_SIZE ); + f.read( (char*)facet.data8, STL_FACET_NUMBYTES ); +#ifdef BOOST_BIG_ENDIAN for ( int i = 0; i < 12; i++ ) { - stl_endian_repair( facet.data32[ i ] ); + uint32_byte_swap( facet.data32[ i ] ); } + // we ignore attribute byte count +#endif } PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const @@ -205,7 +183,9 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const if (!f.eof()) { uint32_t facenum = 0; f.read((char *)&facenum, sizeof(uint32_t)); - stl_endian_repair( facenum ); +#ifdef BOOST_BIG_ENDIAN + uint32_byte_swap( facenum ); +#endif if (file_size == 80 + 4 + 50*facenum) binary = true; } f.seekg(0); @@ -253,7 +233,6 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const { f.ignore(80-5+4); while (1) { -#ifdef BOOST_BIG_ENDIAN stl_facet facet; read_stl_facet( f, facet ); if (f.eof()) break; @@ -261,15 +240,6 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const p->append_vertex(facet.data.x1, facet.data.y1, facet.data.z1); p->append_vertex(facet.data.x2, facet.data.y2, facet.data.z2); p->append_vertex(facet.data.x3, facet.data.y3, facet.data.z3); -#else - stl_data stldata; - f.read((char *)&stldata, sizeof(stldata)); - if (f.eof()) break; - p->append_poly(); - p->append_vertex(stldata.x1, stldata.y1, stldata.z1); - p->append_vertex(stldata.x2, stldata.y2, stldata.z2); - p->append_vertex(stldata.x3, stldata.y3, stldata.z3); -#endif } } } @@ -302,7 +272,6 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const } if (p) p->convexity = this->convexity; - std::cout << p->dump() << "\n"; return p; } -- cgit v0.10.1 From 2eda86bf2f2540d4c9eda255c5fae58d71b5b31f Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Sat, 2 Feb 2013 13:28:00 -0500 Subject: Fix bug assuming negative doubles will overflow a size_t, which failed on ARM. Related to #259 diff --git a/src/control.cc b/src/control.cc index bdd0f40..44847f5 100644 --- a/src/control.cc +++ b/src/control.cc @@ -96,8 +96,10 @@ AbstractNode *ControlModule::evaluate(const Context*, const ModuleInstantiation size_t n = 0; if (inst->argvalues.size() > 0) { double v; - if (inst->argvalues[0].getDouble(v)) - n = v; + if (inst->argvalues[0].getDouble(v)) { + if (v < 0) return NULL; // Disallow negative child indices + n = trunc(v); + } } for (int i = Context::ctx_stack.size()-1; i >= 0; i--) { const Context *c = Context::ctx_stack[i]; -- cgit v0.10.1 From 52cb3b00c2ce6981e3d3e7588fb11ab44b7c962f Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 20:04:05 +0100 Subject: start Xvfb on random DISPLAY number. diff --git a/tests/CTestCustom.template b/tests/CTestCustom.template index 72e6443..0e51e21 100644 --- a/tests/CTestCustom.template +++ b/tests/CTestCustom.template @@ -37,8 +37,10 @@ if( __cmake_system_name__ MATCHES "Linux|BSD") message("Process ID of vfb: ${VFB_PID}") endif() if ("${VFB_DISPLAY}" STREQUAL "" OR "${VFB_PID}" STREQUAL "") - message("Virtual framebuffer had a problem starting.") - execute_process("cat virtualfblog") + set(VFBLOG "virtualfb.log") + message("Virtual framebuffer had a problem starting. Printing ${VFBLOG}") + execute_process(COMMAND cat virtualfb.log OUTPUT_VARIABLE VFBLOGTXT) + message("Log: ${VFBLOGTXT}") else() message("Virtual framebuffer started. DISPLAY=${VFB_DISPLAY}, PID=${VFB_PID}") endif() diff --git a/tests/virtualfb.sh b/tests/virtualfb.sh index 3c0cf0e..e745765 100755 --- a/tests/virtualfb.sh +++ b/tests/virtualfb.sh @@ -13,8 +13,9 @@ if [ ! $VFB_BINARY ]; then exit 1 fi -DISPLAY=:98 -$VFB_BINARY $DISPLAY -screen 0 800x600x24 &> virtualfblog & +DISPLAY=`echo | awk 'BEGIN{srand();} {printf ":%.0f", rand()*1000+100};'` +#DISPLAY=:98 +$VFB_BINARY $DISPLAY -screen 0 800x600x24 &> virtualfb.log & echo PID=$! " " echo DISPLAY=$DISPLAY # trap "kill -KILL $xpid ||:" EXIT -- cgit v0.10.1 From c48520aa4a1316f42baea87d5c333d13f85caf56 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 20:17:36 +0100 Subject: clarify documentation for QT4 diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index d1c8652..bf3a2e8 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -27,11 +27,16 @@ # - OpenGL (gl.h) # - gcc # -# Enable Clang (experimental, only works on linux): +# If your system lacks qt4, build like this: +# +# ./scripts/uni-build-dependencies.sh qt4 +# . ./scripts/setenv-unibuild.sh +# +# If you want to try Clang compiler (experimental, only works on linux): # # . ./scripts/setenv-unibuild.sh clang # -# Enable Qt5 (experimental) +# If you want to try Qt5 (experimental) # # . ./scripts/setenv-unibuild.sh qt5 # -- cgit v0.10.1 From 27eac3ead0e2a9f6b35c41921b315ee2518f8142 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 20:28:12 +0100 Subject: clarify dependency on GLU in documentation diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index bf3a2e8..f149090 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -24,14 +24,20 @@ # # Prerequisites: # - wget or curl -# - OpenGL (gl.h) +# - OpenGL (GL/gl.h) +# - GLU (GL/glu.h) # - gcc +# - Qt4 # # If your system lacks qt4, build like this: # # ./scripts/uni-build-dependencies.sh qt4 # . ./scripts/setenv-unibuild.sh # +# If your system lacks glu, try to build like this: +# +# ./scripts/uni-build-dependencies.sh glu +# # If you want to try Clang compiler (experimental, only works on linux): # # . ./scripts/setenv-unibuild.sh clang -- cgit v0.10.1 From 61fffc0e5b92c9bda7e376983fdc90b498eed745 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 20:30:03 +0100 Subject: put boost back to 1.49 diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh index f149090..bf5ca1c 100755 --- a/scripts/uni-build-dependencies.sh +++ b/scripts/uni-build-dependencies.sh @@ -516,7 +516,7 @@ fi build_eigen 3.1.1 build_gmp 5.0.5 build_mpfr 3.1.1 -build_boost 1.52.0 +build_boost 1.49.0 # NB! For CGAL, also update the actual download URL in the function build_cgal 4.1 build_glew 1.9.0 -- cgit v0.10.1 From 1a545b75f6bd05a0eca42e1f797aa4853aca88d6 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 2 Feb 2013 15:44:25 -0800 Subject: workaround cmake 2.8.10 not allowing CTEST_CUSTOM_POST_TEST arguments diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d2daf43..854fb44 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -569,6 +569,15 @@ set_target_properties(throwntogethertest PROPERTIES COMPILE_FLAGS "-DENABLE_OPEN target_link_libraries(throwntogethertest tests-offscreen tests-cgal ${OPENCSG_LIBRARY} ${TESTS-CGAL-LIBRARIES} ${GLEW_LIBRARY} ${COCOA_LIBRARY}) # +# Post-test pretty print +# + +add_executable(test_pretty_print test_pretty_print.cc) +set_target_properties(test_pretty_print PROPERTIES COMPILE_FLAGS + "-DPYBIN=${PYTHON_EXECUTABLE} -DPYSRC=test_pretty_print.py -DBUILDDIR=--builddir=${CMAKE_CURRENT_BINARY_DIR}" +) + +# # Tags tests as disabled. This is more convenient than removing them manually # from the lists of filenames # diff --git a/tests/CTestCustom.template b/tests/CTestCustom.template index 72e6443..8ab2f5b 100644 --- a/tests/CTestCustom.template +++ b/tests/CTestCustom.template @@ -24,8 +24,7 @@ if( __cmake_system_name__ MATCHES "Linux|BSD") else() message("X11 DISPLAY environment variable not found. Calling virtualfb.sh") execute_process( - COMMAND __cmake_current_source_dir__/virtualfb.sh start - OUTPUT_VARIABLE SVFB_OUT) + COMMAND __cmake_current_source_dir__/virtualfb.sh OUTPUT_VARIABLE SVFB_OUT) string(REGEX MATCH "DISPLAY=:[0-9.]*" VFB_DISPLAY_STR "${SVFB_OUT}") string(REGEX MATCH ":[0-9.]*" VFB_DISPLAY "${VFB_DISPLAY_STR}") string(REGEX MATCH "PID=[0-9.]*" VFB_PID_STR "${SVFB_OUT}") @@ -50,7 +49,7 @@ if( __cmake_system_name__ MATCHES "Linux|BSD") # in the build directory). set(ENV{DISPLAY} "${VFB_DISPLAY}") - set(CTEST_CUSTOM_POST_TEST "kill ${VFB_PID}") + set(CTEST_CUSTOM_POST_TEST "__cmake_current_source_dir__/virtualfb.sh") endif() endif() @@ -59,7 +58,7 @@ endif() message("running 'opencsgtest --info' to generate sysinfo.txt") execute_process(COMMAND __wine__ __cmake_current_binary_dir__/opencsgtest --info OUTPUT_FILE sysinfo.txt) -set(CTEST_CUSTOM_POST_TEST ${CTEST_CUSTOM_POST_TEST} "__python__ __cmake_current_source_dir__/test_pretty_print.py --builddir=__cmake_current_binary_dir__") +set(CTEST_CUSTOM_POST_TEST ${CTEST_CUSTOM_POST_TEST} "__cmake_current_binary_dir__/test_pretty_print") if ( ${debug_openscad_template} ) foreach(post_test ${CTEST_CUSTOM_POST_TEST} ) diff --git a/tests/test_pretty_print.cc b/tests/test_pretty_print.cc new file mode 100644 index 0000000..b400e21 --- /dev/null +++ b/tests/test_pretty_print.cc @@ -0,0 +1,22 @@ +/* Workaround for CTEST_CUSTOM_POST_TEST not allowing arguments + compile with + -DPYBIN=/usr/bin/python + -DPYSRC=/home/janedoe/openscad/tests/test_pretty_print.py + -DBUILDDIR=--builddir=/home/janedoe/openscad/tests/bin" +*/ + +#include + +#define PREQUOTE(x) #x +#define QUOTE(x) PREQUOTE(x) +int main( int argc, char * argv[] ) +{ + char *newargs[4]; + newargs[0] = const_cast(QUOTE( PYBIN )); + newargs[1] = const_cast(QUOTE( PYSRC )); + newargs[2] = const_cast(QUOTE( BUILDDIR )); + newargs[3] = NULL; + return execv( newargs[0], newargs ); +} + + diff --git a/tests/virtualfb.sh b/tests/virtualfb.sh index 3c0cf0e..e0d8320 100755 --- a/tests/virtualfb.sh +++ b/tests/virtualfb.sh @@ -1,22 +1,60 @@ #!/bin/sh -if [ "`command -v Xvfb`" ]; then - VFB_BINARY=Xvfb -fi +# Toggle the Virtual Framebuffer +# If started, stop. If stopped, start. -if [ "`command -v Xvnc`" ]; then - VFB_BINARY=Xvnc -fi +start() +{ + if [ "`command -v Xvfb`" ]; then + VFB_BINARY=Xvfb + fi + + if [ "`command -v Xvnc`" ]; then + VFB_BINARY=Xvnc + fi + + if [ ! $VFB_BINARY ]; then + echo "$0 Failed, cannot find Xvfb or Xvnc" + exit 1 + fi + + VFB_DISPLAY=`echo | awk 'BEGIN{srand();} {printf ":%.0f", rand()*1000+100};'` + $VFB_BINARY $VFB_DISPLAY -screen 0 800x600x24 &> ./virtualfb.log & + VFB_PID=$! + + echo $VFB_DISPLAY > ./virtualfb.DISPLAY + echo $VFB_PID > ./virtualfb.PID + + echo "Started virtual fb, PID=$VFB_PID , DISPLAY=$VFB_DISPLAY" + sleep 1 +} + +stop() +{ + VFB_PID=`cat ./virtualfb.PID` + VFB_DISPLAY=`cat ./virtualfb.DISPLAY` + + echo "Stopping virtual fb, PID=$VFB_PID, DISPLAY=$VFB_DISPLAY" + kill $VFB_PID + LOCKFILE=`echo "/tmp/.X"$VFB_DISPLAY"-lock"` + if [ -e $LOCKFILE ]; then + rm $LOCKFILE + fi + rm ./virtualfb.PID + rm ./virtualfb.DISPLAY +} + +isrunning() +{ + isrunning_result= + if [ -e ./virtualfb.PID ]; then isrunning_result=1 ; fi + if [ -e ./virtualfb.DISPLAY ]; then isrunning_result=1 ; fi +} -if [ ! $VFB_BINARY ]; then - echo "$0 Failed, cannot find Xvfb or Xvnc" - exit 1 +isrunning +if [ $isrunning_result ]; then + stop +else + start fi -DISPLAY=:98 -$VFB_BINARY $DISPLAY -screen 0 800x600x24 &> virtualfblog & -echo PID=$! " " -echo DISPLAY=$DISPLAY -# trap "kill -KILL $xpid ||:" EXIT -export DISPLAY -sleep 3 -- cgit v0.10.1 From 8c9c9adfe0f0fa5c1ade561a61f3f8add3600c22 Mon Sep 17 00:00:00 2001 From: don bright Date: Sun, 3 Feb 2013 01:21:47 +0100 Subject: improve Xvfb handling when ctest is cancelled partway through diff --git a/tests/virtualfb.sh b/tests/virtualfb.sh index e0d8320..d34a4f9 100755 --- a/tests/virtualfb.sh +++ b/tests/virtualfb.sh @@ -47,8 +47,12 @@ stop() isrunning() { isrunning_result= - if [ -e ./virtualfb.PID ]; then isrunning_result=1 ; fi - if [ -e ./virtualfb.DISPLAY ]; then isrunning_result=1 ; fi + if [ -e ./virtualfb.PID ]; then + VFB_PID=`cat ./virtualfb.PID` + if [ "`ps cax | awk ' { print $1 } ' | grep ^$VFB_PID\$`" ]; then + isrunning_result=1 + fi + fi } isrunning -- cgit v0.10.1 From b390d54471201731db1158fa21aa54fcef1f7582 Mon Sep 17 00:00:00 2001 From: don bright Date: Sun, 3 Feb 2013 01:39:43 +0100 Subject: fix bug in test_pretty_print.cc / Cmakefile The build needs to be after Python binary has been found because the Python binary path is passed to the .cc compile through a -D flag. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 854fb44..611cb5f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -569,15 +569,6 @@ set_target_properties(throwntogethertest PROPERTIES COMPILE_FLAGS "-DENABLE_OPEN target_link_libraries(throwntogethertest tests-offscreen tests-cgal ${OPENCSG_LIBRARY} ${TESTS-CGAL-LIBRARIES} ${GLEW_LIBRARY} ${COCOA_LIBRARY}) # -# Post-test pretty print -# - -add_executable(test_pretty_print test_pretty_print.cc) -set_target_properties(test_pretty_print PROPERTIES COMPILE_FLAGS - "-DPYBIN=${PYTHON_EXECUTABLE} -DPYSRC=test_pretty_print.py -DBUILDDIR=--builddir=${CMAKE_CURRENT_BINARY_DIR}" -) - -# # Tags tests as disabled. This is more convenient than removing them manually # from the lists of filenames # @@ -800,6 +791,15 @@ endif() # 1. Start/stop Virtual Framebuffer for linux/bsd. 2. Pretty Print # Please see the CTestCustom.template file for more info. +# +# Post-test pretty print +# + +add_executable(test_pretty_print test_pretty_print.cc) +set_target_properties(test_pretty_print PROPERTIES COMPILE_FLAGS + "-DPYBIN=${PYTHON_EXECUTABLE} -DPYSRC=test_pretty_print.py -DBUILDDIR=--builddir=${CMAKE_CURRENT_BINARY_DIR}" +) + file(READ ${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.template TMP) string(REPLACE __cmake_current_binary_dir__ ${CMAKE_CURRENT_BINARY_DIR} TMP ${TMP}) string(REPLACE __cmake_current_source_dir__ ${CMAKE_CURRENT_SOURCE_DIR} TMP ${TMP}) diff --git a/tests/test_pretty_print.cc b/tests/test_pretty_print.cc index b400e21..9959189 100644 --- a/tests/test_pretty_print.cc +++ b/tests/test_pretty_print.cc @@ -1,11 +1,12 @@ /* Workaround for CTEST_CUSTOM_POST_TEST not allowing arguments compile with - -DPYBIN=/usr/bin/python + -DPYBIN=/usr/bin/python -DPYSRC=/home/janedoe/openscad/tests/test_pretty_print.py -DBUILDDIR=--builddir=/home/janedoe/openscad/tests/bin" */ #include +//#include #define PREQUOTE(x) #x #define QUOTE(x) PREQUOTE(x) @@ -16,6 +17,7 @@ int main( int argc, char * argv[] ) newargs[1] = const_cast(QUOTE( PYSRC )); newargs[2] = const_cast(QUOTE( BUILDDIR )); newargs[3] = NULL; + //printf(":%s:%s:%s\n", newargs[0], newargs[1], newargs[2]); return execv( newargs[0], newargs ); } diff --git a/tests/virtualfb.sh b/tests/virtualfb.sh index d34a4f9..5abd804 100755 --- a/tests/virtualfb.sh +++ b/tests/virtualfb.sh @@ -34,7 +34,7 @@ stop() VFB_PID=`cat ./virtualfb.PID` VFB_DISPLAY=`cat ./virtualfb.DISPLAY` - echo "Stopping virtual fb, PID=$VFB_PID, DISPLAY=$VFB_DISPLAY" + echo "Stopping virtual fb, PID was $VFB_PID, DISPLAY was $VFB_DISPLAY" kill $VFB_PID LOCKFILE=`echo "/tmp/.X"$VFB_DISPLAY"-lock"` if [ -e $LOCKFILE ]; then -- cgit v0.10.1 From 3f7037b5242eed0175ca2c9780d7d02bd6943959 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 4 Feb 2013 12:29:00 -0500 Subject: bugfix: We didn't always print a warning when CSG normalization created too many elements diff --git a/src/csgtermnormalizer.cc b/src/csgtermnormalizer.cc index 81fab80..461e965 100644 --- a/src/csgtermnormalizer.cc +++ b/src/csgtermnormalizer.cc @@ -7,6 +7,7 @@ */ shared_ptr CSGTermNormalizer::normalize(const shared_ptr &root) { + this->aborted = false; shared_ptr temp = root; while (1) { this->rootnode = temp; @@ -49,14 +50,16 @@ shared_ptr CSGTermNormalizer::normalizePass(shared_ptr term) while (term && match_and_replace(term)) { } this->nodecount++; if (nodecount > this->limit) { + PRINTB("WARNING: Normalized tree is growing past %d elements. Aborting normalization.\n", this->limit); + this->aborted = true; return shared_ptr(); } if (!term || term->type == CSGTerm::TYPE_PRIMITIVE) return term; if (term->left) term->left = normalizePass(term->left); - } while (term->type != CSGTerm::TYPE_UNION && + } while (!this->aborted && term->type != CSGTerm::TYPE_UNION && ((term->right && term->right->type != CSGTerm::TYPE_PRIMITIVE) || (term->left && term->left->type == CSGTerm::TYPE_UNION))); - term->right = normalizePass(term->right); + if (!this->aborted) term->right = normalizePass(term->right); // FIXME: Do we need to take into account any transformation of item here? return collapse_null_terms(term); diff --git a/src/csgtermnormalizer.h b/src/csgtermnormalizer.h index c331f11..f7a444f 100644 --- a/src/csgtermnormalizer.h +++ b/src/csgtermnormalizer.h @@ -17,6 +17,7 @@ private: shared_ptr collapse_null_terms(const shared_ptr &term); unsigned int count(const shared_ptr &term) const; + bool aborted; size_t limit; size_t nodecount; shared_ptr rootnode; -- cgit v0.10.1 From 03be37d16b585e64de87118053206aaae06e7cf8 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 4 Feb 2013 14:08:23 -0500 Subject: Sync with latest commits diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 4448e89..1e0a737 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -1,3 +1,17 @@ +OpenSCAD 2013.XX +================ + +Features: +o Console output is now enabled on Windows through the openscad.com executable +o Added basic syntax highlighting in the editor + +Bugfixes: +o OpenCSG rendering sometimes crashed when rendering large models +o We didn't always print a warning when CSG normalization created too many elements +o Binary STLs can now be read on big endian architectures +o Some binary STLs couldn't be read +o Fixed some issues related to ARM builds + OpenSCAD 2013.01 ================ -- cgit v0.10.1