Forráskód Böngészése

merge master and mv FindDevIL to cmake-modules

aoowweenn 8 éve
szülő
commit
7226d73682

+ 205 - 205
CHANGES

@@ -1,205 +1,205 @@
-----------------------------------------------------------------------
-CHANGELOG
-----------------------------------------------------------------------
-
-3.3.1 (2016-07-08)
-
-FIXES/HOUSEKEEPING:
-    - Setup of default precision for 17 exporters
-    - Fix xcode project files
-    - Fix BlenderTesselator: offsetof operator
-    - Invalid version in cmake file
-    - Update pstdint.h to latest greatest
-
-
-3.3.0 (2016-07-05)
-
-FEATURES:
-    - C++11 support enabled
-    - New regression-test-UI
-    - Experimental glTF-importer support
-    - OpenGEX: add support for cameras and lights
-    - C4D: update to latest Melange-SDK
-    - Add a gitter channel
-    - Coverity check enabled
-    - Switch to <...> include brackets for public headers 
-    - Enable export by pyAssimp
-    - CI: check windows build
-    - Add functionality to perform a singlepost-processing step
-    - many more, just check the history
-
-FIXES/HOUSEKEEPING:
-    - Fix of many resource leaks in unittests and main lib
-    - Fix iOS-buildfor X64
-    - Choosing zlib manually for cmake
-    - many more, just check the history
-
-
-3.2.1 (2016-010-10)
-
-FEATURES:
-  - Updated glTF exporter to meet 1.0 specification.
-
-FIXES/HOUSEKEEPING:
-  - Fixed glTF Validator errors for exported glTF format.
-
-ISSUES:
-  - Hard coded sampler setting for
-    - magFilter
-    - minFilter
-  - void* in ExportData for accessor max and min.
-
-
-3.2.0 (2015-11-03)
-
-FEATURES:
-  - OpenDDL-Parser is part of contrib-source.
-  - Experimental OpenGEX-support
-  - CI-check for linux and windows
-  - Coverity check added
-  - New regression testsuite.
-
-FIXES/HOUSEKEEPING:
-  - Hundreds of bugfixes  in all parts of the library
-  - Unified line endings
-
-
-API COMPATIBILITY:
-  - Removed precompiled header to increase build speed for linux
-
-
-3.1.1 (2014-06-15)
-
-FEATURES:
-   - Support for FBX 2013 and newer, binary and ASCII (this is partly
-     work from Google Summer of Code 2012)
-   - Support for OGRE binary mesh and skeleton format
-   - Updated BLEND support for newer Blender versions
-   - Support for arbitrary meta data, used to hold FBX and DAE metadata
-   - OBJ Export now produces smaller files
-   - Meshes can now have names, this is supported by the major importers
-   - Improved IFC geometry generation
-   - M3 support has been removed
-
-FIXES/HOUSEKEEPING:
-    - Hundreds of bugfixes in all parts of the library
-    - CMake is now the primary build system
-
-API COMPATIBILITY:
-    - 3.1.1 is not binary compatible to 3.0 due to aiNode::mMetaData
-      and aiMesh::mName
-    - Export interface has been cleaned up and unified
-    - Other than that no relevant changes
-
-
-3.0 (2012-07-07)
-
-FEATURES:
-   - new export interface similar to the import API.
-   - Supported export formats: Collada, OBJ, PLY and STL
-   - added new import formats: XGL/ZGL, M3 (experimental)
-   - new postprocessing steps: Debone
-   - vastly improved IFC (Industry Foundation Classes) support
-   - introduced API to query importer meta information (such as supported
-       format versions, full name, maintainer info).
-   - reworked Ogre XML import
-   - C-API now supports per-import properties
-
-FIXES/HOUSEKEEPING:
-
-   - hundreds of bugfixes in all parts of the library
-   - unified naming and cleanup of public headers
-   - improved CMake build system
-   - templatized math library
-   - reduce dependency on boost.thread, only remaining spot
-     is synchronization for the C logging API
-
-API COMPATIBILITY:
-   - renamed headers, export interface, C API properties and meta data
-     prevent compatibility with code written for 2.0, but in
-     most cases these can be easily resolved
-   - Note: 3.0 is not binary compatible with 2.0
-
-
-
-
-2.0 (2010-11-21)
-
-FEATURES:
-   - Add support for static Blender (*.blend) scenes
-   - Add support for Q3BSP scenes
-   - Add a windows-based OpenGL sample featuring texturing & basic materials
-   - Add an experimental progress feedback interface.
-   - Vastly improved performance (up to 500%, depending on mesh size and
-     spatial structure) in some expensive postprocessing steps
-   - AssimpView now uses a reworked layout which leaves more space
-     to the scene hierarchy window
-
-   - Add C# bindings ('Assimp.NET')
-   - Keep BSD-licensed and otherwise free test files in separate
-     folders (./test/models and ./test/models-nonbsd).
-
-FIXES:
-   - Many Collada bugfixes, improve fault tolerance
-   - Fix possible crashes in the Obj loader
-   - Improve the Ogre XML loader
-   - OpenGL-sample now works with MinGW
-   - Fix Importer::FindLoader failing on uppercase file extensions
-   - Fix flawed path handling when locating external files
-   - Limit the maximum number of vertices, faces, face indices and
-     weights that Assimp is able to handle. This is to avoid
-     crashes due to overflowing counters.
-
-   - Updated XCode project files
-   - Further CMAKE build improvements
-
-
-API CHANGES:
-   - Add data structures for vertex-based animations (These are not
-     currently used, however ...)
-   - Some Assimp::Importer methods are const now.
-
-
-
-
-
-1.1 (2010-04-17)
-This is the list of relevant changes from the 1.0 (r412) release to 1.1 (r700).
-
-FEATURES:
-  - Vastly improved Collada support
-  - Add MS3D (Milkshape 3D) support
-  - Add support for Ogre XML static meshes
-  - Add experimental COB (TrueSpace) support
-  - Automatic test suite to quickly locate regressions
-  - D bindings (`dAssimp`)
-  - Python 2.n bindings (`PyAssimp`)
-  - Add basic support for Unicode input files (utf8, utf16 and utf32)
-  - Add further utilities to the `assimp` tool (xml/binary dumps, quick file stats)
-  - Switch to a CMAKE-based build system including an install target for unix'es
-  - Automatic evaluation of subdivision surfaces for some formats.
-  - Add `Importer::ReadFileFromMemory` and the corresponding C-API `aiReadFileFromMemory`
-  - Expose further math utilities via the C-API (i.e. `aiMultiplyMatrix4`)
-
-  - Move noboost files away from the public include directory
-  - Many, many bugfixes and improvements in existing loaders and postprocessing steps
-  - Documentation improved and clarified in many places.
-  - Add a sample on using Assimp in conjunction with OpenGL
-
-  - Distribution/packaging: comfortable SDK installer for Windows
-  - Distribution/packaging: improved release packages for other architectures
-
-CRITICAL FIXES:
-  - Resolve problems with clashing heap managers, STL ABIs and runtime libraries (win32)
-  - Fix automatic detection of file type if no file extension is given
-  - Improved exception safety and robustness, prevent leaking of exceptions through the C interface
-  - Fix possible heap corruption due to material properties pulled in incorrectly
-  - Avoid leaking in certain error scenarios
-  - Fix 64 bit compatibility problems in some loaders (i.e. MDL)
-
-BREAKING API CHANGES:
-  - None -
-
-MINOR API BEHAVIOUR CHANGES:
- - Change quaternion orientation to suit to the more common convention (-w).
- - aiString is utf8 now. Not yet consistent, however.
+----------------------------------------------------------------------
+CHANGELOG
+----------------------------------------------------------------------
+
+3.3.1 (2016-07-08)
+
+FIXES/HOUSEKEEPING:
+    - Setup of default precision for 17 exporters
+    - Fix xcode project files
+    - Fix BlenderTesselator: offsetof operator
+    - Invalid version in cmake file
+    - Update pstdint.h to latest greatest
+
+
+3.3.0 (2016-07-05)
+
+FEATURES:
+    - C++11 support enabled
+    - New regression-test-UI
+    - Experimental glTF-importer support
+    - OpenGEX: add support for cameras and lights
+    - C4D: update to latest Melange-SDK
+    - Add a gitter channel
+    - Coverity check enabled
+    - Switch to <...> include brackets for public headers 
+    - Enable export by pyAssimp
+    - CI: check windows build
+    - Add functionality to perform a singlepost-processing step
+    - many more, just check the history
+
+FIXES/HOUSEKEEPING:
+    - Fix of many resource leaks in unittests and main lib
+    - Fix iOS-buildfor X64
+    - Choosing zlib manually for cmake
+    - many more, just check the history
+
+
+3.2.1 (2016-010-10)
+
+FEATURES:
+  - Updated glTF exporter to meet 1.0 specification.
+
+FIXES/HOUSEKEEPING:
+  - Fixed glTF Validator errors for exported glTF format.
+
+ISSUES:
+  - Hard coded sampler setting for
+    - magFilter
+    - minFilter
+  - void* in ExportData for accessor max and min.
+
+
+3.2.0 (2015-11-03)
+
+FEATURES:
+  - OpenDDL-Parser is part of contrib-source.
+  - Experimental OpenGEX-support
+  - CI-check for linux and windows
+  - Coverity check added
+  - New regression testsuite.
+
+FIXES/HOUSEKEEPING:
+  - Hundreds of bugfixes  in all parts of the library
+  - Unified line endings
+
+
+API COMPATIBILITY:
+  - Removed precompiled header to increase build speed for linux
+
+
+3.1.1 (2014-06-15)
+
+FEATURES:
+   - Support for FBX 2013 and newer, binary and ASCII (this is partly
+     work from Google Summer of Code 2012)
+   - Support for OGRE binary mesh and skeleton format
+   - Updated BLEND support for newer Blender versions
+   - Support for arbitrary meta data, used to hold FBX and DAE metadata
+   - OBJ Export now produces smaller files
+   - Meshes can now have names, this is supported by the major importers
+   - Improved IFC geometry generation
+   - M3 support has been removed
+
+FIXES/HOUSEKEEPING:
+    - Hundreds of bugfixes in all parts of the library
+    - CMake is now the primary build system
+
+API COMPATIBILITY:
+    - 3.1.1 is not binary compatible to 3.0 due to aiNode::mMetaData
+      and aiMesh::mName
+    - Export interface has been cleaned up and unified
+    - Other than that no relevant changes
+
+
+3.0 (2012-07-07)
+
+FEATURES:
+   - new export interface similar to the import API.
+   - Supported export formats: Collada, OBJ, PLY and STL
+   - added new import formats: XGL/ZGL, M3 (experimental)
+   - new postprocessing steps: Debone
+   - vastly improved IFC (Industry Foundation Classes) support
+   - introduced API to query importer meta information (such as supported
+       format versions, full name, maintainer info).
+   - reworked Ogre XML import
+   - C-API now supports per-import properties
+
+FIXES/HOUSEKEEPING:
+
+   - hundreds of bugfixes in all parts of the library
+   - unified naming and cleanup of public headers
+   - improved CMake build system
+   - templatized math library
+   - reduce dependency on boost.thread, only remaining spot
+     is synchronization for the C logging API
+
+API COMPATIBILITY:
+   - renamed headers, export interface, C API properties and meta data
+     prevent compatibility with code written for 2.0, but in
+     most cases these can be easily resolved
+   - Note: 3.0 is not binary compatible with 2.0
+
+
+
+
+2.0 (2010-11-21)
+
+FEATURES:
+   - Add support for static Blender (*.blend) scenes
+   - Add support for Q3BSP scenes
+   - Add a windows-based OpenGL sample featuring texturing & basic materials
+   - Add an experimental progress feedback interface.
+   - Vastly improved performance (up to 500%, depending on mesh size and
+     spatial structure) in some expensive postprocessing steps
+   - AssimpView now uses a reworked layout which leaves more space
+     to the scene hierarchy window
+
+   - Add C# bindings ('Assimp.NET')
+   - Keep BSD-licensed and otherwise free test files in separate
+     folders (./test/models and ./test/models-nonbsd).
+
+FIXES:
+   - Many Collada bugfixes, improve fault tolerance
+   - Fix possible crashes in the Obj loader
+   - Improve the Ogre XML loader
+   - OpenGL-sample now works with MinGW
+   - Fix Importer::FindLoader failing on uppercase file extensions
+   - Fix flawed path handling when locating external files
+   - Limit the maximum number of vertices, faces, face indices and
+     weights that Assimp is able to handle. This is to avoid
+     crashes due to overflowing counters.
+
+   - Updated XCode project files
+   - Further CMAKE build improvements
+
+
+API CHANGES:
+   - Add data structures for vertex-based animations (These are not
+     currently used, however ...)
+   - Some Assimp::Importer methods are const now.
+
+
+
+
+
+1.1 (2010-04-17)
+This is the list of relevant changes from the 1.0 (r412) release to 1.1 (r700).
+
+FEATURES:
+  - Vastly improved Collada support
+  - Add MS3D (Milkshape 3D) support
+  - Add support for Ogre XML static meshes
+  - Add experimental COB (TrueSpace) support
+  - Automatic test suite to quickly locate regressions
+  - D bindings (`dAssimp`)
+  - Python 2.n bindings (`PyAssimp`)
+  - Add basic support for Unicode input files (utf8, utf16 and utf32)
+  - Add further utilities to the `assimp` tool (xml/binary dumps, quick file stats)
+  - Switch to a CMAKE-based build system including an install target for unix'es
+  - Automatic evaluation of subdivision surfaces for some formats.
+  - Add `Importer::ReadFileFromMemory` and the corresponding C-API `aiReadFileFromMemory`
+  - Expose further math utilities via the C-API (i.e. `aiMultiplyMatrix4`)
+
+  - Move noboost files away from the public include directory
+  - Many, many bugfixes and improvements in existing loaders and postprocessing steps
+  - Documentation improved and clarified in many places.
+  - Add a sample on using Assimp in conjunction with OpenGL
+
+  - Distribution/packaging: comfortable SDK installer for Windows
+  - Distribution/packaging: improved release packages for other architectures
+
+CRITICAL FIXES:
+  - Resolve problems with clashing heap managers, STL ABIs and runtime libraries (win32)
+  - Fix automatic detection of file type if no file extension is given
+  - Improved exception safety and robustness, prevent leaking of exceptions through the C interface
+  - Fix possible heap corruption due to material properties pulled in incorrectly
+  - Avoid leaking in certain error scenarios
+  - Fix 64 bit compatibility problems in some loaders (i.e. MDL)
+
+BREAKING API CHANGES:
+  - None -
+
+MINOR API BEHAVIOUR CHANGES:
+ - Change quaternion orientation to suit to the more common convention (-w).
+ - aiString is utf8 now. Not yet consistent, however.

+ 2 - 8
CMakeLists.txt

@@ -185,9 +185,9 @@ if (ASSIMP_COVERALLS)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
 endif()
 endif()
 
 
-INCLUDE (FindPkgConfig)
 INCLUDE_DIRECTORIES( include )
 INCLUDE_DIRECTORIES( include )
 
 
+INCLUDE (FindPkgMacros)
 INCLUDE (PrecompiledHeader)
 INCLUDE (PrecompiledHeader)
 
 
 # If this is an in-source build (CMAKE_SOURCE_DIR == CMAKE_BINARY_DIR),
 # If this is an in-source build (CMAKE_SOURCE_DIR == CMAKE_BINARY_DIR),
@@ -255,9 +255,7 @@ ENDIF(NOT ZLIB_FOUND)
 INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
 INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
 
 
 # Search for unzip
 # Search for unzip
-IF (PKG_CONFIG_FOUND)
-  PKG_CHECK_MODULES(UNZIP minizip)
-ENDIF (PKG_CONFIG_FOUND)
+use_pkgconfig(UNZIP minizip)
 
 
 IF ( ASSIMP_NO_EXPORT )
 IF ( ASSIMP_NO_EXPORT )
   ADD_DEFINITIONS( -DASSIMP_BUILD_NO_EXPORT)
   ADD_DEFINITIONS( -DASSIMP_BUILD_NO_EXPORT)
@@ -344,11 +342,7 @@ IF ( ASSIMP_BUILD_ASSIMP_TOOLS )
   # Why assimp_qt_viewer/CMakeLists.txt still contain similar check?
   # Why assimp_qt_viewer/CMakeLists.txt still contain similar check?
   # Because viewer can be build independently of Assimp.
   # Because viewer can be build independently of Assimp.
   FIND_PACKAGE(Qt5Widgets QUIET)
   FIND_PACKAGE(Qt5Widgets QUIET)
-  set(CMAKE_MODULE_PATH_BACKUP ${CMAKE_MODULE_PATH})
-  set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
   FIND_PACKAGE(DevIL QUIET)
   FIND_PACKAGE(DevIL QUIET)
-  set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
-  set(CMAKE_MODULE_PATH_BACKUP ${CMAKE_MODULE_PATH})
   FIND_PACKAGE(OpenGL QUIET)
   FIND_PACKAGE(OpenGL QUIET)
   IF ( Qt5Widgets_FOUND AND IL_FOUND AND OPENGL_FOUND)
   IF ( Qt5Widgets_FOUND AND IL_FOUND AND OPENGL_FOUND)
     ADD_SUBDIRECTORY( tools/assimp_qt_viewer/ )
     ADD_SUBDIRECTORY( tools/assimp_qt_viewer/ )

+ 160 - 160
CREDITS

@@ -1,160 +1,160 @@
-===============================================================
-Open Asset Import Library (Assimp)
-Developers and Contributors
-===============================================================
-
-The following is a non-exhaustive list of all constributors over the years.
-If you think your name should be listed here, drop us a line and we'll add you.
-
-- Alexander Gessler,
-3DS-, BLEND-, ASE-, DXF-, HMP-, MDL-, MD2-, MD3-, MD5-, MDC-, NFF-, PLY-, STL-, RAW-, OFF-, MS3D-, Q3D- and LWO-Loader, Assimp-Viewer, assimp-cmd, -noboost, Website (Design).
-
-- Thomas Schulze,
-X-, Collada-, BVH-Loader, Postprocessing framework. Data structure & Interface design, documentation.
-
-- Kim Kulling,
-Obj-, Q3BSD-, OpenGEX-Loader, Logging system, CMake-build-environment, Linux-build, Website ( Admin ), Coverity ( Admin ), Glitter ( Admin ).
-
-- R.Schmidt,
-Linux build, eclipse support.
-
-- Matthias Gubisch,
-Assimp.net
-Visual Studio 9 support, bugfixes.
-
-- Mark Sibly
-B3D-Loader, Assimp testing
-
-- Jonathan Klein
-Ogre Loader, VC2010 fixes and CMake fixes.
-
-- Sebastian Hempel,
-PyAssimp (first version)
-Compile-Bugfixes for mingw, add environment for static library support in make.
-
-- Jonathan Pokrass
-Supplied a bugfix concerning the scaling in the md3 loader.
-
-- Andrew Galante,
-Submitted patches to make Assimp compile with GCC-4, a makefile and the xcode3 workspace.
-
-- Andreas Nagel
-First Assimp testing & verification under Windows Vista 64 Bit.
-
-- Marius Schr�der
-Allowed us to use many of his models for screenshots and testing.
-
-- Christian Schubert
-Supplied various XFiles for testing purposes.
-
-- Tizian Wieland
-Searched the web for hundreds of test models for internal use
-
-- John Connors
-Supplied patches for linux and SCons.
-
-- T. R.
-The GUY who performed some of the CSM mocaps.
-
-- Andy Maloney
-Contributed fixes for the documentation and the doxygen markup
-
-- Zhao Lei
-Contributed several bugfixes fixing memory leaks and improving float parsing 
-
-- sueastside
-Updated PyAssimp to the latest Assimp data structures and provided a script to keep the Python binding up-to-date.
-
-- Tobias Rittig
-Collada testing with Cinema 4D
-
-- Brad Grantham
-Improvements in OpenGL-Sample.
-
-- Robert Ramirez
-Add group loading feature to Obj-Loader.
-
-- Chris Maiwald
-Many bugreports, improving Assimp's portability, regular testing & feedback.
-
-- Stepan Hrbek
-Bugreport and fix for a obj-materialloader crash.
-
-- David Nadlinger
-D bindings, CMake install support. 
-
-- Dario Accornero
-Contributed several patches regarding Mac OS/XCode targets, bug reports.
-
-- Martin Walser (Samhayne)
-Contributed the 'SimpleTexturedOpenGl' sample.
-
-- Matthias Fauconneau
-Contributed a fix for the Q3-BSP loader.
-
-- J�rgen P. Tjern�
-Contributed updated and improved xcode workspaces
-
-- drparallax
-Contributed the /samples/SimpleAssimpViewX sample
-
-- Carsten Fuchs
-Contributed a fix for the Normalize method in aiQuaternion.
-
-- dbburgess
-Contributes a Android-specific build issue: log the hardware architecture for ARM.
-
-- alfiereinre7
-Contributes a obj-fileparser fix: missing tokens in the obj-token list.
-
-- Roman Kharitonov
-Contributes a fix for the configure script environment.
-
-- Ed Diana
-Contributed AssimpDelphi (/port/AssimpDelphi).
-
-- rdb 
-Contributes a bundle of fixes and improvements for the bsp-importer.
-
-- Mick P
-For contributing the De-bone postprocessing step and filing various bug reports.
-
-- Rosen Diankov
-Contributed patches to build assimp debian packages using cmake.
-
-- Mark Page
-Contributed a patch to fix the VertexTriangleAdjacency postprocessing step.
-
-- IOhannes
-Contributed the Debian build fixes ( architecture macro ).
-
-- gellule
-Several LWO and LWS fixes (pivoting). 
-
-- Marcel Metz
-GCC/Linux fixes for the SimpleOpenGL sample.
-
-- Brian Miller
-Bugfix for a compiler fix for iOS on arm.
-
-- S�verin Lemaignan
-Rewrite of PyAssimp, distutils and Python3 support
-
-- albert-wang
-Bugfixes for the collada parser
-
-- Ya ping Jin
-Bugfixes for uv-tanget calculation.
-
-- Jonne Nauha
-Ogre Binary format support
-
-- Filip Wasil, Tieto Poland Sp. z o.o.
-Android JNI asset extraction support
-
-- Richard Steffen
-Contributed ExportProperties interface
-Contributed X File exporter
-Contributed Step (stp) exporter
-
-
+===============================================================
+Open Asset Import Library (Assimp)
+Developers and Contributors
+===============================================================
+
+The following is a non-exhaustive list of all constributors over the years.
+If you think your name should be listed here, drop us a line and we'll add you.
+
+- Alexander Gessler,
+3DS-, BLEND-, ASE-, DXF-, HMP-, MDL-, MD2-, MD3-, MD5-, MDC-, NFF-, PLY-, STL-, RAW-, OFF-, MS3D-, Q3D- and LWO-Loader, Assimp-Viewer, assimp-cmd, -noboost, Website (Design).
+
+- Thomas Schulze,
+X-, Collada-, BVH-Loader, Postprocessing framework. Data structure & Interface design, documentation.
+
+- Kim Kulling,
+Obj-, Q3BSD-, OpenGEX-Loader, Logging system, CMake-build-environment, Linux-build, Website ( Admin ), Coverity ( Admin ), Glitter ( Admin ).
+
+- R.Schmidt,
+Linux build, eclipse support.
+
+- Matthias Gubisch,
+Assimp.net
+Visual Studio 9 support, bugfixes.
+
+- Mark Sibly
+B3D-Loader, Assimp testing
+
+- Jonathan Klein
+Ogre Loader, VC2010 fixes and CMake fixes.
+
+- Sebastian Hempel,
+PyAssimp (first version)
+Compile-Bugfixes for mingw, add environment for static library support in make.
+
+- Jonathan Pokrass
+Supplied a bugfix concerning the scaling in the md3 loader.
+
+- Andrew Galante,
+Submitted patches to make Assimp compile with GCC-4, a makefile and the xcode3 workspace.
+
+- Andreas Nagel
+First Assimp testing & verification under Windows Vista 64 Bit.
+
+- Marius Schr�der
+Allowed us to use many of his models for screenshots and testing.
+
+- Christian Schubert
+Supplied various XFiles for testing purposes.
+
+- Tizian Wieland
+Searched the web for hundreds of test models for internal use
+
+- John Connors
+Supplied patches for linux and SCons.
+
+- T. R.
+The GUY who performed some of the CSM mocaps.
+
+- Andy Maloney
+Contributed fixes for the documentation and the doxygen markup
+
+- Zhao Lei
+Contributed several bugfixes fixing memory leaks and improving float parsing
+
+- sueastside
+Updated PyAssimp to the latest Assimp data structures and provided a script to keep the Python binding up-to-date.
+
+- Tobias Rittig
+Collada testing with Cinema 4D
+
+- Brad Grantham
+Improvements in OpenGL-Sample.
+
+- Robert Ramirez
+Add group loading feature to Obj-Loader.
+
+- Chris Maiwald
+Many bugreports, improving Assimp's portability, regular testing & feedback.
+
+- Stepan Hrbek
+Bugreport and fix for a obj-materialloader crash.
+
+- David Nadlinger
+D bindings, CMake install support.
+
+- Dario Accornero
+Contributed several patches regarding Mac OS/XCode targets, bug reports.
+
+- Martin Walser (Samhayne)
+Contributed the 'SimpleTexturedOpenGl' sample.
+
+- Matthias Fauconneau
+Contributed a fix for the Q3-BSP loader.
+
+- Jørgen P. Tjernø
+Contributed updated and improved xcode workspaces
+
+- drparallax
+Contributed the /samples/SimpleAssimpViewX sample
+
+- Carsten Fuchs
+Contributed a fix for the Normalize method in aiQuaternion.
+
+- dbburgess
+Contributes a Android-specific build issue: log the hardware architecture for ARM.
+
+- alfiereinre7
+Contributes a obj-fileparser fix: missing tokens in the obj-token list.
+
+- Roman Kharitonov
+Contributes a fix for the configure script environment.
+
+- Ed Diana
+Contributed AssimpDelphi (/port/AssimpDelphi).
+
+- rdb
+Contributes a bundle of fixes and improvements for the bsp-importer.
+
+- Mick P
+For contributing the De-bone postprocessing step and filing various bug reports.
+
+- Rosen Diankov
+Contributed patches to build assimp debian packages using cmake.
+
+- Mark Page
+Contributed a patch to fix the VertexTriangleAdjacency postprocessing step.
+
+- IOhannes
+Contributed the Debian build fixes ( architecture macro ).
+
+- gellule
+Several LWO and LWS fixes (pivoting).
+
+- Marcel Metz
+GCC/Linux fixes for the SimpleOpenGL sample.
+
+- Brian Miller
+Bugfix for a compiler fix for iOS on arm.
+
+- Séverin Lemaignan
+Rewrite of PyAssimp, distutils and Python3 support
+
+- albert-wang
+Bugfixes for the collada parser
+
+- Ya ping Jin
+Bugfixes for uv-tanget calculation.
+
+- Jonne Nauha
+Ogre Binary format support
+
+- Filip Wasil, Tieto Poland Sp. z o.o.
+Android JNI asset extraction support
+
+- Richard Steffen
+Contributed ExportProperties interface
+Contributed X File exporter
+Contributed Step (stp) exporter
+
+

+ 78 - 78
LICENSE

@@ -1,78 +1,78 @@
-Open Asset Import Library (assimp)
-
-Copyright (c) 2006-2016, assimp team
-All rights reserved.
-
-Redistribution and use of this software in source and binary forms,
-with or without modification, are permitted provided that the
-following conditions are met:
-
-* Redistributions of source code must retain the above
-  copyright notice, this list of conditions and the
-  following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-  copyright notice, this list of conditions and the
-  following disclaimer in the documentation and/or other
-  materials provided with the distribution.
-
-* Neither the name of the assimp team, nor the names of its
-  contributors may be used to endorse or promote products
-  derived from this software without specific prior
-  written permission of the assimp team.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-
-******************************************************************************
-
-AN EXCEPTION applies to all files in the ./test/models-nonbsd folder.
-These are 3d models for testing purposes, from various free sources
-on the internet. They are - unless otherwise stated - copyright of
-their respective creators, which may impose additional requirements
-on the use of their work. For any of these models, see
-<model-name>.source.txt for more legal information. Contact us if you
-are a copyright holder and believe that we credited you inproperly or
-if you don't want your files to appear in the repository.
-
-
-******************************************************************************
-
-Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
-http://code.google.com/p/poly2tri/
-
-All rights reserved.
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-* Neither the name of Poly2Tri nor the names of its contributors may be
-  used to endorse or promote products derived from this software without specific
-  prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Open Asset Import Library (assimp)
+
+Copyright (c) 2006-2016, assimp team
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+******************************************************************************
+
+AN EXCEPTION applies to all files in the ./test/models-nonbsd folder.
+These are 3d models for testing purposes, from various free sources
+on the internet. They are - unless otherwise stated - copyright of
+their respective creators, which may impose additional requirements
+on the use of their work. For any of these models, see
+<model-name>.source.txt for more legal information. Contact us if you
+are a copyright holder and believe that we credited you inproperly or
+if you don't want your files to appear in the repository.
+
+
+******************************************************************************
+
+Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
+http://code.google.com/p/poly2tri/
+
+All rights reserved.
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+* Neither the name of Poly2Tri nor the names of its contributors may be
+  used to endorse or promote products derived from this software without specific
+  prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 147 - 143
Readme.md

@@ -1,143 +1,147 @@
-Open Asset Import Library (assimp)
-==================================
-
-[![Linux Build Status](https://travis-ci.org/assimp/assimp.svg)](https://travis-ci.org/assimp/assimp)
-[![Windows Build Status](https://ci.appveyor.com/api/projects/status/tmo433wax6u6cjp4?svg=true)](https://ci.appveyor.com/project/kimkulling/assimp)
-<a href="https://scan.coverity.com/projects/5607">
-  <img alt="Coverity Scan Build Status"
-       src="https://scan.coverity.com/projects/5607/badge.svg"/>
-</a>
-[![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master)
-<br>
-
-APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.
-
-Additionally, assimp features various __mesh post processing tools__: normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials and many more.
-
-This is the development trunk containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [assimp.sf.net](http://assimp.sf.net) or from *nix package repositories.
-The current build status is:
-
-Gitter chat: [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)<br>
-__[open3mod](https://github.com/acgessler/open3mod) is a powerful 3D model viewer based on Assimp's import and export abilities.__
-
-Please check our Wiki as well: https://github.com/assimp/assimp/wiki
-
-#### Supported file formats ####
-
-A full list [is here](http://assimp.org/main_features_formats.html).
-__Importers__:
-
-- 3DS
-- BLEND (Blender)
-- DAE/Collada
-- FBX
-- IFC-STEP
-- ASE
-- DXF
-- HMP
-- MD2
-- MD3
-- MD5
-- MDC
-- MDL
-- NFF
-- PLY
-- STL
-- X
-- OBJ
-- OpenGEX
-- SMD
-- LWO
-- LXO
-- LWS  
-- TER
-- AC3D
-- MS3D
-- COB
-- Q3BSP
-- XGL
-- CSM
-- BVH
-- B3D
-- NDO
-- Ogre Binary
-- Ogre XML
-- Q3D
-- ASSBIN (Assimp custom format)
-- glTF (partial)
-- 3MF
-
-Additionally, some formats are supported by dependency on non-free code or external SDKs (not built by default):
-
-- C4D (https://github.com/acgessler/assimp-cinema4d)
-
-__Exporters__:
-
-- DAE (Collada)
-- STL
-- OBJ
-- PLY
-- X
-- 3DS
-- JSON (for WebGl, via https://github.com/acgessler/assimp2json)
-- ASSBIN
-- STEP
-- glTF (partial)
-
-### Building ###
-Take a look into the `INSTALL` file. Our build system is CMake, if you used CMake before there is a good chance you know what to do.
-
-### Ports ###
-* [Android](port/AndroidJNI/README.md)
-* [Python](port/PyAssimp/README.md)
-* [.NET](port/AssimpNET/Readme.md)
-* [Pascal](port/AssimpPascal/Readme.md)
-* [Javascript (Alpha)](https://github.com/makc/assimp2json)
-
-#### Repository structure ####
-Open Asset Import Library is implemented in C++. The directory structure is:
-
-	/code		Source code
-	/contrib	Third-party libraries
-	/doc		Documentation (doxysource and pre-compiled docs)
-	/include	Public header C and C++ header files
-	/scripts 	Scripts used to generate the loading code for some formats
-	/port		Ports to other languages and scripts to maintain those.
-	/test		Unit- and regression tests, test suite of models
-	/tools		Tools (old assimp viewer, command line `assimp`)
-	/samples	A small number of samples to illustrate possible
-                        use cases for Assimp
-	/workspaces	Build environments for vc,xcode,... (deprecated,
-			CMake has superseeded all legacy build options!)
-
-
-### Where to get help ###
-For more information, visit [our website](http://assimp.org/). Or check out the `./doc`- folder, which contains the official documentation in HTML format.
-(CHMs for Windows are included in some release packages and should be located right here in the root folder).
-
-If the docs don't solve your problem, ask on [StackOverflow](http://stackoverflow.com/questions/tagged/assimp?sort=newest). If you think you found a bug, please open an issue on Github.
-
-For development discussions, there is also a (very low-volume) mailing list, _assimp-discussions_
-  [(subscribe here)]( https://lists.sourceforge.net/lists/listinfo/assimp-discussions)
-
-Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export.
-
-And we also have a Gitter-channel:Gitter [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)<br>
-
-### Contributing ###
-Contributions to assimp are highly appreciated. The easiest way to get involved is to submit
-a pull request with your changes against the main repository's `master` branch.
-
-### Donate ###
-If you like assimp, consider buying us a beer (or two):
-[Donate](http://sourceforge.net/donate/index.php?group_id=226462)
-
-### License ###
-Our license is based on the modified, __3-clause BSD__-License.
-
-An _informal_ summary is: do whatever you want, but include Assimp's license text with your product -
-and don't sue us if our code doesn't work. Note that, unlike LGPLed code, you may link statically to Assimp.
-For the legal details, see the `LICENSE` file.
-
-### Why this name ###
-Sorry, we're germans :-), no english native speakers ...
+Open Asset Import Library (assimp)
+==================================
+
+[![Linux Build Status](https://travis-ci.org/assimp/assimp.svg)](https://travis-ci.org/assimp/assimp)
+[![Windows Build Status](https://ci.appveyor.com/api/projects/status/tmo433wax6u6cjp4?svg=true)](https://ci.appveyor.com/project/kimkulling/assimp)
+<a href="https://scan.coverity.com/projects/5607">
+  <img alt="Coverity Scan Build Status"
+       src="https://scan.coverity.com/projects/5607/badge.svg"/>
+</a>
+[![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master)
+<br>
+
+APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.
+
+Additionally, assimp features various __mesh post processing tools__: normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials and many more.
+
+This is the development trunk containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [assimp.sf.net](http://assimp.sf.net) or from *nix package repositories.
+The current build status is:
+
+Gitter chat: [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)<br>
+And we also have an IRC-channel at freenode: #assetimporterlib . You can easily join us via: [KiwiIRC/freenote](https://kiwiirc.com/client/irc.freenode.net), choose your nickname and type
+> /join #assetimporterlib
+
+<br>
+__[open3mod](https://github.com/acgessler/open3mod) is a powerful 3D model viewer based on Assimp's import and export abilities.__
+
+Please check our Wiki as well: https://github.com/assimp/assimp/wiki
+
+#### Supported file formats ####
+
+A full list [is here](http://assimp.org/main_features_formats.html).
+__Importers__:
+
+- 3DS
+- BLEND (Blender)
+- DAE/Collada
+- FBX
+- IFC-STEP
+- ASE
+- DXF
+- HMP
+- MD2
+- MD3
+- MD5
+- MDC
+- MDL
+- NFF
+- PLY
+- STL
+- X
+- OBJ
+- OpenGEX
+- SMD
+- LWO
+- LXO
+- LWS  
+- TER
+- AC3D
+- MS3D
+- COB
+- Q3BSP
+- XGL
+- CSM
+- BVH
+- B3D
+- NDO
+- Ogre Binary
+- Ogre XML
+- Q3D
+- ASSBIN (Assimp custom format)
+- glTF (partial)
+- 3MF
+
+Additionally, some formats are supported by dependency on non-free code or external SDKs (not built by default):
+
+- C4D (https://github.com/acgessler/assimp-cinema4d)
+
+__Exporters__:
+
+- DAE (Collada)
+- STL
+- OBJ
+- PLY
+- X
+- 3DS
+- JSON (for WebGl, via https://github.com/acgessler/assimp2json)
+- ASSBIN
+- STEP
+- glTF (partial)
+
+### Building ###
+Take a look into the `INSTALL` file. Our build system is CMake, if you used CMake before there is a good chance you know what to do.
+
+### Ports ###
+* [Android](port/AndroidJNI/README.md)
+* [Python](port/PyAssimp/README.md)
+* [.NET](port/AssimpNET/Readme.md)
+* [Pascal](port/AssimpPascal/Readme.md)
+* [Javascript (Alpha)](https://github.com/makc/assimp2json)
+
+#### Repository structure ####
+Open Asset Import Library is implemented in C++. The directory structure is:
+
+	/code		Source code
+	/contrib	Third-party libraries
+	/doc		Documentation (doxysource and pre-compiled docs)
+	/include	Public header C and C++ header files
+	/scripts 	Scripts used to generate the loading code for some formats
+	/port		Ports to other languages and scripts to maintain those.
+	/test		Unit- and regression tests, test suite of models
+	/tools		Tools (old assimp viewer, command line `assimp`)
+	/samples	A small number of samples to illustrate possible
+                        use cases for Assimp
+	/workspaces	Build environments for vc,xcode,... (deprecated,
+			CMake has superseeded all legacy build options!)
+
+
+### Where to get help ###
+For more information, visit [our website](http://assimp.org/). Or check out the `./doc`- folder, which contains the official documentation in HTML format.
+(CHMs for Windows are included in some release packages and should be located right here in the root folder).
+
+If the docs don't solve your problem, ask on [StackOverflow](http://stackoverflow.com/questions/tagged/assimp?sort=newest). If you think you found a bug, please open an issue on Github.
+
+For development discussions, there is also a (very low-volume) mailing list, _assimp-discussions_
+  [(subscribe here)]( https://lists.sourceforge.net/lists/listinfo/assimp-discussions)
+
+Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export.
+
+And we also have a Gitter-channel:Gitter [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)<br>
+
+### Contributing ###
+Contributions to assimp are highly appreciated. The easiest way to get involved is to submit
+a pull request with your changes against the main repository's `master` branch.
+
+### Donate ###
+If you like assimp, consider buying us a beer (or two):
+[Donate](http://sourceforge.net/donate/index.php?group_id=226462)
+
+### License ###
+Our license is based on the modified, __3-clause BSD__-License.
+
+An _informal_ summary is: do whatever you want, but include Assimp's license text with your product -
+and don't sue us if our code doesn't work. Note that, unlike LGPLed code, you may link statically to Assimp.
+For the legal details, see the `LICENSE` file.
+
+### Why this name ###
+Sorry, we're germans :-), no english native speakers ...

+ 0 - 0
FindDevIL.cmake → cmake-modules/FindDevIL.cmake


+ 7 - 4
cmake-modules/FindPkgMacros.cmake

@@ -59,10 +59,13 @@ endmacro(clear_if_changed)
 
 
 # Try to get some hints from pkg-config, if available
 # Try to get some hints from pkg-config, if available
 macro(use_pkgconfig PREFIX PKGNAME)
 macro(use_pkgconfig PREFIX PKGNAME)
-  find_package(PkgConfig)
-  if (PKG_CONFIG_FOUND)
-    pkg_check_modules(${PREFIX} ${PKGNAME})
-  endif ()
+  # Android does not support PKG_CONFIG so we disable it
+  IF ( NOT ANDROID )
+    find_package(PkgConfig)
+    if (PKG_CONFIG_FOUND)
+      pkg_check_modules(${PREFIX} ${PKGNAME})
+    endif ()
+  ENDIF ( NOT ANDROID )
 endmacro (use_pkgconfig)
 endmacro (use_pkgconfig)
 
 
 # Couple a set of release AND debug libraries (or frameworks)
 # Couple a set of release AND debug libraries (or frameworks)

+ 1 - 1
cmake-modules/FindZLIB.cmake

@@ -11,7 +11,7 @@
 # Once done, this will define
 # Once done, this will define
 #
 #
 #  ZLIB_FOUND - system has ZLIB
 #  ZLIB_FOUND - system has ZLIB
-#  ZLIB_INCLUDE_DIRS - the ZLIB include directories 
+#  ZLIB_INCLUDE_DIRS - the ZLIB include directories
 #  ZLIB_LIBRARIES - link these to use ZLIB
 #  ZLIB_LIBRARIES - link these to use ZLIB
 
 
 include(FindPkgMacros)
 include(FindPkgMacros)

+ 1 - 1
code/ASEParser.cpp

@@ -1858,7 +1858,7 @@ void Parser::ParseLV3MeshCFaceListBlock(unsigned int iNumFaces, ASE::Mesh& mesh)
             ++filePtr;
             ++filePtr;
 
 
             // Face entry
             // Face entry
-            if (TokenMatch(filePtr,"MESH_CFACE" ,11))
+            if (TokenMatch(filePtr,"MESH_CFACE" ,10))
             {
             {
                 unsigned int aiValues[3];
                 unsigned int aiValues[3];
                 unsigned int iIndex = 0;
                 unsigned int iIndex = 0;

+ 1 - 0
code/BlenderLoader.cpp

@@ -165,6 +165,7 @@ void BlenderImporter::InternReadFile( const std::string& pFile,
     free_it free_it_really(dest);
     free_it free_it_really(dest);
 #endif
 #endif
 
 
+
     FileDatabase file;
     FileDatabase file;
     std::shared_ptr<IOStream> stream(pIOHandler->Open(pFile,"rb"));
     std::shared_ptr<IOStream> stream(pIOHandler->Open(pFile,"rb"));
     if (!stream) {
     if (!stream) {

+ 7 - 1
code/CMakeLists.txt

@@ -187,10 +187,16 @@ IF ( ASSIMP_BUILD_NONFREE_C4D_IMPORTER )
   SOURCE_GROUP( C4D FILES ${C4D_SRCS})
   SOURCE_GROUP( C4D FILES ${C4D_SRCS})
 ENDIF ( ASSIMP_BUILD_NONFREE_C4D_IMPORTER )
 ENDIF ( ASSIMP_BUILD_NONFREE_C4D_IMPORTER )
 
 
+# if this variable is set to TRUE, the user can manually disable importers by setting
+# ASSIMP_BUILD_XXX_IMPORTER to FALSE for each importer
+# if this variable is set to FALSE, the user can manually enable importers by setting
+# ASSIMP_BUILD_XXX_IMPORTER to TRUE for each importer
+OPTION(ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT "default value of all ASSIMP_BUILD_XXX_IMPORTER value" TRUE)
+
 # macro to add the CMake Option ADD_ASSIMP_IMPORTER_<name> which enables compile of loader
 # macro to add the CMake Option ADD_ASSIMP_IMPORTER_<name> which enables compile of loader
 # this way selective loaders can be compiled (reduces filesize + compile time)
 # this way selective loaders can be compiled (reduces filesize + compile time)
 MACRO(ADD_ASSIMP_IMPORTER name)
 MACRO(ADD_ASSIMP_IMPORTER name)
-  OPTION(ASSIMP_BUILD_${name}_IMPORTER "build the ${name} importer" TRUE)
+  OPTION(ASSIMP_BUILD_${name}_IMPORTER "build the ${name} importer" ${ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT})
   IF(ASSIMP_BUILD_${name}_IMPORTER)
   IF(ASSIMP_BUILD_${name}_IMPORTER)
     LIST(APPEND ASSIMP_LOADER_SRCS ${ARGN})
     LIST(APPEND ASSIMP_LOADER_SRCS ${ARGN})
     SET(ASSIMP_IMPORTERS_ENABLED "${ASSIMP_IMPORTERS_ENABLED} ${name}")
     SET(ASSIMP_IMPORTERS_ENABLED "${ASSIMP_IMPORTERS_ENABLED} ${name}")

+ 0 - 2
code/D3MFImporter.cpp

@@ -49,7 +49,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "StringComparison.h"
 #include "StringComparison.h"
 #include "StringUtils.h"
 #include "StringUtils.h"
 
 
-
 #include <string>
 #include <string>
 #include <sstream>
 #include <sstream>
 #include <vector>
 #include <vector>
@@ -68,7 +67,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 namespace Assimp {
 namespace Assimp {
 namespace D3MF {
 namespace D3MF {
 
 
-
 namespace XmlTag {
 namespace XmlTag {
     static const std::string model     = "model";
     static const std::string model     = "model";
     static const std::string metadata  = "metadata";
     static const std::string metadata  = "metadata";

+ 1 - 1
code/DefaultIOStream.cpp

@@ -126,7 +126,7 @@ size_t DefaultIOStream::FileSize() const
         if (0 != err)
         if (0 != err)
             return 0;
             return 0;
         mCachedSize = (size_t) (fileStat.st_size);
         mCachedSize = (size_t) (fileStat.st_size);
-#elif defined __GNUC__ || defined __APPLE__ || defined __MACH__
+#elif defined __GNUC__ || defined __APPLE__ || defined __MACH__ || defined __FreeBSD__
         struct stat fileStat;
         struct stat fileStat;
         int err = stat(mFilename.c_str(), &fileStat );
         int err = stat(mFilename.c_str(), &fileStat );
         if (0 != err)
         if (0 != err)

+ 3 - 5
code/IFCLoader.cpp

@@ -108,7 +108,7 @@ static const aiImporterDesc desc = {
     0,
     0,
     0,
     0,
     0,
     0,
-    "ifc ifczip"
+    "ifc ifczip stp"
 };
 };
 
 
 
 
@@ -128,11 +128,9 @@ IFCImporter::~IFCImporter()
 bool IFCImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
 bool IFCImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
 {
 {
     const std::string& extension = GetExtension(pFile);
     const std::string& extension = GetExtension(pFile);
-    if (extension == "ifc" || extension == "ifczip") {
+    if (extension == "ifc" || extension == "ifczip" || extension == "stp" ) {
         return true;
         return true;
-    }
-
-    else if ((!extension.length() || checkSig) && pIOHandler)   {
+    } else if ((!extension.length() || checkSig) && pIOHandler)   {
         // note: this is the common identification for STEP-encoded files, so
         // note: this is the common identification for STEP-encoded files, so
         // it is only unambiguous as long as we don't support any further
         // it is only unambiguous as long as we don't support any further
         // file formats with STEP as their encoding.
         // file formats with STEP as their encoding.

+ 3 - 0
code/ImporterRegistry.cpp

@@ -46,6 +46,9 @@ directly (unless you are adding new loaders), instead use the
 corresponding preprocessor flag to selectively disable formats.
 corresponding preprocessor flag to selectively disable formats.
 */
 */
 
 
+#include <vector>
+#include "BaseImporter.h"
+
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Importers
 // Importers
 // (include_new_importers_here)
 // (include_new_importers_here)

+ 7 - 5
code/PlyLoader.cpp

@@ -90,14 +90,16 @@ namespace
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Constructor to be privately used by Importer
 // Constructor to be privately used by Importer
 PLYImporter::PLYImporter()
 PLYImporter::PLYImporter()
-    : mBuffer(),
-    pcDOM()
-{}
+: mBuffer()
+, pcDOM(){
+    // empty
+}
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Destructor, private as well
 // Destructor, private as well
-PLYImporter::~PLYImporter()
-{}
+PLYImporter::~PLYImporter() {
+    // empty
+}
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Returns whether the class can handle the format of the given file.
 // Returns whether the class can handle the format of the given file.

+ 6 - 18
code/PlyParser.cpp

@@ -206,29 +206,17 @@ PLY::ESemantic PLY::Property::ParseSemantic(const char* pCur,const char** pCurOu
     else if (TokenMatch(pCur,"x",1))
     else if (TokenMatch(pCur,"x",1))
     {
     {
         eOut = PLY::EST_XCoord;
         eOut = PLY::EST_XCoord;
-    }
-    else if (TokenMatch(pCur,"y",1))
-    {
+    } else if (TokenMatch(pCur,"y",1)) {
         eOut = PLY::EST_YCoord;
         eOut = PLY::EST_YCoord;
-    }
-    else if (TokenMatch(pCur,"z",1))
-    {
+    } else if (TokenMatch(pCur,"z",1)) {
         eOut = PLY::EST_ZCoord;
         eOut = PLY::EST_ZCoord;
-    }
-    else if (TokenMatch(pCur,"nx",2))
-    {
+    } else if (TokenMatch(pCur,"nx",2)) {
         eOut = PLY::EST_XNormal;
         eOut = PLY::EST_XNormal;
-    }
-    else if (TokenMatch(pCur,"ny",2))
-    {
+    } else if (TokenMatch(pCur,"ny",2)) {
         eOut = PLY::EST_YNormal;
         eOut = PLY::EST_YNormal;
-    }
-    else if (TokenMatch(pCur,"nz",2))
-    {
+    } else if (TokenMatch(pCur,"nz",2)) {
         eOut = PLY::EST_ZNormal;
         eOut = PLY::EST_ZNormal;
-    }
-    else
-    {
+    } else {
         DefaultLogger::get()->info("Found unknown property semantic in file. This is ok");
         DefaultLogger::get()->info("Found unknown property semantic in file. This is ok");
         SkipLine(&pCur);
         SkipLine(&pCur);
     }
     }

+ 4 - 4
code/StreamReader.h

@@ -290,12 +290,12 @@ private:
             throw DeadlyImportError("End of file or stream limit was reached");
             throw DeadlyImportError("End of file or stream limit was reached");
         }
         }
 
 
-#ifdef __arm__
+///*#ifdef __arm__
         T f;
         T f;
         ::memcpy (&f, current, sizeof(T));
         ::memcpy (&f, current, sizeof(T));
-#else
-        T f = *((const T*)current);
-#endif
+//#else*/
+//        T f = *((const T*)current);
+//#endif
         Intern :: Getter<SwapEndianess,T,RuntimeSwitch>() (&f,le);
         Intern :: Getter<SwapEndianess,T,RuntimeSwitch>() (&f,le);
 
 
         current += sizeof(T);
         current += sizeof(T);

+ 80 - 80
code/res/assimp.rc

@@ -1,80 +1,80 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-#include "..\..\revision.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// Deutsch (Deutschland) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
-#ifdef _WIN32
-LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
-#pragma code_page(1252)
-#endif //_WIN32
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,1,SVNRevision, 0
- PRODUCTVERSION 1,1,SVNRevision,0
- FILEFLAGSMASK 0x17L
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x7L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040704b0"
-        BEGIN
-            VALUE "Comments", "Licensed under a 3-clause BSD license"
-            VALUE "CompanyName", "assimp team"
-            VALUE "FileDescription", "Open Asset Import Library"
-            VALUE "FileVersion", 1,1,SVNRevision,0
-            VALUE "InternalName", "assimp "
-            VALUE "LegalCopyright", "Copyright (C) 2006-2010"
-            VALUE "OriginalFilename", "assimpNN.dll"
-            VALUE "ProductName", "Open Asset Import Library"
-            VALUE "ProductVersion", 1,1,SVNRevision,0
-		,0
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x407, 1200
-    END
-END
-
-#endif    // Deutsch (Deutschland) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+#include "..\..\revision.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Deutsch (Deutschland) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,1,SVNRevision, 0
+ PRODUCTVERSION 1,1,SVNRevision,0
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x7L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040704b0"
+        BEGIN
+            VALUE "Comments", "Licensed under a 3-clause BSD license"
+            VALUE "CompanyName", "assimp team"
+            VALUE "FileDescription", "Open Asset Import Library"
+            VALUE "FileVersion", 1,1,SVNRevision,0
+            VALUE "InternalName", "assimp "
+            VALUE "LegalCopyright", "Copyright (C) 2006-2010"
+            VALUE "OriginalFilename", "assimpNN.dll"
+            VALUE "ProductName", "Open Asset Import Library"
+            VALUE "ProductVersion", 1,1,SVNRevision,0
+		,0
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x407, 1200
+    END
+END
+
+#endif    // Deutsch (Deutschland) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

+ 72 - 72
contrib/poly2tri/poly2tri/sweep/cdt.cc

@@ -1,72 +1,72 @@
-/* 
- * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
- * http://code.google.com/p/poly2tri/
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- *   this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of Poly2Tri nor the names of its contributors may be
- *   used to endorse or promote products derived from this software without specific
- *   prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "cdt.h"
-
-namespace p2t {
-
-CDT::CDT(std::vector<Point*> polyline)
-{
-  sweep_context_ = new SweepContext(polyline);
-  sweep_ = new Sweep;
-}
-
-void CDT::AddHole(std::vector<Point*> polyline)
-{
-  sweep_context_->AddHole(polyline);
-}
-
-void CDT::AddPoint(Point* point) {
-  sweep_context_->AddPoint(point);
-}
-
-void CDT::Triangulate()
-{
-  sweep_->Triangulate(*sweep_context_);
-}
-
-std::vector<p2t::Triangle*> CDT::GetTriangles()
-{
-  return sweep_context_->GetTriangles();
-}
-
-std::list<p2t::Triangle*> CDT::GetMap()
-{
-  return sweep_context_->GetMap();
-}
-
-CDT::~CDT()
-{
-  delete sweep_context_;
-  delete sweep_;
-}
-
-}
-
+/* 
+ * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
+ * http://code.google.com/p/poly2tri/
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of Poly2Tri nor the names of its contributors may be
+ *   used to endorse or promote products derived from this software without specific
+ *   prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "cdt.h"
+
+namespace p2t {
+
+CDT::CDT(std::vector<Point*> polyline)
+{
+  sweep_context_ = new SweepContext(polyline);
+  sweep_ = new Sweep;
+}
+
+void CDT::AddHole(std::vector<Point*> polyline)
+{
+  sweep_context_->AddHole(polyline);
+}
+
+void CDT::AddPoint(Point* point) {
+  sweep_context_->AddPoint(point);
+}
+
+void CDT::Triangulate()
+{
+  sweep_->Triangulate(*sweep_context_);
+}
+
+std::vector<p2t::Triangle*> CDT::GetTriangles()
+{
+  return sweep_context_->GetTriangles();
+}
+
+std::list<p2t::Triangle*> CDT::GetMap()
+{
+  return sweep_context_->GetMap();
+}
+
+CDT::~CDT()
+{
+  delete sweep_context_;
+  delete sweep_;
+}
+
+}
+

+ 750 - 750
contrib/poly2tri/poly2tri/sweep/sweep.cc

@@ -1,750 +1,750 @@
-/*
- * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
- * http://code.google.com/p/poly2tri/
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- *   this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of Poly2Tri nor the names of its contributors may be
- *   used to endorse or promote products derived from this software without specific
- *   prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <stdexcept>
-#include "sweep.h"
-#include "sweep_context.h"
-#include "advancing_front.h"
-#include "../common/utils.h"
-
-namespace p2t {
-
-// Triangulate simple polygon with holes
-void Sweep::Triangulate(SweepContext& tcx)
-{
-  tcx.InitTriangulation();
-  tcx.CreateAdvancingFront(nodes_);
-  // Sweep points; build mesh
-  SweepPoints(tcx);
-  // Clean up
-  FinalizationPolygon(tcx);
-}
-
-void Sweep::SweepPoints(SweepContext& tcx)
-{
-  for (int i = 1; i < tcx.point_count(); i++) {
-    Point& point = *tcx.GetPoint(i);
-    Node* node = &PointEvent(tcx, point);
-    for (unsigned int i = 0; i < point.edge_list.size(); i++) {
-      EdgeEvent(tcx, point.edge_list[i], node);
-    }
-  }
-}
-
-void Sweep::FinalizationPolygon(SweepContext& tcx)
-{
-  // Get an Internal triangle to start with
-  Triangle* t = tcx.front()->head()->next->triangle;
-  Point* p = tcx.front()->head()->next->point;
-  while (!t->GetConstrainedEdgeCW(*p)) {
-    t = t->NeighborCCW(*p);
-  }
-
-  // Collect interior triangles constrained by edges
-  tcx.MeshClean(*t);
-}
-
-Node& Sweep::PointEvent(SweepContext& tcx, Point& point)
-{
-  Node& node = tcx.LocateNode(point);
-  Node& new_node = NewFrontTriangle(tcx, point, node);
-
-  // Only need to check +epsilon since point never have smaller
-  // x value than node due to how we fetch nodes from the front
-  if (point.x <= node.point->x + EPSILON) {
-    Fill(tcx, node);
-  }
-
-  //tcx.AddNode(new_node);
-
-  FillAdvancingFront(tcx, new_node);
-  return new_node;
-}
-
-void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
-{
-  tcx.edge_event.constrained_edge = edge;
-  tcx.edge_event.right = (edge->p->x > edge->q->x);
-
-  if (IsEdgeSideOfTriangle(*node->triangle, *edge->p, *edge->q)) {
-    return;
-  }
-
-  // For now we will do all needed filling
-  // TODO: integrate with flip process might give some better performance
-  //       but for now this avoid the issue with cases that needs both flips and fills
-  FillEdgeEvent(tcx, edge, node);
-  EdgeEvent(tcx, *edge->p, *edge->q, node->triangle, *edge->q);
-}
-
-void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point)
-{
-  if (IsEdgeSideOfTriangle(*triangle, ep, eq)) {
-    return;
-  }
-
-  Point* p1 = triangle->PointCCW(point);
-  Orientation o1 = Orient2d(eq, *p1, ep);
-  if (o1 == COLLINEAR) {
-	  // ASSIMP_CHANGE (aramis_acg)
-	  throw std::runtime_error("EdgeEvent - collinear points not supported");
-    if( triangle->Contains(&eq, p1)) {
-      triangle->MarkConstrainedEdge(&eq, p1 );
-      // We are modifying the constraint maybe it would be better to 
-      // not change the given constraint and just keep a variable for the new constraint
-      tcx.edge_event.constrained_edge->q = p1;
-      triangle = &triangle->NeighborAcross(point);
-      EdgeEvent( tcx, ep, *p1, triangle, *p1 );
-    } else {
-	  // ASSIMP_CHANGE (aramis_acg)
-      std::runtime_error("EdgeEvent - collinear points not supported");
-    }
-    return;
-  }
-
-  Point* p2 = triangle->PointCW(point);
-  Orientation o2 = Orient2d(eq, *p2, ep);
-  if (o2 == COLLINEAR) {
-	  // ASSIMP_CHANGE (aramis_acg)
-	  throw std::runtime_error("EdgeEvent - collinear points not supported");
-
-    if( triangle->Contains(&eq, p2)) {
-      triangle->MarkConstrainedEdge(&eq, p2 );
-      // We are modifying the constraint maybe it would be better to 
-      // not change the given constraint and just keep a variable for the new constraint
-      tcx.edge_event.constrained_edge->q = p2;
-      triangle = &triangle->NeighborAcross(point);
-      EdgeEvent( tcx, ep, *p2, triangle, *p2 );
-    } else {
-      // ASSIMP_CHANGE (aramis_acg)
-      throw std::runtime_error("EdgeEvent - collinear points not supported");
-    }
-    return;
-  }
-
-  if (o1 == o2) {
-    // Need to decide if we are rotating CW or CCW to get to a triangle
-    // that will cross edge
-    if (o1 == CW) {
-      triangle = triangle->NeighborCCW(point);
-    }       else{
-      triangle = triangle->NeighborCW(point);
-    }
-    EdgeEvent(tcx, ep, eq, triangle, point);
-  } else {
-    // This triangle crosses constraint so lets flippin start!
-    FlipEdgeEvent(tcx, ep, eq, triangle, point);
-  }
-}
-
-bool Sweep::IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq)
-{
-  int index = triangle.EdgeIndex(&ep, &eq);
-
-  if (index != -1) {
-    triangle.MarkConstrainedEdge(index);
-    Triangle* t = triangle.GetNeighbor(index);
-    if (t) {
-      t->MarkConstrainedEdge(&ep, &eq);
-    }
-    return true;
-  }
-  return false;
-}
-
-Node& Sweep::NewFrontTriangle(SweepContext& tcx, Point& point, Node& node)
-{
-  Triangle* triangle = new Triangle(point, *node.point, *node.next->point);
-
-  triangle->MarkNeighbor(*node.triangle);
-  tcx.AddToMap(triangle);
-
-  Node* new_node = new Node(point);
-  nodes_.push_back(new_node);
-
-  new_node->next = node.next;
-  new_node->prev = &node;
-  node.next->prev = new_node;
-  node.next = new_node;
-
-  if (!Legalize(tcx, *triangle)) {
-    tcx.MapTriangleToNodes(*triangle);
-  }
-
-  return *new_node;
-}
-
-void Sweep::Fill(SweepContext& tcx, Node& node)
-{
-  Triangle* triangle = new Triangle(*node.prev->point, *node.point, *node.next->point);
-
-  // TODO: should copy the constrained_edge value from neighbor triangles
-  //       for now constrained_edge values are copied during the legalize
-  triangle->MarkNeighbor(*node.prev->triangle);
-  triangle->MarkNeighbor(*node.triangle);
-
-  tcx.AddToMap(triangle);
-
-  // Update the advancing front
-  node.prev->next = node.next;
-  node.next->prev = node.prev;
-
-  // If it was legalized the triangle has already been mapped
-  if (!Legalize(tcx, *triangle)) {
-    tcx.MapTriangleToNodes(*triangle);
-  }
-
-}
-
-void Sweep::FillAdvancingFront(SweepContext& tcx, Node& n)
-{
-
-  // Fill right holes
-  Node* node = n.next;
-
-  while (node->next) {
-    double angle = HoleAngle(*node);
-    if (angle > PI_2 || angle < -PI_2) break;
-    Fill(tcx, *node);
-    node = node->next;
-  }
-
-  // Fill left holes
-  node = n.prev;
-
-  while (node->prev) {
-    double angle = HoleAngle(*node);
-    if (angle > PI_2 || angle < -PI_2) break;
-    Fill(tcx, *node);
-    node = node->prev;
-  }
-
-  // Fill right basins
-  if (n.next && n.next->next) {
-    double angle = BasinAngle(n);
-    if (angle < PI_3div4) {
-      FillBasin(tcx, n);
-    }
-  }
-}
-
-double Sweep::BasinAngle(Node& node)
-{
-  double ax = node.point->x - node.next->next->point->x;
-  double ay = node.point->y - node.next->next->point->y;
-  return atan2(ay, ax);
-}
-
-double Sweep::HoleAngle(Node& node)
-{
-  /* Complex plane
-   * ab = cosA +i*sinA
-   * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx)
-   * atan2(y,x) computes the principal value of the argument function
-   * applied to the complex number x+iy
-   * Where x = ax*bx + ay*by
-   *       y = ax*by - ay*bx
-   */
-  double ax = node.next->point->x - node.point->x;
-  double ay = node.next->point->y - node.point->y;
-  double bx = node.prev->point->x - node.point->x;
-  double by = node.prev->point->y - node.point->y;
-  return atan2(ax * by - ay * bx, ax * bx + ay * by);
-}
-
-bool Sweep::Legalize(SweepContext& tcx, Triangle& t)
-{
-  // To legalize a triangle we start by finding if any of the three edges
-  // violate the Delaunay condition
-  for (int i = 0; i < 3; i++) {
-    if (t.delaunay_edge[i])
-      continue;
-
-    Triangle* ot = t.GetNeighbor(i);
-
-    if (ot) {
-      Point* p = t.GetPoint(i);
-      Point* op = ot->OppositePoint(t, *p);
-      int oi = ot->Index(op);
-
-      // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization)
-      // then we should not try to legalize
-      if (ot->constrained_edge[oi] || ot->delaunay_edge[oi]) {
-        t.constrained_edge[i] = ot->constrained_edge[oi];
-        continue;
-      }
-
-      bool inside = Incircle(*p, *t.PointCCW(*p), *t.PointCW(*p), *op);
-
-      if (inside) {
-        // Lets mark this shared edge as Delaunay
-        t.delaunay_edge[i] = true;
-        ot->delaunay_edge[oi] = true;
-
-        // Lets rotate shared edge one vertex CW to legalize it
-        RotateTrianglePair(t, *p, *ot, *op);
-
-        // We now got one valid Delaunay Edge shared by two triangles
-        // This gives us 4 new edges to check for Delaunay
-
-        // Make sure that triangle to node mapping is done only one time for a specific triangle
-        bool not_legalized = !Legalize(tcx, t);
-        if (not_legalized) {
-          tcx.MapTriangleToNodes(t);
-        }
-
-        not_legalized = !Legalize(tcx, *ot);
-        if (not_legalized)
-          tcx.MapTriangleToNodes(*ot);
-
-        // Reset the Delaunay edges, since they only are valid Delaunay edges
-        // until we add a new triangle or point.
-        // XXX: need to think about this. Can these edges be tried after we
-        //      return to previous recursive level?
-        t.delaunay_edge[i] = false;
-        ot->delaunay_edge[oi] = false;
-
-        // If triangle have been legalized no need to check the other edges since
-        // the recursive legalization will handles those so we can end here.
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-bool Sweep::Incircle(Point& pa, Point& pb, Point& pc, Point& pd)
-{
-  double adx = pa.x - pd.x;
-  double ady = pa.y - pd.y;
-  double bdx = pb.x - pd.x;
-  double bdy = pb.y - pd.y;
-
-  double adxbdy = adx * bdy;
-  double bdxady = bdx * ady;
-  double oabd = adxbdy - bdxady;
-
-  if (oabd <= 0)
-    return false;
-
-  double cdx = pc.x - pd.x;
-  double cdy = pc.y - pd.y;
-
-  double cdxady = cdx * ady;
-  double adxcdy = adx * cdy;
-  double ocad = cdxady - adxcdy;
-
-  if (ocad <= 0)
-    return false;
-
-  double bdxcdy = bdx * cdy;
-  double cdxbdy = cdx * bdy;
-
-  double alift = adx * adx + ady * ady;
-  double blift = bdx * bdx + bdy * bdy;
-  double clift = cdx * cdx + cdy * cdy;
-
-  double det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd;
-
-  return det > 0;
-}
-
-void Sweep::RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op)
-{
-  Triangle* n1, *n2, *n3, *n4;
-  n1 = t.NeighborCCW(p);
-  n2 = t.NeighborCW(p);
-  n3 = ot.NeighborCCW(op);
-  n4 = ot.NeighborCW(op);
-
-  bool ce1, ce2, ce3, ce4;
-  ce1 = t.GetConstrainedEdgeCCW(p);
-  ce2 = t.GetConstrainedEdgeCW(p);
-  ce3 = ot.GetConstrainedEdgeCCW(op);
-  ce4 = ot.GetConstrainedEdgeCW(op);
-
-  bool de1, de2, de3, de4;
-  de1 = t.GetDelunayEdgeCCW(p);
-  de2 = t.GetDelunayEdgeCW(p);
-  de3 = ot.GetDelunayEdgeCCW(op);
-  de4 = ot.GetDelunayEdgeCW(op);
-
-  t.Legalize(p, op);
-  ot.Legalize(op, p);
-
-  // Remap delaunay_edge
-  ot.SetDelunayEdgeCCW(p, de1);
-  t.SetDelunayEdgeCW(p, de2);
-  t.SetDelunayEdgeCCW(op, de3);
-  ot.SetDelunayEdgeCW(op, de4);
-
-  // Remap constrained_edge
-  ot.SetConstrainedEdgeCCW(p, ce1);
-  t.SetConstrainedEdgeCW(p, ce2);
-  t.SetConstrainedEdgeCCW(op, ce3);
-  ot.SetConstrainedEdgeCW(op, ce4);
-
-  // Remap neighbors
-  // XXX: might optimize the markNeighbor by keeping track of
-  //      what side should be assigned to what neighbor after the
-  //      rotation. Now mark neighbor does lots of testing to find
-  //      the right side.
-  t.ClearNeighbors();
-  ot.ClearNeighbors();
-  if (n1) ot.MarkNeighbor(*n1);
-  if (n2) t.MarkNeighbor(*n2);
-  if (n3) t.MarkNeighbor(*n3);
-  if (n4) ot.MarkNeighbor(*n4);
-  t.MarkNeighbor(ot);
-}
-
-void Sweep::FillBasin(SweepContext& tcx, Node& node)
-{
-  if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
-    tcx.basin.left_node = node.next->next;
-  } else {
-    tcx.basin.left_node = node.next;
-  }
-
-  // Find the bottom and right node
-  tcx.basin.bottom_node = tcx.basin.left_node;
-  while (tcx.basin.bottom_node->next
-         && tcx.basin.bottom_node->point->y >= tcx.basin.bottom_node->next->point->y) {
-    tcx.basin.bottom_node = tcx.basin.bottom_node->next;
-  }
-  if (tcx.basin.bottom_node == tcx.basin.left_node) {
-    // No valid basin
-    return;
-  }
-
-  tcx.basin.right_node = tcx.basin.bottom_node;
-  while (tcx.basin.right_node->next
-         && tcx.basin.right_node->point->y < tcx.basin.right_node->next->point->y) {
-    tcx.basin.right_node = tcx.basin.right_node->next;
-  }
-  if (tcx.basin.right_node == tcx.basin.bottom_node) {
-    // No valid basins
-    return;
-  }
-
-  tcx.basin.width = tcx.basin.right_node->point->x - tcx.basin.left_node->point->x;
-  tcx.basin.left_highest = tcx.basin.left_node->point->y > tcx.basin.right_node->point->y;
-
-  FillBasinReq(tcx, tcx.basin.bottom_node);
-}
-
-void Sweep::FillBasinReq(SweepContext& tcx, Node* node)
-{
-  // if shallow stop filling
-  if (IsShallow(tcx, *node)) {
-    return;
-  }
-
-  Fill(tcx, *node);
-
-  if (node->prev == tcx.basin.left_node && node->next == tcx.basin.right_node) {
-    return;
-  } else if (node->prev == tcx.basin.left_node) {
-    Orientation o = Orient2d(*node->point, *node->next->point, *node->next->next->point);
-    if (o == CW) {
-      return;
-    }
-    node = node->next;
-  } else if (node->next == tcx.basin.right_node) {
-    Orientation o = Orient2d(*node->point, *node->prev->point, *node->prev->prev->point);
-    if (o == CCW) {
-      return;
-    }
-    node = node->prev;
-  } else {
-    // Continue with the neighbor node with lowest Y value
-    if (node->prev->point->y < node->next->point->y) {
-      node = node->prev;
-    } else {
-      node = node->next;
-    }
-  }
-
-  FillBasinReq(tcx, node);
-}
-
-bool Sweep::IsShallow(SweepContext& tcx, Node& node)
-{
-  double height;
-
-  if (tcx.basin.left_highest) {
-    height = tcx.basin.left_node->point->y - node.point->y;
-  } else {
-    height = tcx.basin.right_node->point->y - node.point->y;
-  }
-
-  // if shallow stop filling
-  if (tcx.basin.width > height) {
-    return true;
-  }
-  return false;
-}
-
-void Sweep::FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
-{
-  if (tcx.edge_event.right) {
-    FillRightAboveEdgeEvent(tcx, edge, node);
-  } else {
-    FillLeftAboveEdgeEvent(tcx, edge, node);
-  }
-}
-
-void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
-{
-  while (node->next->point->x < edge->p->x) {
-    // Check if next node is below the edge
-    if (Orient2d(*edge->q, *node->next->point, *edge->p) == CCW) {
-      FillRightBelowEdgeEvent(tcx, edge, *node);
-    } else {
-      node = node->next;
-    }
-  }
-}
-
-void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
-{
-  if (node.point->x < edge->p->x) {
-    if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
-      // Concave
-      FillRightConcaveEdgeEvent(tcx, edge, node);
-    } else{
-      // Convex
-      FillRightConvexEdgeEvent(tcx, edge, node);
-      // Retry this one
-      FillRightBelowEdgeEvent(tcx, edge, node);
-    }
-  }
-}
-
-void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
-{
-  Fill(tcx, *node.next);
-  if (node.next->point != edge->p) {
-    // Next above or below edge?
-    if (Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) {
-      // Below
-      if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
-        // Next is concave
-        FillRightConcaveEdgeEvent(tcx, edge, node);
-      } else {
-        // Next is convex
-      }
-    }
-  }
-
-}
-
-void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
-{
-  // Next concave or convex?
-  if (Orient2d(*node.next->point, *node.next->next->point, *node.next->next->next->point) == CCW) {
-    // Concave
-    FillRightConcaveEdgeEvent(tcx, edge, *node.next);
-  } else{
-    // Convex
-    // Next above or below edge?
-    if (Orient2d(*edge->q, *node.next->next->point, *edge->p) == CCW) {
-      // Below
-      FillRightConvexEdgeEvent(tcx, edge, *node.next);
-    } else{
-      // Above
-    }
-  }
-}
-
-void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
-{
-  while (node->prev->point->x > edge->p->x) {
-    // Check if next node is below the edge
-    if (Orient2d(*edge->q, *node->prev->point, *edge->p) == CW) {
-      FillLeftBelowEdgeEvent(tcx, edge, *node);
-    } else {
-      node = node->prev;
-    }
-  }
-}
-
-void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
-{
-  if (node.point->x > edge->p->x) {
-    if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) {
-      // Concave
-      FillLeftConcaveEdgeEvent(tcx, edge, node);
-    } else {
-      // Convex
-      FillLeftConvexEdgeEvent(tcx, edge, node);
-      // Retry this one
-      FillLeftBelowEdgeEvent(tcx, edge, node);
-    }
-  }
-}
-
-void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
-{
-  // Next concave or convex?
-  if (Orient2d(*node.prev->point, *node.prev->prev->point, *node.prev->prev->prev->point) == CW) {
-    // Concave
-    FillLeftConcaveEdgeEvent(tcx, edge, *node.prev);
-  } else{
-    // Convex
-    // Next above or below edge?
-    if (Orient2d(*edge->q, *node.prev->prev->point, *edge->p) == CW) {
-      // Below
-      FillLeftConvexEdgeEvent(tcx, edge, *node.prev);
-    } else{
-      // Above
-    }
-  }
-}
-
-void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
-{
-  Fill(tcx, *node.prev);
-  if (node.prev->point != edge->p) {
-    // Next above or below edge?
-    if (Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) {
-      // Below
-      if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) {
-        // Next is concave
-        FillLeftConcaveEdgeEvent(tcx, edge, node);
-      } else{
-        // Next is convex
-      }
-    }
-  }
-
-}
-
-void Sweep::FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p)
-{
-  Triangle& ot = t->NeighborAcross(p);
-  Point& op = *ot.OppositePoint(*t, p);
-
-  if (InScanArea(p, *t->PointCCW(p), *t->PointCW(p), op)) {
-    // Lets rotate shared edge one vertex CW
-    RotateTrianglePair(*t, p, ot, op);
-    tcx.MapTriangleToNodes(*t);
-    tcx.MapTriangleToNodes(ot);
-
-    if (p == eq && op == ep) {
-      if (eq == *tcx.edge_event.constrained_edge->q && ep == *tcx.edge_event.constrained_edge->p) {
-        t->MarkConstrainedEdge(&ep, &eq);
-        ot.MarkConstrainedEdge(&ep, &eq);
-        Legalize(tcx, *t);
-        Legalize(tcx, ot);
-      } else {
-        // XXX: I think one of the triangles should be legalized here?
-      }
-    } else {
-      Orientation o = Orient2d(eq, op, ep);
-      t = &NextFlipTriangle(tcx, (int)o, *t, ot, p, op);
-      FlipEdgeEvent(tcx, ep, eq, t, p);
-    }
-  } else {
-    Point& newP = NextFlipPoint(ep, eq, ot, op);
-    FlipScanEdgeEvent(tcx, ep, eq, *t, ot, newP);
-    EdgeEvent(tcx, ep, eq, t, p);
-  }
-}
-
-Triangle& Sweep::NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op)
-{
-  if (o == CCW) {
-    // ot is not crossing edge after flip
-    int edge_index = ot.EdgeIndex(&p, &op);
-    ot.delaunay_edge[edge_index] = true;
-    Legalize(tcx, ot);
-    ot.ClearDelunayEdges();
-    return t;
-  }
-
-  // t is not crossing edge after flip
-  int edge_index = t.EdgeIndex(&p, &op);
-
-  t.delaunay_edge[edge_index] = true;
-  Legalize(tcx, t);
-  t.ClearDelunayEdges();
-  return ot;
-}
-
-Point& Sweep::NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op)
-{
-  Orientation o2d = Orient2d(eq, op, ep);
-  if (o2d == CW) {
-    // Right
-    return *ot.PointCCW(op);
-  } else if (o2d == CCW) {
-    // Left
-    return *ot.PointCW(op);
-  } else{
-    //throw new RuntimeException("[Unsupported] Opposing point on constrained edge");
-	  // ASSIMP_CHANGE (aramis_acg)
-	  throw std::runtime_error("[Unsupported] Opposing point on constrained edge");
-  }
-}
-
-void Sweep::FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle,
-                              Triangle& t, Point& p)
-{
-  Triangle& ot = t.NeighborAcross(p);
-  Point& op = *ot.OppositePoint(t, p);
-
-  if (InScanArea(eq, *flip_triangle.PointCCW(eq), *flip_triangle.PointCW(eq), op)) {
-    // flip with new edge op->eq
-    FlipEdgeEvent(tcx, eq, op, &ot, op);
-    // TODO: Actually I just figured out that it should be possible to
-    //       improve this by getting the next ot and op before the the above
-    //       flip and continue the flipScanEdgeEvent here
-    // set new ot and op here and loop back to inScanArea test
-    // also need to set a new flip_triangle first
-    // Turns out at first glance that this is somewhat complicated
-    // so it will have to wait.
-  } else{
-    Point& newP = NextFlipPoint(ep, eq, ot, op);
-    FlipScanEdgeEvent(tcx, ep, eq, flip_triangle, ot, newP);
-  }
-}
-
-Sweep::~Sweep() {
-
-    // Clean up memory
-    for(unsigned int i = 0; i < nodes_.size(); i++) {
-        delete nodes_[i];
-    }
-
-}
-
-}
-
+/*
+ * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
+ * http://code.google.com/p/poly2tri/
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of Poly2Tri nor the names of its contributors may be
+ *   used to endorse or promote products derived from this software without specific
+ *   prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <stdexcept>
+#include "sweep.h"
+#include "sweep_context.h"
+#include "advancing_front.h"
+#include "../common/utils.h"
+
+namespace p2t {
+
+// Triangulate simple polygon with holes
+void Sweep::Triangulate(SweepContext& tcx)
+{
+  tcx.InitTriangulation();
+  tcx.CreateAdvancingFront(nodes_);
+  // Sweep points; build mesh
+  SweepPoints(tcx);
+  // Clean up
+  FinalizationPolygon(tcx);
+}
+
+void Sweep::SweepPoints(SweepContext& tcx)
+{
+  for (int i = 1; i < tcx.point_count(); i++) {
+    Point& point = *tcx.GetPoint(i);
+    Node* node = &PointEvent(tcx, point);
+    for (unsigned int i = 0; i < point.edge_list.size(); i++) {
+      EdgeEvent(tcx, point.edge_list[i], node);
+    }
+  }
+}
+
+void Sweep::FinalizationPolygon(SweepContext& tcx)
+{
+  // Get an Internal triangle to start with
+  Triangle* t = tcx.front()->head()->next->triangle;
+  Point* p = tcx.front()->head()->next->point;
+  while (!t->GetConstrainedEdgeCW(*p)) {
+    t = t->NeighborCCW(*p);
+  }
+
+  // Collect interior triangles constrained by edges
+  tcx.MeshClean(*t);
+}
+
+Node& Sweep::PointEvent(SweepContext& tcx, Point& point)
+{
+  Node& node = tcx.LocateNode(point);
+  Node& new_node = NewFrontTriangle(tcx, point, node);
+
+  // Only need to check +epsilon since point never have smaller
+  // x value than node due to how we fetch nodes from the front
+  if (point.x <= node.point->x + EPSILON) {
+    Fill(tcx, node);
+  }
+
+  //tcx.AddNode(new_node);
+
+  FillAdvancingFront(tcx, new_node);
+  return new_node;
+}
+
+void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
+{
+  tcx.edge_event.constrained_edge = edge;
+  tcx.edge_event.right = (edge->p->x > edge->q->x);
+
+  if (IsEdgeSideOfTriangle(*node->triangle, *edge->p, *edge->q)) {
+    return;
+  }
+
+  // For now we will do all needed filling
+  // TODO: integrate with flip process might give some better performance
+  //       but for now this avoid the issue with cases that needs both flips and fills
+  FillEdgeEvent(tcx, edge, node);
+  EdgeEvent(tcx, *edge->p, *edge->q, node->triangle, *edge->q);
+}
+
+void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point)
+{
+  if (IsEdgeSideOfTriangle(*triangle, ep, eq)) {
+    return;
+  }
+
+  Point* p1 = triangle->PointCCW(point);
+  Orientation o1 = Orient2d(eq, *p1, ep);
+  if (o1 == COLLINEAR) {
+	  // ASSIMP_CHANGE (aramis_acg)
+	  throw std::runtime_error("EdgeEvent - collinear points not supported");
+    if( triangle->Contains(&eq, p1)) {
+      triangle->MarkConstrainedEdge(&eq, p1 );
+      // We are modifying the constraint maybe it would be better to 
+      // not change the given constraint and just keep a variable for the new constraint
+      tcx.edge_event.constrained_edge->q = p1;
+      triangle = &triangle->NeighborAcross(point);
+      EdgeEvent( tcx, ep, *p1, triangle, *p1 );
+    } else {
+	  // ASSIMP_CHANGE (aramis_acg)
+      std::runtime_error("EdgeEvent - collinear points not supported");
+    }
+    return;
+  }
+
+  Point* p2 = triangle->PointCW(point);
+  Orientation o2 = Orient2d(eq, *p2, ep);
+  if (o2 == COLLINEAR) {
+	  // ASSIMP_CHANGE (aramis_acg)
+	  throw std::runtime_error("EdgeEvent - collinear points not supported");
+
+    if( triangle->Contains(&eq, p2)) {
+      triangle->MarkConstrainedEdge(&eq, p2 );
+      // We are modifying the constraint maybe it would be better to 
+      // not change the given constraint and just keep a variable for the new constraint
+      tcx.edge_event.constrained_edge->q = p2;
+      triangle = &triangle->NeighborAcross(point);
+      EdgeEvent( tcx, ep, *p2, triangle, *p2 );
+    } else {
+      // ASSIMP_CHANGE (aramis_acg)
+      throw std::runtime_error("EdgeEvent - collinear points not supported");
+    }
+    return;
+  }
+
+  if (o1 == o2) {
+    // Need to decide if we are rotating CW or CCW to get to a triangle
+    // that will cross edge
+    if (o1 == CW) {
+      triangle = triangle->NeighborCCW(point);
+    }       else{
+      triangle = triangle->NeighborCW(point);
+    }
+    EdgeEvent(tcx, ep, eq, triangle, point);
+  } else {
+    // This triangle crosses constraint so lets flippin start!
+    FlipEdgeEvent(tcx, ep, eq, triangle, point);
+  }
+}
+
+bool Sweep::IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq)
+{
+  int index = triangle.EdgeIndex(&ep, &eq);
+
+  if (index != -1) {
+    triangle.MarkConstrainedEdge(index);
+    Triangle* t = triangle.GetNeighbor(index);
+    if (t) {
+      t->MarkConstrainedEdge(&ep, &eq);
+    }
+    return true;
+  }
+  return false;
+}
+
+Node& Sweep::NewFrontTriangle(SweepContext& tcx, Point& point, Node& node)
+{
+  Triangle* triangle = new Triangle(point, *node.point, *node.next->point);
+
+  triangle->MarkNeighbor(*node.triangle);
+  tcx.AddToMap(triangle);
+
+  Node* new_node = new Node(point);
+  nodes_.push_back(new_node);
+
+  new_node->next = node.next;
+  new_node->prev = &node;
+  node.next->prev = new_node;
+  node.next = new_node;
+
+  if (!Legalize(tcx, *triangle)) {
+    tcx.MapTriangleToNodes(*triangle);
+  }
+
+  return *new_node;
+}
+
+void Sweep::Fill(SweepContext& tcx, Node& node)
+{
+  Triangle* triangle = new Triangle(*node.prev->point, *node.point, *node.next->point);
+
+  // TODO: should copy the constrained_edge value from neighbor triangles
+  //       for now constrained_edge values are copied during the legalize
+  triangle->MarkNeighbor(*node.prev->triangle);
+  triangle->MarkNeighbor(*node.triangle);
+
+  tcx.AddToMap(triangle);
+
+  // Update the advancing front
+  node.prev->next = node.next;
+  node.next->prev = node.prev;
+
+  // If it was legalized the triangle has already been mapped
+  if (!Legalize(tcx, *triangle)) {
+    tcx.MapTriangleToNodes(*triangle);
+  }
+
+}
+
+void Sweep::FillAdvancingFront(SweepContext& tcx, Node& n)
+{
+
+  // Fill right holes
+  Node* node = n.next;
+
+  while (node->next) {
+    double angle = HoleAngle(*node);
+    if (angle > PI_2 || angle < -PI_2) break;
+    Fill(tcx, *node);
+    node = node->next;
+  }
+
+  // Fill left holes
+  node = n.prev;
+
+  while (node->prev) {
+    double angle = HoleAngle(*node);
+    if (angle > PI_2 || angle < -PI_2) break;
+    Fill(tcx, *node);
+    node = node->prev;
+  }
+
+  // Fill right basins
+  if (n.next && n.next->next) {
+    double angle = BasinAngle(n);
+    if (angle < PI_3div4) {
+      FillBasin(tcx, n);
+    }
+  }
+}
+
+double Sweep::BasinAngle(Node& node)
+{
+  double ax = node.point->x - node.next->next->point->x;
+  double ay = node.point->y - node.next->next->point->y;
+  return atan2(ay, ax);
+}
+
+double Sweep::HoleAngle(Node& node)
+{
+  /* Complex plane
+   * ab = cosA +i*sinA
+   * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx)
+   * atan2(y,x) computes the principal value of the argument function
+   * applied to the complex number x+iy
+   * Where x = ax*bx + ay*by
+   *       y = ax*by - ay*bx
+   */
+  double ax = node.next->point->x - node.point->x;
+  double ay = node.next->point->y - node.point->y;
+  double bx = node.prev->point->x - node.point->x;
+  double by = node.prev->point->y - node.point->y;
+  return atan2(ax * by - ay * bx, ax * bx + ay * by);
+}
+
+bool Sweep::Legalize(SweepContext& tcx, Triangle& t)
+{
+  // To legalize a triangle we start by finding if any of the three edges
+  // violate the Delaunay condition
+  for (int i = 0; i < 3; i++) {
+    if (t.delaunay_edge[i])
+      continue;
+
+    Triangle* ot = t.GetNeighbor(i);
+
+    if (ot) {
+      Point* p = t.GetPoint(i);
+      Point* op = ot->OppositePoint(t, *p);
+      int oi = ot->Index(op);
+
+      // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization)
+      // then we should not try to legalize
+      if (ot->constrained_edge[oi] || ot->delaunay_edge[oi]) {
+        t.constrained_edge[i] = ot->constrained_edge[oi];
+        continue;
+      }
+
+      bool inside = Incircle(*p, *t.PointCCW(*p), *t.PointCW(*p), *op);
+
+      if (inside) {
+        // Lets mark this shared edge as Delaunay
+        t.delaunay_edge[i] = true;
+        ot->delaunay_edge[oi] = true;
+
+        // Lets rotate shared edge one vertex CW to legalize it
+        RotateTrianglePair(t, *p, *ot, *op);
+
+        // We now got one valid Delaunay Edge shared by two triangles
+        // This gives us 4 new edges to check for Delaunay
+
+        // Make sure that triangle to node mapping is done only one time for a specific triangle
+        bool not_legalized = !Legalize(tcx, t);
+        if (not_legalized) {
+          tcx.MapTriangleToNodes(t);
+        }
+
+        not_legalized = !Legalize(tcx, *ot);
+        if (not_legalized)
+          tcx.MapTriangleToNodes(*ot);
+
+        // Reset the Delaunay edges, since they only are valid Delaunay edges
+        // until we add a new triangle or point.
+        // XXX: need to think about this. Can these edges be tried after we
+        //      return to previous recursive level?
+        t.delaunay_edge[i] = false;
+        ot->delaunay_edge[oi] = false;
+
+        // If triangle have been legalized no need to check the other edges since
+        // the recursive legalization will handles those so we can end here.
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+bool Sweep::Incircle(Point& pa, Point& pb, Point& pc, Point& pd)
+{
+  double adx = pa.x - pd.x;
+  double ady = pa.y - pd.y;
+  double bdx = pb.x - pd.x;
+  double bdy = pb.y - pd.y;
+
+  double adxbdy = adx * bdy;
+  double bdxady = bdx * ady;
+  double oabd = adxbdy - bdxady;
+
+  if (oabd <= 0)
+    return false;
+
+  double cdx = pc.x - pd.x;
+  double cdy = pc.y - pd.y;
+
+  double cdxady = cdx * ady;
+  double adxcdy = adx * cdy;
+  double ocad = cdxady - adxcdy;
+
+  if (ocad <= 0)
+    return false;
+
+  double bdxcdy = bdx * cdy;
+  double cdxbdy = cdx * bdy;
+
+  double alift = adx * adx + ady * ady;
+  double blift = bdx * bdx + bdy * bdy;
+  double clift = cdx * cdx + cdy * cdy;
+
+  double det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd;
+
+  return det > 0;
+}
+
+void Sweep::RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op)
+{
+  Triangle* n1, *n2, *n3, *n4;
+  n1 = t.NeighborCCW(p);
+  n2 = t.NeighborCW(p);
+  n3 = ot.NeighborCCW(op);
+  n4 = ot.NeighborCW(op);
+
+  bool ce1, ce2, ce3, ce4;
+  ce1 = t.GetConstrainedEdgeCCW(p);
+  ce2 = t.GetConstrainedEdgeCW(p);
+  ce3 = ot.GetConstrainedEdgeCCW(op);
+  ce4 = ot.GetConstrainedEdgeCW(op);
+
+  bool de1, de2, de3, de4;
+  de1 = t.GetDelunayEdgeCCW(p);
+  de2 = t.GetDelunayEdgeCW(p);
+  de3 = ot.GetDelunayEdgeCCW(op);
+  de4 = ot.GetDelunayEdgeCW(op);
+
+  t.Legalize(p, op);
+  ot.Legalize(op, p);
+
+  // Remap delaunay_edge
+  ot.SetDelunayEdgeCCW(p, de1);
+  t.SetDelunayEdgeCW(p, de2);
+  t.SetDelunayEdgeCCW(op, de3);
+  ot.SetDelunayEdgeCW(op, de4);
+
+  // Remap constrained_edge
+  ot.SetConstrainedEdgeCCW(p, ce1);
+  t.SetConstrainedEdgeCW(p, ce2);
+  t.SetConstrainedEdgeCCW(op, ce3);
+  ot.SetConstrainedEdgeCW(op, ce4);
+
+  // Remap neighbors
+  // XXX: might optimize the markNeighbor by keeping track of
+  //      what side should be assigned to what neighbor after the
+  //      rotation. Now mark neighbor does lots of testing to find
+  //      the right side.
+  t.ClearNeighbors();
+  ot.ClearNeighbors();
+  if (n1) ot.MarkNeighbor(*n1);
+  if (n2) t.MarkNeighbor(*n2);
+  if (n3) t.MarkNeighbor(*n3);
+  if (n4) ot.MarkNeighbor(*n4);
+  t.MarkNeighbor(ot);
+}
+
+void Sweep::FillBasin(SweepContext& tcx, Node& node)
+{
+  if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
+    tcx.basin.left_node = node.next->next;
+  } else {
+    tcx.basin.left_node = node.next;
+  }
+
+  // Find the bottom and right node
+  tcx.basin.bottom_node = tcx.basin.left_node;
+  while (tcx.basin.bottom_node->next
+         && tcx.basin.bottom_node->point->y >= tcx.basin.bottom_node->next->point->y) {
+    tcx.basin.bottom_node = tcx.basin.bottom_node->next;
+  }
+  if (tcx.basin.bottom_node == tcx.basin.left_node) {
+    // No valid basin
+    return;
+  }
+
+  tcx.basin.right_node = tcx.basin.bottom_node;
+  while (tcx.basin.right_node->next
+         && tcx.basin.right_node->point->y < tcx.basin.right_node->next->point->y) {
+    tcx.basin.right_node = tcx.basin.right_node->next;
+  }
+  if (tcx.basin.right_node == tcx.basin.bottom_node) {
+    // No valid basins
+    return;
+  }
+
+  tcx.basin.width = tcx.basin.right_node->point->x - tcx.basin.left_node->point->x;
+  tcx.basin.left_highest = tcx.basin.left_node->point->y > tcx.basin.right_node->point->y;
+
+  FillBasinReq(tcx, tcx.basin.bottom_node);
+}
+
+void Sweep::FillBasinReq(SweepContext& tcx, Node* node)
+{
+  // if shallow stop filling
+  if (IsShallow(tcx, *node)) {
+    return;
+  }
+
+  Fill(tcx, *node);
+
+  if (node->prev == tcx.basin.left_node && node->next == tcx.basin.right_node) {
+    return;
+  } else if (node->prev == tcx.basin.left_node) {
+    Orientation o = Orient2d(*node->point, *node->next->point, *node->next->next->point);
+    if (o == CW) {
+      return;
+    }
+    node = node->next;
+  } else if (node->next == tcx.basin.right_node) {
+    Orientation o = Orient2d(*node->point, *node->prev->point, *node->prev->prev->point);
+    if (o == CCW) {
+      return;
+    }
+    node = node->prev;
+  } else {
+    // Continue with the neighbor node with lowest Y value
+    if (node->prev->point->y < node->next->point->y) {
+      node = node->prev;
+    } else {
+      node = node->next;
+    }
+  }
+
+  FillBasinReq(tcx, node);
+}
+
+bool Sweep::IsShallow(SweepContext& tcx, Node& node)
+{
+  double height;
+
+  if (tcx.basin.left_highest) {
+    height = tcx.basin.left_node->point->y - node.point->y;
+  } else {
+    height = tcx.basin.right_node->point->y - node.point->y;
+  }
+
+  // if shallow stop filling
+  if (tcx.basin.width > height) {
+    return true;
+  }
+  return false;
+}
+
+void Sweep::FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
+{
+  if (tcx.edge_event.right) {
+    FillRightAboveEdgeEvent(tcx, edge, node);
+  } else {
+    FillLeftAboveEdgeEvent(tcx, edge, node);
+  }
+}
+
+void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
+{
+  while (node->next->point->x < edge->p->x) {
+    // Check if next node is below the edge
+    if (Orient2d(*edge->q, *node->next->point, *edge->p) == CCW) {
+      FillRightBelowEdgeEvent(tcx, edge, *node);
+    } else {
+      node = node->next;
+    }
+  }
+}
+
+void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
+{
+  if (node.point->x < edge->p->x) {
+    if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
+      // Concave
+      FillRightConcaveEdgeEvent(tcx, edge, node);
+    } else{
+      // Convex
+      FillRightConvexEdgeEvent(tcx, edge, node);
+      // Retry this one
+      FillRightBelowEdgeEvent(tcx, edge, node);
+    }
+  }
+}
+
+void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
+{
+  Fill(tcx, *node.next);
+  if (node.next->point != edge->p) {
+    // Next above or below edge?
+    if (Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) {
+      // Below
+      if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) {
+        // Next is concave
+        FillRightConcaveEdgeEvent(tcx, edge, node);
+      } else {
+        // Next is convex
+      }
+    }
+  }
+
+}
+
+void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
+{
+  // Next concave or convex?
+  if (Orient2d(*node.next->point, *node.next->next->point, *node.next->next->next->point) == CCW) {
+    // Concave
+    FillRightConcaveEdgeEvent(tcx, edge, *node.next);
+  } else{
+    // Convex
+    // Next above or below edge?
+    if (Orient2d(*edge->q, *node.next->next->point, *edge->p) == CCW) {
+      // Below
+      FillRightConvexEdgeEvent(tcx, edge, *node.next);
+    } else{
+      // Above
+    }
+  }
+}
+
+void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node)
+{
+  while (node->prev->point->x > edge->p->x) {
+    // Check if next node is below the edge
+    if (Orient2d(*edge->q, *node->prev->point, *edge->p) == CW) {
+      FillLeftBelowEdgeEvent(tcx, edge, *node);
+    } else {
+      node = node->prev;
+    }
+  }
+}
+
+void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
+{
+  if (node.point->x > edge->p->x) {
+    if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) {
+      // Concave
+      FillLeftConcaveEdgeEvent(tcx, edge, node);
+    } else {
+      // Convex
+      FillLeftConvexEdgeEvent(tcx, edge, node);
+      // Retry this one
+      FillLeftBelowEdgeEvent(tcx, edge, node);
+    }
+  }
+}
+
+void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
+{
+  // Next concave or convex?
+  if (Orient2d(*node.prev->point, *node.prev->prev->point, *node.prev->prev->prev->point) == CW) {
+    // Concave
+    FillLeftConcaveEdgeEvent(tcx, edge, *node.prev);
+  } else{
+    // Convex
+    // Next above or below edge?
+    if (Orient2d(*edge->q, *node.prev->prev->point, *edge->p) == CW) {
+      // Below
+      FillLeftConvexEdgeEvent(tcx, edge, *node.prev);
+    } else{
+      // Above
+    }
+  }
+}
+
+void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node)
+{
+  Fill(tcx, *node.prev);
+  if (node.prev->point != edge->p) {
+    // Next above or below edge?
+    if (Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) {
+      // Below
+      if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) {
+        // Next is concave
+        FillLeftConcaveEdgeEvent(tcx, edge, node);
+      } else{
+        // Next is convex
+      }
+    }
+  }
+
+}
+
+void Sweep::FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p)
+{
+  Triangle& ot = t->NeighborAcross(p);
+  Point& op = *ot.OppositePoint(*t, p);
+
+  if (InScanArea(p, *t->PointCCW(p), *t->PointCW(p), op)) {
+    // Lets rotate shared edge one vertex CW
+    RotateTrianglePair(*t, p, ot, op);
+    tcx.MapTriangleToNodes(*t);
+    tcx.MapTriangleToNodes(ot);
+
+    if (p == eq && op == ep) {
+      if (eq == *tcx.edge_event.constrained_edge->q && ep == *tcx.edge_event.constrained_edge->p) {
+        t->MarkConstrainedEdge(&ep, &eq);
+        ot.MarkConstrainedEdge(&ep, &eq);
+        Legalize(tcx, *t);
+        Legalize(tcx, ot);
+      } else {
+        // XXX: I think one of the triangles should be legalized here?
+      }
+    } else {
+      Orientation o = Orient2d(eq, op, ep);
+      t = &NextFlipTriangle(tcx, (int)o, *t, ot, p, op);
+      FlipEdgeEvent(tcx, ep, eq, t, p);
+    }
+  } else {
+    Point& newP = NextFlipPoint(ep, eq, ot, op);
+    FlipScanEdgeEvent(tcx, ep, eq, *t, ot, newP);
+    EdgeEvent(tcx, ep, eq, t, p);
+  }
+}
+
+Triangle& Sweep::NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op)
+{
+  if (o == CCW) {
+    // ot is not crossing edge after flip
+    int edge_index = ot.EdgeIndex(&p, &op);
+    ot.delaunay_edge[edge_index] = true;
+    Legalize(tcx, ot);
+    ot.ClearDelunayEdges();
+    return t;
+  }
+
+  // t is not crossing edge after flip
+  int edge_index = t.EdgeIndex(&p, &op);
+
+  t.delaunay_edge[edge_index] = true;
+  Legalize(tcx, t);
+  t.ClearDelunayEdges();
+  return ot;
+}
+
+Point& Sweep::NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op)
+{
+  Orientation o2d = Orient2d(eq, op, ep);
+  if (o2d == CW) {
+    // Right
+    return *ot.PointCCW(op);
+  } else if (o2d == CCW) {
+    // Left
+    return *ot.PointCW(op);
+  } else{
+    //throw new RuntimeException("[Unsupported] Opposing point on constrained edge");
+	  // ASSIMP_CHANGE (aramis_acg)
+	  throw std::runtime_error("[Unsupported] Opposing point on constrained edge");
+  }
+}
+
+void Sweep::FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle,
+                              Triangle& t, Point& p)
+{
+  Triangle& ot = t.NeighborAcross(p);
+  Point& op = *ot.OppositePoint(t, p);
+
+  if (InScanArea(eq, *flip_triangle.PointCCW(eq), *flip_triangle.PointCW(eq), op)) {
+    // flip with new edge op->eq
+    FlipEdgeEvent(tcx, eq, op, &ot, op);
+    // TODO: Actually I just figured out that it should be possible to
+    //       improve this by getting the next ot and op before the the above
+    //       flip and continue the flipScanEdgeEvent here
+    // set new ot and op here and loop back to inScanArea test
+    // also need to set a new flip_triangle first
+    // Turns out at first glance that this is somewhat complicated
+    // so it will have to wait.
+  } else{
+    Point& newP = NextFlipPoint(ep, eq, ot, op);
+    FlipScanEdgeEvent(tcx, ep, eq, flip_triangle, ot, newP);
+  }
+}
+
+Sweep::~Sweep() {
+
+    // Clean up memory
+    for(unsigned int i = 0; i < nodes_.size(); i++) {
+        delete nodes_[i];
+    }
+
+}
+
+}
+

+ 2 - 5
include/assimp/color4.h

@@ -45,7 +45,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef AI_COLOR4D_H_INC
 #ifndef AI_COLOR4D_H_INC
 #define AI_COLOR4D_H_INC
 #define AI_COLOR4D_H_INC
 
 
-#include "./Compiler/pushpack1.h"
 #include "defs.h"
 #include "defs.h"
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
@@ -89,7 +88,7 @@ public:
 
 
     // Red, green, blue and alpha color values
     // Red, green, blue and alpha color values
     TReal r, g, b, a;
     TReal r, g, b, a;
-} PACK_STRUCT;  // !struct aiColor4D
+};  // !struct aiColor4D
 
 
 typedef aiColor4t<ai_real> aiColor4D;
 typedef aiColor4t<ai_real> aiColor4D;
 
 
@@ -97,10 +96,8 @@ typedef aiColor4t<ai_real> aiColor4D;
 
 
 struct aiColor4D {
 struct aiColor4D {
     ai_real r, g, b, a;
     ai_real r, g, b, a;
-} PACK_STRUCT;
+};
 
 
 #endif // __cplusplus
 #endif // __cplusplus
 
 
-#include "./Compiler/poppack1.h"
-
 #endif // AI_COLOR4D_H_INC
 #endif // AI_COLOR4D_H_INC

+ 24 - 2
include/assimp/color4.inl

@@ -76,12 +76,34 @@ AI_FORCE_INLINE const aiColor4t<TReal>& aiColor4t<TReal>::operator /= (TReal f)
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
 AI_FORCE_INLINE TReal aiColor4t<TReal>::operator[](unsigned int i) const {
 AI_FORCE_INLINE TReal aiColor4t<TReal>::operator[](unsigned int i) const {
-    return *(&r + i);
+    //return *(&r + i);
+    switch ( i ) {
+        case 0:
+            return r;
+        case 1:
+            return g;
+        case 2:
+            return b;
+        default:
+            break;
+    }
+    return r;
 }
 }
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
 AI_FORCE_INLINE TReal& aiColor4t<TReal>::operator[](unsigned int i) {
 AI_FORCE_INLINE TReal& aiColor4t<TReal>::operator[](unsigned int i) {
-    return *(&r + i);
+//    return *(&r + i);
+    switch ( i ) {
+        case 0:
+            return r;
+        case 1:
+            return g;
+        case 2:
+            return b;
+        default:
+            break;
+    }
+    return r;
 }
 }
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>

+ 3 - 6
include/assimp/matrix3x3.h

@@ -46,7 +46,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef AI_MATRIX3X3_H_INC
 #ifndef AI_MATRIX3X3_H_INC
 #define AI_MATRIX3X3_H_INC
 #define AI_MATRIX3X3_H_INC
 
 
-#include "./Compiler/pushpack1.h"
 #include "defs.h"
 #include "defs.h"
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
@@ -153,7 +152,7 @@ public:
     /** @brief A function for creating a rotation matrix that rotates a
     /** @brief A function for creating a rotation matrix that rotates a
      *  vector called "from" into another vector called "to".
      *  vector called "from" into another vector called "to".
      * Input : from[3], to[3] which both must be *normalized* non-zero vectors
      * Input : from[3], to[3] which both must be *normalized* non-zero vectors
-     * Output: mtx[3][3] -- a 3x3 matrix in colum-major form
+     * Output: mtx[3][3] -- a 3x3 matrix in column-major form
      * Authors: Tomas Möller, John Hughes
      * Authors: Tomas Möller, John Hughes
      *          "Efficiently Building a Matrix to Rotate One Vector to Another"
      *          "Efficiently Building a Matrix to Rotate One Vector to Another"
      *          Journal of Graphics Tools, 4(4):1-4, 1999
      *          Journal of Graphics Tools, 4(4):1-4, 1999
@@ -165,7 +164,7 @@ public:
     TReal a1, a2, a3;
     TReal a1, a2, a3;
     TReal b1, b2, b3;
     TReal b1, b2, b3;
     TReal c1, c2, c3;
     TReal c1, c2, c3;
-} PACK_STRUCT;
+};
 
 
 typedef aiMatrix3x3t<ai_real> aiMatrix3x3;
 typedef aiMatrix3x3t<ai_real> aiMatrix3x3;
 
 
@@ -175,10 +174,8 @@ struct aiMatrix3x3 {
     ai_real a1, a2, a3;
     ai_real a1, a2, a3;
     ai_real b1, b2, b3;
     ai_real b1, b2, b3;
     ai_real c1, c2, c3;
     ai_real c1, c2, c3;
-} PACK_STRUCT;
+};
 
 
 #endif // __cplusplus
 #endif // __cplusplus
 
 
-#include "./Compiler/poppack1.h"
-
 #endif // AI_MATRIX3X3_H_INC
 #endif // AI_MATRIX3X3_H_INC

+ 24 - 6
include/assimp/matrix3x3.inl

@@ -101,16 +101,34 @@ inline aiMatrix3x3t<TReal> aiMatrix3x3t<TReal>::operator* (const aiMatrix3x3t<TR
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
-inline TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex)
-{
-    return &this->a1 + p_iIndex * 3;
+inline TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) {
+    switch ( p_iIndex ) {
+        case 0:
+            return &a1;
+        case 1:
+            return &b1;
+        case 2:
+            return &c1;
+        default:
+            break;
+    }
+    return &a1;
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
-inline const TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) const
-{
-    return &this->a1 + p_iIndex * 3;
+inline const TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) const {
+    switch ( p_iIndex ) {
+        case 0:
+            return &a1;
+        case 1:
+            return &b1;
+        case 2:
+            return &c1;
+        default:
+            break;
+    }
+    return &a1;
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------

+ 2 - 5
include/assimp/matrix4x4.h

@@ -46,7 +46,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #define AI_MATRIX4X4_H_INC
 #define AI_MATRIX4X4_H_INC
 
 
 #include "vector3.h"
 #include "vector3.h"
-#include "./Compiler/pushpack1.h"
 #include "defs.h"
 #include "defs.h"
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
@@ -257,7 +256,7 @@ public:
     TReal b1, b2, b3, b4;
     TReal b1, b2, b3, b4;
     TReal c1, c2, c3, c4;
     TReal c1, c2, c3, c4;
     TReal d1, d2, d3, d4;
     TReal d1, d2, d3, d4;
-} PACK_STRUCT;
+};
 
 
 typedef aiMatrix4x4t<ai_real> aiMatrix4x4;
 typedef aiMatrix4x4t<ai_real> aiMatrix4x4;
 
 
@@ -268,11 +267,9 @@ struct aiMatrix4x4 {
     ai_real b1, b2, b3, b4;
     ai_real b1, b2, b3, b4;
     ai_real c1, c2, c3, c4;
     ai_real c1, c2, c3, c4;
     ai_real d1, d2, d3, d4;
     ai_real d1, d2, d3, d4;
-} PACK_STRUCT;
+};
 
 
 
 
 #endif // __cplusplus
 #endif // __cplusplus
 
 
-#include "./Compiler/poppack1.h"
-
 #endif // AI_MATRIX4X4_H_INC
 #endif // AI_MATRIX4X4_H_INC

+ 26 - 5
include/assimp/matrix4x4.inl

@@ -243,9 +243,19 @@ inline TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) {
     if (p_iIndex > 3) {
     if (p_iIndex > 3) {
         return NULL;
         return NULL;
     }
     }
-
-    // XXX this is UB. Has been for years. The fact that it works now does not make it better.
-    return &this->a1 + p_iIndex * 4;
+    switch ( p_iIndex ) {
+        case 0:
+            return &a1;
+        case 1:
+            return &b1;
+        case 2:
+            return &c1;
+        case 3:
+            return &d1;
+        default:
+            break;
+    }
+    return &a1;
 }
 }
 
 
 // ----------------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------------
@@ -255,8 +265,19 @@ inline const TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) const
         return NULL;
         return NULL;
     }
     }
 
 
-    // XXX same
-    return &this->a1 + p_iIndex * 4;
+    switch ( p_iIndex ) {
+        case 0:
+            return &a1;
+        case 1:
+            return &b1;
+        case 2:
+            return &c1;
+        case 3:
+            return &d1;
+        default:
+            break;
+    }
+    return &a1;
 }
 }
 
 
 // ----------------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------------

+ 2 - 7
include/assimp/vector3.h

@@ -51,7 +51,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #   include <math.h>
 #   include <math.h>
 #endif
 #endif
 
 
-#include "./Compiler/pushpack1.h"
 #include "defs.h"
 #include "defs.h"
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
@@ -126,7 +125,7 @@ public:
     const aiVector3t SymMul(const aiVector3t& o);
     const aiVector3t SymMul(const aiVector3t& o);
 
 
     TReal x, y, z;
     TReal x, y, z;
-} PACK_STRUCT;
+};
 
 
 
 
 typedef aiVector3t<ai_real> aiVector3D;
 typedef aiVector3t<ai_real> aiVector3D;
@@ -135,16 +134,12 @@ typedef aiVector3t<ai_real> aiVector3D;
 
 
 struct aiVector3D {
 struct aiVector3D {
     ai_real x, y, z;
     ai_real x, y, z;
-} PACK_STRUCT;
+};
 
 
 #endif // __cplusplus
 #endif // __cplusplus
 
 
-#include "./Compiler/poppack1.h"
-
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-
-
 #endif // __cplusplus
 #endif // __cplusplus
 
 
 #endif // AI_VECTOR3D_H_INC
 #endif // AI_VECTOR3D_H_INC

+ 24 - 2
include/assimp/vector3.inl

@@ -141,12 +141,34 @@ AI_FORCE_INLINE aiVector3t<TReal>& aiVector3t<TReal>::operator *= (const aiMatri
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
 AI_FORCE_INLINE TReal aiVector3t<TReal>::operator[](unsigned int i) const {
 AI_FORCE_INLINE TReal aiVector3t<TReal>::operator[](unsigned int i) const {
-    return *(&x + i);
+//    return *(&x + i);
+    switch (i) {
+        case 0:
+            return x;
+        case 1:
+            return y;
+        case 2:
+            return z;
+        default:
+            break;
+    }
+    return x;
 }
 }
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
 AI_FORCE_INLINE TReal& aiVector3t<TReal>::operator[](unsigned int i) {
 AI_FORCE_INLINE TReal& aiVector3t<TReal>::operator[](unsigned int i) {
-    return *(&x + i);
+//    return *(&x + i);
+    switch (i) {
+        case 0:
+            return x;
+        case 1:
+            return y;
+        case 2:
+            return z;
+        default:
+            break;
+    }
+    return x;
 }
 }
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>

+ 32 - 0
port/AndroidJNI/AndroidJNIIOSystem.cpp

@@ -46,7 +46,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <android/api-level.h>
 #include <android/api-level.h>
 #if __ANDROID__ and __ANDROID_API__ > 9 and defined(AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
 #if __ANDROID__ and __ANDROID_API__ > 9 and defined(AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT)
 
 
+#include <libgen.h>
 #include <stdlib.h>
 #include <stdlib.h>
+#include <sys/stat.h>
 #include <android/log.h>
 #include <android/log.h>
 #include <android/asset_manager.h>
 #include <android/asset_manager.h>
 #include <android/asset_manager_jni.h>
 #include <android/asset_manager_jni.h>
@@ -100,6 +102,27 @@ void AndroidJNIIOSystem::AndroidActivityInit(ANativeActivity* activity)
 	mApkAssetManager = activity->assetManager;
 	mApkAssetManager = activity->assetManager;
 }
 }
 
 
+// ------------------------------------------------------------------------------------------------
+// Create the directory for the extracted resource
+static int mkpath(std::string path, mode_t mode)
+{
+    if (mkdir(path.c_str(), mode) == -1) {
+        switch(errno) {
+            case ENOENT:
+                if (mkpath(path.substr(0, path.find_last_of('/')), mode) == -1)
+                    return -1;
+                else
+                    return mkdir(path.c_str(), mode);
+            case EEXIST:
+                return 0;
+            default:
+                return -1;
+        }
+    }
+
+    return 0;
+}
+
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Extracts android asset
 // Extracts android asset
 bool AndroidJNIIOSystem::AndroidExtractAsset(std::string name)
 bool AndroidJNIIOSystem::AndroidExtractAsset(std::string name)
@@ -131,6 +154,15 @@ bool AndroidJNIIOSystem::AndroidExtractAsset(std::string name)
 		// Close
 		// Close
 		AAsset_close(asset);
 		AAsset_close(asset);
 
 
+		// Prepare directory for output buffer
+		std::string directoryNewPath = newPath;
+		directoryNewPath = dirname(&directoryNewPath[0]);
+
+		if (mkpath(directoryNewPath, S_IRUSR | S_IWUSR | S_IXUSR) == -1) {
+			__android_log_print(ANDROID_LOG_ERROR, "assimp",
+					"Can not create the directory for the output file");
+		}
+
 		// Prepare output buffer
 		// Prepare output buffer
 		std::ofstream assetExtracted(newPath.c_str(),
 		std::ofstream assetExtracted(newPath.c_str(),
 				std::ios::out | std::ios::binary);
 				std::ios::out | std::ios::binary);

+ 1 - 0
test/CMakeLists.txt

@@ -121,6 +121,7 @@ SET( TEST_SRCS
   unit/utTypes.cpp
   unit/utTypes.cpp
   unit/utVertexTriangleAdjacency.cpp
   unit/utVertexTriangleAdjacency.cpp
   unit/utVersion.cpp
   unit/utVersion.cpp
+  unit/utVector3.cpp
   unit/utXImporterExporter.cpp
   unit/utXImporterExporter.cpp
 )
 )
 
 

+ 103 - 103
test/models/OBJ/spider.obj

@@ -1,5 +1,5 @@
 # File produced by Open Asset Import Library (http://www.assimp.sf.net)
 # File produced by Open Asset Import Library (http://www.assimp.sf.net)
-# (assimp v3.3.102088114)
+# (assimp v3.3.128220959)
 
 
 mtllib spider.obj.mtl
 mtllib spider.obj.mtl
 
 
@@ -14,7 +14,7 @@ v  -6.442715167999268 10.77740478515625 -0.5375289916992188
 v  -8.120363235473633 15.6844596862793 -10.5
 v  -8.120363235473633 15.6844596862793 -10.5
 v  -0.8867700099945068 23.4237174987793 -4.342854022979736
 v  -0.8867700099945068 23.4237174987793 -4.342854022979736
 v  -0.8867700099945068 23.4237174987793 -16.65714454650879
 v  -0.8867700099945068 23.4237174987793 -16.65714454650879
-v  14.40229797363281 32.89186859130859 -26.41482543945312
+v  14.40229797363281 32.89186859130859 -26.41482543945313
 v  12.95316505432129 36.87333679199219 -11.5
 v  12.95316505432129 36.87333679199219 -11.5
 v  30.52731704711914 37.50395202636719 -2.733282089233398
 v  30.52731704711914 37.50395202636719 -2.733282089233398
 v  30.52731704711914 37.50395202636719 -20.26671600341797
 v  30.52731704711914 37.50395202636719 -20.26671600341797
@@ -23,15 +23,15 @@ v  45.09496688842773 27.71094512939453 2.684845924377441
 v  57.93621826171875 30.27653312683105 -11.5
 v  57.93621826171875 30.27653312683105 -11.5
 v  54.50359344482422 5.934020042419434 -11.5
 v  54.50359344482422 5.934020042419434 -11.5
 v  51.09176254272461 11.23489952087402 2.684845924377441
 v  51.09176254272461 11.23489952087402 2.684845924377441
-v  45.09496688842773 27.71094512939453 -25.68484497070312
+v  45.09496688842773 27.71094512939453 -25.68484497070313
 v  39.18625640869141 16.23099708557129 -35.63270568847656
 v  39.18625640869141 16.23099708557129 -35.63270568847656
-v  51.09176254272461 11.23489952087402 -25.68484497070312
+v  51.09176254272461 11.23489952087402 -25.68484497070313
 v  27.52080917358398 27.08032608032227 -34.45156478881836
 v  27.52080917358398 27.08032608032227 -34.45156478881836
 v  4.568314075469971 16.85711288452148 -26.6196174621582
 v  4.568314075469971 16.85711288452148 -26.6196174621582
 v  1.160378932952881 4.512683868408203 -27.44916915893555
 v  1.160378932952881 4.512683868408203 -27.44916915893555
 v  22.65617179870605 10.21453857421875 -39.86968994140625
 v  22.65617179870605 10.21453857421875 -39.86968994140625
 v  7.838881015777588 -6.414187908172607 -26.6196174621582
 v  7.838881015777588 -6.414187908172607 -26.6196174621582
-v  30.91004180908203 -12.4627857208252 -26.41482543945312
+v  30.91004180908203 -12.4627857208252 -26.41482543945313
 v  37.22381591796875 0.4215309917926788 -34.45156478881836
 v  37.22381591796875 0.4215309917926788 -34.45156478881836
 v  46.22711181640625 -5.630886077880859 -20.26671600341797
 v  46.22711181640625 -5.630886077880859 -20.26671600341797
 v  32.35918426513672 -16.44425201416016 -11.5
 v  32.35918426513672 -16.44425201416016 -11.5
@@ -72,11 +72,11 @@ v  -18.8264045715332 5.435883045196533 -20.58309173583984
 v  -32.62586212158203 10.86018753051758 -28.47975921630859
 v  -32.62586212158203 10.86018753051758 -28.47975921630859
 v  -41.85661315917969 -0.7548459768295288 -29.43077087402344
 v  -41.85661315917969 -0.7548459768295288 -29.43077087402344
 v  -27.9502124786377 1.303017020225525 -23.0814208984375
 v  -27.9502124786377 1.303017020225525 -23.0814208984375
-v  -39.19473266601562 -9.356718063354492 -28.47975921630859
+v  -39.19473266601563 -9.356718063354492 -28.47975921630859
 v  -31.49889755249023 -9.618716239929199 -16.87730979919434
 v  -31.49889755249023 -9.618716239929199 -16.87730979919434
 v  -22.99813652038574 -7.403382778167725 -20.58309173583984
 v  -22.99813652038574 -7.403382778167725 -20.58309173583984
 v  -49.71383666992188 -2.983590126037598 1.421121001243591
 v  -49.71383666992188 -2.983590126037598 1.421121001243591
-v  -39.19473266601562 -9.356718063354492 8.47976016998291
+v  -39.19473266601563 -9.356718063354492 8.47976016998291
 v  -22.99813652038574 -7.403382778167725 0.5830910205841064
 v  -22.99813652038574 -7.403382778167725 0.5830910205841064
 v  -31.49889755249023 -9.618716239929199 -3.122689962387085
 v  -31.49889755249023 -9.618716239929199 -3.122689962387085
 v  -50.63702392578125 8.975393295288086 -10
 v  -50.63702392578125 8.975393295288086 -10
@@ -95,15 +95,15 @@ v  -55.4437255859375 28.01696014404297 -51.02064895629883
 v  -55.80507659912109 29.50034332275391 -50.36057662963867
 v  -55.80507659912109 29.50034332275391 -50.36057662963867
 v  -56.41304779052734 27.51875305175781 -54.60213470458984
 v  -56.41304779052734 27.51875305175781 -54.60213470458984
 v  -57.93299102783203 29.20790100097656 -55.03944778442383
 v  -57.93299102783203 29.20790100097656 -55.03944778442383
-v  -67.98501586914062 13.43557167053223 -79.02035522460938
+v  -67.98501586914063 13.43557167053223 -79.02035522460938
 v  -69.89360046386719 14.10584259033203 -80.14413452148438
 v  -69.89360046386719 14.10584259033203 -80.14413452148438
-v  -81.67832183837891 -31.37918090820312 -101.2915573120117
+v  -81.67832183837891 -31.37918090820313 -101.2915573120117
 v  -82.77850341796875 -29.84352111816406 -101.2665863037109
 v  -82.77850341796875 -29.84352111816406 -101.2665863037109
 v  -45.27461242675781 -1.921316027641296 -17.56256103515625
 v  -45.27461242675781 -1.921316027641296 -17.56256103515625
 v  -88.2349853515625 -39.3502311706543 -103.8660430908203
 v  -88.2349853515625 -39.3502311706543 -103.8660430908203
 v  -48.86238861083984 8.964324951171875 -36.15071487426758
 v  -48.86238861083984 8.964324951171875 -36.15071487426758
 v  -56.92498016357422 29.82746124267578 -49.55580902099609
 v  -56.92498016357422 29.82746124267578 -49.55580902099609
-v  -60.01216888427734 29.56021118164062 -54.08668899536133
+v  -60.01216888427734 29.56021118164063 -54.08668899536133
 v  -72.06874084472656 14.20652008056641 -79.36090087890625
 v  -72.06874084472656 14.20652008056641 -79.36090087890625
 v  -83.47474670410156 -29.51860809326172 -100.4707794189453
 v  -83.47474670410156 -29.51860809326172 -100.4707794189453
 v  -48.11187744140625 -2.742969989776611 -19.29600143432617
 v  -48.11187744140625 -2.742969989776611 -19.29600143432617
@@ -112,12 +112,12 @@ v  -50.95351028442383 7.973351955413818 -36.14510726928711
 v  -57.96013641357422 28.75201416015625 -49.21238708496094
 v  -57.96013641357422 28.75201416015625 -49.21238708496094
 v  -61.08487701416016 28.31040191650391 -52.46125793457031
 v  -61.08487701416016 28.31040191650391 -52.46125793457031
 v  -72.87251281738281 13.66179847717285 -77.26039123535156
 v  -72.87251281738281 13.66179847717285 -77.26039123535156
-v  -83.24275207519531 -30.64902877807617 -99.50344848632812
+v  -83.24275207519531 -30.64902877807617 -99.50344848632813
 v  -48.33858871459961 -4.09240198135376 -22.38015365600586
 v  -48.33858871459961 -4.09240198135376 -22.38015365600586
 v  -87.97438049316406 -40.34838485717773 -103.3615341186523
 v  -87.97438049316406 -40.34838485717773 -103.3615341186523
 v  -51.84541320800781 6.477696895599365 -37.66901397705078
 v  -51.84541320800781 6.477696895599365 -37.66901397705078
 v  -58.13103866577148 27.08382415771484 -49.58887100219727
 v  -58.13103866577148 27.08382415771484 -49.58887100219727
-v  -60.34334564208984 26.39956665039062 -51.38712310791016
+v  -60.34334564208984 26.39956665039063 -51.38712310791016
 v  -71.69966125488281 12.8818302154541 -75.42439270019531
 v  -71.69966125488281 12.8818302154541 -75.42439270019531
 v  -82.25722503662109 -32.38360595703125 -99.09293365478516
 v  -82.25722503662109 -32.38360595703125 -99.09293365478516
 v  -45.78402709960938 -4.953472137451172 -24.49265670776367
 v  -45.78402709960938 -4.953472137451172 -24.49265670776367
@@ -127,7 +127,7 @@ v  -57.30899810791016 26.07907104492188 -50.40177917480469
 v  -58.34596252441406 25.26664733886719 -51.67315673828125
 v  -58.34596252441406 25.26664733886719 -51.67315673828125
 v  -69.433349609375 12.45395088195801 -75.23539733886719
 v  -69.433349609375 12.45395088195801 -75.23539733886719
 v  -81.26026153564453 -33.41617965698242 -99.54843139648438
 v  -81.26026153564453 -33.41617965698242 -99.54843139648438
-v  -42.37185668945312 -4.677759170532227 -24.04270935058594
+v  -42.37185668945313 -4.677759170532227 -24.04270935058594
 v  -87.46121978759766 -40.53748321533203 -104.0717544555664
 v  -87.46121978759766 -40.53748321533203 -104.0717544555664
 v  -48.75384521484375 6.009276866912842 -40.42763137817383
 v  -48.75384521484375 6.009276866912842 -40.42763137817383
 v  -56.11302947998047 26.49437713623047 -51.03896713256836
 v  -56.11302947998047 26.49437713623047 -51.03896713256836
@@ -139,27 +139,27 @@ v  -42.83802795410156 -1.822747945785522 -1.17337703704834
 v  -41.96012115478516 -3.15467095375061 1.817621946334839
 v  -41.96012115478516 -3.15467095375061 1.817621946334839
 v  -92.29042816162109 -39.21158981323242 57.38248825073242
 v  -92.29042816162109 -39.21158981323242 57.38248825073242
 v  -92.26210784912109 -39.83740234375 57.07994079589844
 v  -92.26210784912109 -39.83740234375 57.07994079589844
-v  -91.95950317382812 -39.73274230957031 57.5407600402832
+v  -91.95950317382813 -39.73274230957031 57.5407600402832
 v  -49.36812591552734 8.476757049560547 19.08589744567871
 v  -49.36812591552734 8.476757049560547 19.08589744567871
-v  -49.19630432128906 7.804555892944336 21.29348754882812
+v  -49.19630432128906 7.804555892944336 21.29348754882813
 v  -54.25469207763672 27.27288055419922 30.44888496398926
 v  -54.25469207763672 27.27288055419922 30.44888496398926
 v  -54.92575836181641 28.34239959716797 29.36605453491211
 v  -54.92575836181641 28.34239959716797 29.36605453491211
 v  -57.45500946044922 28.70623016357422 33.83551406860352
 v  -57.45500946044922 28.70623016357422 33.83551406860352
 v  -55.48647308349609 27.49809265136719 33.97690582275391
 v  -55.48647308349609 27.49809265136719 33.97690582275391
 v  -67.46834564208984 9.109057426452637 43.49641799926758
 v  -67.46834564208984 9.109057426452637 43.49641799926758
-v  -69.61196136474609 9.454971313476562 44.29645156860352
+v  -69.61196136474609 9.454971313476563 44.29645156860352
 v  -87.01417541503906 -30.51413726806641 52.42203521728516
 v  -87.01417541503906 -30.51413726806641 52.42203521728516
 v  -85.97149658203125 -32.07468414306641 52.63847351074219
 v  -85.97149658203125 -32.07468414306641 52.63847351074219
-v  -45.98867797851562 -1.450130939483643 -2.535742998123169
-v  -92.60006713867188 -39.16170501708984 56.99636840820312
+v  -45.98867797851563 -1.450130939483643 -2.535742998123169
+v  -92.60006713867188 -39.16170501708984 56.99636840820313
 v  -50.88497161865234 7.785149097442627 17.48099899291992
 v  -50.88497161865234 7.785149097442627 17.48099899291992
 v  -55.98342132568359 28.08773803710938 28.45757293701172
 v  -55.98342132568359 28.08773803710938 28.45757293701172
 v  -59.41564178466797 28.14698791503906 32.74097061157227
 v  -59.41564178466797 28.14698791503906 32.74097061157227
 v  -71.61580657958984 8.682785987854004 43.43437957763672
 v  -71.61580657958984 8.682785987854004 43.43437957763672
 v  -87.75607299804688 -30.29622077941895 51.63100051879883
 v  -87.75607299804688 -30.29622077941895 51.63100051879883
-v  -49.03958129882812 -2.317409992218018 -1.243530988693237
+v  -49.03958129882813 -2.317409992218018 -1.243530988693237
 v  -92.65523529052734 -39.6205940246582 56.67316055297852
 v  -92.65523529052734 -39.6205940246582 56.67316055297852
-v  -52.60464477539062 6.250553131103516 17.68733215332031
+v  -52.60464477539063 6.250553131103516 17.68733215332031
 v  -56.63124847412109 26.70069122314453 28.40756416320801
 v  -56.63124847412109 26.70069122314453 28.40756416320801
 v  -59.89194488525391 26.24149322509766 31.51743125915527
 v  -59.89194488525391 26.24149322509766 31.51743125915527
 v  -71.97093963623047 7.37397575378418 41.55935287475586
 v  -71.97093963623047 7.37397575378418 41.55935287475586
@@ -184,11 +184,11 @@ v  -50.4989013671875 6.274747848510742 22.44142532348633
 v  -54.47554779052734 25.68461608886719 30.89064788818359
 v  -54.47554779052734 25.68461608886719 30.89064788818359
 v  -54.99231719970703 25.43232727050781 33.05861282348633
 v  -54.99231719970703 25.43232727050781 33.05861282348633
 v  -66.79914093017578 7.905498027801514 41.6367301940918
 v  -66.79914093017578 7.905498027801514 41.6367301940918
-v  -85.4132080078125 -33.80271530151367 52.11734008789062
+v  -85.4132080078125 -33.80271530151367 52.11734008789063
 v  -32.53578186035156 -3.15467095375061 -19.16253662109375
 v  -32.53578186035156 -3.15467095375061 -19.16253662109375
 v  -34.38373184204102 -1.822747945785522 -16.65216445922852
 v  -34.38373184204102 -1.822747945785522 -16.65216445922852
 v  -36.48015213012695 -3.096683979034424 -19.71685028076172
 v  -36.48015213012695 -3.096683979034424 -19.71685028076172
-v  -43.38578033447266 -41.58316040039062 -95.21874237060547
+v  -43.38578033447266 -41.58316040039063 -95.21874237060547
 v  -43.91326141357422 -41.58873748779297 -95.02735137939453
 v  -43.91326141357422 -41.58873748779297 -95.02735137939453
 v  -43.69423675537109 -41.06890106201172 -95.43450164794922
 v  -43.69423675537109 -41.06890106201172 -95.43450164794922
 v  -35.0989875793457 7.804555892944336 -38.97930526733398
 v  -35.0989875793457 7.804555892944336 -38.97930526733398
@@ -201,7 +201,7 @@ v  -39.32158660888672 4.109056949615479 -79.20964813232422
 v  -40.77798843383789 4.454970836639404 -80.97431182861328
 v  -40.77798843383789 4.454970836639404 -80.97431182861328
 v  -40.8770866394043 -32.42660522460938 -89.88973236083984
 v  -40.8770866394043 -32.42660522460938 -89.88973236083984
 v  -41.6864128112793 -30.95858383178711 -90.76108551025391
 v  -41.6864128112793 -30.95858383178711 -90.76108551025391
-v  -37.81033325195312 -1.450130939483643 -16.44955062866211
+v  -37.81033325195313 -1.450130939483643 -16.44955062866211
 v  -44.16765594482422 -40.94609069824219 -95.34366607666016
 v  -44.16765594482422 -40.94609069824219 -95.34366607666016
 v  -38.46767044067383 7.785149097442627 -36.52191925048828
 v  -38.46767044067383 7.785149097442627 -36.52191925048828
 v  -40.04683303833008 28.08773803710938 -50.77265167236328
 v  -40.04683303833008 28.08773803710938 -50.77265167236328
@@ -211,7 +211,7 @@ v  -42.73056793212891 -30.60493469238281 -90.66996002197266
 v  -40.23527908325195 -2.317409992218018 -18.70730972290039
 v  -40.23527908325195 -2.317409992218018 -18.70730972290039
 v  -44.44951629638672 -41.30718231201172 -95.01465606689453
 v  -44.44951629638672 -41.30718231201172 -95.01465606689453
 v  -39.85378265380859 6.250553131103516 -37.56044387817383
 v  -39.85378265380859 6.250553131103516 -37.56044387817383
-v  -40.63287734985352 26.70069122314453 -51.05325317382812
+v  -40.63287734985352 26.70069122314453 -51.05325317382813
 v  -41.90177536010742 26.24149322509766 -55.37683486938477
 v  -41.90177536010742 26.24149322509766 -55.37683486938477
 v  -44.18946838378906 2.373975992202759 -79.78339385986328
 v  -44.18946838378906 2.373975992202759 -79.78339385986328
 v  -43.2232666015625 -31.63191223144531 -89.68506622314453
 v  -43.2232666015625 -31.63191223144531 -89.68506622314453
@@ -231,7 +231,7 @@ v  -41.56508255004883 1.750601053237915 -76.60358428955078
 v  -41.76493453979492 -34.27718353271484 -88.11498260498047
 v  -41.76493453979492 -34.27718353271484 -88.11498260498047
 v  -33.65802383422852 -4.442947864532471 -22.09029006958008
 v  -33.65802383422852 -4.442947864532471 -22.09029006958008
 v  -43.47456359863281 -42.10161590576172 -94.85892486572266
 v  -43.47456359863281 -42.10161590576172 -94.85892486572266
-v  -35.65310668945312 6.274747848510742 -40.62473678588867
+v  -35.65310668945313 6.274747848510742 -40.62473678588867
 v  -37.52444076538086 25.68461608886719 -52.12581634521484
 v  -37.52444076538086 25.68461608886719 -52.12581634521484
 v  -36.88800048828125 25.43232727050781 -54.26172637939453
 v  -36.88800048828125 25.43232727050781 -54.26172637939453
 v  -39.6718864440918 2.905498027801514 -77.26450347900391
 v  -39.6718864440918 2.905498027801514 -77.26450347900391
@@ -251,7 +251,7 @@ v  -38.03726577758789 27.49446105957031 33.66647720336914
 v  -34.5403938293457 17.31492233276367 46.75900650024414
 v  -34.5403938293457 17.31492233276367 46.75900650024414
 v  -35.8452262878418 17.43609428405762 48.66624069213867
 v  -35.8452262878418 17.43609428405762 48.66624069213867
 v  -28.96659469604492 -31.87043952941895 66.61157989501953
 v  -28.96659469604492 -31.87043952941895 66.61157989501953
-v  -28.00870513916016 -33.48403930664062 66.39229583740234
+v  -28.00870513916016 -33.48403930664063 66.39229583740234
 v  -37.94406127929688 -1.883904933929443 -4.875525951385498
 v  -37.94406127929688 -1.883904933929443 -4.875525951385498
 v  -29.19070816040039 -38.59844589233398 75.64435577392578
 v  -29.19070816040039 -38.59844589233398 75.64435577392578
 v  -38.12530136108398 7.461886882781982 15.15559387207031
 v  -38.12530136108398 7.461886882781982 15.15559387207031
@@ -285,8 +285,8 @@ v  -28.36112785339355 -39.7656364440918 75.63690948486328
 v  -34.68405532836914 6.534968852996826 18.94173622131348
 v  -34.68405532836914 6.534968852996826 18.94173622131348
 v  -38.70342254638672 25.53554534912109 30.5754222869873
 v  -38.70342254638672 25.53554534912109 30.5754222869873
 v  -37.81640243530273 25.43576812744141 32.63310623168945
 v  -37.81640243530273 25.43576812744141 32.63310623168945
-v  -34.87471389770508 16.03384399414062 44.86114120483398
-v  -27.90771293640137 -35.34060668945312 66.05712127685547
+v  -34.87471389770508 16.03384399414063 44.86114120483398
+v  -27.90771293640137 -35.34060668945313 66.05712127685547
 v  -26.45577621459961 -3.443838119506836 -2.149142980575562
 v  -26.45577621459961 -3.443838119506836 -2.149142980575562
 v  -26.46640014648438 -2.246160984039307 -5.887526988983154
 v  -26.46640014648438 -2.246160984039307 -5.887526988983154
 v  -23.49448394775391 -3.47288703918457 -4.813465118408203
 v  -23.49448394775391 -3.47288703918457 -4.813465118408203
@@ -302,26 +302,26 @@ v  -10.52369499206543 27.51875305175781 29.59563827514648
 v  -0.9972569942474365 13.43557167053223 54.88214111328125
 v  -0.9972569942474365 13.43557167053223 54.88214111328125
 v  -1.514698028564453 14.10584259033203 57.03571319580078
 v  -1.514698028564453 14.10584259033203 57.03571319580078
 v  3.385565996170044 -29.84352111816406 80.76795196533203
 v  3.385565996170044 -29.84352111816406 80.76795196533203
-v  3.675970077514648 -31.37918090820312 79.70648956298828
+v  3.675970077514648 -31.37918090820313 79.70648956298828
 v  -29.43033599853516 -1.921316027641296 -4.146553039550781
 v  -29.43033599853516 -1.921316027641296 -4.146553039550781
 v  4.587766170501709 -39.3502311706543 86.69120025634766
 v  4.587766170501709 -39.3502311706543 86.69120025634766
 v  -18.55141067504883 8.964324951171875 11.34670639038086
 v  -18.55141067504883 8.964324951171875 11.34670639038086
 v  -14.50934600830078 29.82746124267578 26.45841026306152
 v  -14.50934600830078 29.82746124267578 26.45841026306152
-v  -13.3946418762207 29.56021118164062 31.82656478881836
+v  -13.3946418762207 29.56021118164063 31.82656478881836
 v  -3.589093923568726 14.20652008056641 58.0562744140625
 v  -3.589093923568726 14.20652008056641 58.0562744140625
 v  2.445001125335693 -29.51860809326172 81.25101470947266
 v  2.445001125335693 -29.51860809326172 81.25101470947266
-v  -30.15432739257812 -2.742969989776611 -0.9014430046081543
+v  -30.15432739257813 -2.742969989776611 -0.9014430046081543
 v  4.197091102600098 -39.74774169921875 86.60486602783203
 v  4.197091102600098 -39.74774169921875 86.60486602783203
 v  -20.00806045532227 7.973351955413818 12.8470344543457
 v  -20.00806045532227 7.973351955413818 12.8470344543457
 v  -15.4754638671875 28.75201416015625 26.9644775390625
 v  -15.4754638671875 28.75201416015625 26.9644775390625
 v  -15.30904579162598 28.31040191650391 31.46907806396484
 v  -15.30904579162598 28.31040191650391 31.46907806396484
-v  -5.658416748046875 13.66179847717285 57.17532348632812
+v  -5.658416748046875 13.66179847717285 57.17532348632813
 v  1.562493085861206 -30.64902877807617 80.79186248779297
 v  1.562493085861206 -30.64902877807617 80.79186248779297
 v  -28.0932731628418 -4.09240198135376 1.404078960418701
 v  -28.0932731628418 -4.09240198135376 1.404078960418701
 v  4.161306858062744 -40.34838485717773 86.31630706787109
 v  4.161306858062744 -40.34838485717773 86.31630706787109
 v  -19.53142166137695 6.477696895599365 14.54720878601074
 v  -19.53142166137695 6.477696895599365 14.54720878601074
 v  -15.32335662841797 27.08382415771484 27.34894752502441
 v  -15.32335662841797 27.08382415771484 27.34894752502441
-v  -15.56659698486328 26.39956665039062 30.18951416015625
+v  -15.56659698486328 26.39956665039063 30.18951416015625
 v  -6.164387226104736 12.8818302154541 55.05625915527344
 v  -6.164387226104736 12.8818302154541 55.05625915527344
 v  1.402615070343018 -32.38360595703125 79.73628997802734
 v  1.402615070343018 -32.38360595703125 79.73628997802734
 v  -24.79911041259766 -4.953472137451172 1.033954977989197
 v  -24.79911041259766 -4.953472137451172 1.033954977989197
@@ -340,7 +340,7 @@ v  -2.426440954208374 12.70041084289551 53.21726226806641
 v  3.097472906112671 -32.96916198730469 78.86588287353516
 v  3.097472906112671 -32.96916198730469 78.86588287353516
 v  -23.49448394775391 -3.47288703918457 -15.18653869628906
 v  -23.49448394775391 -3.47288703918457 -15.18653869628906
 v  -26.46640014648438 -2.246160984039307 -14.11247634887695
 v  -26.46640014648438 -2.246160984039307 -14.11247634887695
-v  -26.45577621459961 -3.443838119506836 -17.85086059570312
+v  -26.45577621459961 -3.443838119506836 -17.85086059570313
 v  5.211228847503662 -39.9835319519043 -106.1982498168945
 v  5.211228847503662 -39.9835319519043 -106.1982498168945
 v  4.668338775634766 -40.01747512817383 -106.3362197875977
 v  4.668338775634766 -40.01747512817383 -106.3362197875977
 v  5.039107799530029 -39.45514678955078 -106.5102310180664
 v  5.039107799530029 -39.45514678955078 -106.5102310180664
@@ -352,27 +352,27 @@ v  -10.52369499206543 27.51875305175781 -49.59563446044922
 v  -11.26496505737305 29.20790100097656 -50.99276733398438
 v  -11.26496505737305 29.20790100097656 -50.99276733398438
 v  -0.9972569942474365 13.43557167053223 -74.88213348388672
 v  -0.9972569942474365 13.43557167053223 -74.88213348388672
 v  -1.514698028564453 14.10584259033203 -77.03571319580078
 v  -1.514698028564453 14.10584259033203 -77.03571319580078
-v  3.675970077514648 -31.37918090820312 -99.70648956298828
+v  3.675970077514648 -31.37918090820313 -99.70648956298828
 v  3.38556694984436 -29.84352111816406 -100.767951965332
 v  3.38556694984436 -29.84352111816406 -100.767951965332
 v  -29.43033599853516 -1.921316027641296 -15.85345077514648
 v  -29.43033599853516 -1.921316027641296 -15.85345077514648
 v  4.587764739990234 -39.3502311706543 -106.6912002563477
 v  4.587764739990234 -39.3502311706543 -106.6912002563477
-v  -18.55141067504883 8.964324951171875 -31.34671020507812
+v  -18.55141067504883 8.964324951171875 -31.34671020507813
 v  -14.50934600830078 29.82746124267578 -46.45841217041016
 v  -14.50934600830078 29.82746124267578 -46.45841217041016
-v  -13.3946418762207 29.56021118164062 -51.82656097412109
+v  -13.3946418762207 29.56021118164063 -51.82656097412109
 v  -3.589093923568726 14.20652008056641 -78.05626678466797
 v  -3.589093923568726 14.20652008056641 -78.05626678466797
 v  2.445001125335693 -29.51860809326172 -101.2510147094727
 v  2.445001125335693 -29.51860809326172 -101.2510147094727
-v  -30.15432739257812 -2.742969989776611 -19.09856033325195
+v  -30.15432739257813 -2.742969989776611 -19.09856033325195
 v  4.197090148925781 -39.74774169921875 -106.604866027832
 v  4.197090148925781 -39.74774169921875 -106.604866027832
 v  -20.00806045532227 7.973351955413818 -32.8470344543457
 v  -20.00806045532227 7.973351955413818 -32.8470344543457
 v  -15.4754638671875 28.75201416015625 -46.9644775390625
 v  -15.4754638671875 28.75201416015625 -46.9644775390625
 v  -15.30904579162598 28.31040191650391 -51.46907806396484
 v  -15.30904579162598 28.31040191650391 -51.46907806396484
 v  -5.658416748046875 13.66179847717285 -77.17531585693359
 v  -5.658416748046875 13.66179847717285 -77.17531585693359
 v  1.562493085861206 -30.64902877807617 -100.791862487793
 v  1.562493085861206 -30.64902877807617 -100.791862487793
-v  -28.0932731628418 -4.09240198135376 -21.40408325195312
+v  -28.0932731628418 -4.09240198135376 -21.40408325195313
 v  4.161307811737061 -40.34838485717773 -106.3163070678711
 v  4.161307811737061 -40.34838485717773 -106.3163070678711
 v  -19.53142166137695 6.477696895599365 -34.54721069335938
 v  -19.53142166137695 6.477696895599365 -34.54721069335938
 v  -15.32335662841797 27.08382415771484 -47.34894561767578
 v  -15.32335662841797 27.08382415771484 -47.34894561767578
-v  -15.56659698486328 26.39956665039062 -50.18951416015625
+v  -15.56659698486328 26.39956665039063 -50.18951416015625
 v  -6.164387226104736 12.8818302154541 -75.05625152587891
 v  -6.164387226104736 12.8818302154541 -75.05625152587891
 v  1.402615070343018 -32.38360595703125 -99.73628997802734
 v  1.402615070343018 -32.38360595703125 -99.73628997802734
 v  -24.79911041259766 -4.953472137451172 -21.03395843505859
 v  -24.79911041259766 -4.953472137451172 -21.03395843505859
@@ -393,14 +393,14 @@ v  -14.25648880004883 -6.954940795898438 -3.301691055297852
 v  -14.10265731811523 -6.075778961181641 -7.124460220336914
 v  -14.10265731811523 -6.075778961181641 -7.124460220336914
 v  -11.2052116394043 -7.280231952667236 -5.841878890991211
 v  -11.2052116394043 -7.280231952667236 -5.841878890991211
 v  19.74986457824707 -37.60753631591797 68.32992553710938
 v  19.74986457824707 -37.60753631591797 68.32992553710938
-v  19.34836387634277 -38.14849472045898 68.15628051757812
+v  19.34836387634277 -38.14849472045898 68.15628051757813
 v  19.89711761474609 -38.15519714355469 68.03912353515625
 v  19.89711761474609 -38.15519714355469 68.03912353515625
 v  -4.907510757446289 6.093640804290771 10.12681770324707
 v  -4.907510757446289 6.093640804290771 10.12681770324707
 v  -2.877649068832397 5.517601013183594 11.07694053649902
 v  -2.877649068832397 5.517601013183594 11.07694053649902
 v  1.745674014091492 26.13694000244141 21.00781440734863
 v  1.745674014091492 26.13694000244141 21.00781440734863
 v  0.4745520055294037 27.20939636230469 20.97971534729004
 v  0.4745520055294037 27.20939636230469 20.97971534729004
 v  3.233434915542603 28.02400207519531 25.24942970275879
 v  3.233434915542603 28.02400207519531 25.24942970275879
-v  4.282450199127197 26.64773559570312 23.71314430236816
+v  4.282450199127197 26.64773559570313 23.71314430236816
 v  14.8602180480957 5.642467975616455 47.61897277832031
 v  14.8602180480957 5.642467975616455 47.61897277832031
 v  14.56025314331055 6.223588943481445 49.83868408203125
 v  14.56025314331055 6.223588943481445 49.83868408203125
 v  18.9760627746582 -28.07810020446777 62.27335357666016
 v  18.9760627746582 -28.07810020446777 62.27335357666016
@@ -434,28 +434,28 @@ v  1.932853937149048 23.20393180847168 23.79626274108887
 v  11.57662582397461 3.190187931060791 46.84990692138672
 v  11.57662582397461 3.190187931060791 46.84990692138672
 v  17.50724792480469 -31.60873603820801 60.42989349365234
 v  17.50724792480469 -31.60873603820801 60.42989349365234
 v  -10.6054573059082 -8.239757537841797 -2.646497964859009
 v  -10.6054573059082 -8.239757537841797 -2.646497964859009
-v  19.63114547729492 -38.69778442382812 67.83663940429688
+v  19.63114547729492 -38.69778442382813 67.83663940429688
 v  -2.475620031356812 4.172726154327393 12.91663932800293
 v  -2.475620031356812 4.172726154327393 12.91663932800293
 v  2.032040119171143 24.59943771362305 21.57402229309082
 v  2.032040119171143 24.59943771362305 21.57402229309082
 v  3.703634023666382 24.50261497497559 23.06640815734863
 v  3.703634023666382 24.50261497497559 23.06640815734863
-v  13.53237915039062 4.292479038238525 46.28885650634766
+v  13.53237915039063 4.292479038238525 46.28885650634766
 v  18.54694938659668 -31.23143768310547 60.44495391845703
 v  18.54694938659668 -31.23143768310547 60.44495391845703
 v  -12.53854370117188 -7.280231952667236 -13.491455078125
 v  -12.53854370117188 -7.280231952667236 -13.491455078125
 v  -15.43598937988281 -6.075778961181641 -12.2088737487793
 v  -15.43598937988281 -6.075778961181641 -12.2088737487793
 v  -15.58982086181641 -6.954940795898438 -16.03164291381836
 v  -15.58982086181641 -6.954940795898438 -16.03164291381836
-v  18.56378555297852 -38.15519714355469 -87.37246704101562
+v  18.56378555297852 -38.15519714355469 -87.37246704101563
 v  18.0150318145752 -38.14849472045898 -87.4896240234375
 v  18.0150318145752 -38.14849472045898 -87.4896240234375
 v  18.41653251647949 -37.60753631591797 -87.66326904296875
 v  18.41653251647949 -37.60753631591797 -87.66326904296875
 v  -4.210980892181396 5.517601013183594 -30.41027450561523
 v  -4.210980892181396 5.517601013183594 -30.41027450561523
 v  -6.240842819213867 6.093640804290771 -29.46015167236328
 v  -6.240842819213867 6.093640804290771 -29.46015167236328
 v  0.4123420119285583 26.13694000244141 -40.34114837646484
 v  0.4123420119285583 26.13694000244141 -40.34114837646484
 v  -0.8587800264358521 27.20939636230469 -40.31304931640625
 v  -0.8587800264358521 27.20939636230469 -40.31304931640625
-v  2.949118137359619 26.64773559570312 -43.04647827148438
+v  2.949118137359619 26.64773559570313 -43.04647827148438
 v  1.900102972984314 28.02400207519531 -44.582763671875
 v  1.900102972984314 28.02400207519531 -44.582763671875
-v  13.52688598632812 5.642467975616455 -66.95231628417969
-v  13.22692108154297 6.223588943481445 -69.17202758789062
+v  13.52688598632813 5.642467975616455 -66.95231628417969
+v  13.22692108154297 6.223588943481445 -69.17202758789063
 v  17.86732864379883 -29.66015243530273 -80.59872436523438
 v  17.86732864379883 -29.66015243530273 -80.59872436523438
-v  17.64273071289062 -28.07810020446777 -81.60670471191406
+v  17.64273071289063 -28.07810020446777 -81.60670471191406
 v  -18.44928359985352 -5.533359050750732 -13.80491638183594
 v  -18.44928359985352 -5.533359050750732 -13.80491638183594
 v  17.96691513061523 -37.46723175048828 -87.82330322265625
 v  17.96691513061523 -37.46723175048828 -87.82330322265625
 v  -8.370006561279297 5.467060089111328 -30.11508178710938
 v  -8.370006561279297 5.467060089111328 -30.11508178710938
@@ -471,7 +471,7 @@ v  -1.290704965591431 25.68392181396484 -45.89799499511719
 v  9.702729225158691 4.237391948699951 -70.18302917480469
 v  9.702729225158691 4.237391948699951 -70.18302917480469
 v  15.76919937133789 -28.75799560546875 -81.57952880859375
 v  15.76919937133789 -28.75799560546875 -81.57952880859375
 v  -17.36852645874023 -7.262344837188721 -19.56281280517578
 v  -17.36852645874023 -7.262344837188721 -19.56281280517578
-v  17.48766136169434 -38.44494247436523 -87.45840454101562
+v  17.48766136169434 -38.44494247436523 -87.45840454101563
 v  -7.645581245422363 3.043694019317627 -33.43013000488281
 v  -7.645581245422363 3.043694019317627 -33.43013000488281
 v  -1.641402959823608 24.23861885070801 -41.86458587646484
 v  -1.641402959823608 24.23861885070801 -41.86458587646484
 v  -1.029770016670227 23.72967147827148 -44.68647766113281
 v  -1.029770016670227 23.72967147827148 -44.68647766113281
@@ -485,7 +485,7 @@ v  0.5995219945907593 23.20393180847168 -43.12960052490234
 v  10.24329376220703 3.190187931060791 -66.18324279785156
 v  10.24329376220703 3.190187931060791 -66.18324279785156
 v  16.17391586303711 -31.60873603820801 -79.76324462890625
 v  16.17391586303711 -31.60873603820801 -79.76324462890625
 v  -11.93878936767578 -8.239757537841797 -16.68683624267578
 v  -11.93878936767578 -8.239757537841797 -16.68683624267578
-v  18.29781341552734 -38.69778442382812 -87.16998291015625
+v  18.29781341552734 -38.69778442382813 -87.16998291015625
 v  -3.808951854705811 4.172726154327393 -32.24997329711914
 v  -3.808951854705811 4.172726154327393 -32.24997329711914
 v  0.6987079977989197 24.59943771362305 -40.90735626220703
 v  0.6987079977989197 24.59943771362305 -40.90735626220703
 v  2.370301961898804 24.50261497497559 -42.39974212646484
 v  2.370301961898804 24.50261497497559 -42.39974212646484
@@ -519,7 +519,7 @@ v  -51.75783920288086 11.98240089416504 0.8355600237846375
 v  -56.05172729492188 7.156466007232666 5.002277851104736
 v  -56.05172729492188 7.156466007232666 5.002277851104736
 v  -53.53396987915039 14.21004676818848 1.72101902961731
 v  -53.53396987915039 14.21004676818848 1.72101902961731
 v  -57.36484146118164 8.803488731384277 5.656900882720947
 v  -57.36484146118164 8.803488731384277 5.656900882720947
-v  -56.62808227539062 15.23869514465332 0.7346760034561157
+v  -56.62808227539063 15.23869514465332 0.7346760034561157
 v  -59.24757766723633 9.889246940612793 4.827473163604736
 v  -59.24757766723633 9.889246940612793 4.827473163604736
 v  -58.71025466918945 14.29374885559082 -1.380638957023621
 v  -58.71025466918945 14.29374885559082 -1.380638957023621
 v  -60.28214263916016 9.596194267272949 3.138458967208862
 v  -60.28214263916016 9.596194267272949 3.138458967208862
@@ -556,7 +556,7 @@ v  -40.64442825317383 21.88604164123535 -0.7607129812240601
 v  -44.44827651977539 21.88604164123535 2.546009063720703
 v  -44.44827651977539 21.88604164123535 2.546009063720703
 v  -53.9999885559082 20.33333778381348 0.4478580057621002
 v  -53.9999885559082 20.33333778381348 0.4478580057621002
 v  -60.29326629638672 19.47619819641113 -2.199142932891846
 v  -60.29326629638672 19.47619819641113 -2.199142932891846
-v  -63.06387329101562 19.47619819641113 -6.810235023498535
+v  -63.06387329101563 19.47619819641113 -6.810235023498535
 v  -64.39229583740234 20.33333778381348 -9.944446563720703
 v  -64.39229583740234 20.33333778381348 -9.944446563720703
 v  -63.32090759277344 15.14286994934082 -6.139256000518799
 v  -63.32090759277344 15.14286994934082 -6.139256000518799
 v  -62.36603164672852 15.39914894104004 -5.604844093322754
 v  -62.36603164672852 15.39914894104004 -5.604844093322754
@@ -618,7 +618,7 @@ v  -38.80768203735352 21.88604164123535 -9.988886833190918
 v  -44.44827651977539 21.88604164123535 -22.47934150695801
 v  -44.44827651977539 21.88604164123535 -22.47934150695801
 v  -53.9999885559082 20.33333778381348 -20.38118934631348
 v  -53.9999885559082 20.33333778381348 -20.38118934631348
 v  -60.29326629638672 19.47619819641113 -17.73418998718262
 v  -60.29326629638672 19.47619819641113 -17.73418998718262
-v  -63.06387329101562 19.47619819641113 -13.12309837341309
+v  -63.06387329101563 19.47619819641113 -13.12309837341309
 v  -64.39229583740234 20.33333778381348 -9.988886833190918
 v  -64.39229583740234 20.33333778381348 -9.988886833190918
 v  -62.33220672607422 15.06181526184082 -14.44650936126709
 v  -62.33220672607422 15.06181526184082 -14.44650936126709
 v  -62.36603164672852 15.39914894104004 -14.32849025726318
 v  -62.36603164672852 15.39914894104004 -14.32849025726318
@@ -650,7 +650,7 @@ v  -64.66415405273438 4.277801990509033 -18.2394905090332
 v  -63.78934860229492 3.570785999298096 -16.48468399047852
 v  -63.78934860229492 3.570785999298096 -16.48468399047852
 v  -62.37599182128906 11.21470260620117 -16.82923698425293
 v  -62.37599182128906 11.21470260620117 -16.82923698425293
 v  -66.95527648925781 4.531181812286377 -18.78395462036133
 v  -66.95527648925781 4.531181812286377 -18.78395462036133
-v  -63.80926132202148 13.24985885620117 -14.86489868164062
+v  -63.80926132202148 13.24985885620117 -14.86489868164063
 v  -68.93736267089844 4.140174865722656 -17.70805549621582
 v  -68.93736267089844 4.140174865722656 -17.70805549621582
 v  -64.48637390136719 12.67211532592773 -12.25428771972656
 v  -64.48637390136719 12.67211532592773 -12.25428771972656
 v  -69.1180419921875 3.399224042892456 -15.82198143005371
 v  -69.1180419921875 3.399224042892456 -15.82198143005371
@@ -670,7 +670,7 @@ v  -51.75783920288086 12.03694534301758 -19.50222587585449
 v  -56.05172729492188 7.211010932922363 -23.66894340515137
 v  -56.05172729492188 7.211010932922363 -23.66894340515137
 v  -53.53396987915039 14.26459121704102 -20.38768196105957
 v  -53.53396987915039 14.26459121704102 -20.38768196105957
 v  -57.36484146118164 8.858034133911133 -24.32356452941895
 v  -57.36484146118164 8.858034133911133 -24.32356452941895
-v  -56.62808227539062 15.29323959350586 -19.40134239196777
+v  -56.62808227539063 15.29323959350586 -19.40134239196777
 v  -59.24757766723633 9.943792343139648 -23.49413871765137
 v  -59.24757766723633 9.943792343139648 -23.49413871765137
 v  -58.71025466918945 14.34829330444336 -17.28602600097656
 v  -58.71025466918945 14.34829330444336 -17.28602600097656
 v  -60.28214263916016 9.650739669799805 -21.80512428283691
 v  -60.28214263916016 9.650739669799805 -21.80512428283691
@@ -679,13 +679,13 @@ v  -58.74361419677734 17.51846694946289 -2.271703958511353
 v  -59.46704864501953 18.40674209594727 -2.53897500038147
 v  -59.46704864501953 18.40674209594727 -2.53897500038147
 v  -60.63759613037109 18.10347366333008 -2.337920904159546
 v  -60.63759613037109 18.10347366333008 -2.337920904159546
 v  -61.55588531494141 18.15423965454102 -3.37207293510437
 v  -61.55588531494141 18.15423965454102 -3.37207293510437
-v  -60.57522583007812 18.69086074829102 -3.431842088699341
+v  -60.57522583007813 18.69086074829102 -3.431842088699341
 v  -61.64485168457031 18.26233291625977 -4.609260082244873
 v  -61.64485168457031 18.26233291625977 -4.609260082244873
 v  -61.38417816162109 17.94110488891602 -5.717274188995361
 v  -61.38417816162109 17.94110488891602 -5.717274188995361
 v  -61.48154449462891 16.98392105102539 -6.448155879974365
 v  -61.48154449462891 16.98392105102539 -6.448155879974365
 v  -62.26735687255859 17.28479385375977 -5.621510982513428
 v  -62.26735687255859 17.28479385375977 -5.621510982513428
 v  -62.61495971679688 16.49116897583008 -5.094202995300293
 v  -62.61495971679688 16.49116897583008 -5.094202995300293
-v  -62.20498657226562 16.13167190551758 -6.081917762756348
+v  -62.20498657226563 16.13167190551758 -6.081917762756348
 v  -61.27806091308594 15.97928333282471 -6.500585079193115
 v  -61.27806091308594 15.97928333282471 -6.500585079193115
 v  -62.26735687255859 15.54427146911621 -4.988009929656982
 v  -62.26735687255859 15.54427146911621 -4.988009929656982
 v  -61.38417816162109 14.97993564605713 -4.639497756958008
 v  -61.38417816162109 14.97993564605713 -4.639497756958008
@@ -693,7 +693,7 @@ v  -61.48154449462891 15.24338626861572 -5.814656257629395
 v  -60.47430419921875 15.08453464508057 -3.54331111907959
 v  -60.47430419921875 15.08453464508057 -3.54331111907959
 v  -61.64485168457031 15.44609451293945 -3.584233999252319
 v  -61.64485168457031 15.44609451293945 -3.584233999252319
 v  -61.55588531494141 16.32414627075195 -2.705970048904419
 v  -61.55588531494141 16.32414627075195 -2.705970048904419
-v  -60.57522583007812 15.87463855743408 -2.406815052032471
+v  -60.57522583007813 15.87463855743408 -2.406815052032471
 v  -59.56442260742188 15.70901966094971 -2.636348009109497
 v  -59.56442260742188 15.70901966094971 -2.636348009109497
 v  -60.63759613037109 17.02777481079102 -1.946398019790649
 v  -60.63759613037109 17.02777481079102 -1.946398019790649
 v  -59.46704864501953 16.66621780395508 -1.905473947525024
 v  -59.46704864501953 16.66621780395508 -1.905473947525024
@@ -704,13 +704,13 @@ v  -59.46704864501953 18.14007568359375 -17.19435882568359
 v  -58.74361419677734 17.25180053710938 -17.46162986755371
 v  -58.74361419677734 17.25180053710938 -17.46162986755371
 v  -59.67054748535156 17.40419006347656 -17.88029861450195
 v  -59.67054748535156 17.40419006347656 -17.88029861450195
 v  -60.63759613037109 17.83680725097656 -17.39541244506836
 v  -60.63759613037109 17.83680725097656 -17.39541244506836
-v  -60.57522583007812 18.4241943359375 -16.30149078369141
+v  -60.57522583007813 18.4241943359375 -16.30149078369141
 v  -61.55588531494141 17.8875732421875 -16.36125946044922
 v  -61.55588531494141 17.8875732421875 -16.36125946044922
 v  -61.64485168457031 17.99566650390625 -15.12407302856445
 v  -61.64485168457031 17.99566650390625 -15.12407302856445
 v  -62.26735687255859 17.01812744140625 -14.1118221282959
 v  -62.26735687255859 17.01812744140625 -14.1118221282959
 v  -61.48154449462891 16.71725463867188 -13.28517723083496
 v  -61.48154449462891 16.71725463867188 -13.28517723083496
 v  -61.38417816162109 17.6744384765625 -14.01605987548828
 v  -61.38417816162109 17.6744384765625 -14.01605987548828
-v  -62.20498657226562 15.86500549316406 -13.65141487121582
+v  -62.20498657226563 15.86500549316406 -13.65141487121582
 v  -62.61495971679688 16.22450256347656 -14.63912963867188
 v  -62.61495971679688 16.22450256347656 -14.63912963867188
 v  -61.27806091308594 15.71261596679688 -13.23274803161621
 v  -61.27806091308594 15.71261596679688 -13.23274803161621
 v  -62.26735687255859 15.27760314941406 -14.74532318115234
 v  -62.26735687255859 15.27760314941406 -14.74532318115234
@@ -718,7 +718,7 @@ v  -61.48154449462891 14.97671890258789 -13.91867828369141
 v  -61.38417816162109 14.7132682800293 -15.09383583068848
 v  -61.38417816162109 14.7132682800293 -15.09383583068848
 v  -61.64485168457031 15.17942810058594 -16.14909934997559
 v  -61.64485168457031 15.17942810058594 -16.14909934997559
 v  -60.47430419921875 14.81786727905273 -16.19002342224121
 v  -60.47430419921875 14.81786727905273 -16.19002342224121
-v  -60.57522583007812 15.60797119140625 -17.32651901245117
+v  -60.57522583007813 15.60797119140625 -17.32651901245117
 v  -61.55588531494141 16.05747985839844 -17.02736282348633
 v  -61.55588531494141 16.05747985839844 -17.02736282348633
 v  -59.56442260742188 15.44235229492188 -17.09698486328125
 v  -59.56442260742188 15.44235229492188 -17.09698486328125
 v  -60.63759613037109 16.7611083984375 -17.78693389892578
 v  -60.63759613037109 16.7611083984375 -17.78693389892578
@@ -1249,7 +1249,7 @@ vn -0.7882999777793884 -0.6091880202293396 -0.08644299954175949
 vn -0.6353080272674561 -0.5868319869041443 0.5020080208778381
 vn -0.6353080272674561 -0.5868319869041443 0.5020080208778381
 vn -0.7489200234413147 -0.3426479995250702 0.5671960115432739
 vn -0.7489200234413147 -0.3426479995250702 0.5671960115432739
 vn -0.8290749788284302 -0.1998199969530106 0.5222129821777344
 vn -0.8290749788284302 -0.1998199969530106 0.5222129821777344
-vn -0.8114089965820312 -0.2435930073261261 0.5312989950180054
+vn -0.8114089965820313 -0.2435930073261261 0.5312989950180054
 vn -0.02972600050270557 -0.7129759788513184 -0.7005580067634583
 vn -0.02972600050270557 -0.7129759788513184 -0.7005580067634583
 vn -0.1212550029158592 -0.8703849911689758 -0.4772070050239563
 vn -0.1212550029158592 -0.8703849911689758 -0.4772070050239563
 vn 0.1511760056018829 -0.9298509955406189 -0.3354449868202209
 vn 0.1511760056018829 -0.9298509955406189 -0.3354449868202209
@@ -1538,7 +1538,7 @@ vn -0.3590719997882843 -0.2934069931507111 -0.8859909772872925
 vn -0.5312150120735168 -0.1616500020027161 -0.8316730260848999
 vn -0.5312150120735168 -0.1616500020027161 -0.8316730260848999
 vn 0.5217099785804749 -0.3334519863128662 -0.7852569818496704
 vn 0.5217099785804749 -0.3334519863128662 -0.7852569818496704
 vn 0.4982230067253113 -0.5182129740715027 -0.6951469779014587
 vn 0.4982230067253113 -0.5182129740715027 -0.6951469779014587
-vn 0.3192520141601562 -0.6669300198554993 -0.6732630133628845
+vn 0.3192520141601563 -0.6669300198554993 -0.6732630133628845
 vn 0.4172089993953705 0.6029300093650818 -0.6800090074539185
 vn 0.4172089993953705 0.6029300093650818 -0.6800090074539185
 vn -0.3909519910812378 -0.5063930153846741 -0.7685850262641907
 vn -0.3909519910812378 -0.5063930153846741 -0.7685850262641907
 vn -0.785847008228302 -0.2199160009622574 -0.5779989957809448
 vn -0.785847008228302 -0.2199160009622574 -0.5779989957809448
@@ -1595,7 +1595,7 @@ vn -0.8313949704170227 0.3698750138282776 0.414698988199234
 vn -0.7773889899253845 0.439754992723465 0.4497570097446442
 vn -0.7773889899253845 0.439754992723465 0.4497570097446442
 vn -0.7120980024337769 0.07437500357627869 0.6981300115585327
 vn -0.7120980024337769 0.07437500357627869 0.6981300115585327
 vn -0.5221620202064514 -0.5821250081062317 0.6232789754867554
 vn -0.5221620202064514 -0.5821250081062317 0.6232789754867554
-vn -0.5362930297851562 0.8426250219345093 0.04870999976992607
+vn -0.5362930297851563 0.8426250219345093 0.04870999976992607
 vn -0.6278550028800964 0.7403159737586975 0.2402739971876144
 vn -0.6278550028800964 0.7403159737586975 0.2402739971876144
 vn -0.817995011806488 0.4767960011959076 0.3217920064926147
 vn -0.817995011806488 0.4767960011959076 0.3217920064926147
 vn -0.7291709780693054 0.6557949781417847 0.1955550014972687
 vn -0.7291709780693054 0.6557949781417847 0.1955550014972687
@@ -1780,8 +1780,8 @@ vn -0.7573840022087097 0.2233279943466187 -0.6135900020599365
 vn -0.902417004108429 0.4006629884243011 -0.1584679931402206
 vn -0.902417004108429 0.4006629884243011 -0.1584679931402206
 vn -0.902417004108429 -0.2050659954547882 -0.3789339959621429
 vn -0.902417004108429 -0.2050659954547882 -0.3789339959621429
 
 
-# Mesh 'HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01' with 80 faces
-g HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01
+# Mesh 'HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01' with 80 faces
+g HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01_HLeib01
 usemtl HLeibTex
 usemtl HLeibTex
 f  1/1/1 2/2/2 3/3/3
 f  1/1/1 2/2/2 3/3/3
 f  4/4/4 3/3/3 5/5/5
 f  4/4/4 3/3/3 5/5/5
@@ -1864,8 +1864,8 @@ f  25/25/25 27/27/27 42/42/42
 f  35/35/35 42/42/42 34/34/34
 f  35/35/35 42/42/42 34/34/34
 f  27/27/27 34/34/34 42/42/42
 f  27/27/27 34/34/34 42/42/42
 
 
-# Mesh 'OK_OK_OK_OK_OK_OK_OK_OK' with 60 faces
-g OK_OK_OK_OK_OK_OK_OK_OK
+# Mesh 'OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK' with 60 faces
+g OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK_OK
 usemtl Skin
 usemtl Skin
 f  43/43/43 44/44/44 45/45/45
 f  43/43/43 44/44/44 45/45/45
 f  46/46/46 45/45/45 47/47/47
 f  46/46/46 45/45/45 47/47/47
@@ -1928,8 +1928,8 @@ f  53/53/53 66/63/66 52/52/52
 f  78/67/78 52/52/52 66/63/66
 f  78/67/78 52/52/52 66/63/66
 f  67/64/67 69/63/69 79/67/79
 f  67/64/67 69/63/69 79/67/79
 
 
-# Mesh 'Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li' with 98 faces
-g Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li
+# Mesh 'Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li' with 98 faces
+g Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li_Bein1Li
 usemtl BeinTex
 usemtl BeinTex
 f  80/68/80 81/68/80 82/68/80
 f  80/68/80 81/68/80 82/68/80
 f  83/68/81 84/68/81 85/68/81
 f  83/68/81 84/68/81 85/68/81
@@ -2030,8 +2030,8 @@ f  129/114/128 94/122/92 92/121/90
 f  130/115/129 125/116/130 94/122/92
 f  130/115/129 125/116/130 94/122/92
 f  125/116/130 83/123/94 94/122/92
 f  125/116/130 83/123/94 94/122/92
 
 
-# Mesh 'Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re' with 98 faces
-g Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re
+# Mesh 'Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re' with 98 faces
+g Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re_Bein1Re
 usemtl BeinTex
 usemtl BeinTex
 f  131/68/131 132/68/131 133/68/131
 f  131/68/131 132/68/131 133/68/131
 f  134/68/132 135/68/132 136/68/132
 f  134/68/132 135/68/132 136/68/132
@@ -2132,8 +2132,8 @@ f  143/121/141 146/122/144 180/114/179
 f  146/122/144 176/116/181 181/115/180
 f  146/122/144 176/116/181 181/115/180
 f  146/122/144 136/123/145 176/116/181
 f  146/122/144 136/123/145 176/116/181
 
 
-# Mesh 'Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li' with 98 faces
-g Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li
+# Mesh 'Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li' with 98 faces
+g Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li_Bein2Li
 usemtl BeinTex
 usemtl BeinTex
 f  182/68/182 183/68/182 184/68/182
 f  182/68/182 183/68/182 184/68/182
 f  185/68/183 186/68/183 187/68/183
 f  185/68/183 186/68/183 187/68/183
@@ -2234,8 +2234,8 @@ f  231/114/230 196/122/194 194/121/192
 f  232/115/231 227/116/232 196/122/194
 f  232/115/231 227/116/232 196/122/194
 f  227/116/232 185/123/196 196/122/194
 f  227/116/232 185/123/196 196/122/194
 
 
-# Mesh 'Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re' with 98 faces
-g Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re
+# Mesh 'Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re' with 98 faces
+g Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re_Bein2Re
 usemtl BeinTex
 usemtl BeinTex
 f  233/68/233 234/68/233 235/68/233
 f  233/68/233 234/68/233 235/68/233
 f  236/68/234 237/68/234 238/68/234
 f  236/68/234 237/68/234 238/68/234
@@ -2336,8 +2336,8 @@ f  245/121/243 248/122/246 282/114/281
 f  248/122/246 278/116/283 283/115/282
 f  248/122/246 278/116/283 283/115/282
 f  248/122/246 238/123/247 278/116/283
 f  248/122/246 238/123/247 278/116/283
 
 
-# Mesh 'Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re' with 98 faces
-g Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re
+# Mesh 'Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re' with 98 faces
+g Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re_Bein3Re
 usemtl BeinTex
 usemtl BeinTex
 f  284/68/284 285/68/284 286/68/284
 f  284/68/284 285/68/284 286/68/284
 f  287/68/285 288/68/285 289/68/285
 f  287/68/285 288/68/285 289/68/285
@@ -2438,8 +2438,8 @@ f  296/121/294 299/122/297 333/114/332
 f  299/122/297 329/116/334 334/115/333
 f  299/122/297 329/116/334 334/115/333
 f  299/122/297 289/123/298 329/116/334
 f  299/122/297 289/123/298 329/116/334
 
 
-# Mesh 'Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li' with 98 faces
-g Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li
+# Mesh 'Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li' with 98 faces
+g Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li_Bein3Li
 usemtl BeinTex
 usemtl BeinTex
 f  335/68/335 336/68/335 337/68/335
 f  335/68/335 336/68/335 337/68/335
 f  338/68/336 339/68/336 340/68/336
 f  338/68/336 339/68/336 340/68/336
@@ -2540,8 +2540,8 @@ f  384/114/383 349/122/347 347/121/345
 f  385/115/384 380/116/385 349/122/347
 f  385/115/384 380/116/385 349/122/347
 f  380/116/385 338/123/349 349/122/347
 f  380/116/385 338/123/349 349/122/347
 
 
-# Mesh 'Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re' with 98 faces
-g Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re
+# Mesh 'Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re' with 98 faces
+g Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re_Bein4Re
 usemtl BeinTex
 usemtl BeinTex
 f  386/68/386 387/68/386 388/68/386
 f  386/68/386 387/68/386 388/68/386
 f  389/68/387 390/68/387 391/68/387
 f  389/68/387 390/68/387 391/68/387
@@ -2642,8 +2642,8 @@ f  398/121/396 401/122/399 435/114/434
 f  401/122/399 431/116/436 436/115/435
 f  401/122/399 431/116/436 436/115/435
 f  401/122/399 391/123/400 431/116/436
 f  401/122/399 391/123/400 431/116/436
 
 
-# Mesh 'Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li' with 98 faces
-g Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li
+# Mesh 'Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li' with 98 faces
+g Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li_Bein4Li
 usemtl BeinTex
 usemtl BeinTex
 f  437/68/437 438/68/437 439/68/437
 f  437/68/437 438/68/437 439/68/437
 f  440/68/438 441/68/438 442/68/438
 f  440/68/438 441/68/438 442/68/438
@@ -2744,8 +2744,8 @@ f  486/114/485 451/122/449 449/121/447
 f  487/115/486 482/116/487 451/122/449
 f  487/115/486 482/116/487 451/122/449
 f  482/116/487 440/123/451 451/122/449
 f  482/116/487 440/123/451 451/122/449
 
 
-# Mesh 'Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn' with 42 faces
-g Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn
+# Mesh 'Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn' with 42 faces
+g Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn_Zahn
 usemtl BeinTex
 usemtl BeinTex
 f  488/124/488 488/124/488 488/124/488
 f  488/124/488 488/124/488 488/124/488
 f  489/125/489 490/126/489 491/127/489
 f  489/125/489 490/126/489 491/127/489
@@ -2790,8 +2790,8 @@ f  488/124/505 492/128/491 488/124/490
 f  503/139/506 502/138/507 492/128/491
 f  503/139/506 502/138/507 492/128/491
 f  502/138/507 489/125/493 492/128/491
 f  502/138/507 489/125/493 492/128/491
 
 
-# Mesh 'klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn' with 42 faces
-g klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn
+# Mesh 'klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn' with 42 faces
+g klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn_klZahn
 usemtl BeinTex
 usemtl BeinTex
 f  504/140/488 504/140/488 504/140/488
 f  504/140/488 504/140/488 504/140/488
 f  505/141/508 506/142/508 507/143/508
 f  505/141/508 506/142/508 507/143/508
@@ -2836,8 +2836,8 @@ f  504/140/524 508/144/510 504/140/509
 f  519/155/525 518/154/526 508/144/510
 f  519/155/525 518/154/526 508/144/510
 f  518/154/526 505/141/512 508/144/510
 f  518/154/526 505/141/512 508/144/510
 
 
-# Mesh 'Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf' with 90 faces
-g Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf
+# Mesh 'Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf' with 90 faces
+g Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf_Kopf
 usemtl Skin
 usemtl Skin
 f  520/68/527 521/156/528 522/157/529
 f  520/68/527 521/156/528 522/157/529
 f  520/68/527 523/158/530 521/156/528
 f  520/68/527 523/158/530 521/156/528
@@ -2930,8 +2930,8 @@ f  564/197/571 562/195/569 545/178/552
 f  545/178/552 552/185/559 566/199/573
 f  545/178/552 552/185/559 566/199/573
 f  564/197/571 566/199/573 545/178/552
 f  564/197/571 566/199/573 545/178/552
 
 
-# Mesh 'Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust' with 20 faces
-g Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust
+# Mesh 'Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust' with 20 faces
+g Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust_Brust
 usemtl Skin
 usemtl Skin
 f  70/210/584 71/211/585 577/212/586
 f  70/210/584 71/211/585 577/212/586
 f  60/120/587 577/212/586 64/213/588
 f  60/120/587 577/212/586 64/213/588
@@ -2954,8 +2954,8 @@ f  70/210/584 580/217/592 69/223/599
 f  77/75/593 79/224/600 580/217/592
 f  77/75/593 79/224/600 580/217/592
 f  69/223/599 580/217/592 79/224/600
 f  69/223/599 580/217/592 79/224/600
 
 
-# Mesh 'Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2' with 90 faces
-g Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2
+# Mesh 'Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2' with 90 faces
+g Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2_Kopf2
 usemtl Skin
 usemtl Skin
 f  582/225/601 583/226/602 584/123/603
 f  582/225/601 583/226/602 584/123/603
 f  583/226/602 585/227/604 584/123/603
 f  583/226/602 585/227/604 584/123/603
@@ -3048,8 +3048,8 @@ f  607/245/626 624/262/643 625/263/644
 f  627/265/646 614/252/633 607/245/626
 f  627/265/646 614/252/633 607/245/626
 f  607/245/626 627/265/646 625/263/644
 f  607/245/626 627/265/646 625/263/644
 
 
-# Mesh 'Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2' with 42 faces
-g Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2
+# Mesh 'Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2' with 42 faces
+g Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2_Zahn2
 usemtl BeinTex
 usemtl BeinTex
 f  639/124/488 639/124/488 639/124/488
 f  639/124/488 639/124/488 639/124/488
 f  640/127/658 641/126/658 642/125/658
 f  640/127/658 641/126/658 642/125/658
@@ -3094,8 +3094,8 @@ f  639/124/661 644/128/660 639/124/674
 f  644/128/660 653/138/676 654/139/675
 f  644/128/660 653/138/676 654/139/675
 f  644/128/660 642/125/662 653/138/676
 f  644/128/660 642/125/662 653/138/676
 
 
-# Mesh 'klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2' with 42 faces
-g klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2
+# Mesh 'klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2' with 42 faces
+g klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2_klZahn2
 usemtl BeinTex
 usemtl BeinTex
 f  655/140/488 655/140/488 655/140/488
 f  655/140/488 655/140/488 655/140/488
 f  656/143/677 657/142/677 658/141/677
 f  656/143/677 657/142/677 658/141/677
@@ -3140,8 +3140,8 @@ f  655/140/680 660/144/679 655/140/693
 f  660/144/679 669/154/695 670/155/694
 f  660/144/679 669/154/695 670/155/694
 f  660/144/679 658/141/681 669/154/695
 f  660/144/679 658/141/681 669/154/695
 
 
-# Mesh 'Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge' with 38 faces
-g Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge
+# Mesh 'Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge' with 38 faces
+g Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge_Auge
 usemtl Augentex
 usemtl Augentex
 f  671/277/696 672/278/697 673/279/698
 f  671/277/696 672/278/697 673/279/698
 f  671/277/696 673/279/698 674/280/699
 f  671/277/696 673/279/698 674/280/699
@@ -3182,8 +3182,8 @@ f  681/287/706 684/290/709 696/302/721
 f  689/295/714 696/302/721 688/294/713
 f  689/295/714 696/302/721 688/294/713
 f  684/290/709 688/294/713 696/302/721
 f  684/290/709 688/294/713 696/302/721
 
 
-# Mesh 'Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05' with 38 faces
-g Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05
+# Mesh 'Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05' with 38 faces
+g Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05_Duplicate05
 usemtl Augentex
 usemtl Augentex
 f  697/279/722 698/278/723 699/277/724
 f  697/279/722 698/278/723 699/277/724
 f  700/280/725 697/279/722 699/277/724
 f  700/280/725 697/279/722 699/277/724

+ 1 - 1
test/unit/utMatrix3x3.cpp

@@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 using namespace ::Assimp;
 using namespace ::Assimp;
 
 
 class utMatrix3x3Test : public ::testing::Test {
 class utMatrix3x3Test : public ::testing::Test {
-
+    // empty
 };
 };
 
 
 TEST_F( utMatrix3x3Test, FromToMatrixTest ) {
 TEST_F( utMatrix3x3Test, FromToMatrixTest ) {

+ 5 - 0
test/unit/utPLYImportExport.cpp

@@ -57,3 +57,8 @@ public:
 TEST_F( utPLYImportExport, importTest ) {
 TEST_F( utPLYImportExport, importTest ) {
     EXPECT_TRUE( importerTest() );
     EXPECT_TRUE( importerTest() );
 }
 }
+
+TEST_F( utPLYImportExport, vertexColorTest ) {
+    Assimp::Importer importer;
+    const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", 0 );
+}

+ 69 - 0
test/unit/utVector3.cpp

@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2017, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-------------------------------------------------------------------------*/
+#include "UnitTestPCH.h"
+#include <assimp/vector3.h>
+
+using namespace ::Assimp;
+
+class utVector3 : public ::testing::Test {
+    // empty
+};
+
+TEST_F(utVector3, CreationTest) {
+    aiVector3D v0;
+    aiVector3D v1( 1.0f, 2.0f, 3.0f );
+    EXPECT_FLOAT_EQ (1.0f, v1[ 0 ] );
+    EXPECT_FLOAT_EQ( 2.0f, v1[ 1 ] );
+    EXPECT_FLOAT_EQ( 3.0f, v1[ 2 ] );
+    aiVector3D v2( 1 );
+    EXPECT_FLOAT_EQ( 1.0f, v2[ 0 ] );
+    EXPECT_FLOAT_EQ( 1.0f, v2[ 1 ] );
+    EXPECT_FLOAT_EQ( 1.0f, v2[ 2 ] );
+    aiVector3D v3( v1 );
+    EXPECT_FLOAT_EQ( v1[ 0 ], v3[ 0 ] );
+    EXPECT_FLOAT_EQ( v1[ 1 ], v3[ 1 ] );
+    EXPECT_FLOAT_EQ( v1[ 2 ], v3[ 2 ] );
+}
+
+TEST_F( utVector3, BracketOpTest ) {
+    aiVector3D v(1.0f, 2.0f, 3.0f);
+    EXPECT_FLOAT_EQ( 1.0f, v[ 0 ] );
+    EXPECT_FLOAT_EQ( 2.0f, v[ 1 ] ); 
+    EXPECT_FLOAT_EQ( 3.0f, v[ 2 ] );
+}